Å bestemme avstanden ved hjelp mapkit

stemmer
5

Hvordan er en 1000ft eller 1/2 mile avstand bestemmes med mapkit? Enten en radius fra noen tapp eller avstanden mellom to pinner.

For eksempel, fokusere kartet på tappen A. Pins B, C og D er også på kartet ved forskjellige avstander fra tappen A. B og C er innenfor 1/2 mil fra A, men D er 1 mil borte. Jeg vil gjerne vite at B og C er innen 1/2 mile fra A. Hvordan kan jeg regne det?

Publisert på 10/03/2010 klokken 01:57
kilden bruker
På andre språk...                            


3 svar

stemmer
13

Siden du har uttalt at de to forskjellige punktene er "pins", kommer jeg til å anta at du bruker MKPinAnnotationView (eller en annen merknad visning). Hvis ikke, er du nødt til å få plasseringen annen måte.

Hvis du har pekere til merknadsobjekter for disse stedene, så kan du enkelt ringe -coordinatepå dem, skape CLLocations fra disse koordinatene (hjelp -initWithLatitude:longitude:), og deretter bruke metoden -getDistanceFromfor å hente avstanden i meter. Derfra er det en enkel konvertering til miles. Alle fortalte koden vil se omtrent slik ut:

CLLocationCoordinate2D pointACoordinate = [pointAAnnotation coordinate];
CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude];
CLLocationCoordinate2D pointBCoordinate = [pointBAnnotation coordinate];
CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude];
double distanceMeters = [pointALocation getDistanceFrom:pointBLocation];
double distanceMiles = (distanceMeters / 1609.344);

Du vil ende opp med avstand i miles, og kan sammenligne det derfra. Håper dette hjelper.

Svarte 10/03/2010 kl. 07:31
kilden bruker

stemmer
12

getDistanceFrom er nå foreldet, så her er en alternativ løsning for alle som ønsker å gjøre dette.

CLLocationCoordinate2D pointACoordinate = [pointAAnnotation coordinate];
CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude];  

CLLocationCoordinate2D pointBCoordinate = [pointBAnnotation coordinate];
CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude];  

float distanceMeters = [pointALocation distanceFromLocation:pointBLocation];
float distanceMiles = (distanceMeters / 1609.344);  

[pointALocation release];
[pointBLocation release];  

Som ovenfor, kan du bruke floati stedet for double, og du kan kaste resultatene til en int hvis du ikke krever presisjon av den floatslik:

int distanceCastToInt = (int) [pointALocation distanceFromLocation:pointBLocation];

Det inter nyttig hvis du ønsket å gi en viss idé om avstand i merknaden som så:

pointAAnnotation.title = @"Point A";
pointAAnnotation.subtitle = [NSString stringWithFormat: @"Distance: %im",distanceCastToInt];

Undertittelen på merknaden ville lese "Avstand: 50m" for eksempel.

Svarte 22/02/2011 kl. 01:37
kilden bruker

stemmer
0

Dette er Swift 3 tilsvarer den gitte svar:

let pointACoordinate = pointAAnnotation.coordinate
let pointALocation = CLLocation(latitude: pointACoordinate.latitude, longitude: pointACoordinate.longitude)
let pointBCoordinate = pointBAnnotation.coordinate
let pointBLocation = CLLocation(latitude: pointBCoordinate.latitude, longitude: pointBCoordinate.longitude)
let distanceMeters = pointALocation.distance(from: pointBLocation)
let distanceMiles = (distanceMeters / 1609.344)
Svarte 10/11/2016 kl. 22:21
kilden bruker

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