Google Maps Flash - полигон с отверстиями, пересекающий меридиан - PullRequest
1 голос
/ 19 января 2011

У меня проблема с созданием оверлея с полигоном, который содержит несколько полилиний.

Я хочу создать многоугольник с вырезанными отверстиями для определенных стран (чтобы показать какие области закрыты). Я делаю это, создавая полигон с несколькими полилинии. Первая полилиния была создана, чтобы покрыть всю видимую область карты.

Я начал с этого:

Чтобы обойти только охват одного региона-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

1 Ответ

0 голосов
/ 07 мая 2011

Итак, вы пытаетесь создать большой многоугольник с вырезанными отверстиями для Австралии, Новой Зеландии, Гавайев, ...?Ваш код для добавления полилиний мне кажется неправильным.Я бы начал с большого квадрата:

 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 ° с.ш.?Я думаю, это сделает ваш внешний многоугольник более счастливым.

...