Django 2.1 - GeoDjango Tutorial

GeoDjango ट्यूटोरियल




django

GeoDjango ट्यूटोरियल

परिचय

जिओडजैंगो, Django के लिए एक शामिल कंट्रिब मॉड्यूल है जो इसे विश्व स्तरीय भौगोलिक वेब फ्रेमवर्क में बदल देता है। GeoDjango भौगोलिक वेब एप्लिकेशन बनाने के लिए इसे यथासंभव सरल बनाने का प्रयास करता है, जैसे स्थान-आधारित सेवाएं। इसकी विशेषताओं में शामिल हैं:

  • OGC ज्यामितीय और रेखापुंज डेटा के लिए Django मॉडल फ़ील्ड।
  • स्थानिक डेटा को क्वेरी और हेरफेर करने के लिए Django के ORM के लिए एक्सटेंशन।
  • ढीले-ढाले, उच्च-स्तरीय पायथन इंटरफेस जीआईएस ज्यामिति और रेखापुंज संचालन और विभिन्न स्वरूपों में डेटा हेरफेर के लिए।
  • व्यवस्थापक से ज्यामिति फ़ील्ड का संपादन।

यह ट्यूटोरियल Django के साथ परिचित मानता है; इस प्रकार, यदि आप Django के लिए नए हैं, तो पहले Django के साथ खुद को परिचित करने के लिए नियमित ट्यूटोरियल के माध्यम से पढ़ें।

ध्यान दें

जिओजंगो के अतिरिक्त जिओजंगो की अतिरिक्त आवश्यकताएं हैं - कृपया अधिक जानकारी के लिए स्थापना प्रलेखन से परामर्श करें।

यह ट्यूटोरियल आपको विश्व सीमाओं को देखने के लिए एक भौगोलिक वेब एप्लिकेशन के निर्माण के माध्यम से मार्गदर्शन करेगा। [1] इस ट्यूटोरियल में उपयोग किए गए कुछ कोड जियोडजॉन्गो बेसिक एप्स प्रोजेक्ट से लिए गए और / या उससे प्रेरित हैं। [2]

ध्यान दें

चरण-दर-चरण निर्देशों के लिए क्रमिक रूप से ट्यूटोरियल अनुभागों के माध्यम से आगे बढ़ें।

की स्थापना

एक स्थानिक डेटाबेस बनाएँ

आमतौर पर किसी विशेष सेटअप की आवश्यकता नहीं होती है, इसलिए आप एक डेटाबेस बना सकते हैं जैसा कि आप किसी अन्य परियोजना के लिए करेंगे। हम चयनित डेटाबेस के लिए कुछ सुझाव प्रदान करते हैं:

एक नया प्रोजेक्ट बनाएं

geodjango नामक परियोजना बनाने के लिए मानक django-admin स्क्रिप्ट का उपयोग करें:

$ django-admin startproject geodjango
...\> django-admin startproject geodjango

यह एक नई परियोजना को आरंभ करेगा। अब, geodjango परियोजना के भीतर एक world Django एप्लिकेशन geodjango :

$ cd geodjango
$ python manage.py startapp world
...\> cd geodjango
...\> py manage.py startapp world

settings.py कॉन्फ़िगर करें

geodjango प्रोजेक्ट सेटिंग्स को geodjango/settings.py फ़ाइल में संग्रहीत किया जाता है। अपने कनेक्शन से मिलान करने के लिए डेटाबेस कनेक्शन सेटिंग्स संपादित करें:

DATABASES = {
    'default': {
         'ENGINE': 'django.contrib.gis.db.backends.postgis',
         'NAME': 'geodjango',
         'USER': 'geo',
    },
}

इसके अलावा, django.contrib.admin , django.contrib.gis और world (आपके नए बनाए गए एप्लिकेशन) को शामिल करने के लिए INSTALLED_APPS सेटिंग को संशोधित करें:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'world',
]

भौगोलिक डेटा

विश्व की सीमाएँ

दुनिया की सीमाओं का डेटा इस ज़िप फ़ाइल में उपलब्ध है। world अनुप्रयोग में एक data निर्देशिका बनाएं, विश्व सीमा डेटा डाउनलोड करें, और अनज़िप करें। GNU / Linux प्लेटफ़ॉर्म पर, निम्न आदेशों का उपयोग करें:

$ mkdir world/data
$ cd world/data
$ wget http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
$ unzip TM_WORLD_BORDERS-0.3.zip
$ cd ../..
...\> mkdir world\data
...\> cd world\data
...\> wget http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
...\> unzip TM_WORLD_BORDERS-0.3.zip
...\> cd ..\..

विश्व सीमाओं की ज़िप फ़ाइल में डेटा फ़ाइलों का एक समूह होता है जिसे सामूहिक रूप से ESRI शेपफाइल के रूप में जाना जाता है, जो सबसे लोकप्रिय भू-स्थानिक डेटा प्रारूपों में से एक है। जब अनज़िप किया जाता है, तो विश्व बॉर्डर डेटासेट में निम्न एक्सटेंशन वाली फाइलें शामिल हैं:

  • .shp : दुनिया की सीमाओं के लिए वेक्टर डेटा को ज्यामिति में शामिल करता है।
  • .shx : .shp में संग्रहित ज्यामितीयों के लिए स्थानिक सूचकांक फ़ाइल।
  • .dbf : गैर-ज्यामितीय विशेषता डेटा (जैसे, पूर्णांक और वर्ण फ़ील्ड) रखने के लिए डेटाबेस फ़ाइल।
  • .prj : आकृति में संग्रहीत भौगोलिक डेटा के लिए स्थानिक संदर्भ जानकारी शामिल है।

स्थानिक डेटा की जांच करने के लिए ogrinfo का उपयोग करें

GDAL ogrinfo उपयोगिता ogrinfo या अन्य वेक्टर डेटा स्रोतों के मेटाडेटा की जांच करने की अनुमति देती है:

$ ogrinfo world/data/TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)
...\> ogrinfo world\data\TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)

ogrinfo हमें बताता है कि ogrinfo में एक परत होती है, और इस परत में बहुभुज डेटा होता है। अधिक जानने के लिए, हम परत नाम निर्दिष्ट करेंगे और केवल महत्वपूर्ण सारांश जानकारी प्राप्त करने के लिए -so विकल्प का उपयोग करेंगे:

$ ogrinfo -so world/data/TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.

Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137.0,298.257223563]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)
...\> ogrinfo -so world\data\TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.

Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137.0,298.257223563]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)

यह विस्तृत सारांश जानकारी हमें परत में सुविधाओं की संख्या (246), डेटा की भौगोलिक सीमा, स्थानिक संदर्भ प्रणाली ("एसआरएस डब्ल्यूकेटी"), साथ ही प्रत्येक विशेषता क्षेत्र के लिए प्रकार की जानकारी बताती है। उदाहरण के लिए, FIPS: String (2.0) इंगित करता है कि FIPS वर्ण क्षेत्र की अधिकतम लंबाई 2 है। इसी तरह, LON: Real (8.3) एक फ़्लोटिंग-पॉइंट फ़ील्ड है जो अधिकतम तीन दशमलव स्थानों तक अधिकतम 8 अंक रखती है।

भौगोलिक मॉडल

भौगोलिक मॉडल को परिभाषित करना

अब जब आपने ogrinfo का उपयोग करके अपने डेटासेट की जांच की है, तो इस डेटा का प्रतिनिधित्व करने के लिए एक GeoDjango मॉडल बनाएं:

from django.contrib.gis.db import models

class WorldBorder(models.Model):
    # Regular Django fields corresponding to the attributes in the
    # world borders shapefile.
    name = models.CharField(max_length=50)
    area = models.IntegerField()
    pop2005 = models.IntegerField('Population 2005')
    fips = models.CharField('FIPS Code', max_length=2)
    iso2 = models.CharField('2 Digit ISO', max_length=2)
    iso3 = models.CharField('3 Digit ISO', max_length=3)
    un = models.IntegerField('United Nations Code')
    region = models.IntegerField('Region Code')
    subregion = models.IntegerField('Sub-Region Code')
    lon = models.FloatField()
    lat = models.FloatField()

    # GeoDjango-specific: a geometry field (MultiPolygonField)
    mpoly = models.MultiPolygonField()

    # Returns the string representation of the model.
    def __str__(self):
        return self.name

ध्यान दें कि models मॉड्यूल django.contrib.gis.db से आयात किया django.contrib.gis.db

ज्यामिति क्षेत्रों के लिए डिफ़ॉल्ट स्थानिक संदर्भ प्रणाली WGS84 है (जिसका अर्थ है कि SRID 4326 है) - दूसरे शब्दों में, क्षेत्र निर्देशांक डिग्री की इकाइयों में देशांतर, अक्षांश जोड़े में हैं। एक अलग समन्वय प्रणाली का उपयोग करने के लिए, ज्यामिति फ़ील्ड के SRID को srid तर्क के साथ सेट करें। समन्वय प्रणाली के EPSG कोड का प्रतिनिधित्व करने वाले पूर्णांक का उपयोग करें।

migrate चलाएं

अपने मॉडल को परिभाषित करने के बाद, आपको इसे डेटाबेस के साथ सिंक करने की आवश्यकता है। सबसे पहले, एक डेटाबेस माइग्रेशन बनाएं:

$ python manage.py makemigrations
Migrations for 'world':
  world/migrations/0001_initial.py:
    - Create model WorldBorder
...\> py manage.py makemigrations
Migrations for 'world':
  world/migrations/0001_initial.py:
    - Create model WorldBorder

आइए SQL को देखें जो WorldBorder मॉडल के लिए तालिका उत्पन्न करेगा:

$ python manage.py sqlmigrate world 0001
...\> py manage.py sqlmigrate world 0001

इस कमांड को निम्न आउटपुट का उत्पादन करना चाहिए:

BEGIN;
--
-- Create model WorldBorder
--
CREATE TABLE "world_worldborder" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL,
    "area" integer NOT NULL,
    "pop2005" integer NOT NULL,
    "fips" varchar(2) NOT NULL,
    "iso2" varchar(2) NOT NULL,
    "iso3" varchar(3) NOT NULL,
    "un" integer NOT NULL,
    "region" integer NOT NULL,
    "subregion" integer NOT NULL,
    "lon" double precision NOT NULL,
    "lat" double precision NOT NULL
    "mpoly" geometry(MULTIPOLYGON,4326) NOT NULL
)
;
CREATE INDEX "world_worldborder_mpoly_id" ON "world_worldborder" USING GIST ( "mpoly" );
COMMIT;

यदि यह सही लगता है, तो डेटाबेस में इस तालिका को बनाने के लिए migrate चलाएं:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, world
Running migrations:
  ...
  Applying world.0001_initial... OK
...\> py manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, world
Running migrations:
  ...
  Applying world.0001_initial... OK

स्थानिक डेटा आयात करना

यह अनुभाग आपको दिखाता है कि जियोडजैंगो मॉडल के माध्यम से डेटाबेस में विश्व सीमाओं की आकृति को आयात करने के लिए LayerMapping आयात उपयोगिता का उपयोग कैसे करें।

डेटा को एक स्थानिक डेटाबेस में आयात करने के कई अलग-अलग तरीके हैं - इसके अलावा जियोडजंगो के भीतर शामिल टूल के अलावा, आप निम्नलिखित का भी उपयोग कर सकते हैं:

  • ogr2ogr : GDAL के साथ एक कमांड-लाइन उपयोगिता शामिल है जो PostGIS, MySQL और Oracle डेटाबेस में कई वेक्टर डेटा स्वरूपों को आयात कर सकती है।
  • shp2pgsql : यह उपयोगिता PostGIS के साथ शामिल है, ESG आकार में PostGIS आयात करता है।

GDAL इंटरफ़ेस

इससे पहले, आपने विश्व सीमाओं बॉर्डर आकार की सामग्री की जांच करने के लिए ogrinfo का उपयोग किया था। GeoDjango में GDAL की शक्तिशाली OGR लाइब्रेरी के लिए एक पायथनिक इंटरफ़ेस भी शामिल है जो सभी वेक्टर डेटा स्रोतों के साथ काम कर सकता है जो RGR का समर्थन करता है।

सबसे पहले, Django शेल का आह्वान करें:

$ python manage.py shell
...\> py manage.py shell

यदि आपने पहले ट्यूटोरियल में वर्ल्ड बॉर्डर्स डेटा डाउनलोड किया है, तो आप पायथन के बिल्ट-इन os मॉड्यूल का उपयोग करके इसका रास्ता निर्धारित कर सकते हैं:

>>> import os
>>> import world
>>> world_shp = os.path.abspath(os.path.join(os.path.dirname(world.__file__),
...                             'data', 'TM_WORLD_BORDERS-0.3.shp'))

अब, GeoDjango के DataSource इंटरफ़ेस का उपयोग करके विश्व सीमाओं की आकृति को खोलें:

>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource(world_shp)
>>> print(ds)
/ ... /geodjango/world/data/TM_WORLD_BORDERS-0.3.shp (ESRI Shapefile)

डेटा स्रोत ऑब्जेक्ट में भू-स्थानिक विशेषताओं की विभिन्न परतें हो सकती हैं; हालाँकि, आकारफाइल को केवल एक परत रखने की अनुमति है:

>>> print(len(ds))
1
>>> lyr = ds[0]
>>> print(lyr)
TM_WORLD_BORDERS-0.3

आप परत की ज्यामिति प्रकार देख सकते हैं और इसमें कितनी विशेषताएं हैं:

>>> print(lyr.geom_type)
Polygon
>>> print(len(lyr))
246

ध्यान दें

दुर्भाग्य से, शेपफाइल डेटा प्रारूप ज्यामिति प्रकारों के संबंध में अधिक विशिष्टता की अनुमति नहीं देता है। कई अन्य लोगों की तरह इस आकृति आकृति में वास्तव में MultiPolygon ज्यामिति शामिल हैं, MultiPolygon नहीं। मॉडल में अधिक सामान्य फ़ील्ड प्रकार का उपयोग करना महत्वपूर्ण है: एक GeoDjango MultiPolygonField एक Polygon ज्यामिति को स्वीकार करेगा, लेकिन एक PolygonField एक MultiPolygon प्रकार की ज्यामिति को स्वीकार नहीं करेगा। यही कारण है कि ऊपर WorldBorder मॉडल एक MultiPolygonField का उपयोग करता है।

Layer इसके साथ एक स्थानिक संदर्भ प्रणाली भी जुड़ी हो सकती है। यदि ऐसा होता है, srs विशेषता एक SpatialReference वस्तु SpatialReference :

>>> srs = lyr.srs
>>> print(srs)
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137.0,298.257223563]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
>>> srs.proj4 # PROJ.4 representation
'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs '

यह आकार आकृति लोकप्रिय WGS84 स्थानिक संदर्भ प्रणाली में है - दूसरे शब्दों में, डेटा डिग्री की इकाइयों में देशांतर, अक्षांश जोड़े का उपयोग करता है।

इसके अलावा, आकार-प्रकार भी विशेषता फ़ील्ड का समर्थन करते हैं जिनमें अतिरिक्त डेटा हो सकता है। यहाँ विश्व सीमा परत पर क्षेत्र हैं:

>>> print(lyr.fields)
['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT']

निम्न कोड आपको प्रत्येक क्षेत्र से जुड़े OGR प्रकार (जैसे पूर्णांक या स्ट्रिंग) की जांच करने देगा:

>>> [fld.__name__ for fld in lyr.field_types]
['OFTString', 'OFTString', 'OFTString', 'OFTInteger', 'OFTString', 'OFTInteger', 'OFTInteger', 'OFTInteger', 'OFTInteger', 'OFTReal', 'OFTReal']

आप परत में प्रत्येक विशेषता पर पुनरावृत्ति कर सकते हैं और दोनों फीचर की ज्यामिति ( geom विशेषता के माध्यम से एक्सेस) से जानकारी निकाल सकते हैं और साथ ही फीचर के फ़ीचर फ़ील्ड (जिनके मान गेट get() विधि से एक्सेस किए जाते हैं):

>>> for feat in lyr:
...    print(feat.get('NAME'), feat.geom.num_points)
...
Guernsey 18
Jersey 26
South Georgia South Sandwich Islands 338
Taiwan 363

Layer वस्तुओं को कटा जा सकता है:

>>> lyr[0:2]
[<django.contrib.gis.gdal.feature.Feature object at 0x2f47690>, <django.contrib.gis.gdal.feature.Feature object at 0x2f47650>]

और व्यक्तिगत सुविधाओं को उनकी सुविधा आईडी द्वारा प्राप्त किया जा सकता है:

>>> feat = lyr[234]
>>> print(feat.get('NAME'))
San Marino

सीमा ज्यामिति को WKT और GeoJSON के रूप में निर्यात किया जा सकता है:

>>> geom = feat.geom
>>> print(geom.wkt)
POLYGON ((12.415798 43.957954,12.450554 ...
>>> print(geom.json)
{ "type": "Polygon", "coordinates": [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...

LayerMapping

डेटा आयात करने के लिए, पायथन स्क्रिप्ट में LayerMapping का उपयोग करें। निम्न कोड के साथ, world अनुप्रयोग के अंदर load.py नामक एक फ़ाइल बनाएँ:

import os
from django.contrib.gis.utils import LayerMapping
from .models import WorldBorder

world_mapping = {
    'fips' : 'FIPS',
    'iso2' : 'ISO2',
    'iso3' : 'ISO3',
    'un' : 'UN',
    'name' : 'NAME',
    'area' : 'AREA',
    'pop2005' : 'POP2005',
    'region' : 'REGION',
    'subregion' : 'SUBREGION',
    'lon' : 'LON',
    'lat' : 'LAT',
    'mpoly' : 'MULTIPOLYGON',
}

world_shp = os.path.abspath(
    os.path.join(os.path.dirname(__file__), 'data', 'TM_WORLD_BORDERS-0.3.shp'),
)

def run(verbose=True):
    lm = LayerMapping(
        WorldBorder, world_shp, world_mapping,
        transform=False, encoding='iso-8859-1',
    )
    lm.save(strict=True, verbose=verbose)

क्या चल रहा है इसके बारे में कुछ नोट्स:

  • world_mapping शब्दकोश की प्रत्येक कुंजी WorldBorder मॉडल में एक फ़ील्ड से मेल खाती है। मान उस आकार फ़ील्ड का नाम है जिससे डेटा लोड किया जाएगा।
  • mpoly लिए प्रमुख mpoly MULTIPOLYGON , ज्योमेट्री टाइप GeoDjango फील्ड को इम्पोर्ट करेगा। यहां तक ​​कि शेपफाइल में साधारण बहुभुज स्वचालित रूप से डेटाबेस में प्रविष्टि से पहले संग्रह में परिवर्तित हो जाएंगे।
  • शेपफाइल का मार्ग निरपेक्ष नहीं है - दूसरे शब्दों में, यदि आप world अनुप्रयोग ( data उपनिर्देशिका के साथ) को किसी अन्य स्थान पर ले जाते हैं, तो स्क्रिप्ट अभी भी काम करेगी।
  • transform कीवर्ड को False सेट किया गया है क्योंकि आकृति में डेटा को परिवर्तित करने की आवश्यकता नहीं है - यह पहले से ही WGS84 (SRID = 4326) में है।
  • encoding कीवर्ड को शेपफाइल में स्ट्रिंग मान के एन्कोडिंग के लिए सेट किया गया है। यह सुनिश्चित करता है कि स्ट्रिंग मानों को उनके मूल एन्कोडिंग सिस्टम से सही ढंग से पढ़ा और बचाया जा सके।

बाद में, geodjango परियोजना निर्देशिका से Django geodjango :

$ python manage.py shell
...\> py manage.py shell

अगला, load मॉड्यूल आयात करें, run LayerMapping कॉल करें, और LayerMapping काम देखें:

>>> from world import load
>>> load.run()

ogrinspect

अब जब आपने भौगोलिक मॉडल को परिभाषित करने और डेटा को LayerMapping डेटा आयात उपयोगिता के साथ आयात करने का तरीका देखा है, तो इस प्रक्रिया को ogrinspect प्रबंधन कमांड के उपयोग के साथ आगे बढ़ाना संभव है। ogrinspect कमांड एक ogrinspect समर्थित वेक्टर डेटा स्रोत (जैसे, एक आकृति) का LayerMapping और स्वचालित रूप से एक मॉडल परिभाषा और LayerMapping शब्दकोश उत्पन्न करता है।

कमांड का सामान्य उपयोग निम्नानुसार है:

$ python manage.py ogrinspect [options] <data_source> <model_name> [options]
...\> py manage.py ogrinspect [options] <data_source> <model_name> [options]

data_source समर्थित डेटा स्रोत का model_name है और model_name मॉडल का उपयोग करने के लिए नाम है। मॉडल कैसे उत्पन्न होता है, इसे परिभाषित करने के लिए कमांड-लाइन विकल्पों का उपयोग किया जा सकता है।

उदाहरण के लिए, निम्न आदेश लगभग WorldBorder मॉडल और ऊपर दिए गए मानचित्रण शब्दकोश को स्वचालित रूप से पुन: प्रस्तुत करता है:

$ python manage.py ogrinspect world/data/TM_WORLD_BORDERS-0.3.shp WorldBorder \
    --srid=4326 --mapping --multi
...\> py manage.py ogrinspect world\data\TM_WORLD_BORDERS-0.3.shp WorldBorder \
    --srid=4326 --mapping --multi

ऊपर दिए गए कमांड-लाइन विकल्पों के बारे में कुछ नोट्स:

  • भौगोलिक क्षेत्र के लिए - SRID --srid=4326 विकल्प SRID सेट करता है।
  • - --mapping ऑप्शन ogrinspect को LayerMapping साथ उपयोग के लिए एक मैपिंग डिक्शनरी भी बताता है।
  • --multi विकल्प इसलिए निर्दिष्ट किया जाता है कि भौगोलिक क्षेत्र केवल MultiPolygonField बजाय एक PolygonField

कमांड निम्न आउटपुट का उत्पादन करती है, जिसे सीधे जियोडजैंगो एप्लिकेशन के मॉडल के साथ कॉपी किया जा सकता है:

# This is an auto-generated Django model module created by ogrinspect.
from django.contrib.gis.db import models

class WorldBorder(models.Model):
    fips = models.CharField(max_length=2)
    iso2 = models.CharField(max_length=2)
    iso3 = models.CharField(max_length=3)
    un = models.IntegerField()
    name = models.CharField(max_length=50)
    area = models.IntegerField()
    pop2005 = models.IntegerField()
    region = models.IntegerField()
    subregion = models.IntegerField()
    lon = models.FloatField()
    lat = models.FloatField()
    geom = models.MultiPolygonField(srid=4326)

# Auto-generated `LayerMapping` dictionary for WorldBorder model
worldborders_mapping = {
    'fips' : 'FIPS',
    'iso2' : 'ISO2',
    'iso3' : 'ISO3',
    'un' : 'UN',
    'name' : 'NAME',
    'area' : 'AREA',
    'pop2005' : 'POP2005',
    'region' : 'REGION',
    'subregion' : 'SUBREGION',
    'lon' : 'LON',
    'lat' : 'LAT',
    'geom' : 'MULTIPOLYGON',
}

स्थानिक प्रश्न

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

GeoDjango Django ORM में स्थानिक रूप जोड़ता है। उदाहरण के लिए, आप देश को WorldBorder टेबल में पा सकते हैं जिसमें एक विशेष बिंदु होता है। सबसे पहले, प्रबंधन शेल को आग दें:

$ python manage.py shell
...\> py manage.py shell

अब, ब्याज की एक बिंदु को परिभाषित करें:

>>> pnt_wkt = 'POINT(-95.3385 29.7245)'

pnt_wkt स्ट्रिंग बिंदु -95.3385 डिग्री देशांतर, 29.7245 डिग्री अक्षांश पर दर्शाती है। ज्यामिति, वेल ज्ञात पाठ (डब्ल्यूकेटी) के रूप में जाना जाता है, जो ओपन जियोस्पेशियल कंसोर्टियम (ओजीसी) द्वारा जारी एक मानक है। [4] WorldBorder मॉडल को आयात करें, और पैरामीटर के रूप में pnt_wkt का उपयोग करके लुकअप करें:

>>> from world.models import WorldBorder
>>> WorldBorder.objects.filter(mpoly__contains=pnt_wkt)
<QuerySet [<WorldBorder: United States>]>

यहां, आपने केवल एक मॉडल के साथ एक QuerySet प्राप्त किया: संयुक्त राज्य की सीमा (वास्तव में आप क्या उम्मीद करेंगे)।

इसी तरह, आप GEOS ज्यामिति ऑब्जेक्ट का उपयोग भी कर सकते हैं। यहाँ, आप एक WorldBorder बजाय सैन मैरिनो के लिए केवल WorldBorder उदाहरण प्राप्त करने के लिए intersects स्थानिक संयोजन को विधि के साथ जोड़ सकते हैं:

>>> from django.contrib.gis.geos import Point
>>> pnt = Point(12.4604, 43.9420)
>>> WorldBorder.objects.get(mpoly__intersects=pnt)
<WorldBorder: San Marino>

इसमें contains और प्रतिरूप लुकअप केवल उपलब्ध क्वेरीज़ का एक सबसेट हैं - GeoDjango Database API प्रलेखन अधिक है।

स्वचालित स्थानिक रूपांतरण

स्थानिक प्रश्न करते समय, GeoDjango स्वचालित रूप से जियोमेट्री को बदल देता है यदि वे एक अलग समन्वय प्रणाली में होते हैं। निम्न उदाहरण में, ईपीएसजी एसआरआईडी 32140 में निर्देशांक व्यक्त किया जाएगा, केवल दक्षिण टेक्सास और मीटर की इकाइयों में विशिष्ट एक समन्वय प्रणाली, डिग्री नहीं:

>>> from django.contrib.gis.geos import GEOSGeometry, Point
>>> pnt = Point(954158.1, 4215137.1, srid=32140)

ध्यान दें कि EWT के साथ pnt का भी निर्माण किया जा सकता है, जो WKT का "विस्तारित" रूप है जिसमें SRID शामिल है:

>>> pnt = GEOSGeometry('SRID=32140;POINT(954158.1 4215137.1)')

GeoDjango के ORM स्वचालित रूप से एसक्यूएल में ज्यामिति मूल्यों को लपेटेंगे, जिससे डेवलपर को अमूर्तता के उच्च स्तर पर काम करने की अनुमति मिलेगी:

>>> qs = WorldBorder.objects.filter(mpoly__intersects=pnt)
>>> print(qs.query) # Generating the SQL
SELECT "world_worldborder"."id", "world_worldborder"."name", "world_worldborder"."area",
"world_worldborder"."pop2005", "world_worldborder"."fips", "world_worldborder"."iso2",
"world_worldborder"."iso3", "world_worldborder"."un", "world_worldborder"."region",
"world_worldborder"."subregion", "world_worldborder"."lon", "world_worldborder"."lat",
"world_worldborder"."mpoly" FROM "world_worldborder"
WHERE ST_Intersects("world_worldborder"."mpoly", ST_Transform(%s, 4326))
>>> qs # printing evaluates the queryset
<QuerySet [<WorldBorder: United States>]>

कच्चे प्रश्न

कच्चे प्रश्नों का उपयोग करते समय, आपको अपने ज्यामिति फ़ील्ड को लपेटना चाहिए ताकि फ़ील्ड मान GEOS द्वारा पहचाना जा सके:

from django.db import connection
# or if you're querying a non-default database:
from django.db import connections
connection = connections['your_gis_db_alias']

City.objects.raw('SELECT id, name, %s as point from myapp_city' % (connection.ops.select % 'point'))

आपको केवल तभी कच्चे प्रश्नों का उपयोग करना चाहिए जब आपको पता हो कि आप क्या कर रहे हैं।

आलसी ज्यामितीय

GeoDjango एक मानकीकृत पाठ प्रतिनिधित्व में ज्यामिति लोड करता है। जब ज्योमेट्री फ़ील्ड पहले एक्सेस की जाती है, तो जियोडजैंगो एक GEOSGeometry ऑब्जेक्ट बनाता है, जो शक्तिशाली कार्यक्षमता को उजागर करता है, जैसे कि लोकप्रिय भू-स्थानिक प्रारूपों के लिए क्रमबद्धता गुण:

>>> sm = WorldBorder.objects.get(name='San Marino')
>>> sm.mpoly
<MultiPolygon object at 0x24c6798>
>>> sm.mpoly.wkt # WKT
MULTIPOLYGON (((12.4157980000000006 43.9579540000000009, 12.4505540000000003 43.9797209999999978, ...
>>> sm.mpoly.wkb # WKB (as Python binary buffer)
<read-only buffer for 0x1fe2c70, size -1, offset 0 at 0x2564c40>
>>> sm.mpoly.geojson # GeoJSON
'{ "type": "MultiPolygon", "coordinates": [ [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...

इसमें GEOS लाइब्रेरी द्वारा प्रदान किए गए सभी उन्नत ज्यामितीय परिचालनों तक पहुंच शामिल है:

>>> pnt = Point(12.4604, 43.9420)
>>> sm.mpoly.contains(pnt)
True
>>> pnt.contains(sm.mpoly)
False

भौगोलिक एनोटेशन

GeoDjango भी दूरी और कई अन्य संचालन (चौराहे, अंतर, आदि) की गणना करने के लिए भौगोलिक एनोटेशन का एक सेट प्रदान करता है। भौगोलिक डेटाबेस कार्य दस्तावेज़ देखें।

अपना डेटा मैप पर डालना

भौगोलिक प्रशासन

जियोडजैंगो जियोमेट्री के एडिटिंग एप्लीकेशन को ज्योमेट्री फील्ड के लिए सपोर्ट के साथ बढ़ाता है।

मूल बातें

GeoDjango उपयोगकर्ताओं को जावास्क्रिप्ट स्लिपी मानचित्र ( OpenLayers द्वारा संचालित) पर ज्यामितीय बनाने और संशोधित करने की अनुमति देकर Django व्यवस्थापक को भी पूरक करता है।

चलो सही में गोता admin.py । निम्नलिखित कोड के साथ world अनुप्रयोग के अंदर admin.py नामक एक फ़ाइल बनाएँ:

from django.contrib.gis import admin
from .models import WorldBorder

admin.site.register(WorldBorder, admin.GeoModelAdmin)

इसके बाद, अपने urls.py को geodjango एप्लिकेशन फ़ोल्डर में निम्नानुसार संपादित करें:

from django.contrib.gis import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
]

एक व्यवस्थापक उपयोगकर्ता बनाएँ:

$ python manage.py createsuperuser
...\> py manage.py createsuperuser

अगला, Django विकास सर्वर शुरू करें:

$ python manage.py runserver
...\> py manage.py runserver

अंत में, ब्राउज़ करें http://localhost:8000/admin/ , और आपके द्वारा बनाए गए उपयोगकर्ता के साथ लॉग इन करें। किसी भी WorldBorder प्रविष्टियों के लिए ब्राउज़ करें - सीमाओं को बहुभुज पर क्लिक करके और कोने को वांछित स्थिति तक खींचकर संपादित किया जा सकता है।

OSMGeoAdmin

OSMGeoAdmin साथ, OSMGeoAdmin एडमिन में एक ओपन स्ट्रीट मैप लेयर का उपयोग करता है। यह GeoModelAdmin (जो OSGeo पर होस्ट किए गए वेक्टर मैप लेवल 0 WMS डेटासेट का उपयोग करता है) की तुलना में अधिक संदर्भ (सड़क और अच्छी तरह से विवरण सहित) प्रदान करता है।

PROJ.4 डेटम शिफ्टिंग फ़ाइलों को स्थापित किया जाना चाहिए (अधिक विवरण के लिए PROJ.4 इंस्टॉलेशन निर्देश देखें)।

यदि आप इस आवश्यकता को पूरा करते हैं, तो अपनी व्यवस्थापक फ़ाइल में बस OSMGeoAdmin विकल्प वर्ग स्थानापन्न करें:

admin.site.register(WorldBorder, admin.OSMGeoAdmin)

फुटनोट

[1] इस डेटासेट को प्रदान करने और बनाए रखने के लिए thematicmapping.org के Bjørn Sandvik का विशेष धन्यवाद।
[2] जियोडजैंगो के बुनियादी ऐप डेन स्प्रिंगमेयर, जोश लिवनी और क्रिस्टोफर श्मिट द्वारा लिखे गए थे।
[3] यह बिंदु यूनिवर्सिटी ऑफ ह्यूस्टन लॉ सेंटर है
[4] ओपन जियोस्पेशियल कंसोर्टियम, इंक, एसक्यूएल के लिए ओपनजीएस सिंपल फीचर स्पेसिफिकेशन