GeoJSONが大きすぎる-何をすべきか?


19

私はleaflet.jsを使用して、Webユーザーが地域を選択できるようにします。有効な地域は、米国の州、カナダのプロビデンス、および世界の国(米国とカナダを除く)です。Qgisを使用して自分でシェープファイルを作成し、geojsonとして保存しました。可能な限りジオメトリを単純化しました。

結果のシェープファイルは400kbですが、geojsonは1メガバイトを超えています。これは私が望むよりも大きいです。この情報の転送に伴うネットワークのオーバーヘッドを削減する必要があります。

これを行う正しい方法は何ですか?私が想像できるオプションは次のとおりです。

  1. gzip圧縮されたgeojsonファイルを提供し、クライアントで解凍します。
  2. クライアント上のシェープファイルをgeojsonに解析します
  3. シェープファイルから独自のタイルを生成し、それらを提供します

どちらのオプションが最適か(または上記のいずれでもない)を誰かが教えてくれたら、感謝します!


ジオメトリを単純化しようとしたと言いましたが、GIS単純化アルゴリズムを使用して結果を確認しようとしましたか?また、JSONのどの部分が最も多くのスペースを使用しているかを確認することも役立つ場合があります。
ブラッドハーズ

1
GeoJSONがきれいに印刷されていないことを確認してください。不要な空白をすべて削除すると、ファイルが小さくなります-必ずしも大量ではありませんが、すべて役立ちます!
チェンダーソン

回答:


13

面倒な道を進む前に、最も単純なオプションはジオメトリを減らすことです。ソースデータセットは何ですか?それらをどのように簡素化しましたか?これによりgeojsonファイルのサイズはどの程度削減されましたか?

上記でできることをすべて実行したと確信している場合、オプションの最も低いぶら下げ果物は

  1. gzip圧縮されたgeojsonファイルを提供し、クライアントで解凍します。

最新のブラウザはすべて、gzip圧縮されたデータの解凍を自動的に行うため、送信する前にデータを圧縮するようにWebサーバーを設定するだけです。通常、これは比較的単純で、ApacheIIS、またはNginxについて多くの資料があります。

私のヒントは、最初にこれを試し、テストしてから、待ち時間/応答/データサイズが許容できない場合、他のオプションに移動することです。また、時期尚早に最適化しようとするのは慎重であり、データサイズを縮小する必要がある理由を判断し、そうするための難しい理由(および数値)があれば、変更を繰り返し実装し、何を確認するために再テストしますあなたが得ている利益。


13

Mapshaper.orgは便利な無料のオンラインツールで、geojsonファイルをアップロードしてマップとして表示し、スライダーで強度を調整できる3つの簡略化アルゴリズムのいずれかを選択できます。

マップを更新し、2つの地域間の重複など、整合性が失われた場所を赤で強調表示します。そのような問題を通常(常にではないが)修正する「修正」ボタンがあります。

許容できるレベルの単純化を見つけて、新しく単純化されたgeojsonファイルをエクスポートできます。

明らかに、これはどのレベルの詳細が必要かによって異なりますが、結果は印象的です。たとえば、40メガバイトのgeojsonファイルからのスコットランドのマップは次のとおりです。

ここに画像の説明を入力してください

99%のアプリケーションは、このズームレベルでは見えない重複や詳細の損失のない441 kbファイルに縮小します。

ここに画像の説明を入力してください

99.95%のアプリケーション(29kbまで)は、どのような種類のパス簡略化が適用されているかを示しています(さらに、オーバーラップを回避でき、国レベルのクロロプレスなどの使用に最適です)。

ここに画像の説明を入力してください


私は常にこのツールを使用しています。素晴らしいです!
マイクファレンダー16年

1
あなたは命の恩人です!!
キザー

6

topojsonでGeoJSONを圧縮することについて述べているこの回答にある圧縮を利用できるかどうか疑問に思います。

LeafletがGeoJSONをまだ読み取れるかどうかはわかりません-試してみてください=)

topojsonの詳細: https : //github.com/mbostock/topojson/


Leaflet.GeoJSONはアークデータを解析しないため、このアプローチは機能しません
-smcphill

リーフレットはネイティブに作成できませんが、クライアント側でtopojsonを使用して実行できます。リーフレットのtopojsonの例では例として d3を使用してレンダリングしています。
カルバン

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でデータを簡単に圧縮できない場合は、MessagePackライブラリを見て、geoJSONをバイナリデータにシリアル化できます(MongoDBなどで使用されるBSON仕様の実装だと思います)データを保存しますが、間違っている可能性があります)Pythonおよびjavascript(他のなかでも)には、データのシリアル化/非シリアル化に使用できるライブラリがあります。


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に大量のバイトを追加します。私が言ったように、キーの名前は素晴らしく説明的です...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.