我使用iPhone的自定义地图陷入了某种地理定位的困境。问题是:我有一个UIScrollView
和一个UIImageView
,其中包含一个公平的自定义地图图片,包含所有展位位置等等。
我最大的问题是我打算使用地理位置来定位该地图中的人。当我尝试获取给定纬度和经度的像素位置时,问题就开始了。我有几个地面控制点作为参考,甚至设法计算我的参考点和当前位置之间的角度。问题在于我无法将像素距离与使用地理位置坐标计算的距离相关联。
我试图将它们联系如下:
计算地图中已知点的距离(以像素为单位)。 使用两个参考点的矢量距离计算来计算距离。 等于上面的两个以找到与参考的实际距离。
但我根本没有成功......
使用余弦定律,我可以找到能够给出X和Y投影的角度,但我找不到正确乘法的比例。我猜是因为纬度和经度是以度为单位给出的并且是非线性的,但我有一个很小的斑点,我可以将它作为线性斑点近似。
我不能在MKMapKit中使用叠加图像,因为我必须水平使用地图,在谷歌地图中,同一个地方向左旋转几度。
更新:
关注这个网站:http://www.movable-type.co.uk/scripts/latlong.html,我可以使用Haversine公式计算距离,但作为方向,我发现我正在以错误的方式计算角度。我将不得不找到另一种计算角度的方法。
答案 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
);