Added GDAL 2.0 support
This commit is contained in:
parent
9368f51e12
commit
ffdf507ec0
|
@ -49,9 +49,12 @@ class Field(GDALBase):
|
||||||
"Retrieves the Field's value as a double (float)."
|
"Retrieves the Field's value as a double (float)."
|
||||||
return capi.get_field_as_double(self._feat.ptr, self._index)
|
return capi.get_field_as_double(self._feat.ptr, self._index)
|
||||||
|
|
||||||
def as_int(self):
|
def as_int(self, is_64=False):
|
||||||
"Retrieves the Field's value as an integer."
|
"Retrieves the Field's value as an integer."
|
||||||
return capi.get_field_as_integer(self._feat.ptr, self._index)
|
if is_64:
|
||||||
|
return capi.get_field_as_integer64(self._feat.ptr, self._index)
|
||||||
|
else:
|
||||||
|
return capi.get_field_as_integer(self._feat.ptr, self._index)
|
||||||
|
|
||||||
def as_string(self):
|
def as_string(self):
|
||||||
"Retrieves the Field's value as a string."
|
"Retrieves the Field's value as a string."
|
||||||
|
@ -106,6 +109,7 @@ class Field(GDALBase):
|
||||||
# ### The Field sub-classes for each OGR Field type. ###
|
# ### The Field sub-classes for each OGR Field type. ###
|
||||||
class OFTInteger(Field):
|
class OFTInteger(Field):
|
||||||
_double = False
|
_double = False
|
||||||
|
_bit64 = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def value(self):
|
def value(self):
|
||||||
|
@ -115,7 +119,7 @@ class OFTInteger(Field):
|
||||||
# read as a double and cast as Python int (to prevent overflow).
|
# read as a double and cast as Python int (to prevent overflow).
|
||||||
return int(self.as_double())
|
return int(self.as_double())
|
||||||
else:
|
else:
|
||||||
return self.as_int()
|
return self.as_int(self._bit64)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type(self):
|
def type(self):
|
||||||
|
@ -185,6 +189,10 @@ class OFTTime(Field):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class OFTInteger64(OFTInteger):
|
||||||
|
_bit64 = True
|
||||||
|
|
||||||
|
|
||||||
# List fields are also just subclasses
|
# List fields are also just subclasses
|
||||||
class OFTIntegerList(Field):
|
class OFTIntegerList(Field):
|
||||||
pass
|
pass
|
||||||
|
@ -201,6 +209,11 @@ class OFTStringList(Field):
|
||||||
class OFTWideStringList(Field):
|
class OFTWideStringList(Field):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class OFTInteger64List(Field):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# Class mapping dictionary for OFT Types and reverse mapping.
|
# Class mapping dictionary for OFT Types and reverse mapping.
|
||||||
OGRFieldTypes = {
|
OGRFieldTypes = {
|
||||||
0: OFTInteger,
|
0: OFTInteger,
|
||||||
|
@ -215,5 +228,8 @@ OGRFieldTypes = {
|
||||||
9: OFTDate,
|
9: OFTDate,
|
||||||
10: OFTTime,
|
10: OFTTime,
|
||||||
11: OFTDateTime,
|
11: OFTDateTime,
|
||||||
|
# New 64-bit integer types in GDAL 2
|
||||||
|
12: OFTInteger64,
|
||||||
|
13: OFTInteger64List,
|
||||||
}
|
}
|
||||||
ROGRFieldTypes = {cls: num for num, cls in OGRFieldTypes.items()}
|
ROGRFieldTypes = {cls: num for num, cls in OGRFieldTypes.items()}
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
from ctypes import POINTER, c_char_p, c_double, c_int, c_long, c_void_p
|
from ctypes import POINTER, c_char_p, c_double, c_int, c_long, c_void_p
|
||||||
|
|
||||||
from django.contrib.gis.gdal.envelope import OGREnvelope
|
from django.contrib.gis.gdal.envelope import OGREnvelope
|
||||||
from django.contrib.gis.gdal.libgdal import lgdal
|
from django.contrib.gis.gdal.libgdal import GDAL_VERSION, lgdal
|
||||||
from django.contrib.gis.gdal.prototypes.generation import (
|
from django.contrib.gis.gdal.prototypes.generation import (
|
||||||
const_string_output, double_output, geom_output, int_output, srs_output,
|
const_string_output, double_output, geom_output, int64_output, int_output,
|
||||||
void_output, voidptr_output,
|
srs_output, void_output, voidptr_output,
|
||||||
)
|
)
|
||||||
|
|
||||||
c_int_p = POINTER(c_int) # shortcut type
|
c_int_p = POINTER(c_int) # shortcut type
|
||||||
|
@ -66,6 +66,8 @@ get_field_as_datetime = int_output(lgdal.OGR_F_GetFieldAsDateTime,
|
||||||
)
|
)
|
||||||
get_field_as_double = double_output(lgdal.OGR_F_GetFieldAsDouble, [c_void_p, c_int])
|
get_field_as_double = double_output(lgdal.OGR_F_GetFieldAsDouble, [c_void_p, c_int])
|
||||||
get_field_as_integer = int_output(lgdal.OGR_F_GetFieldAsInteger, [c_void_p, c_int])
|
get_field_as_integer = int_output(lgdal.OGR_F_GetFieldAsInteger, [c_void_p, c_int])
|
||||||
|
if GDAL_VERSION >= (2, 0):
|
||||||
|
get_field_as_integer64 = int64_output(lgdal.OGR_F_GetFieldAsInteger64, [c_void_p, c_int])
|
||||||
get_field_as_string = const_string_output(lgdal.OGR_F_GetFieldAsString, [c_void_p, c_int])
|
get_field_as_string = const_string_output(lgdal.OGR_F_GetFieldAsString, [c_void_p, c_int])
|
||||||
get_field_index = int_output(lgdal.OGR_F_GetFieldIndex, [c_void_p, c_char_p])
|
get_field_index = int_output(lgdal.OGR_F_GetFieldIndex, [c_void_p, c_char_p])
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
This module contains functions that generate ctypes prototypes for the
|
This module contains functions that generate ctypes prototypes for the
|
||||||
GDAL routines.
|
GDAL routines.
|
||||||
"""
|
"""
|
||||||
from ctypes import c_char_p, c_double, c_int, c_void_p
|
from ctypes import c_char_p, c_double, c_int, c_int64, c_void_p
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from django.contrib.gis.gdal.prototypes.errcheck import (
|
from django.contrib.gis.gdal.prototypes.errcheck import (
|
||||||
|
@ -56,6 +56,13 @@ def int_output(func, argtypes):
|
||||||
return func
|
return func
|
||||||
|
|
||||||
|
|
||||||
|
def int64_output(func, argtypes):
|
||||||
|
"Generates a ctypes function that returns a 64-bit integer value."
|
||||||
|
func.argtypes = argtypes
|
||||||
|
func.restype = c_int64
|
||||||
|
return func
|
||||||
|
|
||||||
|
|
||||||
def srs_output(func, argtypes):
|
def srs_output(func, argtypes):
|
||||||
"""
|
"""
|
||||||
Generates a ctypes prototype for the given function with
|
Generates a ctypes prototype for the given function with
|
||||||
|
|
|
@ -5,7 +5,7 @@ related data structures.
|
||||||
from ctypes import POINTER, c_char_p, c_double, c_int, c_void_p
|
from ctypes import POINTER, c_char_p, c_double, c_int, c_void_p
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from django.contrib.gis.gdal.libgdal import std_call
|
from django.contrib.gis.gdal.libgdal import GDAL_VERSION, std_call
|
||||||
from django.contrib.gis.gdal.prototypes.generation import (
|
from django.contrib.gis.gdal.prototypes.generation import (
|
||||||
const_string_output, double_output, int_output, void_output,
|
const_string_output, double_output, int_output, void_output,
|
||||||
voidptr_output,
|
voidptr_output,
|
||||||
|
@ -30,7 +30,10 @@ get_driver_description = const_string_output(std_call('GDALGetDescription'), [c_
|
||||||
# Raster Data Source Routines
|
# Raster Data Source Routines
|
||||||
create_ds = voidptr_output(std_call('GDALCreate'), [c_void_p, c_char_p, c_int, c_int, c_int, c_int, c_void_p])
|
create_ds = voidptr_output(std_call('GDALCreate'), [c_void_p, c_char_p, c_int, c_int, c_int, c_int, c_void_p])
|
||||||
open_ds = voidptr_output(std_call('GDALOpen'), [c_char_p, c_int])
|
open_ds = voidptr_output(std_call('GDALOpen'), [c_char_p, c_int])
|
||||||
close_ds = void_output(std_call('GDALClose'), [c_void_p])
|
if GDAL_VERSION >= (2, 0):
|
||||||
|
close_ds = voidptr_output(std_call('GDALClose'), [c_void_p])
|
||||||
|
else:
|
||||||
|
close_ds = void_output(std_call('GDALClose'), [c_void_p])
|
||||||
flush_ds = int_output(std_call('GDALFlushCache'), [c_void_p])
|
flush_ds = int_output(std_call('GDALFlushCache'), [c_void_p])
|
||||||
copy_ds = voidptr_output(std_call('GDALCreateCopy'),
|
copy_ds = voidptr_output(std_call('GDALCreateCopy'),
|
||||||
[c_void_p, c_char_p, c_void_p, c_int, POINTER(c_char_p), c_void_p, c_void_p]
|
[c_void_p, c_char_p, c_void_p, c_int, POINTER(c_char_p), c_void_p, c_void_p]
|
||||||
|
|
|
@ -5,7 +5,8 @@ models for GeoDjango and/or mapping dictionaries for use with the
|
||||||
"""
|
"""
|
||||||
from django.contrib.gis.gdal import DataSource
|
from django.contrib.gis.gdal import DataSource
|
||||||
from django.contrib.gis.gdal.field import (
|
from django.contrib.gis.gdal.field import (
|
||||||
OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime,
|
OFTDate, OFTDateTime, OFTInteger, OFTInteger64, OFTReal, OFTString,
|
||||||
|
OFTTime,
|
||||||
)
|
)
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
from django.utils.six.moves import zip
|
from django.utils.six.moves import zip
|
||||||
|
@ -195,6 +196,8 @@ def _ogrinspect(data_source, model_name, geom_name='geom', layer_key=0, srid=Non
|
||||||
yield ' %s = models.FloatField(%s)' % (mfield, kwargs_str[2:])
|
yield ' %s = models.FloatField(%s)' % (mfield, kwargs_str[2:])
|
||||||
elif field_type is OFTInteger:
|
elif field_type is OFTInteger:
|
||||||
yield ' %s = models.IntegerField(%s)' % (mfield, kwargs_str[2:])
|
yield ' %s = models.IntegerField(%s)' % (mfield, kwargs_str[2:])
|
||||||
|
elif field_type is OFTInteger64:
|
||||||
|
yield ' %s = models.BigIntegerField(%s)' % (mfield, kwargs_str[2:])
|
||||||
elif field_type is OFTString:
|
elif field_type is OFTString:
|
||||||
yield ' %s = models.CharField(max_length=%s%s)' % (mfield, width, kwargs_str)
|
yield ' %s = models.CharField(max_length=%s%s)' % (mfield, width, kwargs_str)
|
||||||
elif field_type is OFTDate:
|
elif field_type is OFTDate:
|
||||||
|
|
|
@ -10,7 +10,7 @@ Program Description Required
|
||||||
======================== ==================================== ================================ ============================
|
======================== ==================================== ================================ ============================
|
||||||
:doc:`GEOS <../geos>` Geometry Engine Open Source Yes 3.4, 3.3, 3.2
|
:doc:`GEOS <../geos>` Geometry Engine Open Source Yes 3.4, 3.3, 3.2
|
||||||
`PROJ.4`_ Cartographic Projections library Yes (PostgreSQL and SQLite only) 4.9, 4.8, 4.7, 4.6, 4.5, 4.4
|
`PROJ.4`_ Cartographic Projections library Yes (PostgreSQL and SQLite only) 4.9, 4.8, 4.7, 4.6, 4.5, 4.4
|
||||||
:doc:`GDAL <../gdal>` Geospatial Data Abstraction Library Yes (SQLite only) 1.11, 1.10, 1.9, 1.8, 1.7
|
:doc:`GDAL <../gdal>` Geospatial Data Abstraction Library Yes (SQLite only) 2.0, 1.11, 1.10, 1.9, 1.8, 1.7
|
||||||
:doc:`GeoIP <../geoip>` IP-based geolocation library No 1.4
|
:doc:`GeoIP <../geoip>` IP-based geolocation library No 1.4
|
||||||
`PostGIS`__ Spatial extensions for PostgreSQL Yes (PostgreSQL only) 2.1, 2.0
|
`PostGIS`__ Spatial extensions for PostgreSQL Yes (PostgreSQL only) 2.1, 2.0
|
||||||
`SpatiaLite`__ Spatial extensions for SQLite Yes (SQLite only) 4.1, 4.0, 3.0, 2.4
|
`SpatiaLite`__ Spatial extensions for SQLite Yes (SQLite only) 4.1, 4.0, 3.0, 2.4
|
||||||
|
|
|
@ -27,7 +27,8 @@ if HAS_GDAL:
|
||||||
},
|
},
|
||||||
fids=range(5)
|
fids=range(5)
|
||||||
),
|
),
|
||||||
TestDS('test_vrt', ext='vrt', nfeat=3, nfld=3, geom='POINT', gtype='Point25D', driver='VRT',
|
TestDS('test_vrt', ext='vrt', nfeat=3, nfld=3, geom='POINT', gtype='Point25D',
|
||||||
|
driver='OGR_VRT' if GDAL_VERSION >= (2, 0) else 'VRT',
|
||||||
fields={
|
fields={
|
||||||
'POINT_X': OFTString,
|
'POINT_X': OFTString,
|
||||||
'POINT_Y': OFTString,
|
'POINT_Y': OFTString,
|
||||||
|
|
|
@ -14,7 +14,7 @@ from django.utils.six import StringIO
|
||||||
from ..test_data import TEST_DATA
|
from ..test_data import TEST_DATA
|
||||||
|
|
||||||
if HAS_GDAL:
|
if HAS_GDAL:
|
||||||
from django.contrib.gis.gdal import Driver, GDALException
|
from django.contrib.gis.gdal import Driver, GDALException, GDAL_VERSION
|
||||||
from django.contrib.gis.utils.ogrinspect import ogrinspect
|
from django.contrib.gis.utils.ogrinspect import ogrinspect
|
||||||
|
|
||||||
from .models import AllOGRFields
|
from .models import AllOGRFields
|
||||||
|
@ -79,7 +79,7 @@ class OGRInspectTest(TestCase):
|
||||||
'',
|
'',
|
||||||
'class MyModel(models.Model):',
|
'class MyModel(models.Model):',
|
||||||
' float = models.FloatField()',
|
' float = models.FloatField()',
|
||||||
' int = models.FloatField()',
|
' int = models.{}()'.format('BigIntegerField' if GDAL_VERSION >= (2, 0) else 'FloatField'),
|
||||||
' str = models.CharField(max_length=80)',
|
' str = models.CharField(max_length=80)',
|
||||||
' geom = models.PolygonField(srid=-1)',
|
' geom = models.PolygonField(srid=-1)',
|
||||||
' objects = models.GeoManager()',
|
' objects = models.GeoManager()',
|
||||||
|
@ -106,7 +106,7 @@ class OGRInspectTest(TestCase):
|
||||||
'',
|
'',
|
||||||
'class City(models.Model):',
|
'class City(models.Model):',
|
||||||
' name = models.CharField(max_length=80)',
|
' name = models.CharField(max_length=80)',
|
||||||
' population = models.FloatField()',
|
' population = models.{}()'.format('BigIntegerField' if GDAL_VERSION >= (2, 0) else 'FloatField'),
|
||||||
' density = models.FloatField()',
|
' density = models.FloatField()',
|
||||||
' created = models.DateField()',
|
' created = models.DateField()',
|
||||||
' geom = models.PointField(srid=-1)',
|
' geom = models.PointField(srid=-1)',
|
||||||
|
|
Loading…
Reference in New Issue