forked from django/django
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed #28232 -- Made raster metadata readable and writable on GDALRas…
…ter/Band.
- Loading branch information
Showing
8 changed files
with
263 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
from django.contrib.gis.gdal.base import GDALBase | ||
from django.contrib.gis.gdal.prototypes import raster as capi | ||
|
||
|
||
class GDALRasterBase(GDALBase): | ||
""" | ||
Attributes that exist on both GDALRaster and GDALBand. | ||
""" | ||
@property | ||
def metadata(self): | ||
""" | ||
Return the metadata for this raster or band. The return value is a | ||
nested dictionary, where the first-level key is the metadata domain and | ||
the second-level is the metadata item names and values for that domain. | ||
""" | ||
if not capi.get_ds_metadata_domain_list: | ||
raise ValueError('GDAL ≥ 1.11 is required for using the metadata property.') | ||
|
||
# The initial metadata domain list contains the default domain. | ||
# The default is returned if domain name is None. | ||
domain_list = ['DEFAULT'] | ||
|
||
# Get additional metadata domains from the raster. | ||
meta_list = capi.get_ds_metadata_domain_list(self._ptr) | ||
if meta_list: | ||
# The number of domains is unknown, so retrieve data until there | ||
# are no more values in the ctypes array. | ||
counter = 0 | ||
domain = meta_list[counter] | ||
while domain: | ||
domain_list.append(domain.decode()) | ||
counter += 1 | ||
domain = meta_list[counter] | ||
|
||
# Free domain list array. | ||
capi.free_dsl(meta_list) | ||
|
||
# Retrieve metadata values for each domain. | ||
result = {} | ||
for domain in domain_list: | ||
# Get metadata for this domain. | ||
data = capi.get_ds_metadata( | ||
self._ptr, | ||
(None if domain == 'DEFAULT' else domain.encode()), | ||
) | ||
if not data: | ||
continue | ||
# The number of metadata items is unknown, so retrieve data until | ||
# there are no more values in the ctypes array. | ||
domain_meta = {} | ||
counter = 0 | ||
item = data[counter] | ||
while item: | ||
key, val = item.decode().split('=') | ||
domain_meta[key] = val | ||
counter += 1 | ||
item = data[counter] | ||
# The default domain values are returned if domain is None. | ||
result[domain if domain else 'DEFAULT'] = domain_meta | ||
return result | ||
|
||
@metadata.setter | ||
def metadata(self, value): | ||
""" | ||
Set the metadata. Update only the domains that are contained in the | ||
value dictionary. | ||
""" | ||
# Loop through domains. | ||
for domain, metadata in value.items(): | ||
# Set the domain to None for the default, otherwise encode. | ||
domain = None if domain == 'DEFAULT' else domain.encode() | ||
# Set each metadata entry separately. | ||
for meta_name, meta_value in metadata.items(): | ||
capi.set_ds_metadata_item( | ||
self._ptr, meta_name.encode(), | ||
meta_value.encode() if meta_value else None, | ||
domain, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.