Leaflet으로 대용량 데이터 세트 시각화


35

Leaflet을 사용하여 대용량 데이터 세트 (1 만 포인트 기능이있는 GeoJSON)를 시각화 할 때 당연히 브라우저가 충돌하거나 중단되는 것은 아닙니다. 동일한 데이터 세트에서 1000 개의 기능으로 구성된 하위 샘플은 완벽하게 작동합니다. 불행히도 다른 사람들이 시도 할 수있는 데이터 세트를 공유 할 수 없습니다.

그런 큰 데이터 세트를 시각화하는 더 나은 솔루션이 있습니까? (궁극적 인 목표는이 기능을 2 백만 개 기능으로 확장하는 것입니다.) Polymaps 또는 d3.js 등과 같은 브라우저 기반 대안 이 불가능한 경우 오프라인 시각화 프레임 워크를 고려하고 싶습니다 .

편집 : 언급하지 않았으므로 사용자는 속성별로 데이터 세트를 필터링 할 수 있어야합니다. 따라서 N 개의 피쳐 중에서 일치하는 n <= N 개의 피쳐 만 동적으로 렌더링해야합니다.


3
비슷한 토론 : gis.stackexchange.com/questions/4096/ gis.stackexchange.com/questions/14882 gis.stackexchange.com/questions/6954
julien

답변:


23

저는 Leaflet의 저자입니다. 이에 대한 멋진 클러스터링 플러그인 인 Leaflet.markercluster가 있습니다. 매우 빠르고 효율적이며 (예 : 50k 마커를 살펴보십시오) 멋진 애니메이션으로 매우 매끄럽게 보이고 작동하며 사용자 요구에 맞는 옵션이 많이 있습니다.


3
또한 PruneCluster유망 해 보인다.
TLama

1
원래 질문을 확장하고 싶습니다. matall.in/posts/deep-insights-visualizing-1m-flight-routes 이와 같은 작업을 수행해야합니다. 마커가 들어있는 경로를 어떻게 클러스터링 할 수 있습니까?
guilhermecgs

16

당신은 사용할 수 있습니다 TileMill을 과에서 빠른 대화 형 래스터 이미지로 포인트를 렌더링 UTFGrid . 이 인구 조사 맵 과 같이 수백만 개의 점과 다각형으로 확장됩니다 . 정확히 필요할 때 특정 영역에 필요한 데이터 만 지능적으로 전송하기 때문입니다.

내가 아는 한, 매우 빠른 WFS 서버를 사용하는 것 외에 다른 시청자에게 유지 관리 / 확장하기 어려운 다른 빠른 방법은 없습니다.

공개 : MapBox 작업 은 꽤 많은 코드를 작성했습니다. 그러나 TileMill은 무료 / 오픈 소스 등입니다.


1
사용자가 속성별로 데이터 세트를 필터링하고 일치하는 레코드 만 표시 할 수 있어야한다는 점을 잊었습니다. 따라서 10,000 개의 레코드 중 특정 사례에 대해 실제로 500 개만 렌더링해야 할 수 있습니다. TileMill을 사용하여이 작업을 수행 할 수 있습니까?
Imad

3
아니. CartoDB 를 사용 해보고 싶을 수도 있지만 역동적 인 작업을 수행하고 성능을 향상시키는 것은 목표에 반대한다는 것을 알아야합니다.
tmcw

1
인구 조사지도 링크가 죽었습니다!
drho

모든 링크는 감히 있습니다.
LeeGee

9

전단지 클러스터 러를 살펴 보셨습니까? 저자의 블로그 게시물이 여기에 설명되어 있습니다.

살펴볼 가치가있는 또 다른 옵션은 전단지를 GIS Cloud 와 함께 사용하는 것 입니다. 에서 봐 이 데모 는 매우 빠르게 형상을 많이 처리 할 볼 수 있습니다. 매우 인상적. 나는 결코 GISCloud와 제휴하지 않습니다.


7

지도에 수백만 점을 표시해서는 안됩니다. 주요 성능 문제뿐만 아니라 사용자 관점에서도이 데이터를 해석하는 것이 가장 어렵 기 때문에 사용자 관점에서도 볼 수 있습니다. 서로 다른 확대 / 축소 레벨에서 서로 다른 표시 유형과 결합 된 데이터 집계 (클러스터링, 다각형 영역으로 집계 등)를 사용하십시오 (예 : "원시"포인트 데이터는 매우 높은 확대 / 축소 레벨에서만 표시하고 다른 곳에서는 집계 된 데이터 사용). zillow.com 과 같은 부동산 사이트를 예로들 수 있습니다 .


8
"당신은 절대로 말해서는 안된다"고 말해서는 안됩니다. Locals & Tourists 는 수백만 (또는이 경우 수십억) 포인트를 시각화 할 수있는 통찰력의 좋은 예입니다.
Joseph Sheedy

1
@velotron에 동의하십시오. 예를 들어 6 백만 점이 아름답고 빠르게 렌더링됩니다 : mapbox.com/blog/supercluster
Max von Hippel

1
예, 그러나이 경우 해당 지점도 확대 / 축소 수준에 따라 클러스터링되므로 데이터를 해석하고 이해하기가 매우 쉽습니다.
chriserik

2
@ chriserik 맞습니다. 그래서 정답은 "많은 포인트가 있다면 클러스터링 또는 히트 맵을 사용해야합니다. 여기에 그 방법이 있습니다."
Max von Hippel

3
내 요점은 수백만 점의 클러스터되지 않은 플롯이 통찰력을 제공 할 수 있다는 것입니다.
Joseph Sheedy

0

렌더링 된 포인트 피처 양을 줄이는 것이 좋습니다. 육안으로는 2,000,000이 아닌 10,000 포인트를 볼 수 없습니다.

시도 할 수있는 것은 사용자 정의 서버 (설정해야 할)에서 데이터 세트를 동적으로 요청하는 것입니다.

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

그러면 서버는 사용자가 지금보고 싶은 것에 따라 반환 할 포인트를 계산합니다. 확대 / 축소 비율 및 클리핑에 따라 사용자 경험을 악화시키지 않으면 서 아주 적은 비율의 포인트 만 반환하면됩니다.

단점 : 서버 설정 (지리 점 필터링을위한 라이브러리를 찾아야 함) 및 렌더링 속도가 느려짐 (모든 확대 / 축소 또는 드래그 후 서버 요청이 필요함)


-5

5 억에서 1 억 개의 레코드를 매핑하는 솔루션이 있었으므로 그리드 및 동적 기반을 수행하려면 서버 측 솔루션을 사용해야합니다. 클라이언트 측 렌더링을 수행하기 위해 웹 맵 API (Google 또는 기타)에 응답 할 수 없습니다 ....

[http://96.231.36.9:8080/rbgis/google_map.html][1] 위의 링크를 시도하고 방법을 확인하십시오


2
답을 넓히면 서버에 액세스 할 수없는 경우에도 도움이됩니다.
lynxlynxlynx

예, 아이러니합니다. 서버 측 링크가 작동하지 않기 때문입니다.
Max von Hippel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.