2013-01-06 15 views
5

sto mostrando un'immagine in un UIImageView e mi piacerebbe convertire le coordinate in valori x/y in modo da poter mostrare le città su questa immagine. Questo è quello che ho provato in base alla mia ricerca:Converti longitudine/latitudine su x/y su iPhone

CGFloat height = mapView.frame.size.height; 
CGFloat width = mapView.frame.size.width; 


int x = (int) ((width/360.0) * (180 + 8.242493)); //Main lon 
int y = (int) ((height/180.0) * (90 - 49.993615)); //Mainz lat 


NSLog(@"x:%i y:%i",x,y); 

PinView *pinView = [[PinView alloc]initPinViewWithPoint:x andY:y]; 

[self.view addSubview:pinView]; 

che mi dà 167 come x e y = 104, ma questo esempio dovrebbe avere i valori x = 73 & y = 294.

mapView è il mio UIImageView, solo per chiarimenti.

Quindi il mio secondo tentativo è stato quello di utilizzare la MKMapKit:

CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(49.993615, 8.242493); 
MKMapPoint point = MKMapPointForCoordinate(coord); 
NSLog(@"x is %f and y is %f",point.x,point.y); 

Ma questo mi dà alcuni valori davvero strano: x = 140363776,241,755 mila e y è 91045888,536,491 mila. Quindi hai un'idea di cosa devo fare per farlo funzionare?

Grazie mille!

+0

Con quale formula si desidera trovare xey? –

+0

con una formula che funziona: D ho appena cercato su internet e ho trovato la formula sopra. Fondamentalmente ho il mio schermo iPhone che mostra l'immagine di un paese e voglio trovare le città su questa immagine attraverso le coordinate di longitudine e latitudine. – dehlen

+0

la formula sopra è per la proiezione del meccator. E pensavo di avere qualcosa del genere. Ecco una schermata del mio progetto: http://cl.ly/LySY. Il puntino nero dovrebbe indicare la città "Mainz" (nel centro-sinistra). E non al medio-alto nel vicino di "Brema" – dehlen

risposta

7

Per fare questo lavoro è necessario conoscere 4 pezzi di dati:

  1. latitudine e la longitudine dell'angolo in alto a sinistra dell'immagine.
  2. Latitudine e longitudine dell'angolo in basso a destra dell'immagine.
  3. Larghezza e altezza dell'immagine (in punti).
  4. Latitudine e longitudine del punto dati.

Con queste informazioni è possibile effettuare le seguenti operazioni:

// These should roughly box Germany - use the actual values appropriate to your image 
double minLat = 54.8; 
double minLong = 5.5; 
double maxLat = 47.2; 
double maxLong = 15.1; 

// Map image size (in points) 
CGSize mapSize = mapView.frame.size; 

// Determine the map scale (points per degree) 
double xScale = mapSize.width/(maxLong - minLong); 
double yScale = mapSize.height/(maxLat - minLat); 

// Latitude and longitude of city 
double spotLat = 49.993615; 
double spotLong = 8.242493; 

// position of map image for point 
CGFloat x = (spotLong - minLong) * xScale; 
CGFloat y = (spotLat - minLat) * yScale; 

Se x o y sono negativi o maggiore di dimensione dell'immagine, allora il punto è fuori della mappa.

Questa semplice soluzione presuppone che l'immagine della mappa utilizzi la proiezione cilindrica di base (Mercatore) in cui tutte le linee di latitudine e longitudine sono linee rette.

Edit:

Per convertire un punto di un'immagine di nuovo ad un coordinata, basta invertire il calcolo:

double pointLong = pointX/xScale + minLong; 
double pointLat = pointY/yScale + minLat; 

dove pointX e pointY rappresentano un punto dell'immagine in punti dello schermo. (0, 0) è l'angolo in alto a sinistra dell'immagine.

+0

Prima di tutto grazie! Ma ho provato questo codice e ottengo x: -115.473389 y: -230.305954. Ma il punto (49.993615, 8.242493) non dovrebbe essere fuori dalla mappa. Quindi, come possono i valori essere negativi e come posso calcolare i valori giusti ?! – dehlen

+0

Mi dispiace, ho avuto il 'xScale' e' yScale' parzialmente all'indietro. Vedi i miei aggiornamenti per quelle due linee. – rmaddy

+0

ah ok vedo, ora funziona! Molte grazie ! – dehlen