Django 2.1

GeoDjango Database API




django

GeoDjango Database API

स्थानिक खर्च

GeoDjango वर्तमान में निम्नलिखित स्थानिक डेटाबेस प्रदान करता है:

  • django.contrib.gis.db.backends.postgis
  • django.contrib.gis.db.backends.mysql
  • django.contrib.gis.db.backends.oracle
  • django.contrib.gis.db.backends.spatialite

MySQL स्थानिक सीमाएँ

MySQL के स्थानिक विस्तार केवल बाउंडिंग बॉक्स संचालन का समर्थन करते हैं (MySQL न्यूनतम बाउंडिंग आयत या MBR कहता है)। विशेष रूप से, MySQL OGC मानक के अनुरूप नहीं है :

वर्तमान में, MySQL इन कार्यों को लागू नहीं करता है [ Contains , Crosses , Disjoint , Intersects , Overlaps , Touches , Within ] विनिर्देश के अनुसार। जो कार्यान्वित किए जाते हैं वे एमबीआर-आधारित कार्यों के अनुरूप परिणाम देते हैं।

दूसरे शब्दों में, जबकि MySQL का उपयोग करते समय जियोडंजैंगो में मौजूद स्थानिक लुकअप उपलब्ध हैं, वापस लौटाए गए परिणाम वास्तव में एक अलग स्थानिक बैकएंड पर bbcontains का उपयोग करते समय वापस आने वाले के बराबर हैं।

चेतावनी

सच्चे स्थानिक अनुक्रमित (R- ट्री) केवल MySQL पर MyISAM तालिकाओं के साथ समर्थित हैं। [5] दूसरे शब्दों में, MySQL स्थानिक एक्सटेंशन का उपयोग करते समय आपको तेजी से स्थानिक लुकअप और अपने डेटा की अखंडता के बीच चयन करना होगा - MyISAM टेबल लेनदेन या विदेशी प्रमुख बाधाओं का समर्थन नहीं करते हैं।

रेखापुंज समर्थन

RasterField वर्तमान में केवल PostGIS बैकएंड के लिए लागू किया गया है। स्थानिक रेखांकन रेखापुंज क्षेत्रों के लिए उपलब्ध हैं, लेकिन स्थानिक डेटाबेस फ़ंक्शंस और समुच्चय रास्टर फ़ील्ड के लिए लागू नहीं किए जाते हैं।

ज्यामिति फ़ील्ड के साथ मॉडल बनाना और सहेजना

यहां एक ज्यामिति ऑब्जेक्ट ( Zipcode मॉडल को मानते हुए) बनाने का एक उदाहरण दिया गया है:

>>> from zipcode.models import Zipcode
>>> z = Zipcode(code=77096, poly='POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')
>>> z.save()

ज्यामितीय मॉडल को बचाने के लिए GEOSGeometry ऑब्जेक्ट का भी उपयोग किया जा सकता है:

>>> from django.contrib.gis.geos import GEOSGeometry
>>> poly = GEOSGeometry('POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')
>>> z = Zipcode(code=77096, poly=poly)
>>> z.save()

इसके अलावा, अगर GEOSGeometry एक अलग समन्वय प्रणाली (एक अलग SRID मान) है जो क्षेत्र की तुलना में है, तो यह स्थानिक डेटाबेस की परिवर्तन प्रक्रिया का उपयोग करके मॉडल के क्षेत्र के SRID में रूपांतरित हो जाएगा:

>>> poly_3084 = GEOSGeometry('POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))', srid=3084)  # SRID 3084 is 'NAD83(HARN) / Texas Centric Lambert Conformal'
>>> z = Zipcode(code=78212, poly=poly_3084)
>>> z.save()
>>> from django.db import connection
>>> print(connection.queries[-1]['sql']) # printing the last SQL statement executed (requires DEBUG=True)
INSERT INTO "geoapp_zipcode" ("code", "poly") VALUES (78212, ST_Transform(ST_GeomFromWKB('\\001 ... ', 3084), 4326))

इस प्रकार, ज्यामिति पैरामीटर GEOSGeometry ऑब्जेक्ट, GEOSGeometry (अच्छी तरह से ज्ञात पाठ [1] ), HEXEWKB (हेक्साडेसिमल में एक WKB ज्यामिति [2] ) और GeoJSON [3] का उपयोग करके पारित किया जा सकता है। अनिवार्य रूप से, यदि इनपुट GEOSGeometry ऑब्जेक्ट नहीं है, तो ज्यामिति क्षेत्र इनपुट से एक GEOSGeometry उदाहरण बनाने का प्रयास करेगा।

GEOSGeometry ऑब्जेक्ट बनाने वाली अधिक जानकारी के लिए, GEOS ट्यूटोरियल देखें।

रास्टर फ़ील्ड्स के साथ मॉडल बनाना और सहेजना

रास्टर मॉडल बनाते समय, रेखापुंज क्षेत्र आलसी-मूल्यांकन का उपयोग करके इनपुट को GDALRaster में बदल देगा। इसलिए रेखापुंज क्षेत्र GDALRaster निर्माता द्वारा स्वीकार किए गए किसी भी इनपुट को स्वीकार GDALRaster

यहाँ एक उदाहरण है कि कैसे एक रेखापुंज फ़ाइल से एक रेखापुंज वस्तु बनाने के लिए volcano.tif ( Elevation मॉडल को मानते हुए):

>>> from elevation.models import Elevation
>>> dem = Elevation(name='Volcano', rast='/path/to/raster/volcano.tif')
>>> dem.save()

GDALRaster ऑब्जेक्ट्स का उपयोग रैस्टर मॉडल को बचाने के लिए भी किया जा सकता है:

>>> from django.contrib.gis.gdal import GDALRaster
>>> rast = GDALRaster({'width': 10, 'height': 10, 'name': 'Canyon', 'srid': 4326,
...                    'scale': [0.1, -0.1], 'bands': [{"data": range(100)}]})
>>> dem = Elevation(name='Canyon', rast=rast)
>>> dem.save()

ध्यान दें कि यह इसके बराबर है:

>>> dem = Elevation.objects.create(
...     name='Canyon',
...     rast={'width': 10, 'height': 10, 'name': 'Canyon', 'srid': 4326,
...           'scale': [0.1, -0.1], 'bands': [{"data": range(100)}]},
... )

स्थानिक लुकअप

GeoDjango के लुकअप प्रकारों का उपयोग किसी भी प्रबंधक विधि जैसे filter() , exclude() , आदि के साथ किया जा सकता है, हालाँकि, GeoDjango के लिए अद्वितीय लुकअप प्रकार केवल स्थानिक क्षेत्रों पर उपलब्ध हैं।

भौगोलिक क्षेत्रों पर 'सामान्य' फ़ील्ड्स (उदाहरण के लिए CharField ) पर फ़िल्टर जंजीर के साथ CharField जा सकते हैं। भौगोलिक रेखांकन ज्यामिति और रेखापुंज इनपुट दोनों तरफ स्वीकार करते हैं और इनपुट प्रकारों को स्वतंत्र रूप से मिश्रित किया जा सकता है।

भौगोलिक लुकअप की सामान्य संरचना नीचे वर्णित है। एक संपूर्ण संदर्भ स्थानिक लुकअप संदर्भ में पाया जा सकता है।

जियोमेट्री लुकअप

जियोमेट्रिक्स के साथ भौगोलिक प्रश्न निम्नलिखित सामान्य रूप लेते हैं ( GeoDjango मॉडल एपीआई में प्रयुक्त Zipcode मॉडल को मानते हुए):

>>> qs = Zipcode.objects.filter(<field>__<lookup_type>=<parameter>)
>>> qs = Zipcode.objects.exclude(...)

उदाहरण के लिए:

>>> qs = Zipcode.objects.filter(poly__contains=pnt)
>>> qs = Elevation.objects.filter(poly__contains=rst)

इस मामले में, poly भौगोलिक क्षेत्र है, contains स्थानिक लुकअप प्रकार है, pnt पैरामीटर है (जो कि GEOSGeometry ऑब्जेक्ट या GeoJSON, WKT, या HEXEWKB का एक स्ट्रिंग हो सकता है), और rst एक GDALRaster ऑब्जेक्ट है।

रेखापुंज लुकअप

रेखापुंज लुकअप सिंटैक्स ज्यामितीय के लिए सिंटैक्स के समान है। एकमात्र अंतर यह है कि एक बैंड इंडेक्स को अतिरिक्त इनपुट के रूप में निर्दिष्ट किया जा सकता है। यदि कोई बैंड इंडेक्स निर्दिष्ट नहीं है, तो पहला बैंड डिफ़ॉल्ट रूप से उपयोग किया जाता है (इंडेक्स 0 )। उस मामले में सिंटैक्स ज्यामिति के लुकअप के लिए सिंटैक्स के समान है।

बैंड इंडेक्स को निर्दिष्ट करने के लिए, लुकअप के दोनों किनारों पर एक अतिरिक्त पैरामीटर निर्दिष्ट किया जा सकता है। बाईं ओर, बैंड इंडेक्स को पास करने के लिए डबल अंडरस्कोर सिंटैक्स का उपयोग किया जाता है। दाहिने हाथ की तरफ, रेखापुंज और बैंड इंडेक्स का एक टपल निर्दिष्ट किया जा सकता है।

रिडर्स को शामिल करने वाले लुकअप के लिए निम्न सामान्य रूप में यह परिणाम होता है ( जियोडजंगो माडल एपीआई में उपयोग किए गए Elevation मॉडल को मानते हुए):

>>> qs = Elevation.objects.filter(<field>__<lookup_type>=<parameter>)
>>> qs = Elevation.objects.filter(<field>__<band_index>__<lookup_type>=<parameter>)
>>> qs = Elevation.objects.filter(<field>__<lookup_type>=(<raster_input, <band_index>)

उदाहरण के लिए:

>>> qs = Elevation.objects.filter(rast__contains=geom)
>>> qs = Elevation.objects.filter(rast__contains=rst)
>>> qs = Elevation.objects.filter(rast__1__contains=geom)
>>> qs = Elevation.objects.filter(rast__contains=(rst, 1))
>>> qs = Elevation.objects.filter(rast__1__contains=(rst, 1))

उदाहरण के बाईं ओर, rast भौगोलिक रेखापुंज क्षेत्र है और contains स्थानिक लुकअप प्रकार है। दाहिने हाथ की तरफ, GDALRaster एक ज्यामिति इनपुट है और GDALRaster एक GDALRaster ऑब्जेक्ट है। बैंड इंडेक्स पहले दो प्रश्नों में 0 से चूकता है और अन्य पर 1 पर सेट होता है।

जबकि सभी स्थानिक लुकअप का उपयोग दोनों तरफ रेखापुंज वस्तुओं के साथ किया जा सकता है, सभी अंतर्निहित ऑपरेटर मूल रूप से रेखीय इनपुट को स्वीकार नहीं करते हैं। ऐसे मामलों के लिए जहां ऑपरेटर ज्यामिति इनपुट की अपेक्षा करता है, रास्टर स्वचालित रूप से ज्यामिति में परिवर्तित हो जाता है। लुकअप परिणामों की व्याख्या करते समय इसे ध्यान में रखना महत्वपूर्ण है।

संगतता तालिका में सभी लुकअप के लिए रैस्टर समर्थन का प्रकार सूचीबद्ध है। वर्तमान में पोस्टगस बैकएंड के लिए रेखापुंज वाले लुकअप केवल उपलब्ध हैं।

दूरी की क्वेरी

परिचय

स्थानिक डेटा के साथ दूरी की गणना मुश्किल है क्योंकि, दुर्भाग्य से, पृथ्वी समतल नहीं है। भौगोलिक समन्वय प्रणाली में फ़ील्ड के साथ कुछ दूरी के प्रश्नों को PostGIS में सीमाओं के कारण अलग तरह से व्यक्त करना पड़ सकता है। कृपया अधिक विवरण के लिए GeoDjango Model API प्रलेखन में SRID अनुभाग का चयन करें।

डिस्टेंस लुकअप

उपलब्धता : PostGIS, Oracle, SpatiaLite, PGRaster (नेटिव)

निम्नलिखित दूरी लुकअप उपलब्ध हैं:

ध्यान दें

दूरी पर क्वेरी करने के बजाय, मापने के लिए , Distance फ़ंक्शन का उपयोग करें।

दूरस्थ लुकअप में एक टपल पैरामीटर शामिल है:

  1. से गणना करने के लिए एक ज्यामिति या रेखापुंज; तथा
  2. एक संख्या या Distance वस्तु जिसमें दूरी होती है।

यदि एक Distance ऑब्जेक्ट का उपयोग किया जाता है, तो इसे किसी भी यूनिट में व्यक्त किया जा सकता है (एसक्यूएल उत्पन्न फ़ील्ड के उन क्षेत्रों में परिवर्तित इकाइयों का उपयोग करेगा); अन्यथा, संख्यात्मक पैरामीटर को क्षेत्र की इकाइयों में माना जाता है।

ध्यान दें

PostGIS में, ST_Distance_Sphere ज्यामिति प्रकार को सीमित नहीं करता है भौगोलिक भौगोलिक क्वेरी के साथ प्रदर्शन किया जाता है। [4] हालांकि, इन प्रश्नों में लंबा समय लग सकता है, क्योंकि क्वेरी में प्रत्येक पंक्ति के लिए मक्खी पर महान-सर्कल दूरी की गणना की जानी चाहिए। ऐसा इसलिए है क्योंकि पारंपरिक ज्यामिति क्षेत्रों पर स्थानिक सूचकांक का उपयोग नहीं किया जा सकता है।

WGS84 दूरी प्रश्नों पर बहुत बेहतर प्रदर्शन के लिए, अपने डेटाबेस में भूगोल कॉलम का उपयोग करने पर विचार करें क्योंकि वे दूरस्थ प्रश्नों में अपने स्थानिक सूचकांक का उपयोग करने में सक्षम हैं। आप भूगोल को भूगोल कॉलम का उपयोग करके geography=True अपनी क्षेत्र परिभाषा में geography=True बता सकते हैं।

उदाहरण के लिए, SouthTexasCity कि हमारे पास दक्षिणी टेक्सास के शहरों के लिए मान्य अनुमानित समन्वित प्रणाली पर SouthTexasCity मॉडल ( जियोडजंगो डिस्टेंस टेस्ट से ) है:

from django.contrib.gis.db import models

class SouthTexasCity(models.Model):
    name = models.CharField(max_length=30)
    # A projected coordinate system (only valid for South Texas!)
    # is used, units are in meters.
    point = models.PointField(srid=32140)

फिर निम्न प्रकार की दूरी की पूछताछ की जा सकती है:

>>> from django.contrib.gis.geos import GEOSGeometry
>>> from django.contrib.gis.measure import D # ``D`` is a shortcut for ``Distance``
>>> from geoapp.models import SouthTexasCity
# Distances will be calculated from this point, which does not have to be projected.
>>> pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=4326)
# If numeric parameter, units of field (meters in this case) are assumed.
>>> qs = SouthTexasCity.objects.filter(point__distance_lte=(pnt, 7000))
# Find all Cities within 7 km, > 20 miles away, and > 100 chains away (an obscure unit)
>>> qs = SouthTexasCity.objects.filter(point__distance_lte=(pnt, D(km=7)))
>>> qs = SouthTexasCity.objects.filter(point__distance_gte=(pnt, D(mi=20)))
>>> qs = SouthTexasCity.objects.filter(point__distance_gte=(pnt, D(chain=100)))

रेखापुंज प्रश्न एक रेखापुंज क्षेत्र के साथ रेखापुंज क्षेत्र, या pnt वस्तु एक रेखापुंज वस्तु, या दोनों के साथ की जगह बस उसी तरह से काम करते हैं। दाएं हाथ पर एक रेखापुंज इनपुट के बैंड इंडेक्स को निर्दिष्ट करने के लिए, एक 3-टपल को लुकअप में निम्न प्रकार से पारित किया जा सकता है:

>>> qs = SouthTexasCity.objects.filter(point__distance_gte=(rst, 2, D(km=7)))

जहां रैस्टर 2 के इंडेक्स 2 (तीसरे बैंड) वाले बैंड का इस्तेमाल लुकअप के लिए किया जाएगा।

संगतता टेबल

स्थानिक लुकअप

निम्न तालिका प्रत्येक स्थानिक डेटाबेस बैकएंड के लिए स्थानिक लुकअप उपलब्ध हैं का एक सारांश प्रदान करती है। पोस्टगिस रैस्टर (PGRaster) लुक्स को रैस्टर लुकअप विवरण में वर्णित तीन श्रेणियों में विभाजित किया गया है: मूल समर्थन N , द्विपक्षीय मूल समर्थन B और ज्यामिति रूपांतरण समर्थन C

लुकअप प्रकार PostGIS आकाशवाणी MySQL [6] SpatiaLite PGRaster
bbcontains एक्स एक्स एक्स एन
bboverlaps एक्स एक्स एक्स एन
contained एक्स एक्स एक्स एन
contains एक्स एक्स एक्स एक्स बी
contains_properly एक्स बी
coveredby एक्स एक्स बी
covers एक्स एक्स बी
crosses एक्स एक्स सी
disjoint एक्स एक्स एक्स एक्स बी
distance_gt एक्स एक्स एक्स एन
distance_gte एक्स एक्स एक्स एन
distance_lt एक्स एक्स एक्स एन
distance_lte एक्स एक्स एक्स एन
dwithin एक्स एक्स एक्स बी
equals एक्स एक्स एक्स एक्स सी
exact एक्स एक्स एक्स एक्स बी
intersects एक्स एक्स एक्स एक्स बी
isvalid एक्स एक्स X (≥ 5.7.5) एक्स (LWGEOM)
overlaps एक्स एक्स एक्स एक्स बी
relate एक्स एक्स एक्स सी
same_as एक्स एक्स एक्स एक्स बी
touches एक्स एक्स एक्स एक्स बी
within एक्स एक्स एक्स एक्स बी
left एक्स सी
right एक्स सी
overlaps_left एक्स बी
overlaps_right एक्स बी
overlaps_above एक्स सी
overlaps_below एक्स सी
strictly_above एक्स सी
strictly_below एक्स सी

डेटाबेस फ़ंक्शन

निम्न तालिका इस बात का सारांश प्रदान करती है कि प्रत्येक स्थानिक बैकएंड पर भूगोल-विशिष्ट डेटाबेस फ़ंक्शन क्या उपलब्ध हैं।

समारोह PostGIS आकाशवाणी माई एसक्यूएल SpatiaLite
Area एक्स एक्स एक्स एक्स
AsGeoJSON एक्स X (≥ 5.7.5) एक्स
AsGML एक्स एक्स एक्स
AsKML एक्स एक्स
AsSVG एक्स एक्स
Azimuth एक्स एक्स (LWGEOM)
BoundingCircle एक्स एक्स
Centroid एक्स एक्स एक्स एक्स
Difference एक्स एक्स एक्स एक्स
Distance एक्स एक्स एक्स एक्स
Envelope एक्स एक्स एक्स
ForcePolygonCW एक्स एक्स
ForceRHR एक्स
GeoHash एक्स X (≥ 5.7.5) एक्स (LWGEOM)
Intersection एक्स एक्स एक्स एक्स
IsValid एक्स एक्स X (≥ 5.7.5) एक्स (LWGEOM)
Length एक्स एक्स एक्स एक्स
LineLocatePoint एक्स एक्स
MakeValid एक्स एक्स (LWGEOM)
MemSize एक्स
NumGeometries एक्स एक्स एक्स एक्स
NumPoints एक्स एक्स एक्स एक्स
Perimeter एक्स एक्स एक्स
PointOnSurface एक्स एक्स एक्स
Reverse एक्स एक्स एक्स
Scale एक्स एक्स
SnapToGrid एक्स एक्स
SymDifference एक्स एक्स एक्स एक्स
Transform एक्स एक्स एक्स
Translate एक्स एक्स
Union एक्स एक्स एक्स एक्स

अलग कार्य

निम्न तालिका प्रत्येक स्थानिक बैकएंड पर जीआईएस-विशिष्ट एग्रीगेट फ़ंक्शन क्या उपलब्ध है, इसका एक सारांश प्रदान करती है। कृपया ध्यान दें कि MySQL इनमें से किसी भी समुच्चय का समर्थन नहीं करता है, और इस प्रकार इसे तालिका से बाहर रखा गया है।

कुल PostGIS आकाशवाणी SpatiaLite
Collect एक्स एक्स
Extent एक्स एक्स एक्स
Extent3D एक्स
MakeLine एक्स एक्स
Union एक्स एक्स एक्स

फुटनोट

[1] ओपन जियोस्पेशियल कंसोर्टियम, इंक।, एसक्यूएल के लिए ओपेनगिस सिंपल फीचर स्पेसिफिकेशन , दस्तावेज 99-049 (5 मई, 1999), चौ। ३.२.५, पृ। 3-11 (ज्यामिती का एसक्यूएल पाठ प्रतिनिधित्व)।
[2] PostGIS EWKB, EWKT और Canonical Forms , PostGIS प्रलेखन Ch पर देखें। 4.1.2।
[3] हॉवर्ड बटलर, मार्टिन डेली, एलन डॉयल, टिम शहाब , और क्रिस्टोफर श्मिट, जियोसन प्रारूप विनिर्देश , संशोधन 1.0 (16 जून, 2008) देखें।
[4] STGDistanceSphere पर PostGIS प्रलेखन देखें
[5]

MySQL संदर्भ मैनुअल में स्थानिक सूचकांक बनाना देखें :

MyISAM तालिकाओं के लिए, SPATIAL INDEX एक R- ट्री इंडेक्स बनाता है। भंडारण इंजनों के लिए जो स्थानिक स्तंभों के अविशिष्ट अनुक्रमण का समर्थन करते हैं, इंजन बी-ट्री इंडेक्स बनाता है। स्थानिक मूल्यों पर एक बी-ट्री इंडेक्स सटीक-मूल्य लुकअप के लिए उपयोगी होगा, लेकिन रेंज स्कैन के लिए नहीं।
[6] अधिक विवरण के लिए MySQL स्थानिक सीमा अनुभाग देखें।