5

我需要在地圖div的固定像素位置放置一個標記。要實例化標記,您需要一個LatLng。據我所知,從DIVPixelToLatLng()是從像素座標轉換爲LatLng的方式,但我無法使其表現一致。Google Maps API V3 fromDivPixelToLatLng不一致

我已經發布了一個簡單的例子,我的問題在http://www.pinksy.co.uk/newsquare/overlaytest.html。點擊地圖放置一個200px/200px的標記。拖動地圖並再次單擊。我期待每次都會將標記放置在200px/200px,但事實並非如此。

首先,我設置了地圖像往常一樣,在一個600px的300像素的div:

var london = new google.maps.LatLng(51.501904,-0.130463); 
var mapOptions = { 
    zoom: 15, 
    center: london, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 
var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 

然後,我創建一個覆蓋:

var overlay = new google.maps.OverlayView(); 
overlay.draw = function() {}; 
overlay.setMap(map); 

要測試fromDivPixelToLatLng(),我創建了一個點擊地圖上的事件,它嘗試在像素位置200px/200px處放置標記。無論在何處拖動地圖的,我期待的標記始終被放置在200像素/ 200像素:

google.maps.event.addListener(map, 'click', function(event) { 

    var pixelLatLng = overlay.getProjection().fromDivPixelToLatLng(new google.maps.Point(200,200)); 

    var marker = new google.maps.Marker({ 
     position: pixelLatLng, 
     map: map 
    }); 
}); 

然而,拖動地圖,你會看到標記並不總是放置在200像素/ 200像素。有任何想法嗎?

謝謝!

回答

3

實驗後,我發現從ContainerPixelToLatLng()是我正在尋找。爲了他人的利益,我在http://www.pinksy.co.uk/newsquare/overlaytest2.html上發佈了一個例子。

(根據記錄,我仍然不清楚爲什麼fromDivPixelToLatLng表現它的方式,不過沒關係!)

+0

有下一個很好的解釋: https://groups.google.com/forum/#!topic/google-maps-api/L2UJJ​​p10VRw – kaskader

3

檢查下的演示: http://jsbin.com/otidih/51了一些這方面的更多的實驗。 爲了讓日誌啓動控制檯 - 大部分事情都記錄在那裏。

從這個groups post. 下方的較短版本詳細說明:

ContainerPixel相對於地圖容器計算。如果您平移地圖,則ContainerPixelLatLngs更改。 ContainerPixel不隨地圖移動的東西(浮動)不會改變。 例如,mapCenterContainerPixel保持不變,如果不調整地圖:

overlay.getProjection().fromLatLngToContainerPixel(map.getCenter()) 

DivPixel計算相對於龐大的div包含整個tilespace爲世界在當前縮放級別。

overlay.getProjection().fromLatLngToDivPixel(point) 

如果不改變縮放級別和移動(平移)地圖,那麼DivPixel的任何內容與地圖移動將保持不變。例如,即使您移動地圖,地圖上給定城市的DivPixel也會保持不變。它只會在您更改縮放級別或跨越國際日期線時發生變化。

請注意,無論何時地圖放大,用於計算DivPixel的實際參考點都將重置爲 ,因此即使您回到相同的縮放級別,同一LatLng也可能具有不同的DivPixel值。

還要考慮的是從

map.getProjection().fromLatLngToPoint() 

返回點值這是在API Reference 它從LatLng圓柱轉換到大點的飛機,它總是保持不變很好地解釋(無關於哪個縮放級別)。鑑於LatLngs將始終映射到相同的點。

(0,0)點是(85.0511287798066,-180)經緯度 - 哪裏的谷歌地圖的削減(如果你想知道爲什麼,閱讀有關Mercator projection

+0

這應該是選定的答案。 –