我正在尝试使用Google Maps API v3开发应用程序。我想做的是;首先让用户在Google Map上绘制一个多边形并获取他/她的多边形坐标并将它们保存到数据库中。然后,我将显示用户保存的坐标。
我不知道如何让用户使用API v3在Google Map上绘制多边形,然后获取坐标。如果我能得到这些坐标,就可以很容易地将它们保存到数据库中。
http://gmaps-samples.googlecode.com/svn/trunk/poly/mymapstoolbar.html几乎就是一个确切的例子,但它使用的是API v2而不提供坐标。我想使用API v3并能够获得所有坐标。
是否有任何绘制多边形并使用API v3获取其坐标的示例?
答案 0 :(得分:13)
这里有上面的例子,使用API V3
答案 1 :(得分:13)
如果你需要的是这里的坐标是我喜欢使用的绘图工具 - 移动多边形或重新塑造它,坐标将显示在地图正下方: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;
}
答案 2 :(得分:9)
使用谷歌提供的getter而不是像某些人那样访问属性更干净/更安全
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(polygon) {
var coordinatesArray = polygon.overlay.getPath().getArray();
});
答案 3 :(得分:9)
嗯,不幸的是,如果一个人是匿名/未登录的话,似乎无法直接从maps.google.com放置自定义标记和绘制(并获取坐标)(如果我在几年前可能,如果我没记错的话) 。尽管如此,由于这里的答案,我设法组合了包含Google Places搜索的示例,并允许通过绘图库绘图,并在选择任何类型的形状(包括多边形的坐标)时转储坐标可以复制;代码在这里:
这就是它的样子:
(地方标记分别处理,可以通过DEL&#34;按钮&#34;通过搜索输入表单元素删除;&#34; curpos&#34;显示当前中心[位置]和缩放地图视口的级别。)
答案 4 :(得分:3)
要完成你想要的,你必须从多边形中获取路径。路径将是LatLng点的数组。你得到了数组的元素,并在下面的函数中用方法.lat和.lng分割了LatLng对,我有一个冗余数组,对应于标记多边形周围边界的折线。
储蓄是另一回事。然后你可以选择很多方法。您可以将您的点列表保存为csv格式的字符串并将其导出到文件(最简单的解决方案,到目前为止)。我强烈推荐GPS TXT格式,如GPS TRACKMAKER(伟大的免费版软件)可读的那些(有2个)。如果你有能力将它们保存到数据库中,这是一个很好的解决方案(我同时做两个,为了冗余)。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;
}
关注,以&#34;,1&#34;结尾的行。 (而不是&#34;,0&#34;)启动一个新的多边形(这种格式允许您在同一个文件中保存多个多边形)。我发现TXT比基于XML的格式GPX和KML更具人类可读性。
答案 5 :(得分:2)
其他答案显示您创建多边形,但不是如何获取坐标...
我不确定这样做的最好方法,但是只有一种方式..看起来应该有一种从多边形获取路径的方法,但我找不到一个,并且getPath()没有似乎对我有用。所以这是一个适合我的手动方法..
完成多边形绘制后,将多边形传递给叠加完成函数,可以在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循环遍历坐标列表,但是你可以进行循环。
答案 6 :(得分:1)
添加到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
});
答案 7 :(得分:1)
由于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')
});
答案 8 :(得分:0)
清理了chuycepeda所拥有的东西并将其放入textarea以便以表格形式寄回。
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);
});
答案 9 :(得分:0)
试试这个
在您的控制器中使用
> $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>