2009-09-02 83 views

回答

8

互联网上有大量关于计算两对经纬度之间距离的信息。我们在我们的公共网站上使用这些计算,他们不是微不足道的理解/讨论(所以我不会在这里覆盖他们)。这就是说,它们很容易实现。

一旦你有一个返回距离的函数,你应该能够根据角之间的距离计算出地图的宽度和高度。

然后你可以从左上角计算你的点的水平和垂直距离。

现在,您可以通过左侧和您的点之间的距离来确定地图宽度的比例,并将该比率应用于像素宽度,并且左侧和点之间有像素点数量。对y轴重复。

(像素从左侧)=(以像素为单位的总宽度)*(左和您的点之间(地址解析距离)左侧和右侧之间/(地址解析距离))

(像素从顶部)= (以像素为单位的总高度)*((地理编码顶部和您的点之间的距离)/(顶部和底部之间的地理编码距离))

编辑:当您进一步研究时,您会注意到某些解决方案会呈现出比其他原因在于您近似于球面上两点之间的距离并将其映射到平面上。随着距离的增加,精确度会降低。对你最好的建议是首先尝试一下,看看它是否符合你的需求。

+0

地图项目我们的3D到一个2D表面。由于无法将正方形完美地包裹到球体上,因此有不同的投影方法可以获得近似正确的结果。给定地图上的距离是非线性的,所以你的公式只是一个近似值。 – 2009-09-02 19:12:51

+0

近似值适用于大多数距离。但我应该在帖子中澄清。 – Mayo 2009-09-02 19:15:17

+0

是的,放大地图越多,结果就越准确。你应该看到一个城市级地图几乎没有差别,但是对于一个州级或更大的地图来说,这是显而易见的。 – 2009-09-02 21:39:24

5

有许多不同的地图投影方案。你将不得不知道你的地图使用哪一个。

有关地图投影算法和正向/反向映射的更多信息,请查看this link。它提供了许多常用投影的公式。

+0

我不需要太高的准确度,所以下面的解决方案可能就足够了。如果不是,转型将如何?哪些是projectino方案?到目前为止,我见过: UTM 横轴墨卡托投影 墨卡托 经度/纬度 – Jorge 2009-09-02 20:11:03

+0

顺便说一句。我还编写了Lat/Lon和UTM转换公式。从Lat/Lon转换为UTM并以正确的方式应用解决方案(至少对于UTM投影)? – Jorge 2009-09-02 20:32:47

+0

您的地图使用墨卡托吗?在选择正确的投影之前,您需要知道地图编码的内容。一旦你有正确的地理编码距离,mmayo的公式给你在地图上的正确像素。 – 2009-09-02 21:40:37

9

如果使用Equidistant Cylindrical Projection type map,这里是你需要做什么:

  1. 在这儿找到您的位置教程的纬度和经度:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. 输入的信息为以下公式:
    x =(图像的总宽度,px)*(180 +纬度)/ 360
    y =(图像的总高度,px)*(90-经度)/ 180

    注意:当使用负经度的纬度时,确保加上或减去负数,即+( - 92)或 - ( - 35),这实际上是-92和+35

  3. 你现在有你的X和Y到你的图像上绘制

    更多信息,关于这个公式和发现地图类型在这里:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
+0

你能告诉我如何计算从X,Y到纬度? – colin 2011-01-18 00:00:47

17

这里是为我工作,没有这么多的学士学位。

int x = (int) ((MAP_WIDTH/360.0) * (180 + lon)); 
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat)); 

lat,lon坐标是Android设备给我的。因此,它们应该与所有Google地球/地图产品使用的标准相同。

+0

现在如何显示x,y。意思是应该使用哪种方法用于x和y来显示它 – sns 2012-03-31 07:53:35

+0

@NaeemShah canvas.drawCircle(x,y,r,mPaint); – 2013-09-09 04:00:19

+1

我意识到这是一个古老的问题,但我找不到有关地图偏移和缩放的答案。此外,这是MAP_WIDTH/HEIGHT度(即经度和纬度的三角洲)还是像素值?缩放发生在哪里? – OzBarry 2016-01-12 01:04:18

7

这是相当直接和简单的..让我解释它是如何可能的。

经纬度是在地球上绘制的虚线,以便您可以精确地查明世界上的任何位置。简单地说,它们是飞机的X和Y坐标。 纬度是一条从北到南的垂直线,北极90度,南极-90度。

另一方面,经度是一条从东到南的水平线,西部-180deg,东部180deg。

您可以将latLng转换为像素坐标,因为通过假设html容器的宽度是世界的宽度,同样适用于高度。

式 - 经度 - 像素

(givenLng*widthOfContainerElement)/360 

其中360是在度总经度

式-Latitude - 像素

(givenLat*heightOfContainerElement)/180 

其中180是总l atitude在程度

//Height is calculated from the bottom 

你可以找到这个公式在这里的工作实施,在我的网站(它使用JavaScript只)

http://www.learntby.me/javascript/latLngconversion.php

让我知道如果你还需要什么澄清。

+0

我已在此处添加了所需的信息 – 2012-12-22 14:00:47

0

就使这(对于墨卡托投影地图):

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

1

<!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>