জিওডাজাঙ্গোতে মাল্টিপলিজনে বহুভুজকে সাধারণীকরণ করছেন?


9

আমি models.PolygonFieldজিওডজ্যাঙ্গোতে একটি মডেল স্থাপন করেছি, ডেটাবেস হিসাবে পোস্টগ্রিস ব্যবহার করে। আমি পোস্টগ্র্যাসে shp আমদানি করার চেষ্টা করি। সমস্যাটি হ'ল, shp (কিউজিআইএস দিয়ে সংকলিত) বহুভুজ এবং মাল্টিপলিজোন মিশ্রিত করে, তাই সীমাবদ্ধতা পরীক্ষার কারণে এটি সর্বদা রফতানি করতে ব্যর্থ হয় 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);

এই এসকিউএল বিবৃতিগুলি একটি দক্ষিণ মাইগ্রেশন বা একটি প্রাথমিক-ডেটা এসকিউএল স্ক্রিপ্ট থেকে চালানো যেতে পারে ।

আরেকটি বিকল্প হ'ল এটি GeometryFieldআপনার জাজানো মডেল সংজ্ঞাতে একটি করে তোলা - এটি এটিকে কোনও জ্যামিতির ধরণের সঞ্চয় করতে দেয়।

বা, 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)

শেষ পদ্ধতিটি একটি ভাল পছন্দ হতে পারে
চ্যানডন

5

লম্বা workaround

এক থেকে ব্যবহার করতে পারেন ()

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__()এটি জটিল হয়ে উঠলে আমি ওভাররাইড করতে পারি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.