2009-09-02 86 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>