Векторные плитки с Google Maps V3

У меня есть куча очень больших полигонов, которые я бы хотел наложить на свою карту Google. У меня есть сервер плитки, который обслуживает функции GeoJSON, а также заботится о различных геометрических операциях, которые мне необходимы, чтобы сделать работу приложения (объединение полигонов, упрощение до уровня масштабирования, черепица и т.д.).

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

Мои параметры выглядят как:

1) Слои данных: подключайтесь к различным событиям изменения карты, а затем добавляйте/удаляйте их с карты (где добавление будет извлекать соответствующий фрагмент). Трудность здесь заключалась в том, что, похоже, было много событий смены карты, и найти самый гладкий способ добиться успеха может принести значительные усилия. Кроме того, мне кажется, что я работаю против API данных здесь.

2) OverlayView: аналогично выше, но как абсолютный размер OverlayView (т.е. полное покрытие). Мысль будет заключаться в том, что наложение будет прослушивать события рисования, извлекать подходящую плитку и добавлять/очищать по мере необходимости. Кажется, это было бы более предсказуемым решением, но опять-таки там много.

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

Может ли кто-нибудь пролить свет? Как вы подходите к нему?

Ответ 1

То, как я столкнулся с идеей выборки данных с черепицей, - это использование overlayMapTypes. Вот рабочий пример.

Подобно любому объекту, реализующему интерфейс MapType, он ожидает, что вы определите метод getTile и, при необходимости, метод releaseTile.

Всякий раз, когда плитка входит в окно просмотра, этот тип объектов вызывает getTile, передавая ему координаты и масштабирование. Всякий раз, когда фрагмент выходит из окна просмотра, он вызывает releaseTile с элементом node, который он удаляет. Таким образом, используя связанный пример, вам просто нужно добавить слой данных в каждый фрагмент и удалить его при выпуске фрагмента:

Скажем, что ваш фрагмент, обслуживающий бэкэнд, отвечает на URL-адрес, например

'/mytiles/1048/1520/13';

Затем (заимствуя почти полный код для примера) вы объявите overlayMapType как

function CoordMapType() {
    this.tileSize = new google.maps.Size(256, 256);
}

CoordMapType.prototype.getTile = function (coord, zoom, ownerDocument) {
    var div = ownerDocument.createElement('div'),
        tileUrl = '/mytiles/' + coord.x + '/' + coord.y + '/' + zoom;

    div.innerHTML = coord;
    div.style.width = this.tileSize.width + 'px';
    div.style.height = this.tileSize.height + 'px';
    div.style.fontSize = '10';
    div.style.borderStyle = 'solid';
    div.style.borderWidth = '1px';
    div.style.borderColor = '#AAAAAA';

    div.dataLayer = new google.maps.Data();


    div.dataLayer.loadGeoJson(tileUrl,null, function() {
        div.dataLayer.setMap(map);
    });

    return div;
};

CoordMapType.prototype.releaseTile = function (tile) {
    if (tile.dataLayer) {
        tile.dataLayer.setMap(null);
    }
};


map.overlayMapTypes.insertAt(0, new CoordMapType());

Ответ 2

У меня есть только open-sourced вилка mapbox-gl-js, которая позволяет вам визуализировать векторные плитки на клиенте контролируемым образом, в частности это означает, что вы можете использовать векторные плитки поверх карты google.

Живая демонстрация здесь, а документация/код здесь

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

screenshot