GeoPjango में मल्टीपॉलीगॉन के लिए बहुभुज को सामान्य बनाना?


9

मैंने models.PolygonFieldडेटाबेस के रूप में पोस्टग्रेज का उपयोग करते हुए जियोड्जैंगो के साथ एक मॉडल स्थापित किया । मैं पोस्टग्रेज में shp आयात करने की कोशिश करता हूं। समस्या यह है कि, shp (QGIS के साथ संकलित) बहुभुज और बहुभुज को मिश्रित करता है, इसलिए यह हमेशा बाधा की जाँच के कारण निर्यात करने में विफल रहता है enforce_geotype

क्या बाधा को साफ करने का एक तरीका है, ताकि मल्टीप्लगोन और बहुभुज प्रकार के डेटा को स्टोर किया जा सके?

जवाबों:


10

बाधा को छोड़ने के लिए एसक्यूएल:

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()अपने मॉडल पर मल्टीप्रोलीगन होने के लिए सब कुछ करने के लिए मजबूर करने की विधि को ओवरराइड करें :

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

लंबे समय तक काम

एक का उपयोग कर सकते हैं ()

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.