Visualisasi dataset besar dengan Leaflet

35

Saat menggunakan Leaflet untuk memvisualisasikan dataset besar (GeoJSON dengan 10.000 fitur poin), tidak mengherankan browser crash atau hang. Sub-sampel 1000 fitur dari dataset yang sama berfungsi dengan sempurna. Sayangnya saya tidak bisa membagikan dataset untuk dicoba oleh orang lain.

Adakah yang punya solusi yang lebih baik untuk memvisualisasikan kumpulan data sebesar itu? (tujuan utamanya adalah untuk mengecilkan ini menjadi 2 juta fitur) Saya bahkan bersedia mempertimbangkan kerangka visualisasi offline jika alternatif berbasis browser seperti Polymaps atau d3.js dll dianggap tidak mampu.

Sunting: Lupa untuk menyebutkan, pengguna harus dapat memfilter set data berdasarkan atribut. Jadi dari fitur N , hanya fitur pencocokan n <= N yang mungkin perlu dirender secara dinamis.

Aku marah
sumber
3
Diskusi serupa: gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien

Jawaban:

23

Saya penulis Leaflet. Ada plugin pengelompokan yang luar biasa untuk ini, Leaflet.markercluster . Ini sangat cepat dan efisien (lihat contoh marker 50k), terlihat dan bekerja dengan sangat lancar dengan animasi yang bagus, dan memiliki banyak pilihan yang sesuai dengan kebutuhan Anda.

Pengiring jenazah
sumber
3
PruneClusterTerlihat juga menjanjikan.
TLama
1
Saya ingin memperluas pertanyaan awal. Saya perlu melakukan sesuatu seperti ini: matall.in/posts/deep-insights-visualizing-1m-flight-routes Bagaimana saya bisa mengelompokkan jalur sebelum penanda?
guilhermecgs
16

Anda dapat menggunakan TileMill dan membuat poin sebagai gambar raster, dengan interaktivitas cepat dari UTFGrid . Ini berskala ke jutaan titik dan poligon, seperti peta sensus ini , karena secara cerdas hanya mengirimkan data yang dibutuhkan untuk area tertentu, tepat saat dibutuhkan.

Sejauh yang saya tahu, tidak ada metode cepat lain untuk melakukan ini selain memiliki server WFS yang sangat cepat, yang agak sulit untuk mempertahankan / skala ke banyak pemirsa.

Pengungkapan: berfungsi untuk MapBox , menulis sedikit kode. Tapi TileMill gratis / open source, dll.

tmcw
sumber
1
Saya lupa menyebutkan bahwa pengguna harus dapat memfilter set data berdasarkan atribut dan hanya menampilkan catatan yang cocok. Jadi katakanlah dari 10.000 catatan, hanya 500 yang benar-benar perlu dirender untuk kasus tertentu. Bisakah (atau bagaimana) saya melakukan ini dengan TileMill?
Imad
3
Nggak. Anda mungkin ingin mencoba CartoDB , tetapi Anda harus tahu bahwa membuat hal-hal menjadi dinamis dan membuat hal-hal menjadi pemain adalah tujuan yang berlawanan.
tmcw
1
tautan peta sensus sudah mati!
drho
Semua tautan adalah daed.
LeeGee
9

Sudahkah Anda melihat ke kluster leaflet? Posting blog oleh penulis menjelaskannya di sini

Opsi lain yang patut dilihat adalah menggunakan leaflet dalam kombinasi dengan GIS Cloud . Lihatlah demo ini untuk melihatnya menangani banyak geometri dengan sangat cepat. Sangat mengesankan. Saya sama sekali tidak berafiliasi dengan GISCloud.

Kelso
sumber
7

Anda seharusnya tidak pernah menampilkan jutaan titik pada peta. Bukan hanya karena masalah kinerja utama, tetapi juga dari sudut pandang pengguna karena bagi mereka tentu akan sulit untuk menafsirkan data ini. Gunakan beberapa cara pengumpulan data (pengelompokan, pengumpulan ke area poligon, dll.) Dikombinasikan dengan tipe tampilan yang berbeda pada tingkat zoom yang berbeda (mis. Tunjukkan data titik "mentah" hanya pada tingkat zoom yang sangat tinggi dan gunakan data teragregasi di tempat lain). Contohnya adalah situs real estat seperti zillow.com .

chriserik
sumber
8
Anda tidak boleh mengatakan "Anda tidak boleh". Penduduk Lokal & Turis adalah contoh hebat dari jenis wawasan yang dapat memvisualisasikan jutaan (atau milyaran dalam kasus ini) poin.
Joseph Sheedy
1
Setuju dengan @velotron, mis. Enam juta poin yang diberikan dengan indah dan cepat: mapbox.com/blog/supercluster
Max von Hippel
1
Ya, tetapi dalam kasus ini, titik-titik tersebut terkelompok juga (tergantung pada tingkat zoom), sehingga sangat mudah untuk menafsirkan dan memahami data.
chriserik
2
@ chriserik benar, jadi jawaban yang benar adalah "Anda harus menggunakan pengelompokan atau memanaskan peta jika Anda memiliki banyak poin, dan di sini adalah bagaimana melakukan itu ..."
Max von Hippel
3
Maksud saya adalah bahwa plot jutaan poin yang tidak terselesaikan dapat memberikan wawasan.
Joseph Sheedy
0

Saya sarankan Anda mengurangi jumlah fitur poin yang diberikan: Mata manusia tidak akan dapat melihat 10.000 poin, apalagi 2.000.000.

Yang bisa Anda coba adalah secara dinamis meminta dataset dari server khusus (yang harus Anda atur), mis

    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)
            );
        });
    }

Server Anda kemudian akan menghitung poin mana yang akan dikembalikan, tergantung pada apa yang ingin dilihat pengguna saat ini. Bergantung pada faktor pembesaran dan kliping, Anda hanya perlu mengembalikan persentase poin yang sangat kecil tanpa memperburuk pengalaman pengguna.

Kelemahan: Menyiapkan server (Anda harus menemukan perpustakaan untuk memfilter poin geo) & rendering lebih lambat (setelah setiap zoom atau seret, permintaan server perlu dibuat)

phil294
sumber
-5

Saya punya solusi untuk memetakan 50 hingga 100 juta catatan, Anda perlu menggunakan solusi sisi server untuk melakukan kisi dan berbasis dinamis. Anda tidak dapat membalas pada API peta web (Google, atau orang lain) untuk melakukan rendering sisi klien ....

[http://96.231.36.9:8080/rbgis/google_map.html[[1] coba tautan di atas dan lihat caranya

bdv_engine
sumber
2
Harap rentangkan jawaban Anda, sehingga akan sangat membantu bahkan ketika server Anda tidak dapat diakses.
lynxlynxlynx
Ya itu ironis. Karena tautan sisi server Anda tidak berfungsi.
Max von Hippel