From 727cfa4c6afcbabe92c9c0077d2ec4dad8763adb Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:20:38 -0600 Subject: [PATCH 01/16] Update data.py --- srtm/data.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/srtm/data.py b/srtm/data.py index 5e7fab6..44a0ba5 100644 --- a/srtm/data.py +++ b/srtm/data.py @@ -156,8 +156,12 @@ def get_image(self, size, latitude_interval, longitude_interval, max_elevation, """ Returns a PIL image. """ - import Image as mod_image - import ImageDraw as mod_imagedraw + try: + import Image as mod_image + import ImageDraw as mod_imagedraw + except: + from PIL import Image as mod_image + from PIL import Image as mod_image if not size or len(size) != 2: raise Exception('Invalid size %s' % size) From 71ca3d7f7509831ddf2b6ae596ef0a6a4c34f180 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:24:41 -0600 Subject: [PATCH 02/16] Update utils.py --- srtm/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srtm/utils.py b/srtm/utils.py index 56f83e6..2227dfe 100644 --- a/srtm/utils.py +++ b/srtm/utils.py @@ -19,7 +19,7 @@ import logging as mod_logging import math as mod_math import zipfile as mod_zipfile -import cStringIO as mod_cstringio +import io.BytesIO as mod_cstringio ONE_DEGREE = 1000. * 10000.8 / 90. @@ -56,7 +56,7 @@ def zip(contents, file_name): def unzip(contents): mod_logging.debug('Unzipping %s bytes' % len(contents)) - zip_file = mod_zipfile.ZipFile(mod_cstringio.StringIO(contents)) + zip_file = mod_zipfile.ZipFile(mod_cstringio(contents)) zip_info_list = zip_file.infolist() zip_info = zip_info_list[0] result = zip_file.open(zip_info).read() From a4914c184ba57c1a8a3475672432874efef75af6 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:30:42 -0600 Subject: [PATCH 03/16] Update data.py --- srtm/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srtm/data.py b/srtm/data.py index 44a0ba5..39808cd 100644 --- a/srtm/data.py +++ b/srtm/data.py @@ -25,7 +25,7 @@ import re as mod_re import urllib as mod_urllib import os.path as mod_path -import cStringIO as mod_cstringio +import io.BytesIO as mod_cstringio from . import utils as mod_utils from . import retriever as mod_retriever From e24fbcb2b0358c1e03b3b08386227331f4abe15f Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:38:57 -0600 Subject: [PATCH 04/16] Update data.py --- srtm/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srtm/data.py b/srtm/data.py index 39808cd..a8c8275 100644 --- a/srtm/data.py +++ b/srtm/data.py @@ -25,7 +25,7 @@ import re as mod_re import urllib as mod_urllib import os.path as mod_path -import io.BytesIO as mod_cstringio +import from io import BytesIO as mod_cstringio from . import utils as mod_utils from . import retriever as mod_retriever From f83186719e6cddc01dafe4d263d2de7708c887d4 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:39:23 -0600 Subject: [PATCH 05/16] Update utils.py --- srtm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srtm/utils.py b/srtm/utils.py index 2227dfe..7feb82b 100644 --- a/srtm/utils.py +++ b/srtm/utils.py @@ -19,7 +19,7 @@ import logging as mod_logging import math as mod_math import zipfile as mod_zipfile -import io.BytesIO as mod_cstringio +import from io import BytesIO as mod_cstringio ONE_DEGREE = 1000. * 10000.8 / 90. From 07e4fe79962a46146645bcd883c24ff84bc8805b Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:41:42 -0600 Subject: [PATCH 06/16] Update utils.py --- srtm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srtm/utils.py b/srtm/utils.py index 7feb82b..9749cff 100644 --- a/srtm/utils.py +++ b/srtm/utils.py @@ -19,7 +19,7 @@ import logging as mod_logging import math as mod_math import zipfile as mod_zipfile -import from io import BytesIO as mod_cstringio +from io import BytesIO as mod_cstringio ONE_DEGREE = 1000. * 10000.8 / 90. From dba081d16ad01ba00ee55872ae66fd62b5e260b0 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:42:08 -0600 Subject: [PATCH 07/16] Update data.py --- srtm/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srtm/data.py b/srtm/data.py index a8c8275..4d7a72c 100644 --- a/srtm/data.py +++ b/srtm/data.py @@ -25,7 +25,7 @@ import re as mod_re import urllib as mod_urllib import os.path as mod_path -import from io import BytesIO as mod_cstringio +from io import BytesIO as mod_cstringio from . import utils as mod_utils from . import retriever as mod_retriever From 2dc21d4180020ec399d0d74c9b9c83cf148864fb Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Tue, 3 Nov 2015 22:43:39 -0600 Subject: [PATCH 08/16] Update retriever.py --- srtm/retriever.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srtm/retriever.py b/srtm/retriever.py index 06cbbb3..1e884ea 100644 --- a/srtm/retriever.py +++ b/srtm/retriever.py @@ -62,5 +62,5 @@ def get_files(url): latitude = 45. longitude = 45. - print get_geo_elevation_data() + print(get_geo_elevation_data()) From ff565e4532357a7f32d423d55c6975baf050fe9d Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 00:26:02 -0600 Subject: [PATCH 09/16] Updates to Python 3 --- LICENSE.txt | 0 NOTICE.txt | 0 README.md | 0 TODO.md | 0 gpx_sample_images.py | 0 gpxelevations | 25 ++-------- makefile | 0 sample_files/setnjica-kod-karojbe.gpx | 0 sample_images.py | 0 setup.py | 2 +- srtm/__init__.py | 0 srtm/data.py | 71 +++++++++++++-------------- srtm/list.json | 0 srtm/main.py | 40 +++++++-------- srtm/retriever.py | 30 ++++++----- srtm/utils.py | 26 +++++----- test.py | 64 ++++++++++++------------ 17 files changed, 118 insertions(+), 140 deletions(-) mode change 100644 => 100755 LICENSE.txt mode change 100644 => 100755 NOTICE.txt mode change 100644 => 100755 README.md mode change 100644 => 100755 TODO.md mode change 100644 => 100755 gpx_sample_images.py mode change 100644 => 100755 makefile mode change 100644 => 100755 sample_files/setnjica-kod-karojbe.gpx mode change 100644 => 100755 sample_images.py mode change 100644 => 100755 srtm/__init__.py mode change 100644 => 100755 srtm/data.py mode change 100644 => 100755 srtm/list.json mode change 100644 => 100755 srtm/main.py mode change 100644 => 100755 srtm/retriever.py mode change 100644 => 100755 srtm/utils.py mode change 100644 => 100755 test.py diff --git a/LICENSE.txt b/LICENSE.txt old mode 100644 new mode 100755 diff --git a/NOTICE.txt b/NOTICE.txt old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/TODO.md b/TODO.md old mode 100644 new mode 100755 diff --git a/gpx_sample_images.py b/gpx_sample_images.py old mode 100644 new mode 100755 diff --git a/gpxelevations b/gpxelevations index 4dbe0e0..3e94bde 100755 --- a/gpxelevations +++ b/gpxelevations @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # -*- coding: utf-8 -*- import pdb @@ -34,25 +34,8 @@ if args.verbose: geo_elevation_data = mod_srtm.get_data() -def update_point(point, args): - if args.calculate or (args.overwrite or point.elevation == None): - calculated = geo_elevation_data.get_elevation(point.latitude, point.longitude, approximate=args.approximate) - if calculated and int(calculated) != calculated: - calculated = int(calculated * 10) / 10. - print '(%s, %s) currently: %s, calculated: %s' % (point.latitude, point.longitude, point.elevation, calculated) - else: - print '(%s, %s) left with %s' % (point.latitude, point.longitude, point.elevation) - def update_gpx(gpx): - for route in gpx.routes: - for point in route.points: - update_point(point, args) - - for track in gpx.tracks: - for segment in track.segments: - for point in segment.points: - update_point(point, args) - + geo_elevation_data.add_elevations(gpx, only_missing=not args.overwrite, smooth=args.approximate) for gpx_file in args.gpx_files: with open(gpx_file) as f: @@ -67,8 +50,8 @@ for gpx_file in args.gpx_files: file_name = args.file if not file_name: - if '.gpx' in gpx_file.lower(): - file_name = gpx_file.lower().replace('.gpx', '_with_elevations.gpx') + if gpx_file.lower().endswith('.gpx' ): + file_name = gpx_file[:-4] + '_with_elevations.gpx' else: file_name = 'gpx_with_elevations.gpx' diff --git a/makefile b/makefile old mode 100644 new mode 100755 diff --git a/sample_files/setnjica-kod-karojbe.gpx b/sample_files/setnjica-kod-karojbe.gpx old mode 100644 new mode 100755 diff --git a/sample_images.py b/sample_images.py old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py index fac5618..a79e89b 100755 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ mod_distutilscore.setup( name = 'SRTM.py', - version = '0.2.3', + version = '0.2.5', description = 'Python parser for the Shuttle Radar Topography Mission elevation data', license = 'Apache License, Version 2.0', author = 'Tomo Krajina', diff --git a/srtm/__init__.py b/srtm/__init__.py old mode 100644 new mode 100755 diff --git a/srtm/data.py b/srtm/data.py old mode 100644 new mode 100755 index 4d7a72c..0895ffe --- a/srtm/data.py +++ b/srtm/data.py @@ -20,15 +20,15 @@ import pdb -import logging as mod_logging -import math as mod_math -import re as mod_re -import urllib as mod_urllib -import os.path as mod_path -from io import BytesIO as mod_cstringio +import logging +import math +import re +import io from . import utils as mod_utils -from . import retriever as mod_retriever +from . import retriever as retriever + +import requests as requests class GeoElevationData: """ @@ -57,7 +57,7 @@ def __init__(self, srtm1_files, srtm3_files, leave_zipped=False, def get_elevation(self, latitude, longitude, approximate=None): geo_elevation_file = self.get_file(float(latitude), float(longitude)) - #mod_logging.debug('File for ({0}, {1}) -> {2}'.format( + #logging.debug('File for ({0}, {1}) -> {2}'.format( # latitude, longitude, geo_elevation_file)) if not geo_elevation_file: @@ -77,7 +77,7 @@ def get_file(self, latitude, longitude): if not file_name: return None - if self.files.has_key(file_name): + if (file_name in self.files): return self.files[file_name] else: data = self.retrieve_or_load_file_data(file_name) @@ -100,20 +100,21 @@ def retrieve_or_load_file_data(self, file_name): url = None - if self.srtm1_files.has_key(file_name): + if (file_name in self.srtm1_files): url = self.srtm1_files[file_name] - elif self.srtm3_files.has_key(file_name): + elif (file_name in self.srtm3_files): url = self.srtm3_files[file_name] if not url: - #mod_logging.error('No file found: {0}'.format(file_name)) + #logging.error('No file found: {0}'.format(file_name)) return None - f = mod_urllib.urlopen(url) - mod_logging.info('Retrieving {0}'.format(url)) - data = f.read() - mod_logging.info('Retrieved {0} ({1} bytes)'.format(url, len(data))) - f.close() + r = requests.get(url) + if r.status_code < 200 or 300 <= r.status_code: + raise Exception('Cannot retrieve %s' % url) + logging.info('Retrieving {0}'.format(url)) + data = r.content + logging.info('Retrieved {0} ({1} bytes)'.format(url, len(data))) if not data: return None @@ -141,11 +142,11 @@ def get_file_name(self, latitude, longitude): else: east_west = 'W' - file_name = '%s%s%s%s.hgt' % (north_south, str(int(abs(mod_math.floor(latitude)))).zfill(2), - east_west, str(int(abs(mod_math.floor(longitude)))).zfill(3)) + file_name = '%s%s%s%s.hgt' % (north_south, str(int(abs(math.floor(latitude)))).zfill(2), + east_west, str(int(abs(math.floor(longitude)))).zfill(3)) - if not self.srtm1_files.has_key(file_name) and not self.srtm3_files.has_key(file_name): - #mod_logging.debug('No file found for ({0}, {1}) (file_name: {2})'.format(latitude, longitude, file_name)) + if not (file_name in self.srtm1_files) and not (file_name in self.srtm3_files): + #logging.debug('No file found for ({0}, {1}) (file_name: {2})'.format(latitude, longitude, file_name)) return None return file_name @@ -156,12 +157,8 @@ def get_image(self, size, latitude_interval, longitude_interval, max_elevation, """ Returns a PIL image. """ - try: - import Image as mod_image - import ImageDraw as mod_imagedraw - except: - from PIL import Image as mod_image - from PIL import Image as mod_image + import Image as mod_image + import ImageDraw as mod_imagedraw if not size or len(size) != 2: raise Exception('Invalid size %s' % size) @@ -212,7 +209,7 @@ def add_elevations(self, gpx, only_missing=False, smooth=False, gpx_smooth_no=0) except: raise Exception('gpxpy needed') if only_missing: - original_elevations = list(map(lambda point: point.elevation, gpx.walk(only_points=True))) + original_elevations = list([point.elevation for point in gpx.walk(only_points=True)]) if smooth: self._add_sampled_elevations(gpx) @@ -233,9 +230,9 @@ def _add_interval_elevations(self, gpx, min_interval_length=100): Adds elevation on points every min_interval_length and add missing elevation between """ - last_interval_changed = 0 for track in gpx.tracks: for segment in track.segments: + last_interval_changed = 0 previous_point = None length = 0 for no, point in enumerate(segment.points): @@ -253,11 +250,11 @@ def _add_interval_elevations(self, gpx, min_interval_length=100): def _add_sampled_elevations(self, gpx): # Use some random intervals here to randomize a bit: self._add_interval_elevations(gpx, min_interval_length=35) - elevations_1 = list(map(lambda point: point.elevation, gpx.walk(only_points=True))) + elevations_1 = list([point.elevation for point in gpx.walk(only_points=True)]) self._add_interval_elevations(gpx, min_interval_length=141) - elevations_2 = list(map(lambda point: point.elevation, gpx.walk(only_points=True))) + elevations_2 = list([point.elevation for point in gpx.walk(only_points=True)]) self._add_interval_elevations(gpx, min_interval_length=241) - elevations_3 = list(map(lambda point: point.elevation, gpx.walk(only_points=True))) + elevations_3 = list([point.elevation for point in gpx.walk(only_points=True)]) n = 0 for point in gpx.walk(only_points=True): @@ -294,14 +291,14 @@ def __init__(self, file_name, data, geo_elevation_data): self.data = data - square_side = mod_math.sqrt(len(self.data) / 2.) + square_side = math.sqrt(len(self.data) / 2.) assert square_side == int(square_side), 'Invalid file size: {0} for file {1}'.format(len(self.data), self.file_name) self.square_side = int(square_side) def get_row_and_column(self, latitude, longitude): - return mod_math.floor((self.latitude + 1 - latitude) * float(self.square_side - 1)), \ - mod_math.floor((longitude - self.longitude) * float(self.square_side - 1)) + return math.floor((self.latitude + 1 - latitude) * float(self.square_side - 1)), \ + math.floor((longitude - self.longitude) * float(self.square_side - 1)) def get_elevation(self, latitude, longitude, approximate=None): """ @@ -376,7 +373,7 @@ def get_elevation_from_row_and_column(self, row, column): i = row * (self.square_side) + column assert i < len(self.data) - 1 - #mod_logging.debug('{0}, {1} -> {2}'.format(row, column, i)) + #logging.debug('{0}, {1} -> {2}'.format(row, column, i)) byte_1 = ord(self.data[i * 2]) byte_2 = ord(self.data[i * 2 + 1]) @@ -391,7 +388,7 @@ def get_elevation_from_row_and_column(self, row, column): def parse_file_name_starting_position(self): """ Returns (latitude, longitude) of lower left point of the file """ - groups = mod_re.findall('([NS])(\d+)([EW])(\d+)\.hgt', self.file_name) + groups = re.findall('([NS])(\d+)([EW])(\d+)\.hgt', self.file_name) assert groups and len(groups) == 1 and len(groups[0]) == 4, 'Invalid file name {0}'.format(self.file_name) diff --git a/srtm/list.json b/srtm/list.json old mode 100644 new mode 100755 diff --git a/srtm/main.py b/srtm/main.py old mode 100644 new mode 100755 index cbe5227..f4a57b2 --- a/srtm/main.py +++ b/srtm/main.py @@ -16,19 +16,19 @@ import pdb -import json as mod_json -import os as mod_os -import os.path as mod_path +import json +import os +import os.path -from . import data as mod_data -from . import utils as mod_utils +from . import data as mod_data +from . import utils as mod_utils from . import retriever as mod_retriever SRTM1_URL = 'http://dds.cr.usgs.gov/srtm/version2_1/SRTM1/' SRTM3_URL = 'http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/' -package_location = mod_data.__file__[: mod_data.__file__.rfind(mod_path.sep)] -DEFAULT_LIST_JSON = package_location + mod_os.sep + 'list.json' +package_location = mod_data.__file__[: mod_data.__file__.rfind(os.path.sep)] +DEFAULT_LIST_JSON = package_location + os.sep + 'list.json' def get_data(srtm1=True, srtm3=True, leave_zipped=False, file_handler=None, use_included_urls=True): @@ -44,11 +44,11 @@ def get_data(srtm1=True, srtm3=True, leave_zipped=False, file_handler=None, If you need to change the way the files are saved locally (for example if you need to save them locally) -- change the file_handler. See - srtm.utils.FileHandler. + srtm.main.FileHandler. If leave_zipped is True then files will be stored locally as compressed zip files. That means less disk space but more computing space for every - file loaded. + file loaded. If use_included_urls is True urls to SRTM files included in the library will be used. Set to false if you need to reload them on first run. @@ -90,17 +90,17 @@ def _get_urls(use_included_urls, file_handler): srtm3_files = mod_retriever.retrieve_all_files_urls(SRTM3_URL) file_handler.write(files_list_file_name, - mod_json.dumps({'srtm1': srtm1_files, 'srtm3': srtm3_files}, sort_keys=True, indent=4)) + json.dumps({'srtm1': srtm1_files, 'srtm3': srtm3_files}, sort_keys=True, indent=4)) return srtm1_files, srtm3_files def _get_urls_json(use_included_urls, file_handler): if use_included_urls: with open(DEFAULT_LIST_JSON, 'r') as f: - return mod_json.loads(f.read()) + return json.loads(f.read()) contents = file_handler.read(files_list_file_name) - return mod_json.loads(contents) + return json.loads(contents) class FileHandler: """ @@ -112,20 +112,20 @@ def get_srtm_dir(self): """ The default path to store files. """ # Local cache path: result = "" - if mod_os.environ.has_key('HOME'): - result = '{0}/.srtm'.format(mod_os.environ['HOME']) - elif mod_os.environ.has_key('HOMEPATH'): - result = '{0}/.srtm'.format(mod_os.environ['HOMEPATH']) + if 'HOME' in os.environ: + result = '{0}/.cache/srtm'.format(os.environ['HOME']) + elif 'HOMEPATH' in os.environ: + result = '{0}/.cache/srtm'.format(os.environ['HOMEPATH']) else: - raise Error('No default HOME directory found, please specify a path where to store files') + raise Exception('No default HOME directory found, please specify a path where to store files') - if not mod_path.exists(result): - mod_os.makedirs(result) + if not os.path.exists(result): + os.makedirs(result) return result def exists(self, file_name): - return mod_path.exists('%s/%s' % (self.get_srtm_dir(), file_name)) + return os.path.exists('%s/%s' % (self.get_srtm_dir(), file_name)) def write(self, file_name, contents): with open('%s/%s' % (self.get_srtm_dir(), file_name), 'wb') as f: diff --git a/srtm/retriever.py b/srtm/retriever.py old mode 100644 new mode 100755 index 1e884ea..1f42e48 --- a/srtm/retriever.py +++ b/srtm/retriever.py @@ -14,22 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging as mod_logging -import os as mod_os -import urllib as mod_urllib -import re as mod_re -import pickle as mod_pickle -import os.path as mod_path - -import data as mod_data +import logging +import os +import urllib.request, urllib.parse, urllib.error +import re +import pickle +import os.path def retrieve_all_files_urls(url): - mod_logging.info('Retrieving {0}'.format(url)) - url_stream = mod_urllib.urlopen(url) + logging.info('Retrieving {0}'.format(url)) + url_stream = urllib.request.urlopen(url) contents = url_stream.read() url_stream.close() - url_candidates = mod_re.findall('href="https://github.com/(.*?)"', contents) + url_candidates = re.findall('href="https://github.com/(.*?)"', contents) urls = {} for url_candidate in url_candidates: @@ -41,20 +39,20 @@ def retrieve_all_files_urls(url): return urls def get_files(url): - mod_logging.info('Retrieving {0}'.format(url)) - url_stream = mod_urllib.urlopen(url) + logging.info('Retrieving {0}'.format(url)) + url_stream = urllib.request.urlopen(url) contents = url_stream.read() url_stream.close() result = {} - url_candidates = mod_re.findall('href="https://github.com/(.*?)"', contents) + url_candidates = re.findall('href="https://github.com/(.*?)"', contents) for url_candidate in url_candidates: if url_candidate.endswith('.hgt.zip'): file_url = '{0}/{1}'.format(url, url_candidate) result[url_candidate.replace('.zip', '')] = file_url - mod_logging.info('Found {0} files'.format(len(result))) + logging.info('Found {0} files'.format(len(result))) return result @@ -62,5 +60,5 @@ def get_files(url): latitude = 45. longitude = 45. - print(get_geo_elevation_data()) + print((get_geo_elevation_data())) diff --git a/srtm/utils.py b/srtm/utils.py old mode 100644 new mode 100755 index 9749cff..249ddce --- a/srtm/utils.py +++ b/srtm/utils.py @@ -16,10 +16,10 @@ import pdb -import logging as mod_logging -import math as mod_math -import zipfile as mod_zipfile -from io import BytesIO as mod_cstringio +import logging +import math +import zipfile +import io ONE_DEGREE = 1000. * 10000.8 / 90. @@ -28,11 +28,11 @@ def distance(latitude_1, longitude_1, latitude_2, longitude_2): Distance between two points. """ - coef = mod_math.cos(latitude_1 / 180. * mod_math.pi) + coef = math.cos(latitude_1 / 180. * math.pi) x = latitude_1 - latitude_2 y = (longitude_1 - longitude_2) * coef - return mod_math.sqrt(x * x + y * y) * ONE_DEGREE + return math.sqrt(x * x + y * y) * ONE_DEGREE def get_color_between(color1, color2, i): """ i is a number between 0 and 1, if 0 then color1, if 1 color2, ... """ @@ -45,20 +45,20 @@ def get_color_between(color1, color2, i): int(color1[2] + (color2[2] - color1[2]) * i)) def zip(contents, file_name): - mod_logging.debug('Zipping %s bytes' % len(contents)) - result = mod_cstringio.StringIO() - zip_file = mod_zipfile.ZipFile(result, 'w', mod_zipfile.ZIP_DEFLATED, False) + logging.debug('Zipping %s bytes' % len(contents)) + result = BytesIO() + zip_file = zipfile.ZipFile(result, 'w', zipfile.ZIP_DEFLATED, False) zip_file.writestr(file_name, contents) zip_file.close() result.seek(0) - mod_logging.debug('Zipped') + logging.debug('Zipped') return result.read() def unzip(contents): - mod_logging.debug('Unzipping %s bytes' % len(contents)) - zip_file = mod_zipfile.ZipFile(mod_cstringio(contents)) + logging.debug('Unzipping %s bytes' % len(contents)) + zip_file = zipfile.ZipFile(BytesIO(contents)) zip_info_list = zip_file.infolist() zip_info = zip_info_list[0] result = zip_file.open(zip_info).read() - mod_logging.debug('Unzipped') + logging.debug('Unzipped') return result diff --git a/test.py b/test.py old mode 100644 new mode 100755 index dc07752..1174085 --- a/test.py +++ b/test.py @@ -32,53 +32,53 @@ class Tests(mod_unittest.TestCase): def test_random_points(self): geo_elevation_data = mod_srtm.get_data() - self.assertEquals(63, geo_elevation_data.get_elevation(46., 13.)) - self.assertEquals(2714, geo_elevation_data.get_elevation(46.999999, 13.)) - self.assertEquals(1643, geo_elevation_data.get_elevation(46.999999, 13.999999)) - self.assertEquals(553, geo_elevation_data.get_elevation(46., 13.999999)) - self.assertEquals(203, geo_elevation_data.get_elevation(45.2732, 13.7139)) - self.assertEquals(460, geo_elevation_data.get_elevation(45.287, 13.905)) + self.assertEqual(63, geo_elevation_data.get_elevation(46., 13.)) + self.assertEqual(2714, geo_elevation_data.get_elevation(46.999999, 13.)) + self.assertEqual(1643, geo_elevation_data.get_elevation(46.999999, 13.999999)) + self.assertEqual(553, geo_elevation_data.get_elevation(46., 13.999999)) + self.assertEqual(203, geo_elevation_data.get_elevation(45.2732, 13.7139)) + self.assertEqual(460, geo_elevation_data.get_elevation(45.287, 13.905)) def test_around_zero_longitude(self): geo_elevation_data = mod_srtm.get_data() - self.assertEquals(61, geo_elevation_data.get_elevation(51.2, 0.0)) - self.assertEquals(100, geo_elevation_data.get_elevation(51.2, -0.1)) - self.assertEquals(59, geo_elevation_data.get_elevation(51.2, 0.1)) + self.assertEqual(61, geo_elevation_data.get_elevation(51.2, 0.0)) + self.assertEqual(100, geo_elevation_data.get_elevation(51.2, -0.1)) + self.assertEqual(59, geo_elevation_data.get_elevation(51.2, 0.1)) def test_around_zero_latitude(self): geo_elevation_data = mod_srtm.get_data() - self.assertEquals(393, geo_elevation_data.get_elevation(0, 15)) - self.assertEquals(423, geo_elevation_data.get_elevation(-0.1, 15)) - self.assertEquals(381, geo_elevation_data.get_elevation(0.1, 15)) + self.assertEqual(393, geo_elevation_data.get_elevation(0, 15)) + self.assertEqual(423, geo_elevation_data.get_elevation(-0.1, 15)) + self.assertEqual(381, geo_elevation_data.get_elevation(0.1, 15)) def test_point_with_invalid_elevation(self): geo_elevation_data = mod_srtm.get_data() - self.assertEquals(None, geo_elevation_data.get_elevation(47.0, 13.07)) + self.assertEqual(None, geo_elevation_data.get_elevation(47.0, 13.07)) def test_point_without_file(self): geo_elevation_data = mod_srtm.get_data() - print geo_elevation_data.get_elevation(0, 0) + print((geo_elevation_data.get_elevation(0, 0))) def test_files_equality(self): geo_elevation_data = mod_srtm.get_data() - self.assertEquals(geo_elevation_data.get_file(47.0, 13.99), + self.assertEqual(geo_elevation_data.get_file(47.0, 13.99), geo_elevation_data.get_file(47.0, 13.0)) - self.assertEquals(geo_elevation_data.get_file(47.99, 13.99), + self.assertEqual(geo_elevation_data.get_file(47.99, 13.99), geo_elevation_data.get_file(47.0, 13.0)) - self.assertEquals(geo_elevation_data.get_file(-47.0, 13.99), + self.assertEqual(geo_elevation_data.get_file(-47.0, 13.99), geo_elevation_data.get_file(-47.0, 13.0)) - self.assertEquals(geo_elevation_data.get_file(-47.99, 13.99), + self.assertEqual(geo_elevation_data.get_file(-47.99, 13.99), geo_elevation_data.get_file(-47.0, 13.0)) - self.assertEquals(geo_elevation_data.get_file(-47.0, -13.99), + self.assertEqual(geo_elevation_data.get_file(-47.0, -13.99), geo_elevation_data.get_file(-47.0, -13.0)) - self.assertEquals(geo_elevation_data.get_file(-47.99, -13.99), + self.assertEqual(geo_elevation_data.get_file(-47.99, -13.99), geo_elevation_data.get_file(-47.0, -13.0)) - self.assertEquals(geo_elevation_data.get_file(47.0, -13.99), + self.assertEqual(geo_elevation_data.get_file(47.0, -13.99), geo_elevation_data.get_file(47.0, -13.0)) - self.assertEquals(geo_elevation_data.get_file(47.99, -13.99), + self.assertEqual(geo_elevation_data.get_file(47.99, -13.99), geo_elevation_data.get_file(47.0, -13.0)) def test_invalit_coordinates_for_file(self): @@ -89,32 +89,32 @@ def test_invalit_coordinates_for_file(self): self.assertFalse(geo_file.get_elevation(1, 1)) except Exception as e: message = str(e) - self.assertEquals('Invalid latitude 1 for file N47E013.hgt', message) + self.assertEqual('Invalid latitude 1 for file N47E013.hgt', message) try: self.assertFalse(geo_file.get_elevation(47, 1)) except Exception as e: message = str(e) - self.assertEquals('Invalid longitude 1 for file N47E013.hgt', message) + self.assertEqual('Invalid longitude 1 for file N47E013.hgt', message) def test_invalid_file(self): geo_elevation_data = mod_srtm.get_data() geo_file = geo_elevation_data.get_file(-47.0, -13.99) - self.assertEquals(None, geo_file) + self.assertEqual(None, geo_file) def test_coordinates_in_file(self): geo_elevation_data = mod_srtm.get_data() geo_file = geo_elevation_data.get_file(47.0, 13.99) - print 'file:', geo_file + print(('file:', geo_file)) - self.assertEquals(geo_file.get_elevation(47, 13), + self.assertEqual(geo_file.get_elevation(47, 13), geo_file.get_elevation(47, 13)) def test_without_approximation(self): geo_elevation_data = mod_srtm.get_data() - self.assertEquals(geo_elevation_data.get_elevation(47.1, 13.1, approximate=False), + self.assertEqual(geo_elevation_data.get_elevation(47.1, 13.1, approximate=False), geo_elevation_data.get_elevation(47.1, 13.1)) # SRTM elevations are always integers: @@ -124,7 +124,7 @@ def test_without_approximation(self): def test_with_approximation(self): geo_elevation_data = mod_srtm.get_data() - self.assertNotEquals(geo_elevation_data.get_elevation(47.1, 13.1, approximate=True), + self.assertNotEqual(geo_elevation_data.get_elevation(47.1, 13.1, approximate=True), geo_elevation_data.get_elevation(47.1, 13.1)) # When approximating a random point, it probably won't be a integer: @@ -137,8 +137,8 @@ def test_approximation(self): elevation_without_approximation = geo_elevation_data.get_elevation(47, 13) elevation_with_approximation = geo_elevation_data.get_elevation(47, 13, approximate=True) - print elevation_without_approximation - print elevation_with_approximation + print(elevation_without_approximation) + print(elevation_with_approximation) - self.assertNotEquals(elevation_with_approximation, elevation_without_approximation) + self.assertNotEqual(elevation_with_approximation, elevation_without_approximation) self.assertTrue(abs(elevation_with_approximation - elevation_without_approximation) < 30) From 1cd7ad41cc1c00e9c685e27dea60c0e9db98e338 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 00:30:23 -0600 Subject: [PATCH 10/16] Updated PIL import --- srtm/data.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/srtm/data.py b/srtm/data.py index 0895ffe..3153082 100755 --- a/srtm/data.py +++ b/srtm/data.py @@ -157,8 +157,12 @@ def get_image(self, size, latitude_interval, longitude_interval, max_elevation, """ Returns a PIL image. """ - import Image as mod_image - import ImageDraw as mod_imagedraw + try: + import Image as mod_image + import ImageDraw as mod_imagedraw + except: + from PIL import Image as mod_image + from PIL import ImageDraw as mod_imagedraw if not size or len(size) != 2: raise Exception('Invalid size %s' % size) From 4e4c25d76ed094777682479800ff932cba124219 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 00:31:56 -0600 Subject: [PATCH 11/16] Fixed reference to io.BytesIO --- srtm/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srtm/utils.py b/srtm/utils.py index 249ddce..4d3fcde 100755 --- a/srtm/utils.py +++ b/srtm/utils.py @@ -46,7 +46,7 @@ def get_color_between(color1, color2, i): def zip(contents, file_name): logging.debug('Zipping %s bytes' % len(contents)) - result = BytesIO() + result = io.BytesIO() zip_file = zipfile.ZipFile(result, 'w', zipfile.ZIP_DEFLATED, False) zip_file.writestr(file_name, contents) zip_file.close() @@ -56,7 +56,7 @@ def zip(contents, file_name): def unzip(contents): logging.debug('Unzipping %s bytes' % len(contents)) - zip_file = zipfile.ZipFile(BytesIO(contents)) + zip_file = zipfile.ZipFile(io.BytesIO(contents)) zip_info_list = zip_file.infolist() zip_info = zip_info_list[0] result = zip_file.open(zip_info).read() From 5ad960e15d5f2cdef9177d6ab229aa3b31eea58d Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 00:46:46 -0600 Subject: [PATCH 12/16] changed ord() function --- srtm/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srtm/data.py b/srtm/data.py index 3153082..6d5676a 100755 --- a/srtm/data.py +++ b/srtm/data.py @@ -379,8 +379,8 @@ def get_elevation_from_row_and_column(self, row, column): #logging.debug('{0}, {1} -> {2}'.format(row, column, i)) - byte_1 = ord(self.data[i * 2]) - byte_2 = ord(self.data[i * 2 + 1]) + byte_1 = ord(str(self.data[i * 2])) + byte_2 = ord(str(self.data[i * 2 + 1])) result = byte_1 * 256 + byte_2 From 37f147b6ddd6099236296fe138fc14a525d58b51 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 00:49:12 -0600 Subject: [PATCH 13/16] debugging --- srtm/data.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/srtm/data.py b/srtm/data.py index 6d5676a..1d5596d 100755 --- a/srtm/data.py +++ b/srtm/data.py @@ -378,9 +378,12 @@ def get_elevation_from_row_and_column(self, row, column): assert i < len(self.data) - 1 #logging.debug('{0}, {1} -> {2}'.format(row, column, i)) - - byte_1 = ord(str(self.data[i * 2])) - byte_2 = ord(str(self.data[i * 2 + 1])) + a = self.data[i * 2] + b = self.data[i * 2 + 1] + print(a) + print(b) + byte_1 = ord(a) + byte_2 = ord(b) result = byte_1 * 256 + byte_2 From 8665759d9cdbd973a9216fab55c4805234ba1c57 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 01:05:07 -0600 Subject: [PATCH 14/16] removed old calls --- srtm/data.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/srtm/data.py b/srtm/data.py index 1d5596d..0f646a6 100755 --- a/srtm/data.py +++ b/srtm/data.py @@ -378,12 +378,8 @@ def get_elevation_from_row_and_column(self, row, column): assert i < len(self.data) - 1 #logging.debug('{0}, {1} -> {2}'.format(row, column, i)) - a = self.data[i * 2] - b = self.data[i * 2 + 1] - print(a) - print(b) - byte_1 = ord(a) - byte_2 = ord(b) + byte1 = self.data[i * 2] + byte2 = self.data[i * 2 + 1] result = byte_1 * 256 + byte_2 From 745837664fae3e37bfb11c02465b724d9aca44f1 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 01:06:27 -0600 Subject: [PATCH 15/16] fixed byte variable names --- srtm/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srtm/data.py b/srtm/data.py index 0f646a6..6f9effe 100755 --- a/srtm/data.py +++ b/srtm/data.py @@ -378,8 +378,8 @@ def get_elevation_from_row_and_column(self, row, column): assert i < len(self.data) - 1 #logging.debug('{0}, {1} -> {2}'.format(row, column, i)) - byte1 = self.data[i * 2] - byte2 = self.data[i * 2 + 1] + byte_1 = self.data[i * 2] + byte_2 = self.data[i * 2 + 1] result = byte_1 * 256 + byte_2 From 28a0aa11930c2eda000e57fa98a8ce99f4170a58 Mon Sep 17 00:00:00 2001 From: "GeospatialPython.com" Date: Wed, 4 Nov 2015 01:10:15 -0600 Subject: [PATCH 16/16] switched utils to use StringIO --- srtm/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srtm/utils.py b/srtm/utils.py index 4d3fcde..77c5139 100755 --- a/srtm/utils.py +++ b/srtm/utils.py @@ -46,7 +46,7 @@ def get_color_between(color1, color2, i): def zip(contents, file_name): logging.debug('Zipping %s bytes' % len(contents)) - result = io.BytesIO() + result = io.StringIO() zip_file = zipfile.ZipFile(result, 'w', zipfile.ZIP_DEFLATED, False) zip_file.writestr(file_name, contents) zip_file.close() @@ -56,7 +56,7 @@ def zip(contents, file_name): def unzip(contents): logging.debug('Unzipping %s bytes' % len(contents)) - zip_file = zipfile.ZipFile(io.BytesIO(contents)) + zip_file = zipfile.ZipFile(io.StringIO(contents)) zip_info_list = zip_file.infolist() zip_info = zip_info_list[0] result = zip_file.open(zip_info).read()