在 iPhone 上将经度/纬度转换为 x/y
Posted
技术标签:
【中文标题】在 iPhone 上将经度/纬度转换为 x/y【英文标题】:Convert longitude/latitude to x/y on iPhone 【发布时间】:2013-01-06 18:55:45 【问题描述】:我在 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,只是为了澄清。
所以我的第二次尝试是使用 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。
那么你知道我必须做什么才能让它工作吗?
非常感谢!
【问题讨论】:
你想通过什么公式找到 x 和 y? 通过一个有效的公式 :D 我刚刚在互联网上搜索并找到了上面的公式。基本上我有我的 iPhone 屏幕,它显示一个国家的图像,我想通过经度和纬度坐标在这张图像上找到城市。 上面的公式是墨卡托投影。我以为我有类似的东西。这是我的项目的截图:cl.ly/LySY。小黑点应指向城市“美因茨”(左中)。而不是在“不来梅”附近的中上层 【参考方案1】:要完成这项工作,您需要知道 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
为负数或大于图像大小,则该点不在地图上。
这个简单的解决方案假设地图图像使用基本的圆柱投影(墨卡托),其中所有经纬度线都是直线。
编辑:
要将图像点转换回坐标,只需反转计算即可:
double pointLong = pointX / xScale + minLong;
double pointLat = pointY / yScale + minLat;
其中pointX
和pointY
表示图像上的一个点,以屏幕点为单位。 (0, 0) 是图片的左上角。
【讨论】:
首先谢谢!但我尝试了这段代码,我得到了 x:-115.473389 y:-230.305954。但点 (49.993615, 8.242493) 不应该不在地图上。那么这些值怎么可能是负数,我怎样才能计算出正确的值呢?! 抱歉,我的xScale
和 yScale
部分倒退了。请参阅我对这两行的更新。
是否也有可能将其从 x/y 像素转换回经度和纬度?因为我想在我的图像地图上获得 2 个坐标之间的距离。
好的,非常感谢。我在很多城市对此进行了测试,结果发现 x 值每次都略有不同。你有什么遗漏的吗?还是仅仅因为我的 max 和 minLong 不够准确?
@DavidEhlen 如果您的最小值和最大值不够精确,或者图像实际上不是真正的墨卡托投影,您的 x 和 y 值将会关闭。以上是关于在 iPhone 上将经度/纬度转换为 x/y的主要内容,如果未能解决你的问题,请参考以下文章