谷歌地图多边形优化

时间:2011-03-14 13:06:00

标签: algorithm google-maps polygon

我从某处提取了国家/地区大纲数据并成功设法将其转换为lat-lng坐标数组,我可以将其提供给Google maps API以绘制折线或多边形。

问题在于该形状中有大约1200个点。它在Google地图中完美呈现,但我需要将点数从1200减少到不到100.我不需要非常平滑的轮廓,我只需要扔掉我可以不用的点数。需要任何可以帮助我减少点数的算法或在线工具。

6 个答案:

答案 0 :(得分:7)

Bill Chadwick发现了这个简单的javascript。只需将LatLng输入数组并传入函数中的源参数Douglas Peucker line simplification routine

它将输出一个多边形点数的数组。

 var ArrayforPolygontoUse= GDouglasPeucker(theArrayofLatLng,2000) 
 var polygon=new google.maps.Polygon({ 

    path:ArrayforPolygontoUse,
    geodesic:true,
    strokeColor:"#0000FF",
    strokeOpacity:0.8,
    strokeWeight:2,
    fillColor:"#0000FF",
    fillOpacity:0.4,
    editable:true
  });

theArrayofLatLng是您使用google maps api收集的latlng数组。 2000年的价值是以米为单位的扭结。我的假设是,值越高,将删除更多的点作为输出。

对于真正的初学者: 确保在使用之前在html页面上声明js文件。 :)

<script type="text/javascript" src="js/GDouglasPeucker.js"></script>

答案 1 :(得分:4)

我认为MapShaper可以在线完成此操作

否则,实施一些algorithm

答案 2 :(得分:1)

如果您可以安装我认为很容易的postgis,因为他们提供了安装程序,那么您可以导入数据并执行snaptogrid()st_simplify(),我无法在mysql中找到相应的内容。如果您决定与postgis一起推荐,因为它可以帮助你在路上我可以为你提供详细信息。

现在,对于一个简单的自定义解决方案,您可以通过剪切或舍入一些最后一个数字的坐标来缩小尺寸,然后合并相同的坐标,实际上是一个简单的snaptogrid()。

希望有所帮助

答案 3 :(得分:0)

很可能你想把这些点分成两半,并想尝试我的Javascript函数:

function shortenAndShow ( polyline, color ) {
  var dist = 0, copyPoints = Array ( );
  for ( var n = 0, var end = polyline.getVertexCount ( ) - 1; n < end ; n++ ) {
    dist += polyline.getVertex ( n ).distanceFrom ( polyline.getVertex ( n +1 ) );
    copyPoints.push ( polyline.getVertex (n) );
   }
   var lastPoint = copyPoints [copyPoints.length-1];
   var newLine = new GPolyline (copyPoints, color, 2, 1);
   gmap2.addOverlay ( newLine );
} 

答案 4 :(得分:0)

我同意Unreason的anwser,网站支持GeoJson,我在我的网站上使用它,它减少了我的geoJson,但我认为你还需要这个world country geo Json

答案 5 :(得分:0)

我一直在寻找相同的东西,却发现Simplify.js。它完全可以满足您的需求,并且易于使用。您只需传递您的坐标,它将删除所有多余的点。

@RequestMapping(value = "/SaveData", method = RequestMethod.POST)
public @ResponseBody String saveData(@RequestBody String value,@Valid @RequestBody EmployeeData emp, BindingResult result) {
System.out.println(" Creating!!!");
//logic here
}

simplify(points, tolerance, highQuality) 参数应包含格式为points的坐标数组。 (之后,您可以将其转换回所需的格式。)

{x: 123, y: 123}应该是decimal degrees中的精度。例如。 tolerance达11米。增加此数字将减小输出大小。

如果您不介意等待几毫秒,请将0.0001设置为highQuality以获得更好的结果。