Leaflet ile büyük veri kümelerini görselleştirme


35

Büyük bir veri kümesini görselleştirmek için Leaflet kullanırken (10.000 nokta özellikli GeoJSON), tarayıcı şaşırtıcı şekilde çökmez veya kilitlenmez. Aynı veri kümesinden 1000 özelliğin alt örneği kusursuz çalışıyor. Ne yazık ki, denemek için başkalarının veri kümesini paylaşamıyorum.

Bu büyük veri setlerini görselleştirmek için daha iyi çözümleri olan var mı? (nihai amaç bunu 2 milyon özelliğe ölçeklendirmektir) Polymaps veya d3.js gibi tarayıcı tabanlı alternatiflerin yetersiz kalması durumunda çevrimdışı görselleştirme çerçevelerini bile düşünmeye hazırım .

Düzenleme: Bahsetmeyi unuttum, kullanıcının veri kümesini özelliklere göre filtreleyebilmesi gerekiyor. Bu nedenle N özelliklerinin dışında, yalnızca eşleşen n <= N özelliklerinin dinamik olarak oluşturulması gerekebilir.


3
Benzer tartışmalar: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien

Yanıtlar:


23

Ben broşür yazarıyım. Bunun için harika bir küme eklentisi var, Leaflet.markercluster . Çok hızlı ve verimli (50k marker örneğine bir göz atın), hoş animasyonlarla şık bir görünüme kavuşur ve çalışır ve ihtiyaçlarınıza uygun çok sayıda seçeneğe sahiptir.


3
Ayrıca PruneClusterumut verici görünüyor.
TLama

1
Orijinal soruyu genişletmek istiyorum. Böyle bir şey yapmam gerekiyor: matall.in/posts/deep-insights-visualizing-1m-flight-routes İşaretleri yerine yolları nasıl kümelendirebilirim?
guilhermecgs

16

UTileGill'den hızlı etkileşim ile TileMill'i kullanabilir ve noktaları raster görüntüler olarak oluşturabilirsiniz . Bu nüfus sayımı haritası gibi milyonlarca nokta ve poligona ölçeklenir , çünkü tam olarak ihtiyaç duyulduğunda sadece belirli alanlar için ihtiyaç duyulan verileri akıllıca gönderir.

Bildiğim kadarıyla, bunu yapmak için çok hızlı bir WFS sunucusuna sahip olmaktan başka bir hızlı yöntem de yok; bu, birçok izleyicinin bakımını yapmak / ölçeklendirmek oldukça zor.

Açıklama: MapBox için çalışmak , biraz kod yazdı. Ancak TileMill ücretsiz / açık kaynaktır, vb.


1
Kullanıcının veri kümesini niteliklere göre filtreleyebilmesi ve yalnızca eşleşen kayıtları gösterebilmesi gerektiğini söylemeyi unuttum. Öyleyse, 10,000 kayıttan diyelim ki, verilen dava için sadece 500'ün yapılması gerekebilir. Bunu TileMill ile yapabilir miyim (veya nasıl yapardım)?
İmad

3
Hayır! CartoDB'yi denemek isteyebilirsiniz , ancak işleri dinamik yapmanın ve performans göstermenin hedeflere aykırı olduğunu bilmelisiniz.
tmcw

1
nüfus sayımı haritası bağlantısı öldü!
drho

Tüm linkler aittir.
LeeGee

9

Broşür kümesine baktınız mı? Yazara ait bir blog yazısı burada açıklanmaktadır.

Bakılmaya değer başka bir seçenek, broşürü GIS Cloud ile birlikte kullanmak olabilir . Çok sayıda geometriyi çok hızlı ele aldığını görmek için bu gösterime bir göz atın . Çok etkileyici. Hiçbir şekilde GISCloud'a bağlı değilim.


7

Bir haritada asla milyonlarca nokta göstermemelisiniz. Sadece ana performans problemlerinden dolayı değil, aynı zamanda kullanıcının bakış açısından da bu verinin yorumlanması kesinlikle zor olacaktır. Farklı yakınlaştırma seviyelerinde farklı ekran türleriyle birleştirilmiş verileri toplama (kümeleme, çokgen alanlarına toplanma vb.) Kullanın (örn. "Ham" nokta verilerini yalnızca çok yüksek yakınlaştırma düzeylerinde göster ve başka her yerde toplanmış verileri kullanın). Bir örnek, zillow.com gibi bir emlak sitesi olabilir .


8
Asla "asla yapmamalısın" dememelisin. Yerliler ve Turistler , milyonlarca (veya bu durumda milyarlarca) noktayı görselleştirmenin gösterebileceği bir tür kavrayış örneğidir.
Joseph Sheedy

1
W / @velotron Kabul, örneğin güzel ve hızlı bir şekilde render edilmiş altı milyon puan: mapbox.com/blog/supercluster
Max von Hippel

1
Evet, ancak bu durumda bu noktalar da kümelenir (yakınlaştırma seviyesine bağlı olarak), verilerin yorumlanması ve anlaşılması çok kolaydır.
chriserik

2
@chriserik hakkı, bu yüzden doğru cevap, “eğer o kadar çok noktaya sahipseniz kümeleme ya da ısı haritaları kullanmalısınız, ve işte bunu nasıl yapacağınız…”
Max von Hippel

3
Demek istediğim, kümelenmemiş milyonlarca noktanın kavrayışı içgörü sağlayabilir.
Joseph Sheedy,

0

Belirlenen puan özellikleri miktarını azaltmanızı öneriyorum: İnsan gözü 10.000 puan göremez, 2.000.000 konuşmaz.

Deneyebileceğiniz, dinamik bir şekilde veri kümesini özel bir sunucudan (ayarlamak zorunda olduğunuz) istemek.

    map = ...
    map.on('moveend', function(e) {
        getGeoJson(e);
    });
    map.on('zoomend', function(e) {
        getGeoJson(e);
    });
    map.setView([2,3], 2);

    function getGeoJson(event) {
        // todo determine current viewport
        $http.get('someGeoJsonDataProvider.someLanguage?currentView=[lat0,lon0,lat1,lon1]').then(function (resp) {
            // todo clear layers
            // new layer
            map.addLayer(
                L.geoJson(resp.data)
            );
        });
    }

Sunucunuz daha sonra, kullanıcının şu anda ne görmek istediğine bağlı olarak hangi noktaların döneceğini hesaplar. Yakınlaştırma faktörüne ve kırpmaya bağlı olarak, kullanıcı deneyimini kötüleştirmeden yalnızca çok küçük bir puan yüzdesi döndürmeniz gerekir.

Dezavantajları: Bir sunucu kurmak (coğrafi noktaları filtrelemek için kütüphaneler bulmalısınız) ve daha yavaş renderleme (her zoom veya sürüklemeden sonra, bir sunucu isteği yapılması gerekir)


-5

50 ila 100 milyon kaydı eşleştirmek için çözümlerim vardı; ızgara ve dinamik tabanlı yapmak için sunucu tarafı çözümleri kullanmanız gerekir. Müşteri tarafı oluşturma işlemini yapmak için web haritası API'lerinde (Google veya başkaları) yanıt veremezsiniz.

[http://96.231.36.9:8080/rbgis/google_map.html.INb1] yukarıdaki bağlantıları deneyin ve nasıl yapıldığını görün


2
Lütfen cevabınızı genişletin, böylece sunucunuz erişilemez olsa bile yardımcı olacaktır.
lynxlynxlynx

Evet bu ironik. Sunucu tarafı bağlantınız çalışmadığından.
Max von Hippel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.