帮助在iPhone中从纬度和经度计算X和Y.

时间:2011-07-27 22:52:40

标签: iphone google-maps geolocation overlay

我使用iPhone的自定义地图陷入了某种地理定位的困境。问题是:我有一个UIScrollView和一个UIImageView,其中包含一个公平的自定义地图图片,包含所有展位位置等等。 我最大的问题是我打算使用地理位置来定位该地图中的人。当我尝试获取给定纬度和经度的像素位置时,问题就开始了。我有几个地面控制点作为参考,甚至设法计算我的参考点和当前位置之间的角度。问题在于我无法将像素距离与使用地理位置坐标计算的距离相关联。

我试图将它们联系如下:

计算地图中已知点的距离(以像素为单位)。 使用两个参考点的矢量距离计算来计算距离。 等于上面的两个以找到与参考的实际距离。

但我根本没有成功......

使用余弦定律,我可以找到能够给出X和Y投影的角度,但我找不到正确乘法的比例。我猜是因为纬度和经度是以度为单位给出的并且是非线性的,但我有一个很小的斑点,我可以将它作为线性斑点近似。

我不能在MKMapKit中使用叠加图像,因为我必须水平使用地图,在谷歌地图中,​​同一个地方向左旋转几度。

更新:

关注这个网站:http://www.movable-type.co.uk/scripts/latlong.html,我可以使用Haversine公式计算距离,但作为方向,我发现我正在以错误的方式计算角度。我将不得不找到另一种计算角度的方法。

3 个答案:

答案 0 :(得分:2)

我会通过假设平地近似并使用向量代数将纬度,离子空间中的角度和距离与x,y像素空间相关联来做到这一点。

例如:

我假设你知道左下角和右下角的lat,lon。还假设你的公平地图不在极点附近,并且面积相当小。

选择一个坐标系,左下角为已知纬度,lon为0,0像素。在以下伪代码中称为lat1,lon2

从右下角lat2,lon2到左下角lat1,lon1计算向量1

使用简单投影xl = lon,yl = lat,然后向量1 =(lon2 - lon1)i +(lat2-lat1)j

从你想要的人的lat,lon位置计算向量2(latp,lonp)将地图放到左下角的lat1,lon1

使用矢量点积来获得矢量1和2之间的角度。

通过equirectangular投影计算lat,lon空间的距离:

p1 = (lonp - lon1) cos ( 0.5*(latp+lat1) ) (convert lat/lon to radians)
p2 = (latp - lat1)
distance = R * sqrt( p1*p1 + p2*p2)
use R = 6371000 and your distance will be in meters

现在将此距离缩放到地图比例

此时,您在像素空间中具有点的极坐标

你现在进行极地到矩形的转换; x = r cos(角度),y = r sin(角度)

r是缩放距离(即像素空间中的距离),角度是上面的矢量1和2之间的角度

作为一个完整性检查,你可以计算lat的角度,从左上角到左下角创建的lon向量点缀在右下角到左下角。如果角度不接近90度,则可能会出现太多失真。

答案 1 :(得分:0)

不确定我是否正确理解这一点..但是在很短的距离内你应该只能将Lat / Long缩放到y / x坐标..或者你可以走另一条路。

我要做的是找出/查找图像角落的纬度/经度坐标,然后将其间的点缩放到该范围内的像素位置。例如:

假设图像的左上角(101px宽)代表lat / lng(0,100)和右上角(0,100.1)。现在,如果你想放置点(0,100.05),你只需将它放在中间 - 即像素(x,y)(51,0)。

我还将所有lat / lng从度/分/秒转换为十进制度 - 即。 150deg 30min变为150.5。

答案 2 :(得分:0)

我认为你正在寻找屏幕预测。

google.maps.Projection object specification

fromLatLngToPoint(latLng:LatLng, point?:Point)
  

从LatLng圆柱体转换为点平面。这个界面   指定从给定LatLng实现转换的函数   地图投影上的世界坐标值。 Maps API调用   这种方法需要在屏幕上绘制位置。投影   对象必须实现此方法。

http://code.google.com/apis/maps/documentation/javascript/reference.html#Projection

编辑:

  

MKCoordinateForMapPoint返回该纬度和经度   对应于指定的地图点。

CLLocationCoordinate2D MKCoordinateForMapPoint(
   MKMapPoint mapPoint
);
  

MKMapPointForCoordinate返回该地图点数据结构   对应于指定的坐标。

MKMapPoint MKMapPointForCoordinate(
   CLLocationCoordinate2D coordinate
);

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/doc/uid/TP40008209