【问题标题】:Google maps polygon optimization谷歌地图多边形优化
【发布时间】:2011-07-15 00:17:02
【问题描述】:

我从某处提取了国家轮廓数据,并成功地将其转换为一组 lat-lng 坐标,我可以将其提供给 Google 地图 API 以绘制折线或多边形。

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

【问题讨论】:

  • 您需要这样做一次吗?您还使用任何可能具有空间扩展的数据库吗?
  • @Argiropoulos Stavros:只有一次。不涉及数据库;它只是一个 html/javascript 页面。如果数据库有帮助,那么我可以将数据导入 MySQL 5.1 数据库并执行您建议的任何操作。
  • 搜索“编码折线”。它会将您的 1200+ 点减少到 ~40 字节的字符串
  • Potrace 工作得很好,虽然我怀疑它不是你想要的地图数据。不过,Inkscape 在其 simplify 命令中很好地实现了 postrace。
  • 我正在寻找同样的东西,Simplify.js 效果很好。

标签: algorithm google-maps polygon


【解决方案1】:

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>

【讨论】:

  • 你应该尝试在你的答案中包含最核心的代码sn-ps,并解释为什么他们(或任何算法)解释了答案..
  • 感谢纳撒尼尔的建议。已编辑。
【解决方案2】:

我认为MapShaper可以在线完成

否则,实现一些algorithm

【讨论】:

  • 解释负分被认为是礼貌的;我提供了一个在线工具的链接,该工具可能会执行所要求的操作。
  • 可以从map shaper生成的“shp”文件中提取坐标信息吗?
  • 抱歉,当时没有时间做更多的事情,只能投反对票。解释是,提供一个工具(以及实现“某种算法”的模糊建议)作为解决似乎关于如何编程解决方案的问题似乎没有帮助。既然 OP 澄清说他不需要编写它,而只需编写一次,我将在系统允许后立即撤回反对票。
  • @Salman A,AFAIK,是的,您可以使用 shp2pgsql 将它们导入 PostGIS
  • 实施了“Douglas-Peucker 线简化算法”,将约 1200 点降低到 70。
【解决方案3】:

如果您可以安装我认为很容易的 postgis,因为它们提供了安装程序,那么您可以导入数据并执行 snaptogrid()st_simplify(),我在 mysql 中找不到等效项。如果您决定使用 postgis我建议这样做,因为它会帮助你走上这条路,我可以为你提供详细信息。

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

希望对你有帮助

【讨论】:

    【解决方案4】:

    我正在寻找完全相同的东西并找到Simplify.js。它完全符合您的要求,并且非常易于使用。您只需传入您的坐标,它就会删除所有多余的点。

    simplify(points, tolerance, highQuality)
    

    points 参数应包含一个坐标数组,格式为{x: 123, y: 123}。 (之后您可以将其转换回您想要的格式。)

    tolerance 应该是decimal degrees 中的精度。例如。 0.0001 11 米。增加这个数字将减小输出大小。

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

    【讨论】:

      【解决方案5】:

      很可能您想将点分成两半并想尝试我的 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 );
      } 
      

      【讨论】:

        【解决方案6】:

        我同意Unreason的回答,该网站支持GeoJson,我在我的网站中使用它,它减少了我的geoJson,但我认为你也需要这个world country geo Json

        【讨论】:

        • 只有链接的答案应该是 cmets
        • @NSNoob 是的,我想评论 Unreason,但我没有 50 个声望
        猜你喜欢
        • 2012-07-01
        • 1970-01-01
        • 2011-12-03
        • 2012-06-15
        • 1970-01-01
        • 2013-02-03
        • 2012-09-12
        • 2016-08-10
        相关资源
        最近更新 更多