我从某个地方提取了国家轮廓数据,并成功将其转换为经纬度坐标的数组,可以将其输入Google地图API以绘制折线或多边形。
问题是该形状中有约1200个点。虽然在Google地图上渲染得非常完美,但我需要将点的数量从1200个减少到不到100个。我不需要非常平滑的轮廓,只需放弃一些可有可无的点即可。需要任何算法或在线工具来帮助我减少点的数量。
我从某个地方提取了国家轮廓数据,并成功将其转换为经纬度坐标的数组,可以将其输入Google地图API以绘制折线或多边形。
问题是该形状中有约1200个点。虽然在Google地图上渲染得非常完美,但我需要将点的数量从1200个减少到不到100个。我不需要非常平滑的轮廓,只需放弃一些可有可无的点即可。需要任何算法或在线工具来帮助我减少点的数量。
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是以米为单位的kink值。我的假设是,该值越高,则输出时将删除更多点。
对于真正的初学者: 在使用之前,请确保在HTML页面上声明JS文件。 :)
<script type="text/javascript" src="js/GDouglasPeucker.js"></script>
我也在寻找同样的东西,发现了Simplify.js。它可以完全满足你的需求,并且非常易于使用。你只需要传入你的坐标,它就会删除所有多余的点。
simplify(points, tolerance, highQuality)
points
参数应包含格式为{x: 123, y: 123}
的坐标数组。(之后您可以将其转换回所需的格式。)
tolerance
应该是十进制度数的精度。例如,11米的0.0001
。增加此数字将减小输出大小。highQuality
设置为true
以获得更好的结果。如果您可以安装PostGIS,我认为这很容易,因为他们提供了一个安装程序,那么您就可以导入数据并执行snaptogrid()或st_simplify(),而在MySQL中我找不到相应的功能。如果您决定使用PostGIS,我建议这样做,因为它将帮助您解决未来的问题,我可以为您提供详细信息。
现在,对于一个简单的自定义解决方案,您可以通过截取或舍入坐标的一些最后数字来减小大小,然后合并相同的坐标,实际上会得到一个简单的snaptogrid()。
希望能帮到您。
很可能你想把点分成两半并尝试我的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 );
}
我同意Unreason的答案,该网站支持GeoJson格式。我在我的网站上使用了它,并且它减少了我的geoJson文件大小,但我认为你也需要这个世界国家GeoJson。