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

Имам малък проблем тук.

Какво искам да направя.

На моя сървър имам таблица с маркери, които имат lat, lng, плочка полета в него. Има много маркери в таблицата, така че ги изисквам чрез плочки, които са видими за потребителя. Крайната ми цел е да го накарам да работи както трябва.

проблем

Исках да разреша това, като създам свой собствен 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
Съмнявам се, защото с полето 'tile id' трябва да повтаряте записи за всеки маркер за всяко ниво на увеличение. Масата ви става много по-голяма така. (Звучи като ефективност на Microsoft) :-) - person Marcelo; 29.10.2012
comment
Е, с идентификатор на плочки можете да проверите дали вече сте заредили маркери от плочка или не. И има само едно сравнение при избор от таблицата вместо две. И с още една колона int(15) вашата таблица няма да бъде много по-голяма. - person warmspringwinds; 29.10.2012
comment
Е, приложението е по ваш избор, но ми се струва напълно неефективно да имам 15 записа за всеки маркер, когато можете да имате само 1. Винаги се опитвам да нормализирам базите си данни към 3NF: en.wikipedia.org/wiki/Third_normal_form - 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, ще използвам изберете ... КАТО 10% . Така. - person warmspringwinds; 29.10.2012
comment
Клауза „like“ никога няма да бъде по-бърза от клауза „where“ с подходящите индекси. Но все пак успех. :-) - person Marcelo; 29.10.2012
comment
Да, прав си. Но можете да се отървете от LIKE, като използвате един труден метод с преобразуване в друга система за номериране. Така че е въпрос на избор. - person warmspringwinds; 29.10.2012