2012-04-18 18 views
6

Używam Bing Maps z Ajaxem i mam około 80 000 lokalizacji, do których można wrzucić pinezki. Celem tej funkcji jest umożliwienie użytkownikowi wyszukania restauracji w Luizjanie i kliknięcie pinezki, aby wyświetlić informacje na temat inspekcji sanitarnej.Jak obsługiwać dużą liczbę pinezek w Bing Maps

Oczywiście nie jest zbyt dobrze mieć 80 000 szpilek na raz, ale staram się znaleźć najlepsze rozwiązanie tego problemu. Innym problemem jest to, że odległość między tymi lokalizacjami jest bardzo mała (wszystkie 80 000 znajduje się w Luizjanie). Wiem, że mogłem użyć klastrowania, aby nie zaśmiecać mapy, ale wydaje się, że to nadal powodowałoby problemy z wydajnością.

Co obecnie próbuję zrobić, to po prostu nie pokazywać żadnych pinezek, aż do pewnego poziomu powiększenia, a następnie pokazać tylko piny w bieżącym widoku. Sposób, w jaki obecnie próbuję to zrobić, polega na użyciu zdarzenia viewchangeend w celu znalezienia poziomu powiększenia i granic mapy, a następnie wysłania zapytania do bazy danych (za pośrednictwem usługi internetowej) dla dowolnego punktu w tym zakresie.

Czuję, że podążam tą drogą w niewłaściwy sposób. Czy istnieje lepszy sposób zarządzania tak dużą ilością danych? Czy byłoby lepiej, aby załadować wszystkie punkty na początku, a następnie mieć dane na wyciągnięcie ręki, bez konieczności uderzania w moją usługę internetową za każdym razem, gdy mapa porusza się. Jeśli tak, to jak bym to zrobił?

Nie byłem w stanie znaleźć odpowiedzi na moje pytania, co zwykle oznacza, że ​​zadaję niewłaściwe pytania. Jeśli ktokolwiek mógłby mi pomóc w znalezieniu właściwego pytania, byłoby to bardzo cenne.

+0

Jeśli próbujesz wizualizować wiele punktów danych, być może pinezki nie są najlepszym sposobem na zrobienie tego. Czy myślałeś o użyciu mapy termicznej? –

+0

Dzięki za komentarz! Nie myślałem o tym, ale po sprawdzeniu tego nie sądzę, że będzie to działało w moim scenariuszu, ponieważ użytkownicy muszą mieć możliwość wybrania pojedynczej lokalizacji i przejścia na stronę z informacjami o tej lokalizacji. Zmienię moje pytanie, aby było to bardziej jasne. – Justin

Odpowiedz

9

Cóż, wprowadziłem nieco inne podejście do tego. To było tylko zabawne ćwiczenie, ale wyświetlam wszystkie moje dane (około 140 000 punktów) w Mapach Bing przy użyciu płótna HTML5.

Poprzednio wczytałem wszystkie dane do klienta. Następnie zoptymalizowałem proces rysowania tak bardzo, że przyłączyłem go do zdarzenia "Viewchange" (które strzela cały czas podczas procesu zmiany widoku).

Blogowałem o tym. Możesz to sprawdzić here.

Mój przykład nie ma interakcji, ale można go łatwo zrobić (powinien to być miły temat na blogu). W ten sposób będziesz musiał obsługiwać zdarzenia ręcznie i wyszukiwać odpowiednie punkty samodzielnie lub, jeśli ilość punktów do narysowania i/lub poziom powiększenia był poniżej pewnego progu, pokaż zwykłe pinezki.


Zresztą inna opcja, jeśli nie jesteś ograniczony do Bing Maps, jest użycie pokroju Leaflet. Umożliwia utworzenie warstwy Canvas, która jest warstwą opartą na kafelkach, ale renderowaną po stronie klienta przy użyciu obszaru roboczego HTML5. Otwiera nowy zakres możliwości. Sprawdź na przykład this mapę w GisCloud.


Jeszcze inna opcja, choć bardziej odpowiednia dla danych statycznych, wykorzystuje technikę zwaną UTFGrid. Chłopcy, którzy go rozwinęli, mogą z pewnością lepiej niż ja, ale skalują się na tyle punktów, ile zechcesz, z fenomenalną wydajnością. Polega ona na posiadaniu warstwy kafli z twoimi informacjami i towarzyszącego pliku json z czymś w rodzaju pliku "ascii-art" opisującego cechy płytek. Następnie, korzystając z biblioteki o nazwie wax, zapewnia ona pełne zdarzenia po kliknięciu myszką, bez żadnego wpływu na wydajność.

Mam również o tym blogged.

+0

Ciekawa koncepcja, faktycznie zrobiłem coś bardzo podobnego do aplikacji mapowania dachu, gdzie płótno służy do wyświetlania szczegółowych wymiarów (długość linii, kąty itp.) Na górze mapy. Jednak problem z tym podejściem polega na tym, że element canvas otrzymuje teraz wszystkie zdarzenia wskaźnika, które były używane na mapie. Brak standardowej właściwości css wskaźnik-zdarzenia: żaden nie może tego rozwiązać, ale nie jest obsługiwany w niektórych przeglądarkach, szczególnie w IE. Próba przechodzenia przez zdarzenia ręcznie w javascriptu wydaje się po prostu chaotyczna. Chciałbym wiedzieć, czy znasz sposób na rozwiązanie tego problemu. –

+0

Właściwie wydarzenia trafiają bezpośrednio na mapę. Widziałeś film, który pokazałem? Wszystkie powiększenia i panoramy są obsługiwane bezpośrednio przez Bing Maps. – psousa

+0

Ahh Widzę, co robisz. Wstawiłeś płótno do samego div mapy, a ja po prostu umieściłem go na wierzchu div mapy. Jednak nawet przy twoim podejściu płótno nadal będzie na wierzchu innych elementów mapy, takich jak pinezki, które można później dodać. Przypuszczam, że można zrobić coś sprytnego, np. Próbować wstawić płótno na kafelki mapy, ale poniżej innych elementów mapy, takich jak pinezki lub kształty, ale brzmi to jak ból, który należy poprawnie wprowadzić. W każdym razie +1;) –

3

Myślę, że tworzenie klastrów byłoby najlepszym wyjściem, jeśli można uciec z jego użyciem. Mówisz, że próbowałeś używać klastrowania, ale nadal powodował problemy z wydajnością? Poszedłem przetestować go z 80000 punktów danych na V7 Interactive SDK i wydaje się, że działa dobrze. Przetestować samemu wchodząc na link i zmienić linię w zakładce Load module - clustering:

TestDataGenerator.GenerateData(100,dataCallback); 

do

TestDataGenerator.GenerateData(80000,dataCallback); 

następnie naciśnij przycisk Run. Wydajność wydaje mi się możliwa do przyjęcia z tak wieloma punktami danych.

+0

Szczerze mówiąc, nie przetestowałem tego. Nie chodziło mi tylko o wykonanie rysunku na mapie, ale także o uderzenie w serwis internetowy i ładowanie z bazy danych. Myślałem, że podchodzę do problemu w niewłaściwy sposób, ale to może faktycznie zadziałać. Dzięki za pomoc! (Jestem tu nowy i nie mam jeszcze 15 punktów reputacji, więc nie mogę dać +1 Twojej odpowiedzi ... Przepraszam). – Justin