GeoJSON이 너무 부피가 큽니다. 어떻게해야합니까?


19

내가 사용하고 leaflet.js을 웹 사용자가 지역을 선택할 수 있도록. 유효한 지역은 미국 주, 캐나다 섭리 및 세계 국가입니다 (미국 및 캐나다 제외). Qgis를 사용하여 shapefile을 직접 구성하고 geojson으로 저장했습니다. 가능한 한 지오메트리를 단순화했습니다.

결과 shapefile은 400kb이지만 geojson은 메가 바이트 이상입니다. 이것은 내가 원하는 것보다 큽니다. 이 정보를 전송하는 데 관련된 네트워크 오버 헤드를 줄여야합니다.

이것을하는 올바른 방법은 무엇입니까? 내가 상상할 수있는 옵션은 다음과 같습니다.

  1. 클라이언트에서 압축을 푼 geojson 파일을 제공하십시오.
  2. 클라이언트의 shapefile을 geojson으로 구문 분석하십시오.
  3. shapefile에서 나만의 타일을 생성하고 그 타일을 제공

누구든지 어떤 옵션이 가장 좋은지 말해 줄 수 있다면 (또는 위의 방법 중 어느 것도 아님) 감사합니다!


지오메트리를 단순화하려고했지만 GIS 단순화 알고리즘을 사용하고 결과를 확인 했습니까? JSON의 어느 부분이 가장 많은 공간을 차지하는지 확인하는 데 도움이 될 수도 있습니다.
BradHards

1
GeoJSON이 예쁘게 인쇄되지 않았는지 확인하고 불필요한 공백을 모두 제거하면 파일 크기가 크게 줄어들지 않아도됩니다.
CHenderson

답변:


13

더 힘든 길을 가기 전에 가장 간단한 옵션은 형상을 줄이는 것입니다. 소스 데이터 셋은 무엇입니까? 그것들을 어떻게 단순화 했습니까? 이것이 geojson 파일 크기를 얼마나 줄였습니까?

위의 모든 작업을 완료했다고 확신하는 경우 옵션의 가장 낮은 결과는 다음과 같습니다.

  1. 클라이언트에서 압축을 푼 geojson 파일을 제공하십시오.

모든 최신 브라우저는 gzip으로 압축 된 데이터를 자동으로 압축 해제하므로 전송하기 전에 데이터를 압축하도록 웹 서버를 설정하는 경우입니다. 이것은 일반적으로 비교적 간단하며 Apache , IIS 또는 Nginx에 대한 많은 자료가 있습니다.

내 팁은 이것을 먼저 시도하고 테스트 한 다음 대기 시간 / 응답 / 데이터 크기가 허용되지 않으면 다른 옵션으로 이동하십시오. 또한 조기에 최적화하려고하는 것에주의를 기울이고, 데이터 크기를 줄여야하는 이유를 결정하고, 그렇게하는 데 어려운 이유 (및 숫자)가 있으면 변경 사항을 반복적으로 구현하고 다시 테스트하여 당신이 얻는 이익.


13

Mapshaper.org 는 geojson 파일을 업로드하고 맵으로 표시 한 다음 슬라이더로 강도를 조정할 수있는 세 가지 단순화 알고리즘 중 하나를 선택할 수있는 편리한 무료 온라인 도구입니다.

지도를 업데이트하고 두 지역이 겹치는 것처럼 무결성이 손실되는 곳을 빨간색으로 강조 표시합니다. 일반적으로 이러한 문제를 해결하는 '수정'버튼이 있습니다 (항상 그런 것은 아님).

수용 가능한 단순화 수준을 찾고 새로 단순화 된 geojson 파일을 내보낼 수 있습니다.

분명히 이것은 필요한 세부 수준에 따라 다르지만 결과는 인상적 일 수 있습니다. 예를 들어, 다음은 40mb geojson 파일의 스코틀랜드 맵입니다.

여기에 이미지 설명을 입력하십시오

99 % 응용 프로그램은이 확대 / 축소 수준에서 볼 수없는 겹침 및 세부 정보 손실없이 441kb 파일로 줄입니다.

여기에 이미지 설명을 입력하십시오

99.95 % 응용 프로그램 (29kb 이하)은 적용되는 경로 단순화 유형을 보여줍니다 (그리고 여전히 겹침을 피하기 위해 관리되며 국가 수준의 클로로 플렛과 같은 용도에 완벽하게 적합 함).

여기에 이미지 설명을 입력하십시오


이 도구를 항상 사용합니다. 훌륭합니다!
Mike Furlender

1
당신은 생명의 은인입니다!
Khizar

6

이 답변에서 찾은 압축을 사용하여 GeoJSON을 topojson으로 압축하는 것에 대해 이야기 할 수 있는지 궁금합니다 .

Leaflet이 여전히 GeoJSON을 읽을 수 있는지 모르겠습니다.

topojson에 대한 추가 정보 : https://github.com/mbostock/topojson/


Leaflet.GeoJSON은 아크 데이터를 파싱하지 않으므로이 접근법은 작동하지 않습니다
smcphill

전단지는 기본적으로 할 수 없지만 클라이언트 측에서 topojson을 사용하여 수행 할 수 있습니다 ( topojson on leaflet ).이 예제에서는 d3을 사용하여 렌더링합니다.
Calvin

1
27MB geoJson 파일이 있습니다. mapshaper.org에 갔고 단순화 (1.0 %)와 topojson 내보내기 후에 122kb가되었습니다. 이 추가 topoJson 리플릿 코드 후에서 github.com/shramov/leaflet-plugins/blob/master/layer/vector/... 다음 내 애플 리케이션과 않았다. 새로운 L.TOPOJSON ( "myExported.topojson") toGeoJson ().
StackUnder

3

지오메트리 단순화에 대한 위의 @Kelso에 동의합니다.

gzip으로 데이터를 쉽게 확장하기 위해 서버에 액세스 할 수없는 경우 geoJSON을 이진 데이터로 직렬화하기 위해 MessagePack 라이브러리를 살펴볼 수 있습니다 ( MongoDB와 같은 것들이 사용 하는 BSON 사양 의 구현이라고 생각합니다 데이터를 저장하지만 잘못되었을 수 있습니다) . 데이터를 직렬화 / 역 직렬화하는 데 사용할 수 있는 PythonJavascript 라이브러리가 있습니다.


2
MessagePack은 BSON과 관련이 없습니다 (실제로 stackoverflow.com/questions/6355497/… 에 따르면 더 낫습니다 . messagepack 및 특히 geojson에 대한 더 흥미로운 정보는 nelsonslog.wordpress.com/2012/06/22/checking 에서 찾을 수 있습니다. -out-msgpack .
켈소

@Kelso에게 감사드립니다-답변을 업데이트했습니다. 그리고 좋은 기사도!
om_henners

1

Leaflet Polygon 객체의 절차 적 배열을 만드는 것이 좋습니다. GeoJSON이 너무 큰 것에 동의합니다. 객체 키 이름은 매우 설명 적이지만 불필요하게 길 수도 있습니다. 나는 이런 종류의 일을한다.

objects = [];
objects.push( new L.polygon([[1,1],[1,2],[3,4]],options );
objects.push( new L.polygon([[4,7],[8,27],[35,66]],options );
objects.push( new L.polygon([[3,5],[56,24],[13,49]],options );
objects.push( new L.polygon([[13,7],[7,68],[23,9]],options );
layerGroup = L.layerGroup(objects).addTo(map);

간단합니다. GeoJSON보다 훨씬 가볍습니다.

{ "type": "FeatureCollection",
  "features": [
    { "type": "Feature",
      "geometry": {"type": "Polygon",
      "coordinates": [1,1],[1,2],[3,4]},
      },

    //etc...

그리고 모든 단일 다각형에 대해 반복하십시오. JS에 많은 바이트를 추가합니다. 내가 말했듯이 키 이름은 훌륭하고 설명 적이지만 ... 길이가 길고 JS에 불필요한 작별 인사가 많이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.