如果我有大小为 sizeX、sizeY 的 jpeg 地图
以及地图上的一些校准点(X、Y、Lon、Lat)
使用给定的经度/纬度对计算地图中相应 XY 点的算法是什么?
如果我有大小为 sizeX、sizeY 的 jpeg 地图
以及地图上的一些校准点(X、Y、Lon、Lat)
使用给定的经度/纬度对计算地图中相应 XY 点的算法是什么?
这对我有用,没有太多的bs。
int x = (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat));
经纬度坐标是由 Android 设备提供给我的。因此,它们应该采用所有 Google 地球/地图产品使用的相同标准。
如果使用Equidistant Cylindrical Projection 类型 map,您需要执行以下操作:
互联网上有大量关于计算两对纬度和经度之间的距离的信息。我们在我们的公共网站上使用这些计算,它们并不容易理解/讨论(所以我不会在这里尝试覆盖它们)。也就是说,它们很容易实现。
一旦你有一个返回距离的函数,你应该能够根据角落之间的距离来计算地图的宽度和高度。
然后你可以计算你的点到左上角的水平和垂直距离。
现在您找出地图宽度的比例由左侧和您的点之间的距离表示,将该比例应用于像素宽度,您就有了左侧和您的点之间的像素数。重复 y 轴。
(左侧的像素)=(以像素为单位的总宽度)*((左侧和您的点之间的地理编码距离)/(左侧和右侧之间的地理编码距离))
(顶部的像素)=(像素的总高度)*((顶部和您的点之间的地理编码距离)/(顶部和底部之间的地理编码距离))
编辑:当您进一步研究时,您会注意到某些解决方案将提供比其他解决方案更准确的结果,因为您正在近似球面上两点之间的距离并将其映射到平面上。精度随着距离的增加而降低。对您的最佳建议是先尝试一下,看看它是否满足您的需求。
这是相当直接和简单的......让我解释一下它是如何可能的。
纬度和经度是在地球上绘制的假想线,因此您可以准确地确定世界上的任何位置。简单地说,它们是飞机的 X 和 Y 坐标。纬度是一条从北到南的垂直线,其北极为 90 度,南极为 -90 度。
另一方面,经度是一条从东到南的水平线,西为-180度,东为180度。
您可以将 latLng 转换为像素坐标,因为假设 html 容器的宽度是世界的宽度,高度也是如此。
公式 - 经度 - 像素
(givenLng*widthOfContainerElement)/360
其中 360 是以度为单位的总经度
公式 - 纬度 - 像素
(givenLat*heightOfContainerElement)/180
其中 180 是以度为单位的总纬度
//Height is calculated from the bottom
你可以在我的网站上找到这个公式的工作实现(它只使用 JavaScript)
http://www.learntby.me/javascript/latLngconversion.php
如果您还需要任何澄清,请告诉我。
有许多不同的地图投影方案。您必须知道您的地图使用了哪些。
有关地图投影算法和正向/反向映射的更多信息,请查看此链接。它提供了许多常见投影的公式。
做这个(墨卡托投影图):
extension UIView
{
func addLocation(coordinate: CLLocationCoordinate2D)
{
// max MKMapPoint values
let maxY = Double(267995781)
let maxX = Double(268435456)
let mapPoint = MKMapPointForCoordinate(coordinate)
let normalizatePointX = CGFloat(mapPoint.x / maxX)
let normalizatePointY = CGFloat(mapPoint.y / maxY)
let pointView = UIView(frame: CGRectMake(0, 0, 5, 5))
pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height)
pointView.backgroundColor = UIColor.blueColor()
addSubview(pointView)
}
}
我在 UIView 上添加坐标的简单项目:https ://github.com/Glechik/MapCoordinateDrawer
我试过这种方法:
int x = (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat));
这是上面文章代码部分的快捷方式: https ://gist.github.com/blaurt/b0ca054a7384ebfbea2d5fce69ae9bf4#file-latlontooffsets-js
<!DOCTYPE html>
<html>
<head>
<style>
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000}
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2}
html,
body,
#canvas {
width: 100%;
height: 100%;
overflow: hidden;
margin: 0
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script>
$(window).on("load resize",function(e){
var w = $("#canvas").width();
var h = $("#canvas").height();
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY)
var lat = 40.91525559999999;
var long = -73.70027209999999;
var x = ((w/360) * (180 + long)) - 9;
var y = ((h/180) * (90 - lat)) - 18;
$("#text").text('X:'+x+', Y:'+y);
$("#point").offset({ top: y, left: x });
});
</script>
</head>
<body>
<div id="text"></div>
<div id="point">▼</div>
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg">
</body>
</html>