Tổng quát hóa đa giác thành MultiPolygons trong GeoDjango?


9

Tôi thiết lập một mô hình với models.PolygonFieldtrong geodjango, sử dụng postgres làm cơ sở dữ liệu. Tôi cố gắng nhập shp vào postgres. Vấn đề là, shp (được biên dịch với QGIS) trộn lẫn đa giác và đa giác, do đó nó luôn không thực hiện được việc xuất vì kiểm tra ràng buộc enforce_geotype.

Có cách nào để xóa các ràng buộc, để lưu trữ cả dữ liệu loại đa giác và đa giác không?

Câu trả lời:


10

SQL để loại bỏ các ràng buộc:

ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;

Hoặc để thay đổi nó để cho phép cả Đa giác & 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);

Các câu lệnh SQL này có thể được chạy từ di chuyển miền Nam hoặc tập lệnh SQL dữ liệu ban đầu .

Một tùy chọn khác là biến nó thành GeometryFieldđịnh nghĩa mô hình Django của bạn - điều này sẽ cho phép nó lưu trữ bất kỳ loại hình học nào.

Hoặc, ghi đè save()phương thức trên mô hình của bạn để buộc mọi thứ phải là 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)

Phương pháp cuối cùng có thể là một lựa chọn tốt
ChanDon

5

cách giải quyết lâu dài

người ta có thể sử dụng 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

Tôi biết điều này đã cũ, nhưng tôi chỉ gặp phải vấn đề này và gặp vấn đề khi sử dụng các giải pháp được đề xuất ở trên:

  • Việc sử dụng GeometryFieldgây khó khăn cho việc sử dụng OSMGeoAdminlớp tích hợp. Mã ở templates/gis/admin/openlayers.js(và contrib/gis/admin/widgets.pycó lẽ là những nơi khác mà tôi đã bỏ lỡ) thường cho rằng hình học là một điểm, đường thẳng, đa giác hoặc bộ sưu tập và không bao giờ chiếm các hình học chung. Điều này không nhất thiết quan trọng hoặc không thể vượt qua, nhưng nếu bạn dự định sử dụng quản trị viên tích hợp, bạn có thể thất vọng.

  • Ghi đè save()không hoạt động vì kiểm tra kiểu xảy ra sớm hơn, trong mô hình __set__().

Giải pháp hiện tại của tôi rõ ràng là ép buộc tất cả các Polygons của tôi vào MultiPolygons khi nhập và lưu dữ liệu của tôi. Tôi có thể ghi đè __set__()nếu điều này trở nên cồng kềnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.