¿Generalizando polígonos a polígonos múltiples en GeoDjango?

9

Configuré un modelo models.PolygonFielden geodjango, usando postgres como base de datos. Intento importar shp en postgres. El problema es que shp (compilado con QGIS) mezcla polígono y multipolígono, por lo tanto, siempre no se puede exportar debido a la verificación de restricciones enforce_geotype.

¿Hay alguna manera de eliminar la restricción, para almacenar datos de tipo multipolígono y polígono?

ChanDon
fuente

Respuestas:

10

El SQL para eliminar la restricción:

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;

O para alterarlo para permitir Polígonos y MultiPolígonos:

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);

Estas instrucciones SQL podrían ejecutarse desde una migración Sur o un script SQL de datos iniciales .

Otra opción es convertirlo en una GeometryFielddefinición de modelo de Django; esto le permitirá almacenar cualquier tipo de geometría.

O bien, anule el save()método en su modelo para forzar que todo sea un 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)
rcoup
fuente
El último método podría ser una buena opción
ChanDon
5

solución larga

uno podría usar 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()
usuario1725066
fuente
4

Sé que esto es antiguo, pero me encontré con este problema y tuve problemas para usar las soluciones sugeridas anteriormente:

  • El uso GeometryFieldhace que sea difícil usar la OSMGeoAdminclase integrada . El código en templates/gis/admin/openlayers.js(y contrib/gis/admin/widgets.pyprobablemente en otros lugares que me perdí) frecuentemente asume que la geometría es un punto, línea, polígono o colección, y nunca da cuenta de geometrías genéricas. Esto no es necesariamente importante o insuperable, pero si estaba planeando usar el administrador incorporado, podría sentirse decepcionado.

  • La anulación save()no funciona porque la verificación de tipo ocurre antes, en el modelo __set__().

Mi solución actual está coaccionando explícitamente todos mis Polygons en MultiPolygons al importar y guardar mis datos. Podría anular __set__()si esto se vuelve engorroso.

Eric Brelsford
fuente