Fixed #26736 -- Fixed crashes in SpatialReference with non-ASCII characters.
This commit is contained in:
parent
cd88faa628
commit
6928ad184e
|
@ -54,18 +54,18 @@ linear_units = units_func(lgdal.OSRGetLinearUnits)
|
||||||
angular_units = units_func(lgdal.OSRGetAngularUnits)
|
angular_units = units_func(lgdal.OSRGetAngularUnits)
|
||||||
|
|
||||||
# For exporting to WKT, PROJ.4, "Pretty" WKT, and XML.
|
# For exporting to WKT, PROJ.4, "Pretty" WKT, and XML.
|
||||||
to_wkt = string_output(std_call('OSRExportToWkt'), [c_void_p, POINTER(c_char_p)], decoding='ascii')
|
to_wkt = string_output(std_call('OSRExportToWkt'), [c_void_p, POINTER(c_char_p)], decoding='utf-8')
|
||||||
to_proj = string_output(std_call('OSRExportToProj4'), [c_void_p, POINTER(c_char_p)], decoding='ascii')
|
to_proj = string_output(std_call('OSRExportToProj4'), [c_void_p, POINTER(c_char_p)], decoding='ascii')
|
||||||
to_pretty_wkt = string_output(
|
to_pretty_wkt = string_output(
|
||||||
std_call('OSRExportToPrettyWkt'),
|
std_call('OSRExportToPrettyWkt'),
|
||||||
[c_void_p, POINTER(c_char_p), c_int], offset=-2, decoding='ascii'
|
[c_void_p, POINTER(c_char_p), c_int], offset=-2, decoding='utf-8'
|
||||||
)
|
)
|
||||||
|
|
||||||
# Memory leak fixed in GDAL 1.5; still exists in 1.4.
|
# Memory leak fixed in GDAL 1.5; still exists in 1.4.
|
||||||
to_xml = string_output(lgdal.OSRExportToXML, [c_void_p, POINTER(c_char_p), c_char_p], offset=-2, decoding='ascii')
|
to_xml = string_output(lgdal.OSRExportToXML, [c_void_p, POINTER(c_char_p), c_char_p], offset=-2, decoding='utf-8')
|
||||||
|
|
||||||
# String attribute retrival routines.
|
# String attribute retrival routines.
|
||||||
get_attr_value = const_string_output(std_call('OSRGetAttrValue'), [c_void_p, c_char_p, c_int], decoding='ascii')
|
get_attr_value = const_string_output(std_call('OSRGetAttrValue'), [c_void_p, c_char_p, c_int], decoding='utf-8')
|
||||||
get_auth_name = const_string_output(lgdal.OSRGetAuthorityName, [c_void_p, c_char_p], decoding='ascii')
|
get_auth_name = const_string_output(lgdal.OSRGetAuthorityName, [c_void_p, c_char_p], decoding='ascii')
|
||||||
get_auth_code = const_string_output(lgdal.OSRGetAuthorityCode, [c_void_p, c_char_p], decoding='ascii')
|
get_auth_code = const_string_output(lgdal.OSRGetAuthorityCode, [c_void_p, c_char_p], decoding='ascii')
|
||||||
|
|
||||||
|
|
|
@ -55,9 +55,6 @@ class SpatialReference(GDALBase):
|
||||||
self.import_wkt(srs_input)
|
self.import_wkt(srs_input)
|
||||||
return
|
return
|
||||||
elif isinstance(srs_input, six.string_types):
|
elif isinstance(srs_input, six.string_types):
|
||||||
# Encoding to ASCII if unicode passed in.
|
|
||||||
if isinstance(srs_input, six.text_type):
|
|
||||||
srs_input = srs_input.encode('ascii')
|
|
||||||
try:
|
try:
|
||||||
# If SRID is a string, e.g., '4326', then make acceptable
|
# If SRID is a string, e.g., '4326', then make acceptable
|
||||||
# as user input.
|
# as user input.
|
||||||
|
@ -297,7 +294,7 @@ class SpatialReference(GDALBase):
|
||||||
|
|
||||||
def import_wkt(self, wkt):
|
def import_wkt(self, wkt):
|
||||||
"Imports the Spatial Reference from OGC WKT (string)"
|
"Imports the Spatial Reference from OGC WKT (string)"
|
||||||
capi.from_wkt(self.ptr, byref(c_char_p(wkt)))
|
capi.from_wkt(self.ptr, byref(c_char_p(force_bytes(wkt))))
|
||||||
|
|
||||||
def import_xml(self, xml):
|
def import_xml(self, xml):
|
||||||
"Imports the Spatial Reference from an XML string."
|
"Imports the Spatial Reference from an XML string."
|
||||||
|
@ -327,7 +324,7 @@ class SpatialReference(GDALBase):
|
||||||
@property
|
@property
|
||||||
def xml(self, dialect=''):
|
def xml(self, dialect=''):
|
||||||
"Returns the XML representation of this Spatial Reference."
|
"Returns the XML representation of this Spatial Reference."
|
||||||
return capi.to_xml(self.ptr, byref(c_char_p()), dialect)
|
return capi.to_xml(self.ptr, byref(c_char_p()), force_bytes(dialect))
|
||||||
|
|
||||||
|
|
||||||
class CoordTransform(GDALBase):
|
class CoordTransform(GDALBase):
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
from unittest import skipUnless
|
from unittest import skipUnless
|
||||||
|
|
||||||
|
@ -259,3 +262,25 @@ class SpatialRefTest(unittest.TestCase):
|
||||||
self.assertEqual('EPSG', s1['AUTHORITY'])
|
self.assertEqual('EPSG', s1['AUTHORITY'])
|
||||||
self.assertEqual(4326, int(s1['AUTHORITY', 1]))
|
self.assertEqual(4326, int(s1['AUTHORITY', 1]))
|
||||||
self.assertIsNone(s1['FOOBAR'])
|
self.assertIsNone(s1['FOOBAR'])
|
||||||
|
|
||||||
|
def test_unicode(self):
|
||||||
|
wkt = (
|
||||||
|
'PROJCS["DHDN / Soldner 39 Langschoß",'
|
||||||
|
'GEOGCS["DHDN",DATUM["Deutsches_Hauptdreiecksnetz",'
|
||||||
|
'SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],AUTHORITY["EPSG","6314"]],'
|
||||||
|
'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
|
||||||
|
'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
|
||||||
|
'AUTHORITY["EPSG","4314"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],'
|
||||||
|
'PROJECTION["Cassini_Soldner"],PARAMETER["latitude_of_origin",50.66738711],'
|
||||||
|
'PARAMETER["central_meridian",6.28935703],PARAMETER["false_easting",0],'
|
||||||
|
'PARAMETER["false_northing",0],AUTHORITY["mj10777.de","187939"],AXIS["x",NORTH],AXIS["y",EAST]]'
|
||||||
|
)
|
||||||
|
srs = SpatialReference(wkt)
|
||||||
|
srs_list = [srs, srs.clone()]
|
||||||
|
srs.import_wkt(wkt)
|
||||||
|
|
||||||
|
for srs in srs_list:
|
||||||
|
self.assertEqual(srs.name, 'DHDN / Soldner 39 Langschoß')
|
||||||
|
self.assertEqual(srs.wkt, wkt)
|
||||||
|
self.assertIn('Langschoß', srs.pretty_wkt)
|
||||||
|
self.assertIn('Langschoß', srs.xml)
|
||||||
|
|
Loading…
Reference in New Issue