在GeoDjango中将多边形归纳为MultiPolygons?


9

models.PolygonField使用postgres作为数据库在geodjango中建立了一个模型。我尝试将shp导入postgres。问题是,shp(与QGIS编译)混合了多边形和多面体,因此由于约束检查而总是无法导出enforce_geotype

有没有一种方法可以清除约束,以便同时存储多面和面类型数据?

Answers:


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语句可以从South迁移初始数据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 2011年

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__()

我当前的解决方案是在导入和保存数据时将所有Polygons 强制转换为MultiPolygons。__set__()如果这变得麻烦,我可能会重写。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.