GeoDjango'da Poligonları Çokgenlere Genelleştirmek?


9

Ben models.PolygonFieldveritabanı olarak postgres kullanarak, geodjango ile bir model kurdu . Shp'yi postgres'e aktarmaya çalışıyorum. Sorun şudur: shp (QGIS ile derlenir) çokgen ve çokgengonu karıştırır, bu nedenle sınırlama kontrolü nedeniyle her zaman dışa aktarma yapamaz enforce_geotype.

Hem çokgenli hem de çokgen tipi verileri depolamak için kısıtlamayı temizlemenin bir yolu var mı?

Yanıtlar:


10

Kısıtlamayı bırakacak SQL:

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;

Veya hem Çokgenlere hem de Çok Poligonlara izin verecek şekilde değiştirmek için:

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

Bu SQL deyimleri bir Güney geçişinden veya bir ilk veri SQL komut dosyasından çalıştırılabilir .

Başka bir seçenek, bunu GeometryFieldDjango model tanımınızda bir yapmaktır - bu, herhangi bir geometri türünü saklamasına izin verecektir.

Veya save()her şeyi bir MultiPolygon olmaya zorlamak için modelinizdeki yöntemi geçersiz kılın :

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)

Son yöntem iyi bir seçim olabilir
ChanDon

5

uzunca geçici çözüm

biri fromstr () kullanabilir

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

Bunun eski olduğunu biliyorum, ama kendim bu sorunla karşılaştım ve yukarıda önerilen çözümleri kullanırken sorunlar yaşadım:

  • Kullanmak GeometryFieldyerleşik OSMGeoAdminsınıfı kullanmayı zorlaştırır . Koddaki templates/gis/admin/openlayers.js(ve contrib/gis/admin/widgets.pyve belki de kaçırdığım diğer yerlerde) sıklıkla geometrinin bir nokta, çizgi, çokgen veya koleksiyon olduğunu varsayar ve asla genel geometrileri hesaba katmaz. Bu mutlaka önemli veya aşılmaz değildir, ancak yerleşik yöneticiyi kullanmayı planlıyorsanız hayal kırıklığına uğrayabilirsiniz.

  • Geçersiz kılma save()çalışmaz çünkü tip kontrolü modellerde daha erken gerçekleşir __set__().

Şu anki çözümüm, verilerimi içe aktarırken ve kaydederken açıkça tüm öğelerimi Polygons MultiPolygon. __set__()Bu hantal hale gelirse geçersiz kılabilirim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.