1

私はリーガレットマップを読み込むためにdjango rest gisを使用しています。私のアプリケーションのトップレベルでは、私は世界の地図を見ています。ベースマップはMapboxからのものです。私は自分の残りのAPIに電話をかけ、アプリに含まれているすべての個々の国の概要を返します。現在、GeoJSONファイルは1.1MBのサイズで返され、追加する国が増えていますので、パフォーマンスを向上させるためにサイズを縮小したいと考えています。ここdjango restフレームワークでマルチポリゴンフィールドの精度を下げるgis

コンテンツの例である:

{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-64.54916992187498,-54.71621093749998],[-64.43881835937495,-54.739355468749984],[-64.22050781249999,-54.721972656249996],[-64.10532226562495,-54.72167968750003],[-64.054931640625,-54.72988281250001],[-64.03242187499995,-54.74238281249998],[-63.881933593750006,-54.72294921875002],[-63.81542968749997,-54.725097656250014],[-63.83256835937499,-54.76796874999995],[-63.97124023437499,-54.810644531250034],[-64.0283203125,-54.79257812499999],[-64.32290039062497,-54.79648437499999],[-64.45327148437497,-54.84033203124995],[-64.50869140625,-54.83994140624996],[-64.637353515625,-54.90253906250001], 

ファイルのサイズは、点の数及びそれらの点の精度関数です。元のデータを保存しながら、サイズを縮小する最も便利な方法は、geomポイントの精度を下げることだと私は考えていました。しかし、私はこれをどうやって行うのかについて少し迷っています。私はgithubのドキュメントを見てきましたが、手がかりは見つかりませんでした。

返されるGeoJSONの精度を低下させるフィールドオプションはありますか?あるいは、私がやろうとしていることを達成する別の方法がありますか?

多くのありがとうございます。

答えて

1

私は、PostGISを使ってジオメトリを単純化してから、そのクエリセットをシリアライザに渡しました。私は、モデルマネージャーで生のクエリを作成することから始めました。

class RegionQueryset(models.query.QuerySet): 
    def simplified(self): 
     return self.raw(
      "SELECT region_code, country_code, name, slug, ST_SimplifyVW(geom, 0.01) as geom FROM regions_region " 
      "WHERE active=TRUE AND region_type = 'Country'" 
     ) 

class RegionsManager (models.GeoManager): 
    def get_queryset(self): 
     return RegionQueryset(self.model, using=self._db) 

    def simplified(self): 
     return self.get_queryset().simplified() 

ビューは非常に簡単です:

class CountryApiGeoListView(ListAPIView): 
    queryset = Region.objects.simplified() 
    serializer_class = CountryGeoSerializer 

シリアライザ:

class CountryGeoSerializer(GeoFeatureModelSerializer): 
    class Meta: 
     model = Region 
     geo_field = 'geom' 
     queryset = Region.objects.filter(active=True) 
     fields = ('name', 'slug', 'region_code', 'geom') 

私はいくつかのテストを実行した後PostGIS function ST_SimplifyVW()にセトリング終わりました。

私のデータセットには、Natural Earthによって提供されるジオメトリを持つ20カ国があります。最適化を行わないとgeojsonファイルのサイズは1.2MBで、クエリの実行には17ms、ブラウザでのロードには1.15秒かかりました。もちろん、描画されたアウトラインの品質は素晴らしかったです。次に、さまざまなパラメーターを使用してST_Simplify()およびST_SimplifyVW()関数を試しました。これらの非常にラフなテストから、私はST_SimplifyVW(GEOM、0.01)

**Function     Size Query time Load time Appearance** 
None      1.2MB 17ms   1.15s  Great 
ST_Simplify(geom, 0.1)  240K 15.94ms  371ms Barely Acceptable 
ST_Simplify(geom, 0.01) 935k 22.45ms  840ms  Good 
ST_SimplifyVW(geom, 0.01) 409K 25.92ms  628ms  Good 

に決めた私のセットアップは、Postgresの9.4とPostGISの2.2でした。 ST_SimplifyVWはPostGIS 2.1には含まれていないので、2.2を使用する必要があります。

関連する問題