การใช้รูปหลายเหลี่ยมทั่วไปใน MultiPolygons ใน GeoDjango


9

ฉันตั้งค่าโมเดลด้วยmodels.PolygonFieldใน geodjango โดยใช้ postgres เป็นฐานข้อมูล ฉันพยายามนำเข้า shp ไปยัง postgres ปัญหาคือบรา (รวบรวมกับ QGIS) ผสมรูปหลายเหลี่ยมและ multipolygon enforce_geotypeจึงมักจะล้มเหลวในการทำส่งออกเนื่องจากการตรวจสอบข้อ

มีวิธีการล้างข้อ จำกัด เพื่อจัดเก็บข้อมูลประเภทหลายรูปหลายเหลี่ยมและรูปหลายเหลี่ยม?

คำตอบ:


10

SQL เพื่อลดข้อ จำกัด :

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;

หรือแก้ไขเพื่อให้ทั้ง Polygons & MultiPolygons:

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 เบื้องต้นข้อมูล

อีกทางเลือกหนึ่งคือทำให้มันเป็น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

วิธีแก้ปัญหาแบบ longish

หนึ่งสามารถใช้ 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 เข้าMultiPolygonเมื่อการนำเข้าและการบันทึกข้อมูลของฉัน ฉันอาจลบล้าง__set__()หากสิ่งนี้ยุ่งยาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.