У меня проблема с созданием оверлея с полигоном, который содержит
несколько полилиний.
Я хочу создать многоугольник с вырезанными отверстиями для определенных стран (чтобы показать
какие области закрыты). Я делаю это, создавая полигон с несколькими
полилинии.
Первая полилиния была создана, чтобы покрыть всю видимую область карты.
Я начал с этого:
Чтобы обойти только охват одного региона-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