【问题标题】:Google Maps Flash - Polygon with Holes, Crossing the meridianGoogle Maps Flash - 带孔的多边形,穿过子午线
【发布时间】:2011-06-11 23:21:06
【问题描述】:

我在使用包含以下内容的多边形创建叠加层时遇到问题 多段线。

我想为某些国家创建一个带有孔洞的多边形(以显示 哪些区域是禁区)。我通过创建一个具有多个的多边形来做到这一点 折线。 创建第一条折线以覆盖地图的整个可见区域。

我从这个开始:

只跨越一个区域-180/180

    var outer:Array = [ new LatLng(90, -180),
                        new LatLng(90, 180),
                        new LatLng(-90, 180),
                        new LatLng(-90, -180),
                        new LatLng(90, -180)]

    donut = new Polygon([],
                                        new PolygonOptions({
                                            strokeStyle: new StrokeStyle({
                                                thickness: 0}),
                                            fillStyle: new FillStyle({
                                                color: 0x000000,
                                                alpha: 0.5})
                                            }));

    donut.setPolyline(0, outer)
    map.addOverlay(donut);    

显然,这有一个问题,即只跨越很多纬度/经度。什么时候 缩小,这不起作用。为了解决这个问题,我尝试获得界限 地图,toSpan() 和 getNorth(),getSouth() 等等。这些没有返回 可见地图的真实跨度 - 在 180/360 时达到最大值。

我的解决方案是使用 fromViewportToLatLng() 的像素点 映射,并将 opt_nowrap 设置为 'true'

    var pnw:LatLng = map.fromViewportToLatLng(new Point(0, 0), true)
    var pse:LatLng = map.fromViewportToLatLng(new Point(map.width, map.height),
    true)

这产生了类似的结果

    Lat Lng North West (89.77386689378173, -614.3294000000001)
    LatLng South East  (-89.07253945829217, 370.0455999999999)

然后我可以从这里正确设置折线(在地图移动和缩放时 事件)覆盖整个地图,无论有多少经度跨度 发生:

    outer = [
             new LatLng(pnw.lat(), pnw.lng(), true),
             new LatLng(pnw.lat(), pse.lng(), true),
             new LatLng(pse.lat(), pse.lng(), true),
             new LatLng(pse.lat(), pnw.lng(), true),    
             new LatLng(pnw.lat(), pnw.lng(), true)    
            ]
    donut.setPolyline(0, outer)

*到目前为止一切顺利。 * 现在,我想将甜甜圈孔添加到我的多边形中,再次添加折线 甜甜圈多边形。

    private var australia:Array    = [
                                      new LatLng(-9.7716, 143.0241),
                                      new LatLng(-23.4610, 158.1852),
                                      new LatLng(-45.1338, 147.1549),
                                      new LatLng(-35.2615, 111.5153),
                                      new LatLng(-20.6921, 113.0094),
                                      new LatLng(-10.0746, 130.3239),
                                      new LatLng(-9.7716, 143.0241)
                                     ]

    private var nz:Array    = [
                               new LatLng(-33.5951, 165.8254),
                               new LatLng(-33.5951, 179.7341),
                               new LatLng(-48.3845, 179.7341),
                               new LatLng(-48.3845, 165.8254),
                               new LatLng(-33.5951, 165.8254)
                              ]                

    private var hawaii:Array    = [            
                                   new LatLng(21.8000, -160.4347),
                                   new LatLng(22.5477, -159.7975),
                                   new LatLng(21.4067, -156.3533),
                                   new LatLng(19.5336, -154.4197),
                                   new LatLng(18.6511, -155.6392),
                                   new LatLng(20.6633, -157.8639),
                                   new LatLng(21.8000, -160.4347)    
                                   ]

    donut.setPolyline(1, hawaii)
    donut.setPolyline(2, nz)
    donut.setPolyline(3, australia)

问题在于子午线在地图视口中可见时。这 放大时问题更加明显,因为甜甜圈孔折线跳跃
从可见视口到纬度长跨度的另一侧。

有时外部数组甚至无法正确渲染,导致甜甜圈 多边形本质上反转(国家上的多边形,而不是 剪纸)

我意识到这很难想象。我附上了 .as + .fla 文件以防万一有人想测试它。

http://www.digital.leskiwis.com/maps/MapTest.zip

【问题讨论】:

    标签: actionscript-3 google-maps google-maps-api-3 polygon


    【解决方案1】:

    所以你想为澳大利亚、新西兰、夏威夷……制作一个带有洞的大多边形?您添加折线的代码对我来说似乎是错误的。我将从大广场开始:

     var outer:Array = [ new LatLng(90, -180),
                            new LatLng(90, 180),
                            new LatLng(-90, 180),
                            new LatLng(-90, -180),
                            new LatLng(90, -180)]
    
        donut = new Polygon([outer],
        new PolygonOptions({
       strokeStyle: new StrokeStyle({
          thickness: 0}),
          fillStyle: new FillStyle({
          color: 0x000000,
          alpha: 0.5})
    }));
    

    然后添加你的洞

    //define au, nz, hi
    //...
    
    //the 0th polyline is already the outer edge...
    donut.setPolyline(1, hi);
    donut.setPolyline(2, nz);
    donut.setPolyline(3, au);
    

    现在你的甜甜圈是一个有 3 个孔的大矩形。 然后将其添加到地图中:

    map.addOverlay(donut);
    

    我之前在 Google 地图中处理过许多跨越半球和子午线的多边形,您不必弄乱视口或缩放区域或类似的东西。只要您按照您认为的方式定义多边形,GM 就会在任何边界矩形中正确绘制它(即使您放大到看不到多边形的边缘)。

    我看到的另一件事是,您为覆盖整个世界而制作的巨型多边形有点模棱两可:例如 90,-180 和 90,180 是同一个点(北极),连接这些坐标的线会长度为 0。在两极做事在墨卡托有点效果。是否有可能将其从 89° N 切断?我认为这会让你的外部多边形更快乐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多