2015-11-08 18 views
6

Chcę utworzyć aplikację internetową, w której użytkownik wprowadza zestaw identyfikatorów, a na mapie pojawia się zestaw kropek powiązanych z tymi identyfikatorami.Zmiana skupiania znaczników według poziomu powiększenia w Shiny/Leaflet/R

Kłopot w tym, że dane te mogą być liczone od dziesiątek do setek tysięcy, a nawet milionów. Biorąc pod uwagę tę możliwość, chcę wziąć lekką lekcję. Poniżej znajduje się moje idealne zachowanie agregacji.

Przy niskich poziomach powiększenia chcę agregować te kropki do zliczeń według stanu (odpowiedni rozmiar/kolor symbolizacji oznaczający wyższą intensywność, z kropką wyśrodkowaną na centroidie stanu). przy nieco wyższych poziomach zoomu, rozdzielają się one na zliczenia za pomocą mniejszych wielokątów. przy jeszcze większym powiększeniu, a jeszcze mniejsze wielokąty. Kiedy, jeśli niezagregowane, liczba kropek na mapie będzie mniejsza niż ~ 500, to po prostu zaznacz kropki.

Te wielokąty zostały już rozstrzygnięte, a każda kropka ma w swoich danych identyfikator wieloboku dla każdego wielokąta, pod którym się znajduje.

Ponieważ kropki są losowo drukowane w obrębie odpowiednich wielokątów, faktyczne rozmieszczenie kropek w poligonach nie ma znaczenia. A raczej każda agregacja, która ignoruje, na którym poligonie zostały naniesione kropki, usunie informacje. Z tego powodu nie mogę używać znacznika (przynajmniej nie z opcjami, które widziałem). Jeśli istnieje łatwy sposób agregowania w sposób, w jaki szukam, proszę dać mi znać)

Z różnych powodów (I nie jestem programistą javascript, jestem programistą R) Pracuję w ramach pakietu ulotek w ramach R. Czy istnieje sposób, dzięki któremu mogę zmienić poziom agregacji w zależności od powiększenia w ten sposób?

Połączyłem zestaw danych zabawek zawierający stosunkowo niewielki podzbiór (1 encja, 3 stany, ~ 10k obserwacji) wraz z centroidami dla spisów ludności i powiatów dla tych stanów.

http://s000.tinyupload.com/index.php?file_id=00048836337627834343

+2

istnieje już opcja klastrowania przez zoom, jeśli użytkownik 'cluster = clusterOptions()'. Czy próbujesz zrobić coś więcej? – jenesaisquoi

+0

Tak ... Jak wyjaśniono w paragrafie 5, nie mogę używać istniejącego klastra przez powiększenie, ponieważ powoduje to wymazywanie/ignorowanie granic wielokąta. Który wielokąt, do którego wpadła konkretna kropka, to naprawdę wszystko, co ważne ...wymazywanie tych granic lub grupowanie kropek, które przypadkowo spadły w pobliżu każdego przypadkowo, jest niepożądanym zachowaniem. – Faydey

+0

Czy możesz dać zestaw danych zabawek z kilkoma punktami, abyśmy mogli się bawić? – NicE

Odpowiedz

1

To nie jest dokładnie odpowiedź, ale to raczej nie pasuje w komentarzu.

Czy chcesz wyświetlać zagregowane dane (liczby kropek/znaczników?) Na predefiniowanych obszarach geograficznych, przy scalaniu tych obszarów przy niższych poziomach powiększenia (powiedzmy, że mogą to być miasta, powiaty, stany itp.).

Nawet w JavaScript nie jestem świadomy żadnego gotowego rozwiązania dla tego przypadku użycia. Istnieje kilka możliwych sposobów obejścia tego problemu, ale nie jestem pewny, czy będą one łatwe do zrobienia w R.

Zwykle obejście polega na pozbyciu się klastra automatycznego i wygenerowaniu własnych znaczników na każdym poziomie powiększenia, z odpowiednimi danymi algorytm agregacji (niezbyt trudny do wykonania, ponieważ można polegać na identyfikatorze wieloboku rodzica). Następnie po prostu dodaj/usuń znaczniki podczas zmiany powiększenia.

Niestety oznacza to, że animacje i wyświetlanie pokrycia nie będą wyświetlane od MarkerCluster.

Możesz być także zainteresowany tym wątkiem [Question] Build clusters depending on some geographical entity #521 ze strony dotyczącej zagadnień związanych z Leaflet.markercluster na GitHub. Przypadek użycia jest w pewnym stopniu podobny i można zobaczyć kilka przykładów implementacji, ale niestety nie wyprowadzono go z żadnego ogólnego i niezawodnego rozwiązania.

+0

Dziękuję za twój wkład. Podobają mi się wyniki w ich linkach, ale nie jestem pewien, jak mogę to zaimplementować w R. Zgadzam się, że to trudny pomysł. Wpadłem na pomysł, że zrobię agregację przed dodaniem do mapy, na różnych poziomach agregacji, a następnie dodaję do mapy (w zależności od poziomu powiększenia) tylko te kropki, które są na mapie w tym momencie w czasie . (no, najlepiej, te na mapie + trochę otaczającego obszaru, a następnie przerysuj tylko wtedy, gdy granice mapy wychodzą poza otaczający obszar). Wciąż jednak nad tym pracuję. Występują dziwne błędy. – Faydey

Powiązane problemy