我有一系列纬度和经度,我将抓住这些集合,并希望根据它们绘制多边形。
数据集不是轮廓,因此需要一个算法来确定哪些数据组成了包含所有纬度和经度的多边形的轮廓。这个多边形需要是灵活的,因此如果点指示那么多边形可以是凹的。
任何帮助都将不胜感激。
**更新**
抱歉,应该提供更多细节。
下面的代码会产生一个看起来很可怕的多边形。正如我在第一篇文章中解释的那样,我想根据提供的latlng创建一个漂亮的凹面或凸面多边形。
只需要一种绘制外部标记的方法。
道歉,如果这仍然要求太多,但认为最后一次尝试是值得的。
function initialize() {
var myLatLng = new google.maps.LatLng(51.407431, -0.727142);
var myOptions = {
zoom: 12,
center: myLatLng,
mapTypeId: google.maps.MapTypeId.TERRAIN
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var bermudaTriangle;
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var triangleCoords = [
new google.maps.LatLng(51.392692, -0.740358),
new google.maps.LatLng(51.400618, -0.742469),
new google.maps.LatLng(51.40072, -0.72418),
new google.maps.LatLng(51.400732, -0.743817),
new google.maps.LatLng(51.401258, -0.743386),
new google.maps.LatLng(51.401264, -0.741445),
new google.maps.LatLng(51.401443, -0.725555),
new google.maps.LatLng(51.401463, -0.744042),
new google.maps.LatLng(51.402281, -0.739059)
];
var minX = triangleCoords[0].lat();
var maxX = triangleCoords[0].lat();
var minY = triangleCoords[0].lng();
var maxY = triangleCoords[0].lng();
for (var i = 1; i < triangleCoords.length; i++) {
if (triangleCoords[i].lat() < minX) minX = triangleCoords[i].lat();
if (triangleCoords[i].lat() > maxX) maxX = triangleCoords[i].lat();
if (triangleCoords[i].lng() < minY) minY = triangleCoords[i].lng();
if (triangleCoords[i].lng() > maxY) maxY = triangleCoords[i].lng();
}
// Construct the polygon
bermudaTriangle = new google.maps.Polygon({
paths: triangleCoords,
strokeColor: "#FF0000",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#FF0000",
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
}
答案 0 :(得分:0)
您的问题定义不够:如果您不添加“创建漂亮的凹面或凸面多边形”之外的约束,则使用给定的一组点,您可能会得到许多不同的多边形。
甚至一个简单的例子表明: 想象一个三角形ABC,让D成为这个三角形的中心,你对{A,B,C,D}点集的期望是什么?
现在如果你说'好D在中心,显然我们应该丢弃D',让D离AB段越来越近了。您何时决定最佳输出是ABC还是ADBCA?
因此,您必须添加约束才能构建算法,因为如果您不能自己决定上述{A,B,C,D}示例,计算机怎么办? :-)例如,如果你给AvgD调用点之间的平均距离,你可以添加约束,你的外部多边形的任何一段都不应该超过1.2 * AvgD(或者更好,Alpha * AvgD,你尝试不同的算法) α)。
为了解决您的问题,我首先使用经典的船体算法来获得外部凸多边形(这是确定性的),然后分解“太长”的段(使用您想要的约束)放置越来越多的内在点进入概述,直到所有约束都可以。类似于“挖洞”的凸多边形。
'分解'太长的片段也是你可以用完全不同的方式做的事情。一种可能是从段的中点搜索最近的非轮廓点。另一种方法是选择具有当前段的半径最小的点...现在您有了新点,将段拆分为两段,更新太段段的列表,并再次执行直到完成(或者直到你达到一个“令人满意的”平均长度太长的段,或......)
祝你好运!