6

UIImageViewに画像を表示していますが、この画像に都市を表示できるように、座標をx/y値に変換したいと思います。これは私が私の研究に基づいて試したものです:

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


 int x =  (int) ((width/360.0) * (180 + 8.242493)); // Mainz 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];

これにより、167がxおよびy = 104になりますが、この例の値はx=73およびy=294である必要があります。

mapViewは、明確にするために、私のUIImageViewです。

したがって、2番目の試みはMKMapKitを使用することでした。

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

しかし、これは私にいくつかの本当に奇妙な値を与えます:x=140363776.241755そしてyは91045888.536491です。

それで、これを機能させるために私が何をしなければならないかについてあなたは考えを持っていますか?

本当にありがとう!

4

1 に答える 1

9

この作業を行うには、4つのデータを知る必要があります。

  1. 画像の左上隅の緯度と経度。
  2. 画像の右下隅の緯度と経度。
  3. 画像の幅と高さ(ポイント単位)。
  4. データポイントの緯度と経度。

その情報を使用して、次のことを行うことができます。

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

xまたはyが負であるか、画像のサイズより大きい場合、ポイントはマップから外れています。

この単純なソリューションは、地図画像が基本的な円筒図法(Mercator)を使用し、緯度と経度のすべての線が直線であると想定しています。

編集:

画像ポイントを座標に戻すには、計算を逆にします。

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

ここでpointX、およびpointYは画像上のポイントを画面ポイントで表します。(0、0)は画像の左上隅です。

于 2013-01-06T20:03:43.123 に答える