1

Я использую django rest gis для загрузки карт буклетов, а на верхнем уровне моего приложения я ищу карту мира. Базовая карта из Mapbox. Я звоню в мой rest-api и возвращаю контуры всех отдельных стран, включенных в приложение. В настоящее время файл GeoJSON, который возвращается в размере 1.1 МБ, и у меня есть больше стран, чтобы добавить, поэтому я хотел бы уменьшить размер, чтобы повысить производительность.Уменьшить точность многопольного поля с django rest framwork 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], 

Размер файла является функцией количества точек и точность этих точек. Я думал, что наиболее целесообразным способом уменьшить размер, сохраняя мои исходные данные, было бы снижение точности точек геометрии. Но, я немного теряю, как это сделать. Я просмотрел документацию по 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() после выполнения некоторых тестов.

В моем наборе данных имеется 20 стран с геометрией, предоставляемой Natural Earth. Без оптимизации файл geojson был размером 1,2 МБ, запрос занял 17 мс для запуска и 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 и 2,2 PostGIS. ST_SimplifyVW не входит в PostGIS 2.1, поэтому вы должны использовать 2.2.

Смежные вопросы