API Model GeoDjango¶
Dokumen ini menjelajahi rincian dari API Model GeoDjango. Melalui bagian ini, kami akan menggunakan model geografis berikut dari ZIP code dan Digital Elevation Model seperti contoh kami:
from django.contrib.gis.db import models
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
class Elevation(models.Model):
name = models.CharField(max_length=100)
rast = models.RasterField()
Jenis Bidang Spasial¶
Bidang-bidang spasial terdiri dari deretan dari jenis bidang geometri dan satu jenis bidang raster. Setiap jenis-jenis bidang geometri sesuai pada spesifikasi OpenGIS Simple Features [1]. Tidak ada standar untuk data raster.
RasterField
¶
-
class
RasterField
¶
Menyimpan GDALRaster
.
RasterField
saat ini hanya diterapkan untuk backend PostGIS.
Pilihan Bidang Spasial¶
Sebagai tambahan pada Pilihan bidang biasa tersedia untuk bidang model Django, bidang-bidang spasial mempunyai pilihan tambahan berikut. Semua adalah pilihan.
srid
¶
-
BaseSpatialField.
srid
¶
Setel SRID [2] (Spatial Reference System Identity) dari bidang geometri pada nilai diberikan. Awalan pada 4326 (juga dikenal sebagai WGS84, satuan-satuan adalah dalam derajat dari garis bujur dan garis lintang).
Memilih sebuah SRID¶
Choosing an appropriate SRID for your model is an important decision that the developer should consider carefully. The SRID is an integer specifier that corresponds to the projection system that will be used to interpret the data in the spatial database. [3] Projection systems give the context to the coordinates that specify a location. Although the details of geodesy are beyond the scope of this documentation, the general problem is that the earth is spherical and representations of the earth (e.g., paper maps, web maps) are not.
Kebanyakan orang akrab dengan menggunakan garis lintang dan bujur untuk mengacu sebuah lokasi pada permukaan bumi. Bagaimanapun, garis lintang dan bujur adalah sudut, bukan jarak. Dengan kata lain, selagi jalur terpendek diantara dua titik pada permukaan datar adalah garis lurus, jalur terpendek diantara dua titik pada permukaan melengkung (seperti bumi) adalah sebuah arc dari great circle. [4] Dengan demikian, perhitungan tambahan diwajibkan untu mendapatkan jarak dalam satuan planar (misalnya, kilometer dan mil). menggunakan sistem kordinat geografis mungkin memperkenalkan kerumitan untuk pengembang kemudian. Sebagai contoh, SpatiaLite tidak mempunyai kemampuan melakukan perhitungan jarak diantara geometri menggunakan sistem kordinat geometri, misalnya membangun sebuah permintaan untuk menemukan semua titik dalam 5 mil dari batasan daerah disimpan sebagai WGS84. [5]
Bagian-bagian dari permukaan bumi mungkin diproyeksikan menjadi dua-dimensi, atau kartesian, bidang. Sistem kordinat proyeksi adalah khususnya meyakinkan untuk aplikasi wilayah-tertentu, misalnya, jika anda mengetahui bahwa basisdata anda hanya mencangkup geometri dalam North Kansas, kemudian anda mungkin mempertimbangkan sistem proyeksi spesifik ke wilayah itu. Terlebih lagi, sistem kordinat proyeksi ditentukan dalam satuan kartesian (seperti meter atau kaki), melonggarkan perhitungan jarak.
Catatan
Jika anda berharap melakukan permintaan jarak berubah-ubah menggunakan geometri bukan-titik dalam WGS84 di PostGIS dan anda ingin penampilan layak, adakan kata kunci GeometryField.geography
sehingga geography database type digunakan sebagai gantinya.
Sumber daya Tambahan:
- spatialreference.org: Sebuah basisdata ditenagai-Django dari sistem acuan spasial.
- The State Plane Coordinate System: Sebuah situs jaringan mencangkup beragam sistem proyeksi digunakan dalam Amerika Serikat. Banyak ditemui data spasial AS akan menjadi satu dari sistem kordinat ini daripada dalam sistem kordinat geografis seperti WGS84.
spatial_index
¶
-
BaseSpatialField.
spatial_index
¶
Awalan pada True
. Membuat indeks spasial untuk bidang geometri yang diberikan.
Catatan
Ini berbeda dari pilihan bidang db_index karena indeks spasial dibuat dalam perilaku berbeda dari indeks basisdata biasa. Secara khusus, indeks spasial adalah khusus dibuat menggunakan ragam dari R-tree, selagi indeks basisdata biasa khususnya menggunakan B-tree.
Pilihan Bidang Geometri¶
Ada pilihan tambahan tersedia untuk bidang Geometri. Semua pilihan berikut adalah pilihan.
dim
¶
-
GeometryField.
dim
¶
Pilihan ini mungkin digunakan untuk menyesuaikan dimensi kordinat dari bidang geometri. Secara awalan, itu menyetel ke 2, untuk perwakilan geometri dua-dimensi. Untuk backend spasial yang mendukung itu, itu mungkin disetel menjadi 3 untuk dukungan 3-dimensi.
Catatan
At this time 3D support is limited to the PostGIS and SpatiaLite backends.
geography
¶
-
GeometryField.
geography
¶
Jika disetel menjadi True
, pilihan ini akan membuat sebuah kolom basisdata dari jenis geografi, daripada geometri. Harap mengacu pada bagian geography type dibawah untuk lebih rinci.
Catatan
Dukungan geografi adalah terbatas pada PostGIS dan akan memaksa SRID menjadi 4326.
Jenis Geografi¶
Jenis geografi menyediakan dukungan asli untuk fitur-fitur spasial diwakili dengan kordinat geografis (misalnya, bujur/lintang WGS84). [6] Tidak seperti plane digunakan oleh jenis geometri, jenis geografi menggunakan perwakilan bulat dari datanya. jarak dan tindakan pengukuran dilakukan pada kolom geografis secara otomatis menggunakan perhitungan busur lingkaran hebat dan mengembalikan satuan segaris. Dengan kata lain, ketika ST_Distance
dipanggil pada dua geografis, sebuah nilai dalam meter dikembalikan (sebagai lawan dari tingkatan jika dipanggil pada kolom geometri dalam WGS84).
Karena perhitungan geografis melibatkan matematika lebih, hanya bagian dari pencarian spasial PostGIS tersedia untuk jenis geografi. Secara praktik, ini berarti bahwa sebagai tambahan pada distance lookups hanya berikut tambahan spatial lookups tersedia untuk kolom geografi:
Jika anda butuh menggunakan pencarian spasial atau pengumpulan yang tidak mendukung jenis geografi sebagai masukan, anda dapat menggunakan fungsi basisdata Cast
untuk merubah kolom geografi menjadi jenis geometri dalam permintaan:
from django.contrib.gis.db.models import PointField
from django.db.models.functions import Cast
Zipcode.objects.annotate(
geom=Cast('geography_field', PointField())
).filter(geom__within=poly)
Untuk informasi lebih, dokumentasi PostGIS mengandung bagian membantu pada menentukan when to use geography data type over geometry data type.
Catatan kaki
[1] | OpenGIS Consortium, Inc., Simple Feature Specification For SQL. |
[2] | Lihat id. pada Ch. 2.3.8, p. 39 (Nilai Geometri dan Sustem Acuan Spasial). |
[3] | Typically, SRID integer corresponds to an EPSG (European Petroleum Survey Group) identifier. However, it may also be associated with custom projections defined in spatial database's spatial reference systems table. |
[4] | Terry A. Slocum, Robert B. McMaster, Fritz C. Kessler, & Hugh H. Howard, Thematic Cartography and Geographic Visualization (Prentice Hall, edisi ke 2), pada Bab 7.1.3. |
[5] | Batasan ini tidak berlaku pada PostGIS. |
[6] | Harap mengacu ke dokumentasi PostGIS Geography Type untuk rincian lebih. |