Координаты карты Google mapType

У меня тут небольшая проблема.

Что я хочу сделать.

На моем сервере у меня есть таблица с маркерами, которые имеют широту, длину, плитку поля в нем. В таблице много маркеров, поэтому я запрашиваю их тайлами, которые видны пользователю. Заставить его работать как надо — моя конечная цель.

Проблема

Я хотел решить эту проблему, создав собственный mapType и определите метод getTile(), который будет отвечать за запрос соответствующих тайлов с сервера, используя нотацию x/y/z, где x,y — координаты тайла, а z — уровень масштабирования. Подробнее об этом вы можете узнать здесь. Вот мой код (я использую плагин jquery-ui-map здесь):

function ServerFetchMapType() {

      this.tileSize = new google.maps.Size(256,256);
      this.maxZoom = 15;
      this.name = "Server Tile #s";
      this.alt  = "Server Data Tile Map Type";

      this.getTile = function(coord, zoom, ownerDocument){

        //Data for request
        var x = coord.x;
        var y = coord.y;
        var z = zoom;

        //Here i will make an ajax request for markers in this tile

        //Visualization
        var div = ownerDocument.createElement('DIV');
        div.innerHTML = 'X:' + coord.x + ' Y:' +  coord.y + ' Z:' +  zoom;
        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';
        return div;

      };

    }

    var test = new ServerFetchMapType();

    $('#map_canvas').gmap();
    $('#map_canvas').gmap('get', 'map').overlayMapTypes.insertAt(0, test);

Все работало, но потом обнаружил один недостаток, проиллюстрирую его:

введите здесь описание изображения

Как вы можете видеть, только 4 плитки в центре изображения имеют правильную нотацию x/y/z и, следовательно, все плитки, которые являются потомками этой плитки. Но я не смогу использовать другие плитки для получения данных с сервера.

Вопрос

Итак, что я могу сделать, чтобы изменить координаты других плиток, где карта просто повторяется, чтобы иметь те же координаты, что и основные плитки? Или вы можете предложить другой способ решения этой проблемы. Любая помощь будет оценена.


person warmspringwinds    schedule 29.10.2012    source источник


Ответы (2)


Один очень хороший человек помог мне решить эту проблему следующим образом:

     function ServerFetchMapType() {

      this.tileSize = new google.maps.Size(256,256);
      this.maxZoom = 15;
      this.name = "Server Tile #s";
      this.alt  = "Server Data Tile Map Type";

      this.getTile = function(coord, zoom, ownerDocument){

        var dim = Math.pow(2, zoom);

        //Data for request
        var x = Math.abs( coord.x ) % dim;
        var y = Math.abs( coord.y ) % dim;
        var z = zoom;



        //Visualization D
        var div = ownerDocument.createElement('DIV');        
        div.innerHTML = 'X:' + Math.abs( coord.x ) % dim  + ' Y:' +  Math.abs( coord.y ) % dim + ' Z:' +  zoom;

        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 = '#AAAAA9';
        return div;

      };

    }
person warmspringwinds    schedule 29.10.2012

Все плитки на снимке экрана имеют правильные номера, а не только центральная 4.

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

Select * from markersTable 
where lat >= tile_SW_Lat and lat <= tile_NE_Lat 
and lon >= tile_SW_lon and lon <= tile_NE_lon

Во всех случаях вы знаете, что значения tile(x,y) равны 0 или положительным целым числам. API позаботится об упаковке за вас.

person Marcelo    schedule 29.10.2012
comment
Спасибо за помощь. Но я думаю, что с tile id это будет немного быстрее. - person warmspringwinds; 29.10.2012
comment
Сомневаюсь, потому что с полем 'ID плитки' вам придется повторять записи для каждого маркера для каждого уровня масштабирования. Ваш стол становится намного больше. (Звучит как эффективность Microsoft) :-) - person Marcelo; 29.10.2012
comment
Что ж, с идентификатором плитки вы можете проверить, загрузили ли вы уже маркеры из плитки или нет. И только одно сравнение при выборе из таблицы вместо двух. И с еще одним столбцом int(15) ваша таблица не будет намного больше. - person warmspringwinds; 29.10.2012
comment
Ну, ваше приложение на ваше усмотрение, но мне кажется совершенно неэффективным иметь 15 записей для каждого маркера, когда у вас может быть только 1. Я всегда стараюсь нормализовать свои базы данных до 3NF: en.wikipedia.org/wiki/Третья_нормальная_форма - person Marcelo; 29.10.2012
comment
Подожди, что ты имеешь в виду под входом? Возможно, вы меня неправильно поняли. Например, используя этот метод нумерации плиток msdn. microsoft.com/en-us/library/bb259689.aspx с quadkeys вам понадобится только один запрос, подобный этому test.local/getMarkersByTileId/0001 будут выбраны все маркеры с идентификаторами тайлов, такими как 0001%. Одна запись. - person warmspringwinds; 29.10.2012
comment
Под «входом» я подразумеваю «запись» (или строку). Каждый маркер появляется снова на каждом уровне масштабирования, но под другим номером тайла, поэтому при вашем подходе нужно повторять запись для каждого маркера для каждого уровня масштабирования. С 15 уровнями масштабирования ваша таблица становится в 15 раз больше, чем должна быть (в 15 раз больше количества записей). - person Marcelo; 29.10.2012
comment
Ты неправильно меня понял. в моей таблице каждый маркер имеет только один идентификатор плитки, соответствующий плитке на максимальном уровне масштабирования. И когда запрашивается плитка на более высоком уровне: например, максимальный уровень 3 и запрошенный идентификатор плитки равен 10, я буду использовать select ... LIKE 10% . Вот так. - person warmspringwinds; 29.10.2012
comment
Предложение «как» никогда не будет быстрее, чем предложение «где» с соответствующими индексами. Но в любом случае удачи. :-) - person Marcelo; 29.10.2012
comment
Да ты прав. Но от LIKE можно избавиться, воспользовавшись одним хитрым приемом с переходом на другую систему счисления. Так что это вопрос выбора. - person warmspringwinds; 29.10.2012