Полигон Рисование и получение координат с Google Map API v3
Я пытаюсь разработать приложение с помощью Google Maps API v3. Я пытаюсь это сделать; сначала попросите пользователя нарисовать многоугольник на карте Google и получить его/ее полигональные координаты и сохранить их в базе данных. Затем я покажу сохраненные пользователем координаты.
Я не знаю, как разрешить пользователям рисовать полигон на Карте Google с помощью API v3, а затем получать координаты. Если я смогу получить эти координаты, легко сохранить их в базе данных.
http://gmaps-samples.googlecode.com/svn/trunk/poly/mymapstoolbar.html - это почти точный пример, но он использует API v2 и не дает координат. Я хочу использовать API v3 и иметь возможность получить все координаты.
Есть ли примеры рисования полигона и получения его координат с API v3?
Ответы
Ответ 1
В Google теперь есть библиотека чертежей, см. полную документацию: https://developers.google.com/maps/documentation/javascript/overlays#drawing_tools
Или быстрый пример его использования: http://gmaps-samples-v3.googlecode.com/svn/trunk/drawing/drawing-tools.html
Ответ 2
здесь у вас есть пример выше, используя API V3
http://nettique.free.fr/gmap/toolbar.html
Ответ 3
Если все, что вам нужно, это координаты здесь - инструмент рисования, который мне нравится использовать - переместите многоугольник или переформатируйте его, и координаты будут отображаться прямо под картой: jsFiddle here.
Кроме того, здесь Codepen
JS
var bermudaTriangle;
function initialize() {
var myLatLng = new google.maps.LatLng(33.5190755, -111.9253654);
var mapOptions = {
zoom: 12,
center: myLatLng,
mapTypeId: google.maps.MapTypeId.RoadMap
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
var triangleCoords = [
new google.maps.LatLng(33.5362475, -111.9267386),
new google.maps.LatLng(33.5104882, -111.9627875),
new google.maps.LatLng(33.5004686, -111.9027061)
];
// Construct the polygon
bermudaTriangle = new google.maps.Polygon({
paths: triangleCoords,
draggable: true,
editable: true,
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#FF0000',
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
google.maps.event.addListener(bermudaTriangle, "dragend", getPolygonCoords);
google.maps.event.addListener(bermudaTriangle.getPath(), "insert_at", getPolygonCoords);
google.maps.event.addListener(bermudaTriangle.getPath(), "remove_at", getPolygonCoords);
google.maps.event.addListener(bermudaTriangle.getPath(), "set_at", getPolygonCoords);
}
function getPolygonCoords() {
var len = bermudaTriangle.getPath().getLength();
var htmlStr = "";
for (var i = 0; i < len; i++) {
htmlStr += bermudaTriangle.getPath().getAt(i).toUrlValue(5) + "<br>";
}
document.getElementById('info').innerHTML = htmlStr;
}
HTML
<body onload="initialize()">
<h3>Drag or re-shape for coordinates to display below</h3>
<div id="map-canvas">
</div>
<div id="info">
</div>
</body>
CSS
#map-canvas {
width: auto;
height: 350px;
}
#info {
position: absolute;
font-family: arial, sans-serif;
font-size: 18px;
font-weight: bold;
}
Ответ 4
Ну, к сожалению, кажется, что нельзя создавать собственные маркеры и рисовать (и получать координаты) непосредственно с maps.google.com, если вы анонимны/не вошли в систему (как это было возможно несколько лет назад, если я правильно помню), Тем не менее, благодаря ответам здесь, мне удалось составить комбинацию примеров, в которых есть как поиск в Google Местах, так и возможность рисования через библиотеку чертежей, а также сбрасывает координаты при выборе любого типа фигуры (включая координаты для многоугольника) которые могут быть скопированы; код здесь:
Вот как это выглядит:
![test.png]()
(Маркеры Placees обрабатываются отдельно и могут быть удалены с помощью элемента DEL "button" элементом формы входного поиска; "curpos" отображает текущий центр [положение] и уровень масштабирования окна просмотра карты).
Ответ 5
Это чище/безопаснее использовать получатели, предоставленные google, вместо доступа к свойствам, например, некоторым
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(polygon) {
var coordinatesArray = polygon.overlay.getPath().getArray();
});
Ответ 6
чтобы выполнить то, что вы хотите, вы должны getPaths из многоугольника. Пути будут массивом точек LatLng. вы получаете элементы массива и разделяете пары LatLng с методами .lat и .lng в приведенной ниже функции, у меня есть избыточный массив, соответствующий полилинии, которая отмечает периметр вокруг многоугольника.
сохранение - это еще одна история. вы можете выбрать многие методы. вы можете сохранить свой список точек в виде строки в формате csv и экспортировать ее в файл (самое простое решение, безусловно). Я очень рекомендую GPS TXT форматы, такие как те (есть 2), читаемые GPS TRACKMAKER (отличное программное обеспечение бесплатной версии). если вы компетентны сохранять их в базе данных, это отличное решение (я делаю оба, для избыточности).
function areaPerimeterParse(areaPerimeterPath) {
var flag1stLoop = true;
var areaPerimeterPathArray = areaPerimeterPath.getPath();
var markerListParsedTXT = "Datum,WGS84,WGS84,0,0,0,0,0\r\n";
var counter01 = 0;
var jSpy = "";
for (var j = 0;j<areaPerimeterPathArray.length;j++) {
counter01++;
jSpy += j+" ";
if (flag1stLoop) {
markerListParsedTXT += 'TP,D,'+[ areaPerimeterPathArray.getAt(j).lat(), areaPerimeterPathArray.getAt(j).lng()].join(',')+',00/00/00,00:00:00,1'+'\r\n';
flag1stLoop = false;
} else {
markerListParsedTXT += 'TP,D,'+[ areaPerimeterPathArray.getAt(j).lat(), areaPerimeterPathArray.getAt(j).lng()].join(',')+',00/00/00,00:00:00,0'+'\r\n';
}
}
// last point repeats first point
markerListParsedTXT += 'TP,D,'+[ areaPerimeterPathArray.getAt(0).lat(), areaPerimeterPathArray.getAt(0).lng()].join(',')+',00/00/00,00:00:00,0'+'\r\n';
return markerListParsedTXT;
}
строка, которая заканчивается на ", 1" (в отличие от ", 0" ), запускает новый многоугольник (этот формат позволяет сохранять несколько полигонов в одном файле). я нахожу TXT более понятным для людей, чем XML-форматы GPX и KML.
Ответ 7
Другие ответы показывают, что вы создаете многоугольники, но не как получить координаты...
Я не уверен, что это лучший способ, но это один из способов. Кажется, должен быть метод для получения путей из многоугольника, но я не могу его найти, а getPath() doesn Кажется, я работаю для меня. Итак, здесь был ручной подход, который работал у меня.
Как только вы закончите рисовать свой многоугольник и передаете в свой полигон полнофункциональную функцию наложения, вы можете найти координаты в файле polygon.overlay.latLngs.b [0].b
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(polygon) {
$.each(polygon.overlay.latLngs.b[0].b, function(key, latlng){
var lat = latlng.d;
var lon = latlng.e;
console.log(lat, lon); //do something with the coordinates
});
});
Заметьте, я использую jquery для перебора по списку координат, но вы можете сделать цикл, однако.
Ответ 8
Добавление к ответу Gisheri
Следующий код работал у меня
var drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: google.maps.drawing.OverlayType.MARKER,
drawingControl: true,
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: [
google.maps.drawing.OverlayType.POLYGON
]
},
markerOptions: {
icon: 'images/beachflag.png'
},
circleOptions: {
fillColor: '#ffff00',
fillOpacity: 1,
strokeWeight: 5,
clickable: false,
editable: true,
zIndex: 1
}
});
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(polygon) {
//console.log(polygon.overlay.latLngs.j[0].j);return false;
$.each(polygon.overlay.latLngs.j[0].j, function(key, LatLongsObject){
var LatLongs = LatLongsObject;
var lat = LatLongs.k;
var lon = LatLongs.B;
console.log("Lat is: "+lat+" Long is: "+lon); //do something with the coordinates
});
Ответ 9
Поскольку Google иногда обновляет имя свойств фиксированных объектов, лучше всего использовать методы GMaps V3 для получения координат event.overlay.getPath(). getArray() и получить lat latlng.lat() и lng latlng.lng().
Итак, я просто хотел улучшить этот ответ, немного иллюстрирующий сценарий вставки полигона и POSTGIS:
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(event) {
var str_input ='POLYGON((';
if (event.type == google.maps.drawing.OverlayType.POLYGON) {
console.log('polygon path array', event.overlay.getPath().getArray());
$.each(event.overlay.getPath().getArray(), function(key, latlng){
var lat = latlng.lat();
var lon = latlng.lng();
console.log(lat, lon);
str_input += lat +' '+ lon +',';
});
}
str_input = str_input.substr(0,str_input.length-1) + '))';
console.log('the str_input will be:', str_input);
// YOU CAN THEN USE THE str_inputs AS IN THIS EXAMPLE OF POSTGIS POLYGON INSERT
// INSERT INTO your_table (the_geom, name) VALUES (ST_GeomFromText(str_input, 4326), 'Test')
});
Ответ 10
Убрал то, что chuycepeda имеет, и поместил его в текстовое поле, чтобы отправить его обратно в форму.
google.maps.event.addListener(drawingManager, 'overlaycomplete', function (event) {
var str_input = '{';
if (event.type == google.maps.drawing.OverlayType.POLYGON) {
$.each(event.overlay.getPath().getArray(), function (key, latlng) {
var lat = latlng.lat();
var lon = latlng.lng();
str_input += lat + ', ' + lon + ',';
});
}
str_input = str_input.substr(0, str_input.length - 1) + '}';
$('textarea#Geofence').val(str_input);
});
Ответ 11
попробуйте это
В вашем контроллере используйте
> $scope.onMapOverlayCompleted = onMapOverlayCompleted;
>
> function onMapOverlayCompleted(e) {
>
> e.overlay.getPath().getArray().forEach(function (position) {
> console.log('lat', position.lat());
> console.log('lng', position.lng());
> });
>
> }
**In Your html page , include drawning manaer**
<ng-map id="geofence-map" zoom="8" center="current" default-style="true" class="map-layout map-area"
tilt="45"
heading="90">
<drawing-manager
on-overlaycomplete="onMapOverlayCompleted()"
drawing-control-options="{position: 'TOP_CENTER',drawingModes:['polygon','circle']}"
drawingControl="true"
drawingMode="null"
markerOptions="{icon:'www.example.com/icon'}"
rectangleOptions="{fillColor:'#B43115'}"
circleOptions="{fillColor: '#F05635',fillOpacity: 0.50,strokeWeight: 5,clickable: false,zIndex: 1,editable: true}">
</drawing-manager>
</ng-map>