Django 2.1 - LayerMapping data import utility

LayerMapping डेटा आयात उपयोगिता




django

LayerMapping डेटा आयात उपयोगिता

LayerMapping वर्ग वेक्टर स्थानिक डेटा फ़ाइलों (जैसे आकार आकृति) की सामग्री को जियोडजैंगो मॉडल में मैप करने का एक तरीका प्रदान करता है।

यह उपयोगिता लेखक की व्यक्तिगत जरूरतों से बढ़कर कोड रिपीटेशन को समाप्त करने के लिए बढ़ी जो एक वेक्टर लेयर से जियोमेट्रीज़ और फ़ील्ड्स को खींचने के लिए गया, जो एक अन्य समन्वय प्रणाली (जैसे WGS84) में परिवर्तित हो गया और फिर एक GeoDjj मॉडल में सम्मिलित हो गया।

ध्यान दें

LayerMapping उपयोग के लिए GDAL की आवश्यकता होती है।

चेतावनी

जीआईएस डेटा स्रोत, शेपफाइल्स की तरह, बहुत बड़े हो सकते हैं। यदि आप पाते हैं कि LayerMapping बहुत अधिक मेमोरी का उपयोग कर रहा है, तो अपनी सेटिंग में DEBUG को False सेट करें। जब DEBUG सही पर सेट होता है, तो Django स्वचालित रूप से प्रत्येक SQL क्वेरी को लॉग करता है - इस प्रकार, जब SQL स्टेटमेंट में ज्यामिति होते हैं, तो विशिष्ट की तुलना में अधिक मेमोरी का उपभोग करना आसान होता है।

उदाहरण

  1. आपको एक GDAL- समर्थित डेटा स्रोत की आवश्यकता है, जैसे शेपफाइल (यहां हम एक साधारण बहुभुज आकार का उपयोग कर रहे हैं, test_poly.shp , तीन विशेषताओं के साथ):

    >>> from django.contrib.gis.gdal import DataSource
    >>> ds = DataSource('test_poly.shp')
    >>> layer = ds[0]
    >>> print(layer.fields) # Exploring the fields in the layer, we only want the 'str' field.
    ['float', 'int', 'str']
    >>> print(len(layer)) # getting the number of features in the layer (should be 3)
    3
    >>> print(layer.geom_type) # Should be 'Polygon'
    Polygon
    >>> print(layer.srs) # WGS84 in WKT
    GEOGCS["GCS_WGS_1984",
        DATUM["WGS_1984",
            SPHEROID["WGS_1984",6378137,298.257223563]],
        PRIMEM["Greenwich",0],
        UNIT["Degree",0.017453292519943295]]
    
  2. अब हम अपने संबंधित Django मॉडल को परिभाषित करते हैं ( migrate का उपयोग करना सुनिश्चित करें):

    from django.contrib.gis.db import models
    
    class TestGeo(models.Model):
        name = models.CharField(max_length=25) # corresponds to the 'str' field
        poly = models.PolygonField(srid=4269) # we want our model in a different SRID
    
        def __str__(self):
            return 'Name: %s' % self.name
    
  3. सभी सुविधाओं को निकालने और उन्हें डेटाबेस में LayerMapping लिए LayerMapping का उपयोग करें:

    >>> from django.contrib.gis.utils import LayerMapping
    >>> from geoapp.models import TestGeo
    >>> mapping = {'name' : 'str', # The 'name' model field maps to the 'str' layer field.
                   'poly' : 'POLYGON', # For geometry fields use OGC name.
                   } # The mapping is a dictionary
    >>> lm = LayerMapping(TestGeo, 'test_poly.shp', mapping)
    >>> lm.save(verbose=True) # Save the layermap, imports the data.
    Saved: Name: 1
    Saved: Name: 2
    Saved: Name: 3
    

यहाँ, LayerMapping ने अपने मूल स्थानिक संदर्भ प्रणाली (WGS84) में तीन ज्यामितीय आकार को जियोडजंगो मॉडल (NAD83) के स्थानिक संदर्भ प्रणाली में बदल दिया। यदि कोई स्थानिक संदर्भ प्रणाली परत के लिए परिभाषित नहीं है, तो एक निर्दिष्ट करने के लिए SpatialReference ऑब्जेक्ट के साथ source_srs कीवर्ड का उपयोग करें।

LayerMapping API

class LayerMapping(model, data_source, mapping, layer=0, source_srs=None, encoding=None, transaction_mode='commit_on_success', transform=True, unique=True, using='default')

निम्नलिखित तर्क और कीवर्ड हैं जिनका उपयोग LayerMapping ऑब्जेक्ट्स के LayerMapping दौरान किया जा सकता है।

तर्क विवरण
model भौगोलिक मॉडल, उदाहरण नहीं
data_source OGR समर्थित डेटा स्रोत फ़ाइल का पथ (जैसे, एक आकृति)। django.contrib.gis.gdal.DataSource उदाहरण भी स्वीकार करता है।
mapping एक शब्दकोष: कुंजियाँ मॉडल फ़ील्ड के अनुरूप होती हैं, और मान OGR सुविधा के लिए स्ट्रिंग फ़ील्ड नामों के अनुरूप होते हैं, या यदि मॉडल फ़ील्ड एक भौगोलिक है, तो यह OGR ज्यामिति प्रकार, जैसे 'POINT' , 'LINESTRING' LINTRTRING, के अनुरूप होना चाहिए 'LINESTRING' , 'POLYGON'
कीवर्ड तर्क
layer डेटा स्रोत से उपयोग करने के लिए परत का सूचकांक (चूक से 0)
source_srs स्रोत SRS को मैन्युअल रूप से निर्दिष्ट करने के लिए इसका उपयोग करें (उदाहरण के लिए, कुछ '.prj' फ़ाइल के साथ नहीं आते हैं)। एक पूर्णांक SRID, WKT या PROJ.4 तार, और SpatialReference ऑब्जेक्ट स्वीकार किए जाते हैं।
encoding OGR डेटा स्रोत में स्ट्रिंग्स के वर्ण सेट एन्कोडिंग को निर्दिष्ट करता है। उदाहरण के लिए, 'latin-1' , 'utf-8' और 'cp437' सभी वैध एन्कोडिंग पैरामीटर हैं।
transaction_mode हो सकता है 'commit_on_success' (डिफ़ॉल्ट) या 'autocommit'
transform इसे गलत पर सेट करना समन्वय परिवर्तनों को अक्षम कर देगा। दूसरे शब्दों में, ज्यामिति को डेटा स्रोत में उनके मूल राज्य से असंशोधित डेटाबेस में डाला जाएगा।
unique दिए गए मॉडल से इसे नाम, या नामों का एक समूह सेट करना, केवल दिए गए नाम (यों) के लिए अद्वितीय मॉडल बनाएगा। प्रत्येक विशेषता से ज्यामिति को अद्वितीय मॉडल से जुड़े संग्रह में जोड़ा जाएगा। लेनदेन मोड को 'autocommit' होने 'autocommit'
using स्थानिक डेटा आयात करते समय डेटाबेस का उपयोग करने के लिए सेट करता है। डिफ़ॉल्ट 'default'

save() खोजशब्द तर्क

LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)

save() पद्धति भी कीवर्ड स्वीकार करती है। इन कीवर्ड का उपयोग आउटपुट लॉगिंग, एरर हैंडलिंग, और विशिष्ट फीचर रेंज के आयात के लिए किया जाता है।

कीवर्ड तर्क सहेजें विवरण
fid_range डेटा स्रोत से मैप करने के लिए ID (आरंभ, अंत) की स्लाइस या ट्यूपल के साथ सेट किया जा सकता है। दूसरे शब्दों में, यह कीवर्ड उपयोगकर्ता को भौगोलिक डेटा स्रोत में सुविधाओं के सबसेट रेंज का चयन करने में सक्षम बनाता है।
progress जब यह कीवर्ड सेट हो जाता है, तो स्थिति की जानकारी संसाधित और सफलतापूर्वक सहेजी गई सुविधाओं की संख्या को मुद्रित करती है। डिफ़ॉल्ट रूप से, प्रगति की जानकारी संसाधित की गई प्रत्येक 1000 विशेषताओं को मुद्रित की जाएगी, हालांकि, इस कीवर्ड को वांछित अंतराल के लिए पूर्णांक के साथ इस कीवर्ड को सेट करके ओवरराइड किया जा सकता है।
silent डिफ़ॉल्ट रूप से, गैर-घातक त्रुटि सूचनाओं को sys.stdout प्रिंट किया sys.stdout , लेकिन यह कीवर्ड इन सूचनाओं को निष्क्रिय करने के लिए सेट किया जा सकता है।
step यदि पूर्णांक के साथ सेट किया जाता है, तो लेनदेन प्रत्येक चरण अंतराल पर होगा। उदाहरण के लिए, यदि step=1000 , step=1000 वें फीचर, 2,000 वें फीचर आदि के बाद एक कमिट होता है।
stream स्थिति की जानकारी इस फाइल हैंडल को लिखी जाएगी। sys.stdout का उपयोग करने में चूक, लेकिन write विधि के साथ कोई भी वस्तु समर्थित है।
strict मॉडल मैपिंग का निष्पादन सामने आने वाली पहली त्रुटि पर समाप्त हो जाएगा। डिफ़ॉल्ट मान ( False ) व्यवहार जारी रखने का प्रयास है।
verbose यदि सेट किया जाता है, तो डेटाबेस पर निष्पादित प्रत्येक मॉडल को बचाने के बाद जानकारी मुद्रित की जाएगी।

समस्या निवारण

स्मृति से बाहर चल रहा है

जैसा कि इस खंड के शीर्ष पर चेतावनी में उल्लेख किया गया है, Django DEBUG=True सभी SQL प्रश्नों को संग्रहीत करता है। अपनी सेटिंग में DEBUG=False सेट करें, और LayerMapping स्क्रिप्ट को चलाते समय अत्यधिक मेमोरी उपयोग को रोकना चाहिए।

MySQL: max_allowed_packet त्रुटि

यदि आपको LayerMapping और MySQL का उपयोग करते समय निम्नलिखित त्रुटि LayerMapping है:

OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

तब समाधान के लिए अपने MySQL कॉन्फ़िगरेशन में max_allowed_packet सेटिंग का मान बढ़ाना है। उदाहरण के लिए, डिफ़ॉल्ट मान कुछ मेगाबाइट की तरह कम हो सकता है - [mysqld] अनुभाग में MySQL के कॉन्फ़िगरेशन फ़ाइल ( my.cnf ) में सेटिंग को संशोधित किया जा सकता है:

max_allowed_packet = 10M