Να πάρει τα όρια της MKMapView

ψήφοι
29

Για να ρυθμίσετε ένα ερώτημα σε έναν εξωτερικό διακομιστή θέλω να πάρω τα όρια της τρέχουσας Map View σε ένα iPhone app είμαι κτίριο. UIView θα πρέπει να ανταποκρίνονται σε όρια, αλλά φαίνεται MKMapView δεν το κάνει. Μετά τη ρύθμιση μιας περιοχής και ζουμ στο χάρτη Προσπαθώ να πάρει τα όρια. Είμαι κολλημένος στο πρώτο βήμα, το οποίο είναι να προσπαθήσει να πάρει τις CGPoints που αντιπροσωπεύουν τις γωνίες SE και ΒΔ του χάρτη. Μετά από αυτό ήμουν έτοιμος να χρησιμοποιήσει:

- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view

Για να μετατρέψουν τα σημεία σε συντεταγμένες του χάρτη. Αλλά δεν μπορεί να πάρει ακόμη και τόσο μακριά ...

//Recenter and zoom map in on search location
MKCoordinateRegion region =  {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
[self.mapView setRegion:region animated:YES];


//After the new search location has been added to the map, and the map zoomed, we need to update the search bounds
//First we need to calculate the corners of the map
CGPoint se = CGPointMake(self.mapView.bounds.origin.x, mapView.bounds.origin.y);
CGPoint nw = CGPointMake((self.mapView.bounds.origin.x + mapView.bounds.size.width), (mapView.bounds.origin.y + mapView.bounds.size.height));
NSLog(@points are: se %@, nw %@, se, nw);

Ο κώδικας συγκεντρώνει χωρίς προειδοποιήσεις όμως se και ΒΔ είναι και τα δύο μηδενικά. Κοιτάζοντας self.mapView.bounds.origin.x η μεταβλητή είναι 0. Προσπαθώντας να NSLog άμεσα self.mapView.bounds.size.width μου δίνει ένα «Πρόγραμμα λαμβανόμενο σήμα:“EXC_BAD_ACCESS”.» το οποίο φαίνεται να προέρχεται από NSLog.

Όποιος γνωρίζει τον κατάλληλο τρόπο για να πάρει την νοτιοανατολική γωνία και βορειοδυτική γωνία (σε συντεταγμένες του χάρτη) από την ορατή περιοχή του MKMapView;

EDIT: Φαίνεται ότι κάθε φορά που θα ζητηθεί κάτι εδώ η απάντηση έρχεται σε σας αμέσως μετά. Ήμουν χρησιμοποιώντας% @ αντί @f να εκτυπώσετε το κάθε μεταβλητή σε NSLog που πετούσε λάθη εκεί. Ανακάλυψα επίσης την ιδιότητα annotationVisibleRect της MKMapview. Φαίνεται όμως ότι η annotationVisibleRect βασίζεται στις συντεταγμένες γονέα άποψη.

Δημοσιεύθηκε 17/01/2010 στις 17:53
πηγή χρήστη
Σε άλλες γλώσσες...                            


10 απαντήσεις

ψήφοι
73

Εντάξει, απάντησε επίσημα τη δική μου ερώτηση, αλλά επειδή εγώ δεν το βρείτε πουθενά πριν εγώ θα δημοσιεύσετε την απάντηση εδώ:

//To calculate the search bounds...
//First we need to calculate the corners of the map so we get the points
CGPoint nePoint = CGPointMake(self.mapView.bounds.origin.x + mapView.bounds.size.width, mapView.bounds.origin.y);
CGPoint swPoint = CGPointMake((self.mapView.bounds.origin.x), (mapView.bounds.origin.y + mapView.bounds.size.height));

//Then transform those point into lat,lng values
CLLocationCoordinate2D neCoord;
neCoord = [mapView convertPoint:nePoint toCoordinateFromView:mapView];

CLLocationCoordinate2D swCoord;
swCoord = [mapView convertPoint:swPoint toCoordinateFromView:mapView];
Απαντήθηκε 17/01/2010 στις 20:14
πηγή χρήστη

ψήφοι
38

Μια άλλη επιλογή είναι να χρησιμοποιήσετε την ιδιότητα visibleMapRect για MKMapView παράδειγμα σας και να χρησιμοποιήσετε MKCoordinateForMapPoint () για να μετατρέψει την lat / lon.

MKMapRect mRect = self.mapView.visibleMapRect;
MKMapPoint neMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), mRect.origin.y);
MKMapPoint swMapPoint = MKMapPointMake(mRect.origin.x, MKMapRectGetMaxY(mRect));
CLLocationCoordinate2D neCoord = MKCoordinateForMapPoint(neMapPoint);
CLLocationCoordinate2D swCoord = MKCoordinateForMapPoint(swMapPoint);
Απαντήθηκε 06/12/2010 στις 06:04
πηγή χρήστη

ψήφοι
9

Swift μακριά ... (Βασισμένο σε απάντηση @ deadroxy της ...)

typealias Edges = (ne: CLLocationCoordinate2D, sw: CLLocationCoordinate2D)

extension MKMapView {
    func edgePoints() -> Edges {
        let nePoint = CGPoint(x: self.bounds.maxX, y: self.bounds.origin.y)
        let swPoint = CGPoint(x: self.bounds.minX, y: self.bounds.maxY)
        let neCoord = self.convertPoint(nePoint, toCoordinateFromView: self)
        let swCoord = self.convertPoint(swPoint, toCoordinateFromView: self)
        return (ne: neCoord, sw: swCoord)
    }
}
Απαντήθηκε 23/02/2015 στις 21:30
πηγή χρήστη

ψήφοι
3

Αυτό http://wiki.openstreetmap.org/wiki/Bounding_Box είναι ένα έγγραφο για το πλαίσιο οριοθέτησης

bbox = left,bottom,right,top
bbox = min Longitude , min Latitude , max Longitude , max Latitude

εισάγετε περιγραφή της εικόνας εδώ

Μπορείτε να έχετε ένα BoundingBoxstruct που αντιπροσωπεύει αυτή η

struct BoundingBox {
  let min: CLLocationCoordinate2D
  let max: CLLocationCoordinate2D

  init(rect: MKMapRect) {
    let bottomLeft = MKMapPointMake(rect.origin.x, MKMapRectGetMaxY(rect))
    let topRight = MKMapPointMake(MKMapRectGetMaxX(rect), rect.origin.y)

    min = MKCoordinateForMapPoint(bottomLeft)
    max = MKCoordinateForMapPoint(topRight)
  }

  var points: [CLLocationDegrees] {
    return [
      min.latitude,
      min.longitude,
      max.latitude
      max.longitude,
    ]
  }
}

Η visibleMapRectείναι το ίδιο μεregion.span

let mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: 320, height: 640))
XCTAssertEqual(mapView.userLocation.coordinate.latitude, 0)
XCTAssertEqual(mapView.userLocation.coordinate.longitude, 0)

let boundingBox = BoundingBox(rect: mapView.visibleMapRect)
XCTAssertEqual(boundingBox.max.longitude-boundingBox.min.longitude, mapView.region.span.longitudeDelta)
XCTAssertEqual(boundingBox.max.latitude-boundingBox.min.latitude, mapView.region.span.latitudeDelta)
Απαντήθηκε 04/04/2017 στις 07:34
πηγή χρήστη

ψήφοι
1

αυτή η ιστοσελίδα να λύσει το πρόβλημα. http://www.softwarepassion.com/how-to-get-geographic-coordinates-of-the-visible-mkmapview-area-in-ios/

MKMapRect mRect = self.mapView.visibleMapRect;

-(CLLocationCoordinate2D)getNECoordinate:(MKMapRect)mRect{
    return [self getCoordinateFromMapRectanglePoint:MKMapRectGetMaxX(mRect) y:mRect.origin.y];
}
-(CLLocationCoordinate2D)getNWCoordinate:(MKMapRect)mRect{
    return [self getCoordinateFromMapRectanglePoint:MKMapRectGetMinX(mRect) y:mRect.origin.y];
}
-(CLLocationCoordinate2D)getSECoordinate:(MKMapRect)mRect{
    return [self getCoordinateFromMapRectanglePoint:MKMapRectGetMaxX(mRect) y:MKMapRectGetMaxY(mRect)];
}
-(CLLocationCoordinate2D)getSWCoordinate:(MKMapRect)mRect{
    return [self getCoordinateFromMapRectanglePoint:mRect.origin.x y:MKMapRectGetMaxY(mRect)];
}

-(CLLocationCoordinate2D)getCoordinateFromMapRectanglePoint:(double)x y:(double)y{
    MKMapPoint swMapPoint = MKMapPointMake(x, y);
    return MKCoordinateForMapPoint(swMapPoint);
}

-(NSArray *)getBoundingBox:(MKMapRect)mRect{
    CLLocationCoordinate2D bottomLeft = [self getSWCoordinate:mRect];
    CLLocationCoordinate2D topRight = [self getNECoordinate:mRect];
    return @[[NSNumber numberWithDouble:bottomLeft.latitude ],
             [NSNumber numberWithDouble:bottomLeft.longitude],
             [NSNumber numberWithDouble:topRight.latitude],
             [NSNumber numberWithDouble:topRight.longitude]];
}
Απαντήθηκε 18/12/2017 στις 13:14
πηγή χρήστη

ψήφοι
1

Ήμουν σε θέση να πάρει αυτό το έργο με το ερώτημα μαϊντανός GeoBox:

//Calculate the corners of the map to get the points
CGPoint nePoint = CGPointMake(self.mapView.bounds.origin.x + self.mapView.bounds.size.width, self.mapView.bounds.origin.y);
CGPoint swPoint = CGPointMake((self.mapView.bounds.origin.x),(self.mapView.bounds.origin.y+ self.mapView.bounds.size.height));

//Transform points into lat/long values
CLLocationCoordinate2D NECoordinate = [self.mapView convertPoint:nePoint toCoordinateFromView:self.mapView];
CLLocationCoordinate2D SWCoordinate = [self.mapView convertPoint:swPoint toCoordinateFromView:self.mapView];

//Convert to Parse GeoPoints
PFGeoPoint *Southwest = [PFGeoPoint geoPointWithLatitude:SWCoordinate.latitude longitude:SWCoordinate.longitude];
PFGeoPoint *Northeast = [PFGeoPoint geoPointWithLatitude:NECoordinate.latitude longitude:NECoordinate.longitude];
Απαντήθηκε 19/12/2014 στις 14:39
πηγή χρήστη

ψήφοι
0

Ενημερώθηκε @ άριστη απάντηση onmyway133 για τους σκοπούς μου, χρειαζόμουν τις συντεταγμένες των τεσσάρων γωνιών:

struct BoundingBox {
    let topRight: CLLocationCoordinate2D
    let topLeft: CLLocationCoordinate2D
    let bottomRight: CLLocationCoordinate2D
    let bottomLeft: CLLocationCoordinate2D

    init(rect: MKMapRect) {
        topRight = MKMapPoint(x: rect.maxX, y: rect.origin.y).coordinate
        topLeft = MKMapPoint(x: rect.origin.x, y: rect.origin.y).coordinate
        bottomRight = MKMapPoint(x: rect.maxX, y: rect.maxY).coordinate
        bottomLeft = MKMapPoint(x: rect.origin.x, y: rect.maxY).coordinate
    }

    var items: [String: CLLocationCoordinate2D] {
        return [
            "topRight": topRight,
            "topLeft": topLeft,
            "bottomRight": bottomRight,
            "bottomLeft": bottomLeft,
        ]
    }

    var points: [CLLocationDegrees] {
        return [
            topRight.latitude,
            topRight.longitude,
            topLeft.latitude,
            topLeft.longitude,
            bottomRight.latitude,
            bottomRight.longitude,
            bottomLeft.latitude,
            bottomLeft.longitude,
        ]
    }
}

Και ένα παράδειγμα για το πώς θα χρησιμοποιηθούν αυτά τα δεδομένα:

        let boundingBox = BoundingBox(rect: mapView.visibleMapRect)
        var annotations = Array<MKPointAnnotation>()

        for point in boundingBox.items {
            let newPoint = MKPointAnnotation()
            newPoint.coordinate = point.value
            annotations.append(newPoint)
        }

        mapView.addAnnotations(annotations)
Απαντήθηκε 27/05/2019 στις 23:57
πηγή χρήστη

ψήφοι
0

Η επέκταση αυτή λύνει αυτό το πρόβλημα και να διατηρηθεί η centerCoordinateσύνταξη σε Swift 5

extension MKMapView {
    var northWestCoordinate: CLLocationCoordinate2D {
        return MKMapPoint(x: visibleMapRect.minX, y: visibleMapRect.minY).coordinate
    }

    var northEastCoordinate: CLLocationCoordinate2D {
        return MKMapPoint(x: visibleMapRect.maxX, y: visibleMapRect.minY).coordinate
    }

    var southEastCoordinate: CLLocationCoordinate2D {
        return MKMapPoint(x: visibleMapRect.maxX, y: visibleMapRect.maxY).coordinate
    }

    var southWestCoordinate: CLLocationCoordinate2D {
        return MKMapPoint(x: visibleMapRect.minX, y: visibleMapRect.maxY).coordinate
    }
}
Απαντήθηκε 17/04/2019 στις 18:02
πηγή χρήστη

ψήφοι
0

Είχα κάποια προβλήματα με κάποιες από τις άλλες απαντήσεις για τους χάρτες που είχαν 2 δάχτυλο περιστρέφεται. Αυτός ο κωδικός λειτούργησε για μένα:

MKMapRect rect = self.mapView.visibleMapRect;
CLLocationCoordinate2D northeast = MKCoordinateForMapPoint(MKMapPointMake(MKMapRectGetMaxX(rect),rect.origin.y));
CLLocationCoordinate2D southwest = MKCoordinateForMapPoint(MKMapPointMake(rect.origin.x         ,MKMapRectGetMaxY(rect)));

Η απάντησή μου προέρχεται από την απάντηση陈保状's και η σχετική ιστοσελίδα εισάγετε περιγραφή σύνδεσμο εδώ . Απλοποιημένη κάτω πάρα πολύ 3 γραμμές για νοτιοδυτικά και βόρεια γωνίες ανατολικά.

Απαντήθηκε 24/08/2018 στις 20:04
πηγή χρήστη

ψήφοι
0

Αυτός ο κωδικός λειτουργεί με χάρτη περιστρεφόμενο σαν 90/180 βαθμούς. που mapView.pitchEnabled = ΝΟ? για λιγότερο σφάλματα.

CLLocationDirection heading = mapView.camera.heading;

float mapWidth = mapView.frame.size.width;
float mapHeight = mapView.frame.size.height;

float neX = mapWidth;
float neY = 0.0;

float swX = 0.0;
float swY = mapHeight;


if (heading >= 0 && heading <= 90) {
    //println("Q1")
    float ratio = heading / 90;

    neX = (1-ratio) * mapWidth;
    swX = (mapWidth*ratio);
} else if (heading >= 90 && heading <= 180) {
    //println("Q2")
    float ratio = (heading - 90) / 90;
    neX = 0;
    neY = (mapHeight*ratio);
    swY = (1-ratio) * mapHeight;
    swX = mapWidth;

} else if (heading >= 180 && heading <= 270) {
    //println("Q3")
    float ratio = (heading - 180) / 90;
    neX = mapWidth*ratio;
    neY = mapHeight;
    swX = (1-ratio) * mapWidth;
    swY = 0;

} else if (heading >= 270 && heading <= 360) {
    //println("Q4");
    float ratio = (heading - 270) / 90;
    neX = mapWidth;
    neY = (1-ratio) * mapHeight;
    swY = ratio * mapHeight;

}

CGPoint swPoint = CGPointMake(swX, swY);
CGPoint nePoint = CGPointMake(neX, neY);

CLLocationCoordinate2D swCoord = [mapView convertPoint:swPoint toCoordinateFromView:mapView];
CLLocationCoordinate2D neCoord = [mapView convertPoint:nePoint toCoordinateFromView:mapView];
Απαντήθηκε 15/10/2015 στις 01:17
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more