Узагальнення полігонів на багатополігони в GeoDjango?


9

Я створив модель з models.PolygonFieldgeodjango, використовуючи postgres як базу даних. Я намагаюся імпортувати shp у postgres. Проблема полягає в тому, що shp (складений з QGIS) змішує багатокутник і мультиполігон, отже, він завжди не може здійснити експорт через перевірку обмежень enforce_geotype.

Чи є спосіб усунути обмеження, щоб зберігати дані багатополігонного та полігонного типу?

Відповіді:


10

SQL для скидання обмеження:

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;

Або змінити це, щоб дозволити і багатокутники, і багатополігони:

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
ALTER TABLE myapp_mymodel ADD CONSTRAINT enforce_geotype_mygeom CHECK (geometrytype(mygeom) = 'POLYGON'::text OR geometrytype(mygeom) = 'MULTIPOLYGON'::text OR mygeom IS NULL);

Ці оператори SQL можуть бути запущені з міграції на південь або з сценарію SQL початкових даних .

Ще один варіант - це зробити його GeometryFieldу визначенні моделі Django - це дозволить йому зберігати будь-який тип геометрії.

Або save()замініть метод на вашій моделі, щоб змусити все стати MultiPolygon:

from django.contrib.gis.db import models
from django.contrib.gis import geos

class MyModel(models.Model):
  mygeom = models.MultiPolygonField()
  ... other fields....

  def save(self, *args, **kwargs):
    # if mygeom ends up as a Polgon, make it into a MultiPolygon
    if self.mygeom and isinstance(self.mygeom, geos.Polygon):
      self.mygeom = geos.MultiPolygon(self.mygeom)

    super(MyModel).save(*args, **kwargs)

Останній метод може бути вдалим вибором
ChanDon

5

тривалий спосіб вирішення

можна було б використовувати fromstr ()

from django.contrib.gis.geos import fromstr

p = Polygon()
# this seems to work correctly
mp = MultiPolygon(fromstr(str(p)),)

model1.geom_field = mp

model1.save()

4

Я знаю, що це по-старому, але я просто зіткнувся з цим питанням і у мене виникли проблеми з використанням запропонованих вище рішень:

  • Використання GeometryFieldускладнює використання вбудованого OSMGeoAdminкласу. Код в templates/gis/admin/openlayers.js(і, contrib/gis/admin/widgets.pyможливо, в інших місцях, які я пропустив) часто передбачає, що геометрія - це точка, лінія, багатокутник або колекція і ніколи не припадає на загальну геометрію. Це не обов'язково важливо або непереборно, але якщо ви планували використовувати вбудований адміністратор, ви можете розчаруватися.

  • Переопределення save()не працює, тому що перевірка типу відбувається раніше, в моделі __set__().

Моя поточна рішення явно примушуючи всі мої Polygonз в MultiPolygonс при імпорті та збереженні своїх даних. Я можу перекрити, __set__()якщо це стане громіздким.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.