2013-01-06 11 views
5

Wyświetlam obraz w UIImageView i chciałbym przekonwertować współrzędne na wartości x/y, więc mogę pokazać miasta na tym obrazie. To co próbowałem na podstawie moich badań:Konwertuj długość/szerokość na x/y na iPhonie

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]; 

który daje mi 167 jako X i Y = 104, ale ten przykład powinien mieć wartości X = 73 & y = 294.

mapView jest moim UIImageView, tylko dla wyjaśnienia.

Więc moja druga próba była użyć MKMapKit:

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

Ale to daje mi kilka naprawdę dziwnych wartości: x oraz y = 140363776,241755 jest +91.045.888,536491. Czy masz pomysł, co muszę zrobić, aby to zadziałało?

Dziękuję bardzo!

+0

Jaką formułę chcesz znaleźć x i y? –

+0

według formuły, która działa: D właśnie przeszukałem Internet i znalazłem powyższy wzór. Zasadniczo mam mój ekran iPhone'a, który pokazuje obraz kraju i chcę znaleźć miasta na tym obrazie za pomocą współrzędnych długości i szerokości geograficznej. – dehlen

+0

Powyższy wzór służy do projekcji mecatora. I myślałem, że mam coś takiego. Oto zrzut ekranu mojego projektu: http://cl.ly/LySY. Mała czarna kropka powinna wskazywać na miasto "Mainz" (w środkowym lewym). I nie do górnego środka w pobliżu "Bremen" – dehlen

Odpowiedz

7

Do tej pracy trzeba wiedzieć 4 szt danych:

  1. szerokości i długości geograficznej lewym górnym rogu obrazu.
  2. Szerokość i długość geograficzna dolnego prawego rogu obrazu.
  3. Szerokość i wysokość obrazu (w punktach).
  4. Szerokość i długość geograficzna punktu danych.

Dzięki tej informacji można wykonać następujące czynności:

// 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; 

Jeśli x lub y są ujemne lub większe niż obraz w rozmiarze, to punkt jest wyłączony z mapy.

To proste rozwiązanie zakłada, że ​​obraz mapy wykorzystuje podstawowy rzut cylindryczny (Mercator), w którym wszystkie linie szerokości i długości geograficznej są liniami prostymi.

Edit:

Aby przekonwertować punkt obrazu z powrotem do współrzędnych, wystarczy odwrócić obliczenia:

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

gdzie pointX i pointY reprezentują punkt na obrazie w punktach ekranowych. (0, 0) to lewy górny róg obrazu.

+0

Przede wszystkim dzięki! Ale próbowałem tego kodu i otrzymałem x: -115.473389 y: -230.305954. Ale punkt (49,993615, 8,242493) nie powinien zniknąć z mapy. Jak więc wartości mogą być ujemne i jak obliczyć odpowiednie wartości?! – dehlen

+0

Przepraszam, częściowo odwróciłem "xScale" i "yScale". Zobacz moje aktualizacje dla tych dwóch linii. – rmaddy

+0

ah ok, widzę, teraz działa! Wielkie dzięki ! – dehlen