2012-07-25 47 views
4

我想編寫一個簡單的捕捉功能在谷歌地圖V3.9編輯多邊形經緯度位置谷歌地圖多邊形編輯 - 得到的mouseup

我有地圖,可進行編輯的一個在幾個多邊形一次。 當一個可編輯的時候,我也添加一個監聽器,當一個頂點被拖動時觸發。

由於存在用於google.maps.Polygon沒有拖動事件,我添加mousedown監聽器,它檢查是否一個頂點是光標下,如果這樣增加了一個mouseup偵聽器。 此mouseup偵聽器中的代碼將檢查所有其他多邊形的頂點,如果找到近似匹配,則更新拖動頂點。

這個效果很好,除了一個問題。該檢查使用由mouseup聽衆返回的PolyMouseEventlatLng屬性執行。該屬性指向之前的頂點的位置,並且我無法找到在其新位置引用頂點的方式。

dragListener = google.maps.event.addListener(poly1, "mousedown", function(dragData) { 

    // if dragging a vertex 
    if (dragData.vertex != null) { 

     // perform snap on mouseup 
     snapListener = google.maps.event.addListener(poly1, "mouseup", function(mouseData) { 
      var editingVertex = mouseData.vertex; 
      var draggedLatLng = mouseData.latLng; 

      // code here to compare draggedLatLng with latLng of editingVertex 
      // and perform snap, which seems to work fine as is... 
     } 
    } 
} 
+0

我正試圖實現同樣的目標,並且我找不到任何解決方案... – Catalin 2013-01-26 13:03:44

+0

我寫了一個庫來解決這個問題。請看[我的答案在這裏](http://stackoverflow.com/a/33338065/568884) – 2015-10-30 00:02:44

回答

3

多邊形是路徑的集合,和路徑是LatLng對象MVCArrays,所以我們可以聆聽到它告訴我們,當一個點已被移動多邊形的每個路徑上的set_at事件。

poly1.getPaths().forEach(function(path, index){ 
    google.maps.event.addListener(path, 'set_at', function(index, oldLatLng){ 
    var newLatLng = path.getAt(index); 
    // Now you have both the old and new position 
    }); 
}); 

如果你知道你的多邊形永遠不會有一個以上的路徑(內圈),那麼你可以這樣做:

google.maps.event.addListener(poly1.getPath(), 'set_at', function(index, oldLatLng){ 
    var newLatLng = path.getAt(index); 
}); 

雖然我推薦第一個,因爲你永遠不知道當一個多邊形有多條路徑可能會以某種方式潛入。

+0

這似乎不是做的是讓你的位置的頂點,因爲它被拖動,「set_at」事件是隻有在您將頂點放在新位置時纔會調用。任何人都可以找到一種方法來獲取頂點的位置而被拖動? – chrismarx 2017-03-31 18:20:32