Может polygon.setPath ();использоваться, чтобы полностью переопределить полигон? - PullRequest
5 голосов
/ 10 мая 2011

Google Maps JavaScript API V3.

Мое отображение заставляет меня задуматься о многоугольниках, и я пытаюсь разработать стратегию, прежде чем углубиться в код.

I 'Я никогда не собираюсь иметь более одного полигона на карте за раз, поэтому я надеюсь, что смогу определить один полигон и повторно использовать его, как вы можете с маркерами.

Правильно ли мое понимание того, что полигоны setPath ();функция будет перемещать полигон для представления нового массива точек?В документации сказано: «Вставка или удаление LatLngs из MVCArray автоматически обновит многоугольник на карте».но это не выходит прямо и говорит, что вы можете использовать setPath ();чтобы дать ему совершенно новый массив точек.

Я думаю, в psuedocode ...

// some event fires
polygon.setPath(latlngArray);
bounds = new google.maps.LatLngBounds();
$.each(latlngArray, function(key, ll){
  bounds.extend(ll);
});
polygon.setMap(MyMap);
MyMap.fitBounds(bounds);

//a different event fires
polygon.setMap(null);
// build a new latlngArray
// do it again

Правильно ли я считаю, что я могу использовать один и тот же объект многоугольника в этом fasionИли мне нужно переосмыслить свою стратегию?

Спасибо.

Пропустить

РЕДАКТИРОВАТЬ: Ответ - да, это возможно.Я собираюсь лучше прояснить свой код и постараюсь дать хорошо написанный ответ, который показывает предостережения, с которыми я столкнулся.Например, карта должна быть видимой для map.fitBounds ();дать убедительные результаты.

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

Да, вполне возможно повторно использовать один и тот же объект многоугольника ...

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

Это то, что я узнал или выбрал для уточнения своего решения ...

Как было сказано ранее, карта не может быть style="display: none;" чтобы map.fitBounds(); работал должным образом.

Я уже держу контейнерный объект, который содержит мои маркеры.Я создал контейнерный объект для путей многоугольника и добавил атрибут 'polygon' к маркерам, которые связаны с многоугольником, чтобы несколько маркеров могли ссылаться на один и тот же путь многоугольника.

Даже для многоугольников с одним путем,Я решил встроить свой массив путей в другой массив, а затем использовать polygon.setPaths();. Таким образом, код будет легче масштабироваться, если я расширимся до многоугольников с несколькими путями.

При первоначальном анализе пути многоугольника создайте объект LatLngBounds,и затем сохраните его bounds.getSouthWest(); & bounds.getNorthEast(); вместе с путем.Это позволяет быстро и легко map.fitBounds(); во время отображения и не позволяет пересчитывать одни и те же границы несколько раз.

В любом случае, да, это, безусловно, возможно, и я думаю, что весьма эффективно повторно использовать один и тот же объект многоугольника с разнымипути.

Сан-Франциско и Окленд перерабатывают один и тот же объект многоугольника ... BayArea.png

Это все, что я получил!

Пропустить

ОБНОВЛЕНИЕ: Iнашел некоторые данные многоугольника с несколькими путями.Он подключен прямо.

2 голосов
/ 22 февраля 2012

Да, вы оба правы, полагая, что переопределение setPaths приведет к переопределению многоугольника, НО вы должны впоследствии установить setMap для перерисовки многоугольника.многоугольник может быть за пределами окна API, что не имеет значения.для простоты использования, после того, как «переназначено», так как многоугольник может находиться за пределами вашего окна просмотра, было бы целесообразно использовать USABILITY для переопределения центра окна, используя метод setCenter на карте.Этот код является фрагментом, который я удалил из приложения, которое позволяет пользователям рисовать ломаную линию и затем преобразовывать ее в многоугольник (поскольку пользователь может захотеть исправить периметр, я позволяю ему переходить назад и вперед между полилинией и многоугольником).я всегда использую один и тот же полигон и просто устанавливаю setPathSSSSSSSSS (в конце есть S для многоугольников):

function confirmClosePolyline() {
    var pathArrayTemp = areaPerimeterPath.getPath();
    var decision = confirm("Change POLYGON?");
    if (decision) {
        areaMapPolygon.setMap(null); //makes polygon "invisible"/ removes
        areaMapPolygon.setPaths(pathArrayTemp);
        areaMapPolygon.setMap(map);
    }
}
...