2017-01-26 2 views
0

Я выяснил, как захватить коорды при добавлении полилинии или многоугольника или удалена вершина, но я не могу представить, как поймать, когда перемещается полилиния или вершина полигона (вершина только, я умышленно перетаскиваю полностью отключенный поли). Я использую эту ссылку в качестве ссылки: event after modifying polygon in google maps api v3Получение обновленных коордов при перемещении вершин полилинии/полигона. (Google Maps)

Вот мой полный HTML-код (отправил в Pastebin для читателя): http://pastebin.com/95HcHqQR

Вот раздел я пытаюсь сделать улов движется:

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) { 

    var newShape = e.overlay; 
    newShape.type = e.type; 

    if (e.type !== google.maps.drawing.OverlayType.MARKER) { 
    // Switch back to non-drawing mode after drawing a shape. 
    drawingManager.setDrawingMode(null); 

    /////////////////////////////////////////////////////////// 
    //This section is intended to catch vertex moves...currently not 

    google.maps.event.addListener(newShape, 'polygoncomplete', function(e) { 
     google.maps.event.addListener(newShape.getPath(), 'set_at', function(e) { 
     google.maps.event.addListener(newShape.getPath(), 'insert_at', function(e) { 
      var path = newShape.getPaths().getAt(e.path); 
      document.getElementById("polygonEditTest").value += path.getAt(e.vertex) + '\n'; 
     }) 
     }); 
    }); 
    google.maps.event.addListener(newShape, 'polylinecomplete', function(e) { 
     google.maps.event.addListener(newShape.getPath(), 'set_at', function(e) { 
     google.maps.event.addListener(newShape.getPath(), 'insert_at', function(e) { 
      var path = newShape.getPaths().getAt(e.path); 
      document.getElementById("polylineEditTest").value += path.getAt(e.vertex) + '\n'; 
     }) 
     }); 
    }); 
    /////////////////////////////////////////////////////////// 

    // Add an event listener that selects the newly-drawn shape when the user 
    // clicks it. 
    google.maps.event.addListener(newShape, 'click', function(e) { 
     if (e.vertex !== undefined) { 
     if (newShape.type === google.maps.drawing.OverlayType.POLYGON) { 
      var path = newShape.getPaths().getAt(e.path); 
      path.removeAt(e.vertex); 

      ///////////////////////////////////////////////////////////// 
      //Update textboxes with geo data when polygon vertex deleted 
      document.getElementById("action_gon").value = '' 
      document.getElementById("action_gon").value += "#polygon vertex deleted\n"; 
      for (var i = 0; i < path.length; i++) { 
      document.getElementById("action_gon").value += path.getAt(i) + '\n'; 
      } 
      // 
      if (path.length < 3) { 
      newShape.setMap(null); 
      document.getElementById("action_gon").value = 'This box shows coords when a new POLYGON shape is added and/or vertex deleted' 
      } 
     } 

     if (newShape.type === google.maps.drawing.OverlayType.POLYLINE) { 
      var path = newShape.getPath(); 
      path.removeAt(e.vertex); 
      ///////////////////////////////////////////////////////////// 
      //Update textboxes with geo data when polyline vertex deleted 
      document.getElementById("action_line").value = '' 
      document.getElementById("action_line").value += "#polyline vertex deleted\n"; 
      for (var i = 0; i < path.length; i++) { 
      document.getElementById("action_line").value += path.getAt(i) + '\n'; 
      } 
      // 
      if (path.length < 2) { 
      newShape.setMap(null); 
      document.getElementById("action_line").value = 'This box shows coords when a new POLYLINE shape is added and/or vertex deleted' 
      } 
     } 
     } 

     setSelection(newShape); 
    }); 
    setSelection(newShape); 
    } else { 
    google.maps.event.addListener(newShape, 'click', function(e) { 
     setSelection(newShape); 
    }); 
    setSelection(newShape); 
    } 
}); 

EDIT: Вот то, что я считаю, что минимальный код, необходимый для демонстрации проблемы (невозможность захватить вершину ходов).

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
<meta charset="UTF-8"> 
<title>Test</title> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&libraries=drawing,places"></script> 

<style type="text/css"> 
#map, html, body { 
padding: 0; 
margin: 0; 
width: 100%; 
height: 100%; 
} 

</style> 

<script type="text/javascript"> 

//Map Specifications 

function initialize() { 
var map = new google.maps.Map(document.getElementById('map'), { 
zoom: 18, 
center: new google.maps.LatLng(33.27144940863937, -117.2983479390361), 
mapTypeId: google.maps.MapTypeId.HYBRID, 
disableDefaultUI: true, 
zoomControl: true, 
mapTypeControl: false, 
scaleControl: true, 
streetViewControl: true, 
rotateControl: true, 
fullscreenControl: false 
}); 

var polyOptions = { 
strokeWeight: 0, 
fillOpacity: 0.45, 
editable: true, 
draggable: false 
}; 

// Creates a drawing manager attached to the map that allows the user to draw 
// markers and lines 
drawingManager = new google.maps.drawing.DrawingManager({ 
drawingControlOptions: { 
position: google.maps.ControlPosition.TOP_CENTER, 
drawingModes: [ 
google.maps.drawing.OverlayType.POLYLINE, 
google.maps.drawing.OverlayType.POLYGON 
] 
}, 
markerOptions: { 
draggable: false 
}, 
polylineOptions: { 
editable: true, 
draggable: false 
}, 
//rectangleOptions: polyOptions, 
polygonOptions: polyOptions, 
map: map 
}); 

////////////////////////////////////////// 
var drawingManager; 
var selectedShape; 
function clearSelection() { 
if (selectedShape) { 
    if (selectedShape.type !== 'marker') { 
     selectedShape.setEditable(false); 
    } 
    selectedShape = null; 
} 
} 

function setSelection (shape) { 
if (shape.type !== 'marker') { 
    clearSelection(); 
    shape.setEditable(true); 
} 
selectedShape = shape; 
} 
////////////////////////////////////////// 

google.maps.event.addListener(drawingManager, 'overlaycomplete', function (e) { 
var newShape = e.overlay;   
newShape.type = e.type; 

if (e.type !== google.maps.drawing.OverlayType.MARKER) { 
    // Switch back to non-drawing mode after drawing a shape. 
    drawingManager.setDrawingMode(null); 

    google.maps.event.addListener(newShape, 'polygoncomplete', function (e) { 
    google.maps.event.addListener(newShape.getPath(), 'set_at', function() { 
    google.maps.event.addListener(newShape.getPath(), 'insert_at', function() { 
    var path = newShape.getPaths().getAt(e.path); 
    document.getElementById("polygonEditTest").value += path.getAt(e.vertex) + '\n'; 
    }) 
    }); 
    }); 

    google.maps.event.addListener(newShape, 'polylinecomplete', function (e) { 
    google.maps.event.addListener(newShape.getPath(), 'set_at', function(e) { 
    google.maps.event.addListener(newShape.getPath(), 'insert_at', function(e) { 
    var path = newShape.getPaths().getAt(e.path); 
    document.getElementById("polylineEditTest").value += path.getAt(e.vertex) + '\n'; 
    }) 
    }); 
    }); 

    // Add an event listener that selects the newly-drawn shape when the user 
    // clicks it. 
    setSelection(newShape);} 
else { 
    google.maps.event.addListener(newShape, 'click', function (e) { 
    setSelection(newShape); 
    }); 
    setSelection(newShape); 
    } 
}); 
} 

google.maps.event.addDomListener(window, 'load', initialize); 

</script> 
</head> 
<body> 
<div id="geoinfoboxes"> 
    <textarea id="polylineEditTest" rows="8" cols="46">This box shows coords for edited POLYLINES (ie. moving a vertex)</textarea> 
    <textarea id="polygonEditTest" rows="8" cols="46">This box shows coords for edited POLYGONS (ie. moving a vertex)</textarea> 
</div> 
<div id="map"></div> 
</body> 
</html> 
+0

Почему у вас есть слушатель 'insert_at' внутри слушателя' set_at'? Я ожидал бы, что функция обратного вызова события set_at сделает то, что вы хотите (и это не то, что сделано в ответе на вопрос, который вы ссылаетесь). – geocodezip

+0

Спасибо за ответ. В нем упоминается использование метода «слушатель внутри слушателя». Это то, что я пытался сделать, и где меня повесили трубку. – Drivium

+0

Похоже, вы говорите, что я смогу удалить insert_at (по вашему предложению), и он будет работать так, как я есть, но пока ничего не добился, поэтому я предполагаю, что это не то, что вы имели в виду. – Drivium

ответ

1

Для прослушивания увлечения вершины сопротивления редактируемого полигона используйте прослушиватель MCVArrayset_at события:

google.maps.event.addListener(polygon.getPath(), 'set_at', processVertex); 
google.maps.event.addListener(polygon.getPath(), 'insert_at', processVertex); 
function processVertex(e) { 
    var logStr = "" 
    for (var i = 0; i < this.getLength(); i++) { 
    logStr += this.getAt(i).toUrlValue(6) + " "; 
    } 
    console.log(logStr); 
} 

proof of concept fiddle

фрагмент кода:

function initialize() { 
 
    var map = new google.maps.Map(
 
    document.getElementById("map_canvas"), { 
 
     center: new google.maps.LatLng(37.4419, -122.1419), 
 
     zoom: 12, 
 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }); 
 
    var polygon = new google.maps.Polygon({ 
 
    path: [new google.maps.LatLng(37.4544762, -122.1161696), 
 
     new google.maps.LatLng(37.3751, -122.1731859), 
 
     new google.maps.LatLng(37.4274745, -122.169719) 
 
    ], 
 
    map: map, 
 
    editable: true 
 
    }); 
 
    google.maps.event.addListener(polygon.getPath(), 'set_at', processVertex); 
 
    google.maps.event.addListener(polygon.getPath(), 'insert_at', processVertex); 
 

 
    function processVertex(e) { 
 
    var logStr = "" 
 
    for (var i = 0; i < this.getLength(); i++) { 
 
     logStr += this.getAt(i).toUrlValue(6) + " "; 
 
    } 
 
    console.log(logStr); 
 
    } 
 
} 
 
google.maps.event.addDomListener(window, "load", initialize);
html, 
 
body, 
 
#map_canvas { 
 
    height: 100%; 
 
    width: 100%; 
 
    margin: 0px; 
 
    padding: 0px 
 
}
<script src="https://maps.googleapis.com/maps/api/js"></script> 
 
<div id="map_canvas"></div>

+0

Я попытался подключить ваш код следующим образом: http://pastebin.com/TMV3xMjw, но он не отвечает. Я ожидаю, что он обновит поле «polygonEditTest» вверху, но это не так. Я могу применить его неправильно, так как я сделал код из другого найденного мной примера. Проблема, с которой я столкнулась, заключается в применении этих примеров к моей собственной работе. Не могли бы вы включить пример, который находится в контексте моего опубликованного кода? Кроме того, я заметил, что вы используете «map_canvas», но я использовал «карту». Это влияет на функциональность вашего примера? Когда я перехожу к «map_canvas», карта никогда не загружается. – Drivium

+0

Я понимаю, что есть отдельные примеры захвата вершинных движений конкретно, но моя дилемма применяет его к моей работе. Здесь я боюсь. – Drivium

+0

Если вы хотите обновить код _your_, вы должны указать [mcve] в своем вопросе, который демонстрирует проблему. Текущий пример в вашем вопросе не является полным (и был беспорядок до тех пор, пока я не обновил его, чтобы его можно было прочитать), а pastebin мне не помогает (по крайней мере, прямо сейчас). – geocodezip

Смежные вопросы