2013-03-14 15 views
5

Mam pewne dane, które są zbierane przez urządzenie GPS zainstalowane w samochodzie. Więc dane, które mam, w zasadzie leżą na/wokół ulicy/drogi. Każda współrzędna ma jakąś wartość. Format danych jest podobny do tego.100k lub więcej znaczników na mapach google bez klastrowania

lat   | long  | value 
--------------------------------- 
12.979155 | 77.644925 | 6 
--------------------------------- 
12.97916833 | 77.64493667 | 2 
--------------------------------- 
12.97917167 | 77.64492167 | 8 

Moje zadanie polega na wykreśleniu tych długich na mapie google. Wydaje się dość łatwym zadaniem, gdy mówimy o umieszczeniu 10, 100 lub 1000 markerów. Ale jak już wspomniałem powyżej, zbieramy dane za pomocą napędu, a odległość między dwoma długimi lub dwoma punktami będzie w kilku krokach (na przykład 2-3 stopy).

Tak więc pod koniec badania będę miał 90-100 tysięcy lat dla małej części miasta i może wzrosnąć nawet o milion dla całego miasta.

Próbowałem dodać znacznik 9-10k i jego woking dobrze, ale kiedy próbuję załadować 40k, 50k, 60k robi to moją bardzo wolną przeglądarkę i jest to komunikat o błędzie kończę.

Uncaught RangeError: Maximum call stack size exceeded  main.js:1 

I zostały googling dużo o tym, ale ja nie jestem w stanie znaleźć żadnych przykład lub samouczek, który doprowadzi mnie do umieszczenia 1 mln znacznik za pomocą technologii Znam trochę. (Co jest asp.net). Znaleziono ten przykład http://www.scribblemaps.com/markerComplex/ Jonathana Wagnera, ale nie jestem w stanie go zrozumieć i wdrożyć w istniejącym kodzie, który wygląda tak.

// Pobieranie z serwera MSSQL z opóźnieniem.

function PushValues(ParameterID) { 
     a = ParameterID.slice(5); 
    var CityID = $('#ddlCity').val().split('|'); 
    $.ajax({ 
     type: "POST", 
     url: "index.aspx/PushLatLong", 
     data: "{CityID:'" + CityID[0] + "',OperatorID:'" + $('#ddlOperator').val() + "',ParameterID:'" + ParameterID.slice(4) + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, 
     cache: false, 
     success: function (response) { 
      GooglePlaces = response.d.split('#'); 
      if (GooglePlaces != "Blank") { 
       HasValues = 1; 
      } else { 
       HasValues = 0; 
      } 

     }, 
     Error: function (r) { 

     } 
    }); 
} 

// Umieszcza wartości w mapie google.

function PlaceValues() { 
    var options = { zoom: 3, center: new google.maps.LatLng(37.09, -95.71), mapTypeId: google.maps.MapTypeId.ROADMAP }; 
    var map = new google.maps.Map(document.getElementById('map'), options); 
    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < GooglePlaces.length; i = i + 2) { 
     ltlg = new google.maps.LatLng(GooglePlaces[i], GooglePlaces[i + 1]); 
     var marker = new google.maps.Marker({ 
      position: ltlg, 
      map: map, 
      title: 'Place number', 
      icon: "img/GoogleIcons/" + legendfirstvalue[1] 
     }); 
     bounds.extend(ltlg); 
    } 
    map.fitBounds(bounds) 
    $('#DivLoadImage').hide(); 
} 

Jeszcze jedno chciałbym wspomnieć o to, że kolor markera zależą od wartości łac długości. Więc będę miał wiele kolorowych znaczników. Mogłem z łatwością spróbować pokazać znacznik, ale wtedy nie będę w stanie zobaczyć koloru znacznika, dopóki nie zoon się w tym obszarze. Więc nie ma sposobu, abym mógł używać clustring.

Jestem pewien, że w moim kodzie będzie miliony błędów. W razie potrzeby chcę zmienić moje podejście. Here to wersja demonstracyjna aplikacji.

+0

http://coeindia.in/test/harry/index.html nie działa – Kiquenet

+0

To był adres URL mojej starej strony pracodawców. Mogli dokonać pewnych zmian w katalogach. – Ravi

Odpowiedz

1

Najbliżej można uzyskać (bez tworzenia klastrów) to używanie tablic fuzji do przechowywania danych i ich pobierania - prawdopodobnie jest to coś podobnego, czego twój przykład już używa - a ponieważ jego flash potrafi renderować znacznie szybciej niż normalnie api można osiągnąć.

Samo tabele fuzyjne renderują znaczniki po stronie serwera do kafelków i pobierają je.

Google Maps API pozwala na renderowanie danych zawartych w Google Fusion Tables jako warstwa na mapie przy pomocy obiektu FusionTablesLayer.

przykład o to in this link.

Wraz z fusiontables zrobiłbym coś takiego renderowania opartego rzutni, która w zasadzie oznacza rysunek tylko znaczniki widoczne na rzutni - Niezupełnie „technikę grupowania”, ale bardzo przydatne, gdy rozważamy szybkość renderowania.Przeczytaj więcej o nich google docs (fusiontables) i viewport marker management. Ta sama strona zawiera również bardziej szczegółowy link do Fusiontables api i samouczków.

Jeśli ostatecznie zdecydujesz się na klastrowanie po stronie serwera - przygotuj się, że nie jest to łatwe zadanie - ale jeśli to zrobisz, zaimplementuj coś podobnego do klastrowania opartego na sieci. (Wyjaśnione także withing tę samą stronę - cholernie dobre linki?)

Ponadto należy zauważyć, że:

Tylko pierwsze 100000 wiersze danych w tabeli są odwzorowane lub zawarte w wynikach zapytania.

Aby dowiedzieć się więcej, see from here.

Cheers.

+0

@Mauno V. Przeszedłem przez szczegóły wspomniane powyżej. Istnieje pewne ograniczenie z tabelą fuzji. Istnieją ograniczenia w pobieraniu i przesyłaniu danych oraz można przechowywać tylko 250 MB danych na użytkownika. Nie sądzę, jak na moje wymagania, To będzie właściwa opcja dla mnie. – Ravi

+0

Cóż, musi mieć pewne ograniczenia ofc. Ale przy odpowiednim projekcie może działać. Czy sprawdziłeś lub zapytałeś czy otrzymujesz więcej, jeśli kupisz go dla biznesu i zapłacisz gotówką? Wierzę, że Google musi również zarobić trochę pieniędzy, więc ustalili limity. :) –

0

Stół Fusion to sposób na uzyskanie dużych danych. Te tabele można przeglądać i odtwarzać przy użyciu GmapGIS.

Powiązane problemy