2010-04-08 11 views
21

我很困惑。我有一個觀點:如何將矢量圖層座標轉換爲Openlayers中的地圖經度和緯度

x= -12669114.702301 
y= 5561132.6760608 

我從DrawFeature控制器在矢量圖上繪製了一個正方形。

這些數字看起來......呃......太大了,但它們似乎起作用,因爲如果我後來畫出一個具有所有相同點的正方形,它就處於相同的位置,所以我認爲它們必須是正確的。

問題是當我嘗試將此點轉換爲經度和緯度。

我使用:

map.getLonLatFromPixel(pointToPixel(points[0])); 

凡點[0]是一個幾何點,並且pointToPixel函數採用任何點並將其轉換的像素(由於getLonLatFromPixel需要的像素)。它通過簡單地獲取點的x,並將其作爲像素x等來實現。

經緯度我得到的順序:

lat: -54402718463.864 
lng: -18771380.353223 

這是非常明顯的錯誤。我很困惑。我嘗試投影這個對象,使用:

.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); 

但我真的不明白它,我敢肯定,我做錯了,反正。

我的代碼是在這裏:http://pastie.org/909644

我在虧損還算是的。座標似乎是一致的,因爲我可以重複使用它們以獲得相同的結果......但它們看起來比我在openLayers網站上看到的任何示例都大...

回答

34

根據你的代碼,您所使用的投影EPSG:900913,這是一個谷歌使用。該投影的單位是米,而你得到該點的值是完全正確的:

x= -12669114.702301 (longitude) 
y= 5561132.6760608 (latitude) 

這個值不是像素,但在EPSG座標:900913投影,並且是正確的(只要他們應該是在Idaho,如果不是有什麼不對別處)

要檢查它,你可以去http://proj4js.org/和EPSG改變你的座標:900913至WGS84(經/緯度),它會給你:

x = -113.8085937334033 (longitude) 
y = 44.615123313472 (latitude) 

這是您可能期望的值。如果你想從點獲得它們的座標使用類似:

point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); 

這將從谷歌投影變換座標以WGS84(緯度/經度)。

+0

謝謝,我真的很難在各種預測中纏繞我的頭... – Jenny 2010-04-09 13:06:08

+0

其實我有一個問題...我會再次正式提問,但是:如果我做的是相反的(point.transform(新的OpenLayers.Projection(「EPSG:4326」),新的OpenLayers.Projection(「EPSG:900913」)); 對於常規經緯度點,我得到NaN(不是數字?) 。這是預期的嗎? – Jenny 2010-04-09 13:16:57

+0

http://stackoverflow.com/questions/2607734/openlayers-projections – Jenny 2010-04-09 13:19:02

2

據我記得,box處理程序與OL中的其他處理程序的實現方式不同。我們必須實施自己的處理程序,它返回一個幾何形狀與經度/緯度座標,而與像素座標:

Legato.Handler.Box = OpenLayers.Class(OpenLayers.Handler.Box, { 
    endBox : function(end) { 
    var result; 
    if (Math.abs(this.dragHandler.start.x - end.x) > 5 
     || Math.abs(this.dragHandler.start.y - end.y) > 5) { 
     var start = this.dragHandler.start; 
     var top = Math.min(start.y, end.y); 
     var bottom = Math.max(start.y, end.y); 
     var left = Math.min(start.x, end.x); 
     var right = Math.max(start.x, end.x); 

     var lowerLeftLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
      left, bottom)); 
     var upperRightLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
      right, top)); 
     var bounds = new OpenLayers.Bounds(lowerLeftLonLat.lon, 
      lowerLeftLonLat.lat, upperRightLonLat.lon, upperRightLonLat.lat); 
     result = bounds.toGeometry(); 
    } else { 
     var xy = this.dragHandler.start.clone(); 
     var lonLat = this.map.getLonLatFromPixel(xy); 
     result = new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat); 
    } 
    this.removeBox(); 
    this.callback("done", [ result ]); 
    }, 

    CLASS_NAME :"Legato.Handler.Box" 
}); 
相關問題