2011-01-19 106 views
1

我在创建包含多条多边形的多边形覆盖图时出现问题,其中包含多条多段线。谷歌地图Flash - 带孔的多边形,穿越子午线

我想为某些国家创建带有孔的多边形(要显示 哪些区域是禁用的)。我通过创建具有多个 多义线的多边形来实现此目的。 第一条多段线创建为覆盖地图的整个可见区域。

我开始了与此:

为了解决只跨越一个区域一百八分之一百八十

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设置为“真”

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) 

问题在于子午线在地图视口中可见时。这个 问题更加明显,因为圆环孔多段线从可见视口跳到
到纬度长跨度的另一侧。

有时外阵列甚而不正确渲染,引起了甜甜圈 多边形(超过国家多边形,而不是 切口)essentialy反转

我意识到这是一个艰难的一个可视化。我已附加.as + .fla 文件以防万一任何人想要测试它。

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

回答

0

所以你试图做一个大多边形孔澳大利亚切出,新西兰,夏威夷,...?您添加多段线的代码对我来说似乎是错误的。我与大广场开始:

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); 

我已经与大量的多边形,以前横渡在谷歌地图半球和经络的工作,你不必与视口或缩放区域或类似的东西乱七八糟。只要您按自己认为的方式定义多边形,GM就会在任何边界矩形中正确绘制它(即使放大到目前为止多边形的边缘不可见)。

我看到的另一件事是,你要覆盖整个世界的巨型多边形是有点模棱两可的:例如90,-180和90,180是相同的点(北极),连接这些坐标的线将有0长度。墨卡托在杆子上做东西是有点用​​的。任何可能将其切断89°N?我认为这会让你的外部多边形更加快乐。