From 23f0bba71e1f3eaa9ddfee029d7c0d700f13e7de Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Wed, 28 Oct 2020 21:19:36 +0200 Subject: [PATCH 01/21] HB2-66 geonames WIP --- homebytwo/routes/geonames.py | 147 ++++++++++++++++++ .../0050_create_place_type_model.py | 108 +++++++++++++ .../0051_delete_non_geonames_places.py | 18 +++ .../0052_remove_old_place_type_field.py | 26 ++++ .../migrations/0053_merge_20201027_2129.py | 14 ++ homebytwo/routes/models/place.py | 42 +++-- homebytwo/routes/models/route.py | 2 +- homebytwo/routes/views.py | 2 +- .../routes/route/_route_checkpoint.html | 2 +- requirements/base.in | 1 + 10 files changed, 350 insertions(+), 12 deletions(-) create mode 100644 homebytwo/routes/geonames.py create mode 100644 homebytwo/routes/migrations/0050_create_place_type_model.py create mode 100644 homebytwo/routes/migrations/0051_delete_non_geonames_places.py create mode 100644 homebytwo/routes/migrations/0052_remove_old_place_type_field.py create mode 100644 homebytwo/routes/migrations/0053_merge_20201027_2129.py diff --git a/homebytwo/routes/geonames.py b/homebytwo/routes/geonames.py new file mode 100644 index 00000000..d1575d8c --- /dev/null +++ b/homebytwo/routes/geonames.py @@ -0,0 +1,147 @@ +import csv +from collections import namedtuple +from io import BytesIO, TextIOWrapper +from typing import IO, Iterator +from zipfile import ZipFile + +from django.db import transaction +from django.contrib.gis.geos import Point + +from lxml import html +import requests +from tqdm import tqdm + +from homebytwo.routes.models import Place, Route +from homebytwo.routes.models.place import PlaceType + +PLACE_TYPE_URL = "http://www.geonames.org/export/codes.html" +PLACE_DATA_URL = "https://download.geonames.org/export/dump/{}.zip" + +PlaceTuple = namedtuple( + "PlaceTuple", ["geonameid", "name", "latitude", "longitude", "feature_code", "elevation"] +) + + +def import_places_from_geonames(scope: str = "allCountries"): + file = get_geonames_remote_file(scope) + data = parse_places_from_file(file) + create_places_from_geonames_data(data) + + +def get_geonames_remote_file(scope: str = "allCountries") -> IO[bytes]: + """ + retrieve zip file from https://download.geonames.org/export/dump/ + """ + print(f"downloading geonames file for `{scope}`...") + response = requests.get(f"https://download.geonames.org/export/dump/{scope}.zip") + response.raise_for_status() + root = ZipFile(BytesIO(response.content)) + return TextIOWrapper(root.open(f"{scope}.txt")) + + +def get_geonames_local_file(file_name: str) -> IO: + """ + open a local file to pass to the generator. + """ + return TextIOWrapper(open(file_name)) + + +def count_rows_in_file(file: IO) -> int: + return sum(1 for _ in csv.reader(file)) + + +def parse_places_from_file(file: IO) -> Iterator[PlaceTuple]: + data_reader = csv.reader(file, delimiter="\t") + for row in data_reader: + if row[0] and row[1] and row[4] and row[5] and row[7]: + yield PlaceTuple( + geonameid=int(row[0]), + name=row[1], + latitude=float(row[4]), + longitude=float(row[5]), + feature_code=row[7], + elevation=float(row[14]), + ) + + +def create_places_from_geonames_data(data: Iterator[PlaceTuple], count: int) -> None: + description = "saving geonames places" + with transaction.atomic(): + for remote_place in tqdm(data, desc=description, total=count): + default_values = { + "name": remote_place.name, + "place_type": PlaceType.objects.get(code=remote_place.feature_code), + "geom": Point(remote_place.longitude, remote_place.latitude, srid=4326), + "altitude": remote_place.elevation, + } + + local_place, created = Place.objects.get_or_create( + data_source="geonames", + source_id=remote_place.geonameid, + defaults=default_values, + ) + + if not created: + for key, value in default_values.items(): + setattr(local_place, key, value) + local_place.save() + + +def update_place_types_from_geonames() -> None: + """ + Scrape the page containing the reference of all features type + at http://www.geonames.org/export/codes.html and save the + result to the database. + """ + # retrieve page content with requests + print("importing place types from geonames... ") + response = requests.get(PLACE_TYPE_URL) + response.raise_for_status() + + # target table + xml = html.fromstring(response.content) + feature_type_table = xml.xpath('//table[@class="restable"]')[0] + + # parse place types from table rows + table_rows = feature_type_table.xpath(".//tr") + place_type_pks = [] + for row in table_rows: + + # header rows contain class information + if row.xpath(".//th"): + header_text = row.text_content() + feature_class, class_description = header_text.split(" ", 1) + current_feature_class = feature_class + + # non-header rows contain feature type + elif "tfooter" not in row.classes: + code, name, description = [ + element.text_content() for element in row.xpath(".//td") + ] + place_type, created = PlaceType.objects.get_or_create( + feature_class=current_feature_class, + code=code, + name=name, + description=description, + ) + place_type_pks.append(place_type.pk) + + PlaceType.objects.exclude(pk__in=place_type_pks).delete() + + +def migrate_route_checkpoints_to_geonames() -> None: + print("migrating route checkpoints...") + total_count = Route.objects.all().count() + for index, route in enumerate(Route.objects.all(), 1): + print(f"{index}/{total_count} migrating route: {route}") + existing_checkpoints = route.checkpoint_set + existing_checkpoint_names = existing_checkpoints.values_list( + "place__name", flat=True + ) + possible_checkpoints = route.find_possible_checkpoints() + for checkpoint in possible_checkpoints: + if ( + checkpoint.place.name in existing_checkpoint_names + and checkpoint.place.data_source == "geonames" + ): + checkpoint.save() diff --git a/homebytwo/routes/migrations/0050_create_place_type_model.py b/homebytwo/routes/migrations/0050_create_place_type_model.py new file mode 100644 index 00000000..a1f8bc20 --- /dev/null +++ b/homebytwo/routes/migrations/0050_create_place_type_model.py @@ -0,0 +1,108 @@ +# Generated by Django 2.2.16 on 2020-10-24 12:28 +from django.contrib.gis.geos import Point +from django.db import migrations, models + +from tqdm import tqdm + +from homebytwo.routes.geonames import ( + migrate_route_checkpoints_to_geonames, + get_geonames_remote_file, + parse_places_from_file, + update_place_types_from_geonames, +) + + +def migrate_routes_to_geonames(apps, schema_editor): + migrate_route_checkpoints_to_geonames() + + +def import_place_types_from_geonames(apps, schema_editor): + update_place_types_from_geonames() + + +def import_places_from_geonames(apps, schema_editor): + Place = apps.get_model("routes", "Place") + PlaceType = apps.get_model("routes", "PlaceType") + + file = get_geonames_remote_file("CH") + data = parse_places_from_file(file) + + print("saving geonames places") + for remote_place in data: + defaults = { + "name": remote_place.name, + "place_type": PlaceType.objects.get(code=remote_place.feature_code), + "geom": Point(remote_place.longitude, remote_place.latitude, srid=4326), + "altitude": remote_place.elevation, + "old_place_type": "CST", + } + + local_place, created = Place.objects.get_or_create( + data_source="geonames", + source_id=remote_place.geonameid, + defaults=defaults, + ) + + if not created: + local_place.update(defaults) + local_place.save() + + +def update_routes(apps, schema_editor): + migrate_route_checkpoints_to_geonames() + + +class Migration(migrations.Migration): + + dependencies = [ + ("routes", "0049_merge_20201002_1037"), + ] + + operations = [ + migrations.CreateModel( + name="PlaceType", + fields=[ + ( + "feature_class", + models.CharField( + choices=[ + ("A", "country, state, region,..."), + ("H", "stream, lake,..."), + ("L", "parks,area,..."), + ("P", "city, village,..."), + ("R", "road, railroad"), + ("S", "spot, building, farm"), + ("U", "undersea"), + ("V", "forest,heath,..."), + ], + max_length=1, + ), + ), + ( + "code", + models.CharField(max_length=10, primary_key=True, serialize=False), + ), + ("name", models.CharField(max_length=256)), + ("description", models.CharField(max_length=512)), + ], + ), + migrations.RunPython( + import_place_types_from_geonames, + ), + migrations.RenameField( + model_name="place", + old_name="place_type", + new_name="old_place_type", + ), + migrations.AddField( + model_name="place", + name="place_type", + field=models.ForeignKey( + on_delete="CASCADE", to="routes.PlaceType", null=True + ), + ), + migrations.RunPython( + import_places_from_geonames, + ), + migrations.RunPython(migrate_routes_to_geonames), + ] diff --git a/homebytwo/routes/migrations/0051_delete_non_geonames_places.py b/homebytwo/routes/migrations/0051_delete_non_geonames_places.py new file mode 100644 index 00000000..e10bc8cb --- /dev/null +++ b/homebytwo/routes/migrations/0051_delete_non_geonames_places.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.16 on 2020-10-26 20:55 + +from django.db import migrations + + +def delete_non_geonames_places(apps, schema_editor): + print("deleting non-geonames places... ") + Place = apps.get_model("routes", "Place") + Place.objects.exclude(data_source="geonames").delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ("routes", "0050_create_place_type_model"), + ] + + operations = [migrations.RunPython(delete_non_geonames_places)] diff --git a/homebytwo/routes/migrations/0052_remove_old_place_type_field.py b/homebytwo/routes/migrations/0052_remove_old_place_type_field.py new file mode 100644 index 00000000..2f7d85ce --- /dev/null +++ b/homebytwo/routes/migrations/0052_remove_old_place_type_field.py @@ -0,0 +1,26 @@ +# Generated by Django 2.2.16 on 2020-10-26 20:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('routes', '0051_delete_non_geonames_places'), + ] + + operations = [ + migrations.RemoveField( + model_name='place', + name='old_place_type', + ), + migrations.RemoveField( + model_name='place', + name='public_transport', + ), + migrations.AlterField( + model_name='place', + name='place_type', + field=models.ForeignKey(on_delete='CASCADE', to='routes.PlaceType'), + ), + ] diff --git a/homebytwo/routes/migrations/0053_merge_20201027_2129.py b/homebytwo/routes/migrations/0053_merge_20201027_2129.py new file mode 100644 index 00000000..71a40774 --- /dev/null +++ b/homebytwo/routes/migrations/0053_merge_20201027_2129.py @@ -0,0 +1,14 @@ +# Generated by Django 2.2.16 on 2020-10-27 20:29 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('routes', '0052_remove_old_place_type_field'), + ('routes', '0050_fix_route_data'), + ] + + operations = [ + ] diff --git a/homebytwo/routes/models/place.py b/homebytwo/routes/models/place.py index c71f9204..a7b3bd76 100644 --- a/homebytwo/routes/models/place.py +++ b/homebytwo/routes/models/place.py @@ -12,7 +12,7 @@ class Place(TimeStampedModel): """ Places are geographic points. They have a name, description and geom - Places are used to create segments from routes and + Places are used to create checkpoints on routes and and for public transport connection. """ @@ -127,14 +127,12 @@ class Place(TimeStampedModel): ), ), ) - - place_type = models.CharField(max_length=26, choices=PLACE_TYPE_CHOICES) + place_type = models.ForeignKey("PlaceType", on_delete="CASCADE") name = models.CharField(max_length=250) description = models.TextField(default="", blank=True) altitude = models.FloatField(null=True) data_source = models.CharField(default="homebytwo", max_length=50) source_id = models.CharField("ID at the data source", max_length=50) - public_transport = models.BooleanField(default=False) geom = models.PointField(srid=21781) class Meta: @@ -149,7 +147,7 @@ class Meta: def __str__(self): return "{0} - {1}".format( self.name, - self.get_place_type_display(), + self.place_type.name, ) def save(self, *args, **kwargs): @@ -171,7 +169,7 @@ def save(self, *args, **kwargs): def get_coords(self, srid=4326): """ - returns a tupple with the place coords transformed to the requested srid + returns a tuple with the place coords transformed to the requested srid """ return self.geom.transform(4326, clone=True).coords @@ -192,13 +190,39 @@ def get_gpx_waypoint(self, route, line_location, start_time): longitude=lng, latitude=lat, elevation=altitude_on_route, - type=self.get_place_type_display(), + type=self.place_type.name, time=time, ) +class PlaceType(models.Model): + """ + Like places, place types are downloaded from geonames at + http://www.geonames.org/export/codes.html + """ + + FEATURE_CLASS_CHOICES = ( + ("A", "country, state, region,..."), + ("H", "stream, lake,..."), + ("L", "parks,area,..."), + ("P", "city, village,..."), + ("R", "road, railroad"), + ("S", "spot, building, farm"), + ("U", "undersea"), + ("V", "forest,heath,..."), + ) + + feature_class = models.CharField(max_length=1, choices=FEATURE_CLASS_CHOICES) + code = models.CharField(max_length=10, primary_key=True) + name = models.CharField(max_length=256) + description = models.CharField(max_length=512) + + class Checkpoint(models.Model): - # Intermediate model for route - place + """ + Intermediate model for route - place + """ + route = models.ForeignKey("Route", on_delete=models.CASCADE) place = models.ForeignKey("Place", on_delete=models.CASCADE) @@ -246,7 +270,7 @@ def __str__(self): return "{0:.1f}km: {1} - {2}".format( self.distance_from_start.km, self.place.name, - self.place.get_place_type_display(), + self.place.place_type.name, ) def get_gpx_waypoint(self, route=None, start_time=datetime.utcnow()): diff --git a/homebytwo/routes/models/route.py b/homebytwo/routes/models/route.py index 30dabf00..48d33d0a 100644 --- a/homebytwo/routes/models/route.py +++ b/homebytwo/routes/models/route.py @@ -278,7 +278,7 @@ def find_possible_checkpoints(self, max_distance=75, updated_geom=False): """ return places as checkpoints based on the route geometry. - start from existing checkpoints by default. you can use update=True + start from existing checkpoints by default. you can use updated_geom=True to discard existing checkpoints if the geometry of the route has changed. A single place can be returned multiple times: the recursive strategy creates diff --git a/homebytwo/routes/views.py b/homebytwo/routes/views.py index f57d5d21..36d14d81 100644 --- a/homebytwo/routes/views.py +++ b/homebytwo/routes/views.py @@ -171,7 +171,7 @@ def route_checkpoints_list(request, pk): "name": checkpoint.place.name, "field_value": checkpoint.field_value, "geom": json.loads(checkpoint.place.get_geojson(fields=["name"])), - "place_type": checkpoint.place.get_place_type_display(), + "place_type": checkpoint.place.place_type.name, "checked": checkpoint in existing_checkpoints, } for checkpoint in possible_checkpoints diff --git a/homebytwo/templates/routes/route/_route_checkpoint.html b/homebytwo/templates/routes/route/_route_checkpoint.html index 4289e7f0..16c1a72f 100644 --- a/homebytwo/templates/routes/route/_route_checkpoint.html +++ b/homebytwo/templates/routes/route/_route_checkpoint.html @@ -12,7 +12,7 @@ {{ schedule|duration:'hike' }}
- {{ place.get_place_type_display|default:'Unknown type' }} + {{ place.place_type.name|default:'Unknown type' }}
{{ distance|floatformat:1|intcomma }}km diff --git a/requirements/base.in b/requirements/base.in index 352ccc8e..ba755415 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -25,3 +25,4 @@ social-auth-core social-auth-app-django stravalib tables +tqdm From 7bb7c95ea251757ddd2fab8d83b3011ea07743f0 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 2 Nov 2020 11:09:07 +0200 Subject: [PATCH 02/21] HB2-66 new management commands for importing places --- CHANGELOG.md | 6 +- homebytwo/conftest.py | 89 ++- homebytwo/importers/geonames.py | 140 ++++ .../commands/import_geonames_places.py | 45 ++ .../commands/import_swissnames3d_places.py | 37 + .../management/commands/importswissname3d.py | 180 ----- .../0004_delete_swissname3dplace.py | 16 + homebytwo/importers/models/__init__.py | 1 - .../importers/models/swissname3dplace.py | 84 -- homebytwo/importers/swissnames3d.py | 145 ++++ homebytwo/importers/tests/data/404.html | 13 + .../tests/data/TestSwissNAMES3D_PKT.cpg | 1 - .../tests/data/TestSwissNAMES3D_PKT.dbf | Bin 22226 -> 0 bytes .../tests/data/TestSwissNAMES3D_PKT.prj | 1 - .../tests/data/TestSwissNAMES3D_PKT.qpj | 1 - .../tests/data/TestSwissNAMES3D_PKT.shp | Bin 1360 -> 0 bytes .../tests/data/TestSwissNAMES3D_PKT.shx | Bin 380 -> 0 bytes .../importers/tests/data/geonames_LI.txt | 200 +++++ .../importers/tests/data/geonames_LI.zip | Bin 0 -> 12562 bytes .../importers/tests/data/geonames_codes.html | 756 ++++++++++++++++++ .../tests/data/geonames_codes_one.html | 68 ++ .../tests/data/swissnames3d_LV03_test.csv | 203 +++++ .../tests/data/swissnames3d_LV95_test.csv | 203 +++++ .../tests/data/swissnames3d_data.zip | Bin 0 -> 27399 bytes .../importers/tests/test_import_places.py | 305 +++++++ homebytwo/importers/tests/test_stravaroute.py | 6 +- .../importers/tests/test_swissnames3d.py | 168 ---- homebytwo/importers/utils.py | 102 ++- homebytwo/routes/geonames.py | 147 ---- .../0050_create_place_type_model.py | 108 --- .../routes/migrations/0050_fix_route_data.py | 4 +- .../0051_create_place_type_model.py | 142 ++++ .../0051_delete_non_geonames_places.py | 18 - .../0052_remove_old_place_type_field.py | 26 - .../migrations/0053_merge_20201027_2129.py | 14 - homebytwo/routes/models/__init__.py | 2 +- homebytwo/routes/models/place.py | 169 ++-- homebytwo/routes/tests/factories.py | 12 +- homebytwo/routes/tests/test_coda.py | 14 +- homebytwo/routes/tests/test_place.py | 5 - homebytwo/routes/tests/test_tasks.py | 40 +- homebytwo/utils/factories.py | 4 +- readme.md | 2 +- virtualization/playbook.yml | 2 +- .../tasks/main.yml | 2 +- 45 files changed, 2536 insertions(+), 945 deletions(-) create mode 100644 homebytwo/importers/geonames.py create mode 100644 homebytwo/importers/management/commands/import_geonames_places.py create mode 100644 homebytwo/importers/management/commands/import_swissnames3d_places.py delete mode 100644 homebytwo/importers/management/commands/importswissname3d.py create mode 100644 homebytwo/importers/migrations/0004_delete_swissname3dplace.py delete mode 100644 homebytwo/importers/models/swissname3dplace.py create mode 100644 homebytwo/importers/swissnames3d.py create mode 100644 homebytwo/importers/tests/data/404.html delete mode 100644 homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.cpg delete mode 100644 homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.dbf delete mode 100644 homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.prj delete mode 100644 homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.qpj delete mode 100644 homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.shp delete mode 100644 homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.shx create mode 100644 homebytwo/importers/tests/data/geonames_LI.txt create mode 100644 homebytwo/importers/tests/data/geonames_LI.zip create mode 100644 homebytwo/importers/tests/data/geonames_codes.html create mode 100644 homebytwo/importers/tests/data/geonames_codes_one.html create mode 100644 homebytwo/importers/tests/data/swissnames3d_LV03_test.csv create mode 100644 homebytwo/importers/tests/data/swissnames3d_LV95_test.csv create mode 100644 homebytwo/importers/tests/data/swissnames3d_data.zip create mode 100644 homebytwo/importers/tests/test_import_places.py delete mode 100644 homebytwo/importers/tests/test_swissnames3d.py delete mode 100644 homebytwo/routes/geonames.py delete mode 100644 homebytwo/routes/migrations/0050_create_place_type_model.py create mode 100644 homebytwo/routes/migrations/0051_create_place_type_model.py delete mode 100644 homebytwo/routes/migrations/0051_delete_non_geonames_places.py delete mode 100644 homebytwo/routes/migrations/0052_remove_old_place_type_field.py delete mode 100644 homebytwo/routes/migrations/0053_merge_20201027_2129.py rename virtualization/roles/{swissname3d => swissnames3d}/tasks/main.yml (90%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ff3546c..369d4e9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,7 +67,7 @@ - The Strava API now uses refresh tokens and does not discloses email addresses ## [0.5.1] - 2018-08-31 Distinguish local from more important places -- SwissNAME3D has added a lot of unimportant local places. We want to filter them more efficiently, so we need to distinguish them from the real thing. +- SwissNAMES3D has added a lot of unimportant local places. We want to filter them more efficiently, so we need to distinguish them from the real thing. ## [0.5.0] - 2018-08-30 Filter proposed checkpoints by type ### Added @@ -126,9 +126,9 @@ ### Added - Import routes from Strava and Switzerland Mobility Plus -## [0.0.x] - 2018-07-04 Import places from SwissNAME3D +## [0.0.x] - 2018-07-04 Import places from SwissNAMES3D ### Added -- use a command to load places from SwissNAME3d shapefile +- use a command to load places from SwissNAMES3d shapefile ## [0.0.1] - 2016-12-04 First blood diff --git a/homebytwo/conftest.py b/homebytwo/conftest.py index b2fbe12f..09a7d8f3 100644 --- a/homebytwo/conftest.py +++ b/homebytwo/conftest.py @@ -52,14 +52,14 @@ def coda(settings): @fixture -def data_dir_path(request): +def current_dir_path(request): return Path(request.module.__file__).parent.resolve() @fixture -def open_file(data_dir_path): +def open_file(current_dir_path): def _open_file(file, binary=False): - return open_data(file, data_dir_path, binary) + return open_data(file, current_dir_path, binary) return _open_file @@ -106,22 +106,61 @@ def mocked_responses(): @fixture -def mock_json_response(read_file, mocked_responses): - def _mock_json_response( +def mock_file_response(mocked_responses, read_file): + def _mock_file_response( url, - response_json, + response_file, + binary=False, method="get", status=200, + content_type="text/html; charset=utf-8", + content_length="0", + replace=False, ): + kwargs = { + "method": HTTP_METHODS.get(method), + "url": url, + "content_type": content_type, + "body": read_file(response_file, binary=binary), + "status": status, + "headers": {"content-length": content_length}, + } + if replace: + mocked_responses.replace(**kwargs) + else: + mocked_responses.add(**kwargs) + + return _mock_file_response + + +@fixture +def mock_html_response(mock_file_response): + return partial(mock_file_response, content_type="text/html; charset=utf-8") + + +@fixture +def mock_html_not_found(mock_html_response): + return partial(mock_html_response, response_file="404.html", status=404) + + +@fixture +def mock_connection_error(mocked_responses): + def _mock_connection_error(url): mocked_responses.add( - HTTP_METHODS.get(method), - url=url, - content_type="application/json", - body=read_file(response_json), - status=status, + responses.GET, url, body=ConnectionError("Connection error. ") ) - return _mock_json_response + return _mock_connection_error + + +@fixture +def mock_json_response(mock_file_response): + return partial(mock_file_response, content_type="application/json") + + +@fixture +def mock_zip_response(mock_file_response): + return partial(mock_file_response, content_type="application/zip", binary=True) @fixture @@ -137,7 +176,7 @@ def _mock_strava_streams_response( ): mock_json_response( STRAVA_API_BASE_URL + "routes/%d/streams" % source_id, - response_json=streams_json, + response_file=streams_json, status=api_streams_status, ) @@ -176,12 +215,12 @@ def _mock_route_details_responses( "switzerland_mobility": "switzerland_mobility_route.json", } - api_response_file = api_response_json or default_api_response_json[data_source] + api_response_json = api_response_json or default_api_response_json[data_source] for source_id in source_ids: mock_json_response( url=api_request_url[data_source] % source_id, - response_json=api_response_file, + response_file=api_response_json, status=api_response_status, ) @@ -204,8 +243,8 @@ def _mock_route_details_response(data_source, source_id, *args, **kwargs): @fixture def mock_routes_response(settings, mock_json_response): - def _mock_routes_response(athlete, data_source, response_json=None, status=200): - response_jsons = { + def _mock_routes_response(athlete, data_source, response_file=None, status=200): + response_files = { "strava": "strava_route_list.json", "switzerland_mobility": "tracks_list.json", } @@ -216,7 +255,7 @@ def _mock_routes_response(athlete, data_source, response_json=None, status=200): } mock_json_response( url=routes_urls[data_source], - response_json=response_json or response_jsons[data_source], + response_file=response_file or response_files[data_source], method="get", status=status, ) @@ -251,12 +290,12 @@ def _mock_call_response( @fixture def mock_call_json_response(read_file, mock_call_response): def _mock_call_json_response( - call, url, response_json, method="get", status=200, *args, **kwargs + call, url, response_file, method="get", status=200, *args, **kwargs ): return mock_call_response( call, url, - body=read_file(response_json), + body=read_file(response_file), method=method, status=status, *args, @@ -273,7 +312,7 @@ def _mock_call_json_responses(call, response_mocks, *args, **kwargs): mocked_responses.add( HTTP_METHODS.get(response.get("method")) or responses.GET, response["url"], - body=read_file(response["response_json"]), + body=read_file(response["response_file"]), status=response.get("status") or 200, content_type="application/json", ) @@ -310,15 +349,15 @@ def _mock_import_route_call_response( @fixture -def mock_connection_error(mock_call_response): +def mock_call_connection_error(mock_call_response): return partial(mock_call_response, body=ConnectionError("Connection error.")) @fixture -def mock_server_error(mock_call_json_response): +def mock_call_server_error(mock_call_json_response): return partial(mock_call_json_response, status=500) @fixture -def mock_not_found_error(mock_call_json_response): - return partial(mock_call_json_response, status=404) +def mock_call_not_found(mock_call_json_response): + return partial(mock_call_json_response, response_file="404.json", status=404) diff --git a/homebytwo/importers/geonames.py b/homebytwo/importers/geonames.py new file mode 100644 index 00000000..cc2abf7f --- /dev/null +++ b/homebytwo/importers/geonames.py @@ -0,0 +1,140 @@ +import csv +from io import TextIOWrapper +from typing import IO, Iterator, Optional + +import requests +from lxml import html +from requests import ConnectionError, HTTPError + +from ..routes.models.place import PlaceTuple, PlaceType +from .utils import download_zip_file, get_csv_line_count, save_places_from_generator + +PLACE_TYPE_URL = "http://www.geonames.org/export/codes.html" +PLACE_DATA_URL = "https://download.geonames.org/export/dump/{scope}.zip" + + +def import_places_from_geonames( + scope: str = "allCountries", file: Optional[TextIOWrapper] = None +) -> str: + """ + import places from https://www.geonames.org/ + + :param scope: two letter country abbreviation (ISO-3166 alpha2; + see https://www.geonames.org/countries/), e.g. `CH` or `allCountries` + :param file: path to local unzipped file. If provided, the `scope` parameter + will be ignored and the local file will be used. + """ + try: + file = file or get_geonames_remote_file(scope) + except HTTPError as error: + return f"File for {scope} could not be downloaded from geonames.org: {error}. " + except ConnectionError: + return f"Error connecting to {PLACE_DATA_URL.format(scope=scope)}. " + + count = get_csv_line_count(file, header=False) + data = parse_places_from_csv(file) + + return save_places_from_generator(data, count) + + +def get_geonames_remote_file(scope: str = "allCountries") -> TextIOWrapper: + """ + retrieve zip file from https://download.geonames.org/export/dump/ + + :param scope: ISO-3166 alpha2 country abbreviation, e.g. `FR` or `allCountries` + """ + zip_file = download_zip_file(PLACE_DATA_URL.format(scope=scope)) + + return TextIOWrapper(zip_file.open(f"{scope}.txt")) + + +def parse_places_from_csv(file: IO) -> Iterator[PlaceTuple]: + """ + generator function to parse a geonames.org CSV file + + geonames.org CSV files are delimited by a tab character (\t) have no header row + and the following columns: + 0: geonameid : integer id of record in geonames database + 1: name : name of geographical point (utf8) varchar(200) + 2: asciiname : name of geographical point in plain ascii characters, + varchar(200) + 3: alternatenames : alternatenames, comma separated, ascii names automatically + transliterated, convenience attribute from alternatename + table, varchar(10000) + 4: latitude : latitude in decimal degrees (wgs84) + 5: longitude : longitude in decimal degrees (wgs84) + 6: feature class : see http://www.geonames.org/export/codes.html, char(1) + 7: feature code : see http://www.geonames.org/export/codes.html, varchar(10) + 8: country code : ISO-3166 2-letter country code, 2 characters + 9: cc2 : alternate country codes, comma separated, ISO-3166 2-letter + country code, 200 characters + 10: admin1 code : fipscode (subject to change to iso code), see exceptions + below, see file admin1Codes.txt for display names of this + code; varchar(20) + 11: admin2 code : code for the second administrative division, a county in + the US, see file admin2Codes.txt; varchar(80) + 12: admin3 code : code for third level administrative division, varchar(20) + 13: admin4 code : code for fourth level administrative division, varchar(20) + 14: population : bigint (8 byte int) + 15: elevation : in meters, integer + 16: dem : digital elevation model, srtm3 or gtopo30, average elevation + of 3''x3'' (ca 90mx90m) or 30''x30'' (ca 900mx900m) area in + meters, integer. srtm processed by cgiar/ciat. + 17: timezone : the iana timezone id (see file timeZone.txt) varchar(40) + 18: modification date : date of last modification in yyyy-MM-dd format + """ + data_reader = csv.reader(file, delimiter="\t") + for row in data_reader: + if row[0] and row[1] and row[4] and row[5] and row[7]: + yield PlaceTuple( + data_source="geonames", + source_id=int(row[0]), + name=row[1], + latitude=float(row[4]), + longitude=float(row[5]), + place_type=row[7], + altitude=float(row[14]), + srid=4326, + ) + + +def update_place_types_from_geonames() -> None: + """ + Scrape the page containing the reference of all features type + at http://www.geonames.org/export/codes.html and save the + result to the database. + """ + # retrieve page content with requests + print("importing place types from geonames... ") + response = requests.get(PLACE_TYPE_URL) + response.raise_for_status() + + # target table + xml = html.fromstring(response.content) + feature_type_table = xml.xpath('//table[@class="restable"]')[0] + + # parse place types from table rows + table_rows = feature_type_table.xpath(".//tr") + place_type_pks = [] + for row in table_rows: + + # header rows contain class information + if row.xpath(".//th"): + header_text = row.text_content() + feature_class, class_description = header_text.split(" ", 1) + current_feature_class = feature_class + + # non-header rows contain feature type + elif "tfooter" not in row.classes: + code, name, description = [ + element.text_content() for element in row.xpath(".//td") + ] + place_type, created = PlaceType.objects.get_or_create( + feature_class=current_feature_class, + code=code, + name=name, + description=description, + ) + place_type_pks.append(place_type.pk) + + PlaceType.objects.exclude(pk__in=place_type_pks).delete() diff --git a/homebytwo/importers/management/commands/import_geonames_places.py b/homebytwo/importers/management/commands/import_geonames_places.py new file mode 100644 index 00000000..fa0ad7ab --- /dev/null +++ b/homebytwo/importers/management/commands/import_geonames_places.py @@ -0,0 +1,45 @@ +import argparse + +from django.core.management import BaseCommand, CommandError + +from ...geonames import import_places_from_geonames + + +class Command(BaseCommand): + + help = "Import places from geonames.org" + + def add_arguments(self, parser): + # path to an optional local file instead of downloading from the remote service + parser.add_argument( + "-f", + "--files", + type=argparse.FileType("r"), + nargs="*", + default=None, + help="Provide local files instead of downloading. ", + ) + + # choose import scope + parser.add_argument( + "countries", + type=str, + nargs="*", + default=None, + help="Choose countries to import from, e.g. FR. ", + ) + + def handle(self, *args, **options): + + files = options["files"] or [] + for file in files: + msg = import_places_from_geonames(file=file) + self.stdout.write(self.style.SUCCESS(msg)) + + countries = options["countries"] or [] + for country in countries: + msg = import_places_from_geonames(scope=country) + self.stdout.write(self.style.SUCCESS(msg)) + + if not files and not countries: + raise CommandError("Please provide a country or a file. ") diff --git a/homebytwo/importers/management/commands/import_swissnames3d_places.py b/homebytwo/importers/management/commands/import_swissnames3d_places.py new file mode 100644 index 00000000..f246d394 --- /dev/null +++ b/homebytwo/importers/management/commands/import_swissnames3d_places.py @@ -0,0 +1,37 @@ +import argparse + +from django.core.management.base import BaseCommand + +from ...swissnames3d import import_places_from_swissnames3d + + +class Command(BaseCommand): + + help = "Import places from SwissNAMES3D" + + def add_arguments(self, parser): + # path to an optional local file instead of downloading from the remote service + parser.add_argument( + "-f", + "--file", + type=argparse.FileType("r"), + nargs="?", + default=None, + help="Provide a local file path instead of downloading. ", + ) + + # choose Swiss projection + parser.add_argument( + "-p", + "--projection", + type=str, + nargs="?", + default="LV95", + help="Choose a swiss projection LV95 (default) or LV03. ", + ) + + def handle(self, *args, **options): + file = options["file"] + projection = options["projection"] + msg = import_places_from_swissnames3d(file=file, projection=projection) + self.stdout.write(self.style.SUCCESS(msg)) diff --git a/homebytwo/importers/management/commands/importswissname3d.py b/homebytwo/importers/management/commands/importswissname3d.py deleted file mode 100644 index 89843079..00000000 --- a/homebytwo/importers/management/commands/importswissname3d.py +++ /dev/null @@ -1,180 +0,0 @@ -from pathlib import Path - -from django.contrib.gis.gdal import DataSource -from django.contrib.gis.gdal import error as gdal_error -from django.contrib.gis.utils import LayerMapping -from django.core.management.base import BaseCommand, CommandError - -from ...models import Swissname3dPlace - - -class Command(BaseCommand): - - help = "Import places from the SwissNAME3D_PKT shapefile" - - def add_arguments(self, parser): - - # path to the shapefile - parser.add_argument( - "shapefile", type=str, help="Path to the shapefile to import. " - ) - - # Limit to number of places - parser.add_argument( - "--limit", - type=int, - nargs="?", - default=-1, - help=("Limits the number of imported features. "), - ) - - # Deletes all existing SwissNAME3D places - parser.add_argument( - "--delete", - "--drop", - action="store_true", - dest="delete", - default=False, - help=("Deletes all existing SwissNAME3D places before the import. "), - ) - - # runs without asking any questions - parser.add_argument( - "--noinput", - "--no-input", - action="store_false", - dest="interactive", - default=True, - help=("Tells Django to NOT prompt the user for input of any kind. "), - ) - - def query_yes_no(self, question, default="yes"): - """Ask a yes/no question via raw_input() and return their answer. - http://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input - - "question" is a string that is presented to the user. - "default" is the presumed answer if the user just hits . - It must be "yes" (the default), "no" or None (meaning - an answer is required of the user). - - The "answer" return value is True for "yes" or False for "no". - """ - valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} - if default is None: - prompt = " [y/n] " - elif default == "yes": - prompt = " [Y/n] " - elif default == "no": - prompt = " [y/N] " - else: - raise ValueError("invalid default answer: '%s'" % default) - - while True: - self.stdout.write(question + prompt) - choice = input().lower() - if default is not None and choice == "": - return valid[default] - elif choice in valid: - return valid[choice] - else: - self.stdout.write( - "Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n" - ) - - def delete(self, interactive): - """ - Delete all existing objects from the Database - """ - - places = Swissname3dPlace.objects.all() - place_count = places.count() - - if interactive: - self.stdout.write("Deleting %d places from the Database" % (place_count)) - - if not self.query_yes_no("Do you want to continue?", "no"): - error_msg = "You have canceled the operation." - raise CommandError(error_msg) - - # Delete all places - places.delete() - - # Inform on successful deletion - msg = "Successfully deleted %d places." % place_count - self.stdout.write(self.style.SUCCESS(msg)) - - def handle(self, *args, **options): - - # Generate path and make sure the file exists - shapefile_path = Path(options["shapefile"]).resolve() - shapefile = str(shapefile_path) - if not shapefile_path.exists(): - error_msg = "The file '{}' could not be found.".format(shapefile) - raise OSError(error_msg) - - # Define mapping between layer fields of the shapefile - # and fields of Place Model - swissname3d_mapping = { - "place_type": "OBJEKTART", - "altitude": "HOEHE", - "name": "NAME", - "geom": "POINT25D", - "source_id": "UUID", - } - - # Try to map the data - try: - layermapping = LayerMapping( - Swissname3dPlace, - shapefile, - swissname3d_mapping, - transform=True, - encoding="utf-8", - ) - - except gdal_error.GDALException: - error_msg = ( - "The shapefile fields could not be interpreted.\nAre you sure " - '"%s" is the SwissNAME3D_PKT shapefile?' % shapefile - ) - raise CommandError(error_msg) - - # Delete existing records if requested - if options["delete"]: - self.delete(options["interactive"]) - - mapping_options = { - "strict": True, - "stream": self.stdout, - "progress": True, - } - - # Get the number of features - datasource = DataSource(shapefile) - layer = datasource[0] - feature_count = len(layer) - - # Display number of features to import - limit = options["limit"] - if limit > -1: - feature_count = min(feature_count, limit) - mapping_options["fid_range"] = (0, limit) - mapping_options["progress"] = False - else: - mapping_options["step"] = 1000 - - # Ask for user confirmation - if options["interactive"]: - self.stdout.write("Saving %d places from %s" % (feature_count, shapefile)) - - if not self.query_yes_no("Do you want to continue?"): - error_msg = "You have canceled the operation." - raise CommandError(error_msg) - - # Save the mapped data to the Database - self.stdout.write("Importing places...") - layermapping.save(**mapping_options) - - # Inform on successful save - msg = "Successfully imported %d places." % feature_count - self.stdout.write(self.style.SUCCESS(msg)) diff --git a/homebytwo/importers/migrations/0004_delete_swissname3dplace.py b/homebytwo/importers/migrations/0004_delete_swissname3dplace.py new file mode 100644 index 00000000..b1699cd5 --- /dev/null +++ b/homebytwo/importers/migrations/0004_delete_swissname3dplace.py @@ -0,0 +1,16 @@ +# Generated by Django 2.2.16 on 2020-11-01 13:58 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('importers', '0003_auto_20170315_2102'), + ] + + operations = [ + migrations.DeleteModel( + name='Swissname3dPlace', + ), + ] diff --git a/homebytwo/importers/models/__init__.py b/homebytwo/importers/models/__init__.py index 029c1be1..a29f36a0 100644 --- a/homebytwo/importers/models/__init__.py +++ b/homebytwo/importers/models/__init__.py @@ -1,3 +1,2 @@ from .stravaroute import StravaRoute # NOQA -from .swissname3dplace import Swissname3dPlace # NOQA from .switzerlandmobilityroute import SwitzerlandMobilityRoute # NOQA diff --git a/homebytwo/importers/models/swissname3dplace.py b/homebytwo/importers/models/swissname3dplace.py deleted file mode 100644 index 8d329e35..00000000 --- a/homebytwo/importers/models/swissname3dplace.py +++ /dev/null @@ -1,84 +0,0 @@ -from django.contrib.gis.db import models - -from ...routes.models import Place - - -class Swissname3dManager(models.Manager): - def get_queryset(self): - return super().get_queryset().filter(data_source="swissname3d") - - -class Swissname3dPlace(Place): - """ - Extends the Place Model with methods specific to SwissNAME3D. - Model inheritance is achieved with a proxy model, - to preserve performance when importing >200'000 places from the shapefile. - SwissNAMES3D is the most comprehensive collection of geographical names - for Switzerland and Liechtenstein. - https://opendata.swiss/en/dataset/swissnames3d-geografische-namen-der-landesvermessung - """ - - # translation map for type of places - PLACE_TYPE_TRANSLATIONS = { - "Alpiner Gipfel": Place.SUMMIT, - "Ausfahrt": Place.EXIT, - "Aussichtspunkt": Place.POINT_OF_VIEW, - "Bildstock": Place.WAYSIDE_SHRINE, - "Brunnen": Place.FOUNTAIN, - "Denkmal": Place.MONUMENT, - "Ein- und Ausfahrt": Place.ENTRY_AND_EXIT, - "Erratischer Block": Place.BOULDER, - "Felsblock": Place.BELAY, - "Felskopf": Place.BELAY, - "Flurname swisstopo": Place.LOCAL_PLACE, - "Gebaeude Einzelhaus": Place.SINGLE_BUILDING, - "Gebaeude": Place.SINGLE_BUILDING, - "Gipfel": Place.SUMMIT, - "Grotte, Hoehle": Place.CAVE, - "Haltestelle Bahn": Place.TRAIN_STATION, - "Haltestelle Bus": Place.BUS_STATION, - "Haltestelle Schiff": Place.BOAT_STATION, - "Hauptgipfel": Place.SUMMIT, - "Haupthuegel": Place.HILL, - "Huegel": Place.HILL, - "Kapelle": Place.CHAPEL, - "Landesgrenzstein": Place.LANDMARK, - "Lokalname swisstopo": Place.PLACE, - "Offenes Gebaeude": Place.OPEN_BUILDING, - "Pass": Place.PASS, - "Quelle": Place.SOURCE, - "Sakrales Gebaeude": Place.SACRED_BUILDING, - "Strassenpass": Place.ROAD_PASS, - "Turm": Place.TOWER, - "Uebrige Bahnen": Place.OTHER_STATION, - "Verladestation": Place.LOADING_STATION, - "Verzweigung": Place.INTERCHANGE, - "Wasserfall": Place.WATERFALL, - "Zollamt 24h 24h": Place.CUSTOMHOUSE_24H, - "Zollamt 24h eingeschraenkt": Place.CUSTOMHOUSE_24H_LIMITED, - "Zollamt eingeschraenkt": Place.CUSTOMHOUSE_LIMITED, - } - - objects = Swissname3dManager() - - class Meta: - proxy = True - - def save(self, *args, **kwargs): - """ - PLAs from the SwissNAME3D_PKT file are imported - with the command './manage.py importswissname3d shapefile'. - If a place is already in the database, it is skipped. - To refresh the data, call the command with the '--delete' option - """ - - # Skip if the record is already in the Database - if Swissname3dPlace.objects.filter(source_id=self.source_id).exists(): - pass - else: - # Translate place type from German to English. - self.place_type = self.PLACE_TYPE_TRANSLATIONS[self.place_type] - # set datasource to swissname3d - self.data_source = "swissname3d" - # Save with the parent method - super().save(*args, **kwargs) diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py new file mode 100644 index 00000000..8497e1ff --- /dev/null +++ b/homebytwo/importers/swissnames3d.py @@ -0,0 +1,145 @@ +import csv +from io import TextIOWrapper +from typing import Iterator, Optional +from zipfile import ZipFile + +from requests import ConnectionError, HTTPError + +from ..routes.models.place import PlaceTuple +from .utils import download_zip_file, get_csv_line_count, save_places_from_generator + +PLACE_DATA_URL = "http://data.geo.admin.ch/ch.swisstopo.swissnames3d/data.zip" +PROJECTION_SRID = {"LV03": 21781, "LV95": 2056} + +# translation map for type of places +PLACE_TYPE_TRANSLATIONS = { + "Alpiner Gipfel": "PK", + "Ausfahrt": "RDJCT", + "Aussichtspunkt": "PROM", + "Bildstock": "SHRN", + "Brunnen": "WTRW", + "Denkmal": "MNMT", + "Ein- und Ausfahrt": "RDJCT", + "Erratischer Block": "RK", + "Felsblock": "RK", + "Felskopf": "CLF", + "Flurname swisstopo": "PPLL", + "Gebaeude Einzelhaus": "BLDG", + "Gebaeude": "BLDG", + "Gipfel": "PK", + "Grotte, Hoehle": "CAVE", + "Haltestelle Bahn": "RSTP", + "Haltestelle Bus": "BUSTP", + "Haltestelle Schiff": "LDNG", + "Hauptgipfel": "PK", + "Haupthuegel": "HLL", + "Huegel": "HLL", + "Kapelle": "CH", + "Landesgrenzstein": "BP", + "Lokalname swisstopo": "PPL", + "Offenes Gebaeude": "BLDG", + "Pass": "PASS", + "Quelle": "SPNG", + "Sakrales Gebaeude": "CH", + "Strassenpass": "PASS", + "Turm": "TOWR", + "Uebrige Bahnen": "RSTP", + "Verladestation": "TRANT", + "Verzweigung": "RDJCT", + "Wasserfall": "FLLS", + "Zollamt 24h 24h": "PSTB", + "Zollamt 24h eingeschraenkt": "PSTB", + "Zollamt eingeschraenkt": "PSTB", +} + + +def import_places_from_swissnames3d( + projection: str = "LV95", file: Optional[TextIOWrapper] = None +) -> str: + """ + import places from SwissNAMES3D + + :param projection: "LV03" or "LV95" + see http://mapref.org/CoordinateReferenceFrameChangeLV03.LV95.html#Zweig1098 + :param file: path to local unzipped file. if provided, the `projection` + parameter will be ignored. + """ + try: + file = file or get_swissnames3d_remote_file(projection=projection) + except HTTPError as error: + return f"Error downloading {PLACE_DATA_URL}: {error}. " + except ConnectionError: + return f"Error connecting to {PLACE_DATA_URL}. " + + count = get_csv_line_count(file, header=True) + data = parse_places_from_csv(file, projection=projection) + + return save_places_from_generator(data=data, count=count) + + +def get_swissnames3d_remote_file(projection: str = "LV95") -> TextIOWrapper: + """ + :param projection: "LV03" or "LV95" + """ + zip_root = download_zip_file(PLACE_DATA_URL) + return unzip_swissnames3d_remote_file(zip_root, projection) + + +def unzip_swissnames3d_remote_file( + zip_file: ZipFile, projection: str = "LV95" +) -> TextIOWrapper: + """ + unzip the csv file corresponding to the requested projection + """ + # a zip inside a zip + zip_name = f"swissNAMES3D_{projection}.zip" + print(f"unzipping {zip_name}") + inner_zip = ZipFile(zip_file.open(zip_name)) + + # e.g. swissNAMES3D_LV03/csv_LV03_LN02/swissNAMES3D_PKT.csv + file_name = f"swissNAMES3D_{projection}/csv_{projection}_LN02/swissNAMES3D_PKT.csv" + print(f"extracting {file_name}") + return TextIOWrapper(inner_zip.open(file_name)) + + +def parse_places_from_csv( + file: TextIOWrapper, projection: str = "LV95" +) -> Iterator[PlaceTuple]: + """ + generator function to parse a CSV file from swissnames3d + + swissnames3d CSV files are delimited by a semi-colon character (;) have a header row + and the following columns: + 0: UUID : feature UUID + 1: OBJEKTART : feature type, see + 2: OBJEKTKLASSE_TLM : feature class + 3: HOEHE : elevation + 4: GEBAEUDENUTZUNG : building use + 5: NAME_UUID : name UUID + 6: NAME : name + 7: STATUS : name status: official, foreign or usual + 8: SPRACHCODE : language + 9: NAMEN_TYP : type of name: simple name, endonym or name pair: Biel/Bienne + 10: NAMENGRUPPE_UUID : name group UUID + 11: E : longitude in the projection's coordinate system + 12: N : latitude in the projection's coordinate system + 13: Z : elevation + """ + # initialize csv reader + data_reader = csv.reader(file, delimiter=";") + + # skip header row + next(data_reader) + + for row in data_reader: + if row[7] == "offiziell": + yield PlaceTuple( + data_source="swissnames3d", + source_id=row[0], + name=row[6], + longitude=float(row[11]), + latitude=float(row[12]), + place_type=PLACE_TYPE_TRANSLATIONS[row[1]], + altitude=float(row[13]), + srid=PROJECTION_SRID[projection], + ) diff --git a/homebytwo/importers/tests/data/404.html b/homebytwo/importers/tests/data/404.html new file mode 100644 index 00000000..d58bb8c7 --- /dev/null +++ b/homebytwo/importers/tests/data/404.html @@ -0,0 +1,13 @@ + + + + + 404 Not Found + + + +

Not Found

+

The requested URL was not found on this server.

+ + + diff --git a/homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.cpg b/homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.cpg deleted file mode 100644 index 3ad133c0..00000000 --- a/homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.cpg +++ /dev/null @@ -1 +0,0 @@ -UTF-8 \ No newline at end of file diff --git a/homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.dbf b/homebytwo/importers/tests/data/TestSwissNAMES3D_PKT.dbf deleted file mode 100644 index 441c2850081909271de4ea563a77576c3fd84928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22226 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 TP}&blCqU^UDBS|3r-5hyA$lot diff --git a/homebytwo/importers/tests/data/geonames_LI.txt b/homebytwo/importers/tests/data/geonames_LI.txt new file mode 100644 index 00000000..3b2b94d3 --- /dev/null +++ b/homebytwo/importers/tests/data/geonames_LI.txt @@ -0,0 +1,200 @@ +2658099 Vorder-Grauspitz Vorder-Grauspitz Grauspitz 47.05272 9.58128 T PK LI LI,CH 0 2600 2488 Europe/Vaduz 2019-02-16 +2660346 Hinter-Grauspitz Hinter-Grauspitz Grauspitz,Schwarzhorn 47.05481 9.58745 T PK LI CH,LI 0 2574 2534 Europe/Vaduz 2019-02-16 +2768948 Pfälzer Hütte Pfaelzer Huette 47.07132 9.61328 S HTL LI LI 0 2108 2098 Europe/Vaduz 2010-07-18 +3042029 Vorderer Schellenberg Vorderer Schellenberg Vorder-Schellenberg,Vorderer Schellenberg,Vorderschellenberg 47.22802 9.53902 P PPLX LI 08 0 570 Europe/Vaduz 2015-07-03 +3042030 Vaduz Vaduz Bantouz,QVU,Vaduc,Vaducas,Vaduz,Vaduzo,fado~utsu,paducheu,vadutsi,wa dou zi,Βαντούζ,Вадуц,פאדוץ,ვადუცი,ፋዱጽ,ファドゥーツ,瓦都茲,파두츠 47.14151 9.52154 P PPLC LI 11 5197 465 Europe/Vaduz 2013-04-02 +3042031 Vaduz Vaduz Gemeinde Vaduz,Vaduz 47.14539 9.52655 A ADM1 LI 11 5197 656 Europe/Vaduz 2014-03-05 +3042032 Under Riet Under Riet Under Riet,Unteres Riet 47.25357 9.54576 V CULT LI 00 0 431 Europe/Vaduz 2015-08-07 +3042033 Triesenberg Triesenberg Triesenberg,torizenberuku,トリーゼンベルク 47.11815 9.54197 P PPLA LI 10 2689 854 Europe/Vaduz 2013-04-02 +3042034 Triesenberg Triesenberg Gemeinde Triesenberg,Triesenberg,Triesenberg / Steg / Malbun 47.12663 9.55962 A ADM1 LI 10 2689 1522 Europe/Vaduz 2014-03-05 +3042035 Triesen Triesen Triesen,Trizen,torizen,Тризен,トリーゼン 47.10752 9.52815 P PPLA LI 09 4701 500 Europe/Vaduz 2013-10-13 +3042036 Triesen Triesen Gemeinde Triesen,Triesen 47.08381 9.55517 A ADM1 LI 09 4701 1462 Europe/Vaduz 2014-03-05 +3042037 Schellenberg Schellenberg Schellenberg,sherenberuku,シェレンベルク 47.23123 9.54678 P PPLA LI 08 1004 631 Europe/Vaduz 2013-04-02 +3042038 Schellenberg Schellenberg Gemeinde Schellenberg,Schellenberg 47.23431 9.55103 A ADM1 LI 08 1004 652 Europe/Vaduz 2014-03-05 +3042039 Scheuakopf Scheuakopf Matlerkopf,Scheienkopf,Scheuenkopf 47.12807 9.63496 T PK LI LI 0 2159 2119 Europe/Vaduz 2010-07-16 +3042040 Schaanwald Schaanwald 47.21187 9.5624 P PPL LI 04 0 462 Europe/Vaduz 2013-04-02 +3042041 Schaan Schaan Schaan,Schan,Shaan,shan,Шаан,شان,シャーン 47.16498 9.50867 P PPLA LI 07 5748 453 Europe/Vaduz 2013-10-13 +3042042 Schaan Schaan Gemeinde Schaan,Schaan 47.17433 9.52401 A ADM1 LI 07 5748 499 Europe/Vaduz 2014-03-05 +3042043 Sareiserjoch Sareiserjoch Sareiser Joch,Sareiserjoch 47.09521 9.62539 T PASS LI 10 0 1992 1996 Europe/Vaduz 2019-02-13 +3042044 Saminatal Saminatal Samina Thal 47.147 9.58145 T VAL LI LI 00 0 1009 Europe/Vaduz 2010-07-14 +3042046 Ruggell Ruggell Rugell,Ruggell,Ruggell',ruggeru,Руггелль,ルッゲル 47.23799 9.5254 P PPLA LI 06 1862 434 Europe/Vaduz 2019-02-27 +3042047 Ruggell Ruggell Gemeinde Ruggell,Ruggell 47.24502 9.53323 A ADM1 LI 06 1862 432 Europe/Vaduz 2014-03-05 +3042048 Rhätikon Rhatikon Raetikon,Rhaetikon,Rhatikon Mountains,Rhätikon Mountains,Rätikon 47.05562 9.60445 T MTS LI LI 00 0 2180 Europe/Vaduz 2010-08-10 +3042049 Planken Planken Blanken,Planken,puranken,Планкен,プランケン 47.18516 9.54437 P PPLA LI 05 377 785 Europe/Vaduz 2013-04-02 +3042050 Planken Planken Gemeinde Planken,Planken 47.18015 9.55994 A ADM1 LI 05 377 1257 Europe/Vaduz 2014-03-05 +3042051 Ochsenkopf Ochsenkopf Ochsenberg 47.11466 9.62466 T PK LI LI 10 0 2285 2228 Europe/Vaduz 2019-02-13 +3042052 Nendeln Nendeln 47.19846 9.543 P PPL LI 02 0 461 Europe/Vaduz 2013-04-02 +3042054 Mittlerer Schellenberg Mittlerer Schellenberg Mittler-Schellenberg,Mittlerer Schellenberg,Mittlerschellenberg 47.23148 9.54653 P PPLX LI 08 0 636 Europe/Vaduz 2015-07-03 +3042055 Mauren Mauren Mauern,Mauren,Mauren FL,mauren,マウレン 47.21805 9.5442 P PPLA LI 04 3626 452 Europe/Vaduz 2017-12-21 +3042056 Mauren Mauren Gemeinde Mauren,Maurehn,Mauren,Mauren-Schaanwald,Maurenas,mao lun,maulen,mauren,mawrn,mawyrn,mea rein,Маурен,Маўрэн,מאורן,ماؤرن,ماورن,ماویرن,เมาเริน,マウレン,毛伦,마우렌 47.21513 9.55898 A ADM1 LI 04 3626 439 Europe/Vaduz 2014-03-05 +3042057 Mattajoch Mattajoch Matla Joch,Matlerjoch 47.13193 9.6256 T PASS LI LI 00 0 1867 1861 Europe/Vaduz 2019-02-13 +3042058 Principality of Liechtenstein Principality of Liechtenstein Categoria:Liechtenstein,Furstentum Liechtenstein,Fürstentum Liechtenstein,Lekitenisaini,Lektenstaen,Lestenstin,Liachtnstoa,Licansitan,Lich-ten-xten,Lich-ten-xten (Liechtenstein),Lich-ten-xtên,Lich-ten-xtên (Liechtenstein),Lichtenstain,Lichtenstajnsko,Lichtenstayn,Lichtenstein,Lichtensteinas,Lichtenstejnsko,Lichtenstenum,Lichtenstàin,Lichtenštajnsko,Lichtenšteinas,Lichtenštejnsko,Lichtinstein,Lichtinstéin,Lichtènstayn,Licitensitayini,Liechtensteen,Liechtenstein,Liechtenstein ,Liechtestein,Liechtnsta,Liechtnstâ,Ligtaenstaen,Ligtänstän,Lihtenshtajn,Lihtenshtajni,Lihtenstajn,Lihtenstayn,Lihtensteina,Lihtenstejn,Lihtenstejno,Lihtenştayn,Lihtenštajn,Lihtenšteina,Lihtënshtajn,Likhtenshhajn,Likhtenshtajn,Likhtenshtejn,Liktenstein,Lincenstayn,Lishenteni,Lishuteni,Lishyitenshitayini,Lishɛteni,Listenstaina,Listenstein,Listinstayn,Lisɛnsitayini,Litsenstein nutome,Lixtenshteyn,Lixtensteyn,Lixtenşteyn,Liĥtenŝtejno,Luliilu,Lychtenstein,Lîştinştayn,Orileede Lesitenisiteni,Orílẹ́ède Lẹṣitẹnisiteni,Principality of Liechtenstein,Principato del Liechtenstein,i-Liechtenstein,laicatenste'ina,li'ekhatensta'ina,liccensteyn,licenaste'ina,licesti'anan,lie zhi dun shi deng,lie zhi dun si deng,lihitensyutain,lik tens tin,likatenstina,likhtensta'ina,liktesten,lincenasta'ina,listenasta'ina,liyaqtamstina,lykhtnshtayn,lyktnshtyn,lyktnstyn,lyktnstyyn,pra thes lik tens tin,rihitenshutain,rihitenshutain gong guo,Λιχτενστάιν,Лихтенштајн,Лихтенштейн,Лихтенщайн,Ліхтенштейн,Ліхтэнштайн,Ліхтэнштэйн,Լիխտենշտեյն,ליכטנשטיין,لىختېنشتېين,ليختنشتاين,لیختنشتاین,لیختن‌اشتاین,لیشٹنسٹائن,لیکتنستین,ܠܝܟܛܢܫܛܝܢ,लिंचेनस्टाइन,लिएखटेन्स्टाइन,लिकटेंस्टीन,लिख्टेंश्टाइन,लियक़्टँस्टीन,लीश्टेनस्टाईन,লিচেনস্টেইন,લૈચટેંસ્ટેઇન,ଲିଚେସ୍ତିଆନାନ୍,லிச்செண்ஸ்டெய்ன்,లిక్టెస్టేన్,ಲಿಚೆನ್‌ಸ್ಟೈನ್,ലൈച്ടെസ്റ്റിന്‍,ประเทศลิกเตนสไตน์,ลิกเตนสไตน์,ໄລເທນສະໄຕ,ལེག་ཏེན་ཚིན།,ლიხტენშტაინი,ლიხტენშტეინი,ሊችተንስታይን,លិចទេនស្តែន,リヒテンシュタイン,リヒテンシュタイン公国,列支敦士登,列支敦斯登,리히텐슈타인 47.16667 9.53333 A PCLI LI 00 37910 730 Europe/Vaduz 2020-03-29 +3042060 Hinterschellenberg Hinterschellenberg Hinter-Schellenberg,Hinterer Schellenberg 47.24102 9.55879 P PPLX LI LI 08 0 613 Europe/Vaduz 2008-07-25 +3042062 Gamprin Gamprin Gambrin,Gamprin,Gamprin-Bendern,ganpurin,Гамприн,ガンプリン 47.22038 9.50935 P PPLA LI 03 1268 470 Europe/Vaduz 2019-10-22 +3042063 Gamprin Gamprin Gamprin,Gamprin-Bendern,Gemeinde Gamprin,Gemeinde Gamprin-Bendern 47.21986 9.50995 A ADM1 LI 03 1268 476 Europe/Vaduz 2017-07-25 +3042064 Galinakopf Galinakopf 47.15163 9.62055 T PK LI LI 0 2198 2163 Europe/Vaduz 2019-02-13 +3042065 Fürstensteig Fuerstensteig 47.14536 9.54783 T MT LI LI 00 0 1655 Europe/Vaduz 2010-07-18 +3042068 Eschen Eschen Eschen,esshen,エッシェン 47.21071 9.52223 P PPLA LI 02 4008 446 Europe/Vaduz 2013-04-02 +3042069 Eschen Eschen Ehshehn,Ehshen,Eschen,Eschen / Nendeln,Eschen-Nedeln,Eschen-Nendeln,Esenas,Eshen,Ešenas,Gemeinde Eschen,Gemeinde Eschen-Nendeln,ai shen,ashn,ayshn,esshen,esyen,xeschein,Ешен,Эшен,Эшэн,אשן,اشن,ایشن,เอสเชิน,エッシェン,埃申,에셴 47.20178 9.53588 A ADM1 LI 02 4008 437 Europe/Vaduz 2014-03-05 +3042070 Drei Schwestern Drei Schwestern Drey Schwestern,Drue-Schwoeschtra,Drü-Schwöschtra 47.17556 9.57287 T PK LI LI 05 0 2052 1994 Europe/Vaduz 2019-02-13 +3042072 Bendern Bendern 47.21199 9.50678 P PPL LI 03 0 446 Europe/Vaduz 2017-12-22 +3042073 Balzers Balzers Balzers,baruzasu,バルザース 47.06665 9.50251 P PPLA LI 01 4447 476 Europe/Vaduz 2019-02-26 +3042074 Balzers Balzers Balzers,Balzers / Mals,Balzers / Mäls,Gemeinde Balzers 47.0677 9.50408 A ADM1 LI 01 4447 474 Europe/Vaduz 2014-03-05 +3315349 Mäls Mals Mals,Mäls 47.06105 9.49568 P PPL LI 01 0 477 Europe/Vaduz 2015-07-03 +3315350 Lawena Lawena 47.06656 9.55853 T VAL LI LI 00 0 1529 1520 Europe/Vaduz 2010-07-18 +3315351 Wangerberg Wangerberg Wangerbarg,Wangerbärg 47.10589 9.54463 P PPL LI LI 10 0 866 Europe/Vaduz 2010-07-16 +3315352 Sücka Suecka 47.11621 9.56547 S HSE LI 10 0 1407 Europe/Vaduz 2017-03-19 +3315353 Rotenboden Rotenboden Rotaboda 47.12972 9.53802 P PPL LI LI 10 0 1006 Europe/Vaduz 2008-07-25 +3315354 Silum Silum Silum 47.13183 9.55377 P PPL LI 10 0 1481 Europe/Vaduz 2015-07-03 +3315355 Valüna Valuna 47.07815 9.5913 T VAL LI 00 0 1500 Europe/Vaduz 2015-07-03 +3315356 Masescha Masescha Masescha 47.13271 9.54454 P PPL LI 10 0 1246 Europe/Vaduz 2015-07-03 +3315357 Gaflei Gaflei Gaflei 47.14345 9.54448 V FRST LI 10 0 1487 Europe/Vaduz 2015-07-03 +3315358 Möliholz Moliholz Moliholz,Muhleholz,Möliholz,Mühleholz 47.15569 9.51111 P PPL LI 11 0 471 Europe/Vaduz 2015-07-03 +3315359 Ebaholz Ebaholz Ebaholz,Ebenholz 47.1488 9.51287 P PPLX LI 11 0 480 Europe/Vaduz 2015-07-03 +6520526 Hotel Gorfion HOTEL GORFION 47.1024 9.6085 S HTL LI 0 1604 Europe/Vaduz 2007-04-15 +6545409 Malbun Malbun 47.10139 9.60986 P PPL LI 10 50 1600 1611 Europe/Vaduz 2015-02-06 +6545410 Steg Steg 47.11266 9.57536 P PPL LI 10 50 1400 1300 Europe/Vaduz 2015-02-06 +6938744 Plasteikopf Plasteikopf 47.06508 9.57726 T PK LI LI 0 2355 2290 Europe/Vaduz 2019-02-13 +6938746 Mittlerspitz Mittlerspitz 47.06513 9.53972 T PK LI LI,CH 0 1899 1871 Europe/Vaduz 2019-02-13 +6938759 Mittagsspitz Mittagsspitz Triesner-Mittagspitz 47.06926 9.53409 T PK LI LI 0 1857 1809 Europe/Vaduz 2019-02-16 +6938779 Hochspeler Hochspeler Hochspieler 47.07326 9.57145 T PK LI LI 0 2225 2187 Europe/Vaduz 2019-02-13 +6938787 Rappenstein Rappenstein 47.07617 9.56644 T PK LI 0 2221 2172 Europe/Vaduz 2010-07-16 +6938790 Rappastein Rappastein Rappenstein 47.0768 9.5659 T PK LI LI 0 2221 2181 Europe/Vaduz 2019-02-13 +6938803 Langspitz Langspitz 47.0794 9.55965 T PK LI LI 0 2006 1965 Europe/Vaduz 2019-02-13 +6938805 Koraspitz Koraspitz 47.07944 9.55676 T PK LI 0 1928 1841 Europe/Vaduz 2019-02-16 +6938814 Goldlochspitz Goldlochspitz 47.0821 9.56746 T PK LI LI 0 2110 2022 Europe/Vaduz 2019-02-13 +6938835 Spitz Spitz 47.08651 9.62369 T PK LI 0 2187 2151 Europe/Vaduz 2019-02-16 +6938843 Kolme Kolme Kolmi 47.08758 9.57218 T PK LI LI 0 1993 1969 Europe/Vaduz 2019-02-13 +6938851 Bödele Boedele 47.09106 9.57068 T PK LI 0 1913 1883 Europe/Vaduz 2010-07-16 +6938856 Nospitz Nospitz 47.09319 9.59827 T PK LI LI 0 2090 2036 Europe/Vaduz 2019-02-13 +6938859 Heubühl Heubuehl 47.09431 9.56883 T PK LI 0 1936 1901 Europe/Vaduz 2010-07-16 +6938866 Heubüal Heubueal 47.09662 9.5668 T PK LI 0 1936 1913 Europe/Vaduz 2019-02-13 +6938902 Kirchlespitz Kirchlespitz 47.10501 9.58761 T PK LI 0 1892 1866 Europe/Vaduz 2019-02-13 +6938905 Chrüppel Chrueppel Krueppel,Krüppel 47.10627 9.56569 T PK LI 10 0 1706 1694 Europe/Vaduz 2019-02-13 +6938920 Gamsgrat Gamsgrat Gamsgrad,Gamsgrat 47.108 9.62264 T PK LI LI,AT 0 2246 2180 Europe/Vaduz 2017-02-19 +6938945 Kirchle Kirchle 47.11956 9.59816 T PK LI 0 1914 1855 Europe/Vaduz 2010-07-16 +6938951 Bergle Bergle 47.12086 9.58334 T PK LI 0 1929 1892 Europe/Vaduz 2009-03-19 +6938956 Stachlerkopf Stachlerkopf 47.12213 9.59226 T PK LI 0 2071 2031 Europe/Vaduz 2019-02-14 +6938960 Drei Kapuziner Drei Kapuziner 47.12453 9.58889 T PK LI 0 2085 2038 Europe/Vaduz 2019-02-14 +6938974 Schönberg Schoenberg 47.13037 9.59301 T PK LI 0 2104 2082 Europe/Vaduz 2019-02-14 +6938981 Plattenspitz Plattenspitz 47.13312 9.55851 T PK LI 0 1704 1671 Europe/Vaduz 2019-02-16 +6938994 Rucheck Rucheck 47.13713 9.61385 T PK LI 0 1742 1711 Europe/Vaduz 2009-03-19 +6939018 Wurmtalkopf Wurmtalkopf 47.14589 9.62583 T PK LI 0 2006 1984 Europe/Vaduz 2019-02-16 +6939034 Helwangspitz Helwangspitz 47.14864 9.56183 T PK LI LI 0 1999 1970 Europe/Vaduz 2019-02-13 +6939061 Hächlaköpfe Haechlakoepfe Hechlekopf 47.15346 9.60292 T PK LI LI 0 1858 1827 Europe/Vaduz 2010-07-18 +6939093 Gafleispitz Gafleispitz Gafleichoepfli,Gafleichöpfli 47.15894 9.55496 T PK LI 10 0 1982 1957 Europe/Vaduz 2019-02-16 +6939115 Kuegrat Kuegrat Kuagrot,Kuhgrat 47.16653 9.56087 T PK LI 05 0 2123 2086 Europe/Vaduz 2019-02-13 +6939127 Garsellitürm Garsellituerm 47.16998 9.56972 T PK LI 05 0 2050 1977 Europe/Vaduz 2019-02-16 +6939199 Saroja Saroja Sarojahoehe,Sarojahöhe,Saroya 47.19079 9.57256 T PK LI LI,AT 05 0 1659 1642 Europe/Vaduz 2019-02-13 +7303639 Garsellikopf Garsellikopf 47.17026 9.56462 T PK LI LI 05 0 2105 2047 Europe/Vaduz 2019-02-13 +7303643 Alpspitz Alpspitz Vorder Alpspitz 47.14874 9.55378 T PK LI 10 0 1996 1913 Europe/Vaduz 2019-02-16 +7303644 Gafleisattel Gafleisattel 47.15108 9.55266 T PASS LI LI 10 0 1856 1666 Europe/Vaduz 2019-02-13 +7303716 Demmerahöhi Demmerahoehi 47.05916 9.58413 T PASS LI LI,CH 0 2243 2233 Europe/Vaduz 2019-02-13 +7303720 Hetabörgle Hetaboergle 47.06046 9.51665 T PT LI LI,CH 01 0 752 719 Europe/Vaduz 2010-07-18 +7303721 Kläusli Klaeusli Klaeusle,Kläusle,Sami Chlaus 47.05286 9.57988 T PK LI LI,CH 0 2585 2469 Europe/Vaduz 2010-07-18 +7303727 Mazorahöhe Mazorahoehe Guschasattel 47.05502 9.55326 T PASS LI 0 2045 2027 Europe/Vaduz 2010-07-16 +7303728 Rappasteinsattel Rappasteinsattel 47.07991 9.56537 T PASS LI LI 0 2071 2053 Europe/Vaduz 2010-07-18 +7303730 Tälihöhi Taelihoehi 47.08823 9.60036 T PASS LI LI 11 0 2055 2047 Europe/Vaduz 2019-02-13 +7303736 Augstenberg Augstenberg 47.0824 9.61005 T PK LI LI 10 0 2359 2337 Europe/Vaduz 2019-02-13 +7303737 Hahnenspiel Hahnenspiel 47.09774 9.58852 T PK LI 10 0 1851 1793 Europe/Vaduz 2010-07-16 +7303739 Silberhorn Silberhorn Hubel 47.0871 9.60553 T PK LI LI, 10 0 2149 2116 Europe/Vaduz 2019-02-13 +7303740 Tuass Tuass 47.07783 9.54452 T PT LI LI 09 0 1434 1399 Europe/Vaduz 2010-07-18 +7670251 Lavadina Lavadina 47.11459 9.55545 P PPL LI 10 0 1047 1111 Europe/Vaduz 2011-02-26 +8581505 Brandeggakopf Brandeggakopf 47.12593 9.58849 T PK LI 10 0 2071 2040 Europe/Vaduz 2013-07-14 +8741479 Migros Im Rösle 2 Migros Im Roesle 2 47.1691 9.5037 S RET LI 07 0 449 Europe/Vaduz 2014-04-12 +9971086 Residence Residence 47.1402 9.52242 S HTL LI 11 0 462 Europe/Vaduz 2015-01-23 +9971087 Park Sonnenhof Park Sonnenhof 47.1469 9.5233 S HTL LI 11 0 538 Europe/Vaduz 2015-01-23 +9971088 Landhaus Am Giessen Landhaus Am Giessen 47.13313 9.51957 S HTL LI 11 0 458 Europe/Vaduz 2015-01-23 +10120925 Parkhotel Sonnenhof Parkhotel Sonnenhof 47.14715 9.52323 S HTL LI 11 0 550 Europe/Vaduz 2015-02-26 +10280529 Kunstmuseum Liechtenstein Kunstmuseum Liechtenstein 47.13946 9.52195 S MUS LI 11 0 458 Europe/Vaduz 2015-05-17 +10280530 Liechtensteinisches Landesmuseum Liechtensteinisches Landesmuseum 47.13816 9.52272 S MUS LI 11 0 467 Europe/Vaduz 2015-05-17 +10280531 Postmuseum des Fürstentums Liechtenstein Postmuseum des Fuerstentums Liechtenstein 47.13902 9.52276 S MUS LI 11 0 463 Europe/Vaduz 2015-05-17 +10280532 Briefmarkenmuseum Briefmarkenmuseum Stamp Museum 47.13887 9.52269 S MUS LI 11 0 463 Europe/Vaduz 2015-05-17 +10280535 Restaurant Torkel Restaurant Torkel 47.14428 9.51945 S REST LI 11 0 482 Europe/Vaduz 2015-05-17 +10280536 Red House Red House 47.14475 9.52176 S MNMT LI 11 0 504 Europe/Vaduz 2015-05-17 +10280537 DoMus - Museum und Galerie der Gemeinde Schaan DoMus - Museum und Galerie der Gemeinde Schaan 47.16605 9.50973 S MUS LI 07 0 458 Europe/Vaduz 2015-05-17 +10280538 Rechenmaschinen-Museum Rechenmaschinen-Museum 47.16759 9.51263 S MUS LI 07 0 461 Europe/Vaduz 2015-05-17 +10280539 TAK Theater Liechtenstein TAK Theater Liechtenstein 47.16731 9.51174 S THTR LI 07 0 458 Europe/Vaduz 2015-05-17 +10280540 Sportplatz Rheinwiese Sportplatz Rheinwiese 47.1657 9.49271 S ATHF LI 07 0 453 Europe/Vaduz 2015-05-17 +10280543 Sportpark Eschen Sportpark Eschen 47.20581 9.5378 S ATHF LI 02 0 439 Europe/Vaduz 2015-05-17 +10347324 Bangserfeld Bangserfeld Bangserfeld 47.26619 9.53362 V CULT LI 06 0 429 Europe/Vaduz 2016-03-11 +10347325 Bangserwesa Bangserwesa Bangserwesa 47.26305 9.53636 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347326 Lettagiessa Lettagiessa Lettagiessa 47.25986 9.5333 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347327 Evimeder Evimeder Evimeder 47.25845 9.54151 V CULT LI 06 0 431 Europe/Vaduz 2016-03-11 +10347329 Köbelesmeder Kobelesmeder Kobelesmeder,Köbelesmeder 47.24903 9.55689 V CULT LI 08 0 430 Europe/Vaduz 2016-03-11 +10347330 Schneggenäuele Schneggenauele Schneggenauele,Schneggenäuele 47.25641 9.53161 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347331 Bangshof Bangshof 47.25201 9.53595 S FRM LI 06 0 430 Europe/Vaduz 2015-07-05 +10347332 Spiersbach Spiersbach 47.24479 9.53928 H STM LI 06 0 431 Europe/Vaduz 2015-07-05 +10347351 Wolfert Wolfert Wolfert 47.25662 9.54555 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347352 Under Wesa Under Wesa Under Wesa 47.25014 9.5314 V CULT LI 06 0 433 Europe/Vaduz 2016-03-11 +10347353 Regelmeder Regelmeder Regelmeder 47.24813 9.53832 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347354 Heiligkrüz Heiligkruz 47.24317 9.5255 P PPLX LI 06 0 434 Europe/Vaduz 2015-07-05 +10347355 Rotagass Rotagass 47.24 9.5306 P PPLX LI 06 0 435 Europe/Vaduz 2015-07-05 +10347356 Spierswesa Spierswesa Spierswesa 47.24554 9.53483 V CULT LI 06 0 432 Europe/Vaduz 2016-03-11 +10347357 Tüfagraba Tufagraba Tufagraba,Tüfagraba 47.24284 9.53299 V CULT LI 06 0 432 Europe/Vaduz 2016-03-11 +10347358 Fuera Fuera 47.24291 9.53155 P PPLX LI 06 0 433 Europe/Vaduz 2015-07-05 +10347373 Obrosa Obrosa 47.2413 9.53222 P PPLX LI 06 0 431 Europe/Vaduz 2015-07-05 +10347374 Feschera Feschera Feschera 47.23023 9.51646 V CULT LI 03 0 434 Europe/Vaduz 2016-03-11 +10347375 Langammet Langammet Langammet 47.24992 9.53568 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347376 Bierkileteile Bierkileteile Bierkileteile,Birkileteile 47.24806 9.54432 V CULT LI 06 0 429 Europe/Vaduz 2015-08-08 +10347429 Flandera Flandera Flandera 47.24534 9.52553 V CULT LI 06 0 434 Europe/Vaduz 2016-03-11 +10347430 Brema Brema Brema 47.2434 9.54028 V CULT LI 06 0 431 Europe/Vaduz 2016-03-11 +10347431 Tüfmeder Tufmeder Tufmeder,Tüfmeder 47.23951 9.54114 V CULT LI 00 0 432 Europe/Vaduz 2016-03-11 +10347432 Halameder Halameder Halameder 47.23817 9.54426 V CULT LI 00 0 431 Europe/Vaduz 2016-03-11 +10347433 Ruine Alt Schellenberg Ruine Alt Schellenberg Burgruine Untere Schellenberg,Ruine Alt Schellenberg 47.23326 9.54243 S RUIN LI 08 0 588 Europe/Vaduz 2015-08-08 +10347434 Brüechliswald Bruechliswald 47.23405 9.53386 V FRST LI 06 0 500 Europe/Vaduz 2015-08-08 +10347435 Limsa Limsa 47.23605 9.53479 T SLP LI 06 0 443 Europe/Vaduz 2015-08-08 +10347436 Steinbroch Steinbroch Deponie Limseneck,Steinbroch 47.23595 9.5375 S MNQR LI 06 0 443 Europe/Vaduz 2015-07-05 +10347437 Kela Kela Kela 47.23528 9.53972 V CULT LI 06 0 436 Europe/Vaduz 2016-03-11 +10347438 Schlatt Schlatt 47.23438 9.521 P PPLX LI 06 0 432 Europe/Vaduz 2015-08-08 +10347439 Betzi Betzi 47.2343 9.52604 P PPLX LI 06 0 435 Europe/Vaduz 2015-07-05 +10347440 Geisszepfel Geisszepfel 47.23351 9.52465 P PPLX LI 06 0 434 Europe/Vaduz 2015-07-05 +10347441 Tälewald Talewald 47.23165 9.52671 V FRST LI 06 0 493 Europe/Vaduz 2015-07-05 +10347442 Studa Studa 47.22983 9.52805 V MDW LI 06 0 532 Europe/Vaduz 2015-08-08 +10347443 Oberwiler Oberwiler 47.2356 9.52452 P PPLX LI 06 0 435 Europe/Vaduz 2015-07-05 +10347444 Wüerle Wuerle Wuerle,Wüerle 47.23875 9.52102 V CULT LI 06 0 433 Europe/Vaduz 2016-03-11 +10347445 Rüttile Ruttile Ruttile,Rüttile 47.23874 9.52004 V CULT LI 06 0 433 Europe/Vaduz 2016-03-11 +10347446 Spiegel Spiegel 47.2382 9.52262 P PPLX LI 06 0 436 Europe/Vaduz 2015-07-05 +10347447 Kellersfeld Kellersfeld 47.24031 9.52683 P PPLX LI 06 0 434 Europe/Vaduz 2015-07-05 +10347448 Underdarf Underdarf 47.24285 9.52952 P PPLX LI 06 0 433 Europe/Vaduz 2015-07-05 +10347449 Oberdarf Oberdarf 47.24143 9.52642 P PPLX LI 06 0 435 Europe/Vaduz 2015-07-05 +10347450 Giessa Giessa 47.24445 9.52711 P PPLX LI 06 0 433 Europe/Vaduz 2015-07-05 +10347451 Kolbafeld Kolbafeld 47.23713 9.53044 P PPLX LI 06 0 433 Europe/Vaduz 2015-07-05 +10347452 Scherer Scherer Scherer 47.23853 9.53218 V CULT LI 06 0 430 Europe/Vaduz 2016-03-11 +10347453 Oksarietle Oksarietle Oksarietle 47.24441 9.54272 V CULT LI 00 0 431 Europe/Vaduz 2016-03-11 +10347454 Tuarbariet Tuarbariet Tuarbariet 47.24646 9.54342 V CULT LI 06 0 432 Europe/Vaduz 2016-03-11 +10347455 Lacha Lacha 47.21732 9.54094 P PPLX LI 04 0 456 Europe/Vaduz 2015-07-05 +10347456 Steinbös Steinbos 47.21877 9.53767 P PPLX LI 04 0 481 Europe/Vaduz 2015-07-05 +10347457 Purtscher Purtscher 47.21897 9.54773 P PPLX LI 04 0 462 Europe/Vaduz 2015-07-05 +10347458 Herawingert Herawingert 47.22198 9.54249 V MDW LI 04 0 498 Europe/Vaduz 2015-08-08 +10347459 Speckemad Speckemad 47.22171 9.55127 P PPLX LI 04 0 453 Europe/Vaduz 2015-07-05 +10347460 Birkahof Birkahof 47.21623 9.55053 S FRM LI 04 0 441 Europe/Vaduz 2015-07-05 +10347461 Gampalütz Gampalutz 47.21996 9.5506 P PPLX LI 04 0 447 Europe/Vaduz 2015-07-05 +10347462 Bretscha Bretscha 47.21477 9.54225 P PPLX LI 04 0 452 Europe/Vaduz 2015-07-05 +10347481 Krummenacker Krummenacker 47.22357 9.54653 P PPLX LI 04 0 515 Europe/Vaduz 2015-08-08 +10347482 Oksner Oksner 47.22519 9.54801 P PPLX LI 04 0 529 Europe/Vaduz 2015-08-08 +10347483 Hinderbüela Hinderbuela 47.21673 9.54433 P PPLX LI 04 0 452 Europe/Vaduz 2015-08-08 +10347498 Sandgrueb Sandgrueb 47.21576 9.53801 P PPLX LI 04 0 466 Europe/Vaduz 2015-07-05 +10347499 Popers Popers 47.21476 9.53686 P PPLX LI 04 0 474 Europe/Vaduz 2015-07-05 +10347500 Delehala Delehala 47.21402 9.53883 T HLL LI 04 0 465 Europe/Vaduz 2015-08-08 +10347501 Barietle Barietle Barietle 47.2149 9.54921 V CULT LI 04 0 442 Europe/Vaduz 2016-03-11 +10347502 Röfeteile Rofeteile Rofeteile,Röfeteile 47.21166 9.55531 V CULT LI 04 0 442 Europe/Vaduz 2016-03-11 +10347503 Birka Birka Birka 47.21495 9.55208 V CULT LI 04 0 441 Europe/Vaduz 2016-03-11 +10347504 Schmelzhof Schmelzhof Schmelzhof 47.21799 9.56749 V CULT LI 04 0 445 Europe/Vaduz 2016-03-11 +10347505 Binza Binza 47.22361 9.55372 P PPLX LI 04 0 448 Europe/Vaduz 2015-07-05 +10347506 Freschböchel Freschbochel 47.24487 9.56002 T SLP LI 08 0 509 Europe/Vaduz 2015-07-05 +10347507 Konza Konza 47.24413 9.5631 L FLD LI 08 0 577 Europe/Vaduz 2015-07-05 +10347523 Hinderschloss Hinderschloss 47.23234 9.55598 P PPLX LI 08 0 647 Europe/Vaduz 2015-07-05 +10347524 Haberwald Haberwald 47.22655 9.54587 L FLD LI 08 0 597 Europe/Vaduz 2015-07-05 +10347525 Rennhof Rennhof 47.22898 9.54991 T SLP LI 04 0 628 Europe/Vaduz 2015-08-08 +10347561 Fehraguet Fehraguet 47.22786 9.55344 T SLP LI 04 0 540 Europe/Vaduz 2015-08-08 +10347562 Loch Loch 47.22853 9.53413 P PPL LI 08 0 530 Europe/Vaduz 2015-07-05 +10347563 Rütte Rutte 47.23834 9.55495 L FLD LI 08 0 639 Europe/Vaduz 2015-07-05 +10347564 Ober Burg Ober Burg 47.2328 9.55416 S RUIN LI 08 0 659 Europe/Vaduz 2015-07-05 +10347565 Betsche Betsche 47.22708 9.54814 P PPL LI 04 0 580 Europe/Vaduz 2015-08-08 +10347566 Lums Lums 47.22541 9.52606 P PPL LI 03 0 569 Europe/Vaduz 2015-08-08 +10347567 Kratzera Kratzera 47.22745 9.52113 V FRST LI 00 0 530 Europe/Vaduz 2015-07-05 +10347568 Auäcker Auacker Auacker,Auäcker 47.23503 9.51879 V CULT LI 06 0 433 Europe/Vaduz 2016-03-11 +10347569 Lotzagütle Lotzagutle 47.22391 9.53141 V FRST LI 03 0 611 Europe/Vaduz 2015-07-05 +10347570 Breita Breita 47.22599 9.51669 P PPL LI 03 0 487 Europe/Vaduz 2015-07-05 +10347571 Badäl Badal 47.22944 9.51906 P PPL LI 03 0 468 Europe/Vaduz 2015-08-08 \ No newline at end of file diff --git a/homebytwo/importers/tests/data/geonames_LI.zip b/homebytwo/importers/tests/data/geonames_LI.zip new file mode 100644 index 0000000000000000000000000000000000000000..962c54ba20eb14b95f2ea4f57f597ccf1ac9ace6 GIT binary patch literal 12562 zcmb7~1#ITrl3>G0C+RSMVPbTM5SYJ%JO-!;^1q`J2m%5HLI@%wN$>3Ltg7-I1o~w;M;|XG zSO44J&BYxK1Qg-{6a?h&xga3fyt+=fq6stIy@s1@Kg};5pGLc1z_qhXuBE^(o9UX_ zx^bqDO-q(E5HZETNBr^5Ag98D<%QTsU+_ z@95;Y?8|yrHDK48Z$7JSIf6Zrl=u+pe;v1XL=3v-T_;hQczXtpWGl_HA=ZL4?qw40wVl? zKB2!FY-w65lRd4CV%ZWstu0}@^NxPyt=J4ppW5YmXbq=edqUx<(f@8N#)mc4{=#tM zsqYA{Jp)#K;``fDC?P^Ouc+y0M=o^MZhYKcUfAiic^zdYx-I>gUShAc*6UpAbd%}s z_551+Sh~vX@zcY*mqYX{h3Z~{?v91(mJZrnJKf%|3{vmK&1$Q*eUP)G^Q-&g-db)- zAqQ&zV$~SU^&sz+wI;Pr_=0n%#iCPUr9oHRLu}>Yeu!1JZG>VykV%4kJ&5bbSk|Ni zF9eTX6uoZMrn!&|YV?jtX6UARlPoLHBrT*;yW6eBGuM{RufHwdt7G~#c+a$IOK{!5 zhuHv`I?^n4$s*@L&7`%#0_ja1bjepa^E6cB91#cFs6^U%R-D{*_7RVSLstmeWsOm6 zDmDADLc9*+v68$zW~jcgKAV5%z3pNuQ7geU<)S|5iZ~hjq|J77&>~Sam4P9+4Urqx@2_f)s zCy$9H&^oJ5FCEqazJ}5wNv%SF6eVu2x!5V`1uQI39?A`Ay$c5R3zjzEs>bK(Cdfzz z%9DVJPj0fWzAr~eo^@uN3c&!hLJ`xt6|BPb&BOpZ79U-Uxqzg-0otyb+ynUNynkK`4e9duF;{2w9p^ zMNf8ebb%f0LSw`GOV93(`n|K~<>7GYNv^DI(W|@qfDObvzx{{i%!1OLrrR?2oxo>b zq-vWBRI4Flli_HC2ZM9;?w!R#-~QvnC#(E?s#)~HPZQ*V!fQ2FT|qsLdC06sf_tS0 za@4AN>X>`%pqVs`{B_(Mc8)9$e;+8+g-EE@9=SlT)?w059W?I!hh9U}+Pp zVtNx)7s4%$g7SD4;9E~}W*Lzzp3c_=1*}egsp%f!#jOjY8-jL>2J9-kZp^m+ z+BIW^5MB>%KP4~rfIrT3mGQC94Dn}rK>-`HD9=Dy|Lrn?%WrG6z0ixyyPM$mwWfA7 z#k7utc&-*%3z3~PlY^w6lzn8I1VaX|A;i`ksuec{EoMTxd7;&t?bQcx`#5m{x2(4m zbR-lmQ$p!6J9(;<463tQc?8az-%4jAWR8by7vQ>a0IO1)U;#5ivlVQ+1|5|9Cw5~AH4vy}YachCK{I`Tg6Z*FpDbY4zAP=~m+ zDdd;HC#h@jGDJGFW~a&W3l0TUHAFD_>i4sqZ??TIUb_<`BefVh*JyB65`PqREQJ)54l+iH~k`6LoQ zBp7b}ke(J&ePweYwS-OHV&l1^%l8#=#}<2m9lNX3dLFF9W`MW)cnb4-Jwk+4$s-Db zKO2CKm%yg^ke}1~+O7LJX1KqCJhH!|fxYH9Pqb)hq3Rtb5oYiu?0;n6^IRlY+#AWD zRzINd$3dc9Drs?uqpMaJ3V~)o9HiC#V1{NO7iljv8D8*f9*B5Y4)>r#_Z5ShiOD&a zh5d*iR81a91HK2(J%FV{;Mk`8HMw$cLoFewM%0DJ4#d6E{}qY4a8aZ@8`W7If|QZ7 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 literal 0 HcmV?d00001 diff --git a/homebytwo/importers/tests/data/geonames_codes.html b/homebytwo/importers/tests/data/geonames_codes.html new file mode 100644 index 00000000..a4981259 --- /dev/null +++ b/homebytwo/importers/tests/data/geonames_codes.html @@ -0,0 +1,756 @@ + + + + +GeoNames + + + + + + + + +
 GeoNames Home | Postal Codes | Download / Webservice | About | +
+ + search + +
+ + +login + + + +
+ +

GeoNames Feature Codes

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
A country, state, region,...
ADM1 first-order administrative division a primary administrative division of a country, such as a state in the United States
ADM1H historical first-order administrative division a former first-order administrative division
ADM2 second-order administrative division a subdivision of a first-order administrative division
ADM2H historical second-order administrative division a former second-order administrative division
ADM3 third-order administrative division a subdivision of a second-order administrative division
ADM3H historical third-order administrative division a former third-order administrative division
ADM4 fourth-order administrative division a subdivision of a third-order administrative division
ADM4H historical fourth-order administrative division a former fourth-order administrative division
ADM5 fifth-order administrative division a subdivision of a fourth-order administrative division
ADM5H historical fifth-order administrative division a former fifth-order administrative division
ADMD administrative division an administrative division of a country, undifferentiated as to administrative level
ADMDH historical administrative division a former administrative division of a political entity, undifferentiated as to administrative level
LTER leased area a tract of land leased to another country, usually for military installations
PCL political entity
PCLD dependent political entity
PCLF freely associated state
PCLH historical political entity a former political entity
PCLI independent political entity
PCLIX section of independent political entity
PCLS semi-independent political entity
PRSH parish an ecclesiastical district
TERR territory
ZN zone
ZNB buffer zone a zone recognized as a buffer between two nations in which military presence is minimal or absent
H stream, lake, ...
AIRS seaplane landing area a place on a waterbody where floatplanes land and take off
ANCH anchorage an area where vessels may anchor
BAY bay a coastal indentation between two capes or headlands, larger than a cove but smaller than a gulf
BAYS bays coastal indentations between two capes or headlands, larger than a cove but smaller than a gulf
BGHT bight(s) an open body of water forming a slight recession in a coastline
BNK bank(s) an elevation, typically located on a shelf, over which the depth of water is relatively shallow but sufficient for most surface navigation
BNKR stream bank a sloping margin of a stream channel which normally confines the stream to its channel on land
BNKX section of bank
BOG bog(s) a wetland characterized by peat forming sphagnum moss, sedge, and other acid-water plants
CAPG icecap a dome-shaped mass of glacial ice covering an area of mountain summits or other high lands; smaller than an ice sheet
CHN channel the deepest part of a stream, bay, lagoon, or strait, through which the main current flows
CHNL lake channel(s) that part of a lake having water deep enough for navigation between islands, shoals, etc.
CHNM marine channel that part of a body of water deep enough for navigation through an area otherwise not suitable
CHNN navigation channel a buoyed channel of sufficient depth for the safe navigation of vessels
CNFL confluence a place where two or more streams or intermittent streams flow together
CNL canal an artificial watercourse
CNLA aqueduct a conduit used to carry water
CNLB canal bend a conspicuously curved or bent section of a canal
CNLD drainage canal an artificial waterway carrying water away from a wetland or from drainage ditches
CNLI irrigation canal a canal which serves as a main conduit for irrigation water
CNLN navigation canal(s) a watercourse constructed for navigation of vessels
CNLQ abandoned canal
CNLSB underground irrigation canal(s) a gently inclined underground tunnel bringing water for irrigation from aquifers
CNLX section of canal
COVE cove(s) a small coastal indentation, smaller than a bay
CRKT tidal creek(s) a meandering channel in a coastal wetland subject to bi-directional tidal currents
CRNT current a horizontal flow of water in a given direction with uniform velocity
CUTF cutoff a channel formed as a result of a stream cutting through a meander neck
DCK dock(s) a waterway between two piers, or cut into the land for the berthing of ships
DCKB docking basin a part of a harbor where ships dock
DOMG icecap dome a comparatively elevated area on an icecap
DPRG icecap depression a comparatively depressed area on an icecap
DTCH ditch a small artificial watercourse dug for draining or irrigating the land
DTCHD drainage ditch a ditch which serves to drain the land
DTCHI irrigation ditch a ditch which serves to distribute irrigation water
DTCHM ditch mouth(s) an area where a drainage ditch enters a lagoon, lake or bay
ESTY estuary a funnel-shaped stream mouth or embayment where fresh water mixes with sea water under tidal influences
FISH fishing area a fishing ground, bank or area where fishermen go to catch fish
FJD fjord a long, narrow, steep-walled, deep-water arm of the sea at high latitudes, usually along mountainous coasts
FJDS fjords long, narrow, steep-walled, deep-water arms of the sea at high latitudes, usually along mountainous coasts
FLLS waterfall(s) a perpendicular or very steep descent of the water of a stream
FLLSX section of waterfall(s)
FLTM mud flat(s) a relatively level area of mud either between high and low tide lines, or subject to flooding
FLTT tidal flat(s) a large flat area of mud or sand attached to the shore and alternately covered and uncovered by the tide
GLCR glacier(s) a mass of ice, usually at high latitudes or high elevations, with sufficient thickness to flow away from the source area in lobes, tongues, or masses
GULF gulf a large recess in the coastline, larger than a bay
GYSR geyser a type of hot spring with intermittent eruptions of jets of hot water and steam
HBR harbor(s) a haven or space of deep water so sheltered by the adjacent land as to afford a safe anchorage for ships
HBRX section of harbor
INLT inlet a narrow waterway extending into the land, or connecting a bay or lagoon with a larger body of water
INLTQ former inlet an inlet which has been filled in, or blocked by deposits
LBED lake bed(s) a dried up or drained area of a former lake
LGN lagoon a shallow coastal waterbody, completely or partly separated from a larger body of water by a barrier island, coral reef or other depositional feature
LGNS lagoons shallow coastal waterbodies, completely or partly separated from a larger body of water by a barrier island, coral reef or other depositional feature
LGNX section of lagoon
LK lake a large inland body of standing water
LKC crater lake a lake in a crater or caldera
LKI intermittent lake
LKN salt lake an inland body of salt water with no outlet
LKNI intermittent salt lake
LKO oxbow lake a crescent-shaped lake commonly found adjacent to meandering streams
LKOI intermittent oxbow lake
LKS lakes large inland bodies of standing water
LKSB underground lake a standing body of water in a cave
LKSC crater lakes lakes in a crater or caldera
LKSI intermittent lakes
LKSN salt lakes inland bodies of salt water with no outlet
LKSNI intermittent salt lakes
LKX section of lake
MFGN salt evaporation ponds diked salt ponds used in the production of solar evaporated salt
MGV mangrove swamp a tropical tidal mud flat characterized by mangrove vegetation
MOOR moor(s) an area of open ground overlaid with wet peaty soils
MRSH marsh(es) a wetland dominated by grass-like vegetation
MRSHN salt marsh a flat area, subject to periodic salt water inundation, dominated by grassy salt-tolerant plants
NRWS narrows a navigable narrow part of a bay, strait, river, etc.
OCN ocean one of the major divisions of the vast expanse of salt water covering part of the earth
OVF overfalls an area of breaking waves caused by the meeting of currents or by waves moving against the current
PND pond a small standing waterbody
PNDI intermittent pond
PNDN salt pond a small standing body of salt water often in a marsh or swamp, usually along a seacoast
PNDNI intermittent salt pond(s)
PNDS ponds small standing waterbodies
PNDSF fishponds ponds or enclosures in which fish are kept or raised
PNDSI intermittent ponds
PNDSN salt ponds small standing bodies of salt water often in a marsh or swamp, usually along a seacoast
POOL pool(s) a small and comparatively still, deep part of a larger body of water such as a stream or harbor; or a small body of standing water
POOLI intermittent pool
RCH reach a straight section of a navigable stream or channel between two bends
RDGG icecap ridge a linear elevation on an icecap
RDST roadstead an open anchorage affording less protection than a harbor
RF reef(s) a surface-navigation hazard composed of consolidated material
RFC coral reef(s) a surface-navigation hazard composed of coral
RFX section of reef
RPDS rapids a turbulent section of a stream associated with a steep, irregular stream bed
RSV reservoir(s) an artificial pond or lake
RSVI intermittent reservoir
RSVT water tank a contained pool or tank of water at, below, or above ground level
RVN ravine(s) a small, narrow, deep, steep-sided stream channel, smaller than a gorge
SBKH sabkha(s) a salt flat or salt encrusted plain subject to periodic inundation from flooding or high tides
SD sound a long arm of the sea forming a channel between the mainland and an island or islands; or connecting two larger bodies of water
SEA sea a large body of salt water more or less confined by continuous land or chains of islands forming a subdivision of an ocean
SHOL shoal(s) a surface-navigation hazard composed of unconsolidated material
SILL sill the low part of an underwater gap or saddle separating basins, including a similar feature at the mouth of a fjord
SPNG spring(s) a place where ground water flows naturally out of the ground
SPNS sulphur spring(s) a place where sulphur ground water flows naturally out of the ground
SPNT hot spring(s) a place where hot ground water flows naturally out of the ground
STM stream a body of running water moving to a lower level in a channel on land
STMA anabranch a diverging branch flowing out of a main stream and rejoining it downstream
STMB stream bend a conspicuously curved or bent segment of a stream
STMC canalized stream a stream that has been substantially ditched, diked, or straightened
STMD distributary(-ies) a branch which flows away from the main stream, as in a delta or irrigation canal
STMH headwaters the source and upper part of a stream, including the upper drainage basin
STMI intermittent stream
STMIX section of intermittent stream
STMM stream mouth(s) a place where a stream discharges into a lagoon, lake, or the sea
STMQ abandoned watercourse a former stream or distributary no longer carrying flowing water, but still evident due to lakes, wetland, topographic or vegetation patterns
STMS streams bodies of running water moving to a lower level in a channel on land
STMSB lost river a surface stream that disappears into an underground channel, or dries up in an arid area
STMX section of stream
STRT strait a relatively narrow waterway, usually narrower and less extensive than a sound, connecting two larger bodies of water
SWMP swamp a wetland dominated by tree vegetation
SYSI irrigation system a network of ditches and one or more of the following elements: water supply, reservoir, canal, pump, well, drain, etc.
TNLC canal tunnel a tunnel through which a canal passes
WAD wadi a valley or ravine, bounded by relatively steep banks, which in the rainy season becomes a watercourse; found primarily in North Africa and the Middle East
WADB wadi bend a conspicuously curved or bent segment of a wadi
WADJ wadi junction a place where two or more wadies join
WADM wadi mouth the lower terminus of a wadi where it widens into an adjoining floodplain, depression, or waterbody
WADS wadies valleys or ravines, bounded by relatively steep banks, which in the rainy season become watercourses; found primarily in North Africa and the Middle East
WADX section of wadi
WHRL whirlpool a turbulent, rotating movement of water in a stream
WLL well a cylindrical hole, pit, or tunnel drilled or dug down to a depth from which water, oil, or gas can be pumped or brought to the surface
WLLQ abandoned well
WLLS wells cylindrical holes, pits, or tunnels drilled or dug down to a depth from which water, oil, or gas can be pumped or brought to the surface
WTLD wetland an area subject to inundation, usually characterized by bog, marsh, or swamp vegetation
WTLDI intermittent wetland
WTRC watercourse a natural, well-defined channel produced by flowing water, or an artificial channel designed to carry flowing water
WTRH waterhole(s) a natural hole, hollow, or small depression that contains water, used by man and animals, especially in arid areas
L parks,area, ...
AGRC agricultural colony a tract of land set aside for agricultural settlement
AMUS amusement park Amusement Park are theme parks, adventure parks offering entertainment, similar to funfairs but with a fix location
AREA area a tract of land without homogeneous character or boundaries
BSND drainage basin an area drained by a stream
BSNP petroleum basin an area underlain by an oil-rich structural basin
BTL battlefield a site of a land battle of historical importance
CLG clearing an area in a forest with trees removed
CMN common a park or pasture for community use
CNS concession area a lease of land by a government for economic development, e.g., mining, forestry
COLF coalfield a region in which coal deposits of possible economic value occur
CONT continent continent: Europe, Africa, Asia, North America, South America, Oceania, Antarctica
CST coast a zone of variable width straddling the shoreline
CTRB business center a place where a number of businesses are located
DEVH housing development a tract of land on which many houses of similar design are built according to a development plan
FLD field(s) an open as opposed to wooded area
FLDI irrigated field(s) a tract of level or terraced land which is irrigated
GASF gasfield an area containing a subterranean store of natural gas of economic value
GRAZ grazing area an area of grasses and shrubs used for grazing
GVL gravel area an area covered with gravel
INDS industrial area an area characterized by industrial activity
LAND arctic land a tract of land in the Arctic
LCTY locality a minor area or place of unspecified or mixed character and indefinite boundaries
MILB military base a place used by an army or other armed service for storing arms and supplies, and for accommodating and training troops, a base from which operations can be initiated
MNA mining area an area of mine sites where minerals and ores are extracted
MVA maneuver area a tract of land where military field exercises are carried out
NVB naval base an area used to store supplies, provide barracks for troops and naval personnel, a port for naval vessels, and from which operations are initiated
OAS oasis(-es) an area in a desert made productive by the availability of water
OILF oilfield an area containing a subterranean store of petroleum of economic value
PEAT peat cutting area an area where peat is harvested
PRK park an area, often of forested land, maintained as a place of beauty, or for recreation
PRT port a place provided with terminal and transfer facilities for loading and discharging waterborne cargo or passengers, usually located in a harbor
QCKS quicksand an area where loose sand with water moving through it may become unstable when heavy objects are placed at the surface, causing them to sink
RES reserve a tract of public land reserved for future use or restricted as to use
RESA agricultural reserve a tract of land reserved for agricultural reclamation and/or development
RESF forest reserve a forested area set aside for preservation or controlled use
RESH hunting reserve a tract of land used primarily for hunting
RESN nature reserve an area reserved for the maintenance of a natural habitat
RESP palm tree reserve an area of palm trees where use is controlled
RESV reservation a tract of land set aside for aboriginal, tribal, or native populations
RESW wildlife reserve a tract of public land reserved for the preservation of wildlife
RGN region an area distinguished by one or more observable physical or cultural characteristics
RGNE economic region a region of a country established for economic development or for statistical purposes
RGNH historical region a former historic area distinguished by one or more observable physical or cultural characteristics
RGNL lake region a tract of land distinguished by numerous lakes
RNGA artillery range a tract of land used for artillery firing practice
SALT salt area a shallow basin or flat where salt accumulates after periodic inundation
SNOW snowfield an area of permanent snow and ice forming the accumulation area of a glacier
TRB tribal area a tract of land used by nomadic or other tribes
P city, village,...
PPL populated place a city, town, village, or other agglomeration of buildings where people live and work
PPLA seat of a first-order administrative division seat of a first-order administrative division (PPLC takes precedence over PPLA)
PPLA2 seat of a second-order administrative division
PPLA3 seat of a third-order administrative division
PPLA4 seat of a fourth-order administrative division
PPLA5 seat of a fifth-order administrative division
PPLC capital of a political entity
PPLCH historical capital of a political entity a former capital of a political entity
PPLF farm village a populated place where the population is largely engaged in agricultural activities
PPLG seat of government of a political entity
PPLH historical populated place a populated place that no longer exists
PPLL populated locality an area similar to a locality but with a small group of dwellings or other buildings
PPLQ abandoned populated place
PPLR religious populated place a populated place whose population is largely engaged in religious occupations
PPLS populated places cities, towns, villages, or other agglomerations of buildings where people live and work
PPLW destroyed populated place a village, town or city destroyed by a natural disaster, or by war
PPLX section of populated place
STLMT israeli settlement
R road, railroad
CSWY causeway a raised roadway across wet ground or shallow water
OILP oil pipeline a pipeline used for transporting oil
PRMN promenade a place for public walking, usually along a beach front
PTGE portage a place where boats, goods, etc., are carried overland between navigable waters
RD road an open way with improved surface for transportation of animals, people and vehicles
RDA ancient road the remains of a road used by ancient cultures
RDB road bend a conspicuously curved or bent section of a road
RDCUT road cut an excavation cut through a hill or ridge for a road
RDJCT road junction a place where two or more roads join
RJCT railroad junction a place where two or more railroad tracks join
RR railroad a permanent twin steel-rail track on which freight and passenger cars move long distances
RRQ abandoned railroad
RTE caravan route the route taken by caravans
RYD railroad yard a system of tracks used for the making up of trains, and switching and storing freight cars
ST street a paved urban thoroughfare
STKR stock route a route taken by livestock herds
TNL tunnel a subterranean passageway for transportation
TNLN natural tunnel a cave that is open at both ends
TNLRD road tunnel a tunnel through which a road passes
TNLRR railroad tunnel a tunnel through which a railroad passes
TNLS tunnels subterranean passageways for transportation
TRL trail a path, track, or route used by pedestrians, animals, or off-road vehicles
S spot, building, farm
ADMF administrative facility a government building
AGRF agricultural facility a building and/or tract of land used for improving agriculture
AIRB airbase an area used to store supplies, provide barracks for air force personnel, hangars and runways for aircraft, and from which operations are initiated
AIRF airfield a place on land where aircraft land and take off; no facilities provided for the commercial handling of passengers and cargo
AIRH heliport a place where helicopters land and take off
AIRP airport a place where aircraft regularly land and take off, with runways, navigational aids, and major facilities for the commercial handling of passengers and cargo
AIRQ abandoned airfield
AIRT terminal airport facilities for the handling of freight and passengers
AMTH amphitheater an oval or circular structure with rising tiers of seats about a stage or open space
ANS archaeological/prehistoric site a place where archeological remains, old structures, or cultural artifacts are located
AQC aquaculture facility facility or area for the cultivation of aquatic animals and plants, especially fish, shellfish, and seaweed, in natural or controlled marine or freshwater environments; underwater agriculture
ARCH arch a natural or man-made structure in the form of an arch
ARCHV archive a place or institution where documents are preserved
ART piece of art a piece of art, like a sculpture, painting. In contrast to monument (MNMT) it is not commemorative.
ASTR astronomical station a point on the earth whose position has been determined by observations of celestial bodies
ASYL asylum a facility where the insane are cared for and protected
ATHF athletic field a tract of land used for playing team sports, and athletic track and field events
ATM automatic teller machine An unattended electronic machine in a public place, connected to a data system and related equipment and activated by a bank customer to obtain cash withdrawals and other banking services.
BANK bank A business establishment in which money is kept for saving or commercial purposes or is invested, supplied for loans, or exchanged.
BCN beacon a fixed artificial navigation mark
BDG bridge a structure erected across an obstacle such as a stream, road, etc., in order to carry roads, railroads, and pedestrians across
BDGQ ruined bridge a destroyed or decayed bridge which is no longer functional
BLDA apartment building a building containing several individual apartments
BLDG building(s) a structure built for permanent use, as a house, factory, etc.
BLDO office building commercial building where business and/or services are conducted
BP boundary marker a fixture marking a point along a boundary
BRKS barracks a building for lodging military personnel
BRKW breakwater a structure erected to break the force of waves at the entrance to a harbor or port
BSTN baling station a facility for baling agricultural products
BTYD boatyard a waterside facility for servicing, repairing, and building small vessels
BUR burial cave(s) a cave used for human burials
BUSTN bus station a facility comprising ticket office, platforms, etc. for loading and unloading passengers
BUSTP bus stop a place lacking station facilities
CARN cairn a heap of stones erected as a landmark or for other purposes
CAVE cave(s) an underground passageway or chamber, or cavity on the side of a cliff
CH church a building for public Christian worship
CMP camp(s) a site occupied by tents, huts, or other shelters for temporary use
CMPL logging camp a camp used by loggers
CMPLA labor camp a camp used by migrant or temporary laborers
CMPMN mining camp a camp used by miners
CMPO oil camp a camp used by oilfield workers
CMPQ abandoned camp
CMPRF refugee camp a camp used by refugees
CMTY cemetery a burial place or ground
COMC communication center a facility, including buildings, antennae, towers and electronic equipment for receiving and transmitting information
CRRL corral(s) a pen or enclosure for confining or capturing animals
CSNO casino a building used for entertainment, especially gambling
CSTL castle a large fortified building or set of buildings
CSTM customs house a building in a port where customs and duties are paid, and where vessels are entered and cleared
CTHSE courthouse a building in which courts of law are held
CTRA atomic center a facility where atomic research is carried out
CTRCM community center a facility for community recreation and other activities
CTRF facility center a place where more than one facility is situated
CTRM medical center a complex of health care buildings including two or more of the following: hospital, medical school, clinic, pharmacy, doctor's offices, etc.
CTRR religious center a facility where more than one religious activity is carried out, e.g., retreat, school, monastery, worship
CTRS space center a facility for launching, tracking, or controlling satellites and space vehicles
CVNT convent a building where a community of nuns lives in seclusion
DAM dam a barrier constructed across a stream to impound water
DAMQ ruined dam a destroyed or decayed dam which is no longer functional
DAMSB sub-surface dam a dam put down to bedrock in a sand river
DARY dairy a facility for the processing, sale and distribution of milk or milk products
DCKD dry dock a dock providing support for a vessel, and means for removing the water so that the bottom of the vessel can be exposed
DCKY dockyard a facility for servicing, building, or repairing ships
DIKE dike an earth or stone embankment usually constructed for flood or stream control
DIP diplomatic facility office, residence, or facility of a foreign government, which may include an embassy, consulate, chancery, office of charge d'affaires, or other diplomatic, economic, military, or cultural mission
DPOF fuel depot an area where fuel is stored
EST estate(s) a large commercialized agricultural landholding with associated buildings and other facilities
ESTO oil palm plantation an estate specializing in the cultivation of oil palm trees
ESTR rubber plantation an estate which specializes in growing and tapping rubber trees
ESTSG sugar plantation an estate that specializes in growing sugar cane
ESTT tea plantation an estate which specializes in growing tea bushes
ESTX section of estate
FCL facility a building or buildings housing a center, institute, foundation, hospital, prison, mission, courthouse, etc.
FNDY foundry a building or works where metal casting is carried out
FRM farm a tract of land with associated buildings devoted to agriculture
FRMQ abandoned farm
FRMS farms tracts of land with associated buildings devoted to agriculture
FRMT farmstead the buildings and adjacent service areas of a farm
FT fort a defensive structure or earthworks
FY ferry a boat or other floating conveyance and terminal facilities regularly used to transport people and vehicles across a waterbody
FYT ferry terminal a place where ferries pick-up and discharge passengers, vehicles and or cargo
GATE gate a controlled access entrance or exit
GDN garden(s) an enclosure for displaying selected plant or animal life
GHAT ghat a set of steps leading to a river, which are of religious significance, and at their base is usually a platform for bathing
GHSE guest house a house used to provide lodging for paying guests
GOSP gas-oil separator plant a facility for separating gas from oil
GOVL local government office a facility housing local governmental offices, usually a city, town, or village hall
GRVE grave a burial site
HERM hermitage a secluded residence, usually for religious sects
HLT halting place a place where caravans stop for rest
HMSD homestead a residence, owner's or manager's, on a sheep or cattle station, woolshed, outcamp, or Aboriginal outstation, specific to Australia and New Zealand
HSE house(s) a building used as a human habitation
HSEC country house a large house, mansion, or chateau, on a large estate
HSP hospital a building in which sick or injured, especially those confined to bed, are medically treated
HSPC clinic a medical facility associated with a hospital for outpatients
HSPD dispensary a building where medical or dental aid is dispensed
HSPL leprosarium an asylum or hospital for lepers
HSTS historical site a place of historical importance
HTL hotel a building providing lodging and/or meals for the public
HUT hut a small primitive house
HUTS huts small primitive houses
INSM military installation a facility for use of and control by armed forces
ITTR research institute a facility where research is carried out
JTY jetty a structure built out into the water at a river mouth or harbor entrance to regulate currents and silting
LDNG landing a place where boats receive or discharge passengers and freight, but lacking most port facilities
LEPC leper colony a settled area inhabited by lepers in relative isolation
LIBR library A place in which information resources such as books are kept for reading, reference, or lending.
LNDF landfill a place for trash and garbage disposal in which the waste is buried between layers of earth to build up low-lying land
LOCK lock(s) a basin in a waterway with gates at each end by means of which vessels are passed from one water level to another
LTHSE lighthouse a distinctive structure exhibiting a major navigation light
MALL mall A large, often enclosed shopping complex containing various stores, businesses, and restaurants usually accessible by common passageways.
MAR marina a harbor facility for small boats, yachts, etc.
MFG factory one or more buildings where goods are manufactured, processed or fabricated
MFGB brewery one or more buildings where beer is brewed
MFGC cannery a building where food items are canned
MFGCU copper works a facility for processing copper ore
MFGLM limekiln a furnace in which limestone is reduced to lime
MFGM munitions plant a factory where ammunition is made
MFGPH phosphate works a facility for producing fertilizer
MFGQ abandoned factory
MFGSG sugar refinery a facility for converting raw sugar into refined sugar
MKT market a place where goods are bought and sold at regular intervals
ML mill(s) a building housing machines for transforming, shaping, finishing, grinding, or extracting products
MLM ore treatment plant a facility for improving the metal content of ore by concentration
MLO olive oil mill a mill where oil is extracted from olives
MLSG sugar mill a facility where sugar cane is processed into raw sugar
MLSGQ former sugar mill a sugar mill no longer used as a sugar mill
MLSW sawmill a mill where logs or lumber are sawn to specified shapes and sizes
MLWND windmill a mill or water pump powered by wind
MLWTR water mill a mill powered by running water
MN mine(s) a site where mineral ores are extracted from the ground by excavating surface pits and subterranean passages
MNAU gold mine(s) a mine where gold ore, or alluvial gold is extracted
MNC coal mine(s) a mine where coal is extracted
MNCR chrome mine(s) a mine where chrome ore is extracted
MNCU copper mine(s) a mine where copper ore is extracted
MNFE iron mine(s) a mine where iron ore is extracted
MNMT monument a commemorative structure or statue
MNN salt mine(s) a mine from which salt is extracted
MNQ abandoned mine
MNQR quarry(-ies) a surface mine where building stone or gravel and sand, etc. are extracted
MOLE mole a massive structure of masonry or large stones serving as a pier or breakwater
MSQE mosque a building for public Islamic worship
MSSN mission a place characterized by dwellings, school, church, hospital and other facilities operated by a religious group for the purpose of providing charitable services and to propagate religion
MSSNQ abandoned mission
MSTY monastery a building and grounds where a community of monks lives in seclusion
MTRO metro station metro station (Underground, Tube, or Metro)
MUS museum a building where objects of permanent interest in one or more of the arts and sciences are preserved and exhibited
NOV novitiate a religious house or school where novices are trained
NSY nursery(-ies) a place where plants are propagated for transplanting or grafting
OBPT observation point a wildlife or scenic observation point
OBS observatory a facility equipped for observation of atmospheric or space phenomena
OBSR radio observatory a facility equipped with an array of antennae for receiving radio waves from space
OILJ oil pipeline junction a section of an oil pipeline where two or more pipes join together
OILQ abandoned oil well
OILR oil refinery a facility for converting crude oil into refined petroleum products
OILT tank farm a tract of land occupied by large, cylindrical, metal tanks in which oil or liquid petrochemicals are stored
OILW oil well a well from which oil may be pumped
OPRA opera house A theater designed chiefly for the performance of operas.
PAL palace a large stately house, often a royal or presidential residence
PGDA pagoda a tower-like storied structure, usually a Buddhist shrine
PIER pier a structure built out into navigable water on piles providing berthing for ships and recreation
PKLT parking lot an area used for parking vehicles
PMPO oil pumping station a facility for pumping oil through a pipeline
PMPW water pumping station a facility for pumping water from a major well or through a pipeline
PO post office a public building in which mail is received, sorted and distributed
PP police post a building in which police are stationed
PPQ abandoned police post
PRKGT park gate a controlled access to a park
PRKHQ park headquarters a park administrative facility
PRN prison a facility for confining prisoners
PRNJ reformatory a facility for confining, training, and reforming young law offenders
PRNQ abandoned prison
PS power station a facility for generating electric power
PSH hydroelectric power station a building where electricity is generated from water power
PSN nuclear power station nuclear power station
PSTB border post a post or station at an international boundary for the regulation of movement of people and goods
PSTC customs post a building at an international boundary where customs and duties are paid on goods
PSTP patrol post a post from which patrols are sent out
PYR pyramid an ancient massive structure of square ground plan with four triangular faces meeting at a point and used for enclosing tombs
PYRS pyramids ancient massive structures of square ground plan with four triangular faces meeting at a point and used for enclosing tombs
QUAY quay a structure of solid construction along a shore or bank which provides berthing for ships and which generally provides cargo handling facilities
RDCR traffic circle a road junction formed around a central circle about which traffic moves in one direction only
RDIN intersection a junction of two or more highways by a system of separate levels that permit traffic to pass from one to another without the crossing of traffic streams
RECG golf course a recreation field where golf is played
RECR racetrack a track where races are held
REST restaurant A place where meals are served to the public
RET store a building where goods and/or services are offered for sale
RHSE resthouse a structure maintained for the rest and shelter of travelers
RKRY rookery a breeding place of a colony of birds or seals
RLG religious site an ancient site of significant religious importance
RLGR retreat a place of temporary seclusion, especially for religious groups
RNCH ranch(es) a large farm specializing in extensive grazing of livestock
RSD railroad siding a short track parallel to and joining the main track
RSGNL railroad signal a signal at the entrance of a particular section of track governing the movement of trains
RSRT resort a specialized facility for vacation, health, or participation sports activities
RSTN railroad station a facility comprising ticket office, platforms, etc. for loading and unloading train passengers and freight
RSTNQ abandoned railroad station
RSTP railroad stop a place lacking station facilities where trains stop to pick up and unload passengers and freight
RSTPQ abandoned railroad stop
RUIN ruin(s) a destroyed or decayed structure which is no longer functional
SCH school building(s) where instruction in one or more branches of knowledge takes place
SCHA agricultural school a school with a curriculum focused on agriculture
SCHC college the grounds and buildings of an institution of higher learning
SCHL language school Language Schools & Institutions
SCHM military school a school at which military science forms the core of the curriculum
SCHN maritime school a school at which maritime sciences form the core of the curriculum
SCHT technical school post-secondary school with a specifically technical or vocational curriculum
SECP State Exam Prep Centre state exam preparation centres
SHPF sheepfold a fence or wall enclosure for sheep and other small herd animals
SHRN shrine a structure or place memorializing a person or religious concept
SHSE storehouse a building for storing goods, especially provisions
SLCE sluice a conduit or passage for carrying off surplus water from a waterbody, usually regulated by means of a sluice gate
SNTR sanatorium a facility where victims of physical or mental disorders are treated
SPA spa a resort area usually developed around a medicinal spring
SPLY spillway a passage or outlet through which surplus water flows over, around or through a dam
SQR square a broad, open, public area near the center of a town or city
STBL stable a building for the shelter and feeding of farm animals, especially horses
STDM stadium a structure with an enclosure for athletic games with tiers of seats for spectators
STNB scientific research base a scientific facility used as a base from which research is carried out or monitored
STNC coast guard station a facility from which the coast is guarded by armed vessels
STNE experiment station a facility for carrying out experiments
STNF forest station a collection of buildings and facilities for carrying out forest management
STNI inspection station a station at which vehicles, goods, and people are inspected
STNM meteorological station a station at which weather elements are recorded
STNR radio station a facility for producing and transmitting information by radio waves
STNS satellite station a facility for tracking and communicating with orbiting satellites
STNW whaling station a facility for butchering whales and processing train oil
STPS steps stones or slabs placed for ease in ascending or descending a steep slope
SWT sewage treatment plant facility for the processing of sewage and/or wastewater
SYG synagogue a place for Jewish worship and religious instruction
THTR theater A building, room, or outdoor structure for the presentation of plays, films, or other dramatic performances
TMB tomb(s) a structure for interring bodies
TMPL temple(s) an edifice dedicated to religious worship
TNKD cattle dipping tank a small artificial pond used for immersing cattle in chemically treated water for disease control
TOLL toll gate/barrier highway toll collection station
TOWR tower a high conspicuous structure, typically much higher than its diameter
TRAM tram rail vehicle along urban streets (also known as streetcar or trolley)
TRANT transit terminal facilities for the handling of vehicular freight and passengers
TRIG triangulation station a point on the earth whose position has been determined by triangulation
TRMO oil pipeline terminal a tank farm or loading facility at the end of an oil pipeline
TWO temp work office Temporary Work Offices
UNIP university prep school University Preparation Schools & Institutions
UNIV university An institution for higher learning with teaching and research facilities constituting a graduate school and professional schools that award master's degrees and doctorates and an undergraduate division that awards bachelor's degrees.
USGE united states government establishment a facility operated by the United States Government in Panama
VETF veterinary facility a building or camp at which veterinary services are available
WALL wall a thick masonry structure, usually enclosing a field or building, or forming the side of a structure
WALLA ancient wall the remains of a linear defensive stone structure
WEIR weir(s) a small dam in a stream, designed to raise the water level or to divert stream flow through a desired channel
WHRF wharf(-ves) a structure of open rather than solid construction along a shore or a bank which provides berthing for ships and cargo-handling facilities
WRCK wreck the site of the remains of a wrecked vessel
WTRW waterworks a facility for supplying potable water through a water source and a system of pumps and filtration beds
ZNF free trade zone an area, usually a section of a port, where goods may be received and shipped free of customs duty and of most customs regulations
ZOO zoo a zoological garden or park where wild animals are kept for exhibition
T mountain,hill,rock,...
ASPH asphalt lake a small basin containing naturally occurring asphalt
ATOL atoll(s) a ring-shaped coral reef which has closely spaced islands on it encircling a lagoon
BAR bar a shallow ridge or mound of coarse unconsolidated material in a stream channel, at the mouth of a stream, estuary, or lagoon and in the wave-break zone along coasts
BCH beach a shore zone of coarse unconsolidated sediment that extends from the low-water line to the highest reach of storm waves
BCHS beaches a shore zone of coarse unconsolidated sediment that extends from the low-water line to the highest reach of storm waves
BDLD badlands an area characterized by a maze of very closely spaced, deep, narrow, steep-sided ravines, and sharp crests and pinnacles
BLDR boulder field a high altitude or high latitude bare, flat area covered with large angular rocks
BLHL blowhole(s) a hole in coastal rock through which sea water is forced by a rising tide or waves and spurted through an outlet into the air
BLOW blowout(s) a small depression in sandy terrain, caused by wind erosion
BNCH bench a long, narrow bedrock platform bounded by steeper slopes above and below, usually overlooking a waterbody
BUTE butte(s) a small, isolated, usually flat-topped hill with steep sides
CAPE cape a land area, more prominent than a point, projecting into the sea and marking a notable change in coastal direction
CFT cleft(s) a deep narrow slot, notch, or groove in a coastal cliff
CLDA caldera a depression measuring kilometers across formed by the collapse of a volcanic mountain
CLF cliff(s) a high, steep to perpendicular slope overlooking a waterbody or lower area
CNYN canyon a deep, narrow valley with steep sides cutting into a plateau or mountainous area
CONE cone(s) a conical landform composed of mud or volcanic material
CRDR corridor a strip or area of land having significance as an access way
CRQ cirque a bowl-like hollow partially surrounded by cliffs or steep slopes at the head of a glaciated valley
CRQS cirques bowl-like hollows partially surrounded by cliffs or steep slopes at the head of a glaciated valley
CRTR crater(s) a generally circular saucer or bowl-shaped depression caused by volcanic or meteorite explosive action
CUET cuesta(s) an asymmetric ridge formed on tilted strata
DLTA delta a flat plain formed by alluvial deposits at the mouth of a stream
DPR depression(s) a low area surrounded by higher land and usually characterized by interior drainage
DSRT desert a large area with little or no vegetation due to extreme environmental conditions
DUNE dune(s) a wave form, ridge or star shape feature composed of sand
DVD divide a line separating adjacent drainage basins
ERG sandy desert an extensive tract of shifting sand and sand dunes
FAN fan(s) a fan-shaped wedge of coarse alluvium with apex merging with a mountain stream bed and the fan spreading out at a low angle slope onto an adjacent plain
FORD ford a shallow part of a stream which can be crossed on foot or by land vehicle
FSR fissure a crack associated with volcanism
GAP gap a low place in a ridge, not used for transportation
GRGE gorge(s) a short, narrow, steep-sided section of a stream valley
HDLD headland a high projection of land extending into a large body of water beyond the line of the coast
HLL hill a rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m
HLLS hills rounded elevations of limited extent rising above the surrounding land with local relief of less than 300m
HMCK hammock(s) a patch of ground, distinct from and slightly above the surrounding plain or wetland. Often occurs in groups
HMDA rock desert a relatively sand-free, high bedrock plateau in a hot desert, with or without a gravel veneer
INTF interfluve a relatively undissected upland between adjacent stream valleys
ISL island a tract of land, smaller than a continent, surrounded by water at high water
ISLET islet small island, bigger than rock, smaller than island.
ISLF artificial island an island created by landfill or diking and filling in a wetland, bay, or lagoon
ISLM mangrove island a mangrove swamp surrounded by a waterbody
ISLS islands tracts of land, smaller than a continent, surrounded by water at high water
ISLT land-tied island a coastal island connected to the mainland by barrier beaches, levees or dikes
ISLX section of island
ISTH isthmus a narrow strip of land connecting two larger land masses and bordered by water
KRST karst area a distinctive landscape developed on soluble rock such as limestone characterized by sinkholes, caves, disappearing streams, and underground drainage
LAVA lava area an area of solidified lava
LEV levee a natural low embankment bordering a distributary or meandering stream; often built up artificially to control floods
MESA mesa(s) a flat-topped, isolated elevation with steep slopes on all sides, less extensive than a plateau
MND mound(s) a low, isolated, rounded hill
MRN moraine a mound, ridge, or other accumulation of glacial till
MT mountain an elevation standing high above the surrounding area with small summit area, steep slopes and local relief of 300m or more
MTS mountains a mountain range or a group of mountains or high ridges
NKM meander neck a narrow strip of land between the two limbs of a meander loop at its narrowest point
NTK nunatak a rock or mountain peak protruding through glacial ice
NTKS nunataks rocks or mountain peaks protruding through glacial ice
PAN pan a near-level shallow, natural depression or basin, usually containing an intermittent lake, pond, or pool
PANS pans a near-level shallow, natural depression or basin, usually containing an intermittent lake, pond, or pool
PASS pass a break in a mountain range or other high obstruction, used for transportation from one side to the other [See also gap]
PEN peninsula an elongate area of land projecting into a body of water and nearly surrounded by water
PENX section of peninsula
PK peak a pointed elevation atop a mountain, ridge, or other hypsographic feature
PKS peaks pointed elevations atop a mountain, ridge, or other hypsographic features
PLAT plateau an elevated plain with steep slopes on one or more sides, and often with incised streams
PLATX section of plateau
PLDR polder an area reclaimed from the sea by diking and draining
PLN plain(s) an extensive area of comparatively level to gently undulating land, lacking surface irregularities, and usually adjacent to a higher area
PLNX section of plain
PROM promontory(-ies) a bluff or prominent hill overlooking or projecting into a lowland
PT point a tapering piece of land projecting into a body of water, less prominent than a cape
PTS points tapering pieces of land projecting into a body of water, less prominent than a cape
RDGB beach ridge a ridge of sand just inland and parallel to the beach, usually in series
RDGE ridge(s) a long narrow elevation with steep sides, and a more or less continuous crest
REG stony desert a desert plain characterized by a surface veneer of gravel and stones
RK rock a conspicuous, isolated rocky mass
RKFL rockfall an irregular mass of fallen rock at the base of a cliff or steep slope
RKS rocks conspicuous, isolated rocky masses
SAND sand area a tract of land covered with sand
SBED dry stream bed a channel formerly containing the water of a stream
SCRP escarpment a long line of cliffs or steep slopes separating level surfaces above and below
SDL saddle a broad, open pass crossing a ridge or between hills or mountains
SHOR shore a narrow zone bordering a waterbody which covers and uncovers at high and low water, respectively
SINK sinkhole a small crater-shape depression in a karst area
SLID slide a mound of earth material, at the base of a slope and the associated scoured area
SLP slope(s) a surface with a relatively uniform slope angle
SPIT spit a narrow, straight or curved continuation of a beach into a waterbody
SPUR spur(s) a subordinate ridge projecting outward from a hill, mountain or other elevation
TAL talus slope a steep concave slope formed by an accumulation of loose rock fragments at the base of a cliff or steep slope
TRGD interdune trough(s) a long wind-swept trough between parallel longitudinal dunes
TRR terrace a long, narrow alluvial platform bounded by steeper slopes above and below, usually overlooking a waterbody
UPLD upland an extensive interior region of high land with low to moderate surface relief
VAL valley an elongated depression usually traversed by a stream
VALG hanging valley a valley the floor of which is notably higher than the valley or shore to which it leads; most common in areas that have been glaciated
VALS valleys elongated depressions usually traversed by a stream
VALX section of valley
VLC volcano a conical elevation composed of volcanic materials with a crater at the top
U undersea
APNU apron a gentle slope, with a generally smooth surface, particularly found around groups of islands and seamounts
ARCU arch a low bulge around the southeastern end of the island of Hawaii
ARRU arrugado an area of subdued corrugations off Baja California
BDLU borderland a region adjacent to a continent, normally occupied by or bordering a shelf, that is highly irregular with depths well in excess of those typical of a shelf
BKSU banks elevations, typically located on a shelf, over which the depth of water is relatively shallow but sufficient for safe surface navigation
BNKU bank an elevation, typically located on a shelf, over which the depth of water is relatively shallow but sufficient for safe surface navigation
BSNU basin a depression more or less equidimensional in plan and of variable extent
CDAU cordillera an entire mountain system including the subordinate ranges, interior plateaus, and basins
CNSU canyons relatively narrow, deep depressions with steep sides, the bottom of which generally has a continuous slope
CNYU canyon a relatively narrow, deep depression with steep sides, the bottom of which generally has a continuous slope
CRSU continental rise a gentle slope rising from oceanic depths towards the foot of a continental slope
DEPU deep a localized deep area within the confines of a larger feature, such as a trough, basin or trench
EDGU shelf edge a line along which there is a marked increase of slope at the outer margin of a continental shelf or island shelf
ESCU escarpment (or scarp) an elongated and comparatively steep slope separating flat or gently sloping areas
FANU fan a relatively smooth feature normally sloping away from the lower termination of a canyon or canyon system
FLTU flat a small level or nearly level area
FRZU fracture zone an extensive linear zone of irregular topography of the sea floor, characterized by steep-sided or asymmetrical ridges, troughs, or escarpments
FURU furrow a closed, linear, narrow, shallow depression
GAPU gap a narrow break in a ridge or rise
GLYU gully a small valley-like feature
HLLU hill an elevation rising generally less than 500 meters
HLSU hills elevations rising generally less than 500 meters
HOLU hole a small depression of the sea floor
KNLU knoll an elevation rising generally more than 500 meters and less than 1,000 meters and of limited extent across the summit
KNSU knolls elevations rising generally more than 500 meters and less than 1,000 meters and of limited extent across the summits
LDGU ledge a rocky projection or outcrop, commonly linear and near shore
LEVU levee an embankment bordering a canyon, valley, or seachannel
MESU mesa an isolated, extensive, flat-topped elevation on the shelf, with relatively steep sides
MNDU mound a low, isolated, rounded hill
MOTU moat an annular depression that may not be continuous, located at the base of many seamounts, islands, and other isolated elevations
MTU mountain a well-delineated subdivision of a large and complex positive feature
PKSU peaks prominent elevations, part of a larger feature, either pointed or of very limited extent across the summit
PKU peak a prominent elevation, part of a larger feature, either pointed or of very limited extent across the summit
PLNU plain a flat, gently sloping or nearly level region
PLTU plateau a comparatively flat-topped feature of considerable extent, dropping off abruptly on one or more sides
PNLU pinnacle a high tower or spire-shaped pillar of rock or coral, alone or cresting a summit
PRVU province a region identifiable by a group of similar physiographic features whose characteristics are markedly in contrast with surrounding areas
RDGU ridge a long narrow elevation with steep sides
RDSU ridges long narrow elevations with steep sides
RFSU reefs surface-navigation hazards composed of consolidated material
RFU reef a surface-navigation hazard composed of consolidated material
RISU rise a broad elevation that rises gently, and generally smoothly, from the sea floor
SCNU seachannel a continuously sloping, elongated depression commonly found in fans or plains and customarily bordered by levees on one or two sides
SCSU seachannels continuously sloping, elongated depressions commonly found in fans or plains and customarily bordered by levees on one or two sides
SDLU saddle a low part, resembling in shape a saddle, in a ridge or between contiguous seamounts
SHFU shelf a zone adjacent to a continent (or around an island) that extends from the low water line to a depth at which there is usually a marked increase of slope towards oceanic depths
SHLU shoal a surface-navigation hazard composed of unconsolidated material
SHSU shoals hazards to surface navigation composed of unconsolidated material
SHVU shelf valley a valley on the shelf, generally the shoreward extension of a canyon
SILU sill the low part of a gap or saddle separating basins
SLPU slope the slope seaward from the shelf edge to the beginning of a continental rise or the point where there is a general reduction in slope
SMSU seamounts elevations rising generally more than 1,000 meters and of limited extent across the summit
SMU seamount an elevation rising generally more than 1,000 meters and of limited extent across the summit
SPRU spur a subordinate elevation, ridge, or rise projecting outward from a larger feature
TERU terrace a relatively flat horizontal or gently inclined surface, sometimes long and narrow, which is bounded by a steeper ascending slope on one side and by a steep descending slope on the opposite side
TMSU tablemounts (or guyots) seamounts having a comparatively smooth, flat top
TMTU tablemount (or guyot) a seamount having a comparatively smooth, flat top
TNGU tongue an elongate (tongue-like) extension of a flat sea floor into an adjacent higher feature
TRGU trough a long depression of the sea floor characteristically flat bottomed and steep sided, and normally shallower than a trench
TRNU trench a long, narrow, characteristically very deep and asymmetrical depression of the sea floor, with relatively steep sides
VALU valley a relatively shallow, wide depression, the bottom of which usually has a continuous gradient
VLSU valleys a relatively shallow, wide depression, the bottom of which usually has a continuous gradient
V forest,heath,...
BUSH bush(es) a small clump of conspicuous bushes in an otherwise bare area
CULT cultivated area an area under cultivation
FRST forest(s) an area dominated by tree vegetation
FRSTF fossilized forest a forest fossilized by geologic processes and now exposed at the earth's surface
GROVE grove a small wooded area or collection of trees growing closely together, occurring naturally or deliberately planted
GRSLD grassland an area dominated by grass vegetation
GRVC coconut grove a planting of coconut trees
GRVO olive grove a planting of olive trees
GRVP palm grove a planting of palm trees
GRVPN pine grove a planting of pine trees
HTH heath an upland moor or sandy area dominated by low shrubby vegetation including heather
MDW meadow a small, poorly drained area dominated by grassy vegetation
OCH orchard(s) a planting of fruit or nut trees
SCRB scrubland an area of low trees, bushes, and shrubs stunted by some environmental limitation
TREE tree(s) a conspicuous tree used as a landmark
TUND tundra a marshy, treeless, high latitude plain, dominated by mosses, lichens, and low shrub vegetation under permafrost conditions
VIN vineyard a planting of grapevines
VINS vineyards plantings of grapevines
ll not available
+
+ + +

 

 

 

  +

+ + + + + diff --git a/homebytwo/importers/tests/data/geonames_codes_one.html b/homebytwo/importers/tests/data/geonames_codes_one.html new file mode 100644 index 00000000..6048fa10 --- /dev/null +++ b/homebytwo/importers/tests/data/geonames_codes_one.html @@ -0,0 +1,68 @@ + + + + +GeoNames + + + + + + + + +
 GeoNames Home | Postal Codes | Download / Webservice | About | +
+ + search + +
+ + +login + + + +
+ +

GeoNames Feature Codes

+ + +
+ + + +
A country, state, region,...
ADM1 first-order administrative division a primary administrative division of a country, such as a state in the United States
+
+ + +

 

 

 

  +

+ + + + + diff --git a/homebytwo/importers/tests/data/swissnames3d_LV03_test.csv b/homebytwo/importers/tests/data/swissnames3d_LV03_test.csv new file mode 100644 index 00000000..ce285aa6 --- /dev/null +++ b/homebytwo/importers/tests/data/swissnames3d_LV03_test.csv @@ -0,0 +1,203 @@ +UUID;OBJEKTART;OBJEKTKLASSE_TLM;HOEHE;GEBAEUDENUTZUNG;NAME_UUID;NAME;STATUS;SPRACHCODE;NAMEN_TYP;NAMENGRUPPE_UUID;E;N;Z +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2691241;1293512;528 +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2691241;1293512;528 +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2691241;1293512;528 +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2691241;1293512;528 +{AC36C53E-62E0-491E-8E67-99750B134EF7};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4D418984-3822-4CFD-86B8-FE8716886F26};Niederönz 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2618278;1225810;476 +{AC36C53E-62E0-491E-8E67-99750B134EF7};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4D418984-3822-4CFD-86B8-FE8716886F26};Niederönz 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2618278;1225810;476 +{CB96BFF1-D203-45FC-A0D3-6E6D27E428F6};Kapelle;TLM_GEBAEUDE;;k_W;{BDAF2910-7454-4A99-AA1C-83EA8FA5E35E};Chapelle des saints coeur de Jésus et Marie;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2583416;1113893;481 +{CB96BFF1-D203-45FC-A0D3-6E6D27E428F6};Kapelle;TLM_GEBAEUDE;;k_W;{BDAF2910-7454-4A99-AA1C-83EA8FA5E35E};Chapelle des saints coeur de Jésus et Marie;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2583416;1113893;481 +{CB96BFF1-D203-45FC-A0D3-6E6D27E428F6};Kapelle;TLM_GEBAEUDE;;k_W;{BDAF2910-7454-4A99-AA1C-83EA8FA5E35E};Chapelle des saints coeur de Jésus et Marie;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2583416;1113893;481 +{7A7ABA46-45B5-499D-9DE4-FA0DA81DF514};Gebaeude;TLM_GEBAEUDE;;k_W;{99B55431-F53E-496D-AA41-0A2CC71FF9B5};Refuge de la Christine;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2507862;1166680;1294 +{7A7ABA46-45B5-499D-9DE4-FA0DA81DF514};Gebaeude;TLM_GEBAEUDE;;k_W;{99B55431-F53E-496D-AA41-0A2CC71FF9B5};Refuge de la Christine;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2507862;1166680;1294 +{FD1BAD47-CC16-41D3-9B21-56EDBF459B1C};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4AA352B7-6DA2-435D-8647-C4D29D2D8AB5};Alvaneu Crappa Naira 300m;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2767719;1171466;1081 +{FD1BAD47-CC16-41D3-9B21-56EDBF459B1C};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4AA352B7-6DA2-435D-8647-C4D29D2D8AB5};Alvaneu Crappa Naira 300m;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2767719;1171466;1081 +{EC8D3F6C-622A-4225-9839-B5B5F8C90E72};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{F0A2B29C-3201-4C63-8FF3-87C2BDF4544B};Zumikon Breitwis 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2689794;1244192;651 +{366B493B-FEB5-465D-96FD-AA9424325F05};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{E460F289-ED83-43A3-B366-1DE2AC5D9F83};Sant Anna;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2730443;1121245;354 +{366B493B-FEB5-465D-96FD-AA9424325F05};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{E460F289-ED83-43A3-B366-1DE2AC5D9F83};Sant Anna;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2730443;1121245;354 +{95466FBA-E618-47EE-9AEB-26C61B25B27A};Turm;TLM_GEBAEUDE;;Aussichtsturm;{062462F2-AEB7-469B-B4FE-2D86601FFEDC};Hagenturm;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2684623;1292108;956 +{95466FBA-E618-47EE-9AEB-26C61B25B27A};Turm;TLM_GEBAEUDE;;Aussichtsturm;{062462F2-AEB7-469B-B4FE-2D86601FFEDC};Hagenturm;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2684623;1292108;956 +{9CD31DED-6718-4122-AD20-F86C99503ECC};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{A5787309-B848-442C-8CCA-5A2554695E5B};Meinisberg 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2592243;1223173;512 +{3A56F261-EE79-4A79-BEC4-CFEF918F69C6};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{172FA268-AF59-4F72-A998-CF410885FE3F};Finhaut 300/50/25m;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2564609;1104078;1362 +{073BACDD-3B70-435A-BAA0-F9B10FE7F83E};Offenes Gebaeude;TLM_GEBAEUDE;;Gasthof abgelegen;{21120BFD-69C1-4EEB-BA4F-08E9FA853D44};Berggasthaus Äscher Wildkirchli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2749461;1238828;1473 +{42001FE7-F194-4868-8B51-2BADEE442CC8};Turm;TLM_GEBAEUDE;;Aussichtsturm;{85059074-A0F4-4B1E-9545-568202D152F9};Beringer Randenturm;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2685740;1284457;677 +{6A5A16A9-F984-452F-9484-3015434DD367};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{AAB81B3A-1378-4EEB-8BD0-829882D9E52F};Christuskirche;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2745679;1254636;740 +{10C9A6F9-69AD-43F8-BADA-3DA8EDE4A7F7};Kapelle;TLM_GEBAEUDE;;k_W;{4398F77F-F637-42F7-A8CA-E4227E619A22};Flüekapelle;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2618297;1139060;2074 +{9888FDCD-9B7C-45C8-B23B-778A93D42D2E};Turm;TLM_GEBAEUDE;;Aussichtsturm;{298603D0-8868-4CAA-ABF2-2DE5B93A8CB0};Aahorn;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2707210;1228864;417 +{88D68E1D-720D-40FF-8ED0-C23CDD6ECB1D};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{8F26B2A0-1D8F-4F96-8F74-09D59D7C7860};Scatiàn;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2725018;1105964;1061 +{3EE94383-8B3C-490C-8B5E-3FF711885A35};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{DA251A01-3EC0-4BD2-B6CC-BB24AD66D418};San Andrea;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2718688;1103146;583 +{3F3D4FDB-1D4E-4C79-9067-2BF96D5D469B};Kapelle;TLM_GEBAEUDE;;k_W;{82E55AAF-1326-4F1F-BF60-E2F60DFFD0B2};S. Vitale;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2719676;1091313;689 +{4EE2515B-7521-4A08-A757-557DE7300698};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{C1F565EF-6FEA-44A3-B608-E681E01EEDE5};Suhr Obertel 300/50/25m;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{10970284-4B09-4F63-B3DA-46386D825858};2647484;1245595;422 +{4EE2515B-7521-4A08-A757-557DE7300698};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{C1F565EF-6FEA-44A3-B608-E681E01EEDE5};Suhr Obertel 300/50/25m;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{10970284-4B09-4F63-B3DA-46386D825858};2647484;1245595;422 +{4EE2515B-7521-4A08-A757-557DE7300698};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{C98723D7-545B-48C5-9C5C-57BAC3252FDE};Suhr Obertel 100/50m;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{10970284-4B09-4F63-B3DA-46386D825858};2647484;1245595;422 +{36CF9CF6-2400-4BBE-8E91-DFC34B497DE9};Gebaeude;TLM_GEBAEUDE;;Gasthof abgelegen;{6E9C8FBA-01EA-4537-B08E-B1BB67D8BC95};Moulin Neuf;offiziell;Franzoesisch inkl. Lokalsprachen;Endonym;{E25BDACA-9341-4C71-91D4-14CF323102DC};2591586;1254333;512 +{36CF9CF6-2400-4BBE-8E91-DFC34B497DE9};Gebaeude;TLM_GEBAEUDE;;Gasthof abgelegen;{09C11954-ADBC-493A-8267-CFB9A760E813};Restaurant Neumühle;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{E25BDACA-9341-4C71-91D4-14CF323102DC};2591586;1254333;512 +{8D4C0D88-C10E-45A2-9394-9BDCF3C9100F};Turm;TLM_GEBAEUDE;;Aussichtsturm;{C27CCF97-8075-4F86-BF24-CD78A5C4D1C8};Liestal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2623720;1259740;637 +{93400849-4FD0-4E86-9512-EC990E6263A5};Kapelle;TLM_GEBAEUDE;;k_W;{60D34CBE-76CD-471F-BE60-EA12FF813330};Église Mennonite La Chaux-d'Abel;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2562207;1224494;1054 +{48857291-9DF3-4DED-899D-7EC9FFC15CE6};Gebaeude;TLM_GEBAEUDE;;k_W;{DB2732A6-19E9-426E-B515-4C50EE8B01CF};Tenigerbad;ueblich;Hochdeutsch inkl. Lokalsprachen;Endonym;{02860C6A-0FB9-4D9C-AA64-11BD5D98879A};2716205;1172057;1310 +{48857291-9DF3-4DED-899D-7EC9FFC15CE6};Gebaeude;TLM_GEBAEUDE;;k_W;{DB2732A6-19E9-426E-B515-4C50EE8B01CF};Tenigerbad;ueblich;Hochdeutsch inkl. Lokalsprachen;Endonym;{02860C6A-0FB9-4D9C-AA64-11BD5D98879A};2716205;1172057;1310 +{8B9D6E93-ABE0-4CC4-A851-A55523733C87};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{D59E3FFB-06AF-4497-8043-493B3DFEF30F};Chrüz;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2751874;1240671;927 +{8B9D6E93-ABE0-4CC4-A851-A55523733C87};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{D59E3FFB-06AF-4497-8043-493B3DFEF30F};Chrüz;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2751874;1240671;927 +{9021A643-7830-462B-9705-D77762BDDFD5};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{4A560D7E-FC46-40DF-A61F-E2FF514BEDDB};Gässlistein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2725224;1210114;500 +{9021A643-7830-462B-9705-D77762BDDFD5};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{4A560D7E-FC46-40DF-A61F-E2FF514BEDDB};Gässlistein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2725224;1210114;500 +{CC79FC5E-E558-477C-B411-CD31CB3DE670};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{76D16CBB-9C22-4405-A6CC-4DAF34F4F9F5};Schalenstein Oberprod;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2751494;1213659;745 +{CAB14870-6339-49B2-B90A-4E16DE2E4B72};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{94C2DB35-9064-4DEE-831C-E8A379130CC4};Schlangenstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2783514;1203919;1739 +{72D1265F-F86C-4067-8583-C533B3CCD826};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{B2A997F8-1B0E-4F6B-BBD6-8EF9FD4FCCE5};Tüfelstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2777958;1200821;1390 +{F6B650FA-B134-4FC3-92C1-250596F1DA16};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{711EF889-16F5-488E-8195-728743EA40C2};Güggelstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2777340;1200239;1325 +{9B6515E1-E442-4620-9668-CDAEFF0A039C};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{D7389FF5-CC17-4249-AE12-C9BB3DBB83F7};Schafstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2766485;1183829;1926 +{F6F27A47-DD19-4964-8BC1-7DE1DAF34999};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{018D09D0-7224-4306-BAE1-CD1F277E9D5D};Geisterstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2766254;1182598;2200 +{82224945-106D-4143-A893-B984F86B0FBB};Quelle;TLM_EINZELOBJEKT;;k_W;{EF3767FB-8C3A-4764-B4A5-203276DE708C};Funtana Dadora;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2831619;1201245;1268 +{82224945-106D-4143-A893-B984F86B0FBB};Quelle;TLM_EINZELOBJEKT;;k_W;{EF3767FB-8C3A-4764-B4A5-203276DE708C};Funtana Dadora;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2831619;1201245;1268 +{AE45BAF7-6B17-4144-B219-1C40A0B46736};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{11EF9ABB-4DF3-4C4B-B96E-254A14DCDB1C};Kristallhöhle;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2758414;1243440;630 +{AE45BAF7-6B17-4144-B219-1C40A0B46736};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{11EF9ABB-4DF3-4C4B-B96E-254A14DCDB1C};Kristallhöhle;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2758414;1243440;630 +{FFF62977-814E-4A81-9FED-E7619E78CA3B};Quelle;TLM_EINZELOBJEKT;;k_W;{12547F93-EEFE-4230-9611-610AAB88B912};Sieben Brünnen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2765264;1210422;1909 +{2C9B438C-1BBA-4B11-A217-12F282E9FF3E};Wasserfall;TLM_EINZELOBJEKT;;k_W;{CD6BF504-B8C0-468C-8660-7D4120A02E66};Hochfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2761707;1210010;1138 +{2C9B438C-1BBA-4B11-A217-12F282E9FF3E};Wasserfall;TLM_EINZELOBJEKT;;k_W;{CD6BF504-B8C0-468C-8660-7D4120A02E66};Hochfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2761707;1210010;1138 +{BB803E15-6F30-4E61-A965-CEE9C7CFAF3C};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{DED14C0C-2970-466C-A878-965E54EE868A};Weberlisch Höli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2785373;1206843;2011 +{07486640-DC7B-473C-B33A-FBAF708852CA};Quelle;TLM_EINZELOBJEKT;;k_W;{73F0363C-7485-49AF-BE15-6CD5BA039218};Chaltwasser;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2782794;1206153;1557 +{B4F8B51C-4370-41AD-9700-08C414B98847};Denkmal;TLM_EINZELOBJEKT;;k_W;{A0252E5B-9C8B-46C8-8F02-8EEECFA3FF45};Fontana-Denkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2759562;1190853;598 +{B4F8B51C-4370-41AD-9700-08C414B98847};Denkmal;TLM_EINZELOBJEKT;;k_W;{A0252E5B-9C8B-46C8-8F02-8EEECFA3FF45};Fontana-Denkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2759562;1190853;598 +{D959755F-3010-4AA5-AD16-DE485CA286F6};Denkmal;TLM_EINZELOBJEKT;;k_W;{A334A24C-1DA8-4C3C-8E4D-7EE2AF051C0B};Vazerol-Denkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2759737;1190913;600 +{8ACC7598-9497-4207-985B-203A26AF1AC9};Quelle;TLM_EINZELOBJEKT;;k_W;{E35240F4-A4E5-452B-89D1-A89AEE774197};Guotiger Brunnen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2768549;1192280;2174 +{C28508FD-B0D5-4242-89CC-BC95BD8E6566};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{F0D82B19-5490-493C-8374-A508387E6226};Abgrundhöli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2784215;1210593;2288 +{A5039C9A-E448-494A-B7A4-8565C598EA8A};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{1210FBE5-CB9B-4FBE-B8B3-1DF6F20CD4F1};Chilchhöli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2784106;1210438;2283 +{9BB0CA7B-6984-4F0B-A5AE-D13AB9CD1B08};Denkmal;TLM_EINZELOBJEKT;;k_W;{AC04548E-D2F0-46EF-9BB5-09D0AB0E222B};Denkmal Rohan-Schanze;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2761046;1204849;524 +{84E5BF55-E491-433B-9FE9-DBF47D78D924};Denkmal;TLM_EINZELOBJEKT;;k_W;{0D2BAFBB-D3DD-47EE-BE25-D95F706E99BC};Soldatendenkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2709995;1268577;413 +{C372CECE-8AF7-41F0-8F65-615E60CE57F3};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{EE772633-FDAD-485A-993C-328267533628};St. Kolumbanshöhle;ueblich;Hochdeutsch inkl. Lokalsprachen;Endonym;{FFA3A63F-8AAB-4D80-B7A5-3078ABBD6591};2734858;1251486;618 +{DEE83F6A-5E74-4C59-B227-2B6812A5542D};Brunnen;TLM_EINZELOBJEKT;;k_W;{9AA8DD8D-E8A8-4281-8FEE-5D68A36BD054};Stiegenbrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2684088;1292238;810 +{DEE83F6A-5E74-4C59-B227-2B6812A5542D};Brunnen;TLM_EINZELOBJEKT;;k_W;{9AA8DD8D-E8A8-4281-8FEE-5D68A36BD054};Stiegenbrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2684088;1292238;810 +{2C125060-1F71-4391-AC04-904FAC0597BE};Brunnen;TLM_EINZELOBJEKT;;k_W;{45820AF9-4A7C-47DD-BDA3-18BF7078D6F4};Hirschebrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2705740;1284324;644 +{800D4334-EC7A-4EBA-A474-307D3DDC9D51};Wasserfall;TLM_EINZELOBJEKT;;k_W;{E2AC33FE-C1E8-4725-B275-CC77CD79E79E};Rheinfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2688390;1281451;376 +{5306F1AA-C1F1-43C6-91F0-61B0B3A5F859};Wasserfall;TLM_EINZELOBJEKT;;k_W;{D1120A4F-93B9-4E0E-A6EA-BAD1EDFC75EB};Gsponbachfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2733089;1214943;1369 +{7A0787E7-6F5B-412A-ADFB-E86BE2D0995F};Wasserfall;TLM_EINZELOBJEKT;;k_W;{F5B74D27-E675-466E-80ED-A736D207E7E5};Murgbachfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2731092;1211256;1788 +{7B23A6ED-A47B-422A-8F72-AC0D0A9F7CA3};Bildstock;TLM_EINZELOBJEKT;;k_W;{4B9C4AD4-C236-4A91-9453-C804662AA928};Helenachappali;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2718228;1241225;1172 +{7B23A6ED-A47B-422A-8F72-AC0D0A9F7CA3};Bildstock;TLM_EINZELOBJEKT;;k_W;{4B9C4AD4-C236-4A91-9453-C804662AA928};Helenachappali;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2718228;1241225;1172 +{D219D90D-E4A9-48F5-ACAC-13039EB68119};Bildstock;TLM_EINZELOBJEKT;;k_W;{0CDD1DE8-1BD7-4AFA-AD8F-B1ABD14E0B54};St. Meinrad;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2684910;1223780;697 +{9B137072-567B-4D92-8A39-130B264F558B};Brunnen;TLM_EINZELOBJEKT;;k_W;{2FF714F3-BCE7-436D-AF92-4A899FEF7370};Römerbrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2699396;1245309;547 +{8D3A3155-B933-4BE5-BC19-BB2D794DBB2E};Bildstock;TLM_EINZELOBJEKT;;k_W;{0CDD1DE8-1BD7-4AFA-AD8F-B1ABD14E0B54};St. Meinrad;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2699472;1220072;975 +{1408D351-B7C9-4342-8D78-C8C4B56A224A};Bildstock;TLM_EINZELOBJEKT;;k_W;{39D3BC31-3893-4CD9-B046-59F4F1A9CB09};Herrgott;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2703272;1202819;716 +{7462D1C3-80DB-4D40-885D-4C531AB4AFC6};Brunnen;TLM_EINZELOBJEKT;;k_W;{B1F7BDE4-4621-4165-A5FC-11690F7A6D8E};Meinradsbrunnen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2701369;1226221;831 +{2068116E-1C4E-42B1-864C-1F892AB058B2};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{631B0BB3-436A-431C-9530-B33497EF19F4};Fünfländerblick;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2756518;1258272;898 +{2068116E-1C4E-42B1-864C-1F892AB058B2};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{631B0BB3-436A-431C-9530-B33497EF19F4};Fünfländerblick;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2756518;1258272;898 +{5AB97F0B-E4D9-4EB8-A24C-D35575F2606B};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{86E1B19D-0AAF-4F8C-BF4C-94F35835B9CF};Langwieser Aussicht;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2772378;1186507;1776 +{C9BA3DA4-AE38-457B-88D8-FAE7024CFE60};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{E1C6BBB1-727F-443B-BB51-AF79AB1C6427};Bellavista;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2817522;1185266;1502 +{A0D895F7-5EFD-485C-882F-E5CA9C99F82B};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{5DB7CBBB-4F53-44BA-9332-26045D534FB6};Dreiländerpunkt;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{D39DA0C7-5CD9-4815-B567-AC34FAEA28FD};2831095;1193773;2180 +{A0D895F7-5EFD-485C-882F-E5CA9C99F82B};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{5DB7CBBB-4F53-44BA-9332-26045D534FB6};Dreiländerpunkt;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{D39DA0C7-5CD9-4815-B567-AC34FAEA28FD};2831095;1193773;2180 +{A0D895F7-5EFD-485C-882F-E5CA9C99F82B};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{12248412-12BE-41FF-B7E4-8133DF8D611A};Cippo triconfinale;offiziell;Italienisch inkl. Lokalsprachen;Endonym;{D39DA0C7-5CD9-4815-B567-AC34FAEA28FD};2831095;1193773;2180 +{2F5D392D-F64A-438D-8A09-DC0A37F67641};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{64E063FC-8296-4334-BBEB-978C36F7E2E7};Pavillon;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2573883;1213348;655 +{D3864844-AC52-463D-8413-9E615F7DC466};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{D5E7B4CC-8AD5-456E-803D-418AC07DC278};593 Schwarze Staa;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2684601;1295934;822 +{2A5DAC6A-6BE1-4FCF-B824-1A19A20BC7F4};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{66A6E81A-EDBD-44E6-90DC-26CA4431FC5A};146;offiziell;k_W;Endonym;{CBA27777-7D1C-4D18-9EC1-35358F15E4B8};2576767;1261401;504 +{A892E90D-A04B-4F3A-95BE-C0EBF08CB92B};Pass;TLM_NAME_PKT;2438;k_W;{CFC655A5-F972-4DDB-BD74-02509855B8D2};Bocchetta dal Meden;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2802231;1122512;2438 +{A892E90D-A04B-4F3A-95BE-C0EBF08CB92B};Pass;TLM_NAME_PKT;2438;k_W;{CFC655A5-F972-4DDB-BD74-02509855B8D2};Bocchetta dal Meden;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2802231;1122512;2438 +{FAF96501-091B-4DB1-B9FB-3E618C876590};Pass;TLM_NAME_PKT;2221;k_W;{0637524C-120B-45F8-A945-14C825228050};Col d'Anzana;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2803664;1122549;2221 +{DC0A5C77-515A-4A23-B26B-5A6B9584A928};Gipfel;TLM_NAME_PKT;2344;k_W;{28F58EE8-794B-41C1-BCCA-3BA291239C9D};Cima Buzzi;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2804015;1122882;2344 +{DC0A5C77-515A-4A23-B26B-5A6B9584A928};Gipfel;TLM_NAME_PKT;2344;k_W;{28F58EE8-794B-41C1-BCCA-3BA291239C9D};Cima Buzzi;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2804015;1122882;2344 +{700BB132-84ED-4276-95BB-4E4A2C797B85};Gipfel;TLM_NAME_PKT;2279;k_W;{D0F3237F-75C6-4F03-899F-37926A4BFEB3};Vetta Salarsa;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2805338;1123084;2279 +{0384BE7D-D4C7-4FC0-AC4A-B9CDBB1D64AC};Pass;TLM_NAME_PKT;2234;k_W;{544459AB-D6B7-4EA0-AA0B-A1CB6E8FDEF0};Col da Salarsa;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2805096;1123134;2234 +{A8EAC38F-8218-492B-BDBF-7E3A6D98FE95};Hauptgipfel;TLM_NAME_PKT;2900;k_W;{E0A49E5E-29D7-4934-9022-792873EBD755};Piz Combul;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2800960;1123136;2900 +{A8EAC38F-8218-492B-BDBF-7E3A6D98FE95};Hauptgipfel;TLM_NAME_PKT;2900;k_W;{E0A49E5E-29D7-4934-9022-792873EBD755};Piz Combul;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2800960;1123136;2900 +{3C6E13C3-9CF6-4FC0-A12A-4C0CC8E8DD55};Pass;TLM_NAME_PKT;2618;k_W;{0697C40C-7B7C-438C-9E8C-B4BD9332CF47};Bocchetta Malgina;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2801688;1123849;2618 +{E2096FEA-F105-41E0-90E2-3FC0E76F827B};Hauptgipfel;TLM_NAME_PKT;2876;k_W;{6107F930-F3A7-4028-930E-E4BBD8ED45F3};Piz Malgina;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2801842;1124665;2876 +{924839CE-57EE-4F4F-B048-F6ABA3E369A8};Hauptgipfel;TLM_NAME_PKT;2513;k_W;{77E1F74D-594C-475F-83B4-34A753DF5CD4};Corn dal Solcun;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2803936;1126158;2513 +{6700F753-E20B-4173-997D-84B57A4820C0};Hauptgipfel;TLM_NAME_PKT;2779;k_W;{493DC462-79E9-44FC-BB8D-7E25BCAAC02B};Piz Sareggio;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2801795;1126202;2779 +{78446BCF-F23E-4034-8B41-2A8673772296};Gipfel;TLM_NAME_PKT;2040;k_W;{E9C17EC7-D9ED-424A-807B-C2E0213FDE90};Giümelin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2805496;1126290;2040 +{D806454A-ABB1-4E5C-A96D-6DDCA2ABCAAF};Hauptgipfel;TLM_NAME_PKT;2804;k_W;{351E1C8D-44CE-4D51-A90E-984748580C7C};Monte Saline;ueblich;Italienisch inkl. Lokalsprachen;Endonym;{A1F78FF0-6EED-4B37-9AFF-901100A615D4};2800952;1127606;2804 +{217A46EC-A156-4BB0-85CC-AB6ACC8066EE};Gipfel;TLM_NAME_PKT;2225;k_W;{A1A002AC-B5DC-44EB-97FA-64A652E97AA5};Motta da Scioschin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2802411;1127655;2225 +{F1A53D42-197D-4CD9-9E14-EFAA56347306};Hauptgipfel;TLM_NAME_PKT;2857;k_W;{19928FD3-5FFC-48F3-8CE8-93B99FA7B712};Cima di Rosso;ueblich;Italienisch inkl. Lokalsprachen;Endonym;{39DDACF9-E090-4F83-982F-D7D1724989C3};2805361;1135680;2857 +{CC07F455-D0F4-493D-B25B-15FB458FCE3E};Alpiner Gipfel;TLM_NAME_PKT;3451;k_W;{AF285ED4-1AD6-4A2C-BDA3-B3783DBA8677};Piz Corvatsch;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2782789;1142435;3451 +{CC07F455-D0F4-493D-B25B-15FB458FCE3E};Alpiner Gipfel;TLM_NAME_PKT;3451;k_W;{AF285ED4-1AD6-4A2C-BDA3-B3783DBA8677};Piz Corvatsch;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2782789;1142435;3451 +{17760638-17D4-470D-82A1-83CF9096C8F6};Pass;TLM_NAME_PKT;2498;k_W;{BE7BD2F7-3DD5-4482-8D55-47416F3B7C49};Wormser Joch;fremd;Hochdeutsch inkl. Lokalsprachen;Exonym;{71E7A4E7-C51E-4902-9F3A-E306EEA048FD};2829705;1158741;2498 +{17760638-17D4-470D-82A1-83CF9096C8F6};Pass;TLM_NAME_PKT;2498;k_W;{BE7BD2F7-3DD5-4482-8D55-47416F3B7C49};Wormser Joch;fremd;Hochdeutsch inkl. Lokalsprachen;Exonym;{71E7A4E7-C51E-4902-9F3A-E306EEA048FD};2829705;1158741;2498 +{749A27D5-B263-479A-A7CC-658C4C46BC9D};Alpiner Gipfel;TLM_NAME_PKT;3025;k_W;{E51986D8-A571-4DDD-8133-230060BCCFDE};Piz Cotschen;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Endonym;{671F5E83-DE8F-4E6C-8CD0-8A69364BA15D};2831494;1158962;3025 +{0445F624-C20E-45FF-95D7-2A4D0E20B00A};Huegel;TLM_NAME_PKT;526;k_W;{A39DD568-618C-4265-A545-5F248862343D};Forrenbuck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2690031;1267691;526 +{0445F624-C20E-45FF-95D7-2A4D0E20B00A};Huegel;TLM_NAME_PKT;526;k_W;{A39DD568-618C-4265-A545-5F248862343D};Forrenbuck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2690031;1267691;526 +{5C306B4E-F5FB-43CB-996C-EF14978A10F7};Haupthuegel;TLM_NAME_PKT;1157;k_W;{76E2EA33-FED8-4114-B038-4DBE86C0A6B6};Mota dal Meschin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2805845;1128277;1157 +{5C306B4E-F5FB-43CB-996C-EF14978A10F7};Haupthuegel;TLM_NAME_PKT;1157;k_W;{76E2EA33-FED8-4114-B038-4DBE86C0A6B6};Mota dal Meschin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2805845;1128277;1157 +{8BC7748B-B378-4F0B-AE1C-EBE967A2764D};Alpiner Gipfel;TLM_NAME_PKT;3102;k_W;{BE55A144-C4A7-40CB-BDFF-71CBE18E2082};Piz Cancian;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2797346;1128984;3102 +{47FF2BFB-1F30-4167-8109-362A53957737};Felskopf;TLM_NAME_PKT;2205;k_W;{7C45F52F-E6FE-4DFE-8E0B-276C101B9B42};Pilinghel;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2799764;1129771;2205 +{47FF2BFB-1F30-4167-8109-362A53957737};Felskopf;TLM_NAME_PKT;2205;k_W;{7C45F52F-E6FE-4DFE-8E0B-276C101B9B42};Pilinghel;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2799764;1129771;2205 +{64E0E540-51D7-4D20-8EB3-EF27D0915FBB};Alpiner Gipfel;TLM_NAME_PKT;3453;k_W;{1743DBE9-BEBC-4F9E-8946-4036A9F4F284};Piz Varuna;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2796577;1136626;3453 +{8915F4F6-D3ED-466A-9881-186F38085A92};Haupthuegel;TLM_NAME_PKT;2036;k_W;{61929CE7-2A69-45D3-9402-B128FA28A5F1};Muotta da Güvè;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2777793;1142981;2036 +{D5338DDC-2E84-47E8-ABED-1335E491D243};Pass;TLM_NAME_PKT;2235;k_W;{DBB6D00A-20D5-4164-BB14-98BC36DD4F15};Berninapass;fremd;Hochdeutsch inkl. Lokalsprachen;Exonym;{DD5280C5-7129-4849-A108-27589F060D5E};2797687;1143663;2235 +{D5338DDC-2E84-47E8-ABED-1335E491D243};Pass;TLM_NAME_PKT;2235;k_W;{6B6896CD-0E33-4AD1-982B-BE514910870D};Col de la Bernina;fremd;Franzoesisch inkl. Lokalsprachen;Exonym;{DD5280C5-7129-4849-A108-27589F060D5E};2797687;1143663;2235 +{85D918C3-AB93-41AE-84FB-B0F422D126A7};Haupthuegel;TLM_NAME_PKT;1904;k_W;{4BE1BFEE-B5F9-4E93-9928-EA75442CBE3E};Crest'Alta;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2781904;1148846;1904 +{36CACCD7-3EB5-4435-8578-127B6D900F5A};Felskopf;TLM_NAME_PKT;2998;k_W;{596BC971-A4EA-49DD-A51D-46645BB42E0F};Paun da Zücher;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2793205;1149306;2998 +{C260B7C5-D92F-4BD9-A76D-B33174B3BAF8};Haupthuegel;TLM_NAME_PKT;1923;k_W;{A3C98D71-2118-4243-BD9F-8F36A25474F2};Muot da las Funtaunas;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2784161;1150506;1923 +{3E95B505-B2D9-4E4C-A007-527AC0878D43};Huegel;TLM_NAME_PKT;510;k_W;{0F6520C0-BF74-4D97-81FA-5CB0D682A56A};Tierget;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2748349;1214473;510 +{D6B869BB-676B-4954-8A24-DF4258A38600};Huegel;TLM_NAME_PKT;531;k_W;{716E0BD0-6742-4061-B08D-E7CCD44ADFD0};Chrääspel;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2702464;1272611;531 +{DFA8B81B-5DB3-4BD0-9456-7DE49409D0CA};Huegel;TLM_NAME_PKT;443;k_W;{5BE4DB85-C82C-46D6-A624-DDBE8FE08402};Schalmebuck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2710698;1272858;443 +{C9FFC078-0B3A-4D8F-AD62-C67D4886F23D};Felskopf;TLM_NAME_PKT;2677;k_W;{9E571F8C-6350-4C16-84E8-447EED5C8F77};Dent Blanch;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2797564;1132388;2677 +{F2A07836-49C5-4E48-9DFA-72FA75E0B005};Felskopf;TLM_NAME_PKT;3265;k_W;{2AEECE6D-FB15-4A47-A5F6-EDA2222FF205};Sass dal Pos;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2790941;1140490;3265 +{CA8A243B-8350-4766-B5AF-4B8794C6103C};Pass;TLM_NAME_PKT;2313;k_W;{76BFEE36-60E1-4C71-BCE3-F415FC0CF9E4};Fuorcla da Livign;fremd;Rumantsch Grischun inkl. Lokalsprachen;Exonym;{71EA26C5-10F2-4B2A-82BF-33566A96C56E};2801118;1146643;2313 +{A2D7FA5C-7DD1-4395-A910-57DDDE48071A};Strassenpass;TLM_NAME_PKT;1611;k_W;{ADCBA319-CE78-4EB8-9E19-A634911FF591};Glaubenbielen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2649970;1185548;1611 +{A2D7FA5C-7DD1-4395-A910-57DDDE48071A};Strassenpass;TLM_NAME_PKT;1611;k_W;{ADCBA319-CE78-4EB8-9E19-A634911FF591};Glaubenbielen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2649970;1185548;1611 +{6D978491-8D44-419E-81D1-72215C7F4BE3};Strassenpass;TLM_NAME_PKT;1543;k_W;{5272CEC8-2BE5-4BDF-8E1F-7C75DC97F0DE};Glaubenberg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2650988;1193678;1543 +{67078BF2-ED3A-47E1-AD98-6EB9653A84DA};Strassenpass;TLM_NAME_PKT;1168;k_W;{16870E50-2197-4ACD-A880-A1C11804BE74};Schallenberg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2627344;1186175;1168 +{C952AE5C-E3D7-4474-B4E2-78EDED008809};Strassenpass;TLM_NAME_PKT;960;k_W;{31B9ED60-8DF1-4147-A603-031ED2B1F148};Rengg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2649616;1206047;960 +{3D89BF98-24B6-49DB-9553-E5AF95477567};Flurname swisstopo;TLM_FLURNAME;;k_W;{773E2C5B-EC30-469F-A8A8-D80B4D295294};Hinderi Schwändi;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2692524;1283428;437 +{3D89BF98-24B6-49DB-9553-E5AF95477567};Flurname swisstopo;TLM_FLURNAME;;k_W;{773E2C5B-EC30-469F-A8A8-D80B4D295294};Hinderi Schwändi;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2692524;1283428;437 +{9510ECB4-3878-4B8B-83DD-790B328E35E8};Flurname swisstopo;TLM_FLURNAME;;k_W;{A5566970-6CF6-4E2F-B73E-1FF3AD728D13};Stabäni;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2692162;1284062;445 +{9EA5AADD-99F3-4C57-A2D4-69A50C28D3F5};Flurname swisstopo;TLM_FLURNAME;;k_W;{D772F351-AFF1-449B-99B0-C920F29C3D40};Höhgass;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2691877;1283883;458 +{41F43020-7E75-4382-8D37-47B08952F891};Flurname swisstopo;TLM_FLURNAME;;k_W;{5F6ADA0D-C5D1-4BB2-8F2A-840C46780542};Fels;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2692056;1283242;443 +{CD1CE041-D4FD-4357-B739-C40B1FB9AD9E};Lokalname swisstopo;TLM_FLURNAME;;k_W;{E52DD096-3608-401E-9297-4E88B19BD49B};Sass dal Gal;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2808949;1124618;1175 +{CD1CE041-D4FD-4357-B739-C40B1FB9AD9E};Lokalname swisstopo;TLM_FLURNAME;;k_W;{E52DD096-3608-401E-9297-4E88B19BD49B};Sass dal Gal;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2808949;1124618;1175 +{0F06D474-0FCF-4877-96BC-4423E9174827};Lokalname swisstopo;TLM_FLURNAME;;k_W;{06A9E622-066D-4AE7-9E55-FF11C87F060D};Mot di Böv;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2804500;1135895;2325 +{874E3D4D-62E5-49DC-9408-3701B44DDC0C};Lokalname swisstopo;TLM_FLURNAME;;k_W;{8C18045C-5E78-412E-97CE-BCBA55C68167};Üerts Suot;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2829965;1202684;2080 +{03C74023-CA9A-463B-938F-C1336D62D34E};Lokalname swisstopo;TLM_FLURNAME;;k_W;{2BC4D177-D58E-4BBA-9319-C091C35EE22E};God Sauaidas;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;2803354;1182317;1438 +{67E5F2EB-61FC-469B-912E-77A9F3472529};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{39387AAF-BF27-447F-90AA-DB3758B0D5CF};Rheineck Schifflände;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2762279;1259695;398 +{67E5F2EB-61FC-469B-912E-77A9F3472529};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{39387AAF-BF27-447F-90AA-DB3758B0D5CF};Rheineck Schifflände;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2762279;1259695;398 +{392AEFF0-0206-447A-8D43-E1CF8D46C788};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{1D4E050B-C8CB-48FE-B0AF-912668073EBD};Altenrhein Schifflände;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2759923;1262916;397 +{DB238C97-32F0-4C25-8520-911F48C0028B};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{C69B235E-70A0-42E4-9797-85AF9102E402};Arbon (See);offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2750772;1264355;397 +{0699222F-D21A-4D0D-855D-AE8FF03DA137};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{75ED0523-7C27-4C59-BD46-A0F35F7365DB};Horn (See);offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2752539;1262659;397 +{9DE69E63-FADC-4564-A130-2ABCAEC72188};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{10A76A51-80C6-4FE9-88EA-F47222C2D416};Sils/Segl Maria Barchiröls (See);offiziell;Mehrsprachig;Namenspaar;{9D28A395-D50B-422D-BA3F-F0190E80BD10};2777979;1144038;1798 +{9DE69E63-FADC-4564-A130-2ABCAEC72188};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{10A76A51-80C6-4FE9-88EA-F47222C2D416};Sils/Segl Maria Barchiröls (See);offiziell;Mehrsprachig;Namenspaar;{9D28A395-D50B-422D-BA3F-F0190E80BD10};2777979;1144038;1798 +{D6177E9E-06B8-4B26-BC66-703BD95C0242};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{89C73094-E26A-4421-ADA2-1CD18DAB6960};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694932;1289090;437 +{D6177E9E-06B8-4B26-BC66-703BD95C0242};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{89C73094-E26A-4421-ADA2-1CD18DAB6960};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694932;1289090;437 +{6A20671E-BB14-4C28-A7EF-57703BF9B7E9};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{FADE2C25-D01D-420E-985C-720E0044A096};Ramsen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2703768;1285024;419 +{3579DB83-C62E-486B-8E24-ABC07E9B8A22};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{4E0B9E02-4FA3-47E4-8E2C-D5F660C56D09};Hemishofen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2704726;1281756;420 +{B52CCC41-4BAB-4747-9067-F08B1F42CD74};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{DF45C2FD-243B-4F17-890D-B59957060E51};Weberei Matzingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2711701;1265116;440 +{61427F4B-4166-494D-BAC7-68F0DEF07F8E};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{7CAD56D2-824A-4EC6-8ACE-B78E065AA26E};Biel/Bienne (Schiff/bateau);offiziell;Mehrsprachig;Namenspaar;{F8773A73-7FFB-44B1-94F1-A7FEA4878249};2584577;1220007;431 +{C3C7A9A4-0B1B-48AB-A330-EBA06D19532E};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{F80E6EE8-C449-4BEE-AE63-A389004E3820};Monte Lema;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2708071;1099768;1565 +{C3C7A9A4-0B1B-48AB-A330-EBA06D19532E};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{F80E6EE8-C449-4BEE-AE63-A389004E3820};Monte Lema;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2708071;1099768;1565 +{57F598A7-AF15-496B-9894-17F71EF362E9};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{421DF69A-FD8E-434D-9CC2-7C836238B92C};Miglieglia (Funivia);offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2709764;1097914;711 +{ACAB8E56-102F-44AC-B15F-D5470034B947};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{039D2061-3DBD-4A4C-8922-54A03A3E4E9C};Alpe Foppa;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2712475;1108303;1531 +{026BC3C1-E40C-4DAE-97EA-0C84D6AE1F84};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{442B19F0-E247-4CC5-B48C-0F17788654FB};Rivera;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2714456;1109468;477 +{BC6EA238-3CB0-4855-B515-8420DDC0B2DE};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{50F36255-EDD2-4F3D-B892-31768B53B027};Domat/Ems;offiziell;Mehrsprachig;Namenspaar;{3F2F0344-4F6F-483B-A0C4-B35AFFE3A4E4};2753671;1188861;581 +{B86C84C5-DC34-4AF7-9A43-6DC617D7B602};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{F939CA18-917B-4547-8E5D-D9BCB9B5F70C};Feldis/Veulden;offiziell;Mehrsprachig;Namenspaar;{2EA6E8EF-566E-4D3B-A9E7-E68B9EFC7345};2752000;1184590;1467 +{81B82658-1492-4BF4-B1E9-77DE77E7B6FD};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{82D726B7-2691-4DC0-9B25-C81BFC8A664D};Pratteln, Bahnhof Süd;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2619075;1263538;290 +{81B82658-1492-4BF4-B1E9-77DE77E7B6FD};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{82D726B7-2691-4DC0-9B25-C81BFC8A664D};Pratteln, Bahnhof Süd;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2619075;1263538;290 +{F4B5CCC9-8A11-4754-A6DE-605EA546244C};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{C97ECF5A-B651-484A-9453-9D439506DE39};Dinhard, Gemeindehaus;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2700087;1268008;435 +{943F6DCD-3E84-4A7D-A9B3-632E54E52C62};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{CBBC47AD-06DE-4C96-924F-42DCFC08C6F7};Steckborn, Bahnhof;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2715839;1280472;403 +{5D924641-8B7B-4A9F-B1BD-8A3A6FB9BF9C};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{785696CA-663E-489D-BC78-E37ABF280644};Winterthur, Sulzer;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2696507;1261631;438 +{DF082598-AA49-42BC-8BC9-ADA3FB2C5968};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{E9D9A804-D52E-40D3-BA21-71AF523C55B9};Reiat;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2696044;1288548;433 +{DF082598-AA49-42BC-8BC9-ADA3FB2C5968};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{E9D9A804-D52E-40D3-BA21-71AF523C55B9};Reiat;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2696044;1288548;433 +{408546CB-9AA9-49B5-87B2-F25DDF20E694};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{085B3C06-6A24-4764-81FE-73DA7B06AA07};Ramsen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2703853;1285487;420 +{CBB218FE-22CE-404A-AB16-3D22D65C73DA};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{4C600AD5-24F6-4C33-B207-458144EA589A};Dörflingen-Gailingen-West;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2696687;1283517;440 +{F7947514-FBA1-4EFD-A9EB-47DC6175A7F8};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{E58AA7A3-E2F3-4E79-B862-F309CF6E9F48};Kreuzlingen-Autobahn;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2729311;1279896;399 +{1BA8B114-2766-434E-9C3B-F5775D6B401A};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{1A28FB3A-1291-446C-8CC3-07F1ED4623D4};Montlingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2762793;1244816;424 +{1BA8B114-2766-434E-9C3B-F5775D6B401A};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{1A28FB3A-1291-446C-8CC3-07F1ED4623D4};Montlingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2762793;1244816;424 +{E11C0B33-B3BC-4F0B-A079-EAF83B4AEE81};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{91ED14D3-9ABA-437A-AEAB-F23FB33E771F};Ponte Faloppia;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2721109;1077129;249 +{EF1CD90C-4ED9-44AC-A3CF-44C533CB3E39};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{91ED14D3-9ABA-437A-AEAB-F23FB33E771F};Ponte Faloppia;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2721111;1077125;249 +{2FE296C5-D611-4162-BFE0-7F4C1E4CFD47};Zollamt eingeschraenkt;TLM_STRASSENINFO;;k_W;{D844CEE0-4CE7-48EC-AE95-BE9E22F3AAE8};Pizzamiglio;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2724291;1078198;233 +{2FE296C5-D611-4162-BFE0-7F4C1E4CFD47};Zollamt eingeschraenkt;TLM_STRASSENINFO;;k_W;{D844CEE0-4CE7-48EC-AE95-BE9E22F3AAE8};Pizzamiglio;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;2724291;1078198;233 +{B0D9EE93-AA3D-47C0-A9AF-E90675F4CD44};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{D8CFC971-C123-4578-A28B-1E030672B86C};La Croix-de-Rozon;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;2499494;1111093;476 +{4053791A-6A11-4E41-92BA-627DE67A04AB};Verladestation;TLM_STRASSENINFO;;k_W;{6D070FB7-69C8-4853-ABFB-BC51D4667B8C};Klosters Selfranga;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2786463;1192331;1281 +{4053791A-6A11-4E41-92BA-627DE67A04AB};Verladestation;TLM_STRASSENINFO;;k_W;{6D070FB7-69C8-4853-ABFB-BC51D4667B8C};Klosters Selfranga;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2786463;1192331;1281 +{C5EFF06F-21ED-4EFD-BC3C-2A207C1B1DF8};Verladestation;TLM_STRASSENINFO;;k_W;{9C561B13-441B-4435-B18E-F5B7DC6F7211};Sagliains;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2802982;1182561;1432 +{3E65608D-5B8C-4700-84FA-FC5E384D0D68};Verladestation;TLM_STRASSENINFO;;k_W;{D0AE7485-17A7-4173-BCB1-C71BFC731136};Kandersteg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2617792;1149215;1175 +{9A0DE088-5772-43BC-8CA9-12AA35E36C63};Verladestation;TLM_STRASSENINFO;;k_W;{9ADFEA48-F34A-48D7-8B37-D92D70BD3206};Brig;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2642679;1130098;677 +{2FF7E3F1-6BAA-4981-A172-A459E01982E8};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{0642FC92-2FC6-4A4D-AE2B-9115F0D0BA2B};Kleinandelfingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694037;1273365;390 +{2FF7E3F1-6BAA-4981-A172-A459E01982E8};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{0642FC92-2FC6-4A4D-AE2B-9115F0D0BA2B};Kleinandelfingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694037;1273365;390 +{AA4D0B0F-CA43-4B91-BFC3-32B9F3E2FEDB};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{0642FC92-2FC6-4A4D-AE2B-9115F0D0BA2B};Kleinandelfingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694225;1272961;387 +{358C0BD3-3DF7-4A49-B446-F156A2D3D865};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{D723A8F6-7E97-41D0-B042-0935835A017A};Winterthur-Töss;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2695211;1260579;436 +{C4D61C3F-4A22-4474-9FD8-9532845AFFF4};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{4EF0E5A1-1AE2-4793-8073-3CA1AF521FCE};Wülflingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694253;1263269;413 +{674B9162-0FCF-4972-B9A3-FDB9AFE55E89};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694853;1264108;438 +{674B9162-0FCF-4972-B9A3-FDB9AFE55E89};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694853;1264108;438 +{ACF238B8-5177-4239-ACD1-B402F60F5920};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2695091;1264580;432 +{1D10A30D-3B35-43AA-9F9D-6DD102D16B58};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2695410;1264572;443 +{1BEDD5D7-32B9-4F24-A4AC-5AE449163449};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{786B3A4C-E819-4338-AB88-F3D93A034530};Grüneck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2717144;1272161;413 +{73343AB3-29EF-46F0-BB66-2CF5EE0263AB};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{5DD32915-F10E-4C2B-9FBE-58D54EC4E6C5};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694944;1288748;438 +{73343AB3-29EF-46F0-BB66-2CF5EE0263AB};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{5DD32915-F10E-4C2B-9FBE-58D54EC4E6C5};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2694944;1288748;438 +{A0C8877F-8D02-4D77-BE72-B5D8AE5CC798};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{EB2EDDE2-9E97-4C44-BBBA-9F4BCD61F259};Arbon-West;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2747600;1265335;428 +{53E5C2C6-8F17-467C-A9EA-9BCFA530C61D};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{16F0BFBC-839D-41C6-9CE8-BBF2424F97CA};Kestenholz;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2621267;1237229;458 +{BBDAF25E-95DF-499C-A55B-7C120897D1E0};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{F07E27DD-42B7-49A4-BE97-0F71E128123A};Nufenen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;2738594;1155727;1557 diff --git a/homebytwo/importers/tests/data/swissnames3d_LV95_test.csv b/homebytwo/importers/tests/data/swissnames3d_LV95_test.csv new file mode 100644 index 00000000..956604b3 --- /dev/null +++ b/homebytwo/importers/tests/data/swissnames3d_LV95_test.csv @@ -0,0 +1,203 @@ +UUID;OBJEKTART;OBJEKTKLASSE_TLM;HOEHE;GEBAEUDENUTZUNG;NAME_UUID;NAME;STATUS;SPRACHCODE;NAMEN_TYP;NAMENGRUPPE_UUID;E;N;Z +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;691240;293512;528 +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;691240;293512;528 +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;691240;293512;528 +{9149F314-862B-4DBC-B291-05A083658D69};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{41C949A2-9F7B-41EE-93FD-631B76F2176D};Altdorf 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;691240;293512;528 +{AC36C53E-62E0-491E-8E67-99750B134EF7};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4D418984-3822-4CFD-86B8-FE8716886F26};Niederönz 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;618277;225810;476 +{AC36C53E-62E0-491E-8E67-99750B134EF7};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4D418984-3822-4CFD-86B8-FE8716886F26};Niederönz 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;618277;225810;476 +{CB96BFF1-D203-45FC-A0D3-6E6D27E428F6};Kapelle;TLM_GEBAEUDE;;k_W;{BDAF2910-7454-4A99-AA1C-83EA8FA5E35E};Chapelle des saints coeur de Jésus et Marie;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;583416;113893;481 +{CB96BFF1-D203-45FC-A0D3-6E6D27E428F6};Kapelle;TLM_GEBAEUDE;;k_W;{BDAF2910-7454-4A99-AA1C-83EA8FA5E35E};Chapelle des saints coeur de Jésus et Marie;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;583416;113893;481 +{CB96BFF1-D203-45FC-A0D3-6E6D27E428F6};Kapelle;TLM_GEBAEUDE;;k_W;{BDAF2910-7454-4A99-AA1C-83EA8FA5E35E};Chapelle des saints coeur de Jésus et Marie;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;583416;113893;481 +{7A7ABA46-45B5-499D-9DE4-FA0DA81DF514};Gebaeude;TLM_GEBAEUDE;;k_W;{99B55431-F53E-496D-AA41-0A2CC71FF9B5};Refuge de la Christine;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;507862;166680;1294 +{7A7ABA46-45B5-499D-9DE4-FA0DA81DF514};Gebaeude;TLM_GEBAEUDE;;k_W;{99B55431-F53E-496D-AA41-0A2CC71FF9B5};Refuge de la Christine;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;507862;166680;1294 +{FD1BAD47-CC16-41D3-9B21-56EDBF459B1C};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4AA352B7-6DA2-435D-8647-C4D29D2D8AB5};Alvaneu Crappa Naira 300m;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;767718;171466;1081 +{FD1BAD47-CC16-41D3-9B21-56EDBF459B1C};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{4AA352B7-6DA2-435D-8647-C4D29D2D8AB5};Alvaneu Crappa Naira 300m;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;767718;171466;1081 +{EC8D3F6C-622A-4225-9839-B5B5F8C90E72};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{F0A2B29C-3201-4C63-8FF3-87C2BDF4544B};Zumikon Breitwis 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;689793;244192;651 +{366B493B-FEB5-465D-96FD-AA9424325F05};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{E460F289-ED83-43A3-B366-1DE2AC5D9F83};Sant Anna;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;730443;121245;354 +{366B493B-FEB5-465D-96FD-AA9424325F05};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{E460F289-ED83-43A3-B366-1DE2AC5D9F83};Sant Anna;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;730443;121245;354 +{95466FBA-E618-47EE-9AEB-26C61B25B27A};Turm;TLM_GEBAEUDE;;Aussichtsturm;{062462F2-AEB7-469B-B4FE-2D86601FFEDC};Hagenturm;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;684622;292109;956 +{95466FBA-E618-47EE-9AEB-26C61B25B27A};Turm;TLM_GEBAEUDE;;Aussichtsturm;{062462F2-AEB7-469B-B4FE-2D86601FFEDC};Hagenturm;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;684622;292109;956 +{9CD31DED-6718-4122-AD20-F86C99503ECC};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{A5787309-B848-442C-8CCA-5A2554695E5B};Meinisberg 300m;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;592243;223172;512 +{3A56F261-EE79-4A79-BEC4-CFEF918F69C6};Offenes Gebaeude;TLM_GEBAEUDE;;Schiessstand;{172FA268-AF59-4F72-A998-CF410885FE3F};Finhaut 300/50/25m;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;564610;104078;1362 +{073BACDD-3B70-435A-BAA0-F9B10FE7F83E};Offenes Gebaeude;TLM_GEBAEUDE;;Gasthof abgelegen;{21120BFD-69C1-4EEB-BA4F-08E9FA853D44};Berggasthaus Äscher Wildkirchli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;749460;238829;1473 +{42001FE7-F194-4868-8B51-2BADEE442CC8};Turm;TLM_GEBAEUDE;;Aussichtsturm;{85059074-A0F4-4B1E-9545-568202D152F9};Beringer Randenturm;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;685739;284458;677 +{6A5A16A9-F984-452F-9484-3015434DD367};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{AAB81B3A-1378-4EEB-8BD0-829882D9E52F};Christuskirche;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;745678;254637;740 +{10C9A6F9-69AD-43F8-BADA-3DA8EDE4A7F7};Kapelle;TLM_GEBAEUDE;;k_W;{4398F77F-F637-42F7-A8CA-E4227E619A22};Flüekapelle;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;618297;139060;2074 +{9888FDCD-9B7C-45C8-B23B-778A93D42D2E};Turm;TLM_GEBAEUDE;;Aussichtsturm;{298603D0-8868-4CAA-ABF2-2DE5B93A8CB0};Aahorn;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;707209;228864;417 +{88D68E1D-720D-40FF-8ED0-C23CDD6ECB1D};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{8F26B2A0-1D8F-4F96-8F74-09D59D7C7860};Scatiàn;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;725018;105965;1061 +{3EE94383-8B3C-490C-8B5E-3FF711885A35};Sakrales Gebaeude;TLM_GEBAEUDE;;k_W;{DA251A01-3EC0-4BD2-B6CC-BB24AD66D418};San Andrea;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;718688;103147;583 +{3F3D4FDB-1D4E-4C79-9067-2BF96D5D469B};Kapelle;TLM_GEBAEUDE;;k_W;{82E55AAF-1326-4F1F-BF60-E2F60DFFD0B2};S. Vitale;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;719676;91315;689 +{4EE2515B-7521-4A08-A757-557DE7300698};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{C1F565EF-6FEA-44A3-B608-E681E01EEDE5};Suhr Obertel 300/50/25m;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{10970284-4B09-4F63-B3DA-46386D825858};647484;245595;422 +{4EE2515B-7521-4A08-A757-557DE7300698};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{C1F565EF-6FEA-44A3-B608-E681E01EEDE5};Suhr Obertel 300/50/25m;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{10970284-4B09-4F63-B3DA-46386D825858};647484;245595;422 +{4EE2515B-7521-4A08-A757-557DE7300698};Gebaeude;TLM_GEBAEUDE;;Schiessstand;{C98723D7-545B-48C5-9C5C-57BAC3252FDE};Suhr Obertel 100/50m;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{10970284-4B09-4F63-B3DA-46386D825858};647484;245595;422 +{36CF9CF6-2400-4BBE-8E91-DFC34B497DE9};Gebaeude;TLM_GEBAEUDE;;Gasthof abgelegen;{6E9C8FBA-01EA-4537-B08E-B1BB67D8BC95};Moulin Neuf;offiziell;Franzoesisch inkl. Lokalsprachen;Endonym;{E25BDACA-9341-4C71-91D4-14CF323102DC};591585;254333;512 +{36CF9CF6-2400-4BBE-8E91-DFC34B497DE9};Gebaeude;TLM_GEBAEUDE;;Gasthof abgelegen;{09C11954-ADBC-493A-8267-CFB9A760E813};Restaurant Neumühle;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{E25BDACA-9341-4C71-91D4-14CF323102DC};591585;254333;512 +{8D4C0D88-C10E-45A2-9394-9BDCF3C9100F};Turm;TLM_GEBAEUDE;;Aussichtsturm;{C27CCF97-8075-4F86-BF24-CD78A5C4D1C8};Liestal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;623720;259740;637 +{93400849-4FD0-4E86-9512-EC990E6263A5};Kapelle;TLM_GEBAEUDE;;k_W;{60D34CBE-76CD-471F-BE60-EA12FF813330};Église Mennonite La Chaux-d'Abel;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;562207;224493;1054 +{48857291-9DF3-4DED-899D-7EC9FFC15CE6};Gebaeude;TLM_GEBAEUDE;;k_W;{DB2732A6-19E9-426E-B515-4C50EE8B01CF};Tenigerbad;ueblich;Hochdeutsch inkl. Lokalsprachen;Endonym;{02860C6A-0FB9-4D9C-AA64-11BD5D98879A};716204;172058;1310 +{48857291-9DF3-4DED-899D-7EC9FFC15CE6};Gebaeude;TLM_GEBAEUDE;;k_W;{DB2732A6-19E9-426E-B515-4C50EE8B01CF};Tenigerbad;ueblich;Hochdeutsch inkl. Lokalsprachen;Endonym;{02860C6A-0FB9-4D9C-AA64-11BD5D98879A};716204;172058;1310 +{8B9D6E93-ABE0-4CC4-A851-A55523733C87};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{D59E3FFB-06AF-4497-8043-493B3DFEF30F};Chrüz;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;751873;240672;927 +{8B9D6E93-ABE0-4CC4-A851-A55523733C87};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{D59E3FFB-06AF-4497-8043-493B3DFEF30F};Chrüz;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;751873;240672;927 +{9021A643-7830-462B-9705-D77762BDDFD5};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{4A560D7E-FC46-40DF-A61F-E2FF514BEDDB};Gässlistein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;725223;210115;500 +{9021A643-7830-462B-9705-D77762BDDFD5};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{4A560D7E-FC46-40DF-A61F-E2FF514BEDDB};Gässlistein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;725223;210115;500 +{CC79FC5E-E558-477C-B411-CD31CB3DE670};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{76D16CBB-9C22-4405-A6CC-4DAF34F4F9F5};Schalenstein Oberprod;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;751493;213660;745 +{CAB14870-6339-49B2-B90A-4E16DE2E4B72};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{94C2DB35-9064-4DEE-831C-E8A379130CC4};Schlangenstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;783513;203919;1739 +{72D1265F-F86C-4067-8583-C533B3CCD826};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{B2A997F8-1B0E-4F6B-BBD6-8EF9FD4FCCE5};Tüfelstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;777957;200821;1390 +{F6B650FA-B134-4FC3-92C1-250596F1DA16};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{711EF889-16F5-488E-8195-728743EA40C2};Güggelstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;777339;200239;1325 +{9B6515E1-E442-4620-9668-CDAEFF0A039C};Felsblock;TLM_MORPH_KLEINFORM_PKT;;k_W;{D7389FF5-CC17-4249-AE12-C9BB3DBB83F7};Schafstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;766485;183830;1926 +{F6F27A47-DD19-4964-8BC1-7DE1DAF34999};Erratischer Block;TLM_MORPH_KLEINFORM_PKT;;k_W;{018D09D0-7224-4306-BAE1-CD1F277E9D5D};Geisterstein;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;766254;182598;2200 +{82224945-106D-4143-A893-B984F86B0FBB};Quelle;TLM_EINZELOBJEKT;;k_W;{EF3767FB-8C3A-4764-B4A5-203276DE708C};Funtana Dadora;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;831618;201245;1268 +{82224945-106D-4143-A893-B984F86B0FBB};Quelle;TLM_EINZELOBJEKT;;k_W;{EF3767FB-8C3A-4764-B4A5-203276DE708C};Funtana Dadora;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;831618;201245;1268 +{AE45BAF7-6B17-4144-B219-1C40A0B46736};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{11EF9ABB-4DF3-4C4B-B96E-254A14DCDB1C};Kristallhöhle;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;758413;243441;630 +{AE45BAF7-6B17-4144-B219-1C40A0B46736};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{11EF9ABB-4DF3-4C4B-B96E-254A14DCDB1C};Kristallhöhle;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;758413;243441;630 +{FFF62977-814E-4A81-9FED-E7619E78CA3B};Quelle;TLM_EINZELOBJEKT;;k_W;{12547F93-EEFE-4230-9611-610AAB88B912};Sieben Brünnen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;765264;210422;1909 +{2C9B438C-1BBA-4B11-A217-12F282E9FF3E};Wasserfall;TLM_EINZELOBJEKT;;k_W;{CD6BF504-B8C0-468C-8660-7D4120A02E66};Hochfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;761707;210010;1138 +{2C9B438C-1BBA-4B11-A217-12F282E9FF3E};Wasserfall;TLM_EINZELOBJEKT;;k_W;{CD6BF504-B8C0-468C-8660-7D4120A02E66};Hochfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;761707;210010;1138 +{BB803E15-6F30-4E61-A965-CEE9C7CFAF3C};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{DED14C0C-2970-466C-A878-965E54EE868A};Weberlisch Höli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;785372;206843;2011 +{07486640-DC7B-473C-B33A-FBAF708852CA};Quelle;TLM_EINZELOBJEKT;;k_W;{73F0363C-7485-49AF-BE15-6CD5BA039218};Chaltwasser;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;782793;206153;1557 +{B4F8B51C-4370-41AD-9700-08C414B98847};Denkmal;TLM_EINZELOBJEKT;;k_W;{A0252E5B-9C8B-46C8-8F02-8EEECFA3FF45};Fontana-Denkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;759561;190853;598 +{B4F8B51C-4370-41AD-9700-08C414B98847};Denkmal;TLM_EINZELOBJEKT;;k_W;{A0252E5B-9C8B-46C8-8F02-8EEECFA3FF45};Fontana-Denkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;759561;190853;598 +{D959755F-3010-4AA5-AD16-DE485CA286F6};Denkmal;TLM_EINZELOBJEKT;;k_W;{A334A24C-1DA8-4C3C-8E4D-7EE2AF051C0B};Vazerol-Denkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;759737;190913;600 +{8ACC7598-9497-4207-985B-203A26AF1AC9};Quelle;TLM_EINZELOBJEKT;;k_W;{E35240F4-A4E5-452B-89D1-A89AEE774197};Guotiger Brunnen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;768549;192280;2174 +{C28508FD-B0D5-4242-89CC-BC95BD8E6566};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{F0D82B19-5490-493C-8374-A508387E6226};Abgrundhöli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;784214;210593;2288 +{A5039C9A-E448-494A-B7A4-8565C598EA8A};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{1210FBE5-CB9B-4FBE-B8B3-1DF6F20CD4F1};Chilchhöli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;784105;210438;2283 +{9BB0CA7B-6984-4F0B-A5AE-D13AB9CD1B08};Denkmal;TLM_EINZELOBJEKT;;k_W;{AC04548E-D2F0-46EF-9BB5-09D0AB0E222B};Denkmal Rohan-Schanze;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;761045;204849;524 +{84E5BF55-E491-433B-9FE9-DBF47D78D924};Denkmal;TLM_EINZELOBJEKT;;k_W;{0D2BAFBB-D3DD-47EE-BE25-D95F706E99BC};Soldatendenkmal;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;709994;268578;413 +{C372CECE-8AF7-41F0-8F65-615E60CE57F3};Grotte, Hoehle;TLM_EINZELOBJEKT;;k_W;{EE772633-FDAD-485A-993C-328267533628};St. Kolumbanshöhle;ueblich;Hochdeutsch inkl. Lokalsprachen;Endonym;{FFA3A63F-8AAB-4D80-B7A5-3078ABBD6591};734857;251486;618 +{DEE83F6A-5E74-4C59-B227-2B6812A5542D};Brunnen;TLM_EINZELOBJEKT;;k_W;{9AA8DD8D-E8A8-4281-8FEE-5D68A36BD054};Stiegenbrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;684086;292238;810 +{DEE83F6A-5E74-4C59-B227-2B6812A5542D};Brunnen;TLM_EINZELOBJEKT;;k_W;{9AA8DD8D-E8A8-4281-8FEE-5D68A36BD054};Stiegenbrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;684086;292238;810 +{2C125060-1F71-4391-AC04-904FAC0597BE};Brunnen;TLM_EINZELOBJEKT;;k_W;{45820AF9-4A7C-47DD-BDA3-18BF7078D6F4};Hirschebrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;705739;284325;644 +{800D4334-EC7A-4EBA-A474-307D3DDC9D51};Wasserfall;TLM_EINZELOBJEKT;;k_W;{E2AC33FE-C1E8-4725-B275-CC77CD79E79E};Rheinfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;688389;281451;376 +{5306F1AA-C1F1-43C6-91F0-61B0B3A5F859};Wasserfall;TLM_EINZELOBJEKT;;k_W;{D1120A4F-93B9-4E0E-A6EA-BAD1EDFC75EB};Gsponbachfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;733088;214943;1369 +{7A0787E7-6F5B-412A-ADFB-E86BE2D0995F};Wasserfall;TLM_EINZELOBJEKT;;k_W;{F5B74D27-E675-466E-80ED-A736D207E7E5};Murgbachfall;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;731092;211256;1788 +{7B23A6ED-A47B-422A-8F72-AC0D0A9F7CA3};Bildstock;TLM_EINZELOBJEKT;;k_W;{4B9C4AD4-C236-4A91-9453-C804662AA928};Helenachappali;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;718227;241225;1172 +{7B23A6ED-A47B-422A-8F72-AC0D0A9F7CA3};Bildstock;TLM_EINZELOBJEKT;;k_W;{4B9C4AD4-C236-4A91-9453-C804662AA928};Helenachappali;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;718227;241225;1172 +{D219D90D-E4A9-48F5-ACAC-13039EB68119};Bildstock;TLM_EINZELOBJEKT;;k_W;{0CDD1DE8-1BD7-4AFA-AD8F-B1ABD14E0B54};St. Meinrad;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;684909;223780;697 +{9B137072-567B-4D92-8A39-130B264F558B};Brunnen;TLM_EINZELOBJEKT;;k_W;{2FF714F3-BCE7-436D-AF92-4A899FEF7370};Römerbrünneli;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;699395;245309;547 +{8D3A3155-B933-4BE5-BC19-BB2D794DBB2E};Bildstock;TLM_EINZELOBJEKT;;k_W;{0CDD1DE8-1BD7-4AFA-AD8F-B1ABD14E0B54};St. Meinrad;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;699472;220072;975 +{1408D351-B7C9-4342-8D78-C8C4B56A224A};Bildstock;TLM_EINZELOBJEKT;;k_W;{39D3BC31-3893-4CD9-B046-59F4F1A9CB09};Herrgott;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;703271;202819;716 +{7462D1C3-80DB-4D40-885D-4C531AB4AFC6};Brunnen;TLM_EINZELOBJEKT;;k_W;{B1F7BDE4-4621-4165-A5FC-11690F7A6D8E};Meinradsbrunnen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;701369;226221;831 +{2068116E-1C4E-42B1-864C-1F892AB058B2};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{631B0BB3-436A-431C-9530-B33497EF19F4};Fünfländerblick;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;756518;258273;898 +{2068116E-1C4E-42B1-864C-1F892AB058B2};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{631B0BB3-436A-431C-9530-B33497EF19F4};Fünfländerblick;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;756518;258273;898 +{5AB97F0B-E4D9-4EB8-A24C-D35575F2606B};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{86E1B19D-0AAF-4F8C-BF4C-94F35835B9CF};Langwieser Aussicht;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;772377;186507;1776 +{C9BA3DA4-AE38-457B-88D8-FAE7024CFE60};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{E1C6BBB1-727F-443B-BB51-AF79AB1C6427};Bellavista;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;817521;185265;1502 +{A0D895F7-5EFD-485C-882F-E5CA9C99F82B};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{5DB7CBBB-4F53-44BA-9332-26045D534FB6};Dreiländerpunkt;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{D39DA0C7-5CD9-4815-B567-AC34FAEA28FD};831094;193772;2180 +{A0D895F7-5EFD-485C-882F-E5CA9C99F82B};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{5DB7CBBB-4F53-44BA-9332-26045D534FB6};Dreiländerpunkt;offiziell;Hochdeutsch inkl. Lokalsprachen;Endonym;{D39DA0C7-5CD9-4815-B567-AC34FAEA28FD};831094;193772;2180 +{A0D895F7-5EFD-485C-882F-E5CA9C99F82B};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{12248412-12BE-41FF-B7E4-8133DF8D611A};Cippo triconfinale;offiziell;Italienisch inkl. Lokalsprachen;Endonym;{D39DA0C7-5CD9-4815-B567-AC34FAEA28FD};831094;193772;2180 +{2F5D392D-F64A-438D-8A09-DC0A37F67641};Aussichtspunkt;TLM_EINZELOBJEKT;;k_W;{64E063FC-8296-4334-BBEB-978C36F7E2E7};Pavillon;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;573883;213348;655 +{D3864844-AC52-463D-8413-9E615F7DC466};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{D5E7B4CC-8AD5-456E-803D-418AC07DC278};593 Schwarze Staa;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;684600;295934;822 +{2A5DAC6A-6BE1-4FCF-B824-1A19A20BC7F4};Landesgrenzstein;TLM_EINZELOBJEKT;;k_W;{66A6E81A-EDBD-44E6-90DC-26CA4431FC5A};146;offiziell;k_W;Endonym;{CBA27777-7D1C-4D18-9EC1-35358F15E4B8};576767;261400;504 +{A892E90D-A04B-4F3A-95BE-C0EBF08CB92B};Pass;TLM_NAME_PKT;2438;k_W;{CFC655A5-F972-4DDB-BD74-02509855B8D2};Bocchetta dal Meden;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;802230;122513;2438 +{A892E90D-A04B-4F3A-95BE-C0EBF08CB92B};Pass;TLM_NAME_PKT;2438;k_W;{CFC655A5-F972-4DDB-BD74-02509855B8D2};Bocchetta dal Meden;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;802230;122513;2438 +{FAF96501-091B-4DB1-B9FB-3E618C876590};Pass;TLM_NAME_PKT;2221;k_W;{0637524C-120B-45F8-A945-14C825228050};Col d'Anzana;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;803662;122549;2221 +{DC0A5C77-515A-4A23-B26B-5A6B9584A928};Gipfel;TLM_NAME_PKT;2344;k_W;{28F58EE8-794B-41C1-BCCA-3BA291239C9D};Cima Buzzi;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;804013;122882;2344 +{DC0A5C77-515A-4A23-B26B-5A6B9584A928};Gipfel;TLM_NAME_PKT;2344;k_W;{28F58EE8-794B-41C1-BCCA-3BA291239C9D};Cima Buzzi;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;804013;122882;2344 +{700BB132-84ED-4276-95BB-4E4A2C797B85};Gipfel;TLM_NAME_PKT;2279;k_W;{D0F3237F-75C6-4F03-899F-37926A4BFEB3};Vetta Salarsa;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;805336;123084;2279 +{0384BE7D-D4C7-4FC0-AC4A-B9CDBB1D64AC};Pass;TLM_NAME_PKT;2234;k_W;{544459AB-D6B7-4EA0-AA0B-A1CB6E8FDEF0};Col da Salarsa;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;805094;123134;2234 +{A8EAC38F-8218-492B-BDBF-7E3A6D98FE95};Hauptgipfel;TLM_NAME_PKT;2900;k_W;{E0A49E5E-29D7-4934-9022-792873EBD755};Piz Combul;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;800959;123136;2900 +{A8EAC38F-8218-492B-BDBF-7E3A6D98FE95};Hauptgipfel;TLM_NAME_PKT;2900;k_W;{E0A49E5E-29D7-4934-9022-792873EBD755};Piz Combul;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;800959;123136;2900 +{3C6E13C3-9CF6-4FC0-A12A-4C0CC8E8DD55};Pass;TLM_NAME_PKT;2618;k_W;{0697C40C-7B7C-438C-9E8C-B4BD9332CF47};Bocchetta Malgina;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;801687;123849;2618 +{E2096FEA-F105-41E0-90E2-3FC0E76F827B};Hauptgipfel;TLM_NAME_PKT;2876;k_W;{6107F930-F3A7-4028-930E-E4BBD8ED45F3};Piz Malgina;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;801840;124665;2876 +{924839CE-57EE-4F4F-B048-F6ABA3E369A8};Hauptgipfel;TLM_NAME_PKT;2513;k_W;{77E1F74D-594C-475F-83B4-34A753DF5CD4};Corn dal Solcun;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;803934;126158;2513 +{6700F753-E20B-4173-997D-84B57A4820C0};Hauptgipfel;TLM_NAME_PKT;2779;k_W;{493DC462-79E9-44FC-BB8D-7E25BCAAC02B};Piz Sareggio;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;801793;126202;2779 +{78446BCF-F23E-4034-8B41-2A8673772296};Gipfel;TLM_NAME_PKT;2040;k_W;{E9C17EC7-D9ED-424A-807B-C2E0213FDE90};Giümelin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;805494;126290;2040 +{D806454A-ABB1-4E5C-A96D-6DDCA2ABCAAF};Hauptgipfel;TLM_NAME_PKT;2804;k_W;{351E1C8D-44CE-4D51-A90E-984748580C7C};Monte Saline;ueblich;Italienisch inkl. Lokalsprachen;Endonym;{A1F78FF0-6EED-4B37-9AFF-901100A615D4};800950;127606;2804 +{217A46EC-A156-4BB0-85CC-AB6ACC8066EE};Gipfel;TLM_NAME_PKT;2225;k_W;{A1A002AC-B5DC-44EB-97FA-64A652E97AA5};Motta da Scioschin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;802409;127655;2225 +{F1A53D42-197D-4CD9-9E14-EFAA56347306};Hauptgipfel;TLM_NAME_PKT;2857;k_W;{19928FD3-5FFC-48F3-8CE8-93B99FA7B712};Cima di Rosso;ueblich;Italienisch inkl. Lokalsprachen;Endonym;{39DDACF9-E090-4F83-982F-D7D1724989C3};805359;135680;2857 +{CC07F455-D0F4-493D-B25B-15FB458FCE3E};Alpiner Gipfel;TLM_NAME_PKT;3451;k_W;{AF285ED4-1AD6-4A2C-BDA3-B3783DBA8677};Piz Corvatsch;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;782787;142435;3451 +{CC07F455-D0F4-493D-B25B-15FB458FCE3E};Alpiner Gipfel;TLM_NAME_PKT;3451;k_W;{AF285ED4-1AD6-4A2C-BDA3-B3783DBA8677};Piz Corvatsch;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;782787;142435;3451 +{17760638-17D4-470D-82A1-83CF9096C8F6};Pass;TLM_NAME_PKT;2498;k_W;{BE7BD2F7-3DD5-4482-8D55-47416F3B7C49};Wormser Joch;fremd;Hochdeutsch inkl. Lokalsprachen;Exonym;{71E7A4E7-C51E-4902-9F3A-E306EEA048FD};829704;158741;2498 +{17760638-17D4-470D-82A1-83CF9096C8F6};Pass;TLM_NAME_PKT;2498;k_W;{BE7BD2F7-3DD5-4482-8D55-47416F3B7C49};Wormser Joch;fremd;Hochdeutsch inkl. Lokalsprachen;Exonym;{71E7A4E7-C51E-4902-9F3A-E306EEA048FD};829704;158741;2498 +{749A27D5-B263-479A-A7CC-658C4C46BC9D};Alpiner Gipfel;TLM_NAME_PKT;3025;k_W;{E51986D8-A571-4DDD-8133-230060BCCFDE};Piz Cotschen;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Endonym;{671F5E83-DE8F-4E6C-8CD0-8A69364BA15D};831493;158962;3025 +{0445F624-C20E-45FF-95D7-2A4D0E20B00A};Huegel;TLM_NAME_PKT;526;k_W;{A39DD568-618C-4265-A545-5F248862343D};Forrenbuck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;690030;267691;526 +{0445F624-C20E-45FF-95D7-2A4D0E20B00A};Huegel;TLM_NAME_PKT;526;k_W;{A39DD568-618C-4265-A545-5F248862343D};Forrenbuck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;690030;267691;526 +{5C306B4E-F5FB-43CB-996C-EF14978A10F7};Haupthuegel;TLM_NAME_PKT;1157;k_W;{76E2EA33-FED8-4114-B038-4DBE86C0A6B6};Mota dal Meschin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;805843;128277;1157 +{5C306B4E-F5FB-43CB-996C-EF14978A10F7};Haupthuegel;TLM_NAME_PKT;1157;k_W;{76E2EA33-FED8-4114-B038-4DBE86C0A6B6};Mota dal Meschin;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;805843;128277;1157 +{8BC7748B-B378-4F0B-AE1C-EBE967A2764D};Alpiner Gipfel;TLM_NAME_PKT;3102;k_W;{BE55A144-C4A7-40CB-BDFF-71CBE18E2082};Piz Cancian;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;797344;128984;3102 +{47FF2BFB-1F30-4167-8109-362A53957737};Felskopf;TLM_NAME_PKT;2205;k_W;{7C45F52F-E6FE-4DFE-8E0B-276C101B9B42};Pilinghel;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;799762;129771;2205 +{47FF2BFB-1F30-4167-8109-362A53957737};Felskopf;TLM_NAME_PKT;2205;k_W;{7C45F52F-E6FE-4DFE-8E0B-276C101B9B42};Pilinghel;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;799762;129771;2205 +{64E0E540-51D7-4D20-8EB3-EF27D0915FBB};Alpiner Gipfel;TLM_NAME_PKT;3453;k_W;{1743DBE9-BEBC-4F9E-8946-4036A9F4F284};Piz Varuna;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;796575;136626;3453 +{8915F4F6-D3ED-466A-9881-186F38085A92};Haupthuegel;TLM_NAME_PKT;2036;k_W;{61929CE7-2A69-45D3-9402-B128FA28A5F1};Muotta da Güvè;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;777792;142981;2036 +{D5338DDC-2E84-47E8-ABED-1335E491D243};Pass;TLM_NAME_PKT;2235;k_W;{DBB6D00A-20D5-4164-BB14-98BC36DD4F15};Berninapass;fremd;Hochdeutsch inkl. Lokalsprachen;Exonym;{DD5280C5-7129-4849-A108-27589F060D5E};797686;143663;2235 +{D5338DDC-2E84-47E8-ABED-1335E491D243};Pass;TLM_NAME_PKT;2235;k_W;{6B6896CD-0E33-4AD1-982B-BE514910870D};Col de la Bernina;fremd;Franzoesisch inkl. Lokalsprachen;Exonym;{DD5280C5-7129-4849-A108-27589F060D5E};797686;143663;2235 +{85D918C3-AB93-41AE-84FB-B0F422D126A7};Haupthuegel;TLM_NAME_PKT;1904;k_W;{4BE1BFEE-B5F9-4E93-9928-EA75442CBE3E};Crest'Alta;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;781903;148847;1904 +{36CACCD7-3EB5-4435-8578-127B6D900F5A};Felskopf;TLM_NAME_PKT;2998;k_W;{596BC971-A4EA-49DD-A51D-46645BB42E0F};Paun da Zücher;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;793204;149307;2998 +{C260B7C5-D92F-4BD9-A76D-B33174B3BAF8};Haupthuegel;TLM_NAME_PKT;1923;k_W;{A3C98D71-2118-4243-BD9F-8F36A25474F2};Muot da las Funtaunas;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;784160;150506;1923 +{3E95B505-B2D9-4E4C-A007-527AC0878D43};Huegel;TLM_NAME_PKT;510;k_W;{0F6520C0-BF74-4D97-81FA-5CB0D682A56A};Tierget;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;748349;214473;510 +{D6B869BB-676B-4954-8A24-DF4258A38600};Huegel;TLM_NAME_PKT;531;k_W;{716E0BD0-6742-4061-B08D-E7CCD44ADFD0};Chrääspel;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;702463;272611;531 +{DFA8B81B-5DB3-4BD0-9456-7DE49409D0CA};Huegel;TLM_NAME_PKT;443;k_W;{5BE4DB85-C82C-46D6-A624-DDBE8FE08402};Schalmebuck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;710697;272858;443 +{C9FFC078-0B3A-4D8F-AD62-C67D4886F23D};Felskopf;TLM_NAME_PKT;2677;k_W;{9E571F8C-6350-4C16-84E8-447EED5C8F77};Dent Blanch;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;797562;132389;2677 +{F2A07836-49C5-4E48-9DFA-72FA75E0B005};Felskopf;TLM_NAME_PKT;3265;k_W;{2AEECE6D-FB15-4A47-A5F6-EDA2222FF205};Sass dal Pos;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;790940;140491;3265 +{CA8A243B-8350-4766-B5AF-4B8794C6103C};Pass;TLM_NAME_PKT;2313;k_W;{76BFEE36-60E1-4C71-BCE3-F415FC0CF9E4};Fuorcla da Livign;fremd;Rumantsch Grischun inkl. Lokalsprachen;Exonym;{71EA26C5-10F2-4B2A-82BF-33566A96C56E};801117;146643;2313 +{A2D7FA5C-7DD1-4395-A910-57DDDE48071A};Strassenpass;TLM_NAME_PKT;1611;k_W;{ADCBA319-CE78-4EB8-9E19-A634911FF591};Glaubenbielen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;649969;185548;1611 +{A2D7FA5C-7DD1-4395-A910-57DDDE48071A};Strassenpass;TLM_NAME_PKT;1611;k_W;{ADCBA319-CE78-4EB8-9E19-A634911FF591};Glaubenbielen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;649969;185548;1611 +{6D978491-8D44-419E-81D1-72215C7F4BE3};Strassenpass;TLM_NAME_PKT;1543;k_W;{5272CEC8-2BE5-4BDF-8E1F-7C75DC97F0DE};Glaubenberg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;650987;193678;1543 +{67078BF2-ED3A-47E1-AD98-6EB9653A84DA};Strassenpass;TLM_NAME_PKT;1168;k_W;{16870E50-2197-4ACD-A880-A1C11804BE74};Schallenberg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;627344;186176;1168 +{C952AE5C-E3D7-4474-B4E2-78EDED008809};Strassenpass;TLM_NAME_PKT;960;k_W;{31B9ED60-8DF1-4147-A603-031ED2B1F148};Rengg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;649615;206047;960 +{3D89BF98-24B6-49DB-9553-E5AF95477567};Flurname swisstopo;TLM_FLURNAME;;k_W;{773E2C5B-EC30-469F-A8A8-D80B4D295294};Hinderi Schwändi;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;692523;283428;437 +{3D89BF98-24B6-49DB-9553-E5AF95477567};Flurname swisstopo;TLM_FLURNAME;;k_W;{773E2C5B-EC30-469F-A8A8-D80B4D295294};Hinderi Schwändi;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;692523;283428;437 +{9510ECB4-3878-4B8B-83DD-790B328E35E8};Flurname swisstopo;TLM_FLURNAME;;k_W;{A5566970-6CF6-4E2F-B73E-1FF3AD728D13};Stabäni;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;692161;284062;445 +{9EA5AADD-99F3-4C57-A2D4-69A50C28D3F5};Flurname swisstopo;TLM_FLURNAME;;k_W;{D772F351-AFF1-449B-99B0-C920F29C3D40};Höhgass;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;691876;283883;458 +{41F43020-7E75-4382-8D37-47B08952F891};Flurname swisstopo;TLM_FLURNAME;;k_W;{5F6ADA0D-C5D1-4BB2-8F2A-840C46780542};Fels;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;692055;283242;443 +{CD1CE041-D4FD-4357-B739-C40B1FB9AD9E};Lokalname swisstopo;TLM_FLURNAME;;k_W;{E52DD096-3608-401E-9297-4E88B19BD49B};Sass dal Gal;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;808947;124618;1175 +{CD1CE041-D4FD-4357-B739-C40B1FB9AD9E};Lokalname swisstopo;TLM_FLURNAME;;k_W;{E52DD096-3608-401E-9297-4E88B19BD49B};Sass dal Gal;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;808947;124618;1175 +{0F06D474-0FCF-4877-96BC-4423E9174827};Lokalname swisstopo;TLM_FLURNAME;;k_W;{06A9E622-066D-4AE7-9E55-FF11C87F060D};Mot di Böv;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;804498;135895;2325 +{874E3D4D-62E5-49DC-9408-3701B44DDC0C};Lokalname swisstopo;TLM_FLURNAME;;k_W;{8C18045C-5E78-412E-97CE-BCBA55C68167};Üerts Suot;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;829964;202684;2080 +{03C74023-CA9A-463B-938F-C1336D62D34E};Lokalname swisstopo;TLM_FLURNAME;;k_W;{2BC4D177-D58E-4BBA-9319-C091C35EE22E};God Sauaidas;offiziell;Rumantsch Grischun inkl. Lokalsprachen;Einfacher Name;;803353;182316;1438 +{67E5F2EB-61FC-469B-912E-77A9F3472529};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{39387AAF-BF27-447F-90AA-DB3758B0D5CF};Rheineck Schifflände;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;762278;259695;398 +{67E5F2EB-61FC-469B-912E-77A9F3472529};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{39387AAF-BF27-447F-90AA-DB3758B0D5CF};Rheineck Schifflände;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;762278;259695;398 +{392AEFF0-0206-447A-8D43-E1CF8D46C788};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{1D4E050B-C8CB-48FE-B0AF-912668073EBD};Altenrhein Schifflände;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;759922;262916;397 +{DB238C97-32F0-4C25-8520-911F48C0028B};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{C69B235E-70A0-42E4-9797-85AF9102E402};Arbon (See);offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;750772;264356;397 +{0699222F-D21A-4D0D-855D-AE8FF03DA137};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{75ED0523-7C27-4C59-BD46-A0F35F7365DB};Horn (See);offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;752538;262660;397 +{9DE69E63-FADC-4564-A130-2ABCAEC72188};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{10A76A51-80C6-4FE9-88EA-F47222C2D416};Sils/Segl Maria Barchiröls (See);offiziell;Mehrsprachig;Namenspaar;{9D28A395-D50B-422D-BA3F-F0190E80BD10};777978;144039;1798 +{9DE69E63-FADC-4564-A130-2ABCAEC72188};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{10A76A51-80C6-4FE9-88EA-F47222C2D416};Sils/Segl Maria Barchiröls (See);offiziell;Mehrsprachig;Namenspaar;{9D28A395-D50B-422D-BA3F-F0190E80BD10};777978;144039;1798 +{D6177E9E-06B8-4B26-BC66-703BD95C0242};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{89C73094-E26A-4421-ADA2-1CD18DAB6960};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694931;289090;437 +{D6177E9E-06B8-4B26-BC66-703BD95C0242};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{89C73094-E26A-4421-ADA2-1CD18DAB6960};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694931;289090;437 +{6A20671E-BB14-4C28-A7EF-57703BF9B7E9};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{FADE2C25-D01D-420E-985C-720E0044A096};Ramsen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;703767;285025;419 +{3579DB83-C62E-486B-8E24-ABC07E9B8A22};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{4E0B9E02-4FA3-47E4-8E2C-D5F660C56D09};Hemishofen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;704725;281756;420 +{B52CCC41-4BAB-4747-9067-F08B1F42CD74};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{DF45C2FD-243B-4F17-890D-B59957060E51};Weberei Matzingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;711700;265116;440 +{61427F4B-4166-494D-BAC7-68F0DEF07F8E};Haltestelle Schiff;TLM_HALTESTELLE;;k_W;{7CAD56D2-824A-4EC6-8ACE-B78E065AA26E};Biel/Bienne (Schiff/bateau);offiziell;Mehrsprachig;Namenspaar;{F8773A73-7FFB-44B1-94F1-A7FEA4878249};584577;220007;431 +{C3C7A9A4-0B1B-48AB-A330-EBA06D19532E};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{F80E6EE8-C449-4BEE-AE63-A389004E3820};Monte Lema;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;708070;99769;1565 +{C3C7A9A4-0B1B-48AB-A330-EBA06D19532E};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{F80E6EE8-C449-4BEE-AE63-A389004E3820};Monte Lema;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;708070;99769;1565 +{57F598A7-AF15-496B-9894-17F71EF362E9};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{421DF69A-FD8E-434D-9CC2-7C836238B92C};Miglieglia (Funivia);offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;709764;97915;711 +{ACAB8E56-102F-44AC-B15F-D5470034B947};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{039D2061-3DBD-4A4C-8922-54A03A3E4E9C};Alpe Foppa;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;712475;108304;1531 +{026BC3C1-E40C-4DAE-97EA-0C84D6AE1F84};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{442B19F0-E247-4CC5-B48C-0F17788654FB};Rivera;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;714456;109469;477 +{BC6EA238-3CB0-4855-B515-8420DDC0B2DE};Haltestelle Bahn;TLM_HALTESTELLE;;k_W;{50F36255-EDD2-4F3D-B892-31768B53B027};Domat/Ems;offiziell;Mehrsprachig;Namenspaar;{3F2F0344-4F6F-483B-A0C4-B35AFFE3A4E4};753670;188861;581 +{B86C84C5-DC34-4AF7-9A43-6DC617D7B602};Uebrige Bahnen;TLM_HALTESTELLE;;k_W;{F939CA18-917B-4547-8E5D-D9BCB9B5F70C};Feldis/Veulden;offiziell;Mehrsprachig;Namenspaar;{2EA6E8EF-566E-4D3B-A9E7-E68B9EFC7345};751999;184590;1467 +{81B82658-1492-4BF4-B1E9-77DE77E7B6FD};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{82D726B7-2691-4DC0-9B25-C81BFC8A664D};Pratteln, Bahnhof Süd;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;619074;263538;290 +{81B82658-1492-4BF4-B1E9-77DE77E7B6FD};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{82D726B7-2691-4DC0-9B25-C81BFC8A664D};Pratteln, Bahnhof Süd;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;619074;263538;290 +{F4B5CCC9-8A11-4754-A6DE-605EA546244C};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{C97ECF5A-B651-484A-9453-9D439506DE39};Dinhard, Gemeindehaus;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;700086;268009;435 +{943F6DCD-3E84-4A7D-A9B3-632E54E52C62};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{CBBC47AD-06DE-4C96-924F-42DCFC08C6F7};Steckborn, Bahnhof;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;715838;280473;403 +{5D924641-8B7B-4A9F-B1BD-8A3A6FB9BF9C};Haltestelle Bus;TLM_HALTESTELLE;;k_W;{785696CA-663E-489D-BC78-E37ABF280644};Winterthur, Sulzer;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;696506;261631;438 +{DF082598-AA49-42BC-8BC9-ADA3FB2C5968};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{E9D9A804-D52E-40D3-BA21-71AF523C55B9};Reiat;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;696043;288549;433 +{DF082598-AA49-42BC-8BC9-ADA3FB2C5968};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{E9D9A804-D52E-40D3-BA21-71AF523C55B9};Reiat;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;696043;288549;433 +{408546CB-9AA9-49B5-87B2-F25DDF20E694};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{085B3C06-6A24-4764-81FE-73DA7B06AA07};Ramsen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;703852;285487;420 +{CBB218FE-22CE-404A-AB16-3D22D65C73DA};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{4C600AD5-24F6-4C33-B207-458144EA589A};Dörflingen-Gailingen-West;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;696686;283518;440 +{F7947514-FBA1-4EFD-A9EB-47DC6175A7F8};Zollamt 24h 24h;TLM_STRASSENINFO;;k_W;{E58AA7A3-E2F3-4E79-B862-F309CF6E9F48};Kreuzlingen-Autobahn;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;729311;279896;399 +{1BA8B114-2766-434E-9C3B-F5775D6B401A};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{1A28FB3A-1291-446C-8CC3-07F1ED4623D4};Montlingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;762792;244817;424 +{1BA8B114-2766-434E-9C3B-F5775D6B401A};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{1A28FB3A-1291-446C-8CC3-07F1ED4623D4};Montlingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;762792;244817;424 +{E11C0B33-B3BC-4F0B-A079-EAF83B4AEE81};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{91ED14D3-9ABA-437A-AEAB-F23FB33E771F};Ponte Faloppia;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;721109;77131;249 +{EF1CD90C-4ED9-44AC-A3CF-44C533CB3E39};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{91ED14D3-9ABA-437A-AEAB-F23FB33E771F};Ponte Faloppia;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;721111;77127;249 +{2FE296C5-D611-4162-BFE0-7F4C1E4CFD47};Zollamt eingeschraenkt;TLM_STRASSENINFO;;k_W;{D844CEE0-4CE7-48EC-AE95-BE9E22F3AAE8};Pizzamiglio;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;724291;78199;233 +{2FE296C5-D611-4162-BFE0-7F4C1E4CFD47};Zollamt eingeschraenkt;TLM_STRASSENINFO;;k_W;{D844CEE0-4CE7-48EC-AE95-BE9E22F3AAE8};Pizzamiglio;offiziell;Italienisch inkl. Lokalsprachen;Einfacher Name;;724291;78199;233 +{B0D9EE93-AA3D-47C0-A9AF-E90675F4CD44};Zollamt 24h eingeschraenkt;TLM_STRASSENINFO;;k_W;{D8CFC971-C123-4578-A28B-1E030672B86C};La Croix-de-Rozon;offiziell;Franzoesisch inkl. Lokalsprachen;Einfacher Name;;499495;111092;476 +{4053791A-6A11-4E41-92BA-627DE67A04AB};Verladestation;TLM_STRASSENINFO;;k_W;{6D070FB7-69C8-4853-ABFB-BC51D4667B8C};Klosters Selfranga;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;786462;192331;1281 +{4053791A-6A11-4E41-92BA-627DE67A04AB};Verladestation;TLM_STRASSENINFO;;k_W;{6D070FB7-69C8-4853-ABFB-BC51D4667B8C};Klosters Selfranga;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;786462;192331;1281 +{C5EFF06F-21ED-4EFD-BC3C-2A207C1B1DF8};Verladestation;TLM_STRASSENINFO;;k_W;{9C561B13-441B-4435-B18E-F5B7DC6F7211};Sagliains;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;802981;182561;1432 +{3E65608D-5B8C-4700-84FA-FC5E384D0D68};Verladestation;TLM_STRASSENINFO;;k_W;{D0AE7485-17A7-4173-BCB1-C71BFC731136};Kandersteg;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;617792;149215;1175 +{9A0DE088-5772-43BC-8CA9-12AA35E36C63};Verladestation;TLM_STRASSENINFO;;k_W;{9ADFEA48-F34A-48D7-8B37-D92D70BD3206};Brig;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;642679;130098;677 +{2FF7E3F1-6BAA-4981-A172-A459E01982E8};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{0642FC92-2FC6-4A4D-AE2B-9115F0D0BA2B};Kleinandelfingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694036;273365;390 +{2FF7E3F1-6BAA-4981-A172-A459E01982E8};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{0642FC92-2FC6-4A4D-AE2B-9115F0D0BA2B};Kleinandelfingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694036;273365;390 +{AA4D0B0F-CA43-4B91-BFC3-32B9F3E2FEDB};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{0642FC92-2FC6-4A4D-AE2B-9115F0D0BA2B};Kleinandelfingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694224;272961;387 +{358C0BD3-3DF7-4A49-B446-F156A2D3D865};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{D723A8F6-7E97-41D0-B042-0935835A017A};Winterthur-Töss;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;695210;260579;436 +{C4D61C3F-4A22-4474-9FD8-9532845AFFF4};Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{4EF0E5A1-1AE2-4793-8073-3CA1AF521FCE};Wülflingen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694252;263269;413 +{674B9162-0FCF-4972-B9A3-FDB9AFE55E89};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694852;264108;438 +{674B9162-0FCF-4972-B9A3-FDB9AFE55E89};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694852;264108;438 +{ACF238B8-5177-4239-ACD1-B402F60F5920};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;695090;264580;432 +{1D10A30D-3B35-43AA-9F9D-6DD102D16B58};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{1B56A862-5B35-44DD-8767-AB1D1180CCD0};Winterthur-Nord;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;695409;264573;443 +{1BEDD5D7-32B9-4F24-A4AC-5AE449163449};Verzweigung;TLM_AUS_EINFAHRT;;k_W;{786B3A4C-E819-4338-AB88-F3D93A034530};Grüneck;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;717143;272161;413 +{73343AB3-29EF-46F0-BB66-2CF5EE0263AB};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{5DD32915-F10E-4C2B-9FBE-58D54EC4E6C5};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694943;288749;438 +{73343AB3-29EF-46F0-BB66-2CF5EE0263AB};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{5DD32915-F10E-4C2B-9FBE-58D54EC4E6C5};Thayngen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;694943;288749;438 +{A0C8877F-8D02-4D77-BE72-B5D8AE5CC798};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{EB2EDDE2-9E97-4C44-BBBA-9F4BCD61F259};Arbon-West;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;747600;265336;428 +{53E5C2C6-8F17-467C-A9EA-9BCFA530C61D};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{16F0BFBC-839D-41C6-9CE8-BBF2424F97CA};Kestenholz;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;621266;237229;458 +{BBDAF25E-95DF-499C-A55B-7C120897D1E0};Ein- und Ausfahrt;TLM_AUS_EINFAHRT;;k_W;{F07E27DD-42B7-49A4-BE97-0F71E128123A};Nufenen;offiziell;Hochdeutsch inkl. Lokalsprachen;Einfacher Name;;738593;155728;1557 diff --git a/homebytwo/importers/tests/data/swissnames3d_data.zip b/homebytwo/importers/tests/data/swissnames3d_data.zip new file mode 100644 index 0000000000000000000000000000000000000000..4aa1698018318695a3df92706fa50c03261c95bf GIT binary patch literal 27399 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 ZipFile: + """ + download zip file from remote url to bytes buffer + and wrap it in ZipFile + """ + + block_size = 1024 + bytes_io = BytesIO() + + with Session() as session: + response = session.get(url, stream=True) + response.raise_for_status() + file_size = int(response.headers["Content-Length"]) + + for data in tqdm( + response.iter_content(block_size), + total=int(file_size / block_size), + unit="B", + unit_scale=block_size, + desc=f"downloading from {url}", + ): + bytes_io.write(data) + + return ZipFile(bytes_io) + + +def get_csv_line_count(csv_file: TextIOWrapper, header: bool) -> int: + """ + Get the number of features in the csv file + """ + count = sum(1 for _ in csv.reader(csv_file)) + csv_file.seek(0) # return the pointer to the first line for reuse + + return max(count - int(header), 0) + + +def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: + """ + Save places from csv parsers in geonames.py or swissnames3d.py + """ + created_counter = updated_counter = 0 + + with transaction.atomic(): + for remote_place in tqdm( + data, + total=count, + unit="places", + unit_scale=True, + desc="saving places", + ): + + # prepare default values + try: + place_type = PlaceType.objects.get(code=remote_place.place_type) + except PlaceType.DoesNotExist: + print(f"Place type code: {remote_place.place_type} does not exist.") + continue + + default_values = { + "name": remote_place.name, + "place_type": place_type, + "geom": Point( + remote_place.longitude, + remote_place.latitude, + srid=remote_place.srid, + ), + "altitude": remote_place.altitude, + } + + # get or create Place + local_place, created = Place.objects.get_or_create( + data_source=remote_place.data_source, + source_id=remote_place.source_id, + defaults=default_values, + ) + + if created: + created_counter += 1 + + # update existing place with default values + else: + for key, value in default_values.items(): + setattr(local_place, key, value) + local_place.save() + updated_counter += 1 + + return "Created {} new places and updated {} places. ".format( + created_counter, updated_counter + ) diff --git a/homebytwo/routes/geonames.py b/homebytwo/routes/geonames.py deleted file mode 100644 index d1575d8c..00000000 --- a/homebytwo/routes/geonames.py +++ /dev/null @@ -1,147 +0,0 @@ -import csv -from collections import namedtuple -from io import BytesIO, TextIOWrapper -from typing import IO, Iterator -from zipfile import ZipFile - -from django.db import transaction -from django.contrib.gis.geos import Point - -from lxml import html -import requests -from tqdm import tqdm - -from homebytwo.routes.models import Place, Route -from homebytwo.routes.models.place import PlaceType - -PLACE_TYPE_URL = "http://www.geonames.org/export/codes.html" -PLACE_DATA_URL = "https://download.geonames.org/export/dump/{}.zip" - -PlaceTuple = namedtuple( - "PlaceTuple", ["geonameid", "name", "latitude", "longitude", "feature_code", "elevation"] -) - - -def import_places_from_geonames(scope: str = "allCountries"): - file = get_geonames_remote_file(scope) - data = parse_places_from_file(file) - create_places_from_geonames_data(data) - - -def get_geonames_remote_file(scope: str = "allCountries") -> IO[bytes]: - """ - retrieve zip file from https://download.geonames.org/export/dump/ - """ - print(f"downloading geonames file for `{scope}`...") - response = requests.get(f"https://download.geonames.org/export/dump/{scope}.zip") - response.raise_for_status() - root = ZipFile(BytesIO(response.content)) - return TextIOWrapper(root.open(f"{scope}.txt")) - - -def get_geonames_local_file(file_name: str) -> IO: - """ - open a local file to pass to the generator. - """ - return TextIOWrapper(open(file_name)) - - -def count_rows_in_file(file: IO) -> int: - return sum(1 for _ in csv.reader(file)) - - -def parse_places_from_file(file: IO) -> Iterator[PlaceTuple]: - data_reader = csv.reader(file, delimiter="\t") - for row in data_reader: - if row[0] and row[1] and row[4] and row[5] and row[7]: - yield PlaceTuple( - geonameid=int(row[0]), - name=row[1], - latitude=float(row[4]), - longitude=float(row[5]), - feature_code=row[7], - elevation=float(row[14]), - ) - - -def create_places_from_geonames_data(data: Iterator[PlaceTuple], count: int) -> None: - description = "saving geonames places" - with transaction.atomic(): - for remote_place in tqdm(data, desc=description, total=count): - default_values = { - "name": remote_place.name, - "place_type": PlaceType.objects.get(code=remote_place.feature_code), - "geom": Point(remote_place.longitude, remote_place.latitude, srid=4326), - "altitude": remote_place.elevation, - } - - local_place, created = Place.objects.get_or_create( - data_source="geonames", - source_id=remote_place.geonameid, - defaults=default_values, - ) - - if not created: - for key, value in default_values.items(): - setattr(local_place, key, value) - local_place.save() - - -def update_place_types_from_geonames() -> None: - """ - Scrape the page containing the reference of all features type - at http://www.geonames.org/export/codes.html and save the - result to the database. - """ - # retrieve page content with requests - print("importing place types from geonames... ") - response = requests.get(PLACE_TYPE_URL) - response.raise_for_status() - - # target table - xml = html.fromstring(response.content) - feature_type_table = xml.xpath('//table[@class="restable"]')[0] - - # parse place types from table rows - table_rows = feature_type_table.xpath(".//tr") - place_type_pks = [] - for row in table_rows: - - # header rows contain class information - if row.xpath(".//th"): - header_text = row.text_content() - feature_class, class_description = header_text.split(" ", 1) - current_feature_class = feature_class - - # non-header rows contain feature type - elif "tfooter" not in row.classes: - code, name, description = [ - element.text_content() for element in row.xpath(".//td") - ] - place_type, created = PlaceType.objects.get_or_create( - feature_class=current_feature_class, - code=code, - name=name, - description=description, - ) - place_type_pks.append(place_type.pk) - - PlaceType.objects.exclude(pk__in=place_type_pks).delete() - - -def migrate_route_checkpoints_to_geonames() -> None: - print("migrating route checkpoints...") - total_count = Route.objects.all().count() - for index, route in enumerate(Route.objects.all(), 1): - print(f"{index}/{total_count} migrating route: {route}") - existing_checkpoints = route.checkpoint_set - existing_checkpoint_names = existing_checkpoints.values_list( - "place__name", flat=True - ) - possible_checkpoints = route.find_possible_checkpoints() - for checkpoint in possible_checkpoints: - if ( - checkpoint.place.name in existing_checkpoint_names - and checkpoint.place.data_source == "geonames" - ): - checkpoint.save() diff --git a/homebytwo/routes/migrations/0050_create_place_type_model.py b/homebytwo/routes/migrations/0050_create_place_type_model.py deleted file mode 100644 index a1f8bc20..00000000 --- a/homebytwo/routes/migrations/0050_create_place_type_model.py +++ /dev/null @@ -1,108 +0,0 @@ -# Generated by Django 2.2.16 on 2020-10-24 12:28 -from django.contrib.gis.geos import Point -from django.db import migrations, models - -from tqdm import tqdm - -from homebytwo.routes.geonames import ( - migrate_route_checkpoints_to_geonames, - get_geonames_remote_file, - parse_places_from_file, - update_place_types_from_geonames, -) - - -def migrate_routes_to_geonames(apps, schema_editor): - migrate_route_checkpoints_to_geonames() - - -def import_place_types_from_geonames(apps, schema_editor): - update_place_types_from_geonames() - - -def import_places_from_geonames(apps, schema_editor): - Place = apps.get_model("routes", "Place") - PlaceType = apps.get_model("routes", "PlaceType") - - file = get_geonames_remote_file("CH") - data = parse_places_from_file(file) - - print("saving geonames places") - for remote_place in data: - defaults = { - "name": remote_place.name, - "place_type": PlaceType.objects.get(code=remote_place.feature_code), - "geom": Point(remote_place.longitude, remote_place.latitude, srid=4326), - "altitude": remote_place.elevation, - "old_place_type": "CST", - } - - local_place, created = Place.objects.get_or_create( - data_source="geonames", - source_id=remote_place.geonameid, - defaults=defaults, - ) - - if not created: - local_place.update(defaults) - local_place.save() - - -def update_routes(apps, schema_editor): - migrate_route_checkpoints_to_geonames() - - -class Migration(migrations.Migration): - - dependencies = [ - ("routes", "0049_merge_20201002_1037"), - ] - - operations = [ - migrations.CreateModel( - name="PlaceType", - fields=[ - ( - "feature_class", - models.CharField( - choices=[ - ("A", "country, state, region,..."), - ("H", "stream, lake,..."), - ("L", "parks,area,..."), - ("P", "city, village,..."), - ("R", "road, railroad"), - ("S", "spot, building, farm"), - ("U", "undersea"), - ("V", "forest,heath,..."), - ], - max_length=1, - ), - ), - ( - "code", - models.CharField(max_length=10, primary_key=True, serialize=False), - ), - ("name", models.CharField(max_length=256)), - ("description", models.CharField(max_length=512)), - ], - ), - migrations.RunPython( - import_place_types_from_geonames, - ), - migrations.RenameField( - model_name="place", - old_name="place_type", - new_name="old_place_type", - ), - migrations.AddField( - model_name="place", - name="place_type", - field=models.ForeignKey( - on_delete="CASCADE", to="routes.PlaceType", null=True - ), - ), - migrations.RunPython( - import_places_from_geonames, - ), - migrations.RunPython(migrate_routes_to_geonames), - ] diff --git a/homebytwo/routes/migrations/0050_fix_route_data.py b/homebytwo/routes/migrations/0050_fix_route_data.py index 6ea0b51f..eb581fd5 100644 --- a/homebytwo/routes/migrations/0050_fix_route_data.py +++ b/homebytwo/routes/migrations/0050_fix_route_data.py @@ -1,11 +1,11 @@ # Generated by Django 2.2.16 on 2020-10-20 10:15 -from django.db import migrations from django.core.management import call_command +from django.db import migrations def fix_routes_data(apps, schema_editor): - call_command('fix_routes_data', verbosity=0) + call_command('fix_routes_data') class Migration(migrations.Migration): diff --git a/homebytwo/routes/migrations/0051_create_place_type_model.py b/homebytwo/routes/migrations/0051_create_place_type_model.py new file mode 100644 index 00000000..ce74bccf --- /dev/null +++ b/homebytwo/routes/migrations/0051_create_place_type_model.py @@ -0,0 +1,142 @@ +# Generated by Django 2.2.16 on 2020-10-24 12:28 +from django.contrib.gis.geos import Point +from django.db import migrations, models + +from tqdm import tqdm + +from homebytwo.importers.geonames import update_place_types_from_geonames + +PLACE_TYPE_TRANSLATIONS = { + "BDG": "BLDG", + "BEL": "CLF", + "BLD": "RK", + "BOA": "LDNG", + "BUS": "BUSTP", + "C24": "PSTB", + "C24LT": "PSTB", + "CAV": "CAVE", + "CLT": "PSTB", + "CPL": "CH", + "EAE": "RDJCT", + "EXT": "RDJCT", + "FTN": "WTRW", + "HIL": "HLL", + "ICG": "RDJCT", + "LMK": "BP", + "LPL": "PPLL", + "LST": "TRANT", + "MNT": "MNMT", + "OBG": "BLDG", + "OTH": "RSTP", + "PAS": "PASS", + "PLA": "PPL", + "POV": "PROM", + "RPS": "PASS", + "SBG": "CH", + "SHR": "SHRN", + "SRC": "SPNG", + "SUM": "PK", + "TRA": "RSTP", + "TWR": "TOWR", + "WTF": "FLLS", +} + + +def import_place_types_from_geonames(apps, schema_editor): + update_place_types_from_geonames() + + +def migrate_place_types(apps, schema_editor): + Place = apps.get_model("routes", "Place") + PlaceType = apps.get_model("routes", "PlaceType") + + for place in tqdm( + Place.objects.all(), + desc="updating places to new place types", + unit="places", + unit_scale=True, + total=Place.objects.count(), + ): + new_place_code = PLACE_TYPE_TRANSLATIONS[place.old_place_type] + try: + place_type = PlaceType.objects.get(code=new_place_code) + except PlaceType.DoesNotExist: + print(f"Place type {place.old_place_type} does not exist") + place.delete() + place.place_type = place_type + place.save(update_fields=["place_type"]) + + +class Migration(migrations.Migration): + + dependencies = [ + ("routes", "0050_fix_route_data"), + ] + + operations = [ + migrations.CreateModel( + name="PlaceType", + fields=[ + ( + "feature_class", + models.CharField( + choices=[ + ("A", "country, state, region,..."), + ("H", "stream, lake,..."), + ("L", "parks,area,..."), + ("P", "city, village,..."), + ("R", "road, railroad"), + ("S", "spot, building, farm"), + ("U", "undersea"), + ("V", "forest,heath,..."), + ], + max_length=1, + ), + ), + ( + "code", + models.CharField(max_length=10, primary_key=True, serialize=False), + ), + ("name", models.CharField(max_length=256)), + ("description", models.CharField(max_length=512)), + ], + ), + migrations.RunPython( + import_place_types_from_geonames, + ), + migrations.RenameField( + model_name="place", + old_name="place_type", + new_name="old_place_type", + ), + migrations.AddField( + model_name="place", + name="place_type", + field=models.ForeignKey( + on_delete="CASCADE", to="routes.PlaceType", null=True + ), + ), + migrations.RunPython( + migrate_place_types, + ), + migrations.RemoveField( + model_name="place", + name="old_place_type", + ), + migrations.AlterField( + model_name="place", + name="place_type", + field=models.ForeignKey(on_delete="CASCADE", to="routes.PlaceType"), + ), + migrations.RemoveField( + model_name="place", + name="public_transport", + ), + migrations.AlterField( + model_name="place", + name="source_id", + field=models.CharField( + max_length=50, null=True, verbose_name="ID at the data source" + ), + ), + ] diff --git a/homebytwo/routes/migrations/0051_delete_non_geonames_places.py b/homebytwo/routes/migrations/0051_delete_non_geonames_places.py deleted file mode 100644 index e10bc8cb..00000000 --- a/homebytwo/routes/migrations/0051_delete_non_geonames_places.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2.16 on 2020-10-26 20:55 - -from django.db import migrations - - -def delete_non_geonames_places(apps, schema_editor): - print("deleting non-geonames places... ") - Place = apps.get_model("routes", "Place") - Place.objects.exclude(data_source="geonames").delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ("routes", "0050_create_place_type_model"), - ] - - operations = [migrations.RunPython(delete_non_geonames_places)] diff --git a/homebytwo/routes/migrations/0052_remove_old_place_type_field.py b/homebytwo/routes/migrations/0052_remove_old_place_type_field.py deleted file mode 100644 index 2f7d85ce..00000000 --- a/homebytwo/routes/migrations/0052_remove_old_place_type_field.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 2.2.16 on 2020-10-26 20:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('routes', '0051_delete_non_geonames_places'), - ] - - operations = [ - migrations.RemoveField( - model_name='place', - name='old_place_type', - ), - migrations.RemoveField( - model_name='place', - name='public_transport', - ), - migrations.AlterField( - model_name='place', - name='place_type', - field=models.ForeignKey(on_delete='CASCADE', to='routes.PlaceType'), - ), - ] diff --git a/homebytwo/routes/migrations/0053_merge_20201027_2129.py b/homebytwo/routes/migrations/0053_merge_20201027_2129.py deleted file mode 100644 index 71a40774..00000000 --- a/homebytwo/routes/migrations/0053_merge_20201027_2129.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.2.16 on 2020-10-27 20:29 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('routes', '0052_remove_old_place_type_field'), - ('routes', '0050_fix_route_data'), - ] - - operations = [ - ] diff --git a/homebytwo/routes/models/__init__.py b/homebytwo/routes/models/__init__.py index 286ec56d..589060c7 100644 --- a/homebytwo/routes/models/__init__.py +++ b/homebytwo/routes/models/__init__.py @@ -1,7 +1,7 @@ from .activity import Activity, ActivityPerformance, ActivityType, Gear # NOQA from .athlete import Athlete # NOQA from .event import WebhookTransaction # NOQA -from .place import Checkpoint, Place # NOQA +from .place import Checkpoint, Place, PlaceType # NOQA from .track import Track # NOQA # isort:skip from .route import Route, RouteManager # NOQA # isort:skip diff --git a/homebytwo/routes/models/place.py b/homebytwo/routes/models/place.py index a7b3bd76..d89c6e97 100644 --- a/homebytwo/routes/models/place.py +++ b/homebytwo/routes/models/place.py @@ -1,3 +1,4 @@ +from collections import namedtuple from datetime import datetime from django.contrib.gis.db import models @@ -7,6 +8,20 @@ from ...core.models import TimeStampedModel +PlaceTuple = namedtuple( + "PlaceTuple", + [ + "data_source", + "source_id", + "name", + "latitude", + "longitude", + "place_type", + "altitude", + "srid", + ], +) + class Place(TimeStampedModel): """ @@ -16,123 +31,52 @@ class Place(TimeStampedModel): and for public transport connection. """ - PLACE = "PLA" - LOCAL_PLACE = "LPL" - SINGLE_BUILDING = "BDG" - OPEN_BUILDING = "OBG" - TOWER = "TWR" - SACRED_BUILDING = "SBG" - CHAPEL = "CPL" - WAYSIDE_SHRINE = "SHR" - MONUMENT = "MNT" - FOUNTAIN = "FTN" - SUMMIT = "SUM" - HILL = "HIL" - PASS = "PAS" BELAY = "BEL" - WATERFALL = "WTF" - CAVE = "CAV" - SOURCE = "SRC" + BOAT_STATION = "BOA" BOULDER = "BLD" - POINT_OF_VIEW = "POV" BUS_STATION = "BUS" - TRAIN_STATION = "TRA" - OTHER_STATION = "OTH" - BOAT_STATION = "BOA" - EXIT = "EXT" - ENTRY_AND_EXIT = "EAE" - ROAD_PASS = "RPS" - INTERCHANGE = "ICG" - LOADING_STATION = "LST" - PARKING = "PKG" + CAVE = "CAV" + CHAPEL = "CPL" CUSTOMHOUSE_24H = "C24" CUSTOMHOUSE_24H_LIMITED = "C24LT" CUSTOMHOUSE_LIMITED = "CLT" - LANDMARK = "LMK" - HOME = "HOM" - WORK = "WRK" + ENTRY_AND_EXIT = "EAE" + EXIT = "EXT" + FOUNTAIN = "FTN" + FRIENDS_PLACE = "FRD" GYM = "GYM" + HILL = "HIL" HOLIDAY_PLACE = "HOL" - FRIENDS_PLACE = "FRD" + HOME = "HOM" + INTERCHANGE = "ICG" + LANDMARK = "LMK" + LOADING_STATION = "LST" + LOCAL_PLACE = "LPL" + MONUMENT = "MNT" + OPEN_BUILDING = "OBG" OTHER_PLACE = "CST" + OTHER_STATION = "OTH" + PARKING = "PKG" + PASS = "PAS" + PLACE = "PLA" + POINT_OF_VIEW = "POV" + ROAD_PASS = "RPS" + SACRED_BUILDING = "SBG" + SINGLE_BUILDING = "BDG" + SOURCE = "SRC" + SUMMIT = "SUM" + TOWER = "TWR" + TRAIN_STATION = "TRA" + WATERFALL = "WTF" + WAYSIDE_SHRINE = "SHR" + WORK = "WRK" - PLACE_TYPE_CHOICES = ( - (PLACE, "Place"), - (LOCAL_PLACE, "Local Place"), - ( - "Constructions", - ( - (SINGLE_BUILDING, "Single Building"), - (OPEN_BUILDING, "Open Building"), - (TOWER, "Tower"), - (SACRED_BUILDING, "Sacred Building"), - (CHAPEL, "Chapel"), - (WAYSIDE_SHRINE, "Wayside Shrine"), - (MONUMENT, "Monument"), - (FOUNTAIN, "Fountain"), - ), - ), - ( - "Features", - ( - (SUMMIT, "Summit"), - (HILL, "Hill"), - (PASS, "Pass"), - (BELAY, "Belay"), - (WATERFALL, "Waterfall"), - (CAVE, "Cave"), - (SOURCE, "Source"), - (BOULDER, "Boulder"), - (POINT_OF_VIEW, "Point of View"), - ), - ), - ( - "Public Transport", - ( - (BUS_STATION, "Bus Station"), - (TRAIN_STATION, "Train Station"), - (OTHER_STATION, "Other Station"), - (BOAT_STATION, "Boat Station"), - ), - ), - ( - "Roads", - ( - (EXIT, "Exit"), - (ENTRY_AND_EXIT, "Entry and Exit"), - (ROAD_PASS, "Road Pass"), - (INTERCHANGE, "Interchange"), - (LOADING_STATION, "Loading Station"), - (PARKING, "Parking"), - ), - ), - ( - "Customs", - ( - (CUSTOMHOUSE_24H, "Customhouse 24h"), - (CUSTOMHOUSE_24H_LIMITED, "Customhouse 24h limited"), - (CUSTOMHOUSE_LIMITED, "Customhouse limited"), - (LANDMARK, "Landmark"), - ), - ), - ( - "Personal", - ( - (HOME, "Home"), - (WORK, "Work"), - (GYM, "Gym"), - (HOLIDAY_PLACE, "Holiday Place"), - (FRIENDS_PLACE, "Friend's place"), - (OTHER_PLACE, "Other place"), - ), - ), - ) place_type = models.ForeignKey("PlaceType", on_delete="CASCADE") name = models.CharField(max_length=250) description = models.TextField(default="", blank=True) altitude = models.FloatField(null=True) data_source = models.CharField(default="homebytwo", max_length=50) - source_id = models.CharField("ID at the data source", max_length=50) + source_id = models.CharField("ID at the data source", max_length=50, null=True) geom = models.PointField(srid=21781) class Meta: @@ -150,30 +94,13 @@ def __str__(self): self.place_type.name, ) - def save(self, *args, **kwargs): - """ - Source_id references the id at the data source. - The pair 'data_source' and 'source_id' should be unique together. - Places created in Homebytwo directly should thus have a source_id - set. - In other cases, e.g. importers.Swissname3dPlaces, - the source_id will be set by the importer model. - - """ - super(Place, self).save(*args, **kwargs) - - # in case of manual homebytwo entries, the source_id will be empty. - if self.source_id == "": - self.source_id = str(self.id) - self.save() - def get_coords(self, srid=4326): """ returns a tuple with the place coords transformed to the requested srid """ - return self.geom.transform(4326, clone=True).coords + return self.geom.transform(srid, clone=True).coords - def get_geojson(self, fields=["name", "place_type"]): + def get_geojson(self, fields): return serialize("geojson", [self], geometry_field="geom", fields=fields) def get_gpx_waypoint(self, route, line_location, start_time): diff --git a/homebytwo/routes/tests/factories.py b/homebytwo/routes/tests/factories.py index 7c1dd5ae..b951b745 100644 --- a/homebytwo/routes/tests/factories.py +++ b/homebytwo/routes/tests/factories.py @@ -10,7 +10,7 @@ from pytz import utc from ...routes.models import (Activity, ActivityPerformance, ActivityType, Gear, Place, - Route, WebhookTransaction) + PlaceType, Route, WebhookTransaction) from ...utils.factories import AthleteFactory, get_field_choices @@ -75,15 +75,13 @@ class PlaceFactory(DjangoModelFactory): class Meta: model = Place - place_type = Faker( - "random_element", - elements=list(get_field_choices(Place.PLACE_TYPE_CHOICES)), - ) + place_type = Iterator(PlaceType.objects.all()) name = Faker("city") description = Faker("bs") altitude = Faker("random_int", min=0, max=4808) - public_transport = Faker("boolean", chance_of_getting_true=10) geom = Faker("location") + data_source = Faker("random_element", elements=["geonames", "swissnames3d"]) + source_id = Sequence(lambda n: 1000 + n) class RouteFactory(DjangoModelFactory): @@ -128,7 +126,7 @@ class Meta: "random_element", elements=list(get_field_choices(Activity.WORKOUT_TYPE_CHOICES)), ) - gear = SubFactory(GearFactory) + gear = SubFactory(GearFactory, athlete=athlete) streams = DataFrame( {stream["type"]: stream["data"] for stream in json.loads(streams_json)} ) diff --git a/homebytwo/routes/tests/test_coda.py b/homebytwo/routes/tests/test_coda.py index 4b972f95..adc18764 100644 --- a/homebytwo/routes/tests/test_coda.py +++ b/homebytwo/routes/tests/test_coda.py @@ -25,20 +25,20 @@ def test_report_usage_to_coda_success( response_mocks = [ { "url": coda["doc_url"], - "response_json": "coda_doc.json", + "response_file": "coda_doc.json", }, { "url": coda["table_url"], - "response_json": "coda_table.json", + "response_file": "coda_table.json", }, { "url": coda["table_url"] + "/columns", - "response_json": "coda_columns.json", + "response_file": "coda_columns.json", }, { "url": coda["table_url"] + "/rows", "method": "post", - "response_json": "coda_request.json", + "response_file": "coda_request.json", "status": 202, }, ] @@ -55,15 +55,15 @@ def test_report_usage_to_coda_failure(athlete, mock_call_json_responses, coda): response_mocks = [ { "url": coda["doc_url"], - "response_json": "coda_doc.json", + "response_file": "coda_doc.json", }, { "url": coda["table_url"], - "response_json": "coda_table.json", + "response_file": "coda_table.json", }, { "url": coda["table_url"] + "/columns", - "response_json": "coda_missing_columns.json", + "response_file": "coda_missing_columns.json", }, ] with raises(ImproperlyConfigured): diff --git a/homebytwo/routes/tests/test_place.py b/homebytwo/routes/tests/test_place.py index 2b3c84a1..3c6d3491 100644 --- a/homebytwo/routes/tests/test_place.py +++ b/homebytwo/routes/tests/test_place.py @@ -16,11 +16,6 @@ def test_string_method(self): place = PlaceFactory(name=name) self.assertTrue(name in str(place)) - def test_save_homebytwo_place_sets_source_id(self): - place = PlaceFactory() - self.assertEqual(place.data_source, "homebytwo") - self.assertEqual(place.source_id, str(place.id)) - def test_get_places_within(self): point = GEOSGeometry("POINT(1 1)") diff --git a/homebytwo/routes/tests/test_tasks.py b/homebytwo/routes/tests/test_tasks.py index 7ba78711..980cc542 100644 --- a/homebytwo/routes/tests/test_tasks.py +++ b/homebytwo/routes/tests/test_tasks.py @@ -2,12 +2,18 @@ from homebytwo.conftest import STRAVA_API_BASE_URL from homebytwo.routes.models import WebhookTransaction -from homebytwo.routes.tasks import (import_strava_activities_streams_task, - import_strava_activities_task, - import_strava_activity_streams_task, - process_strava_events, train_prediction_models_task) -from homebytwo.routes.tests.factories import (ActivityFactory, ActivityTypeFactory, - WebhookTransactionFactory) +from homebytwo.routes.tasks import ( + import_strava_activities_streams_task, + import_strava_activities_task, + import_strava_activity_streams_task, + process_strava_events, + train_prediction_models_task, +) +from homebytwo.routes.tests.factories import ( + ActivityFactory, + ActivityTypeFactory, + WebhookTransactionFactory, +) STRAVA_STREAMS_URL = ( STRAVA_API_BASE_URL + "activities/{}/streams/time,altitude,distance,moving" @@ -26,11 +32,11 @@ def test_import_strava_activities_task(athlete, mock_call_json_response): assert athlete.activities_imported -def test_import_strava_activities_task_server_error(athlete, mock_server_error): +def test_import_strava_activities_task_server_error(athlete, mock_call_server_error): url = STRAVA_API_BASE_URL + "athlete/activities" call = import_strava_activities_task response_json = "activities.json" - response = mock_server_error(call, url, response_json, athlete_id=athlete.id) + response = mock_call_server_error(call, url, response_json, athlete_id=athlete.id) assert response == [] @@ -94,13 +100,13 @@ def test_import_strava_activity_streams_task_deleted(athlete): def test_import_strava_activity_streams_task_connection_error( - athlete, mock_connection_error + athlete, mock_call_connection_error ): activity = ActivityFactory(athlete=athlete, streams=None) call = import_strava_activity_streams_task url = STRAVA_STREAMS_URL.format(activity.strava_id) - response = mock_connection_error(call, url, strava_id=activity.strava_id) + response = mock_call_connection_error(call, url, strava_id=activity.strava_id) expected = "Streams for activity {} could not be retrieved from Strava".format( activity.strava_id ) @@ -108,12 +114,14 @@ def test_import_strava_activity_streams_task_connection_error( assert expected in response -def test_import_strava_activity_streams_task_server_error(athlete, mock_server_error): +def test_import_strava_activity_streams_task_server_error( + athlete, mock_call_server_error +): activity = ActivityFactory(athlete=athlete, streams=None) call = import_strava_activity_streams_task url = STRAVA_STREAMS_URL.format(activity.strava_id) - response = mock_server_error( + response = mock_call_server_error( call, url, "streams.json", strava_id=activity.strava_id ) expected = "Streams for activity {} could not be retrieved from Strava".format( @@ -208,17 +216,17 @@ def test_process_strava_events_duplicates(athlete): assert skipped_transactions.count() == 1 -def test_process_events_deleted_activity(athlete, mock_not_found_error): +def test_process_events_deleted_activity(athlete, mock_call_not_found): activity = ActivityFactory() WebhookTransactionFactory( athlete_strava_id=athlete.strava_id, activity_strava_id=activity.strava_id ) call = process_strava_events url = STRAVA_API_BASE_URL + "activities/" + str(activity.strava_id) - mock_not_found_error(call, url, "activity_not_found.json") + mock_call_not_found(call, url) -def test_process_strava_events_errors(athlete, mock_connection_error): +def test_process_strava_events_errors(athlete, mock_call_connection_error): WebhookTransactionFactory(athlete_strava_id=0) WebhookTransactionFactory(athlete_strava_id=athlete.strava_id, activity_strava_id=0) WebhookTransactionFactory( @@ -226,7 +234,7 @@ def test_process_strava_events_errors(athlete, mock_connection_error): ) call = process_strava_events url = STRAVA_API_BASE_URL + "activities/0" - mock_connection_error(call, url) + mock_call_connection_error(call, url) transactions = WebhookTransaction.objects.all() assert transactions.filter(status=WebhookTransaction.ERROR).count() == 2 diff --git a/homebytwo/utils/factories.py b/homebytwo/utils/factories.py index 8a1c9a3e..9ea7b213 100644 --- a/homebytwo/utils/factories.py +++ b/homebytwo/utils/factories.py @@ -14,10 +14,10 @@ def get_field_choices(choices): """ # iterate over the unpacked choices assuming they are groups. - for groupname, group in choices: + for group_name, group in choices: # if the group value is a string, it is not a group, it is a choice if isinstance(group, str): - yield (groupname) + yield group_name else: for key, value in group: yield key diff --git a/readme.md b/readme.md index 64c3ef6b..d2917967 100644 --- a/readme.md +++ b/readme.md @@ -117,7 +117,7 @@ $ rm -rf data.zip swissNAMES3D_LV03.zip swissNAMES3D_LV03 && cd /vagrant/ Run the importer command: ```sh -$ ./manage.py importswissname3d homebytwo/media/shapefiles/swissNAMES3D_PKT.shp +$ ./manage.py importswissnames3d homebytwo/media/shapefiles/swissNAMES3D_PKT.shp ``` ## Managing Celery diff --git a/virtualization/playbook.yml b/virtualization/playbook.yml index 681618c6..69c63e33 100644 --- a/virtualization/playbook.yml +++ b/virtualization/playbook.yml @@ -12,7 +12,7 @@ - { role: rabbitmq } - { role: webpack } - { role: homebytwo_env } - - { role: swissname3d } + - { role: swissnames3d } tasks: - name: Ensure celery service exists diff --git a/virtualization/roles/swissname3d/tasks/main.yml b/virtualization/roles/swissnames3d/tasks/main.yml similarity index 90% rename from virtualization/roles/swissname3d/tasks/main.yml rename to virtualization/roles/swissnames3d/tasks/main.yml index f3b183ec..4efda407 100644 --- a/virtualization/roles/swissname3d/tasks/main.yml +++ b/virtualization/roles/swissnames3d/tasks/main.yml @@ -27,7 +27,7 @@ - "/tmp/sn3d/swissNAMES3D_LV03/shp_LV03_LN02/swissNAMES3D_PKT.*" - name: import places from shapefile - command: "{{ env_root }}/bin/python {{ django_root }}manage.py importswissname3d --no-input --delete {{ django_root }}{{ project_name}}/media/swissNAMES3D_PKT.shp" + command: "{{ env_root }}/bin/python {{ django_root }}manage.py importswissnames3d --no-input --delete {{ django_root }}{{ project_name}}/media/swissNAMES3D_PKT.shp" - name: remove temporary directory file: From 64bc59c4f1713077d25095d0cb9be624f87b1c39 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 2 Nov 2020 11:43:18 +0200 Subject: [PATCH 03/21] HB2-66 add update parameter to import commands --- homebytwo/importers/geonames.py | 7 +++++-- .../management/commands/import_geonames_places.py | 14 ++++++++++++-- .../commands/import_swissnames3d_places.py | 12 +++++++++++- homebytwo/importers/swissnames3d.py | 5 +++-- homebytwo/importers/tests/test_import_places.py | 15 ++++++++------- homebytwo/importers/utils.py | 6 ++++-- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/homebytwo/importers/geonames.py b/homebytwo/importers/geonames.py index cc2abf7f..c53b015c 100644 --- a/homebytwo/importers/geonames.py +++ b/homebytwo/importers/geonames.py @@ -14,7 +14,9 @@ def import_places_from_geonames( - scope: str = "allCountries", file: Optional[TextIOWrapper] = None + scope: str = "allCountries", + file: Optional[TextIOWrapper] = None, + update: bool = False, ) -> str: """ import places from https://www.geonames.org/ @@ -23,6 +25,7 @@ def import_places_from_geonames( see https://www.geonames.org/countries/), e.g. `CH` or `allCountries` :param file: path to local unzipped file. If provided, the `scope` parameter will be ignored and the local file will be used. + :param update: should existing places be updated with the downloaded data. """ try: file = file or get_geonames_remote_file(scope) @@ -34,7 +37,7 @@ def import_places_from_geonames( count = get_csv_line_count(file, header=False) data = parse_places_from_csv(file) - return save_places_from_generator(data, count) + return save_places_from_generator(data, count, update=update) def get_geonames_remote_file(scope: str = "allCountries") -> TextIOWrapper: diff --git a/homebytwo/importers/management/commands/import_geonames_places.py b/homebytwo/importers/management/commands/import_geonames_places.py index fa0ad7ab..1e6ee2d3 100644 --- a/homebytwo/importers/management/commands/import_geonames_places.py +++ b/homebytwo/importers/management/commands/import_geonames_places.py @@ -29,16 +29,26 @@ def add_arguments(self, parser): help="Choose countries to import from, e.g. FR. ", ) + # update existing places + parser.add_argument( + "-u", + "--update", + action="store_true", + default=False, + help="Update existing places with remote data. ", + ) + def handle(self, *args, **options): + update = options["update"] files = options["files"] or [] for file in files: - msg = import_places_from_geonames(file=file) + msg = import_places_from_geonames(file=file, update=update) self.stdout.write(self.style.SUCCESS(msg)) countries = options["countries"] or [] for country in countries: - msg = import_places_from_geonames(scope=country) + msg = import_places_from_geonames(scope=country, update=update) self.stdout.write(self.style.SUCCESS(msg)) if not files and not countries: diff --git a/homebytwo/importers/management/commands/import_swissnames3d_places.py b/homebytwo/importers/management/commands/import_swissnames3d_places.py index f246d394..e4ee7e44 100644 --- a/homebytwo/importers/management/commands/import_swissnames3d_places.py +++ b/homebytwo/importers/management/commands/import_swissnames3d_places.py @@ -30,8 +30,18 @@ def add_arguments(self, parser): help="Choose a swiss projection LV95 (default) or LV03. ", ) + # update existing places + parser.add_argument( + "-u", + "--update", + action="store_true", + default=False, + help="Update existing places with remote data. ", + ) + def handle(self, *args, **options): file = options["file"] projection = options["projection"] - msg = import_places_from_swissnames3d(file=file, projection=projection) + update = options["update"] + msg = import_places_from_swissnames3d(projection, file, update) self.stdout.write(self.style.SUCCESS(msg)) diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 8497e1ff..0cb873b9 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -54,7 +54,7 @@ def import_places_from_swissnames3d( - projection: str = "LV95", file: Optional[TextIOWrapper] = None + projection: str = "LV95", file: Optional[TextIOWrapper] = None, update: bool = False ) -> str: """ import places from SwissNAMES3D @@ -63,6 +63,7 @@ def import_places_from_swissnames3d( see http://mapref.org/CoordinateReferenceFrameChangeLV03.LV95.html#Zweig1098 :param file: path to local unzipped file. if provided, the `projection` parameter will be ignored. + :param update: should existing places be updated with the downloaded data. """ try: file = file or get_swissnames3d_remote_file(projection=projection) @@ -74,7 +75,7 @@ def import_places_from_swissnames3d( count = get_csv_line_count(file, header=True) data = parse_places_from_csv(file, projection=projection) - return save_places_from_generator(data=data, count=count) + return save_places_from_generator(data=data, count=count, update=update) def get_swissnames3d_remote_file(projection: str = "LV95") -> TextIOWrapper: diff --git a/homebytwo/importers/tests/test_import_places.py b/homebytwo/importers/tests/test_import_places.py index 0992e5e5..291772aa 100644 --- a/homebytwo/importers/tests/test_import_places.py +++ b/homebytwo/importers/tests/test_import_places.py @@ -77,7 +77,7 @@ def test_save_places_from_generator(): for place in places ) msg = "Created 20 new places and updated 5 places. " - assert save_places_from_generator(data, count=20) == msg + assert save_places_from_generator(data, count=20, update=True) == msg assert Place.objects.count() == 25 @@ -86,7 +86,7 @@ def test_save_places_from_generator_empty(): places = [] data = (place for place in places) msg = "Created 0 new places and updated 0 places. " - assert save_places_from_generator(data, count=0) == msg + assert save_places_from_generator(data, count=0, update=False) == msg assert Place.objects.count() == 0 @@ -109,7 +109,7 @@ def test_save_places_from_generator_bad_place_type(capsys): for place in [place] ) msg = "Created 0 new places and updated 0 places. " - assert save_places_from_generator(data, count=1) == msg + assert save_places_from_generator(data, count=1, update=True) == msg captured = capsys.readouterr() assert "Place type code: BADCODE does not exist.\n" in captured.out assert Place.objects.count() == 0 @@ -188,7 +188,7 @@ def test_unzip_swissnames3d_remote_file(open_file): @pytest.mark.django_db def test_import_places_from_swissnames3d(open_file): file = open_file("swissnames3d_LV03_test.csv") - msg = "Created 146 new places and updated 46 places. " + msg = "Created 146 new places and updated 0 places. " assert import_places_from_swissnames3d(projection="LV03", file=file) == msg @@ -226,6 +226,7 @@ def test_import_geonames_places_multiple( "LI", "ZZ", "XX", + "--update", "-f", file_path.as_posix(), stdout=out, @@ -258,7 +259,7 @@ def test_import_swissnames3d_places(mock_zip_response): out = StringIO() call_command("import_swissnames3d_places", stdout=out) - msg = "Created 146 new places and updated 46 places. " + msg = "Created 146 new places and updated 0 places. " assert msg in out.getvalue() assert Place.objects.filter(data_source="swissnames3d").count() == 146 @@ -271,7 +272,7 @@ def test_import_swissnames3d_places_projection(mock_zip_response): out = StringIO() call_command("import_swissnames3d_places", "-p", "LV03", stdout=out) - msg = "Created 146 new places and updated 46 places. " + msg = "Created 146 new places and updated 0 places. " assert msg in out.getvalue() assert Place.objects.filter(data_source="swissnames3d").count() == 146 @@ -280,7 +281,7 @@ def test_import_swissnames3d_places_projection(mock_zip_response): def test_import_swissnames3d_places_file(current_dir_path): file_path = current_dir_path / "data/swissnames3d_LV95_test.csv" out = StringIO() - call_command("import_swissnames3d_places", "-f", file_path.as_posix(), stdout=out) + call_command("import_swissnames3d_places", "-u", "-f", file_path.as_posix(), stdout=out) msg = "Created 146 new places and updated 46 places. " assert msg in out.getvalue() diff --git a/homebytwo/importers/utils.py b/homebytwo/importers/utils.py index 2d1ec1b3..e1684548 100644 --- a/homebytwo/importers/utils.py +++ b/homebytwo/importers/utils.py @@ -145,7 +145,9 @@ def get_csv_line_count(csv_file: TextIOWrapper, header: bool) -> int: return max(count - int(header), 0) -def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: +def save_places_from_generator( + data: Iterator[PlaceTuple], count: int, update: bool +) -> str: """ Save places from csv parsers in geonames.py or swissnames3d.py """ @@ -189,7 +191,7 @@ def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: created_counter += 1 # update existing place with default values - else: + elif update: for key, value in default_values.items(): setattr(local_place, key, value) local_place.save() From f23f45bb3f8ffc85b1dbda164ded65290126b1bf Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 2 Nov 2020 12:35:19 +0200 Subject: [PATCH 04/21] HB2-66 update provisioning and readme --- readme.md | 47 +++++++------------ virtualization/playbook.yml | 1 - .../roles/swissnames3d/tasks/main.yml | 35 -------------- 3 files changed, 16 insertions(+), 67 deletions(-) delete mode 100644 virtualization/roles/swissnames3d/tasks/main.yml diff --git a/readme.md b/readme.md index d2917967..8432fb08 100644 --- a/readme.md +++ b/readme.md @@ -63,7 +63,7 @@ $ ./manage.py runserver Open Home by two in your browser: -http://homebytwo.lo +http://local.homebytwo.ch ## Create superuser @@ -74,51 +74,36 @@ To create an initial user, you can user the create superuser function. $ ./manage.py createsuperuser ``` +## Import Places from SwissNAMES3D or geonames.org -## Run Tests +In order to find places along routes, homebytwo requires places in the database. + +For Switzerland, places should be imported from [SwissNAMES3D](https://opendata.swiss/en/dataset/swissnames3d-geografische-namen-der-landesvermessung). +The import of more than 300.000 places takes about 30 minutes: ```sh -$ vagrant ssh -$ tox +$ ./manage.py import_swissnames3d_places ``` -## Add a requirement - -Add the requirement to the `requirements/xxx.in` file, and then run `make requirements` (from inside the box) to update -the `.txt` files and install the requirement(s) in the virtual environment. - - -## Import Places from SwissNAMES3D - -Importing the SwissNAMES3D points database is now part of the provisioning script. -If you need to, you can also do it manually: - -Dowload the shapefile from [opendata.swiss](https://opendata.swiss/en/dataset/swissnames3d-geografische-namen-der-landesvermessung), the file is about 390.21M: +Thanks to [geonames.org](https://www.geonames.org), you can also places from other countries: ```sh -$ vagrant ssh -$ wget -O /tmp/data.zip http://data.geo.admin.ch/ch.swisstopo.swissnames3d/data.zip && cd /tmp +$ ./manage.py import_geonames_places ES FR DE IT ``` -Unzip the data twice and move it to the media folder: + +## Run Tests ```sh -$ unzip data.zip swissNAMES3D_LV03.zip -$ unzip swissNAMES3D_LV03.zip swissNAMES3D_LV03/shp_LV03_LN02/swissNAMES3D_PKT.* -$ mkdir -p /vagrant/homebytwo/media/shapefiles && mv swissNAMES3D_LV03/shp_LV03_LN02/swissNAMES3D_PKT.* /vagrant/homebytwo/media/shapefiles/ +$ vagrant ssh +$ tox ``` -Cleanup and go back to the project root: - -``` -$ rm -rf data.zip swissNAMES3D_LV03.zip swissNAMES3D_LV03 && cd /vagrant/ -``` +## Add a requirement -Run the importer command: +Add the requirement to the `requirements/xxx.in` file, and then run `make requirements` (from inside the box) to update +the `.txt` files and install the requirement(s) in the virtual environment. -```sh -$ ./manage.py importswissnames3d homebytwo/media/shapefiles/swissNAMES3D_PKT.shp -``` ## Managing Celery diff --git a/virtualization/playbook.yml b/virtualization/playbook.yml index 69c63e33..eb9860f4 100644 --- a/virtualization/playbook.yml +++ b/virtualization/playbook.yml @@ -12,7 +12,6 @@ - { role: rabbitmq } - { role: webpack } - { role: homebytwo_env } - - { role: swissnames3d } tasks: - name: Ensure celery service exists diff --git a/virtualization/roles/swissnames3d/tasks/main.yml b/virtualization/roles/swissnames3d/tasks/main.yml deleted file mode 100644 index 4efda407..00000000 --- a/virtualization/roles/swissnames3d/tasks/main.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Download swissNAMES3D Data from Swiss Topo -- name: create temporary dir for dowloading swissnames3d data - file: - path: /tmp/sn3d - state: directory - -- name: download and extract nested archive from swisstopo - unarchive: - src: "http://data.geo.admin.ch/ch.swisstopo.swissnames3d/data.zip" - dest: "/tmp/sn3d/" - creates: "/tmp/sn3d/swissNAMES3D_LV03.zip" - remote_src: yes - exclude: - - swissNAMES3D_LV95.zip - -- name: Extract shapefiles from swissnames3d archive - unarchive: - src: "/tmp/sn3d/swissNAMES3D_LV03.zip" - dest: "/tmp/sn3d/" - creates: "/tmp/sn3d/swissNAMES3D_LV03/" - -- name: copy shapefiles to media folder - copy: - src: "{{ item }}" - dest: "{{ django_root }}{{ project_name}}/media" - with_fileglob: - - "/tmp/sn3d/swissNAMES3D_LV03/shp_LV03_LN02/swissNAMES3D_PKT.*" - -- name: import places from shapefile - command: "{{ env_root }}/bin/python {{ django_root }}manage.py importswissnames3d --no-input --delete {{ django_root }}{{ project_name}}/media/swissNAMES3D_PKT.shp" - -- name: remove temporary directory - file: - path: "/tmp/sn3d/" - state: absent From 19519696c58ae82183183d07fd0d394ea9db9a67 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 2 Nov 2020 13:26:02 +0200 Subject: [PATCH 05/21] HB2-66 update requirements --- requirements/base.txt | 39 ++++++++++++++++--------------- requirements/deploy.txt | 2 +- requirements/dev.txt | 51 +++++++++++++++++++++-------------------- requirements/test.txt | 51 +++++++++++++++++++++-------------------- 4 files changed, 73 insertions(+), 70 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 1020b953..9af76d5e 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -6,10 +6,10 @@ # -e git+git://github.com/JohanWieslander/garmin-uploader@master#egg=garmin-uploader # via -r requirements/base.in amqp==5.0.1 # via kombu -arrow==0.16.0 # via stravalib +arrow==0.17.0 # via stravalib attrs==19.3.0 # via codaio billiard==3.6.3.0 # via celery -celery==5.0.0 # via -r requirements/base.in, flower +celery==5.0.1 # via -r requirements/base.in, flower certifi==2020.6.20 # via requests, sentry-sdk cffi==1.14.3 # via cryptography chardet==3.0.4 # via requests @@ -17,60 +17,61 @@ click-didyoumean==0.0.3 # via celery click-repl==0.1.6 # via celery click==7.1.2 # via celery, click-didyoumean, click-repl codaio==0.6.3 # via -r requirements/base.in -cryptography==3.1.1 # via social-auth-core +cryptography==3.2.1 # via social-auth-core decorator==4.4.2 # via codaio defusedxml==0.6.0 # via python3-openid, social-auth-core dj-database-url==0.5.0 # via -r requirements/base.in -django-geojson==3.0.0 # via -r requirements/base.in +django-geojson==3.1.0 # via -r requirements/base.in django-leaflet==0.27.1 # via -r requirements/base.in django-widget-tweaks==1.4.8 # via -r requirements/base.in -django==2.2.16 # via -r requirements/base.in, django-geojson, django-leaflet, easy-thumbnails +django==2.2.17 # via -r requirements/base.in, django-geojson, django-leaflet, easy-thumbnails easy-thumbnails==2.7 # via -r requirements/base.in envparse==0.2.0 # via codaio flower==0.9.5 # via -r requirements/base.in future==0.18.2 # via -r requirements/base.in gpxpy==1.4.2 # via -r requirements/base.in gunicorn==20.0.4 # via -r requirements/base.in -humanize==3.0.1 # via flower +humanize==3.1.0 # via flower idna==2.10 # via requests importlib-metadata==2.0.0 # via kombu inflection==0.3.1 # via codaio joblib==0.17.0 # via scikit-learn kombu==5.0.2 # via celery -lxml==4.5.2 # via -r requirements/base.in +lxml==4.6.1 # via -r requirements/base.in numexpr==2.7.1 # via tables -numpy==1.19.2 # via numexpr, pandas, scikit-learn, scipy, tables +numpy==1.19.3 # via numexpr, pandas, scikit-learn, scipy, tables oauthlib==3.1.0 # via requests-oauthlib, social-auth-core -pandas==1.1.3 # via -r requirements/base.in -pillow==7.2.0 # via -r requirements/base.in, easy-thumbnails +pandas==1.1.4 # via -r requirements/base.in +pillow==8.0.1 # via -r requirements/base.in, easy-thumbnails polyline==1.4.0 # via -r requirements/base.in prometheus-client==0.8.0 # via flower -prompt-toolkit==3.0.7 # via click-repl +prompt-toolkit==3.0.8 # via click-repl psycopg2-binary==2.8.6 # via -r requirements/base.in pycparser==2.20 # via cffi pyjwt==1.7.1 # via social-auth-core python-dateutil==2.8.1 # via arrow, codaio, pandas python3-openid==3.2.0 # via social-auth-core -pytz==2020.1 # via celery, django, flower, pandas, stravalib +pytz==2020.4 # via celery, django, flower, pandas, stravalib rcssmin==1.0.6 # via -r requirements/base.in requests-oauthlib==1.3.0 # via social-auth-core requests==2.24.0 # via -r requirements/base.in, codaio, garmin-uploader, requests-oauthlib, social-auth-core, stravalib scikit-learn==0.23.2 # via -r requirements/base.in -scipy==1.5.2 # via scikit-learn -sentry-sdk==0.18.0 # via -r requirements/base.in -six==1.15.0 # via click-repl, cryptography, django-geojson, garmin-uploader, polyline, python-dateutil, social-auth-app-django, social-auth-core, stravalib +scipy==1.5.3 # via scikit-learn +sentry-sdk==0.19.1 # via -r requirements/base.in +six==1.15.0 # via click-repl, cryptography, garmin-uploader, polyline, python-dateutil, social-auth-app-django, social-auth-core, stravalib social-auth-app-django==4.0.0 # via -r requirements/base.in social-auth-core==3.3.3 # via -r requirements/base.in, social-auth-app-django -sqlparse==0.3.1 # via django +sqlparse==0.4.1 # via django stravalib==0.10.2 # via -r requirements/base.in tables==3.6.1 # via -r requirements/base.in threadpoolctl==2.1.0 # via scikit-learn -tornado==6.0.4 # via flower +tornado==6.1 # via flower +tqdm==4.51.0 # via -r requirements/base.in units==0.7 # via stravalib -urllib3==1.25.10 # via requests, sentry-sdk +urllib3==1.25.11 # via requests, sentry-sdk vine==5.0.0 # via amqp, celery wcwidth==0.2.5 # via prompt-toolkit -zipp==3.3.0 # via importlib-metadata +zipp==3.4.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/deploy.txt b/requirements/deploy.txt index 9a5dd49f..7a4de64e 100644 --- a/requirements/deploy.txt +++ b/requirements/deploy.txt @@ -6,7 +6,7 @@ # bcrypt==3.2.0 # via paramiko cffi==1.14.3 # via bcrypt, cryptography, pynacl -cryptography==3.1.1 # via paramiko +cryptography==3.2.1 # via paramiko dj-database-url==0.5.0 # via -r requirements/deploy.in fabric3==1.14.post1 # via -r requirements/deploy.in gitric==0.4 # via -r requirements/deploy.in diff --git a/requirements/dev.txt b/requirements/dev.txt index 2a1b54d0..c79ca5de 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -7,12 +7,12 @@ -e git+git://github.com/JohanWieslander/garmin-uploader@master#egg=garmin-uploader # via -r requirements/base.in amqp==5.0.1 # via kombu appdirs==1.4.4 # via virtualenv -arrow==0.16.0 # via stravalib +arrow==0.17.0 # via stravalib attrs==19.3.0 # via codaio backcall==0.2.0 # via ipython bcrypt==3.2.0 # via paramiko billiard==3.6.3.0 # via celery -celery==5.0.0 # via -r requirements/base.in, flower +celery==5.0.1 # via -r requirements/base.in, flower certifi==2020.6.20 # via requests, sentry-sdk cffi==1.14.3 # via bcrypt, cryptography, pynacl chardet==3.0.4 # via requests @@ -20,7 +20,7 @@ click-didyoumean==0.0.3 # via celery click-repl==0.1.6 # via celery click==7.1.2 # via celery, click-didyoumean, click-repl, pip-tools codaio==0.6.3 # via -r requirements/base.in -cryptography==3.1.1 # via paramiko, social-auth-core +cryptography==3.2.1 # via paramiko, social-auth-core decorator==4.4.2 # via codaio, ipython defusedxml==0.6.0 # via python3-openid, social-auth-core distlib==0.3.1 # via virtualenv @@ -28,10 +28,10 @@ dj-database-url==0.5.0 # via -r requirements/base.in django-appconf==1.0.4 # via -r requirements/dev.in django-debug-toolbar==3.1.1 # via -r requirements/dev.in django-extensions==3.0.9 # via -r requirements/dev.in -django-geojson==3.0.0 # via -r requirements/base.in +django-geojson==3.1.0 # via -r requirements/base.in django-leaflet==0.27.1 # via -r requirements/base.in django-widget-tweaks==1.4.8 # via -r requirements/base.in -django==2.2.16 # via -r requirements/base.in, django-appconf, django-debug-toolbar, django-geojson, django-leaflet, easy-thumbnails +django==2.2.17 # via -r requirements/base.in, django-appconf, django-debug-toolbar, django-geojson, django-leaflet, easy-thumbnails easy-thumbnails==2.7 # via -r requirements/base.in envparse==0.2.0 # via codaio fabric3==1.14.post1 # via -r requirements/dev.in @@ -41,66 +41,67 @@ future==0.18.2 # via -r requirements/base.in gitric==0.4 # via -r requirements/dev.in gpxpy==1.4.2 # via -r requirements/base.in gunicorn==20.0.4 # via -r requirements/base.in -humanize==3.0.1 # via flower +humanize==3.1.0 # via flower idna==2.10 # via requests importlib-metadata==2.0.0 # via kombu, pluggy, tox, virtualenv inflection==0.3.1 # via codaio ipython-genutils==0.2.0 # via traitlets -ipython==7.18.1 # via -r requirements/dev.in +ipython==7.19.0 # via -r requirements/dev.in jedi==0.17.2 # via ipython joblib==0.17.0 # via scikit-learn kombu==5.0.2 # via celery -lxml==4.5.2 # via -r requirements/base.in +lxml==4.6.1 # via -r requirements/base.in numexpr==2.7.1 # via tables -numpy==1.19.2 # via numexpr, pandas, scikit-learn, scipy, tables +numpy==1.19.3 # via numexpr, pandas, scikit-learn, scipy, tables oauthlib==3.1.0 # via requests-oauthlib, social-auth-core packaging==20.4 # via tox -pandas==1.1.3 # via -r requirements/base.in +pandas==1.1.4 # via -r requirements/base.in paramiko==2.7.2 # via fabric3 parso==0.7.1 # via jedi pexpect==4.8.0 # via ipython pickleshare==0.7.5 # via ipython -pillow==7.2.0 # via -r requirements/base.in, easy-thumbnails +pillow==8.0.1 # via -r requirements/base.in, easy-thumbnails pip-tools==5.3.1 # via -r requirements/dev.in pluggy==0.13.1 # via tox polyline==1.4.0 # via -r requirements/base.in prometheus-client==0.8.0 # via flower -prompt-toolkit==3.0.7 # via click-repl, ipython +prompt-toolkit==3.0.8 # via click-repl, ipython psycopg2-binary==2.8.6 # via -r requirements/base.in ptyprocess==0.6.0 # via pexpect py==1.9.0 # via tox pycparser==2.20 # via cffi -pygments==2.7.1 # via ipython +pygments==2.7.2 # via ipython pyjwt==1.7.1 # via social-auth-core pynacl==1.4.0 # via paramiko pyparsing==2.4.7 # via packaging python-dateutil==2.8.1 # via arrow, codaio, pandas python3-openid==3.2.0 # via social-auth-core -pytz==2020.1 # via celery, django, flower, pandas, stravalib +pytz==2020.4 # via celery, django, flower, pandas, stravalib rcssmin==1.0.6 # via -r requirements/base.in requests-oauthlib==1.3.0 # via social-auth-core requests==2.24.0 # via -r requirements/base.in, codaio, garmin-uploader, requests-oauthlib, social-auth-core, stravalib scikit-learn==0.23.2 # via -r requirements/base.in -scipy==1.5.2 # via scikit-learn -sentry-sdk==0.18.0 # via -r requirements/base.in -six==1.15.0 # via bcrypt, click-repl, cryptography, django-geojson, fabric3, garmin-uploader, packaging, pip-tools, polyline, pynacl, python-dateutil, social-auth-app-django, social-auth-core, stravalib, tox, virtualenv +scipy==1.5.3 # via scikit-learn +sentry-sdk==0.19.1 # via -r requirements/base.in +six==1.15.0 # via bcrypt, click-repl, cryptography, fabric3, garmin-uploader, packaging, pip-tools, polyline, pynacl, python-dateutil, social-auth-app-django, social-auth-core, stravalib, tox, virtualenv social-auth-app-django==4.0.0 # via -r requirements/base.in social-auth-core==3.3.3 # via -r requirements/base.in, social-auth-app-django -sqlparse==0.3.1 # via django, django-debug-toolbar +sqlparse==0.4.1 # via django, django-debug-toolbar stravalib==0.10.2 # via -r requirements/base.in tables==3.6.1 # via -r requirements/base.in threadpoolctl==2.1.0 # via scikit-learn -toml==0.10.1 # via tox -tornado==6.0.4 # via flower -tox==3.20.0 # via -r requirements/dev.in -traitlets==5.0.4 # via ipython +toml==0.10.2 # via tox +tornado==6.1 # via flower +tox==3.20.1 # via -r requirements/dev.in +tqdm==4.51.0 # via -r requirements/base.in +traitlets==5.0.5 # via ipython units==0.7 # via stravalib -urllib3==1.25.10 # via requests, sentry-sdk +urllib3==1.25.11 # via requests, sentry-sdk vine==5.0.0 # via amqp, celery -virtualenv==20.0.33 # via tox +virtualenv==20.1.0 # via tox wcwidth==0.2.5 # via prompt-toolkit werkzeug==1.0.1 # via -r requirements/dev.in -zipp==3.3.0 # via importlib-metadata +zipp==3.4.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/test.txt b/requirements/test.txt index a7ff6e5d..7295f383 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -7,10 +7,10 @@ -e git+git://github.com/JohanWieslander/garmin-uploader@master#egg=garmin-uploader # via -r requirements/base.in amqp==5.0.1 # via kombu apipkg==1.5 # via execnet -arrow==0.16.0 # via stravalib +arrow==0.17.0 # via stravalib attrs==19.3.0 # via codaio, pytest billiard==3.6.3.0 # via celery -celery==5.0.0 # via -r requirements/base.in, flower +celery==5.0.1 # via -r requirements/base.in, flower certifi==2020.6.20 # via requests, sentry-sdk cffi==1.14.3 # via cryptography chardet==3.0.4 # via requests @@ -20,46 +20,46 @@ click==7.1.2 # via celery, click-didyoumean, click-repl codaio==0.6.3 # via -r requirements/base.in coverage==5.3 # via -r requirements/test.in, coveralls, pytest-cov coveralls==2.1.2 # via -r requirements/test.in -cryptography==3.1.1 # via social-auth-core +cryptography==3.2.1 # via social-auth-core decorator==4.4.2 # via codaio defusedxml==0.6.0 # via python3-openid, social-auth-core dj-database-url==0.5.0 # via -r requirements/base.in -django-geojson==3.0.0 # via -r requirements/base.in +django-geojson==3.1.0 # via -r requirements/base.in django-leaflet==0.27.1 # via -r requirements/base.in django-widget-tweaks==1.4.8 # via -r requirements/base.in -django==2.2.16 # via -r requirements/base.in, django-geojson, django-leaflet, easy-thumbnails +django==2.2.17 # via -r requirements/base.in, django-geojson, django-leaflet, easy-thumbnails docopt==0.6.2 # via coveralls easy-thumbnails==2.7 # via -r requirements/base.in envparse==0.2.0 # via codaio execnet==1.7.1 # via pytest-xdist factory-boy==3.0.1 # via -r requirements/test.in -faker==4.4.0 # via factory-boy +faker==4.14.0 # via factory-boy flake8==3.8.4 # via -r requirements/test.in flower==0.9.5 # via -r requirements/base.in future==0.18.2 # via -r requirements/base.in gpxpy==1.4.2 # via -r requirements/base.in gunicorn==20.0.4 # via -r requirements/base.in -humanize==3.0.1 # via flower +humanize==3.1.0 # via flower idna==2.10 # via requests importlib-metadata==2.0.0 # via flake8, kombu, pluggy, pytest inflection==0.3.1 # via codaio -iniconfig==1.0.1 # via pytest -isort==5.5.4 # via -r requirements/test.in +iniconfig==1.1.1 # via pytest +isort==5.6.4 # via -r requirements/test.in joblib==0.17.0 # via scikit-learn kombu==5.0.2 # via celery -lxml==4.5.2 # via -r requirements/base.in +lxml==4.6.1 # via -r requirements/base.in mccabe==0.6.1 # via flake8 mock==4.0.2 # via -r requirements/test.in numexpr==2.7.1 # via tables -numpy==1.19.2 # via numexpr, pandas, scikit-learn, scipy, tables +numpy==1.19.3 # via numexpr, pandas, scikit-learn, scipy, tables oauthlib==3.1.0 # via requests-oauthlib, social-auth-core packaging==20.4 # via pytest -pandas==1.1.3 # via -r requirements/base.in -pillow==7.2.0 # via -r requirements/base.in, easy-thumbnails +pandas==1.1.4 # via -r requirements/base.in +pillow==8.0.1 # via -r requirements/base.in, easy-thumbnails pluggy==0.13.1 # via pytest polyline==1.4.0 # via -r requirements/base.in prometheus-client==0.8.0 # via flower -prompt-toolkit==3.0.7 # via click-repl +prompt-toolkit==3.0.8 # via click-repl psycopg2-binary==2.8.6 # via -r requirements/base.in py==1.9.0 # via pytest, pytest-forked pycodestyle==2.6.0 # via flake8 @@ -68,37 +68,38 @@ pyflakes==2.2.0 # via flake8 pyjwt==1.7.1 # via social-auth-core pyparsing==2.4.7 # via packaging pytest-cov==2.10.1 # via -r requirements/test.in -pytest-django==3.10.0 # via -r requirements/test.in +pytest-django==4.1.0 # via -r requirements/test.in pytest-env==0.6.2 # via -r requirements/test.in pytest-forked==1.3.0 # via pytest-xdist pytest-mock==3.3.1 # via -r requirements/test.in pytest-xdist==2.1.0 # via -r requirements/test.in -pytest==6.1.1 # via -r requirements/test.in, pytest-cov, pytest-django, pytest-env, pytest-forked, pytest-mock, pytest-xdist +pytest==6.1.2 # via -r requirements/test.in, pytest-cov, pytest-django, pytest-env, pytest-forked, pytest-mock, pytest-xdist python-dateutil==2.8.1 # via arrow, codaio, faker, pandas python3-openid==3.2.0 # via social-auth-core -pytz==2020.1 # via celery, django, flower, pandas, stravalib +pytz==2020.4 # via celery, django, flower, pandas, stravalib rcssmin==1.0.6 # via -r requirements/base.in requests-oauthlib==1.3.0 # via social-auth-core requests==2.24.0 # via -r requirements/base.in, codaio, coveralls, garmin-uploader, requests-oauthlib, responses, social-auth-core, stravalib responses==0.12.0 # via -r requirements/test.in scikit-learn==0.23.2 # via -r requirements/base.in -scipy==1.5.2 # via scikit-learn -sentry-sdk==0.18.0 # via -r requirements/base.in -six==1.15.0 # via click-repl, cryptography, django-geojson, garmin-uploader, packaging, polyline, python-dateutil, responses, social-auth-app-django, social-auth-core, stravalib +scipy==1.5.3 # via scikit-learn +sentry-sdk==0.19.1 # via -r requirements/base.in +six==1.15.0 # via click-repl, cryptography, garmin-uploader, packaging, polyline, python-dateutil, responses, social-auth-app-django, social-auth-core, stravalib social-auth-app-django==4.0.0 # via -r requirements/base.in social-auth-core==3.3.3 # via -r requirements/base.in, social-auth-app-django -sqlparse==0.3.1 # via django +sqlparse==0.4.1 # via django stravalib==0.10.2 # via -r requirements/base.in tables==3.6.1 # via -r requirements/base.in text-unidecode==1.3 # via faker threadpoolctl==2.1.0 # via scikit-learn -toml==0.10.1 # via pytest -tornado==6.0.4 # via flower +toml==0.10.2 # via pytest +tornado==6.1 # via flower +tqdm==4.51.0 # via -r requirements/base.in units==0.7 # via stravalib -urllib3==1.25.10 # via requests, responses, sentry-sdk +urllib3==1.25.11 # via requests, responses, sentry-sdk vine==5.0.0 # via amqp, celery wcwidth==0.2.5 # via prompt-toolkit -zipp==3.3.0 # via importlib-metadata +zipp==3.4.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools From e7ec976f0fe812b1358bf0d8afce349a42789529 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 2 Nov 2020 22:45:38 +0200 Subject: [PATCH 06/21] HB2-66 use tempfile for downloads instead of BytesIO --- homebytwo/importers/geonames.py | 7 ++++--- homebytwo/importers/swissnames3d.py | 7 ++++--- homebytwo/importers/utils.py | 9 +++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/homebytwo/importers/geonames.py b/homebytwo/importers/geonames.py index c53b015c..9c9879cd 100644 --- a/homebytwo/importers/geonames.py +++ b/homebytwo/importers/geonames.py @@ -34,10 +34,11 @@ def import_places_from_geonames( except ConnectionError: return f"Error connecting to {PLACE_DATA_URL.format(scope=scope)}. " - count = get_csv_line_count(file, header=False) - data = parse_places_from_csv(file) + with file: + count = get_csv_line_count(file, header=False) + data = parse_places_from_csv(file) - return save_places_from_generator(data, count, update=update) + return save_places_from_generator(data, count, update=update) def get_geonames_remote_file(scope: str = "allCountries") -> TextIOWrapper: diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 0cb873b9..46f6bc86 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -72,10 +72,11 @@ def import_places_from_swissnames3d( except ConnectionError: return f"Error connecting to {PLACE_DATA_URL}. " - count = get_csv_line_count(file, header=True) - data = parse_places_from_csv(file, projection=projection) + with file: + count = get_csv_line_count(file, header=True) + data = parse_places_from_csv(file, projection=projection) - return save_places_from_generator(data=data, count=count, update=update) + return save_places_from_generator(data=data, count=count, update=update) def get_swissnames3d_remote_file(projection: str = "LV95") -> TextIOWrapper: diff --git a/homebytwo/importers/utils.py b/homebytwo/importers/utils.py index e1684548..d59cf44b 100644 --- a/homebytwo/importers/utils.py +++ b/homebytwo/importers/utils.py @@ -1,5 +1,6 @@ import csv -from io import BytesIO, TextIOWrapper +from tempfile import TemporaryFile +from io import TextIOWrapper from typing import Iterator from zipfile import ZipFile @@ -116,7 +117,7 @@ def download_zip_file(url: str) -> ZipFile: """ block_size = 1024 - bytes_io = BytesIO() + tmp_file = TemporaryFile() with Session() as session: response = session.get(url, stream=True) @@ -130,9 +131,9 @@ def download_zip_file(url: str) -> ZipFile: unit_scale=block_size, desc=f"downloading from {url}", ): - bytes_io.write(data) + tmp_file.write(data) - return ZipFile(bytes_io) + return ZipFile(tmp_file) def get_csv_line_count(csv_file: TextIOWrapper, header: bool) -> int: From b4ba3b5ddff764fded904187c7ecc0af83d1e572 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Thu, 5 Nov 2020 09:08:23 +0200 Subject: [PATCH 07/21] HB2-66 add country field to places --- homebytwo/importers/geonames.py | 1 + homebytwo/importers/swissnames3d.py | 1 + .../importers/tests/test_import_places.py | 2 + .../0051_create_place_type_model.py | 61 +++++++++++++++++-- .../routes/migrations/0052_place_country.py | 18 ++++++ homebytwo/routes/models/place.py | 4 +- homebytwo/routes/tests/factories.py | 23 ++++--- 7 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 homebytwo/routes/migrations/0052_place_country.py diff --git a/homebytwo/importers/geonames.py b/homebytwo/importers/geonames.py index 9c9879cd..181c874e 100644 --- a/homebytwo/importers/geonames.py +++ b/homebytwo/importers/geonames.py @@ -94,6 +94,7 @@ def parse_places_from_csv(file: IO) -> Iterator[PlaceTuple]: data_source="geonames", source_id=int(row[0]), name=row[1], + country=row[8], latitude=float(row[4]), longitude=float(row[5]), place_type=row[7], diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 46f6bc86..846a30c2 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -139,6 +139,7 @@ def parse_places_from_csv( data_source="swissnames3d", source_id=row[0], name=row[6], + country="CH", longitude=float(row[11]), latitude=float(row[12]), place_type=PLACE_TYPE_TRANSLATIONS[row[1]], diff --git a/homebytwo/importers/tests/test_import_places.py b/homebytwo/importers/tests/test_import_places.py index 291772aa..15f57314 100644 --- a/homebytwo/importers/tests/test_import_places.py +++ b/homebytwo/importers/tests/test_import_places.py @@ -70,6 +70,7 @@ def test_save_places_from_generator(): latitude=place.geom.y, longitude=place.geom.x, altitude=place.altitude, + country=place.country, source_id=place.source_id, data_source=place.data_source, srid=4326, @@ -102,6 +103,7 @@ def test_save_places_from_generator_bad_place_type(capsys): latitude=place.geom.y, longitude=place.geom.x, altitude=place.altitude, + country=place.country, source_id=place.source_id, data_source=place.data_source, srid=4326, diff --git a/homebytwo/routes/migrations/0051_create_place_type_model.py b/homebytwo/routes/migrations/0051_create_place_type_model.py index ce74bccf..3582777d 100644 --- a/homebytwo/routes/migrations/0051_create_place_type_model.py +++ b/homebytwo/routes/migrations/0051_create_place_type_model.py @@ -1,16 +1,19 @@ # Generated by Django 2.2.16 on 2020-10-24 12:28 -from django.contrib.gis.geos import Point +from collections import namedtuple + from django.db import migrations, models from tqdm import tqdm from homebytwo.importers.geonames import update_place_types_from_geonames +PlaceTypeTuple = namedtuple("PlaceType", ["code", "place_class", "name", "description"]) + PLACE_TYPE_TRANSLATIONS = { - "BDG": "BLDG", + "BDG": "SBDG", "BEL": "CLF", "BLD": "RK", - "BOA": "LDNG", + "BOA": "BOSTP", "BUS": "BUSTP", "C24": "PSTB", "C24LT": "PSTB", @@ -27,7 +30,7 @@ "LST": "TRANT", "MNT": "MNMT", "OBG": "BLDG", - "OTH": "RSTP", + "OTH": "OSTP", "PAS": "PASS", "PLA": "PPL", "POV": "PROM", @@ -46,6 +49,53 @@ def import_place_types_from_geonames(apps, schema_editor): update_place_types_from_geonames() +def import_place_types_for_swissnames3d(apps, schema_editor): + PlaceType = apps.get_model("routes", "PlaceType") + + swissnames3d_types = [ + PlaceTypeTuple( + code="SBDG", + place_class="S", + name="sacred building", + description=( + " sacred building of a particular religion or denomination " + "(church, mosque, synagogue, temple, etc.)" + ), + ), + PlaceTypeTuple( + code="BOSTP", + place_class="R", + name="boat stop", + description=( + " a place where boats stop to pick up and unload passengers and freight" + ), + ), + PlaceTypeTuple( + code="OSTP", + place_class="R", + name="other public transport stop", + description=( + " a place where other public transport " + "stop to pick up and unload passengers and freight" + ), + ), + ] + + for place_type in swissnames3d_types: + defaults = { + "name": place_type.name, + "feature_class": place_type.place_class, + "description": place_type.description, + } + place, created = PlaceType.objects.get_or_create( + code=place_type.code, defaults=defaults + ) + if not created: + for key, value in defaults.items(): + place_type.setattr(key, value) + place_type.save() + + def migrate_place_types(apps, schema_editor): Place = apps.get_model("routes", "Place") PlaceType = apps.get_model("routes", "PlaceType") @@ -104,6 +154,9 @@ class Migration(migrations.Migration): migrations.RunPython( import_place_types_from_geonames, ), + migrations.RunPython( + import_place_types_for_swissnames3d, + ), migrations.RenameField( model_name="place", old_name="place_type", diff --git a/homebytwo/routes/migrations/0052_place_country.py b/homebytwo/routes/migrations/0052_place_country.py new file mode 100644 index 00000000..083656c8 --- /dev/null +++ b/homebytwo/routes/migrations/0052_place_country.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.17 on 2020-11-03 08:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('routes', '0051_create_place_type_model'), + ] + + operations = [ + migrations.AddField( + model_name='place', + name='country', + field=models.CharField(default='CH', max_length=2), + ), + ] diff --git a/homebytwo/routes/models/place.py b/homebytwo/routes/models/place.py index d89c6e97..1a2226b8 100644 --- a/homebytwo/routes/models/place.py +++ b/homebytwo/routes/models/place.py @@ -14,6 +14,7 @@ "data_source", "source_id", "name", + "country", "latitude", "longitude", "place_type", @@ -74,10 +75,11 @@ class Place(TimeStampedModel): place_type = models.ForeignKey("PlaceType", on_delete="CASCADE") name = models.CharField(max_length=250) description = models.TextField(default="", blank=True) - altitude = models.FloatField(null=True) data_source = models.CharField(default="homebytwo", max_length=50) source_id = models.CharField("ID at the data source", max_length=50, null=True) + country = models.CharField(default="CH", max_length=2) geom = models.PointField(srid=21781) + altitude = models.FloatField(null=True) class Meta: # The pair 'data_source' and 'source_id' should be unique together. diff --git a/homebytwo/routes/tests/factories.py b/homebytwo/routes/tests/factories.py index b951b745..46851615 100644 --- a/homebytwo/routes/tests/factories.py +++ b/homebytwo/routes/tests/factories.py @@ -9,25 +9,31 @@ from pandas import DataFrame, read_json from pytz import utc -from ...routes.models import (Activity, ActivityPerformance, ActivityType, Gear, Place, - PlaceType, Route, WebhookTransaction) +from ...routes.models import ( + Activity, + ActivityPerformance, + ActivityType, + Gear, + Place, + PlaceType, + Route, + WebhookTransaction, +) from ...utils.factories import AthleteFactory, get_field_choices +COUNTRIES = ["CH", "DE", "FR", "IT"] + class DjangoGeoLocationProvider(BaseProvider): """ https://stackoverflow.com/a/58783744/12427785 """ - countries = ["CH", "DE", "FR", "IT"] - def location(self, country=None): """ generate a GeoDjango Point object with a custom Faker provider """ - country_code = ( - country or Faker("random_element", elements=self.countries).generate() - ) + country_code = country or Faker("random_element", elements=COUNTRIES).generate() faker = Faker("local_latlng", country_code=country_code, coords_only=True) coords = faker.generate() return Point(x=float(coords[1]), y=float(coords[0]), srid=4326) @@ -78,8 +84,9 @@ class Meta: place_type = Iterator(PlaceType.objects.all()) name = Faker("city") description = Faker("bs") + country = Faker("random_element", elements=COUNTRIES) + geom = Faker("location", country=country.generate()) altitude = Faker("random_int", min=0, max=4808) - geom = Faker("location") data_source = Faker("random_element", elements=["geonames", "swissnames3d"]) source_id = Sequence(lambda n: 1000 + n) From adab7a2d97fd8f2ce2f053587116dd1cfe53b7c1 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Fri, 6 Nov 2020 20:46:24 +0200 Subject: [PATCH 08/21] HB2-66 remove update option for import commands, no speed increase --- .../commands/import_geonames_places.py | 14 +--- .../commands/import_swissnames3d_places.py | 12 +--- homebytwo/importers/swissnames3d.py | 4 +- .../tests/data/geonames_codes_one.html | 68 ------------------- .../importers/tests/test_import_places.py | 20 +++--- homebytwo/importers/utils.py | 21 ++---- 6 files changed, 19 insertions(+), 120 deletions(-) delete mode 100644 homebytwo/importers/tests/data/geonames_codes_one.html diff --git a/homebytwo/importers/management/commands/import_geonames_places.py b/homebytwo/importers/management/commands/import_geonames_places.py index 1e6ee2d3..fa0ad7ab 100644 --- a/homebytwo/importers/management/commands/import_geonames_places.py +++ b/homebytwo/importers/management/commands/import_geonames_places.py @@ -29,26 +29,16 @@ def add_arguments(self, parser): help="Choose countries to import from, e.g. FR. ", ) - # update existing places - parser.add_argument( - "-u", - "--update", - action="store_true", - default=False, - help="Update existing places with remote data. ", - ) - def handle(self, *args, **options): - update = options["update"] files = options["files"] or [] for file in files: - msg = import_places_from_geonames(file=file, update=update) + msg = import_places_from_geonames(file=file) self.stdout.write(self.style.SUCCESS(msg)) countries = options["countries"] or [] for country in countries: - msg = import_places_from_geonames(scope=country, update=update) + msg = import_places_from_geonames(scope=country) self.stdout.write(self.style.SUCCESS(msg)) if not files and not countries: diff --git a/homebytwo/importers/management/commands/import_swissnames3d_places.py b/homebytwo/importers/management/commands/import_swissnames3d_places.py index e4ee7e44..4e003d90 100644 --- a/homebytwo/importers/management/commands/import_swissnames3d_places.py +++ b/homebytwo/importers/management/commands/import_swissnames3d_places.py @@ -30,18 +30,8 @@ def add_arguments(self, parser): help="Choose a swiss projection LV95 (default) or LV03. ", ) - # update existing places - parser.add_argument( - "-u", - "--update", - action="store_true", - default=False, - help="Update existing places with remote data. ", - ) - def handle(self, *args, **options): file = options["file"] projection = options["projection"] - update = options["update"] - msg = import_places_from_swissnames3d(projection, file, update) + msg = import_places_from_swissnames3d(projection, file) self.stdout.write(self.style.SUCCESS(msg)) diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 846a30c2..1307b31a 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -54,7 +54,7 @@ def import_places_from_swissnames3d( - projection: str = "LV95", file: Optional[TextIOWrapper] = None, update: bool = False + projection: str = "LV95", file: Optional[TextIOWrapper] = None ) -> str: """ import places from SwissNAMES3D @@ -76,7 +76,7 @@ def import_places_from_swissnames3d( count = get_csv_line_count(file, header=True) data = parse_places_from_csv(file, projection=projection) - return save_places_from_generator(data=data, count=count, update=update) + return save_places_from_generator(data=data, count=count) def get_swissnames3d_remote_file(projection: str = "LV95") -> TextIOWrapper: diff --git a/homebytwo/importers/tests/data/geonames_codes_one.html b/homebytwo/importers/tests/data/geonames_codes_one.html deleted file mode 100644 index 6048fa10..00000000 --- a/homebytwo/importers/tests/data/geonames_codes_one.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - -GeoNames - - - - - - - - -
 GeoNames Home | Postal Codes | Download / Webservice | About | -
- - search - -
- - -login - - - -
- -

GeoNames Feature Codes

- - -
- - - -
A country, state, region,...
ADM1 first-order administrative division a primary administrative division of a country, such as a state in the United States
-
- - -

 

 

 

  -

- - - - - diff --git a/homebytwo/importers/tests/test_import_places.py b/homebytwo/importers/tests/test_import_places.py index 15f57314..fb9125e6 100644 --- a/homebytwo/importers/tests/test_import_places.py +++ b/homebytwo/importers/tests/test_import_places.py @@ -78,7 +78,7 @@ def test_save_places_from_generator(): for place in places ) msg = "Created 20 new places and updated 5 places. " - assert save_places_from_generator(data, count=20, update=True) == msg + assert save_places_from_generator(data, count=20) == msg assert Place.objects.count() == 25 @@ -87,7 +87,7 @@ def test_save_places_from_generator_empty(): places = [] data = (place for place in places) msg = "Created 0 new places and updated 0 places. " - assert save_places_from_generator(data, count=0, update=False) == msg + assert save_places_from_generator(data, count=0) == msg assert Place.objects.count() == 0 @@ -111,7 +111,7 @@ def test_save_places_from_generator_bad_place_type(capsys): for place in [place] ) msg = "Created 0 new places and updated 0 places. " - assert save_places_from_generator(data, count=1, update=True) == msg + assert save_places_from_generator(data, count=1) == msg captured = capsys.readouterr() assert "Place type code: BADCODE does not exist.\n" in captured.out assert Place.objects.count() == 0 @@ -160,11 +160,8 @@ def test_import_places_from_geonames_not_found(mock_html_not_found): @pytest.mark.django_db def test_update_place_types_from_geonames(mock_html_response): url = PLACE_TYPE_URL - assert PlaceType.objects.count() == 681 - mock_html_response(url, "geonames_codes_one.html") mock_html_response(url, "geonames_codes.html") - update_place_types_from_geonames() - assert PlaceType.objects.count() == 1 + PlaceType.objects.all().delete() update_place_types_from_geonames() assert PlaceType.objects.count() == 681 @@ -190,7 +187,7 @@ def test_unzip_swissnames3d_remote_file(open_file): @pytest.mark.django_db def test_import_places_from_swissnames3d(open_file): file = open_file("swissnames3d_LV03_test.csv") - msg = "Created 146 new places and updated 0 places. " + msg = "Created 146 new places and updated 46 places. " assert import_places_from_swissnames3d(projection="LV03", file=file) == msg @@ -228,7 +225,6 @@ def test_import_geonames_places_multiple( "LI", "ZZ", "XX", - "--update", "-f", file_path.as_posix(), stdout=out, @@ -261,7 +257,7 @@ def test_import_swissnames3d_places(mock_zip_response): out = StringIO() call_command("import_swissnames3d_places", stdout=out) - msg = "Created 146 new places and updated 0 places. " + msg = "Created 146 new places and updated 46 places. " assert msg in out.getvalue() assert Place.objects.filter(data_source="swissnames3d").count() == 146 @@ -274,7 +270,7 @@ def test_import_swissnames3d_places_projection(mock_zip_response): out = StringIO() call_command("import_swissnames3d_places", "-p", "LV03", stdout=out) - msg = "Created 146 new places and updated 0 places. " + msg = "Created 146 new places and updated 46 places. " assert msg in out.getvalue() assert Place.objects.filter(data_source="swissnames3d").count() == 146 @@ -283,7 +279,7 @@ def test_import_swissnames3d_places_projection(mock_zip_response): def test_import_swissnames3d_places_file(current_dir_path): file_path = current_dir_path / "data/swissnames3d_LV95_test.csv" out = StringIO() - call_command("import_swissnames3d_places", "-u", "-f", file_path.as_posix(), stdout=out) + call_command("import_swissnames3d_places", "-f", file_path.as_posix(), stdout=out) msg = "Created 146 new places and updated 46 places. " assert msg in out.getvalue() diff --git a/homebytwo/importers/utils.py b/homebytwo/importers/utils.py index d59cf44b..9861e1bc 100644 --- a/homebytwo/importers/utils.py +++ b/homebytwo/importers/utils.py @@ -146,9 +146,7 @@ def get_csv_line_count(csv_file: TextIOWrapper, header: bool) -> int: return max(count - int(header), 0) -def save_places_from_generator( - data: Iterator[PlaceTuple], count: int, update: bool -) -> str: +def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: """ Save places from csv parsers in geonames.py or swissnames3d.py """ @@ -163,7 +161,7 @@ def save_places_from_generator( desc="saving places", ): - # prepare default values + # retrieve PlaceType from the database try: place_type = PlaceType.objects.get(code=remote_place.place_type) except PlaceType.DoesNotExist: @@ -181,22 +179,15 @@ def save_places_from_generator( "altitude": remote_place.altitude, } - # get or create Place - local_place, created = Place.objects.get_or_create( + # create or update Place + _, created = Place.objects.update_or_create( data_source=remote_place.data_source, source_id=remote_place.source_id, defaults=default_values, ) - if created: - created_counter += 1 - - # update existing place with default values - elif update: - for key, value in default_values.items(): - setattr(local_place, key, value) - local_place.save() - updated_counter += 1 + created_counter += int(created) + updated_counter += int(not created) return "Created {} new places and updated {} places. ".format( created_counter, updated_counter From 76129f67806aaf160af85bb725289c8b3b75ea7e Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Fri, 6 Nov 2020 20:48:49 +0200 Subject: [PATCH 09/21] HB2-66 Add new model country and link places --- homebytwo/importers/coutries.py | 28 +++++++++++++ homebytwo/importers/geonames.py | 18 ++++----- homebytwo/importers/swissnames3d.py | 17 ++++++-- homebytwo/importers/utils.py | 12 +++++- .../routes/migrations/0052_place_country.py | 39 ++++++++++++++++--- homebytwo/routes/models/__init__.py | 1 + homebytwo/routes/models/country.py | 15 +++++++ homebytwo/routes/models/place.py | 8 +++- homebytwo/routes/tests/factories.py | 5 ++- 9 files changed, 121 insertions(+), 22 deletions(-) create mode 100644 homebytwo/importers/coutries.py create mode 100644 homebytwo/routes/models/country.py diff --git a/homebytwo/importers/coutries.py b/homebytwo/importers/coutries.py new file mode 100644 index 00000000..32b0eb2f --- /dev/null +++ b/homebytwo/importers/coutries.py @@ -0,0 +1,28 @@ +import json + +from django.contrib.gis.geos import GEOSGeometry + +import requests + +from homebytwo.routes.models.country import Country + +GEO_COUNTRIES_URL = ( + "https://raw.githubusercontent.com/" + "datasets/geo-countries/master/data/countries.geojson" +) + + +def import_country_geometries(): + print("importing country geometries...") + response = requests.get(GEO_COUNTRIES_URL) + geom_json = response.json() + for country in geom_json["features"]: + defaults = { + "name": country["properties"]["ADMIN"], + "iso2": country["properties"]["ISO_A2"], + "geom": GEOSGeometry(json.dumps(country["geometry"])), + } + Country.objects.update_or_create( + iso3=country["properties"]["ISO_A3"], + defaults=defaults, + ) diff --git a/homebytwo/importers/geonames.py b/homebytwo/importers/geonames.py index 181c874e..42f60621 100644 --- a/homebytwo/importers/geonames.py +++ b/homebytwo/importers/geonames.py @@ -16,7 +16,6 @@ def import_places_from_geonames( scope: str = "allCountries", file: Optional[TextIOWrapper] = None, - update: bool = False, ) -> str: """ import places from https://www.geonames.org/ @@ -38,7 +37,7 @@ def import_places_from_geonames( count = get_csv_line_count(file, header=False) data = parse_places_from_csv(file) - return save_places_from_generator(data, count, update=update) + return save_places_from_generator(data, count) def get_geonames_remote_file(scope: str = "allCountries") -> TextIOWrapper: @@ -120,7 +119,6 @@ def update_place_types_from_geonames() -> None: # parse place types from table rows table_rows = feature_type_table.xpath(".//tr") - place_type_pks = [] for row in table_rows: # header rows contain class information @@ -134,12 +132,12 @@ def update_place_types_from_geonames() -> None: code, name, description = [ element.text_content() for element in row.xpath(".//td") ] - place_type, created = PlaceType.objects.get_or_create( - feature_class=current_feature_class, + defaults = { + "feature_class": current_feature_class, + "name": name, + "description": description, + } + PlaceType.objects.update_or_create( code=code, - name=name, - description=description, + defaults=defaults, ) - place_type_pks.append(place_type.pk) - - PlaceType.objects.exclude(pk__in=place_type_pks).delete() diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 1307b31a..642025cd 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -3,8 +3,10 @@ from typing import Iterator, Optional from zipfile import ZipFile +from django.contrib.gis.geos import Point from requests import ConnectionError, HTTPError +from ..routes.models import Country from ..routes.models.place import PlaceTuple from .utils import download_zip_file, get_csv_line_count, save_places_from_generator @@ -133,15 +135,24 @@ def parse_places_from_csv( # skip header row next(data_reader) + # get Liechtenstein and Switzerland to determine country + li, ch = Country.objects.filter(iso2__in=["LI", "CH"]) + for row in data_reader: if row[7] == "offiziell": + # get country information + longitude = float(row[11]) + latitude = float(row[12]) + geom = Point(x=longitude, y=latitude, srid=PROJECTION_SRID[projection]) + country = li if geom.within(li.geom) else ch + yield PlaceTuple( data_source="swissnames3d", source_id=row[0], name=row[6], - country="CH", - longitude=float(row[11]), - latitude=float(row[12]), + country=country, + longitude=longitude, + latitude=latitude, place_type=PLACE_TYPE_TRANSLATIONS[row[1]], altitude=float(row[13]), srid=PROJECTION_SRID[projection], diff --git a/homebytwo/importers/utils.py b/homebytwo/importers/utils.py index 9861e1bc..1a37e961 100644 --- a/homebytwo/importers/utils.py +++ b/homebytwo/importers/utils.py @@ -12,7 +12,7 @@ from requests.exceptions import ConnectionError from tqdm import tqdm -from ..routes.models import Place, PlaceType, Route +from ..routes.models import Place, PlaceType, Route, Country from ..routes.models.place import PlaceTuple from .exceptions import SwitzerlandMobilityError, SwitzerlandMobilityMissingCredentials @@ -168,9 +168,19 @@ def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: print(f"Place type code: {remote_place.place_type} does not exist.") continue + # country can be str or Country instance + country = remote_place.country + if country and not isinstance(country, Country): + try: + country = Country.objects.get(iso2=remote_place.country) + except Country.DoesNotExist: + print(f"Country code: {remote_place.country} does not exist.") + continue + default_values = { "name": remote_place.name, "place_type": place_type, + "country": country, "geom": Point( remote_place.longitude, remote_place.latitude, diff --git a/homebytwo/routes/migrations/0052_place_country.py b/homebytwo/routes/migrations/0052_place_country.py index 083656c8..50649d71 100644 --- a/homebytwo/routes/migrations/0052_place_country.py +++ b/homebytwo/routes/migrations/0052_place_country.py @@ -1,18 +1,47 @@ -# Generated by Django 2.2.17 on 2020-11-03 08:45 +# Generated by Django 2.2.17 on 2020-11-05 11:30 +import django.contrib.gis.db.models.fields from django.db import migrations, models +from homebytwo.importers.coutries import import_country_geometries + + +def import_countries(apps, schema_editor): + import_country_geometries() + class Migration(migrations.Migration): dependencies = [ - ('routes', '0051_create_place_type_model'), + ("routes", "0051_create_place_type_model"), ] operations = [ + migrations.CreateModel( + name="Country", + fields=[ + ( + "iso3", + models.CharField(max_length=3, primary_key=True, serialize=False), + ), + ("iso2", models.CharField(max_length=2)), + ("name", models.CharField(max_length=250)), + ( + "geom", + django.contrib.gis.db.models.fields.MultiPolygonField(srid=4326), + ), + ], + ), migrations.AddField( - model_name='place', - name='country', - field=models.CharField(default='CH', max_length=2), + model_name="place", + name="country", + field=models.ForeignKey( + blank=True, + null=True, + on_delete="SET_NULL", + related_name="places", + to="routes.Country", + ), ), + migrations.RunPython(import_countries, migrations.RunPython.noop), ] diff --git a/homebytwo/routes/models/__init__.py b/homebytwo/routes/models/__init__.py index 589060c7..f979a494 100644 --- a/homebytwo/routes/models/__init__.py +++ b/homebytwo/routes/models/__init__.py @@ -2,6 +2,7 @@ from .athlete import Athlete # NOQA from .event import WebhookTransaction # NOQA from .place import Checkpoint, Place, PlaceType # NOQA +from .country import Country # NOQA from .track import Track # NOQA # isort:skip from .route import Route, RouteManager # NOQA # isort:skip diff --git a/homebytwo/routes/models/country.py b/homebytwo/routes/models/country.py new file mode 100644 index 00000000..15cc4cfe --- /dev/null +++ b/homebytwo/routes/models/country.py @@ -0,0 +1,15 @@ +from django.contrib.gis.db import models + + +class Country(models.Model): + """ + Country geometries from https://github.com/datasets/geo-countries/ + Country codes from https://github.com/datasets/country-codes + """ + iso3 = models.CharField(max_length=3, primary_key=True) + iso2 = models.CharField(max_length=2) + name = models.CharField(max_length=250) + geom = models.MultiPolygonField(srid=4326) + + def __str__(self): + return self.name diff --git a/homebytwo/routes/models/place.py b/homebytwo/routes/models/place.py index 1a2226b8..fb61a780 100644 --- a/homebytwo/routes/models/place.py +++ b/homebytwo/routes/models/place.py @@ -77,8 +77,14 @@ class Place(TimeStampedModel): description = models.TextField(default="", blank=True) data_source = models.CharField(default="homebytwo", max_length=50) source_id = models.CharField("ID at the data source", max_length=50, null=True) - country = models.CharField(default="CH", max_length=2) geom = models.PointField(srid=21781) + country = models.ForeignKey( + "Country", + null=True, + blank=True, + related_name="places", + on_delete="SET_NULL", + ) altitude = models.FloatField(null=True) class Meta: diff --git a/homebytwo/routes/tests/factories.py b/homebytwo/routes/tests/factories.py index 46851615..4539841f 100644 --- a/homebytwo/routes/tests/factories.py +++ b/homebytwo/routes/tests/factories.py @@ -9,6 +9,7 @@ from pandas import DataFrame, read_json from pytz import utc +from ..models import Country from ...routes.models import ( Activity, ActivityPerformance, @@ -84,8 +85,8 @@ class Meta: place_type = Iterator(PlaceType.objects.all()) name = Faker("city") description = Faker("bs") - country = Faker("random_element", elements=COUNTRIES) - geom = Faker("location", country=country.generate()) + country = Iterator(Country.objects.filter(iso2__in=COUNTRIES)) + geom = LazyAttribute(lambda o: Faker("location", country=o.country.iso2).generate()) altitude = Faker("random_int", min=0, max=4808) data_source = Faker("random_element", elements=["geonames", "swissnames3d"]) source_id = Sequence(lambda n: 1000 + n) From b521f97acf89ecc33c88f90746b7061caebc5edd Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Fri, 6 Nov 2020 20:50:46 +0200 Subject: [PATCH 10/21] HB2-66 make place_type update much faster --- .../0051_create_place_type_model.py | 96 +++++++++---------- 1 file changed, 44 insertions(+), 52 deletions(-) diff --git a/homebytwo/routes/migrations/0051_create_place_type_model.py b/homebytwo/routes/migrations/0051_create_place_type_model.py index 3582777d..57887c3f 100644 --- a/homebytwo/routes/migrations/0051_create_place_type_model.py +++ b/homebytwo/routes/migrations/0051_create_place_type_model.py @@ -9,41 +9,6 @@ PlaceTypeTuple = namedtuple("PlaceType", ["code", "place_class", "name", "description"]) -PLACE_TYPE_TRANSLATIONS = { - "BDG": "SBDG", - "BEL": "CLF", - "BLD": "RK", - "BOA": "BOSTP", - "BUS": "BUSTP", - "C24": "PSTB", - "C24LT": "PSTB", - "CAV": "CAVE", - "CLT": "PSTB", - "CPL": "CH", - "EAE": "RDJCT", - "EXT": "RDJCT", - "FTN": "WTRW", - "HIL": "HLL", - "ICG": "RDJCT", - "LMK": "BP", - "LPL": "PPLL", - "LST": "TRANT", - "MNT": "MNMT", - "OBG": "BLDG", - "OTH": "OSTP", - "PAS": "PASS", - "PLA": "PPL", - "POV": "PROM", - "RPS": "PASS", - "SBG": "CH", - "SHR": "SHRN", - "SRC": "SPNG", - "SUM": "PK", - "TRA": "RSTP", - "TWR": "TOWR", - "WTF": "FLLS", -} - def import_place_types_from_geonames(apps, schema_editor): update_place_types_from_geonames() @@ -87,34 +52,61 @@ def import_place_types_for_swissnames3d(apps, schema_editor): "feature_class": place_type.place_class, "description": place_type.description, } - place, created = PlaceType.objects.get_or_create( - code=place_type.code, defaults=defaults - ) - if not created: - for key, value in defaults.items(): - place_type.setattr(key, value) - place_type.save() + PlaceType.objects.update_or_create(code=place_type.code, defaults=defaults) def migrate_place_types(apps, schema_editor): + place_type_translations = { + "BDG": "SBDG", + "BEL": "CLF", + "BLD": "RK", + "BOA": "BOSTP", + "BUS": "BUSTP", + "C24": "PSTB", + "C24LT": "PSTB", + "CAV": "CAVE", + "CLT": "PSTB", + "CPL": "CH", + "EAE": "RDJCT", + "EXT": "RDJCT", + "FTN": "WTRW", + "HIL": "HLL", + "ICG": "RDJCT", + "LMK": "BP", + "LPL": "PPLL", + "LST": "TRANT", + "MNT": "MNMT", + "OBG": "BLDG", + "OTH": "OSTP", + "PAS": "PASS", + "PLA": "PPL", + "POV": "PROM", + "RPS": "PASS", + "SBG": "CH", + "SHR": "SHRN", + "SRC": "SPNG", + "SUM": "PK", + "TRA": "RSTP", + "TWR": "TOWR", + "WTF": "FLLS", + } Place = apps.get_model("routes", "Place") PlaceType = apps.get_model("routes", "PlaceType") - for place in tqdm( - Place.objects.all(), + for old, new in tqdm( + place_type_translations.items(), desc="updating places to new place types", - unit="places", + unit="types", unit_scale=True, - total=Place.objects.count(), + total=len(place_type_translations), ): - new_place_code = PLACE_TYPE_TRANSLATIONS[place.old_place_type] try: - place_type = PlaceType.objects.get(code=new_place_code) + new_place_type = PlaceType.objects.get(code=new) except PlaceType.DoesNotExist: - print(f"Place type {place.old_place_type} does not exist") - place.delete() - place.place_type = place_type - place.save(update_fields=["place_type"]) + print(f"Place type {new} does not exist") + Place.objects.filter(old_place_type=old).delete() + + Place.objects.filter(old_place_type=old).update(place_type=new_place_type) class Migration(migrations.Migration): From a33b615024927ed82fcc9fb7128c9c5e5d0adbf2 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Fri, 6 Nov 2020 20:52:08 +0200 Subject: [PATCH 11/21] HB2-66 fix typo in place data_source --- .../routes/migrations/0051_create_place_type_model.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/homebytwo/routes/migrations/0051_create_place_type_model.py b/homebytwo/routes/migrations/0051_create_place_type_model.py index 57887c3f..30989c8f 100644 --- a/homebytwo/routes/migrations/0051_create_place_type_model.py +++ b/homebytwo/routes/migrations/0051_create_place_type_model.py @@ -109,6 +109,12 @@ def migrate_place_types(apps, schema_editor): Place.objects.filter(old_place_type=old).update(place_type=new_place_type) +def migrate_swissnames3d_data_source(apps, schema_editor): + print("updating data_source of swissnames3d places") + Place = apps.get_model("routes", "Place") + Place.objects.filter(data_source="swissname3d").update(data_source="swissnames3d") + + class Migration(migrations.Migration): dependencies = [ @@ -164,6 +170,9 @@ class Migration(migrations.Migration): migrations.RunPython( migrate_place_types, ), + migrations.RunPython( + migrate_swissnames3d_data_source, + ), migrations.RemoveField( model_name="place", name="old_place_type", From bc4f7db23e507dc442383f4bcb51821b1569a05c Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Fri, 6 Nov 2020 23:12:01 +0200 Subject: [PATCH 12/21] HB2-66 Migrate geoms to new projection SRID 3857 --- .../migrations/0053_migrate_to_3857_srid.py | 102 ++++++++++++++++++ homebytwo/routes/models/place.py | 2 +- homebytwo/routes/models/track.py | 2 +- 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 homebytwo/routes/migrations/0053_migrate_to_3857_srid.py diff --git a/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py b/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py new file mode 100644 index 00000000..2e955794 --- /dev/null +++ b/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py @@ -0,0 +1,102 @@ +# Generated by Django 2.2.17 on 2020-11-05 15:36 +import django.contrib.gis.db.models.fields +from django.db import migrations, router +from tqdm import tqdm + + +class RunUpdateSRID(migrations.RunPython): + """ + Monkey patch migrations.RunPython for the sake of DRY. + This operation is not reversible. + """ + def __init__(self, *args, **kwargs): + self.model = kwargs.pop("model") + self.new_srid = kwargs.pop("new_srid") + code = migrate_geom_to_new_srid + super().__init__(code, *args, **kwargs) + + def database_forwards(self, app_label, schema_editor, from_state, to_state): + from_state.clear_delayed_apps_cache() + if router.allow_migrate( + schema_editor.connection.alias, app_label, **self.hints + ): + self.code( + from_state.apps, + schema_editor, + self.model, + self.new_srid, + ) + + +def migrate_geom_to_new_srid(apps, schema_editor, model, new_srid): + print(f"migrating {model} to srid: {new_srid}...") + + Model = apps.get_model("routes", model) + for instance in tqdm( + Model.objects.all(), + total=Model.objects.count(), + unit=model + "s", + unit_scale=True, + ): + instance.geom = instance.old_geom.transform(new_srid, clone=True) + instance.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ("routes", "0052_place_country"), + ] + + operations = [ + migrations.RenameField( + model_name="route", + old_name="geom", + new_name="old_geom", + ), + migrations.AddField( + model_name="route", + name="geom", + field=django.contrib.gis.db.models.fields.LineStringField( + null=True, srid=3857 + ), + ), + migrations.RenameField( + model_name="place", + old_name="geom", + new_name="old_geom", + ), + migrations.AddField( + model_name="place", + name="geom", + field=django.contrib.gis.db.models.fields.PointField(null=True, srid=3857), + ), + RunUpdateSRID( + model="route", + new_srid=3857, + ), + RunUpdateSRID( + model="place", + new_srid=3857, + ), + migrations.RemoveField( + model_name="route", + name="old_geom", + ), + migrations.RemoveField( + model_name="place", + name="old_geom", + ), + migrations.AlterField( + model_name="place", + name="geom", + field=django.contrib.gis.db.models.fields.PointField(srid=3857), + ), + migrations.AlterField( + model_name="route", + name="geom", + field=django.contrib.gis.db.models.fields.LineStringField( + srid=3857, verbose_name="line geometry" + ), + ), + ] diff --git a/homebytwo/routes/models/place.py b/homebytwo/routes/models/place.py index fb61a780..00eb1551 100644 --- a/homebytwo/routes/models/place.py +++ b/homebytwo/routes/models/place.py @@ -77,7 +77,6 @@ class Place(TimeStampedModel): description = models.TextField(default="", blank=True) data_source = models.CharField(default="homebytwo", max_length=50) source_id = models.CharField("ID at the data source", max_length=50, null=True) - geom = models.PointField(srid=21781) country = models.ForeignKey( "Country", null=True, @@ -85,6 +84,7 @@ class Place(TimeStampedModel): related_name="places", on_delete="SET_NULL", ) + geom = models.PointField(srid=3857) altitude = models.FloatField(null=True) class Meta: diff --git a/homebytwo/routes/models/track.py b/homebytwo/routes/models/track.py index 3ca8e829..4cb308ab 100644 --- a/homebytwo/routes/models/track.py +++ b/homebytwo/routes/models/track.py @@ -51,7 +51,7 @@ class Meta: total_distance = models.FloatField("Total length of the track in m", default=0) # geographic information - geom = models.LineStringField("line geometry", srid=21781) + geom = models.LineStringField("line geometry", srid=3857) # Start and End-place start_place = models.ForeignKey( From 2dbce19b1e65f7ca88f4235d3e74e5be108f56e2 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Fri, 6 Nov 2020 23:24:35 +0200 Subject: [PATCH 13/21] HB2-66 add import places commands to fabfile --- fabfile.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fabfile.py b/fabfile.py index 13fc6d13..c2287bdd 100644 --- a/fabfile.py +++ b/fabfile.py @@ -391,6 +391,24 @@ def fetch_media(): ) +@task +def import_geonames_places(*countries): + """ + import places from the geonames.org database + """ + with cd(get_project_root()): + run_python("manage.py import_geonames_places " + " ".join(countries)) + + +@task +def import_swissnames3d_places(): + """ + import places from the SwissNAMES3D database + """ + with cd(get_project_root()): + run_python("manage.py import_swissnames3d_places") + + def is_supported_db_engine(engine): return engine in ( "django.db.backends.postgresql_psycopg2", From 09cde2a1ac3719661ea362f2a2ef77c9b49419d0 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Sun, 8 Nov 2020 16:46:25 +0200 Subject: [PATCH 14/21] HB2-66 add and fix tests --- homebytwo/importers/coutries.py | 1 + .../models/switzerlandmobilityroute.py | 2 +- .../importers/tests/data/countries.geojson | 10 ++++ homebytwo/importers/tests/test_country.py | 43 ++++++++++++++ homebytwo/routes/models/route.py | 3 +- homebytwo/routes/tests/factories.py | 4 +- homebytwo/routes/tests/test_gpx.py | 58 +++++++----------- homebytwo/routes/tests/test_route.py | 59 +++++++------------ homebytwo/utils/tests.py | 15 ++++- 9 files changed, 114 insertions(+), 81 deletions(-) create mode 100644 homebytwo/importers/tests/data/countries.geojson create mode 100644 homebytwo/importers/tests/test_country.py diff --git a/homebytwo/importers/coutries.py b/homebytwo/importers/coutries.py index 32b0eb2f..e9adf2eb 100644 --- a/homebytwo/importers/coutries.py +++ b/homebytwo/importers/coutries.py @@ -15,6 +15,7 @@ def import_country_geometries(): print("importing country geometries...") response = requests.get(GEO_COUNTRIES_URL) + response.raise_for_status() geom_json = response.json() for country in geom_json["features"]: defaults = { diff --git a/homebytwo/importers/models/switzerlandmobilityroute.py b/homebytwo/importers/models/switzerlandmobilityroute.py index c815a255..3438d61a 100644 --- a/homebytwo/importers/models/switzerlandmobilityroute.py +++ b/homebytwo/importers/models/switzerlandmobilityroute.py @@ -65,7 +65,7 @@ def parse_route_data(raw_route_json): # create geom from lat, lng data columns coords = list(zip(data["lat"], data["lng"])) - geom = LineString(coords, srid=21781) + geom = LineString(coords, srid=21781).transform(3857, clone=True) # remove redundant lat, lng columns in data data.drop(columns=["lat", "lng"], inplace=True) diff --git a/homebytwo/importers/tests/data/countries.geojson b/homebytwo/importers/tests/data/countries.geojson new file mode 100644 index 00000000..c5d17f31 --- /dev/null +++ b/homebytwo/importers/tests/data/countries.geojson @@ -0,0 +1,10 @@ +{ +"type": "FeatureCollection", + +"features": [ +{ "type": "Feature", "properties": { "ADMIN": "Switzerland", "ISO_A3": "CHE", "ISO_A2": "CH" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 8.617437378000091, 47.757318624000078 ], [ 8.629839721000053, 47.762796326000085 ], [ 8.635007365000149, 47.784603780000083 ], [ 8.644102417000113, 47.791011658000031 ], [ 8.657021525000118, 47.788117778000043 ], [ 8.66663334200004, 47.778273417000065 ], [ 8.674488159000077, 47.766697897000114 ], [ 8.681929565000104, 47.758739726000073 ], [ 8.692264852000108, 47.757163595000037 ], [ 8.703323608000119, 47.758713887000056 ], [ 8.71314213000008, 47.757421977 ], [ 8.719756714000084, 47.747319234000059 ], [ 8.71706954000004, 47.743546855000034 ], [ 8.703737020000119, 47.730033468000073 ], [ 8.700429728000131, 47.723496399000084 ], [ 8.70466719500007, 47.715331523000089 ], [ 8.712625366000054, 47.708691101000085 ], [ 8.715105835000116, 47.701068827000086 ], [ 8.71706954000004, 47.694557597000113 ], [ 8.769882853000098, 47.695074361000081 ], [ 8.761717977000075, 47.701249695000058 ], [ 8.770709676000109, 47.720860901000066 ], [ 8.797581420000114, 47.720034079000044 ], [ 8.830240926000101, 47.707192485000064 ], [ 8.856079142000112, 47.690681864000084 ], [ 8.837682333000117, 47.687787985000085 ], [ 8.837785685000142, 47.680837504000095 ], [ 8.851935119000075, 47.671281723000106 ], [ 8.852668498000099, 47.670786438000079 ], [ 8.881710652000095, 47.656136170000082 ], [ 8.906205281000041, 47.65179534900011 ], [ 8.945376017000086, 47.654301656000086 ], [ 8.981756225000055, 47.662156474000113 ], [ 8.997672566000091, 47.673835348000097 ], [ 9.016586141000118, 47.678899639000065 ], [ 9.09007182626271, 47.678269036605236 ], [ 9.113021234783183, 47.671570929222284 ], [ 9.137085147841962, 47.664769390126509 ], [ 9.144925417388691, 47.668252149659082 ], [ 9.155220679406469, 47.666922484183132 ], [ 9.173275314563808, 47.655250651258541 ], [ 9.196936890000131, 47.656136170000082 ], [ 9.234350627000083, 47.656162008000109 ], [ 9.273211304000142, 47.650090027000061 ], [ 9.547481674000068, 47.534547102000062 ], [ 9.553058591000081, 47.516891338000107 ], [ 9.554951212000105, 47.51089955700013 ], [ 9.584510132000048, 47.480720521000137 ], [ 9.621717163000142, 47.469196676000109 ], [ 9.650345907000116, 47.452091777000049 ], [ 9.649519084000104, 47.409717103000048 ], [ 9.639803914000055, 47.394524231000105 ], [ 9.601046590000124, 47.361270447000066 ], [ 9.596395711000071, 47.352304586000031 ], [ 9.591228068000078, 47.334682923000059 ], [ 9.587404012000121, 47.327809957000085 ], [ 9.553297567000072, 47.299853008000099 ], [ 9.52115482500011, 47.262801005000114 ], [ 9.504618368000138, 47.243732402000035 ], [ 9.487358439000047, 47.210013529000065 ], [ 9.484981323000085, 47.176346334000129 ], [ 9.492629435000083, 47.159809876000054 ], [ 9.503481486000112, 47.145392151000124 ], [ 9.511853068000107, 47.129372457000073 ], [ 9.512369832000047, 47.108030091000074 ], [ 9.50286136800014, 47.094697572000143 ], [ 9.487565145000104, 47.083948874000043 ], [ 9.475886271000121, 47.073226014000113 ], [ 9.477023153000118, 47.063898417000075 ], [ 9.499554077000141, 47.059350891000037 ], [ 9.560635620000141, 47.052400412000054 ], [ 9.581202840000032, 47.056870423000078 ], [ 9.599909709000116, 47.053485616000046 ], [ 9.652309611000049, 47.05792979000006 ], [ 9.669052775000097, 47.056198629000079 ], [ 9.857981812000048, 47.015477600000025 ], [ 9.856328165000093, 47.004082947000114 ], [ 9.860565633000135, 47.001602478000052 ], [ 9.866766805000026, 47.001938375000037 ], [ 9.870590861000068, 46.998837790000096 ], [ 9.870590861000068, 46.992946676000088 ], [ 9.86645674600004, 46.983386536000097 ], [ 9.863976278000081, 46.95992543600002 ], [ 9.860772339000107, 46.949150899000102 ], [ 9.86242598400014, 46.939771627000141 ], [ 9.875138387000106, 46.927420960000092 ], [ 9.899943075000039, 46.914398499000072 ], [ 10.006913289000096, 46.890756531000136 ], [ 10.045567260000098, 46.865564271000096 ], [ 10.068098185000025, 46.85662424800006 ], [ 10.111299683000084, 46.847115784000067 ], [ 10.125187508000124, 46.84675122900012 ], [ 10.131970255000084, 46.846573182000043 ], [ 10.157808471000095, 46.851611634000108 ], [ 10.201423381000069, 46.866830343000032 ], [ 10.211655314000041, 46.87703643800009 ], [ 10.214342488000057, 46.884684550000088 ], [ 10.215169311000096, 46.893107809000071 ], [ 10.219923543000078, 46.905768535000107 ], [ 10.235116415000107, 46.923312684000081 ], [ 10.251342814000111, 46.925379740000039 ], [ 10.270773152000089, 46.921891581000096 ], [ 10.295681193000064, 46.922692566000109 ], [ 10.296197957000118, 46.94137359700008 ], [ 10.313664592000066, 46.964317933000103 ], [ 10.338882691000094, 46.984110006000094 ], [ 10.367924846000108, 46.99550465900009 ], [ 10.373402547000097, 46.996253967000087 ], [ 10.378983602000091, 46.99550465900009 ], [ 10.384254598000041, 46.99315338200006 ], [ 10.384357950000066, 46.99315338200006 ], [ 10.384357950000066, 46.992998352000114 ], [ 10.39469323700007, 46.985401916000058 ], [ 10.415570516000059, 46.962405905000111 ], [ 10.449573608000094, 46.943905742000084 ], [ 10.458461955000104, 46.936619365000098 ], [ 10.463836303000051, 46.919747009000105 ], [ 10.451433960000088, 46.885769756000087 ], [ 10.453811076000136, 46.86442738900007 ], [ 10.4485400800001, 46.832232971000025 ], [ 10.444922730000116, 46.823241272000075 ], [ 10.439031616000108, 46.816885071000058 ], [ 10.417224162000082, 46.798849997000076 ], [ 10.419084513000087, 46.783967183000101 ], [ 10.426215861000031, 46.769420268000061 ], [ 10.42869633, 46.755648499000131 ], [ 10.41660404400011, 46.743013611000094 ], [ 10.399654175000109, 46.735546367000069 ], [ 10.395623413000123, 46.726399639000078 ], [ 10.396553588000074, 46.715004984000075 ], [ 10.394383179000073, 46.70081980400002 ], [ 10.384771363000084, 46.689011739000108 ], [ 10.373919312000112, 46.681906230000095 ], [ 10.36916508000013, 46.672397766000103 ], [ 10.377536662000097, 46.653277486 ], [ 10.395623413000123, 46.638808085000079 ], [ 10.438204793000097, 46.635655823000036 ], [ 10.459082072000058, 46.623563538000042 ], [ 10.466626831000013, 46.604288229000105 ], [ 10.465903361000102, 46.578475851000093 ], [ 10.457945190000146, 46.553697001000046 ], [ 10.45183267900012, 46.546701572000075 ], [ 10.443992554000147, 46.537728984000097 ], [ 10.425905803000148, 46.53532603000005 ], [ 10.354282267000087, 46.548322653000099 ], [ 10.319452351000024, 46.546048889000076 ], [ 10.306636597000136, 46.54749582900007 ], [ 10.295371135000096, 46.551087341000141 ], [ 10.289066609000059, 46.555686544000082 ], [ 10.283795614000041, 46.560724996000062 ], [ 10.27594079500011, 46.56553090500006 ], [ 10.234703003000106, 46.575297750000118 ], [ 10.230258830000082, 46.586149801000062 ], [ 10.235736531000072, 46.606691183000066 ], [ 10.233772827000053, 46.617982484000038 ], [ 10.21785648600013, 46.626974182000055 ], [ 10.192121623000048, 46.626819154000117 ], [ 10.097450398000092, 46.608034770000103 ], [ 10.087838582000103, 46.604391582000119 ], [ 10.083497762000121, 46.597001851000101 ], [ 10.07119877100007, 46.564394023000062 ], [ 10.062930542000117, 46.556745911000093 ], [ 10.041329793000074, 46.541863098000135 ], [ 10.032751506000125, 46.532974752000115 ], [ 10.03140791900006, 46.525791728000058 ], [ 10.031201212000099, 46.503829245000105 ], [ 10.026860392000117, 46.493183900000105 ], [ 10.028100627000072, 46.483933818000082 ], [ 10.03047774300012, 46.476673279000124 ], [ 10.035335327000041, 46.471066386000103 ], [ 10.044016968000079, 46.466983948000092 ], [ 10.026343627000074, 46.446261699000075 ], [ 10.042053263000071, 46.432722474000087 ], [ 10.071405477000042, 46.424815980000034 ], [ 10.116157267000091, 46.418821514000115 ], [ 10.133417195000078, 46.414015605000088 ], [ 10.14075524900008, 46.402905172000089 ], [ 10.133210490000124, 46.381097717000046 ], [ 10.125975789000051, 46.374379782000034 ], [ 10.104995158000065, 46.361357321000099 ], [ 10.097450398000092, 46.35164215100005 ], [ 10.092386108000113, 46.338102926000062 ], [ 10.091765991000074, 46.3289561980001 ], [ 10.095796753000059, 46.320532939000088 ], [ 10.104891805000136, 46.309370830000063 ], [ 10.14612959800013, 46.280276998000062 ], [ 10.158945353000121, 46.262448629000119 ], [ 10.145819539000058, 46.243328349000109 ], [ 10.117914266000071, 46.231132711000015 ], [ 10.075746297000109, 46.220022278000101 ], [ 10.04267338000011, 46.220487366000015 ], [ 10.041846557000099, 46.243069967000054 ], [ 10.031717977000142, 46.260071513000071 ], [ 9.99223718200011, 46.284359436000074 ], [ 9.977561076000114, 46.29810536700009 ], [ 9.971049846000057, 46.320016175000063 ], [ 9.970636434000141, 46.339808249000043 ], [ 9.964021851000069, 46.356086325000064 ], [ 9.939010457000052, 46.367455140000061 ], [ 9.918443237000076, 46.371150004000043 ], [ 9.899012899000098, 46.372157695000027 ], [ 9.855397990000142, 46.366964213000102 ], [ 9.788838745000049, 46.343296408000072 ], [ 9.768064819000102, 46.338619690000115 ], [ 9.755249064000026, 46.340531718000136 ], [ 9.730857788000094, 46.35071197500011 ], [ 9.720109090000079, 46.350892843000054 ], [ 9.709257039000136, 46.34239207000013 ], [ 9.707293335000088, 46.33097157900005 ], [ 9.708843628000125, 46.319628601000062 ], [ 9.708430217000114, 46.311747946000111 ], [ 9.693133992000043, 46.297071839000125 ], [ 9.674323771000047, 46.2918008420001 ], [ 9.559705444000087, 46.29273101800004 ], [ 9.536451050000068, 46.298622132000048 ], [ 9.51526371300011, 46.30859568300005 ], [ 9.502551310000058, 46.32073964500006 ], [ 9.482604207000065, 46.356809794000071 ], [ 9.47371586100013, 46.361874085000125 ], [ 9.451598348000118, 46.370374858000048 ], [ 9.444363648000149, 46.375284119000071 ], [ 9.442399943000112, 46.380891012000092 ], [ 9.443846883000106, 46.396135559000044 ], [ 9.437852417000101, 46.492047018000108 ], [ 9.434648478000014, 46.498325704000109 ], [ 9.426793660000072, 46.497111308000086 ], [ 9.410670614000111, 46.488894756000036 ], [ 9.403849324000134, 46.482512716000116 ], [ 9.400335327000107, 46.475407207000075 ], [ 9.395477742000082, 46.469412740000053 ], [ 9.384625691000025, 46.46641550800004 ], [ 9.377080933000087, 46.468689270000056 ], [ 9.35155277500013, 46.485484111000119 ], [ 9.350829305000047, 46.497860616000082 ], [ 9.330985555000069, 46.501503805000084 ], [ 9.282306355000117, 46.497369691000046 ], [ 9.263186076000125, 46.485122376000021 ], [ 9.245822794000105, 46.461041158000086 ], [ 9.237967977000068, 46.436546530000015 ], [ 9.247579794000103, 46.423033142000065 ], [ 9.260912313000119, 46.416651103000021 ], [ 9.262876017000053, 46.406625875000088 ], [ 9.260292195000147, 46.394016826000069 ], [ 9.260395548000076, 46.379728292000095 ], [ 9.273831420000107, 46.344252421000135 ], [ 9.275175008000076, 46.33138499000006 ], [ 9.2689738360001, 46.309370830000063 ], [ 9.239724975000058, 46.266996155000044 ], [ 9.224842163000119, 46.231184387000042 ], [ 9.215747111000042, 46.221055807000084 ], [ 9.204171590000101, 46.213562724000042 ], [ 9.192182658000121, 46.209635315000071 ], [ 9.181330607000092, 46.204054260000049 ], [ 9.17574955200007, 46.194132385000046 ], [ 9.171098673000103, 46.182608541000036 ], [ 9.163788025000059, 46.17298926700002 ], [ 9.163243856000065, 46.172273255000022 ], [ 9.090586792000124, 46.13816680900004 ], [ 9.072086629000097, 46.118891500000103 ], [ 9.068159220000041, 46.105972392000098 ], [ 9.07032963100005, 46.083441467000085 ], [ 9.067125692000076, 46.071142477000137 ], [ 9.059167521000091, 46.061789043 ], [ 9.049659057000014, 46.05791331000006 ], [ 9.027748250000059, 46.053107402000137 ], [ 9.002116740000105, 46.039309795000094 ], [ 8.997775919000105, 46.027940979000107 ], [ 9.015552612000135, 45.993111064000033 ], [ 8.982686401000109, 45.971975403000101 ], [ 8.980515991000118, 45.969494934000124 ], [ 8.979792521000121, 45.966911113000037 ], [ 8.980515991000118, 45.964378968000034 ], [ 8.982686401000109, 45.961846822000041 ], [ 8.993435099000124, 45.954250387000087 ], [ 9.001703329000094, 45.936060283000131 ], [ 9.010798380000068, 45.926655172000068 ], [ 9.0205135490001, 45.922779440000028 ], [ 9.042321004000115, 45.919730530000095 ], [ 9.051726115000065, 45.915544739000069 ], [ 9.063094930000148, 45.898956604000062 ], [ 9.059270874000021, 45.881955058000131 ], [ 9.034362834000149, 45.848106995000137 ], [ 9.002426798000073, 45.820718486 ], [ 8.972351115, 45.82464589500006 ], [ 8.939588257000111, 45.834826152000034 ], [ 8.900004109000065, 45.826402893000136 ], [ 8.903724812000064, 45.841802470000118 ], [ 8.909719279000086, 45.853688050000045 ], [ 8.9137500410001, 45.866090393000036 ], [ 8.912096394000031, 45.883401998000124 ], [ 8.906515340000112, 45.896476135000086 ], [ 8.89814375800006, 45.909550273000036 ], [ 8.880780476000041, 45.931099345000092 ], [ 8.870961954000052, 45.947067363000116 ], [ 8.864450724000079, 45.953423564000047 ], [ 8.857732788000078, 45.957092591000048 ], [ 8.800371948000077, 45.97853831000009 ], [ 8.785075724000109, 45.982310690000105 ], [ 8.767919149000079, 45.983085836000015 ], [ 8.769572794000112, 45.985773010000059 ], [ 8.773396850000069, 45.990578919000143 ], [ 8.790966838000116, 46.018690898000074 ], [ 8.819595581000101, 46.042927145000078 ], [ 8.834375041000015, 46.066388245000041 ], [ 8.808950236000101, 46.089745993000093 ], [ 8.793860717000115, 46.093415019000076 ], [ 8.763164917000068, 46.092898255000051 ], [ 8.747145223000103, 46.094448548000059 ], [ 8.739497111000048, 46.098065898000044 ], [ 8.732159057000047, 46.107419332000092 ], [ 8.728983368000115, 46.108233103000089 ], [ 8.723890828000094, 46.109538066000084 ], [ 8.717689656000118, 46.107522685000021 ], [ 8.702186727000111, 46.097962545000115 ], [ 8.695055379000081, 46.095172018000056 ], [ 8.677485392000079, 46.095792135000039 ], [ 8.630873250000121, 46.114705709000077 ], [ 8.611546264000083, 46.11935658800013 ], [ 8.601831095000136, 46.122818909000074 ], [ 8.538682495000074, 46.187621155000073 ], [ 8.510260457000072, 46.20787831700008 ], [ 8.482665242000053, 46.217541809000124 ], [ 8.456516968000045, 46.224828187000099 ], [ 8.438120158000061, 46.235370178000068 ], [ 8.427164754000074, 46.25144154900002 ], [ 8.423237345000103, 46.275832825000066 ], [ 8.426647990000049, 46.301567688000063 ], [ 8.442874389000053, 46.353373312000116 ], [ 8.446285034000084, 46.382182923000045 ], [ 8.445768270000116, 46.412361959000066 ], [ 8.441634155000116, 46.434944560000076 ], [ 8.427888224000071, 46.448690491000036 ], [ 8.399156128000072, 46.452178650000064 ], [ 8.385906925000114, 46.450206018000102 ], [ 8.343448934000037, 46.443884583000113 ], [ 8.316267130000142, 46.433652649000038 ], [ 8.294976441000074, 46.418046366000084 ], [ 8.286604859000079, 46.405359803000039 ], [ 8.290428914000131, 46.401122335000082 ], [ 8.297043497000118, 46.397634176000054 ], [ 8.297456909000033, 46.387505596000096 ], [ 8.291462443000114, 46.378358866000013 ], [ 8.281540568000111, 46.37011647500006 ], [ 8.270068400000099, 46.364044495000115 ], [ 8.241749715000111, 46.354122620000027 ], [ 8.192553752000038, 46.30916412400012 ], [ 8.171883178000115, 46.299190573 ], [ 8.128474975000131, 46.29247263600007 ], [ 8.106874227000048, 46.285547995000087 ], [ 8.087340535000038, 46.271802063000052 ], [ 8.077315307000021, 46.262035218000108 ], [ 8.073077840000082, 46.253611959000125 ], [ 8.076591837000109, 46.249736226000067 ], [ 8.099949585000076, 46.235628561000027 ], [ 8.129508504000114, 46.196044413000067 ], [ 8.132299032000077, 46.159354147000101 ], [ 8.110594930000076, 46.126953023000112 ], [ 8.066876668000077, 46.100598043000048 ], [ 8.056024617000048, 46.098065898000044 ], [ 8.035354044000115, 46.096515605000036 ], [ 8.025328817000087, 46.091141256000071 ], [ 8.018197469000143, 46.080857646000084 ], [ 8.016027059000066, 46.069385478000072 ], [ 8.015923706000137, 46.058171692000116 ], [ 8.010652710000102, 46.029697978000087 ], [ 8.008792358000107, 46.027682597000137 ], [ 7.999077189000076, 46.012799784000094 ], [ 7.998353719000079, 46.010629375000093 ], [ 7.985848022000084, 45.999312236000037 ], [ 7.978716674000026, 45.995178121000095 ], [ 7.969104858000037, 45.993111064000033 ], [ 7.898204794000066, 45.981948954000103 ], [ 7.8837819861848, 45.973868674621968 ], [ 7.872917431422025, 45.959382601605029 ], [ 7.870201292731366, 45.940369630770221 ], [ 7.84962011600004, 45.939712062000126 ], [ 7.848388712000116, 45.938075663000092 ], [ 7.845288127000089, 45.927792053000076 ], [ 7.846114949000111, 45.922572733000067 ], [ 7.843737833000148, 45.91921376600007 ], [ 7.831232137000143, 45.914459534000059 ], [ 7.825444376000093, 45.914666239000042 ], [ 7.807564331000037, 45.918490296000073 ], [ 7.780072469000061, 45.91812856100006 ], [ 7.732013387000109, 45.930375875000095 ], [ 7.72219486500012, 45.929600728000082 ], [ 7.714650105000089, 45.92712026 ], [ 7.706278523, 45.925724997000117 ], [ 7.693979533000061, 45.928670553000131 ], [ 7.692532593000067, 45.931202698000021 ], [ 7.673722371000054, 45.950322978000116 ], [ 7.6587362060001, 45.960038147000063 ], [ 7.643026571000121, 45.966342672000053 ], [ 7.541120646000138, 45.984119365000083 ], [ 7.524377482000091, 45.978073223000052 ], [ 7.514662312000041, 45.966704407000066 ], [ 7.503706909000073, 45.956730855000046 ], [ 7.482726278000058, 45.954870504000041 ], [ 7.452960652000087, 45.945878805000092 ], [ 7.393842814000038, 45.91569976800011 ], [ 7.361803426000108, 45.907844951000072 ], [ 7.286665893000105, 45.913426005000076 ], [ 7.273540079000043, 45.910273743000033 ], [ 7.245428100000083, 45.898129782000126 ], [ 7.183726440000044, 45.88045644200011 ], [ 7.153547404000022, 45.876529033000054 ], [ 7.120887899000138, 45.876115621000054 ], [ 7.090192097000113, 45.880508118000137 ], [ 7.066937703000093, 45.890223288000072 ], [ 7.022082560000115, 45.925259909 ], [ 7.015157918000114, 45.933321431000081 ], [ 7.009783569000149, 45.943398336000115 ], [ 7.002755575000066, 45.961691793000085 ], [ 6.991283406000122, 45.982465719000061 ], [ 6.987666056000052, 45.993111064000033 ], [ 6.982808471000055, 45.995384827000066 ], [ 6.91511234500004, 46.048611553000114 ], [ 6.892374715000074, 46.055587871000114 ], [ 6.884003133000078, 46.053210755000066 ], [ 6.876871786000066, 46.048094788000071 ], [ 6.869223673000079, 46.044064026000086 ], [ 6.859715210000104, 46.044994202000026 ], [ 6.850930216000108, 46.049645081000108 ], [ 6.850310099000126, 46.052745667000039 ], [ 6.852377156000102, 46.056931458000065 ], [ 6.851963745000091, 46.064682922000088 ], [ 6.853410685000085, 46.065664775000045 ], [ 6.853100627000089, 46.076103414000073 ], [ 6.851343628000109, 46.086025290000094 ], [ 6.848553100000061, 46.08504343700011 ], [ 6.853100627000089, 46.09021108100012 ], [ 6.861162150000098, 46.097032369000061 ], [ 6.868190144000096, 46.104680482000049 ], [ 6.869223673000079, 46.112328593000115 ], [ 6.853927449000111, 46.122612203000131 ], [ 6.774345743000083, 46.134807841000054 ], [ 6.765664103000034, 46.151602681000099 ], [ 6.774862508000126, 46.185864156 ], [ 6.792225789000071, 46.221675924000039 ], [ 6.827675822000089, 46.269476624000021 ], [ 6.804938192000094, 46.296606751000098 ], [ 6.769488159000076, 46.32267751100008 ], [ 6.750367879000095, 46.345518494000089 ], [ 6.755742228000145, 46.357068177000116 ], [ 6.782097209000114, 46.378462220000131 ], [ 6.789228556000126, 46.395205383000075 ], [ 6.78810673300012, 46.405007978000071 ], [ 6.787058146000049, 46.414170635000033 ], [ 6.777756388000114, 46.424092509000047 ], [ 6.77771555400011, 46.424106493000039 ], [ 6.762666870000118, 46.42926015200004 ], [ 6.613683716000139, 46.455899354000081 ], [ 6.547021118000117, 46.457372132000074 ], [ 6.482942342000115, 46.448587138000079 ], [ 6.397676229000069, 46.408176168000097 ], [ 6.365223430000128, 46.402440084000062 ], [ 6.332357218000112, 46.40138071700008 ], [ 6.301558065000052, 46.394481914000096 ], [ 6.269105265000121, 46.375025737000101 ], [ 6.240579874000076, 46.348954977000119 ], [ 6.219495890000133, 46.329111227000027 ], [ 6.214121541000083, 46.31546864900011 ], [ 6.21825565600011, 46.305495097000119 ], [ 6.227454060000099, 46.288493551000101 ], [ 6.227970825000057, 46.284462789000088 ], [ 6.237582642000064, 46.267926331000098 ], [ 6.241820109000116, 46.263688864000045 ], [ 6.252258748000145, 46.259916484000115 ], [ 6.269001912000078, 46.265239156000064 ], [ 6.276029907000094, 46.263120423 ], [ 6.281197550000115, 46.240072734000137 ], [ 6.255359335000094, 46.221107484000072 ], [ 6.191383911000088, 46.191703594000103 ], [ 6.140327596000134, 46.150207418000036 ], [ 6.107874796000118, 46.138631897000067 ], [ 6.073871704000084, 46.149173890000043 ], [ 6.028293090000091, 46.147933655000088 ], [ 5.982921183000144, 46.140440572000074 ], [ 5.958839966000113, 46.130467021000072 ], [ 5.972172485000044, 46.152171122000055 ], [ 5.979820597000128, 46.162248027000089 ], [ 5.982921183000144, 46.170826314000124 ], [ 5.965247843000071, 46.186225891000106 ], [ 5.954809204000128, 46.199920146000125 ], [ 5.958529907000127, 46.211960754000103 ], [ 5.982921183000144, 46.222709452000117 ], [ 6.042865844000062, 46.243069967000054 ], [ 6.044519491000102, 46.243431702000066 ], [ 6.04617313600005, 46.243535055000081 ], [ 6.048033488000044, 46.243431702000066 ], [ 6.055888305000082, 46.241674704000076 ], [ 6.061882772000104, 46.241157939000033 ], [ 6.067670532000079, 46.24162302700006 ], [ 6.089684692000077, 46.246377259000042 ], [ 6.094025513000133, 46.253043518000055 ], [ 6.093095337000108, 46.262293600000078 ], [ 6.093612101000133, 46.273093974000119 ], [ 6.100743448000088, 46.301412659000107 ], [ 6.104050740000076, 46.309215800000118 ], [ 6.118607037000089, 46.331771085000099 ], [ 6.136400187000078, 46.359341940000036 ], [ 6.135056600000098, 46.370400696000047 ], [ 6.12286096200009, 46.385541891000059 ], [ 6.108184855000104, 46.396497294000142 ], [ 6.059019361000082, 46.4173832110001 ], [ 6.054234660000134, 46.419415792000081 ], [ 6.065706827000071, 46.427012228000137 ], [ 6.06756717900015, 46.433600973000125 ], [ 6.065500122000088, 46.440370586000057 ], [ 6.065500122000088, 46.447992859000124 ], [ 6.064776652000091, 46.451067607000056 ], [ 6.062399536000072, 46.455201722000083 ], [ 6.060229126000081, 46.459904277000078 ], [ 6.060229126000081, 46.465020244000073 ], [ 6.064156535000052, 46.471118063000119 ], [ 6.075525349000117, 46.479592998000015 ], [ 6.110355265000095, 46.520830790000019 ], [ 6.145701945000099, 46.551629944000098 ], [ 6.12151737500011, 46.57028513700007 ], [ 6.118416789000065, 46.583462626000141 ], [ 6.131852661000039, 46.595606588000038 ], [ 6.266314738000062, 46.680355937000058 ], [ 6.337938273000106, 46.70740855000011 ], [ 6.347860148000109, 46.713170472000087 ], [ 6.374215128000088, 46.733608501000049 ], [ 6.407391398000101, 46.745700786000015 ], [ 6.417933390000144, 46.751100973000092 ], [ 6.429198853000116, 46.760816142000124 ], [ 6.433022908000055, 46.769110210000093 ], [ 6.432609497000044, 46.785982565000069 ], [ 6.425168090000113, 46.791615296000089 ], [ 6.419897095000096, 46.796524557000026 ], [ 6.417106568000122, 46.802157288000075 ], [ 6.418553507000127, 46.807014872000082 ], [ 6.434263143000095, 46.839545187000112 ], [ 6.441187785000068, 46.84814931300005 ], [ 6.443117662000049, 46.8514551210001 ], [ 6.4467688390001, 46.857709453000069 ], [ 6.448422486000141, 46.871558737000015 ], [ 6.445218546000064, 46.882617493000026 ], [ 6.431886027000132, 46.900032451000044 ], [ 6.427751913000122, 46.909075827 ], [ 6.442634725000062, 46.944164124000054 ], [ 6.491107218000138, 46.963387757000078 ], [ 6.598697550000082, 46.986538798000055 ], [ 6.665411824000103, 47.021291199000103 ], [ 6.688252807000112, 47.04384796100004 ], [ 6.676263875000132, 47.062399801000083 ], [ 6.689699747000105, 47.078290304000092 ], [ 6.699104858000055, 47.08462066700011 ], [ 6.724219604000069, 47.090770162000069 ], [ 6.727940307000097, 47.097126363000115 ], [ 6.731661011000085, 47.098883363000084 ], [ 6.746027059000113, 47.103947653000063 ], [ 6.744786824000073, 47.121052551000105 ], [ 6.774759155000112, 47.128183899000135 ], [ 6.838076256000079, 47.16813159700007 ], [ 6.840284871000108, 47.169525045000086 ], [ 6.859301798000075, 47.190919088000101 ], [ 6.88834395300006, 47.211305441000036 ], [ 6.956246785000104, 47.24523101800014 ], [ 6.952216024000023, 47.270035705000083 ], [ 6.958623901000067, 47.29055125000005 ], [ 6.97743412300008, 47.303728739000036 ], [ 6.986529174000054, 47.304503887000067 ], [ 6.991903524000094, 47.305950827000061 ], [ 7.00647627800015, 47.319360860000074 ], [ 7.016914917000094, 47.323520813000101 ], [ 7.027146850000094, 47.325432841000037 ], [ 7.036551961000043, 47.329515279000049 ], [ 7.044303426000056, 47.340496521000034 ], [ 7.033864787000113, 47.350650940000094 ], [ 7.018878621000056, 47.359901021000098 ], [ 7.003995809000088, 47.368143413000041 ], [ 6.985598999000104, 47.362123108000105 ], [ 6.866639852000077, 47.354164937000036 ], [ 6.871600789000127, 47.366954855000102 ], [ 6.884003133000078, 47.382586976000056 ], [ 6.898782593000107, 47.395712790000033 ], [ 6.924517456000103, 47.405996400000021 ], [ 6.926067749000112, 47.424858297000043 ], [ 6.952319376000048, 47.428837383000115 ], [ 6.968545777000145, 47.435193583000057 ], [ 6.983428589000113, 47.443797709000108 ], [ 6.990973348000068, 47.452220968000091 ], [ 6.986115763000043, 47.464132385000113 ], [ 6.975780477000114, 47.477955831000088 ], [ 6.973300008000138, 47.489092103000104 ], [ 6.991903524000094, 47.492941997000059 ], [ 7.000791870000114, 47.497670390000053 ], [ 7.009783569000149, 47.499246522000078 ], [ 7.018878621000056, 47.497670390000053 ], [ 7.027973674000094, 47.492941997000059 ], [ 7.053915242000073, 47.490384013000067 ], [ 7.103731323000091, 47.496275126000057 ], [ 7.127295776000096, 47.492941997000059 ], [ 7.140318237000116, 47.487851868000064 ], [ 7.142169389000088, 47.487650968000054 ], [ 7.15365075700015, 47.48640492800007 ], [ 7.180832560000056, 47.488265280000093 ], [ 7.1626424560001, 47.45989491800006 ], [ 7.168326863000061, 47.443565165000052 ], [ 7.190030965000034, 47.434728496000048 ], [ 7.219383179000118, 47.428475647000141 ], [ 7.223517293000043, 47.426227723000125 ], [ 7.226307820000102, 47.422636211000054 ], [ 7.230338583000105, 47.419018861000069 ], [ 7.2380900470001, 47.416796773000073 ], [ 7.244807984000119, 47.417726949000013 ], [ 7.28263513200011, 47.428889059000142 ], [ 7.309093465000103, 47.432661438000082 ], [ 7.336930048000085, 47.431853680000131 ], [ 7.37854659000007, 47.430646058000036 ], [ 7.388218887000107, 47.433288860000118 ], [ 7.406348511000118, 47.438242493000075 ], [ 7.420563120000111, 47.450857028000115 ], [ 7.426088908000082, 47.455760803000061 ], [ 7.429292847000056, 47.465114238000098 ], [ 7.427639200000101, 47.470746969000118 ], [ 7.422781616000094, 47.475423686000084 ], [ 7.419474325000095, 47.477852478000045 ], [ 7.414410034000099, 47.484027812000136 ], [ 7.414306681000085, 47.490177307000096 ], [ 7.425985555000068, 47.492502747000032 ], [ 7.44148848500015, 47.488833720000031 ], [ 7.445995797000137, 47.486884129000117 ], [ 7.454510946000113, 47.483200989000096 ], [ 7.467430053000101, 47.481909078000058 ], [ 7.482726278000058, 47.491262512000105 ], [ 7.484483276000049, 47.492941997000059 ], [ 7.485826864000103, 47.495784200000116 ], [ 7.485930217000146, 47.498393860000135 ], [ 7.485776134000076, 47.49876751100004 ], [ 7.484896688000049, 47.500900167000111 ], [ 7.477765340000104, 47.507695618000071 ], [ 7.475594930000028, 47.511726379000066 ], [ 7.476938517000093, 47.514878643000117 ], [ 7.482726278000058, 47.516997376000091 ], [ 7.493061564000072, 47.515498759000081 ], [ 7.501123087000082, 47.51730743400006 ], [ 7.505463908000138, 47.523017681000027 ], [ 7.505153850000056, 47.533017070000142 ], [ 7.501743205000139, 47.532965394000115 ], [ 7.485103394000106, 47.541595357000062 ], [ 7.482726278000058, 47.542267151000061 ], [ 7.520866596000104, 47.563416048000136 ], [ 7.52634118600011, 47.566451721000107 ], [ 7.550319051000116, 47.575495097000072 ], [ 7.585482836000097, 47.584479135 ], [ 7.586028488000125, 47.584618544000108 ], [ 7.637032104000099, 47.594977112000066 ], [ 7.65966638200004, 47.596579082000119 ], [ 7.646540568000091, 47.571541850000102 ], [ 7.635895223000091, 47.564591370000102 ], [ 7.612337281000094, 47.56473104100013 ], [ 7.609746948000094, 47.564746399000057 ], [ 7.64690103500007, 47.551445236000063 ], [ 7.661423380000116, 47.54624623600003 ], [ 7.683437540000114, 47.544256694000097 ], [ 7.727320447000125, 47.550422624000106 ], [ 7.766739949000055, 47.55596140600008 ], [ 7.78555017100004, 47.563196106000134 ], [ 7.801466512000076, 47.576089376000141 ], [ 7.819656616000117, 47.595338847000079 ], [ 7.83371260600012, 47.590481263000044 ], [ 7.898204794000066, 47.587845764000036 ], [ 7.904302613000112, 47.583556621000071 ], [ 7.907506551000097, 47.574177348000035 ], [ 7.909470256000105, 47.564798076000073 ], [ 7.91215743000015, 47.560560608000117 ], [ 8.042278686000088, 47.560560608000117 ], [ 8.087237182000109, 47.567381897000075 ], [ 8.096952351000141, 47.571851909000088 ], [ 8.101396525000069, 47.57619272900007 ], [ 8.105427286000065, 47.581257019000049 ], [ 8.113902221000075, 47.587845764000036 ], [ 8.122067098000088, 47.592134908000105 ], [ 8.143771199000071, 47.600067241000062 ], [ 8.162064656000041, 47.603762105000072 ], [ 8.168885946000103, 47.608645528000096 ], [ 8.173846883000067, 47.613528951000035 ], [ 8.17901452600006, 47.615802715000115 ], [ 8.232964721000116, 47.621952210000103 ], [ 8.251051473000132, 47.622003886000101 ], [ 8.276993042000072, 47.616629537000051 ], [ 8.288568562000108, 47.615802715000115 ], [ 8.293942912000091, 47.611461894000058 ], [ 8.299317260000038, 47.601824239000052 ], [ 8.306345255000053, 47.592186585000036 ], [ 8.316163777000014, 47.587845764000036 ], [ 8.354094279000037, 47.581024475000078 ], [ 8.418069702000111, 47.580766094000097 ], [ 8.421100326000044, 47.581111870000115 ], [ 8.448868856000075, 47.584280091000068 ], [ 8.450109090000097, 47.58903432300005 ], [ 8.461787964000081, 47.606139221 ], [ 8.492380411000084, 47.619833476000025 ], [ 8.522352742000038, 47.621900534000076 ], [ 8.53775231900002, 47.612133688000142 ], [ 8.549637899000061, 47.598594462000051 ], [ 8.551719149000036, 47.596863329000087 ], [ 8.560696655000072, 47.589396057000073 ], [ 8.574132527000103, 47.592444967000091 ], [ 8.576305366000042, 47.595023058000066 ], [ 8.580643758000093, 47.600170594000076 ], [ 8.581780639000101, 47.607663677000119 ], [ 8.581263875000047, 47.614769186000046 ], [ 8.582504110000087, 47.62159047500009 ], [ 8.582090698000087, 47.625026957000046 ], [ 8.579713583000114, 47.628928529000092 ], [ 8.578059936000074, 47.633476054000141 ], [ 8.580333699000107, 47.639005432000033 ], [ 8.583951050000081, 47.641124166000111 ], [ 8.589222046000117, 47.64246775400008 ], [ 8.593562866000099, 47.642571106000105 ], [ 8.594493042000039, 47.64096913700007 ], [ 8.595113159000107, 47.634819641 ], [ 8.601624390000069, 47.632597555000103 ], [ 8.607308797000115, 47.656291199000037 ], [ 8.598213745000066, 47.656885478000106 ], [ 8.593588683000092, 47.658168560000036 ], [ 8.582194051000101, 47.661329651000102 ], [ 8.568241414000113, 47.662931621000041 ], [ 8.519665568000107, 47.657350566000019 ], [ 8.504679402000136, 47.652260437000052 ], [ 8.490830119000066, 47.645568339000107 ], [ 8.476050659000066, 47.640400696000114 ], [ 8.458273966000121, 47.639883932000089 ], [ 8.437603394000121, 47.647842102000141 ], [ 8.411971883000149, 47.66104543000003 ], [ 8.40701094500011, 47.661562195000073 ], [ 8.391301310000131, 47.665463765000112 ], [ 8.397709188000078, 47.676289979000074 ], [ 8.395228719000102, 47.684816590000082 ], [ 8.390991251000059, 47.692128805000067 ], [ 8.392128133000142, 47.699518535000067 ], [ 8.401946655000131, 47.707089132000135 ], [ 8.427268107000117, 47.716468404000096 ], [ 8.437913452000089, 47.723186341000115 ], [ 8.445458211000044, 47.743185120000135 ], [ 8.450109090000097, 47.750471497000035 ], [ 8.463648315000086, 47.763907370000084 ], [ 8.471503133000112, 47.767059632000041 ], [ 8.482665242000053, 47.76685292600007 ], [ 8.536512085000084, 47.774087626000039 ], [ 8.55160160300008, 47.779255270000135 ], [ 8.542299846000077, 47.795016581000112 ], [ 8.558216187000085, 47.80116607700009 ], [ 8.58312422700007, 47.800235901000036 ], [ 8.601624390000069, 47.794603170000101 ], [ 8.603174682000088, 47.787316793000031 ], [ 8.604104858000142, 47.774397685000025 ], [ 8.607618856000101, 47.762253723000129 ], [ 8.617437378000091, 47.757318624000078 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ADMIN": "Germany", "ISO_A3": "DEU", "ISO_A2": "DE" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 6.742198113000114, 53.57835521000014 ], [ 6.749522332000112, 53.572414455000015 ], [ 6.756521030000101, 53.562892971000011 ], [ 6.747569207000083, 53.565985419000086 ], [ 6.734629754000054, 53.575181382000082 ], [ 6.72608483200014, 53.57713450700011 ], [ 6.715993686000076, 53.576076565000065 ], [ 6.701182488000114, 53.571437893000123 ], [ 6.695078972000118, 53.570298570000105 ], [ 6.67709394600007, 53.575628973000065 ], [ 6.663340691000144, 53.58734772300015 ], [ 6.659515821000127, 53.599107164000131 ], [ 6.671153191000144, 53.604437567 ], [ 6.747325066000116, 53.618353583000086 ], [ 6.784678582000083, 53.62006256700009 ], [ 6.798106316000087, 53.604437567 ], [ 6.775645379000082, 53.602484442000147 ], [ 6.740896030000101, 53.593451239000146 ], [ 6.72242272200009, 53.590765692000062 ], [ 6.72242272200009, 53.584621486000074 ], [ 6.733571811000104, 53.58201732 ], [ 6.742198113000114, 53.57835521000014 ] ] ], [ [ [ 7.085459832000083, 53.686997789000017 ], [ 6.873789910000141, 53.672756252000099 ], [ 6.910817905000101, 53.683661200000145 ], [ 7.047048373000052, 53.69415924700003 ], [ 7.085459832000083, 53.686997789000017 ] ] ], [ [ [ 7.34669030000012, 53.723211981000119 ], [ 7.345062696000099, 53.722072658000073 ], [ 7.342295769000117, 53.722113348000065 ], [ 7.295746290000096, 53.711004950000031 ], [ 7.17359459700009, 53.701402085000055 ], [ 7.133148634000122, 53.708075262000122 ], [ 7.178965691000116, 53.724066473000036 ], [ 7.232920769000145, 53.729437567000062 ], [ 7.346202019000117, 53.727972723 ], [ 7.34669030000012, 53.723211981000119 ] ] ], [ [ [ 7.422618035000141, 53.734198309000149 ], [ 7.435557488000143, 53.727972723 ], [ 7.432383660000085, 53.724066473000036 ], [ 7.42904707100007, 53.722479559000178 ], [ 7.42123457100007, 53.721136786 ], [ 7.381195509000122, 53.72850169499999 ], [ 7.366547071000127, 53.727972723 ], [ 7.38306725400011, 53.734849351000108 ], [ 7.403493686000076, 53.736721096000096 ], [ 7.422618035000141, 53.734198309000149 ] ] ], [ [ [ 8.171722852000073, 53.725572007000082 ], [ 8.155772332000083, 53.716376044000086 ], [ 8.150889519000117, 53.714300848000065 ], [ 8.142263217000107, 53.715643622000144 ], [ 8.136729363000086, 53.717962958000115 ], [ 8.130707227000073, 53.718451239000117 ], [ 8.12012780000012, 53.714300848000065 ], [ 8.12012780000012, 53.721136786 ], [ 8.13266035200013, 53.734035549000012 ], [ 8.152354363000057, 53.739162502000042 ], [ 8.174815300000148, 53.737005927000112 ], [ 8.195974155000073, 53.727972723 ], [ 8.181651238000086, 53.727972723 ], [ 8.171722852000073, 53.725572007000082 ] ] ], [ [ [ 7.62720787900011, 53.750921942 ], [ 7.625743035000141, 53.749945380000113 ], [ 7.62330162900011, 53.749986070000105 ], [ 7.620616082000112, 53.749090887000122 ], [ 7.547699415000096, 53.750433661000116 ], [ 7.51392662900011, 53.745510158000158 ], [ 7.51124108200014, 53.727972723 ], [ 7.481944207000112, 53.727118231000119 ], [ 7.472992384000094, 53.731878973 ], [ 7.469574415000068, 53.74534739799999 ], [ 7.474619988000114, 53.756822007000139 ], [ 7.486989780000044, 53.761419989000061 ], [ 7.517425977000102, 53.762111721000011 ], [ 7.606618686000076, 53.762600002000099 ], [ 7.626719597000118, 53.755275783000101 ], [ 7.62720787900011, 53.750921942 ] ] ], [ [ [ 7.798594597000118, 53.77635325700011 ], [ 7.776215040000125, 53.767971096000153 ], [ 7.748220248000081, 53.760931708000086 ], [ 7.719493035000141, 53.759914455000015 ], [ 7.694997592000107, 53.76951732000002 ], [ 7.685883009000122, 53.761786200000088 ], [ 7.67709394600007, 53.757798570000105 ], [ 7.668630405000101, 53.757879950000088 ], [ 7.660899285000113, 53.762111721000011 ], [ 7.686289910000113, 53.780991929000137 ], [ 7.728282097000118, 53.78656647300015 ], [ 7.812836134000122, 53.783148505000142 ], [ 7.812836134000122, 53.77635325700011 ], [ 7.798594597000118, 53.77635325700011 ] ] ], [ [ [ 7.928965691000144, 53.792547919000171 ], [ 7.955577019000117, 53.782904364 ], [ 7.946055535000113, 53.784002997000144 ], [ 7.93531334700009, 53.783148505000142 ], [ 7.893239780000044, 53.78896719 ], [ 7.875254754000082, 53.788397528000033 ], [ 7.873789910000141, 53.77635325700011 ], [ 7.854502800000091, 53.784572658000016 ], [ 7.858897332000083, 53.79092031500015 ], [ 7.876719597000147, 53.794867255000113 ], [ 7.897634311000104, 53.796291408000101 ], [ 7.914073113000114, 53.795355536000116 ], [ 7.928965691000144, 53.792547919000171 ] ] ], [ [ [ 11.49789472700013, 54.02277252800009 ], [ 11.468272332000083, 53.970689195000048 ], [ 11.457692905000044, 53.961371161 ], [ 11.445323113000086, 53.961127020000148 ], [ 11.444509311000076, 53.968085028000061 ], [ 11.451426629000082, 53.985541083 ], [ 11.44703209700009, 53.997137762000122 ], [ 11.438731316000116, 53.997259833 ], [ 11.433278842000078, 53.988755601000051 ], [ 11.437754754000139, 53.975002346000124 ], [ 11.423106316000144, 53.967718817000119 ], [ 11.407074415000039, 53.968207098000036 ], [ 11.390961134000065, 53.97394440300009 ], [ 11.375661655000101, 53.981838283000158 ], [ 11.390391472000118, 54.004584052 ], [ 11.426605665000125, 54.022935289000046 ], [ 11.468028191000144, 54.030951239 ], [ 11.49789472700013, 54.02277252800009 ] ] ], [ [ [ 11.539561394000089, 54.05695221600017 ], [ 11.533946160000085, 54.05695221600017 ], [ 11.528493686000047, 54.07510000200007 ], [ 11.528575066000116, 54.077460028000033 ], [ 11.533946160000085, 54.084865627000013 ], [ 11.601898634000065, 54.10415273600016 ], [ 11.615896030000016, 54.112127997000115 ], [ 11.598968946000127, 54.098049221000068 ], [ 11.552744988000143, 54.073065497000144 ], [ 11.539561394000089, 54.05695221600017 ] ] ], [ [ [ 13.986175977000073, 54.071234442000062 ], [ 14.01661217500012, 54.060003973000065 ], [ 14.192393425000148, 53.94611237200003 ], [ 14.209483269000089, 53.938625393000066 ], [ 14.210052931000064, 53.938462632 ], [ 14.210075518000423, 53.938456568001371 ], [ 14.193066040000105, 53.911490784000151 ], [ 14.184797811000067, 53.908131816000051 ], [ 14.175289348000092, 53.906478170000113 ], [ 14.192755981000118, 53.893765768000051 ], [ 14.200818737011843, 53.87815729282859 ], [ 14.08741295700014, 53.870428778000061 ], [ 14.065114780000101, 53.87238190300009 ], [ 14.048350457000083, 53.879380601000079 ], [ 14.025075717000078, 53.863836981000148 ], [ 13.995860222000147, 53.853745835000026 ], [ 13.93848717500012, 53.844671942 ], [ 13.875254754000139, 53.844061591000141 ], [ 13.840098504000082, 53.850287177000027 ], [ 13.821787957000112, 53.865139065000065 ], [ 13.834727410000113, 53.867987372000115 ], [ 13.855479363000114, 53.877386786000116 ], [ 13.887705925000148, 53.881537177000084 ], [ 13.922373894000145, 53.89337799700003 ], [ 13.931651238000086, 53.899318752000156 ], [ 13.938975457000112, 53.928208726000079 ], [ 13.901866082000083, 53.969794012000065 ], [ 13.904470248000081, 53.995428778000118 ], [ 13.954844597000118, 53.993597723000121 ], [ 13.972666863000114, 53.989243882000054 ], [ 13.965830925000091, 53.981838283000158 ], [ 13.968272332000112, 53.976263739000146 ], [ 13.96029707100007, 53.956732489000061 ], [ 13.958994988000086, 53.94086334800015 ], [ 13.974619988000143, 53.957342841000028 ], [ 13.987478061000076, 53.961411850999987 ], [ 14.027842644000145, 53.961371161 ], [ 14.022634311000047, 53.958970445000048 ], [ 14.018565300000091, 53.956366278000147 ], [ 14.01587975400011, 53.952704169000114 ], [ 14.014333530000073, 53.947088934000092 ], [ 14.048350457000083, 53.94086334800015 ], [ 14.040293816000144, 53.953843492000047 ], [ 14.053070509000094, 53.97842031500015 ], [ 14.051280144000117, 54.005072333000086 ], [ 14.037445509000122, 54.02171458500014 ], [ 14.014333530000073, 54.016017971000153 ], [ 14.006195509000065, 54.032294012000179 ], [ 13.995290561000076, 54.045721747000172 ], [ 13.981700066000116, 54.056341864000117 ], [ 13.965830925000091, 54.06378815300009 ], [ 13.946055535000056, 54.066595770000148 ], [ 13.926117384000094, 54.064032294000057 ], [ 13.915863477000045, 54.056382554000109 ], [ 13.924815300000091, 54.043890692 ], [ 13.924815300000091, 54.036444403000033 ], [ 13.916270379000139, 54.033636786000088 ], [ 13.907237175000148, 54.0274925800001 ], [ 13.89991295700014, 54.01972077 ], [ 13.896983269000117, 54.012274481000119 ], [ 13.890879754000139, 54.010158596000011 ], [ 13.855967644000117, 54.002346096000011 ], [ 13.858083530000044, 54.015773830000015 ], [ 13.865570509000094, 54.024074611000074 ], [ 13.873545769000145, 54.029974677000112 ], [ 13.876312696000099, 54.036444403000033 ], [ 13.871104363000114, 54.048651434000092 ], [ 13.863617384000037, 54.049994208 ], [ 13.85499108200014, 54.046332098000121 ], [ 13.823008660000141, 54.037909247000087 ], [ 13.80827884200005, 54.026312567000062 ], [ 13.794200066000116, 54.018133856000148 ], [ 13.774099155000073, 54.02277252800009 ], [ 13.782074415000125, 54.042141018 ], [ 13.809255405000044, 54.07510000200007 ], [ 13.814952019000117, 54.101263739000117 ], [ 13.80616295700014, 54.116644598000065 ], [ 13.765310092000107, 54.141913153000118 ], [ 13.752940300000148, 54.153143622000115 ], [ 13.762217644000117, 54.164455471000011 ], [ 13.777598504000139, 54.174017645000092 ], [ 13.796153191000144, 54.178290106000091 ], [ 13.814952019000117, 54.173651434000149 ], [ 13.823741082000083, 54.16396719 ], [ 13.844086134000065, 54.131293036000088 ], [ 13.855967644000117, 54.118353583000058 ], [ 13.882497592000078, 54.102443752000156 ], [ 13.948415561000104, 54.079779364 ], [ 13.986175977000073, 54.071234442000062 ] ] ], [ [ [ 7.904144727000102, 54.180405992000104 ], [ 7.899180535000141, 54.178168036000116 ], [ 7.897715691000087, 54.182318427000055 ], [ 7.893565300000148, 54.183091538999989 ], [ 7.89039147200009, 54.187567450000145 ], [ 7.885915561000047, 54.190659898000135 ], [ 7.87989342500012, 54.193915106000176 ], [ 7.894541863000114, 54.194647528000118 ], [ 7.90064537900011, 54.190659898000135 ], [ 7.904144727000102, 54.180405992000104 ] ] ], [ [ [ 7.93344160200013, 54.189886786000116 ], [ 7.917653842000078, 54.186997788999989 ], [ 7.91236412900011, 54.192287502000156 ], [ 7.929860873000052, 54.195298570000077 ], [ 7.93344160200013, 54.189886786000116 ] ] ], [ [ [ 8.887950066000116, 54.468451239000146 ], [ 8.844493035000085, 54.466498114 ], [ 8.82390384200005, 54.4708519550001 ], [ 8.812836134000122, 54.482123114000089 ], [ 8.823741082000083, 54.485541083 ], [ 8.82553144600007, 54.491197007 ], [ 8.820974155000044, 54.497259833000086 ], [ 8.812836134000122, 54.50193919500002 ], [ 8.844493035000085, 54.519720770000092 ], [ 8.879649285000141, 54.529120184000092 ], [ 8.919200066000087, 54.530462958 ], [ 8.963145379000139, 54.523667710000083 ], [ 8.958506707000112, 54.522447007000054 ], [ 8.956309441000116, 54.51943594000015 ], [ 8.955821160000113, 54.514960028000175 ], [ 8.956879102000073, 54.509426174000069 ], [ 8.93848717500012, 54.49909088700015 ], [ 8.925791863000086, 54.486761786000031 ], [ 8.911306186000047, 54.475490627000013 ], [ 8.887950066000116, 54.468451239000146 ] ] ], [ [ [ 11.25562584700009, 54.478705145000063 ], [ 11.314219597000118, 54.413804429 ], [ 11.18848717500012, 54.426174221000124 ], [ 11.170176629000082, 54.420070705000128 ], [ 11.174652540000125, 54.41600169499999 ], [ 11.179047071000127, 54.4142113300001 ], [ 11.138845248000109, 54.412665106000148 ], [ 11.112640821000099, 54.415228583000058 ], [ 11.10132897200009, 54.423488674000154 ], [ 11.103282097000147, 54.443833726000051 ], [ 11.09864342500012, 54.451646226000136 ], [ 11.084320509000122, 54.454779364000032 ], [ 11.058116082000112, 54.455267645 ], [ 11.047373894000089, 54.453273830000157 ], [ 11.039886915000125, 54.447333075000031 ], [ 11.032481316000144, 54.447333075000031 ], [ 11.029144727000102, 54.454657294000057 ], [ 11.025726759000094, 54.458807684000178 ], [ 11.020355665000125, 54.458970445000048 ], [ 11.008474155000101, 54.454657294000057 ], [ 11.00570722700013, 54.468451239000146 ], [ 11.033702019000145, 54.508856512000094 ], [ 11.072927280000073, 54.531195380000113 ], [ 11.121267123000081, 54.53595612200003 ], [ 11.20655358200014, 54.514471747000087 ], [ 11.23210696700005, 54.501654364000061 ], [ 11.240000847000118, 54.495550848000065 ], [ 11.25562584700009, 54.478705145000063 ] ] ], [ [ [ 8.66976972700013, 54.501898505000028 ], [ 8.641286655000101, 54.49237702 ], [ 8.618825717000107, 54.492621161000059 ], [ 8.606130405000044, 54.499212958000115 ], [ 8.595876498000109, 54.51365794499999 ], [ 8.602061394000089, 54.529771226000051 ], [ 8.62012780000012, 54.537909247000172 ], [ 8.627452019000117, 54.539943752000013 ], [ 8.63453209700009, 54.542629299000069 ], [ 8.698903842000078, 54.55857982 ], [ 8.700938347000118, 54.547756252000099 ], [ 8.692881707000083, 54.523260809000149 ], [ 8.66976972700013, 54.501898505000028 ] ] ], [ [ [ 13.15723717500012, 54.599066473000121 ], [ 13.157074415000068, 54.587958075000088 ], [ 13.156504754000082, 54.589056708000143 ], [ 13.153656446000127, 54.591131903000147 ], [ 13.149668816000059, 54.591376044000086 ], [ 13.149668816000059, 54.577704169000143 ], [ 13.143402540000125, 54.577704169000143 ], [ 13.143402540000125, 54.598130601000136 ], [ 13.11890709700009, 54.586411851000051 ], [ 13.11312910200013, 54.570054429000137 ], [ 13.112152540000068, 54.550685940000037 ], [ 13.102549675000063, 54.529933986000017 ], [ 13.095225457000083, 54.524359442 ], [ 13.081065300000148, 54.517157294000171 ], [ 13.075043165000125, 54.509426174000069 ], [ 13.071462436000076, 54.499660549000126 ], [ 13.069590691000087, 54.48965078300013 ], [ 13.06820722700013, 54.468451239000146 ], [ 13.061371290000096, 54.468451239000146 ], [ 13.061371290000096, 54.482123114000089 ], [ 13.064219597000147, 54.505113023000078 ], [ 13.095550977000102, 54.570786851000079 ], [ 13.102305535000113, 54.596096096000011 ], [ 13.109629754000139, 54.603094794000086 ], [ 13.125987175000148, 54.605617580000015 ], [ 13.139821811000047, 54.606024481000119 ], [ 13.151052280000044, 54.604925848000065 ], [ 13.15723717500012, 54.599066473000121 ] ] ], [ [ [ 13.390879754000139, 54.650539455000015 ], [ 13.382985873000081, 54.636379299000097 ], [ 13.385996941000087, 54.618638413999989 ], [ 13.394541863000086, 54.60443756700009 ], [ 13.40772545700014, 54.593410549000126 ], [ 13.424571160000141, 54.585150458000143 ], [ 13.466319207000083, 54.576890367000047 ], [ 13.595957879000082, 54.591376044000086 ], [ 13.640472852000073, 54.585679429000109 ], [ 13.670664910000085, 54.566229559000121 ], [ 13.677256707000083, 54.540472723000093 ], [ 13.651133660000113, 54.516262111000074 ], [ 13.60678144600007, 54.49896881700009 ], [ 13.584808790000068, 54.486517645000063 ], [ 13.575450066000116, 54.471869208000058 ], [ 13.579112175000091, 54.455064195000048 ], [ 13.587901238000143, 54.437567450000088 ], [ 13.59913170700014, 54.422674872000059 ], [ 13.609548373000052, 54.413804429 ], [ 13.630056186000104, 54.407538153000061 ], [ 13.67741946700005, 54.400824286 ], [ 13.69825280000012, 54.392075914000131 ], [ 13.724864129000139, 54.363592841000113 ], [ 13.74195397200009, 54.350490627000127 ], [ 13.766449415000125, 54.344916083000143 ], [ 13.753103061000104, 54.339300848000121 ], [ 13.74008222700013, 54.329820054000137 ], [ 13.73015384200005, 54.316839911000116 ], [ 13.72624759200005, 54.300523179000109 ], [ 13.72624759200005, 54.284654038999989 ], [ 13.723155144000145, 54.278387762000037 ], [ 13.712738477000073, 54.278998114 ], [ 13.690928582000112, 54.283514716000141 ], [ 13.702647332000083, 54.283514716000141 ], [ 13.711924675000148, 54.286566473000121 ], [ 13.715993686000104, 54.293280341000084 ], [ 13.711924675000148, 54.303941148000106 ], [ 13.705088738000114, 54.303941148000106 ], [ 13.694834832000112, 54.297430731000034 ], [ 13.679453972000147, 54.294012762000122 ], [ 13.663340691000087, 54.293890692000147 ], [ 13.651133660000113, 54.297186591000084 ], [ 13.651133660000113, 54.303941148000106 ], [ 13.688243035000113, 54.313299872000144 ], [ 13.70362389400006, 54.3204613300001 ], [ 13.711924675000148, 54.331854559000149 ], [ 13.65992272200009, 54.329779364000146 ], [ 13.636729363000143, 54.325506903000033 ], [ 13.616953972000118, 54.31761302300005 ], [ 13.672129754000139, 54.340318101000022 ], [ 13.690928582000112, 54.344916083000143 ], [ 13.690928582000112, 54.351752020000148 ], [ 13.664073113000114, 54.353257554000109 ], [ 13.650075717000078, 54.352443752000099 ], [ 13.640310092000107, 54.348334052000141 ], [ 13.62680097700013, 54.33909739799999 ], [ 13.618337436000104, 54.341376044000143 ], [ 13.610606316000087, 54.347967841000028 ], [ 13.599294467000107, 54.351752020000148 ], [ 13.499685092000078, 54.344916083000143 ], [ 13.481781446000099, 54.338283596000068 ], [ 13.428884311000047, 54.310939846000011 ], [ 13.417735222000118, 54.300523179000109 ], [ 13.40609785200013, 54.285223700000145 ], [ 13.381602410000085, 54.282212632000054 ], [ 13.359629754000082, 54.275458075000117 ], [ 13.355723504000082, 54.248724677 ], [ 13.36939537900011, 54.255560614000117 ], [ 13.369639519000145, 54.260646877000127 ], [ 13.367523634000065, 54.26194896000014 ], [ 13.364756707000083, 54.262030341000028 ], [ 13.363129102000073, 54.26300690300009 ], [ 13.410899285000113, 54.267889716000141 ], [ 13.417735222000118, 54.266058661000088 ], [ 13.425059441000144, 54.24323151200015 ], [ 13.423024936000104, 54.232733466000084 ], [ 13.407237175000148, 54.228216864000146 ], [ 13.378672722000061, 54.230861721000124 ], [ 13.347015821000099, 54.237453518 ], [ 13.31153405000012, 54.251125393000123 ], [ 13.319509311000076, 54.256415106000119 ], [ 13.324880405000016, 54.268215236000074 ], [ 13.335215691000116, 54.283514716000141 ], [ 13.32056725400011, 54.278387762000037 ], [ 13.31397545700014, 54.274400132000054 ], [ 13.307871941000144, 54.269191799000154 ], [ 13.311859571000127, 54.266424872000087 ], [ 13.314707879000082, 54.26300690300009 ], [ 13.294688347000118, 54.264105536000145 ], [ 13.28419030000012, 54.262844143000123 ], [ 13.27686608200014, 54.259263414000074 ], [ 13.267914259000094, 54.256496486000103 ], [ 13.257985873000109, 54.260443427 ], [ 13.248789910000113, 54.266262111000131 ], [ 13.24244225400011, 54.269191799000154 ], [ 13.227793816000087, 54.270819403000175 ], [ 13.210134311000076, 54.275824286000116 ], [ 13.199229363000086, 54.284409898000135 ], [ 13.20484459700009, 54.297186591000084 ], [ 13.190277540000068, 54.29975006700009 ], [ 13.15967858200014, 54.290961005000113 ], [ 13.149668816000059, 54.29026927299999 ], [ 13.142832879000139, 54.298000393000095 ], [ 13.148936394000145, 54.304754950000031 ], [ 13.162282748000052, 54.30768463700015 ], [ 13.177500847000118, 54.303941148000106 ], [ 13.177500847000118, 54.310207424000069 ], [ 13.115489129000082, 54.33808014500012 ], [ 13.129242384000094, 54.359564520000148 ], [ 13.148936394000145, 54.377264716000141 ], [ 13.174327019000145, 54.383978583 ], [ 13.20484459700009, 54.37225983300003 ], [ 13.211680535000113, 54.37909577000012 ], [ 13.223317905000044, 54.37250397300015 ], [ 13.237152540000125, 54.373968817000033 ], [ 13.266856316000144, 54.385891018000152 ], [ 13.251149936000076, 54.38690827000012 ], [ 13.23926842500012, 54.39362213700015 ], [ 13.234385613000143, 54.403387762000094 ], [ 13.239024285000085, 54.413804429 ], [ 13.239024285000085, 54.420070705000128 ], [ 13.225352410000141, 54.420843817000062 ], [ 13.217946811000076, 54.42568594000015 ], [ 13.211599155000044, 54.431097723000093 ], [ 13.201426629000082, 54.433661200000088 ], [ 13.156993035000085, 54.426825262000179 ], [ 13.174327019000145, 54.447658596000153 ], [ 13.181813998000024, 54.453029690000037 ], [ 13.208832227000073, 54.45693594 ], [ 13.239024285000085, 54.46625397300015 ], [ 13.259532097000147, 54.468451239000146 ], [ 13.259532097000147, 54.475287177000055 ], [ 13.260752800000148, 54.475490627000013 ], [ 13.266856316000144, 54.477484442000062 ], [ 13.273122592000107, 54.482123114000089 ], [ 13.245371941000116, 54.48834870000006 ], [ 13.233246290000125, 54.493068752000156 ], [ 13.225352410000141, 54.50193919500002 ], [ 13.228770379000053, 54.504299221000153 ], [ 13.231944207000112, 54.506008205000157 ], [ 13.233653191000116, 54.509222723 ], [ 13.232758009000122, 54.516262111000074 ], [ 13.203298373000052, 54.509466864000061 ], [ 13.185394727000102, 54.508286851000136 ], [ 13.177500847000118, 54.512844143000066 ], [ 13.17530358200014, 54.516017971000124 ], [ 13.170664910000113, 54.516791083000058 ], [ 13.166026238000086, 54.519110419000029 ], [ 13.16382897200009, 54.52680084800015 ], [ 13.162608269000089, 54.535467841000056 ], [ 13.158864780000044, 54.540676174000126 ], [ 13.152354363000143, 54.542954820000105 ], [ 13.143402540000125, 54.542914130000113 ], [ 13.166351759000094, 54.549383856000119 ], [ 13.242930535000085, 54.55597565300009 ], [ 13.259532097000147, 54.553778387000094 ], [ 13.264903191000087, 54.54779694200009 ], [ 13.276540561000104, 54.545070705000015 ], [ 13.288259311000104, 54.539943752000013 ], [ 13.293630405000044, 54.52680084800015 ], [ 13.297862175000063, 54.5196800800001 ], [ 13.305511915000096, 54.523423570000134 ], [ 13.309255405000044, 54.534816799000097 ], [ 13.301036004000139, 54.550360419000086 ], [ 13.315440300000091, 54.561957098 ], [ 13.333669467000078, 54.57306549700003 ], [ 13.35254967500012, 54.581447658000101 ], [ 13.36939537900011, 54.585150458000143 ], [ 13.358246290000096, 54.564764716000141 ], [ 13.350759311000047, 54.55597565300009 ], [ 13.342051629000139, 54.550360419000086 ], [ 13.348399285000085, 54.550482489000061 ], [ 13.353851759000122, 54.549872137000094 ], [ 13.358653191000116, 54.547552802000141 ], [ 13.363129102000073, 54.542914130000113 ], [ 13.358083530000044, 54.538153387000122 ], [ 13.348887566000144, 54.523667710000083 ], [ 13.363291863000114, 54.523138739 ], [ 13.374847852000073, 54.52558014500012 ], [ 13.383799675000091, 54.53188711100016 ], [ 13.389821811000104, 54.542914130000113 ], [ 13.381358269000145, 54.544378973000065 ], [ 13.371836785000141, 54.548895575000031 ], [ 13.363129102000073, 54.550360419000086 ], [ 13.363129102000073, 54.557196356000119 ], [ 13.376719597000118, 54.564642645000092 ], [ 13.387868686000047, 54.551255600999987 ], [ 13.405528191000144, 54.538234768 ], [ 13.417328321000127, 54.524562893000066 ], [ 13.410899285000113, 54.509426174000069 ], [ 13.43067467500012, 54.492743231000034 ], [ 13.455577019000089, 54.487494208000143 ], [ 13.507090691000144, 54.488267320000077 ], [ 13.499685092000078, 54.495754299000126 ], [ 13.50928795700014, 54.508978583000058 ], [ 13.514170769000117, 54.513128973 ], [ 13.520762566000087, 54.516262111000074 ], [ 13.520762566000087, 54.523667710000083 ], [ 13.512950066000087, 54.537543036000059 ], [ 13.50749759200005, 54.544663804000109 ], [ 13.499685092000078, 54.550360419000086 ], [ 13.499685092000078, 54.557196356000119 ], [ 13.505544467000107, 54.559719143000123 ], [ 13.508799675000148, 54.561835028000033 ], [ 13.512868686000104, 54.563544012000037 ], [ 13.520762566000087, 54.564642645000092 ], [ 13.520762566000087, 54.570786851000079 ], [ 13.50831139400006, 54.570379950000145 ], [ 13.500254754000139, 54.566066799000154 ], [ 13.49390709700009, 54.560736395000092 ], [ 13.48658287900011, 54.557196356000119 ], [ 13.475759311000104, 54.556097723000065 ], [ 13.441416863000143, 54.557196356000119 ], [ 13.436045769000089, 54.560370184000178 ], [ 13.43067467500012, 54.567450262000037 ], [ 13.423838738000114, 54.574530341000084 ], [ 13.41431725400011, 54.577704169000143 ], [ 13.399261915000096, 54.579575914000131 ], [ 13.393077019000145, 54.584540106000176 ], [ 13.38965905000012, 54.591050523000078 ], [ 13.382985873000081, 54.598130601000136 ], [ 13.371348504000082, 54.608099677000112 ], [ 13.369151238000086, 54.612127997000087 ], [ 13.355723504000082, 54.605617580000015 ], [ 13.347911004000082, 54.600816148000106 ], [ 13.331797722000118, 54.587836005000113 ], [ 13.308360222000147, 54.579575914000131 ], [ 13.291351759000094, 54.568793036000116 ], [ 13.273285352000073, 54.560939846000124 ], [ 13.253265821000099, 54.564642645000092 ], [ 13.24976647200009, 54.576483466000141 ], [ 13.256846550000148, 54.594916083000086 ], [ 13.269867384000065, 54.611802476000079 ], [ 13.283946160000085, 54.619289455000128 ], [ 13.286957227000102, 54.623521226000051 ], [ 13.29127037900011, 54.632961330000072 ], [ 13.293467644000089, 54.642279364000117 ], [ 13.290537957000083, 54.646551825000031 ], [ 13.245860222000118, 54.639797268000095 ], [ 13.231211785000085, 54.63385651200015 ], [ 13.224782748000081, 54.634955145000035 ], [ 13.225352410000141, 54.646551825000031 ], [ 13.230967644000145, 54.653306382000082 ], [ 13.241547071000099, 54.659979559000121 ], [ 13.253591342000107, 54.665025132000054 ], [ 13.390798373000081, 54.688177802 ], [ 13.418711785000113, 54.688421942000147 ], [ 13.44507897200009, 54.680080471000068 ], [ 13.44507897200009, 54.673895575000088 ], [ 13.429698113000143, 54.666734117000075 ], [ 13.409027540000039, 54.659816799000154 ], [ 13.390879754000139, 54.650539455000015 ] ] ], [ [ [ 8.36068769600007, 54.710028387000037 ], [ 8.359141472000118, 54.708929755 ], [ 8.356293165000068, 54.70917389500012 ], [ 8.353526238000114, 54.70799388200011 ], [ 8.342458530000073, 54.70140208500014 ], [ 8.332367384000094, 54.693793036 ], [ 8.38233483200014, 54.639146226000051 ], [ 8.40137780000012, 54.632961330000072 ], [ 8.387705925000091, 54.626125393000152 ], [ 8.353688998000081, 54.618963934000121 ], [ 8.330251498000109, 54.631415106000034 ], [ 8.311371290000068, 54.65135325700011 ], [ 8.291514519000145, 54.667059637000179 ], [ 8.320485873000052, 54.698716539000074 ], [ 8.338389519000117, 54.710150458000115 ], [ 8.36036217500012, 54.714829820000134 ], [ 8.36068769600007, 54.710028387000037 ] ] ], [ [ [ 8.574066602000073, 54.69440338700015 ], [ 8.565765821000099, 54.687567450000031 ], [ 8.55209394600007, 54.685003973000121 ], [ 8.535166863000086, 54.68618398600016 ], [ 8.519867384000122, 54.689601955000072 ], [ 8.511241082000112, 54.693793036 ], [ 8.485199415000125, 54.688055731000034 ], [ 8.45281009200005, 54.693833725999987 ], [ 8.394541863000114, 54.714829820000134 ], [ 8.414235873000052, 54.735785223000093 ], [ 8.436778191000144, 54.748480536000145 ], [ 8.464121941000116, 54.75478750200007 ], [ 8.497569207000083, 54.756415106000091 ], [ 8.553233269000089, 54.754461981000148 ], [ 8.575938347000147, 54.746405341000028 ], [ 8.593760613000114, 54.728501695000077 ], [ 8.593760613000114, 54.721665757000054 ], [ 8.58545983200014, 54.713609117000104 ], [ 8.574066602000073, 54.69440338700015 ] ] ], [ [ [ 8.904138224000093, 54.8979422 ], [ 8.982686401000109, 54.879338684000132 ], [ 9.194766480000055, 54.85039988199999 ], [ 9.211509644000103, 54.841821594000137 ], [ 9.216057169000123, 54.83174469 ], [ 9.219054403000143, 54.817792054000122 ], [ 9.226392456000042, 54.805906474 ], [ 9.244065796000143, 54.801772360000157 ], [ 9.317032918000081, 54.801617330000127 ], [ 9.332019084000137, 54.803219300000151 ], [ 9.341734253000084, 54.809058736000154 ], [ 9.355996948000069, 54.811332499000159 ], [ 9.366952352000112, 54.817016907000109 ], [ 9.385039103000054, 54.819394023000072 ], [ 9.405192911000114, 54.808386943000144 ], [ 9.422142781000019, 54.807250061000062 ], [ 9.436922241000048, 54.810143942000039 ], [ 9.437503026532056, 54.810411127058742 ], [ 9.437510613000143, 54.810410874000112 ], [ 9.451426629000139, 54.810370184000121 ], [ 9.510996941000144, 54.827826239000089 ], [ 9.529958530000073, 54.841498114000117 ], [ 9.554372592000107, 54.847113348000036 ], [ 9.566905144000117, 54.860174872000087 ], [ 9.579925977000102, 54.866278387000179 ], [ 9.583181186000047, 54.830267645000035 ], [ 9.631602410000141, 54.819891669000114 ], [ 9.693044467000107, 54.818019924000154 ], [ 9.734629754000082, 54.807318427000112 ], [ 9.752126498000052, 54.799627997000115 ], [ 9.778086785000141, 54.79315827 ], [ 9.801768425000148, 54.783392645000063 ], [ 9.81218509200005, 54.766058661000088 ], [ 9.823741082000083, 54.756740627000127 ], [ 9.84986412900011, 54.759344794000029 ], [ 9.895355665000096, 54.769476630000085 ], [ 9.891449415000096, 54.790269273000078 ], [ 9.91504967500012, 54.791205145000148 ], [ 9.94752037900011, 54.779527085000055 ], [ 9.970469597000118, 54.762640692000062 ], [ 9.984141472000147, 54.728501695000077 ], [ 9.990489129000082, 54.720526434000121 ], [ 9.999522332000083, 54.712958075000145 ], [ 10.018239780000073, 54.701239325000174 ], [ 10.00538170700014, 54.69550202 ], [ 9.992198113000086, 54.696478583000086 ], [ 9.979828321000127, 54.699774481000119 ], [ 9.970469597000118, 54.701239325000174 ], [ 9.971039259000094, 54.699042059000178 ], [ 9.946299675000091, 54.687648830000015 ], [ 9.943125847000147, 54.687567450000031 ], [ 9.936696811000047, 54.685003973000121 ], [ 9.932383660000113, 54.685248114000089 ], [ 9.929942254000082, 54.683091538999989 ], [ 9.92945397200009, 54.673895575000088 ], [ 9.944102410000113, 54.673325914000131 ], [ 9.970225457000083, 54.677923895000063 ], [ 9.99634850400011, 54.67877838700015 ], [ 10.01140384200005, 54.667059637000179 ], [ 10.022146030000044, 54.672430731000034 ], [ 10.033539259000122, 54.672919012000037 ], [ 10.039073113000143, 54.666815497000059 ], [ 10.031911655000101, 54.652777411 ], [ 10.03695722700013, 54.638902085 ], [ 10.037608269000089, 54.619086005 ], [ 10.031911655000101, 54.577704169000143 ], [ 10.02686608200014, 54.559963283000073 ], [ 10.020030144000145, 54.545843817000119 ], [ 10.010427280000073, 54.534328518 ], [ 9.99781334700009, 54.523667710000083 ], [ 9.965586785000141, 54.506170966000028 ], [ 9.925303582000055, 54.493109442000147 ], [ 9.882009311000076, 54.484849351000051 ], [ 9.840098504000082, 54.482123114000089 ], [ 9.840098504000082, 54.475287177000055 ], [ 9.883311394000089, 54.462103583000115 ], [ 10.124685092000107, 54.495754299000126 ], [ 10.143402540000096, 54.491848049000126 ], [ 10.203868035000085, 54.461004950000174 ], [ 10.183929884000122, 54.449367580000157 ], [ 10.183848504000139, 54.438421942 ], [ 10.191742384000094, 54.426174221000124 ], [ 10.19703209700009, 54.410101630000057 ], [ 10.191254102000102, 54.396714585000055 ], [ 10.177093946000099, 54.384263414000131 ], [ 10.159027540000068, 54.375311591000113 ], [ 10.141774936000076, 54.37225983300003 ], [ 10.144379102000073, 54.370021877000127 ], [ 10.14779707100007, 54.368312893000123 ], [ 10.148285352000073, 54.365179755000142 ], [ 10.141774936000076, 54.358587958000086 ], [ 10.152517123000081, 54.35179271000014 ], [ 10.155528191000087, 54.343410549000097 ], [ 10.151621941000087, 54.333970445000077 ], [ 10.141774936000076, 54.324408270000092 ], [ 10.163747592000078, 54.329169012000179 ], [ 10.180349155000044, 54.341131903000118 ], [ 10.203868035000085, 54.37225983300003 ], [ 10.217133009000122, 54.405422268000123 ], [ 10.224375847000147, 54.413804429 ], [ 10.234385613000143, 54.417710679 ], [ 10.272146030000101, 54.420070705000128 ], [ 10.285817905000044, 54.424750067000062 ], [ 10.292491082000083, 54.430161851000108 ], [ 10.297618035000113, 54.43573639500012 ], [ 10.306895379000139, 54.441107489000089 ], [ 10.318369988000086, 54.443304755000057 ], [ 10.360850457000083, 54.441107489000089 ], [ 10.382823113000086, 54.434759833000143 ], [ 10.443369988000086, 54.406398830000015 ], [ 10.601084832000083, 54.365423895000092 ], [ 10.690196160000141, 54.316229559000178 ], [ 10.731293165000125, 54.310207424000069 ], [ 10.777110222000118, 54.315130927000112 ], [ 10.810801629000139, 54.32737864799999 ], [ 10.867930535000113, 54.358587958000086 ], [ 10.900889519000089, 54.37103913 ], [ 10.935313347000118, 54.379543361000017 ], [ 11.018809441000087, 54.385891018000152 ], [ 11.018809441000087, 54.37909577000012 ], [ 11.000824415000068, 54.378566799000154 ], [ 10.975840691000144, 54.378404038999989 ], [ 10.99317467500012, 54.373846747000059 ], [ 11.010508660000113, 54.377183335000083 ], [ 11.033946160000085, 54.367621161000088 ], [ 11.104177280000044, 54.392889716000028 ], [ 11.135508660000085, 54.385891018000152 ], [ 11.098399285000085, 54.361517645 ], [ 11.08773847700013, 54.351752020000148 ], [ 11.081797722000118, 54.354641018000095 ], [ 11.066579623000052, 54.358587958000086 ], [ 11.077403191000144, 54.342230536000059 ], [ 11.086599155000101, 54.302435614000061 ], [ 11.094493035000085, 54.283514716000141 ], [ 11.087087436000104, 54.270900783000158 ], [ 11.08773847700013, 54.253892320000105 ], [ 11.094493035000085, 54.225083726000079 ], [ 11.090179884000094, 54.20799388200011 ], [ 11.080577019000117, 54.198879299000126 ], [ 11.070974155000044, 54.192572333 ], [ 11.066579623000052, 54.183905341000084 ], [ 10.950450066000116, 54.139471747000172 ], [ 10.910329623000109, 54.109198309000178 ], [ 10.892832879000139, 54.102525132000139 ], [ 10.852386915000125, 54.094305731000034 ], [ 10.844574415000125, 54.094468492000019 ], [ 10.836110873000081, 54.089992580000128 ], [ 10.829356316000144, 54.09284088700015 ], [ 10.822276238000086, 54.097357489000117 ], [ 10.813324415000068, 54.097886460000026 ], [ 10.805430535000085, 54.094875393 ], [ 10.801442905000101, 54.092230536000116 ], [ 10.762868686000047, 54.056830145 ], [ 10.752614780000101, 54.050116278000147 ], [ 10.752614780000101, 54.043890692 ], [ 10.765879754000139, 54.024359442000119 ], [ 10.780446811000076, 54.009955145000148 ], [ 10.799652540000125, 54.000555731000034 ], [ 10.826914910000113, 53.995428778000118 ], [ 10.865570509000065, 53.997788804000081 ], [ 10.875498894000145, 53.995428778000118 ], [ 10.882578972000118, 53.985052802000112 ], [ 10.883555535000113, 53.973130601000079 ], [ 10.887380405000101, 53.963934637000094 ], [ 10.902110222000118, 53.961371161 ], [ 10.90601647200009, 53.961208401000036 ], [ 10.917653842000107, 53.960760809000035 ], [ 10.922618035000141, 53.961371161 ], [ 10.935394727000102, 53.967271226000136 ], [ 10.96469160200013, 53.985419012000037 ], [ 10.981211785000113, 53.989243882000054 ], [ 11.000254754000082, 53.991603908000101 ], [ 11.053477410000085, 54.008490302 ], [ 11.175059441000144, 54.018011786 ], [ 11.18384850400011, 54.016017971000153 ], [ 11.190765821000099, 54.010321356000148 ], [ 11.197276238000086, 53.996242580000128 ], [ 11.204356316000144, 53.989243882000054 ], [ 11.23991946700005, 53.983465887000179 ], [ 11.245371941000059, 53.97842031500015 ], [ 11.240733269000145, 53.955633856000034 ], [ 11.242930535000141, 53.945217190000122 ], [ 11.25562584700009, 53.94086334800015 ], [ 11.28541100400011, 53.939683335000112 ], [ 11.293711785000085, 53.94086334800015 ], [ 11.334157748000109, 53.961371161 ], [ 11.341807488000143, 53.95831940300009 ], [ 11.352061394000089, 53.944159247000172 ], [ 11.358246290000039, 53.94086334800015 ], [ 11.399912957000112, 53.94086334800015 ], [ 11.400401238000086, 53.937730210000083 ], [ 11.438731316000116, 53.90912506700009 ], [ 11.446299675000148, 53.906154690000065 ], [ 11.457692905000044, 53.906154690000065 ], [ 11.458994988000114, 53.916693427000141 ], [ 11.469086134000094, 53.932766018000038 ], [ 11.47681725400011, 53.952704169000114 ], [ 11.472422722000118, 53.968817450000174 ], [ 11.479828321000099, 53.976141669000171 ], [ 11.489512566000059, 53.980617580000128 ], [ 11.49789472700013, 53.981838283000158 ], [ 11.495941602000073, 53.986314195000134 ], [ 11.493500196000127, 53.997626044000114 ], [ 11.49170983200014, 54.002346096000011 ], [ 11.525889519000145, 54.02277252800009 ], [ 11.525889519000145, 54.030218817000062 ], [ 11.51905358200014, 54.030218817000062 ], [ 11.51905358200014, 54.036444403000033 ], [ 11.544606967000107, 54.03017812700007 ], [ 11.553233269000117, 54.030218817000062 ], [ 11.573496941000116, 54.039048570000105 ], [ 11.591319207000112, 54.065619208000086 ], [ 11.604746941000087, 54.071234442000062 ], [ 11.61280358200014, 54.072902736000074 ], [ 11.61939537900011, 54.077297268000066 ], [ 11.624522332000112, 54.083644924000012 ], [ 11.628916863000114, 54.09105052299999 ], [ 11.629567905000073, 54.096014716000056 ], [ 11.622080925000091, 54.099554755000113 ], [ 11.622080925000091, 54.104681708000115 ], [ 11.625254754000139, 54.109808661000145 ], [ 11.629405144000089, 54.113226630000057 ], [ 11.633148634000122, 54.115912177000141 ], [ 11.657888217000107, 54.142238674000126 ], [ 11.689707879000139, 54.155218817000119 ], [ 11.72877037900011, 54.15851471600017 ], [ 11.81226647200009, 54.149807033000101 ], [ 12.050629102000102, 54.179917710000112 ], [ 12.088145379000139, 54.194077867000047 ], [ 12.09327233200014, 54.165432033000073 ], [ 12.089528842000107, 54.137640692 ], [ 12.09164472700013, 54.11399974199999 ], [ 12.115000847000118, 54.097886460000026 ], [ 12.105316602000073, 54.110012111000103 ], [ 12.100352410000113, 54.13597239799999 ], [ 12.095062696000127, 54.145697333000143 ], [ 12.105479363000114, 54.157375393000123 ], [ 12.13428795700014, 54.16697825700011 ], [ 12.142832879000082, 54.180487372000087 ], [ 12.131602410000085, 54.181138414000046 ], [ 12.120860222000147, 54.179999091000113 ], [ 12.110606316000116, 54.177435614 ], [ 12.10132897200009, 54.173651434000149 ], [ 12.108897332000112, 54.183010158000016 ], [ 12.142832879000082, 54.209173895000148 ], [ 12.163096550000091, 54.219916083000058 ], [ 12.186859571000099, 54.243353583000143 ], [ 12.200938347000118, 54.248724677 ], [ 12.214040561000104, 54.250962632000082 ], [ 12.289398634000065, 54.275091864 ], [ 12.327321811000076, 54.293768622000172 ], [ 12.342133009000065, 54.303941148000106 ], [ 12.378184441000116, 54.344916083000143 ], [ 12.438324415000096, 54.395819403000147 ], [ 12.444834832000083, 54.405462958000115 ], [ 12.486094597000118, 54.447333075000031 ], [ 12.501963738000143, 54.473578192000062 ], [ 12.513438347000118, 54.482245184000149 ], [ 12.533864780000073, 54.488267320000077 ], [ 12.533864780000073, 54.482123114000089 ], [ 12.527028842000078, 54.482123114000089 ], [ 12.548350457000112, 54.462062893000123 ], [ 12.59148196700005, 54.451727606000119 ], [ 12.819102410000085, 54.451727606000119 ], [ 12.856618686000076, 54.441107489000089 ], [ 12.879649285000141, 54.448797919000086 ], [ 12.908376498000109, 54.444647528000147 ], [ 12.921153191000144, 54.433498440000122 ], [ 12.896332227000102, 54.420070705000128 ], [ 12.870778842000107, 54.416815497000087 ], [ 12.763682488000086, 54.422186591000141 ], [ 12.720957879000082, 54.431586005000085 ], [ 12.694590691000087, 54.433661200000088 ], [ 12.686778191000087, 54.431626695000077 ], [ 12.676117384000065, 54.422552802000084 ], [ 12.670420769000089, 54.420070705000128 ], [ 12.650075717000078, 54.420070705000128 ], [ 12.624196811000076, 54.422919012000179 ], [ 12.614512566000116, 54.419745184000121 ], [ 12.60840905000012, 54.406398830000015 ], [ 12.602224155000073, 54.413804429 ], [ 12.596934441000087, 54.411932684000035 ], [ 12.588063998000052, 54.407456773000078 ], [ 12.581716342000107, 54.406398830000015 ], [ 12.583506707000083, 54.397853908000073 ], [ 12.587657097000118, 54.394029039000074 ], [ 12.594004754000053, 54.392767645000063 ], [ 12.602224155000073, 54.392075914000131 ], [ 12.598643425000091, 54.391546942000147 ], [ 12.595876498000024, 54.391506252000156 ], [ 12.594411655000073, 54.390204169000143 ], [ 12.594737175000091, 54.385891018000152 ], [ 12.575531446000127, 54.39199453300013 ], [ 12.554047071000099, 54.390814520000035 ], [ 12.535980665000096, 54.383734442000147 ], [ 12.527028842000078, 54.37225983300003 ], [ 12.51075280000012, 54.384263414000131 ], [ 12.490977410000113, 54.390082098000093 ], [ 12.454763217000078, 54.392075914000131 ], [ 12.438487175000148, 54.387518622000172 ], [ 12.424978061000076, 54.375921942000062 ], [ 12.418467644000089, 54.36066315300009 ], [ 12.424001498000109, 54.344916083000143 ], [ 12.409678582000112, 54.346625067000147 ], [ 12.403819207000083, 54.348089911 ], [ 12.39673912900011, 54.351752020000148 ], [ 12.389903191000087, 54.344916083000143 ], [ 12.396494988000086, 54.332953192 ], [ 12.391612175000091, 54.321112372000144 ], [ 12.379079623000109, 54.312445380000057 ], [ 12.362559441000116, 54.310207424000069 ], [ 12.369639519000089, 54.296576239000117 ], [ 12.377940300000148, 54.285874742000104 ], [ 12.380137566000144, 54.277085679000137 ], [ 12.368825717000078, 54.269191799000154 ], [ 12.412445509000094, 54.251410223000065 ], [ 12.436778191000144, 54.247707424000126 ], [ 12.458181186000104, 54.255560614000117 ], [ 12.442637566000087, 54.25519440300009 ], [ 12.430837436000019, 54.258612372000115 ], [ 12.410329623000081, 54.269191799000154 ], [ 12.416840040000068, 54.280951239000146 ], [ 12.426280144000089, 54.289618231000034 ], [ 12.451426629000139, 54.303941148000106 ], [ 12.45728600400011, 54.306301174000069 ], [ 12.46827233200014, 54.308335679000024 ], [ 12.47242272200009, 54.310207424000069 ], [ 12.475596550000148, 54.315130927000112 ], [ 12.476573113000143, 54.327785549000012 ], [ 12.478688998000052, 54.331854559000149 ], [ 12.49561608200014, 54.340277411000031 ], [ 12.560557488000114, 54.358587958000086 ], [ 12.547048373000024, 54.364488023000106 ], [ 12.54078209700009, 54.365423895000092 ], [ 12.54078209700009, 54.37225983300003 ], [ 12.559336785000085, 54.376288153000175 ], [ 12.566091342000107, 54.375921942000062 ], [ 12.574229363000143, 54.37225983300003 ], [ 12.574229363000143, 54.37909577000012 ], [ 12.592946811000104, 54.369330145000092 ], [ 12.622731967000107, 54.373928127000042 ], [ 12.677256707000083, 54.392075914000131 ], [ 12.675059441000116, 54.395412502000156 ], [ 12.672373894000117, 54.402980861000103 ], [ 12.670420769000089, 54.406398830000015 ], [ 12.680837436000076, 54.410874742000075 ], [ 12.692556186000047, 54.413641669000029 ], [ 12.704844597000118, 54.414618231000091 ], [ 12.717539910000085, 54.413804429 ], [ 12.717539910000085, 54.406398830000015 ], [ 12.70248457100007, 54.404120184000035 ], [ 12.692393425000091, 54.396185614000061 ], [ 12.686534050000148, 54.384751695000105 ], [ 12.684092644000117, 54.37225983300003 ], [ 12.696625196000099, 54.384955145000063 ], [ 12.701182488000143, 54.391669012000122 ], [ 12.704600457000083, 54.399603583000086 ], [ 12.713552280000101, 54.390082098000093 ], [ 12.723806186000019, 54.381252346000124 ], [ 12.735036655000044, 54.37815989800005 ], [ 12.746104363000143, 54.385891018000152 ], [ 12.757823113000143, 54.37978750200007 ], [ 12.768565300000148, 54.380072333 ], [ 12.778330925000091, 54.384751695000105 ], [ 12.787119988000086, 54.392075914000131 ], [ 12.789886915000125, 54.384344794000114 ], [ 12.794688347000118, 54.377142645000092 ], [ 12.800954623000081, 54.370754299000154 ], [ 12.818044467000107, 54.357977606000119 ], [ 12.82178795700014, 54.356146552000141 ], [ 12.825368686000104, 54.357245184000178 ], [ 12.835459832000083, 54.358587958000086 ], [ 12.854665561000047, 54.357855536000145 ], [ 12.864756707000112, 54.359564520000148 ], [ 12.875987175000091, 54.365423895000092 ], [ 12.884532097000118, 54.373480536000116 ], [ 12.894867384000122, 54.38971588700015 ], [ 12.903819207000055, 54.399603583000086 ], [ 12.92937259200005, 54.414374091000141 ], [ 12.969086134000065, 54.429388739000089 ], [ 13.008799675000148, 54.438055731000176 ], [ 13.034190300000091, 54.433661200000088 ], [ 13.021494988000114, 54.426459052000055 ], [ 13.02100670700014, 54.414536851000108 ], [ 13.028575066000087, 54.401841539000074 ], [ 13.04037519600007, 54.392075914000131 ], [ 13.08366946700005, 54.378973700000145 ], [ 13.095550977000102, 54.37225983300003 ], [ 13.076670769000145, 54.352525132000082 ], [ 13.080739780000016, 54.337144273000135 ], [ 13.10922285200013, 54.310207424000069 ], [ 13.112071160000085, 54.299302475999987 ], [ 13.112071160000085, 54.288478908000101 ], [ 13.114919467000107, 54.280015367000047 ], [ 13.125987175000148, 54.27659739800005 ], [ 13.170664910000113, 54.27659739800005 ], [ 13.170664910000113, 54.269191799000154 ], [ 13.161306186000076, 54.269029039000102 ], [ 13.154633009000122, 54.267320054 ], [ 13.143402540000125, 54.26300690300009 ], [ 13.176117384000065, 54.264837958000058 ], [ 13.228363477000073, 54.247381903000118 ], [ 13.263194207000083, 54.242499091000056 ], [ 13.288828972000147, 54.234279690000122 ], [ 13.32178795700014, 54.194525458000143 ], [ 13.348887566000144, 54.180487372000087 ], [ 13.33334394600007, 54.174017645000092 ], [ 13.321543816000087, 54.166815497000144 ], [ 13.346527540000096, 54.166937567000119 ], [ 13.383799675000091, 54.178127346000124 ], [ 13.403493686000047, 54.173651434000149 ], [ 13.395681186000047, 54.161932684000178 ], [ 13.390879754000139, 54.15729401200015 ], [ 13.382985873000081, 54.153143622000115 ], [ 13.394786004000139, 54.148911850999987 ], [ 13.402110222000147, 54.151312567000147 ], [ 13.408702019000117, 54.15460846600017 ], [ 13.417735222000118, 54.153143622000115 ], [ 13.42318769600007, 54.148098049000097 ], [ 13.437673373000109, 54.125189520000092 ], [ 13.450368686000076, 54.110419012000094 ], [ 13.465098504000082, 54.098456122000172 ], [ 13.483571811000104, 54.091294664000131 ], [ 13.507090691000144, 54.09105052299999 ], [ 13.507090691000144, 54.097886460000026 ], [ 13.498871290000068, 54.102484442000147 ], [ 13.487478061000104, 54.113918361000103 ], [ 13.479258660000085, 54.118353583000058 ], [ 13.479258660000085, 54.125189520000092 ], [ 13.602712436000019, 54.139471747000172 ], [ 13.632334832000083, 54.147528387000122 ], [ 13.68344160200013, 54.168036200000174 ], [ 13.711924675000148, 54.173651434000149 ], [ 13.716481967000107, 54.168443101000079 ], [ 13.714691602000102, 54.16404857 ], [ 13.708262566000087, 54.160874742000132 ], [ 13.69825280000012, 54.159328518000095 ], [ 13.69825280000012, 54.153143622000115 ], [ 13.728770379000139, 54.143866278000147 ], [ 13.808116082000083, 54.104681708000115 ], [ 13.808116082000083, 54.097886460000026 ], [ 13.793711785000113, 54.083197333 ], [ 13.785492384000122, 54.063910223000065 ], [ 13.773203972000147, 54.046332098000121 ], [ 13.746104363000143, 54.036444403000033 ], [ 13.758148634000065, 54.030991929 ], [ 13.787119988000143, 54.009100653000147 ], [ 13.797618035000113, 53.998928127000013 ], [ 13.803477410000141, 53.996323960000112 ], [ 13.831797722000118, 53.989243882000054 ], [ 13.838633660000113, 53.986314195000134 ], [ 13.843109571000099, 53.979559637000179 ], [ 13.846202019000089, 53.972235419000086 ], [ 13.849131707000083, 53.967596747000144 ], [ 13.850271030000044, 53.964016018000095 ], [ 13.848968946000127, 53.959458726000136 ], [ 13.84864342500012, 53.955552476000051 ], [ 13.852549675000091, 53.953843492000047 ], [ 13.866872592000078, 53.954657294000143 ], [ 13.87012780000012, 53.953843492000047 ], [ 13.875498894000089, 53.95123932500006 ], [ 13.881602410000085, 53.949042059000149 ], [ 13.887950066000116, 53.947577216000084 ], [ 13.89356530000012, 53.947088934000092 ], [ 13.906016472000118, 53.943060614000117 ], [ 13.90756269600007, 53.933539130000142 ], [ 13.901377800000091, 53.922308661000145 ], [ 13.890147332000112, 53.912909247000115 ], [ 13.818532748000081, 53.877997137000094 ], [ 13.808116082000083, 53.865139065000065 ], [ 13.817067905000101, 53.852932033000101 ], [ 13.835785352000073, 53.847479559000149 ], [ 13.854340040000096, 53.844916083000143 ], [ 13.86280358200014, 53.841253973 ], [ 13.869151238000143, 53.830308335000112 ], [ 13.883799675000063, 53.817694403000147 ], [ 13.89991295700014, 53.809149481000034 ], [ 13.910655144000145, 53.810492255000113 ], [ 13.98422285200013, 53.773993231000148 ], [ 14.017344597000147, 53.76951732000002 ], [ 14.033539259000122, 53.757513739000089 ], [ 14.037445509000122, 53.755275783000101 ], [ 14.061534050000148, 53.756415106000034 ], [ 14.068858269000145, 53.755275783000101 ], [ 14.09400475400011, 53.746323960000055 ], [ 14.106130405000016, 53.743353583000058 ], [ 14.18653405000012, 53.739813544000171 ], [ 14.214691602000102, 53.744859117000104 ], [ 14.226573113000143, 53.758693752000013 ], [ 14.23414147200009, 53.761786200000088 ], [ 14.250173373000081, 53.759955145 ], [ 14.264496290000068, 53.751613674000126 ], [ 14.267425977000102, 53.735419012000179 ], [ 14.259532097000118, 53.727972723 ], [ 14.21273847700013, 53.708075262000122 ], [ 14.225352410000113, 53.703762111000017 ], [ 14.240000847000147, 53.700751044000114 ], [ 14.256195509000094, 53.699448960000112 ], [ 14.263900720266179, 53.699976159552662 ], [ 14.263862752000136, 53.699875794000079 ], [ 14.265102986000102, 53.671763815000034 ], [ 14.260968872000149, 53.656209209000011 ], [ 14.27605839000006, 53.636623841000088 ], [ 14.297039022000149, 53.597763164000028 ], [ 14.298899373000069, 53.587892965000052 ], [ 14.296212199000138, 53.551306051000111 ], [ 14.29693566900005, 53.529136862000186 ], [ 14.304170370000094, 53.508517965000081 ], [ 14.328458293000097, 53.486090394000186 ], [ 14.338896932000125, 53.465213115000111 ], [ 14.359877564000044, 53.444077454000151 ], [ 14.370316202000083, 53.392297669000115 ], [ 14.391260511000098, 53.334017003000113 ], [ 14.398014770000088, 53.315222270000064 ], [ 14.399565064000114, 53.306747335000139 ], [ 14.400185180000079, 53.288608908000029 ], [ 14.403285767000028, 53.278790385000079 ], [ 14.409383586000104, 53.272434184000033 ], [ 14.424679810000043, 53.264656881000022 ], [ 14.428607219000099, 53.259075827000018 ], [ 14.441629680000062, 53.251841126000144 ], [ 14.410686845982541, 53.225095628717206 ], [ 14.408246704000078, 53.21440155099999 ], [ 14.39835776680246, 53.206688569460049 ], [ 14.380109443072636, 53.202859068540931 ], [ 14.380651489000087, 53.189855245 ], [ 14.377860962000113, 53.176548564000186 ], [ 14.381478312000098, 53.160296326000079 ], [ 14.38747277900012, 53.146136984000023 ], [ 14.389539835000107, 53.13166758300018 ], [ 14.359567505000143, 53.075056051 ], [ 14.356776977000095, 53.066684469000123 ], [ 14.343341105000064, 53.04862355500002 ], [ 14.31689016121531, 53.038840510597431 ], [ 14.253734172000094, 53.000874533000157 ], [ 14.192859334000076, 52.981650900000133 ], [ 14.144490193000109, 52.959920960000133 ], [ 14.144490193000109, 52.95369395000013 ], [ 14.150484660000131, 52.943642884 ], [ 14.162680298000055, 52.908167013000153 ], [ 14.164954061000088, 52.895661317000148 ], [ 14.160819946000061, 52.876747742000035 ], [ 14.150484660000131, 52.864629619000041 ], [ 14.123922973000049, 52.850651144000139 ], [ 14.13539514200005, 52.836595154000022 ], [ 14.15275842300008, 52.82832692500007 ], [ 14.173739054000066, 52.824347839 ], [ 14.195959920000092, 52.823365987000116 ], [ 14.216010375000053, 52.817991639000141 ], [ 14.248669882000115, 52.794582215 ], [ 14.275955037000131, 52.78571970600008 ], [ 14.382201782000095, 52.738151551000058 ], [ 14.39770471200012, 52.727118633000075 ], [ 14.431914510000098, 52.686087546000024 ], [ 14.442353149000041, 52.679963888000074 ], [ 14.461370076000037, 52.674563701000082 ], [ 14.49010217300011, 52.650637512000102 ], [ 14.549943481000071, 52.636193950000163 ], [ 14.607964828000092, 52.596462963000036 ], [ 14.613712199000105, 52.592527364000105 ], [ 14.644821411000066, 52.57692108200014 ], [ 14.616812785000064, 52.541031800000113 ], [ 14.609061320000137, 52.517803243000102 ], [ 14.627664836000093, 52.507416280000157 ], [ 14.632315715000061, 52.496745098000176 ], [ 14.615779256000081, 52.473283997000109 ], [ 14.591594686000093, 52.449797059000119 ], [ 14.539814901000113, 52.421865947000029 ], [ 14.54539595600005, 52.382152608000141 ], [ 14.569167114000095, 52.338511861000185 ], [ 14.590147746000099, 52.309418030000174 ], [ 14.584153280000066, 52.291227926000133 ], [ 14.606580851000075, 52.275750835000125 ], [ 14.640480590000095, 52.265053813000023 ], [ 14.668902628000097, 52.260997213000124 ], [ 14.696911255000117, 52.253478293000072 ], [ 14.712414184000124, 52.235908305000109 ], [ 14.712104126000042, 52.215444438000063 ], [ 14.69257043500005, 52.199579773000139 ], [ 14.69257043500005, 52.193378601000134 ], [ 14.707039836000149, 52.179451803000163 ], [ 14.703215780000022, 52.165163270000093 ], [ 14.692467082000093, 52.146973165000034 ], [ 14.686369263000131, 52.121031596000094 ], [ 14.696394491000063, 52.106691386000094 ], [ 14.76140344300012, 52.076667379000057 ], [ 14.74300663300005, 52.062533875 ], [ 14.735358520000148, 52.054033102000076 ], [ 14.732154582000078, 52.045067241000069 ], [ 14.730294230000084, 52.035894674000147 ], [ 14.726056762000042, 52.026437887 ], [ 14.704456014000073, 52.002227478000023 ], [ 14.699081665000108, 51.992512309000077 ], [ 14.695567667000148, 51.931456604000076 ], [ 14.687092733000043, 51.911897074000152 ], [ 14.67169315600006, 51.893887838000168 ], [ 14.653296346000076, 51.878617453000047 ], [ 14.595935507000092, 51.84241811200009 ], [ 14.5958707890469, 51.830733489178897 ], [ 14.600174130651517, 51.814392358058456 ], [ 14.618566401058573, 51.803257036443732 ], [ 14.644489809686638, 51.795885897632502 ], [ 14.655152568842901, 51.773855466715673 ], [ 14.651299866851884, 51.763780517281496 ], [ 14.657343137013443, 51.759435782500631 ], [ 14.664353790985437, 51.757826750306087 ], [ 14.657605632585977, 51.753428142576041 ], [ 14.65989913854235, 51.749146293484806 ], [ 14.656756713602354, 51.74199166901272 ], [ 14.666837886302977, 51.730295954648028 ], [ 14.678152754506575, 51.722667858637294 ], [ 14.688602165663308, 51.709878806911647 ], [ 14.713994566180174, 51.697293089103766 ], [ 14.728872838587208, 51.687910722881796 ], [ 14.740311814566827, 51.684418582149533 ], [ 14.752602542645286, 51.668007508635945 ], [ 14.753800308847188, 51.652086260955038 ], [ 14.754691203244573, 51.6285144898415 ], [ 14.765276550061326, 51.615699352964029 ], [ 14.761895815064422, 51.602993947086645 ], [ 14.732154582000078, 51.586619772000056 ], [ 14.72682321975066, 51.574265260366296 ], [ 14.712724243000112, 51.567421977000095 ], [ 14.710483563904942, 51.562089727691038 ], [ 14.719494393491303, 51.554810265730048 ], [ 14.730606460285493, 51.549356932905596 ], [ 14.729955239471417, 51.533490804975166 ], [ 14.744889150645694, 51.524559731447162 ], [ 14.796820537197787, 51.51714162436005 ], [ 14.813880353067292, 51.507117091570223 ], [ 14.813880353067292, 51.50711709157023 ], [ 14.836190055663227, 51.499506222995336 ], [ 14.852649485840772, 51.489865816571864 ], [ 14.865841537527869, 51.489770308717844 ], [ 14.872120586831882, 51.485616642300194 ], [ 14.889726423459912, 51.485779260098433 ], [ 14.899846167039284, 51.481965568147118 ], [ 14.916832531221146, 51.483418009512228 ], [ 14.927214374802446, 51.472518139235305 ], [ 14.950938976221195, 51.470548118936385 ], [ 14.961600789622292, 51.454544624832742 ], [ 14.968472643477329, 51.445301001835247 ], [ 14.973588159390957, 51.435572626525556 ], [ 14.971250367314186, 51.431594842093567 ], [ 14.959726881710642, 51.43324424889385 ], [ 14.965353629761942, 51.42654298112938 ], [ 14.965668106453833, 51.394502074268487 ], [ 14.981453086488953, 51.373725472958355 ], [ 14.966291447329354, 51.361199378425013 ], [ 14.979916413267908, 51.343450854750245 ], [ 14.991849708500599, 51.324311843772797 ], [ 15.009043760895974, 51.308822765627021 ], [ 15.025147490872623, 51.297414430296193 ], [ 15.041679408279695, 51.272086326677424 ], [ 15.02383582055875, 51.252904132613857 ], [ 15.034904676860851, 51.246102039092982 ], [ 15.022059367000054, 51.236770325000052 ], [ 15.012249658526422, 51.214074796651737 ], [ 15.000506333232833, 51.185694989872033 ], [ 14.993647566837549, 51.159271034706848 ], [ 14.995122904046868, 51.134410170771332 ], [ 14.99044362783744, 51.118288920950853 ], [ 14.981869880430533, 51.110391778928864 ], [ 14.984567292267871, 51.102485586092563 ], [ 14.978539888465566, 51.088587069457127 ], [ 14.97874205387259, 51.080790312597649 ], [ 14.970698690244518, 51.069358952252102 ], [ 14.96443618423285, 51.054601488181731 ], [ 14.910644979000097, 50.992650859000108 ], [ 14.860208781000097, 50.916841533000095 ], [ 14.824655395000036, 50.891830139000106 ], [ 14.810496053000065, 50.877050680000096 ], [ 14.810392700000136, 50.85844716400014 ], [ 14.794579712000143, 50.831627096000048 ], [ 14.785071248000065, 50.820051575000107 ], [ 14.775356079000119, 50.812971904000094 ], [ 14.759233032000054, 50.810181376000045 ], [ 14.737528931000043, 50.81069814100006 ], [ 14.700425252000059, 50.815969137000096 ], [ 14.662184692000068, 50.834365946 ], [ 14.647921997000111, 50.839378561000061 ], [ 14.61319543500008, 50.845579732000047 ], [ 14.608337850000055, 50.853072815000175 ], [ 14.611851847000111, 50.870952861000134 ], [ 14.628801717000101, 50.896119283000175 ], [ 14.634589478000095, 50.909400127000183 ], [ 14.629215128000112, 50.920717266000153 ], [ 14.617122843000118, 50.920872294 ], [ 14.561829061000111, 50.906351217000136 ], [ 14.550356893000099, 50.912087301000113 ], [ 14.555834594000089, 50.924282939000037 ], [ 14.567823527000144, 50.938648987000036 ], [ 14.575574992000043, 50.950689596000089 ], [ 14.577435343000047, 50.965727437000098 ], [ 14.574334758000106, 50.975494283000145 ], [ 14.566686645000118, 50.983400777999989 ], [ 14.554594360000038, 50.992650859000108 ], [ 14.542295369000101, 50.998748678000155 ], [ 14.515320272000082, 51.003037822000024 ], [ 14.502917928000102, 51.008515524000117 ], [ 14.493512818000056, 51.01670623800014 ], [ 14.49010217300011, 51.022700704000059 ], [ 14.48793176300012, 51.028721009000108 ], [ 14.482144002000069, 51.0371959430001 ], [ 14.473462362000106, 51.023372498000143 ], [ 14.462093547000109, 51.01965179400004 ], [ 14.425816691000136, 51.020943706000182 ], [ 14.39780806400006, 51.013114726000154 ], [ 14.386749308000049, 51.013269756000014 ], [ 14.375897257000105, 51.016990459000013 ], [ 14.369386027000132, 51.022442322000089 ], [ 14.364115031000097, 51.027997538000093 ], [ 14.356570272000056, 51.032338359000093 ], [ 14.319363240000115, 51.040012309000176 ], [ 14.287530558000071, 51.036834208000116 ], [ 14.263552694000083, 51.021434632000123 ], [ 14.249496704000137, 50.992650859000108 ], [ 14.238334595000111, 50.982470602000134 ], [ 14.250013469000095, 50.977613017000024 ], [ 14.283809855000072, 50.974822490000165 ], [ 14.303756958000093, 50.96970652300017 ], [ 14.302206665000085, 50.967691142000106 ], [ 14.293731730000076, 50.963970439000107 ], [ 14.292801554000107, 50.953480124000166 ], [ 14.318329712000065, 50.937512106000113 ], [ 14.355226685000076, 50.930639140000054 ], [ 14.381891724000127, 50.920872294 ], [ 14.375897257000105, 50.895964254000134 ], [ 14.346545044000038, 50.880202942000054 ], [ 14.268100220000093, 50.884130351000024 ], [ 14.23213342300005, 50.879376119000128 ], [ 14.221281372000078, 50.8726065070001 ], [ 14.202987915000108, 50.855139873000141 ], [ 14.190792277000099, 50.847905172000154 ], [ 14.034936157000061, 50.802584941000148 ], [ 14.015712524000037, 50.801758118000137 ], [ 13.979125610000096, 50.804755351000054 ], [ 13.959591919000076, 50.802068177000123 ], [ 13.948843221000061, 50.797210592000013 ], [ 13.933546997000093, 50.784808248000118 ], [ 13.923315064000121, 50.779950664000111 ], [ 13.910706014000084, 50.778762105000098 ], [ 13.900990844000148, 50.780622457 ], [ 13.892515910000071, 50.780415752000138 ], [ 13.883317505000065, 50.773232727000092 ], [ 13.879080037000108, 50.763517558000146 ], [ 13.880320272000034, 50.755042623000136 ], [ 13.882697388000082, 50.748014628000035 ], [ 13.882180624000057, 50.742743632 ], [ 13.87535933400008, 50.736542461000013 ], [ 13.869571574000105, 50.735250549000071 ], [ 13.863473755000143, 50.735147197000131 ], [ 13.834534953000087, 50.72367502900012 ], [ 13.816551554000114, 50.721349589000098 ], [ 13.770662882000039, 50.724605204000071 ], [ 13.74906213400007, 50.723209941 ], [ 13.71102828000005, 50.71426991800017 ], [ 13.691752970000096, 50.711841126000095 ], [ 13.601939331000096, 50.712151185 ], [ 13.556567423000075, 50.706725159000101 ], [ 13.515639689000068, 50.691015524000065 ], [ 13.527215210000094, 50.675667623000081 ], [ 13.523287801000038, 50.662180075000109 ], [ 13.509955281000117, 50.651224671000037 ], [ 13.493315471000102, 50.643214823000065 ], [ 13.49910323000006, 50.635204977000072 ], [ 13.498173055000109, 50.629158834000137 ], [ 13.492178589000076, 50.624456279000142 ], [ 13.482256713000083, 50.620890605000099 ], [ 13.464893432000082, 50.607092998000141 ], [ 13.447943563000052, 50.597274476000067 ], [ 13.429340048000114, 50.594328919000176 ], [ 13.407015828000056, 50.601305237000176 ], [ 13.400401245000126, 50.606576234 ], [ 13.386345256000112, 50.621614075000181 ], [ 13.380970906000073, 50.625489807000136 ], [ 13.368775268000149, 50.628332011000012 ], [ 13.365984741000091, 50.62709177699999 ], [ 13.365364624000108, 50.62347442700009 ], [ 13.359370158000104, 50.619340312000176 ], [ 13.321853068000109, 50.602390443000061 ], [ 13.316272013000088, 50.59603424100014 ], [ 13.305626668000087, 50.575777080000037 ], [ 13.284646037000101, 50.568955790000174 ], [ 13.268006226000068, 50.573658346000158 ], [ 13.251779825000142, 50.580893047000032 ], [ 13.232349487000079, 50.582029928000125 ], [ 13.199069865000126, 50.525340882000037 ], [ 13.184703817000127, 50.508752747000031 ], [ 13.160105835000138, 50.497022197000135 ], [ 13.107395874000133, 50.498985901000154 ], [ 13.079180542000074, 50.492784729000093 ], [ 13.078973836000102, 50.492681376000164 ], [ 13.078870483000088, 50.492681376000164 ], [ 13.069775431000096, 50.491079407000129 ], [ 13.06037032100005, 50.490614319000187 ], [ 13.051068563000115, 50.491131084000031 ], [ 13.042283570000052, 50.492784729000093 ], [ 13.03453210400005, 50.496505432 ], [ 13.026263875000097, 50.497642314000117 ], [ 13.017892293000102, 50.496350404000154 ], [ 13.00962406400015, 50.492681376000164 ], [ 13.003112833000102, 50.451908672000073 ], [ 12.996601603000045, 50.433666891000129 ], [ 12.982442261000074, 50.422969870000102 ], [ 12.960631103000111, 50.409234123000132 ], [ 12.952573283000078, 50.404159648000117 ], [ 12.918363485000071, 50.40539988200014 ], [ 12.825759318000109, 50.441418356000113 ], [ 12.817387736000029, 50.443020325000148 ], [ 12.80839603700008, 50.441831767000124 ], [ 12.794340047000077, 50.435888977000118 ], [ 12.788138875000101, 50.43433868400011 ], [ 12.770258830000046, 50.435940654000049 ], [ 12.754239136000081, 50.435320536000077 ], [ 12.737909383000044, 50.431548157000137 ], [ 12.725093628000138, 50.423434958000044 ], [ 12.702976115000041, 50.4015241500001 ], [ 12.691814006000101, 50.394651184000125 ], [ 12.678791544000092, 50.393721008000071 ], [ 12.625358114000051, 50.39992218100015 ], [ 12.550530640000119, 50.396356507000078 ], [ 12.510223022000076, 50.388760071000107 ], [ 12.482524454000043, 50.373567200000096 ], [ 12.475083048000045, 50.369433085000153 ], [ 12.471569051000074, 50.364472148000019 ], [ 12.469501994000098, 50.359407858000154 ], [ 12.466814819000092, 50.354912008000113 ], [ 12.467021525000121, 50.352844951000165 ], [ 12.46836511300009, 50.34948598300015 ], [ 12.468985229000083, 50.345558574000094 ], [ 12.466814819000092, 50.341889547000093 ], [ 12.462784058000096, 50.340494283000012 ], [ 12.453792359000147, 50.340700990000144 ], [ 12.450175008000144, 50.33935740200009 ], [ 12.438289429000122, 50.332536113000131 ], [ 12.408937215000066, 50.321994121000088 ], [ 12.398188517000051, 50.315172831000112 ], [ 12.367182658000104, 50.279051005000113 ], [ 12.355813842000117, 50.271402894000133 ], [ 12.344651733000092, 50.266390280000067 ], [ 12.336486857000068, 50.258587138000152 ], [ 12.333799683000052, 50.242722473000057 ], [ 12.314059286000088, 50.226496074000025 ], [ 12.308684936000105, 50.21709096299999 ], [ 12.305584351000078, 50.19931427000013 ], [ 12.308581583000091, 50.186911927000082 ], [ 12.314369344000056, 50.176214905000066 ], [ 12.314369344000056, 50.167326559000159 ], [ 12.300416707000068, 50.160815328000083 ], [ 12.28336348400012, 50.162210592000164 ], [ 12.273234904000077, 50.172339173000026 ], [ 12.26124597200004, 50.199882711 ], [ 12.260212443000057, 50.205050355000097 ], [ 12.258455445000067, 50.210889791000099 ], [ 12.254321330000039, 50.217401021000157 ], [ 12.249980510000057, 50.221173401 ], [ 12.232513875000109, 50.232490540000143 ], [ 12.229930054000107, 50.234815979000089 ], [ 12.228896525000039, 50.237038066000096 ], [ 12.229826701000093, 50.239053447000131 ], [ 12.232513875000109, 50.240965475000067 ], [ 12.233754110000064, 50.241688944000074 ], [ 12.235097697000128, 50.242257385000116 ], [ 12.23644128400008, 50.242567445000091 ], [ 12.237991577000116, 50.242722473000057 ], [ 12.242435750000112, 50.248355204000077 ], [ 12.24295251500007, 50.252954407000018 ], [ 12.239645223000139, 50.256571758000106 ], [ 12.232513875000109, 50.259103902 ], [ 12.20378177900011, 50.259568990000119 ], [ 12.189209025000139, 50.262462871000096 ], [ 12.178046916000113, 50.268767395000012 ], [ 12.174119507000057, 50.276570537000126 ], [ 12.174429565000139, 50.293727112000013 ], [ 12.168538452000121, 50.302977193000018 ], [ 12.149314819000011, 50.311710511000072 ], [ 12.101343547000056, 50.313980338000036 ], [ 12.076140991000045, 50.315172831000112 ], [ 12.099188680000083, 50.299773255000147 ], [ 12.107250203000092, 50.290884908000024 ], [ 12.110970906000091, 50.276622213000152 ], [ 12.109110555000086, 50.263806458000076 ], [ 12.102392619000057, 50.259155579000108 ], [ 12.092057333000071, 50.254814758000023 ], [ 12.079551635000144, 50.242722473000057 ], [ 12.089886922000062, 50.230836894 ], [ 12.139289592000097, 50.21104482000014 ], [ 12.163784220000139, 50.193784892000124 ], [ 12.175049682000093, 50.182622783000014 ], [ 12.182697795000081, 50.170737203000087 ], [ 12.185591675000069, 50.155699361000089 ], [ 12.178563680000053, 50.132961731000123 ], [ 12.179183797000121, 50.117975566000055 ], [ 12.187865438000102, 50.102834372000032 ], [ 12.202024780000045, 50.094514465000159 ], [ 12.218044474000095, 50.088571676000143 ], [ 12.232513875000109, 50.080510152000059 ], [ 12.241402221000044, 50.070639954000072 ], [ 12.243469279000095, 50.060408020000111 ], [ 12.243675984000049, 50.051312969000136 ], [ 12.246879923000108, 50.044956767000102 ], [ 12.398188517000051, 49.992763570000037 ], [ 12.399222046000119, 49.992763570000037 ], [ 12.414518270000087, 49.98304840100009 ], [ 12.451311889000067, 49.980567932000113 ], [ 12.468158406000043, 49.970232646000014 ], [ 12.470742228000063, 49.95560821600013 ], [ 12.463817586000062, 49.942120666000065 ], [ 12.462680705000139, 49.931268616000025 ], [ 12.503608439000089, 49.915765687000103 ], [ 12.517871135000064, 49.912200012000042 ], [ 12.524072306000051, 49.904965312000073 ], [ 12.520971720000091, 49.885534973000077 ], [ 12.51291019700011, 49.870238749000052 ], [ 12.489862508000044, 49.842695211000049 ], [ 12.482524454000043, 49.827243958000153 ], [ 12.46247399900011, 49.831223043000037 ], [ 12.456376180000063, 49.817115377 ], [ 12.455859415000106, 49.796134746000106 ], [ 12.452655477000121, 49.779701640000141 ], [ 12.436739135000096, 49.769263001000084 ], [ 12.395397990000077, 49.75789418600003 ], [ 12.38361576300008, 49.742856344000032 ], [ 12.388576700000044, 49.732314351000142 ], [ 12.398911987000133, 49.719498597000083 ], [ 12.419582560000066, 49.700223287000043 ], [ 12.433948608000065, 49.691800029000049 ], [ 12.449244832000119, 49.685030416000117 ], [ 12.482524454000043, 49.674695130000103 ], [ 12.49637373900012, 49.669992575000109 ], [ 12.504641968000072, 49.659398905000145 ], [ 12.505365437000137, 49.646118063000031 ], [ 12.496890503000145, 49.633870748 ], [ 12.499474324000062, 49.632527161000056 ], [ 12.507432495000103, 49.629995016000137 ], [ 12.502678263000121, 49.622140198000025 ], [ 12.501954793000039, 49.61971140600015 ], [ 12.512186727000113, 49.611649882000066 ], [ 12.536061239000105, 49.603123271000143 ], [ 12.546603230000073, 49.595578512000102 ], [ 12.553631225000061, 49.584726461000159 ], [ 12.558282104000028, 49.56255727200012 ], [ 12.562312867000117, 49.550826722000139 ], [ 12.568720744000075, 49.538837789000084 ], [ 12.575025268000076, 49.529897766000076 ], [ 12.58288008700012, 49.522404683000119 ], [ 12.593732137000075, 49.515014954000108 ], [ 12.604997599000114, 49.512792867000101 ], [ 12.61553959200009, 49.513774720000086 ], [ 12.622980998000116, 49.509847310000012 ], [ 12.624324585000068, 49.493000794000054 ], [ 12.627218465000055, 49.460186259000025 ], [ 12.632179402000105, 49.443959859000117 ], [ 12.643548218000092, 49.429490457999989 ], [ 12.663081909000113, 49.41889679000009 ], [ 12.709177286000028, 49.404737447000159 ], [ 12.729331095000106, 49.391146546000144 ], [ 12.762093953000118, 49.343242493000147 ], [ 12.777906941000111, 49.33254547200012 ], [ 12.797750692000108, 49.327842917000069 ], [ 12.856661825000117, 49.322210185000031 ], [ 12.875368693000098, 49.323863831 ], [ 12.870924519000084, 49.33673126300009 ], [ 12.884670451000119, 49.339573467000051 ], [ 12.92291101100011, 49.33270050099999 ], [ 12.939860881000101, 49.326757711000155 ], [ 12.954330282000058, 49.3191095990001 ], [ 12.982442261000074, 49.299627584000106 ], [ 12.999805542000104, 49.294925029000026 ], [ 13.005386597000012, 49.286760153 ], [ 13.006730184000077, 49.277096659000065 ], [ 13.011277710000115, 49.267794902000148 ], [ 13.043213745000088, 49.24293853799999 ], [ 13.043213745000088, 49.242886861000088 ], [ 13.043420451000145, 49.242783509000148 ], [ 13.05582279500004, 49.238184306 ], [ 13.149460489000148, 49.154830221000154 ], [ 13.162586303000126, 49.135141500000103 ], [ 13.178502645000066, 49.118346660000142 ], [ 13.206821330000139, 49.107494609000085 ], [ 13.267282755000082, 49.105634257000091 ], [ 13.287333211000117, 49.100569967000112 ], [ 13.299528849000126, 49.093645325000026 ], [ 13.32991459100009, 49.066928610000062 ], [ 13.372392618000049, 49.038506572000145 ], [ 13.383554728000149, 49.021091614000014 ], [ 13.384174845000132, 48.993031311 ], [ 13.398540893000131, 48.977683411000115 ], [ 13.427272990000063, 48.959958395000015 ], [ 13.458898966000049, 48.945023906000145 ], [ 13.482256713000083, 48.937634176000032 ], [ 13.492592, 48.95504913300006 ], [ 13.50210046400008, 48.966056214000062 ], [ 13.515949747000036, 48.970242005 ], [ 13.522395447000093, 48.969341930000056 ], [ 13.538894083000088, 48.967038066000114 ], [ 13.55646407100005, 48.959958395000015 ], [ 13.573413940000137, 48.951018372000178 ], [ 13.590467163000085, 48.9448172 ], [ 13.608657267000126, 48.946160787000153 ], [ 13.611137736000103, 48.927247213000115 ], [ 13.621783081000103, 48.909057109000074 ], [ 13.637389363000125, 48.893450826000119 ], [ 13.654442586000073, 48.882237040000078 ], [ 13.673356160000111, 48.87634592799999 ], [ 13.71061486800005, 48.872470195000133 ], [ 13.724670858000138, 48.867302552000027 ], [ 13.747925252000073, 48.843376363000047 ], [ 13.796191040000082, 48.779814352000145 ], [ 13.815724731000103, 48.766430156000027 ], [ 13.785855754000067, 48.72477895100009 ], [ 13.783581991000062, 48.715270488000115 ], [ 13.788749634000055, 48.716510723000155 ], [ 13.799394979000056, 48.70260976200008 ], [ 13.804355916000105, 48.699560852000062 ], [ 13.81686161200011, 48.695581767000149 ], [ 13.803529093000066, 48.687158508 ], [ 13.800945272000064, 48.675221253000032 ], [ 13.806216268000099, 48.64292348300016 ], [ 13.805492798000103, 48.626128642000097 ], [ 13.802392211000068, 48.611710918000185 ], [ 13.796191040000082, 48.598585104000037 ], [ 13.779034464000119, 48.573935446000021 ], [ 13.774280233000127, 48.569207052000039 ], [ 13.766012003000071, 48.563755188000144 ], [ 13.758053833000105, 48.561481425000053 ], [ 13.737279907000072, 48.559259339000121 ], [ 13.733869263000145, 48.559776103000061 ], [ 13.72539432800005, 48.548381450000178 ], [ 13.716505981000125, 48.521690572000026 ], [ 13.714335571000049, 48.52321502700012 ], [ 13.673356160000111, 48.535488180000172 ], [ 13.658059936000143, 48.551094463000098 ], [ 13.641833537000139, 48.559104309000091 ], [ 13.624366902000105, 48.565357158 ], [ 13.520703979000132, 48.584580791000022 ], [ 13.48721765200014, 48.581583557 ], [ 13.454558146000068, 48.573444519000091 ], [ 13.445566447000118, 48.567915141000086 ], [ 13.440088745000111, 48.560964661000085 ], [ 13.440708862000093, 48.557347311000015 ], [ 13.443706095000096, 48.552851461 ], [ 13.447736857000109, 48.534816386 ], [ 13.457038615000045, 48.525178732000157 ], [ 13.459209025000121, 48.51639373799999 ], [ 13.456418498000062, 48.506652731000045 ], [ 13.442982625000099, 48.487713319000093 ], [ 13.438228394000106, 48.478540752000086 ], [ 13.436368042000112, 48.46923899400015 ], [ 13.438228394000106, 48.440997824000092 ], [ 13.436161336000055, 48.430585022000074 ], [ 13.431717163000144, 48.423712057 ], [ 13.427169637000105, 48.418544413000106 ], [ 13.425205932000097, 48.413376770000085 ], [ 13.41952152500005, 48.392163595000127 ], [ 13.405568888000062, 48.37658315100002 ], [ 13.307797079000096, 48.319635722000115 ], [ 13.274207397000055, 48.307104187000121 ], [ 13.136438029000118, 48.291058655000157 ], [ 13.032775106000145, 48.263566793000095 ], [ 13.01665205900008, 48.255892843000098 ], [ 12.979445027000082, 48.232018332000038 ], [ 12.947198934000113, 48.220003561000155 ], [ 12.931696004000088, 48.211631979000074 ], [ 12.933039591000068, 48.209254863000027 ], [ 12.877642456000103, 48.202046001000085 ], [ 12.862552938000107, 48.196645813000103 ], [ 12.853457886000029, 48.1899795530001 ], [ 12.835164429000145, 48.170704244000049 ], [ 12.822141968000039, 48.160679017000135 ], [ 12.782351115000012, 48.142023825000152 ], [ 12.778320353000112, 48.138716533000078 ], [ 12.764057658000127, 48.123756205000106 ], [ 12.75795983900008, 48.121895854000101 ], [ 12.751448608000118, 48.122102560000044 ], [ 12.745040731000074, 48.120629782000051 ], [ 12.738942912000113, 48.113446757000091 ], [ 12.736979207000076, 48.099959209000033 ], [ 12.742043498000072, 48.086781718000154 ], [ 12.750931844000092, 48.07474111000009 ], [ 12.760233602000113, 48.064870911000114 ], [ 12.830616903000134, 48.015468242000068 ], [ 12.845603068000088, 47.993144023000028 ], [ 12.84824627100005, 47.982388920000105 ], [ 12.848600301000118, 47.980948385000104 ], [ 12.853974650000083, 47.970483907000144 ], [ 12.862036173000149, 47.962551575000091 ], [ 12.88601403800007, 47.952888082000172 ], [ 12.906167847000063, 47.938909607000156 ], [ 12.914229370000044, 47.935989889 ], [ 12.931075887000134, 47.924879456000056 ], [ 12.964975626000125, 47.871962790000097 ], [ 12.986576375000112, 47.850258688000096 ], [ 12.99122725400008, 47.847106426000138 ], [ 12.926735067000038, 47.777394918000098 ], [ 12.921257365000145, 47.769540101000146 ], [ 12.91929366100004, 47.763183899000026 ], [ 12.918983602000139, 47.756776022000096 ], [ 12.917226603000074, 47.750161438000092 ], [ 12.910818726000116, 47.743081767000078 ], [ 12.910818726000116, 47.743030090000062 ], [ 12.910612019000069, 47.742926738000122 ], [ 12.892008504000103, 47.723548076000057 ], [ 12.90833825600015, 47.712360129000118 ], [ 12.964045451000089, 47.705357971000026 ], [ 12.979031616000071, 47.707089132000092 ], [ 13.004353068000029, 47.714608053000134 ], [ 13.019855998000139, 47.712928569000084 ], [ 13.032258341000102, 47.706624044000151 ], [ 13.044557332000068, 47.696572978000134 ], [ 13.064091024000078, 47.67399037700001 ], [ 13.072049194000044, 47.65946929900015 ], [ 13.074839722000092, 47.646653545000063 ], [ 13.07421960400012, 47.634509583000167 ], [ 13.072049194000044, 47.622417298000087 ], [ 13.069568725000067, 47.620246887000107 ], [ 13.057683146000045, 47.600428976000032 ], [ 13.057063029000062, 47.597664286000068 ], [ 13.040939982000083, 47.583349915000085 ], [ 13.038252807000049, 47.58402170900014 ], [ 13.039079631000078, 47.561335755000087 ], [ 13.041250041000069, 47.561904196000128 ], [ 13.040113159000043, 47.560457255000145 ], [ 13.030604696000069, 47.54425669400014 ], [ 13.028124227000092, 47.541647034000121 ], [ 13.028124227000092, 47.524232077000093 ], [ 13.028951050000103, 47.518030905000117 ], [ 13.031224812000119, 47.512553203000138 ], [ 13.034428751000092, 47.507437236000143 ], [ 13.037012573000112, 47.50136525500001 ], [ 13.03732263100008, 47.493045350000116 ], [ 13.008797241000138, 47.470101014000093 ], [ 13.001872599000052, 47.466018576000081 ], [ 12.991123901000037, 47.465682679000011 ], [ 12.984922729000061, 47.468266500000098 ], [ 12.979341674000125, 47.472245586 ], [ 12.969729858000022, 47.475733745000028 ], [ 12.959291219000079, 47.475527039000085 ], [ 12.951022990000126, 47.472478130000141 ], [ 12.942548055000145, 47.470488587000105 ], [ 12.931592651000074, 47.473511658000021 ], [ 12.882603393000068, 47.498574728000122 ], [ 12.83692142700005, 47.532655335000086 ], [ 12.828446492000126, 47.537254538000141 ], [ 12.81904138100009, 47.539528300000157 ], [ 12.803641805000098, 47.54133697500005 ], [ 12.778940470000094, 47.554824524000125 ], [ 12.773669474000144, 47.579500021000044 ], [ 12.785865112000067, 47.602676901000123 ], [ 12.81315026900009, 47.611823629000114 ], [ 12.793306518000094, 47.624794413000032 ], [ 12.767364950000058, 47.636369935000076 ], [ 12.751655314000089, 47.64939239600001 ], [ 12.761990600000075, 47.66685902900015 ], [ 12.744834025000017, 47.665360413000045 ], [ 12.688713419000067, 47.675127259000092 ], [ 12.653056681000095, 47.675127259000092 ], [ 12.617399943000095, 47.669339498000127 ], [ 12.598383015000138, 47.662879944000068 ], [ 12.563374919000069, 47.641761370000111 ], [ 12.553837931000118, 47.636008199000074 ], [ 12.538231649000096, 47.631331482000022 ], [ 12.517147664000049, 47.628540955000133 ], [ 12.496580444000074, 47.628902690000146 ], [ 12.482524454000043, 47.633579407000028 ], [ 12.452758830000079, 47.649754130000119 ], [ 12.44469730600008, 47.65629119900008 ], [ 12.439219604000073, 47.66448191400012 ], [ 12.428780965000044, 47.685798442000092 ], [ 12.424130086000076, 47.691560365000086 ], [ 12.407696980000111, 47.693730774000144 ], [ 12.368422892000041, 47.683550517000086 ], [ 12.35147302300004, 47.681690166000081 ], [ 12.293698771000038, 47.690010071000145 ], [ 12.271891317000041, 47.687891337000067 ], [ 12.249567098000057, 47.680010682000116 ], [ 12.238715047000113, 47.678899639000051 ], [ 12.22879317200011, 47.684868266000151 ], [ 12.223315470000017, 47.69590118400005 ], [ 12.226622762000119, 47.70287750200005 ], [ 12.233030639000077, 47.708871969000157 ], [ 12.236544637000122, 47.716778463000125 ], [ 12.239128459000113, 47.727449646000125 ], [ 12.242229044000055, 47.732023011000152 ], [ 12.239748576000096, 47.731687114000081 ], [ 12.22517582200004, 47.727372132000099 ], [ 12.216494181000058, 47.723703105000098 ], [ 12.192412964000113, 47.71016388000011 ], [ 12.176599976000119, 47.705823059000139 ], [ 12.178563680000053, 47.697658183000115 ], [ 12.181767619000141, 47.69212880500011 ], [ 12.189105672000039, 47.685565898000149 ], [ 12.197270549000052, 47.680088196000057 ], [ 12.202334839000116, 47.677788595000138 ], [ 12.20512536600009, 47.672285055000046 ], [ 12.206779012000112, 47.645568339000178 ], [ 12.205745483000044, 47.636214905000045 ], [ 12.202128133000144, 47.629832866000086 ], [ 12.173602742000099, 47.605079855000085 ], [ 12.165644572000133, 47.603968811000172 ], [ 11.935891154000046, 47.610738424000104 ], [ 11.851968627000133, 47.599162903000078 ], [ 11.840703166000054, 47.594615377000039 ], [ 11.830677938000122, 47.577613831000022 ], [ 11.820342651000118, 47.575288391000086 ], [ 11.764015340000128, 47.583117371000114 ], [ 11.682573283000096, 47.583349915000085 ], [ 11.63895837400014, 47.589241028000075 ], [ 11.620458211000113, 47.589654440000075 ], [ 11.6170475670001, 47.586760560000087 ], [ 11.589142293000123, 47.570379131000053 ], [ 11.58232100400005, 47.559785462000079 ], [ 11.574466186000109, 47.536634420000084 ], [ 11.569401896000045, 47.527384339000079 ], [ 11.551211792000117, 47.513690084000061 ], [ 11.529507690000116, 47.507850648000058 ], [ 11.482585490000076, 47.502579651000033 ], [ 11.459951212000107, 47.507437236000143 ], [ 11.435353231000136, 47.509710999000063 ], [ 11.412615600000066, 47.506093648000089 ], [ 11.36548669400014, 47.46932586700008 ], [ 11.377785685000077, 47.467052104000075 ], [ 11.388637736000135, 47.462220357000049 ], [ 11.392461792000063, 47.454778951000137 ], [ 11.383883504000039, 47.444857076000133 ], [ 11.36765710500012, 47.44012868300014 ], [ 11.324248901000146, 47.439431051000057 ], [ 11.305645385000076, 47.435400290000175 ], [ 11.286318400000141, 47.423204651000063 ], [ 11.273089233000121, 47.411112366000069 ], [ 11.258826538000079, 47.400725403000067 ], [ 11.237019083000121, 47.393955790000021 ], [ 11.213041219000019, 47.395816142000015 ], [ 11.215211629000123, 47.422997945000091 ], [ 11.193817587000098, 47.428940735000126 ], [ 11.168599487000051, 47.424264018000045 ], [ 11.103280477000112, 47.393568218000027 ], [ 11.083746785000102, 47.3895116180001 ], [ 10.979463745000146, 47.390545146000179 ], [ 10.965511108000072, 47.396074524000184 ], [ 10.955279175000101, 47.409613750000162 ], [ 10.95765629100012, 47.409717103 ], [ 10.960860229000104, 47.414316305000128 ], [ 10.96313399200011, 47.421240947000044 ], [ 10.962823934000141, 47.427958883000045 ], [ 10.959826701000111, 47.432506409 ], [ 10.909907267000051, 47.46898997000001 ], [ 10.858437540000068, 47.485164693000101 ], [ 10.851616252000042, 47.493097026000058 ], [ 10.883862346000086, 47.508005676 ], [ 10.892233928000053, 47.514878643000159 ], [ 10.86928959100004, 47.526583354000039 ], [ 10.858644247000115, 47.53066579200005 ], [ 10.844794962000066, 47.531311747000032 ], [ 10.830635620000123, 47.528572896000085 ], [ 10.79032800300007, 47.51606720000008 ], [ 10.760769083000127, 47.51363840700013 ], [ 10.752190795000104, 47.51539540600011 ], [ 10.747229858000139, 47.520149638000092 ], [ 10.743922567000141, 47.525317281000113 ], [ 10.73989180500007, 47.528469544000146 ], [ 10.607910197000109, 47.562265930000038 ], [ 10.583725627000121, 47.56247263600001 ], [ 10.569876343000061, 47.55593556700002 ], [ 10.549619181000082, 47.536789450000029 ], [ 10.536906779000105, 47.529864808000056 ], [ 10.525124552000108, 47.528469544000146 ], [ 10.482543172000135, 47.532862040000154 ], [ 10.466936890000113, 47.53771962500015 ], [ 10.458772013000072, 47.541647034000121 ], [ 10.453501017000065, 47.546246236000101 ], [ 10.451744018000085, 47.554824524000125 ], [ 10.455464721000084, 47.561180726000046 ], [ 10.460322306000108, 47.565986633000151 ], [ 10.461562540000045, 47.569914043000111 ], [ 10.457118368000124, 47.579241638000056 ], [ 10.453604370000079, 47.58110199000005 ], [ 10.445956258000109, 47.579060771000016 ], [ 10.429213094000147, 47.577019552000067 ], [ 10.41422692900008, 47.573014628000166 ], [ 10.415673868000084, 47.564384665000105 ], [ 10.424355509000122, 47.553351746000104 ], [ 10.430970093000042, 47.54216379800009 ], [ 10.429729858000087, 47.532913717000056 ], [ 10.41960127800013, 47.493045350000116 ], [ 10.433657267000058, 47.487851868000021 ], [ 10.442235555000082, 47.481392314000075 ], [ 10.447609904000046, 47.47258148300007 ], [ 10.451744018000085, 47.460204977000032 ], [ 10.451950724000113, 47.438759257000086 ], [ 10.442855672000064, 47.41628001 ], [ 10.428282918000093, 47.396048686000157 ], [ 10.411643107000089, 47.381036683 ], [ 10.403064819000065, 47.377109273000045 ], [ 10.381980835000121, 47.372122498000081 ], [ 10.371645549000107, 47.367394104000098 ], [ 10.365651082000085, 47.361115418000097 ], [ 10.343430216000058, 47.330755514000046 ], [ 10.325446818000074, 47.31432240900007 ], [ 10.305913126000064, 47.302178447000173 ], [ 10.2611613360001, 47.283497416 ], [ 10.239353882000074, 47.277735494000027 ], [ 10.17495085000013, 47.272375554000021 ], [ 10.159875529000061, 47.27112091100004 ], [ 10.155431355000076, 47.272877909000115 ], [ 10.15946211800005, 47.279130758000022 ], [ 10.168660522000067, 47.29042205800009 ], [ 10.172691284000052, 47.292308248 ], [ 10.185920451000129, 47.294995423000117 ], [ 10.190778036000069, 47.298251038 ], [ 10.193258504000141, 47.30491729800012 ], [ 10.192741739000098, 47.310911764000039 ], [ 10.190467977000083, 47.317474671000028 ], [ 10.208554729000099, 47.354474996000178 ], [ 10.209278198000106, 47.372484233000179 ], [ 10.190881388000093, 47.379228008000112 ], [ 10.146956420000066, 47.373801982000046 ], [ 10.135070842000118, 47.364887797 ], [ 10.130833374000076, 47.362665711000105 ], [ 10.125665731000083, 47.362691549000104 ], [ 10.11533044400008, 47.366954855000174 ], [ 10.110369507000115, 47.367394104000098 ], [ 10.097243693000053, 47.363130799000047 ], [ 10.089595581000083, 47.359280904000101 ], [ 10.082877644000064, 47.359074199000034 ], [ 10.073162475000117, 47.36548207599999 ], [ 10.067788127000142, 47.375042217000086 ], [ 10.066857951000088, 47.385790914 ], [ 10.064170776000083, 47.396177878000017 ], [ 10.053215373000086, 47.404859518000151 ], [ 10.07595300300008, 47.416874288000045 ], [ 10.080603881000116, 47.427390442 ], [ 10.071818888000053, 47.439120993000088 ], [ 10.022622924000075, 47.487955221000149 ], [ 10.011254110000095, 47.484441224000093 ], [ 10.002365764000075, 47.479170227000068 ], [ 9.993580770000079, 47.476586406000152 ], [ 9.982625366000121, 47.481030579000063 ], [ 9.981075073000085, 47.48687001600014 ], [ 9.980765015000117, 47.489918925 ], [ 9.980765015000117, 47.492941997000017 ], [ 9.971669962000135, 47.50640370700016 ], [ 9.95916426600013, 47.514878643000159 ], [ 9.948725626000112, 47.524232077000093 ], [ 9.945935099000053, 47.540768534 ], [ 9.933842814000059, 47.534205628000038 ], [ 9.918753296000148, 47.532190247000173 ], [ 9.888987671000081, 47.533792216 ], [ 9.858911988000102, 47.54133697500005 ], [ 9.853847697000106, 47.540406800000099 ], [ 9.841548706000083, 47.53503245000006 ], [ 9.833487182000084, 47.534619039000049 ], [ 9.81312666900007, 47.541750387000079 ], [ 9.809302612000124, 47.552318217000121 ], [ 9.811266317000047, 47.564488017000045 ], [ 9.807959025000059, 47.576321920000069 ], [ 9.796280152000094, 47.584951885000109 ], [ 9.782120809000048, 47.588414205000149 ], [ 9.767134643000077, 47.587277324000056 ], [ 9.75266524200012, 47.582058004000103 ], [ 9.730857788000094, 47.564901429000074 ], [ 9.718455444000142, 47.546711324000015 ], [ 9.7039860430001, 47.53141510000016 ], [ 9.676700887000095, 47.522630107000069 ], [ 9.612622111000093, 47.521880799000158 ], [ 9.554143852000095, 47.532743111000073 ], [ 9.549886922000042, 47.533533834000039 ], [ 9.547481674000068, 47.534547102000133 ], [ 9.273211304000142, 47.650090027000104 ], [ 9.234350627000111, 47.656162008000152 ], [ 9.196936890000131, 47.656136170000039 ], [ 9.173275314563824, 47.655250651258562 ], [ 9.155220679406478, 47.666922484183125 ], [ 9.144925417388691, 47.668252149659089 ], [ 9.137085147841969, 47.664769390126509 ], [ 9.113021234783183, 47.671570929222284 ], [ 9.090071826262708, 47.678269036605229 ], [ 9.016586141000118, 47.678899639000051 ], [ 8.997672566000091, 47.673835348000139 ], [ 8.981756225000083, 47.662156474000184 ], [ 8.945376017000086, 47.654301656000044 ], [ 8.906205281000041, 47.651795349000068 ], [ 8.881710652000095, 47.656136170000039 ], [ 8.852668498000099, 47.670786438000121 ], [ 8.851935119000075, 47.671281723000064 ], [ 8.837785685000142, 47.680837504000138 ], [ 8.837682333000117, 47.687787985000128 ], [ 8.856079142000112, 47.690681864000126 ], [ 8.830240926000101, 47.707192485000022 ], [ 8.797581420000114, 47.720034079000115 ], [ 8.770709676000109, 47.720860901000137 ], [ 8.761717977000075, 47.701249695000016 ], [ 8.769882853000098, 47.695074361000039 ], [ 8.717069540000068, 47.694557597000184 ], [ 8.715105835000116, 47.701068827000071 ], [ 8.712625366000054, 47.708691101000127 ], [ 8.70466719500007, 47.715331523000131 ], [ 8.700429728000131, 47.723496399000155 ], [ 8.703737020000119, 47.730033468000116 ], [ 8.717069540000068, 47.743546855000019 ], [ 8.719756714000084, 47.74731923400013 ], [ 8.71314213000008, 47.757421977000078 ], [ 8.703323608000119, 47.758713887000013 ], [ 8.692264852000108, 47.757163595000108 ], [ 8.681929565000104, 47.758739726000115 ], [ 8.674488159000077, 47.766697897000185 ], [ 8.66663334200004, 47.778273417000136 ], [ 8.657021525000118, 47.788117778000114 ], [ 8.644102417000113, 47.791011658000102 ], [ 8.635007365000149, 47.784603780000154 ], [ 8.629839721000053, 47.762796326000128 ], [ 8.617437378000091, 47.757318624000121 ], [ 8.607618856000101, 47.762253723000086 ], [ 8.604104858000142, 47.774397685000068 ], [ 8.603174682000116, 47.787316793000102 ], [ 8.601624390000097, 47.794603170000173 ], [ 8.58312422700007, 47.800235901000107 ], [ 8.558216187000085, 47.801166077000133 ], [ 8.542299846000077, 47.795016581000183 ], [ 8.55160160300008, 47.779255270000093 ], [ 8.536512085000084, 47.774087626 ], [ 8.482665242000053, 47.766852926000027 ], [ 8.471503133000112, 47.767059632 ], [ 8.463648315000086, 47.763907370000041 ], [ 8.450109090000126, 47.75047149699999 ], [ 8.445458211000044, 47.743185120000092 ], [ 8.437913452000089, 47.723186341000158 ], [ 8.427268107000117, 47.716468404000139 ], [ 8.401946655000131, 47.707089132000092 ], [ 8.392128133000142, 47.699518535000138 ], [ 8.390991251000059, 47.69212880500011 ], [ 8.395228719000102, 47.68481659000004 ], [ 8.397709188000078, 47.676289979000117 ], [ 8.391301310000131, 47.665463765000183 ], [ 8.40701094500011, 47.661562195000116 ], [ 8.411971883000149, 47.661045430000073 ], [ 8.437603394000121, 47.647842102000098 ], [ 8.458273966000121, 47.639883932000131 ], [ 8.476050659000066, 47.640400696000157 ], [ 8.490830119000094, 47.645568339000178 ], [ 8.504679402000136, 47.65226043700001 ], [ 8.519665568000107, 47.65735056600009 ], [ 8.568241414000113, 47.662931621 ], [ 8.582194051000101, 47.661329651000145 ], [ 8.593588683000092, 47.65816856 ], [ 8.598213745000066, 47.656885478000149 ], [ 8.607308797000115, 47.65629119900008 ], [ 8.601624390000097, 47.632597555000146 ], [ 8.595113159000107, 47.63481964100005 ], [ 8.594493042000039, 47.640969137000027 ], [ 8.593562866000099, 47.642571106000062 ], [ 8.589222046000117, 47.642467754000123 ], [ 8.583951050000081, 47.641124166000068 ], [ 8.580333699000107, 47.63900543199999 ], [ 8.578059936000074, 47.633476054000184 ], [ 8.579713583000114, 47.628928529000135 ], [ 8.582090698000087, 47.625026957 ], [ 8.582504110000087, 47.621590475000161 ], [ 8.581263875000047, 47.614769186 ], [ 8.581780639000101, 47.607663677000076 ], [ 8.580643758000093, 47.600170594000033 ], [ 8.576305366000042, 47.595023058000109 ], [ 8.574132527000103, 47.592444967000134 ], [ 8.560696655000072, 47.589396057000116 ], [ 8.551719149000036, 47.596863329000044 ], [ 8.549637899000061, 47.598594462 ], [ 8.537752319000049, 47.612133688000185 ], [ 8.522352742000038, 47.621900534000062 ], [ 8.492380411000113, 47.619833476000096 ], [ 8.461787964000081, 47.606139221000078 ], [ 8.450109090000126, 47.589034323000121 ], [ 8.448868856000075, 47.58428009100011 ], [ 8.421100326000044, 47.581111870000157 ], [ 8.418069702000111, 47.580766094000168 ], [ 8.354094279000037, 47.58102447500012 ], [ 8.316163777000043, 47.587845764000079 ], [ 8.306345255000053, 47.592186585000078 ], [ 8.299317260000038, 47.601824239000095 ], [ 8.293942912000091, 47.611461894000016 ], [ 8.288568562000108, 47.615802715000186 ], [ 8.276993042000072, 47.616629537 ], [ 8.251051473000132, 47.622003886000172 ], [ 8.232964721000116, 47.621952210000146 ], [ 8.17901452600006, 47.615802715000186 ], [ 8.173846883000067, 47.613528951000077 ], [ 8.168885946000103, 47.608645528000139 ], [ 8.162064656000069, 47.603762105000115 ], [ 8.143771199000071, 47.600067241000104 ], [ 8.122067098000088, 47.592134908000062 ], [ 8.113902221000075, 47.587845764000079 ], [ 8.105427286000065, 47.581257019000091 ], [ 8.101396525000069, 47.576192729000027 ], [ 8.096952351000141, 47.571851909000046 ], [ 8.087237182000109, 47.567381897000033 ], [ 8.042278686000117, 47.560560608000074 ], [ 7.91215743000015, 47.560560608000074 ], [ 7.909470256000105, 47.564798076000116 ], [ 7.907506551000097, 47.57417734799999 ], [ 7.904302613000112, 47.583556621000028 ], [ 7.898204794000066, 47.587845764000079 ], [ 7.83371260600012, 47.590481263000115 ], [ 7.819656616000117, 47.595338847000122 ], [ 7.801466512000076, 47.576089376000098 ], [ 7.785550171000068, 47.563196106000092 ], [ 7.766739949000055, 47.555961406000122 ], [ 7.727320447000125, 47.550422624000149 ], [ 7.683437540000114, 47.54425669400014 ], [ 7.661423380000116, 47.546246236000101 ], [ 7.64690103500007, 47.551445236000021 ], [ 7.609746948000094, 47.564746399000015 ], [ 7.612337281000094, 47.564731041000087 ], [ 7.635895223000091, 47.564591370000173 ], [ 7.646540568000091, 47.571541850000145 ], [ 7.65966638200004, 47.596579082000162 ], [ 7.637032104000099, 47.594977112000137 ], [ 7.586028488000125, 47.584618544000151 ], [ 7.590109904000144, 47.594822083000096 ], [ 7.592487020000107, 47.598413595000167 ], [ 7.590316609000098, 47.607947896000056 ], [ 7.58504561400008, 47.61316721600015 ], [ 7.578637735000115, 47.616939596000108 ], [ 7.5726432700001, 47.622003886000172 ], [ 7.550112345000088, 47.652441305000039 ], [ 7.536573120000099, 47.665205384000032 ], [ 7.5217936600001, 47.670424704000041 ], [ 7.517866251000015, 47.67502390599999 ], [ 7.514662312000041, 47.685798442000092 ], [ 7.511871785000096, 47.707321676000063 ], [ 7.515385783000056, 47.713316142000096 ], [ 7.531922241000132, 47.725201722000023 ], [ 7.537813355000139, 47.73181630400002 ], [ 7.538330119000079, 47.748146057000056 ], [ 7.525927775000099, 47.78315684000016 ], [ 7.528614949000144, 47.797031963000123 ], [ 7.542877645000118, 47.829433086000122 ], [ 7.548458699000122, 47.834238993000142 ], [ 7.5619979250001, 47.839225769 ], [ 7.564168334000101, 47.850413717000137 ], [ 7.559000691000108, 47.869017233000093 ], [ 7.559207397000137, 47.8734614050001 ], [ 7.558380575000115, 47.875993551000178 ], [ 7.5578638100001, 47.878525697000086 ], [ 7.559000691000108, 47.882711488000112 ], [ 7.5619979250001, 47.88705230699999 ], [ 7.568612508000115, 47.891367290000161 ], [ 7.5726432700001, 47.896302389000098 ], [ 7.578947795000119, 47.906327617000116 ], [ 7.580808146000038, 47.91079762800014 ], [ 7.579567911000083, 47.927049866000161 ], [ 7.584942261000037, 47.94040822400008 ], [ 7.611607300000088, 47.959399313000134 ], [ 7.621115763000063, 47.971439922000016 ], [ 7.618945353000072, 48.00265248700002 ], [ 7.575743856000145, 48.053708802000173 ], [ 7.5726432700001, 48.094972433000081 ], [ 7.578947795000119, 48.114480286000074 ], [ 7.58566573000013, 48.129724833000026 ], [ 7.592900431000118, 48.138664856000062 ], [ 7.599721720000076, 48.144710999 ], [ 7.604786010000055, 48.15256581600012 ], [ 7.606749715000149, 48.16698354100005 ], [ 7.613364298000079, 48.179205018000076 ], [ 7.676616252000144, 48.238400371000139 ], [ 7.687158243000113, 48.252921448 ], [ 7.693462769000121, 48.269871318000114 ], [ 7.695529825000079, 48.290180156000034 ], [ 7.702454467000081, 48.311186625000047 ], [ 7.71857751500005, 48.319997457000042 ], [ 7.736974325000062, 48.326663717000045 ], [ 7.75072025500009, 48.341365662000115 ], [ 7.751960490000045, 48.355344137000131 ], [ 7.746896199000048, 48.368676657000051 ], [ 7.740384969000075, 48.381440736000016 ], [ 7.737181030000102, 48.39348134400008 ], [ 7.738317912000127, 48.406607158000057 ], [ 7.745655965000111, 48.43301381400012 ], [ 7.75072025500009, 48.44440846800002 ], [ 7.757644897000148, 48.453891093000024 ], [ 7.764156128000138, 48.460350648000073 ], [ 7.769220419000106, 48.47006581700002 ], [ 7.771287475000065, 48.489108582000156 ], [ 7.776455119000076, 48.498177796000121 ], [ 7.788444051000056, 48.506342672000144 ], [ 7.813455444000027, 48.519468486000122 ], [ 7.813455444000027, 48.526341451000079 ], [ 7.801673217000115, 48.547580465000138 ], [ 7.801776571000062, 48.582358704000015 ], [ 7.810251506000071, 48.615018209000183 ], [ 7.852419475000119, 48.658684794000138 ], [ 7.864098348000084, 48.664162497000135 ], [ 7.880634806000074, 48.667728170000103 ], [ 7.895931030000043, 48.676513163 ], [ 7.92331953900009, 48.698217265 ], [ 7.935205119000102, 48.70333323199999 ], [ 7.948434285000104, 48.711859844000102 ], [ 7.959182983000119, 48.72136830699999 ], [ 7.963627157000133, 48.72927480100013 ], [ 7.96486739100007, 48.748343405000114 ], [ 7.970138387000105, 48.757283427000132 ], [ 7.981507202000103, 48.759763896000109 ], [ 8.009619181000119, 48.760073954000106 ], [ 8.017267293000117, 48.761830954000075 ], [ 8.022951701000068, 48.765086569000161 ], [ 8.025122111000144, 48.770615947000138 ], [ 8.027292521000049, 48.780021058000116 ], [ 8.031943400000102, 48.78534373000015 ], [ 8.03659427900007, 48.788289287000069 ], [ 8.038764689000061, 48.790769756000046 ], [ 8.047549682000124, 48.791028137000112 ], [ 8.084239950000097, 48.804050598000131 ], [ 8.090337769000143, 48.807512920000178 ], [ 8.102740112000049, 48.821310526000119 ], [ 8.14811202000007, 48.903734436000136 ], [ 8.179324585000131, 48.942698467000028 ], [ 8.199891545000099, 48.958250331 ], [ 8.200305216000061, 48.95856313100002 ], [ 8.188729695000092, 48.96574615499999 ], [ 8.090441121000083, 48.979182028000039 ], [ 7.931897827000114, 49.034837546000134 ], [ 7.913811075000098, 49.036181133000028 ], [ 7.856863647000125, 49.032253723000153 ], [ 7.773664591000113, 49.048118388000049 ], [ 7.762605835000102, 49.046154683000125 ], [ 7.739144735000139, 49.037731425000132 ], [ 7.726949096000112, 49.035664368000155 ], [ 7.717337281000113, 49.036594544000039 ], [ 7.696149943000052, 49.041555481000088 ], [ 7.685091187000069, 49.042795716000015 ], [ 7.672482137000117, 49.04103871700012 ], [ 7.660803264000066, 49.037731425000132 ], [ 7.648814331000096, 49.035716045000086 ], [ 7.644938840000066, 49.036294476000151 ], [ 7.634965047000037, 49.03778310100013 ], [ 7.625663289000102, 49.043002421000082 ], [ 7.61594812000007, 49.05597320599999 ], [ 7.608610066000068, 49.061967672000108 ], [ 7.586389201000145, 49.06956410700009 ], [ 7.542670939000061, 49.074576722000145 ], [ 7.52086348500012, 49.083671774000109 ], [ 7.507737671000058, 49.094575501000079 ], [ 7.485103394000106, 49.118708395000127 ], [ 7.471047404000103, 49.128320212000133 ], [ 7.472804403000083, 49.131627503000132 ], [ 7.475284871000042, 49.133901266000166 ], [ 7.482726278000087, 49.137053528000123 ], [ 7.476111694000082, 49.151522929000137 ], [ 7.458024942000066, 49.155863750000137 ], [ 7.414823446000128, 49.157775778000044 ], [ 7.410482625000043, 49.168937887000183 ], [ 7.39105228700015, 49.170023092000079 ], [ 7.371633809000088, 49.166173614000073 ], [ 7.367591186000084, 49.165372213000026 ], [ 7.350951376000069, 49.15917104200004 ], [ 7.346300496000112, 49.154210104000086 ], [ 7.339065796000057, 49.139689026000141 ], [ 7.334001506000078, 49.134159648000136 ], [ 7.326456746000105, 49.131834208 ], [ 7.305992879000144, 49.13012888700014 ], [ 7.297104533000038, 49.128113505 ], [ 7.290800008000133, 49.123100892000039 ], [ 7.280258016000062, 49.10899322600001 ], [ 7.274366902000054, 49.105014140000108 ], [ 7.268062378000138, 49.105634257000091 ], [ 7.241190633000144, 49.113902486000043 ], [ 7.154994344000045, 49.114419251000172 ], [ 7.139284708000048, 49.117933248000114 ], [ 7.123575073000097, 49.123307597000078 ], [ 7.085334513000106, 49.14154937800005 ], [ 7.079856812000116, 49.142014465000059 ], [ 7.07076175900005, 49.136123353000173 ], [ 7.071588582000061, 49.130593974000149 ], [ 7.07479252100012, 49.125374655000044 ], [ 7.073242228000112, 49.12031036399999 ], [ 7.042546427000076, 49.107597962000014 ], [ 7.020532267000078, 49.118966777000097 ], [ 7.008956746000138, 49.14640696300016 ], [ 7.009473510000078, 49.181701965000158 ], [ 6.987872762000109, 49.182425436000145 ], [ 6.925447632000072, 49.205576477000037 ], [ 6.914388876000146, 49.206661683000121 ], [ 6.885243367000044, 49.204801331000127 ], [ 6.843488810000082, 49.211054180000033 ], [ 6.833463583000054, 49.20945221 ], [ 6.827675822000089, 49.195551250000037 ], [ 6.835220581000044, 49.179376526000041 ], [ 6.839044637000086, 49.16278839200011 ], [ 6.821784709000099, 49.147750550000026 ], [ 6.809072306000132, 49.145838522000119 ], [ 6.770108276000144, 49.155295309000067 ], [ 6.725563192000038, 49.155553691000065 ], [ 6.713780965000126, 49.158860982000064 ], [ 6.700965210000078, 49.172865296000154 ], [ 6.703755737000108, 49.18511261 ], [ 6.708820027000087, 49.197773336000026 ], [ 6.702515503000086, 49.21363800100012 ], [ 6.698484741000101, 49.213586324000019 ], [ 6.685048868000138, 49.207798564000043 ], [ 6.680604696000046, 49.207488505000143 ], [ 6.677917521000097, 49.211054180000033 ], [ 6.675953817000078, 49.218908997000156 ], [ 6.674816935000138, 49.221131084000078 ], [ 6.671612996000079, 49.225316875000104 ], [ 6.66375817900007, 49.243868713000055 ], [ 6.659520711000113, 49.246762594000032 ], [ 6.645671427000139, 49.250018209000118 ], [ 6.640297078000089, 49.25275706000015 ], [ 6.639160196000148, 49.256787822000049 ], [ 6.641227254000114, 49.26691640300011 ], [ 6.639676961000106, 49.271153870000049 ], [ 6.573169393000057, 49.313115133000068 ], [ 6.556426228000078, 49.326395976000171 ], [ 6.550121704000077, 49.338023173000025 ], [ 6.555599406000056, 49.347169902000118 ], [ 6.573376098000097, 49.347738343000074 ], [ 6.577716919000068, 49.355799866000055 ], [ 6.574306274000065, 49.361794332 ], [ 6.525730428000145, 49.395487366000125 ], [ 6.518805786000058, 49.402153626000043 ], [ 6.520769491000095, 49.402567038000157 ], [ 6.520562785000038, 49.40814809199999 ], [ 6.517875610000118, 49.416416321000113 ], [ 6.511674438000114, 49.424736226000093 ], [ 6.494517863000084, 49.435536601000123 ], [ 6.402740519000133, 49.465457255000061 ], [ 6.391681763000122, 49.466697490000101 ], [ 6.383516886000109, 49.464630432000135 ], [ 6.364499959000057, 49.456103821000013 ], [ 6.353854614000056, 49.454760234000148 ], [ 6.345307071000093, 49.455348652000069 ], [ 6.345379679000132, 49.462718404000029 ], [ 6.342279094000105, 49.493000794000054 ], [ 6.348808550000086, 49.525289755000088 ], [ 6.350754028000097, 49.534910381000131 ], [ 6.350754028000097, 49.566588034000048 ], [ 6.356438435000143, 49.577595113000129 ], [ 6.371527954000044, 49.592994690000111 ], [ 6.397572876000112, 49.613871969000073 ], [ 6.407701457000087, 49.627411194000061 ], [ 6.415246216000128, 49.63464589400003 ], [ 6.417933390000144, 49.63914174500006 ], [ 6.417003215000108, 49.645756327000058 ], [ 6.410905396000146, 49.64963206 ], [ 6.404497518000113, 49.652474264000077 ], [ 6.402740519000133, 49.655781555000075 ], [ 6.418243449000045, 49.669889222 ], [ 6.49172733600011, 49.700791728000084 ], [ 6.489763631000074, 49.70296213799999 ], [ 6.482942342000115, 49.708078105000155 ], [ 6.486352986000043, 49.71293569 ], [ 6.49100386500001, 49.714434306 ], [ 6.499685506000077, 49.712212218999987 ], [ 6.492554158000132, 49.718413391000084 ], [ 6.48779992600015, 49.725596416000045 ], [ 6.485526163000117, 49.733761292000153 ], [ 6.486249634000018, 49.74270131499999 ], [ 6.495964803000078, 49.748230693 ], [ 6.496378214000089, 49.752106425000036 ], [ 6.493691040000044, 49.756550598000146 ], [ 6.493794392000069, 49.763630269000075 ], [ 6.49854862400008, 49.785386048000177 ], [ 6.499995564000074, 49.786057841000158 ], [ 6.500098918000077, 49.794481100000056 ], [ 6.502269327000079, 49.795876363000119 ], [ 6.502579387000139, 49.795669658000079 ], [ 6.4972050370001, 49.799442038 ], [ 6.493277629000119, 49.799597066000146 ], [ 6.462478475000069, 49.805488180000125 ], [ 6.414522746000046, 49.805488180000125 ], [ 6.397056111000097, 49.808588766000085 ], [ 6.380106242000096, 49.815565084000085 ], [ 6.351374145000079, 49.833290100000099 ], [ 6.33442427500006, 49.840214742000072 ], [ 6.325639282000083, 49.840369772000102 ], [ 6.310653116000111, 49.834478659000027 ], [ 6.30259159400012, 49.834943747000139 ], [ 6.301558065000052, 49.838302714000136 ], [ 6.295567892000122, 49.848615692000081 ], [ 6.291532837000119, 49.855562643000056 ], [ 6.286778605000109, 49.86104034500012 ], [ 6.27220585200007, 49.867138164 ], [ 6.238306111000071, 49.876905009000055 ], [ 6.222699829000106, 49.887136943000129 ], [ 6.18983361800008, 49.938296611000126 ], [ 6.172677043000107, 49.956228333000084 ], [ 6.161928345000092, 49.942482402000067 ], [ 6.153970174000051, 49.951215719000132 ], [ 6.138777303000097, 49.979327698000176 ], [ 6.12151737500011, 49.996277568 ], [ 6.117176554000139, 50.004390768000079 ], [ 6.119967081000112, 50.015501200000088 ], [ 6.113765910000012, 50.036378480000067 ], [ 6.10725467900005, 50.044595032000117 ], [ 6.096402629000096, 50.048625794000102 ], [ 6.105704386000127, 50.060304668000171 ], [ 6.10942509000003, 50.063560283000143 ], [ 6.107151327000111, 50.063766988000012 ], [ 6.101156861000078, 50.063405254000102 ], [ 6.099399861000109, 50.064128723000024 ], [ 6.105704386000127, 50.092240702000069 ], [ 6.110561971000038, 50.10598663399999 ], [ 6.11748661300004, 50.120456035000032 ], [ 6.126581665000089, 50.127329000000188 ], [ 6.129475545000076, 50.134046937 ], [ 6.125961547000117, 50.140196432 ], [ 6.115832967000074, 50.145467428000117 ], [ 6.11800337700015, 50.150376689000055 ], [ 6.121310668000149, 50.161590475000096 ], [ 6.123171020000086, 50.164897767000085 ], [ 6.13174930800011, 50.168308411000041 ], [ 6.151696411000017, 50.169341939 ], [ 6.159137817000044, 50.172442526000125 ], [ 6.165132284000066, 50.181899312000112 ], [ 6.165752400000145, 50.19316477500017 ], [ 6.160171346000112, 50.204533590000054 ], [ 6.146838827000096, 50.214042054000132 ], [ 6.15717411300011, 50.222723694000095 ], [ 6.179808390000062, 50.233007304000111 ], [ 6.189626912000023, 50.242722473000057 ], [ 6.210400838000084, 50.249026998000048 ], [ 6.253395630000057, 50.25677846300006 ], [ 6.271792439000137, 50.267423808000061 ], [ 6.267348267000045, 50.276415507000095 ], [ 6.269415324000107, 50.286492412000044 ], [ 6.276029907000094, 50.296104228000146 ], [ 6.285951782000097, 50.303855692000141 ], [ 6.299491007000086, 50.308868307000026 ], [ 6.310653116000111, 50.308248190000043 ], [ 6.322021932000098, 50.305405986000082 ], [ 6.335457804000043, 50.303855692000141 ], [ 6.36201949000008, 50.30695627900009 ], [ 6.374525187000074, 50.31548289100003 ], [ 6.373399684000106, 50.323080035000046 ], [ 6.372458130000098, 50.329435527 ], [ 6.337731567000077, 50.368089498000117 ], [ 6.336387980000097, 50.379923402000131 ], [ 6.343312622000099, 50.39330759700006 ], [ 6.350443969000111, 50.416872051000055 ], [ 6.35116744000004, 50.433563538 ], [ 6.347343384000084, 50.436974183000032 ], [ 6.340212036000139, 50.437852682000155 ], [ 6.331633748000115, 50.446896057000018 ], [ 6.326156046000108, 50.457024638000163 ], [ 6.32326216600012, 50.466016337000113 ], [ 6.325742635000097, 50.474026184000181 ], [ 6.336904744000037, 50.48100250200018 ], [ 6.31871464000011, 50.481674296000065 ], [ 6.27540979000014, 50.488030497000082 ], [ 6.260113566000086, 50.492681376000164 ], [ 6.257839803000053, 50.494076640000131 ], [ 6.255566040000133, 50.494593404000071 ], [ 6.253085571000071, 50.494076640000131 ], [ 6.25091516100008, 50.492681376000164 ], [ 6.217118774000085, 50.486015117000065 ], [ 6.207196900000099, 50.486325175000118 ], [ 6.199238729000058, 50.49040761300013 ], [ 6.190660441000119, 50.501828105000143 ], [ 6.182598917000121, 50.506582337000125 ], [ 6.190557088000077, 50.515212301000176 ], [ 6.178878214000093, 50.515780742000132 ], [ 6.170816691000113, 50.517951152000123 ], [ 6.169473103000144, 50.522498678000076 ], [ 6.177327922000075, 50.530198466000158 ], [ 6.160688110000081, 50.543582663000095 ], [ 6.17908492000015, 50.56197947200009 ], [ 6.210607543000037, 50.578670959000121 ], [ 6.232931763000096, 50.587145894000045 ], [ 6.232931763000096, 50.590763245000019 ], [ 6.244300577000075, 50.5995482390001 ], [ 6.251328572000091, 50.608436585 ], [ 6.249054809000086, 50.614431051000125 ], [ 6.180015096000119, 50.615516256000134 ], [ 6.159447876000115, 50.622389222000024 ], [ 6.147769002000047, 50.636755270000108 ], [ 6.161101521000092, 50.642181296000089 ], [ 6.100226685000052, 50.701299134000138 ], [ 6.081003052000114, 50.713494772000061 ], [ 6.064363240000091, 50.714476624000113 ], [ 6.02477909300012, 50.70755198200014 ], [ 6.011549926000043, 50.708533835000097 ], [ 6.00762251800009, 50.716905417000177 ], [ 6.011343221000089, 50.727447408000145 ], [ 6.010826457000064, 50.737059225000152 ], [ 5.994186645000127, 50.742588603000158 ], [ 5.992739705000133, 50.744448955000067 ], [ 5.992636353000108, 50.746257630000159 ], [ 5.993256469000073, 50.748066305000137 ], [ 5.994910116000114, 50.749926656000142 ], [ 5.997080525000115, 50.762949117000105 ], [ 5.990569295000057, 50.769046936000152 ], [ 5.980647420000139, 50.773439433000036 ], [ 5.972999308000084, 50.781811015000116 ], [ 5.968761841000116, 50.794626770000022 ], [ 5.983954712000127, 50.792197978000146 ], [ 5.998320760000041, 50.800724589000154 ], [ 6.003591756000077, 50.812610169 ], [ 6.001421346000086, 50.821808574000087 ], [ 6.000491170000146, 50.830438538000024 ], [ 6.009276164000113, 50.840463765000052 ], [ 6.023022095000073, 50.845424704000024 ], [ 6.045553019000096, 50.844184469000155 ], [ 6.056715129000111, 50.852659404000164 ], [ 6.062812948000072, 50.862943014000066 ], [ 6.063123006000069, 50.870901184000118 ], [ 6.054648071000145, 50.891468404000122 ], [ 6.056508423000139, 50.898082988000013 ], [ 6.061779419000089, 50.903509013000175 ], [ 6.063743124000041, 50.907539774999989 ], [ 6.031083618000139, 50.914722799000131 ], [ 6.007519165000133, 50.924076233000065 ], [ 5.999871053000078, 50.929398906000117 ], [ 5.997287232000076, 50.937357076000083 ], [ 5.995840291000064, 50.951774801000099 ], [ 5.999664348000124, 50.960094706000163 ], [ 6.005762167000086, 50.968517965000146 ], [ 6.00369510900012, 50.97373728400008 ], [ 5.967831665000063, 50.970998434000123 ], [ 5.941580037000051, 50.976476135000112 ], [ 5.927730754000066, 50.977664694000126 ], [ 5.914191529000078, 50.975235901000175 ], [ 5.888249959000035, 50.967122701000065 ], [ 5.874607381000118, 50.965365702999989 ], [ 5.87357385200005, 50.990583801000142 ], [ 5.858174275000067, 51.019341736000158 ], [ 5.852489868000106, 51.042751160000122 ], [ 5.88049849500004, 51.052052918000143 ], [ 5.894347778000082, 51.047143657 ], [ 5.906233358000122, 51.037402649000157 ], [ 5.919565877000139, 51.029702860000086 ], [ 5.937962687000066, 51.030943095000012 ], [ 5.950261678000089, 51.039469707000123 ], [ 5.969485311000113, 51.064920350000037 ], [ 5.982921183000144, 51.074687195000095 ], [ 6.075421997000092, 51.120369161000028 ], [ 6.132369426000082, 51.139825337999987 ], [ 6.147252238000107, 51.152253520000059 ], [ 6.12627160700012, 51.164578349000024 ], [ 6.149112589000112, 51.176334737000033 ], [ 6.157070760000096, 51.179254456000095 ], [ 6.134126424000044, 51.184215394000049 ], [ 6.084310344000102, 51.162692159000116 ], [ 6.060849243000121, 51.170908712000042 ], [ 6.053717895000091, 51.189383037000155 ], [ 6.056611776000096, 51.211707255000121 ], [ 6.065190063000102, 51.231628520000029 ], [ 6.075421997000092, 51.242661439000031 ], [ 6.096505981000121, 51.258810324000123 ], [ 6.147769002000047, 51.318160706000143 ], [ 6.158207641000104, 51.324594422000089 ], [ 6.183632446000104, 51.335704854000099 ], [ 6.193554321000107, 51.344515686000094 ], [ 6.198928670000072, 51.356969706000186 ], [ 6.202029256000088, 51.378880513000141 ], [ 6.207817016000149, 51.387665508000126 ], [ 6.192727499000085, 51.398956808000023 ], [ 6.194071086000122, 51.417379456 ], [ 6.201719197000102, 51.438644308000093 ], [ 6.205336548000105, 51.458436382000158 ], [ 6.20047896300008, 51.476574809000098 ], [ 6.19334761500005, 51.509337667000082 ], [ 6.153039998000082, 51.538431499000083 ], [ 6.086480754000093, 51.595533956000011 ], [ 6.082139933000121, 51.607807109000063 ], [ 6.087514282000086, 51.622095642000133 ], [ 6.099193156000069, 51.644471538000019 ], [ 6.031497030000054, 51.662997539000131 ], [ 6.008552694000116, 51.681187643000086 ], [ 6.02198856600009, 51.709506327999989 ], [ 6.012066691000086, 51.715862528000017 ], [ 5.989742472000103, 51.726378682000146 ], [ 5.978270304000091, 51.729789327000091 ], [ 5.949228150000096, 51.72937591600008 ], [ 5.939306274000103, 51.731882223000142 ], [ 5.940133097000057, 51.742630921000071 ], [ 5.946056400000146, 51.746288216 ], [ 5.962353963000084, 51.756351013000099 ], [ 5.964110962000063, 51.776556498999987 ], [ 5.950778442000114, 51.795909322000156 ], [ 5.928040812000063, 51.806735535000186 ], [ 5.931451457000094, 51.815649720000025 ], [ 5.948091268000098, 51.822961935000095 ], [ 5.988915650000081, 51.827457784000117 ], [ 6.008242635000045, 51.832573751000112 ], [ 6.028913208000063, 51.842108053000018 ], [ 6.043279256000062, 51.846862285 ], [ 6.084000284000126, 51.853657735000141 ], [ 6.116453084000057, 51.848283387 ], [ 6.140017537000063, 51.844536845000064 ], [ 6.156140584000127, 51.842056376000087 ], [ 6.142704712000068, 51.855182190000065 ], [ 6.105394327000056, 51.879470113000153 ], [ 6.09299198400015, 51.885309550000144 ], [ 6.1269950760001, 51.89673004100014 ], [ 6.159241170000087, 51.887299093000181 ], [ 6.191383911000116, 51.871150208000088 ], [ 6.225180298000083, 51.862546082000065 ], [ 6.25639286200007, 51.866809387000117 ], [ 6.264661092000011, 51.866189271000152 ], [ 6.271792439000137, 51.861900127000084 ], [ 6.282851196000138, 51.849601135000128 ], [ 6.287398722000091, 51.846164653000116 ], [ 6.325742635000097, 51.842547303000046 ], [ 6.341969034000016, 51.836682028000141 ], [ 6.344966268000121, 51.8211015830001 ], [ 6.382483358000116, 51.827586975000159 ], [ 6.386617472000069, 51.837560527000065 ], [ 6.378452596000045, 51.860117289000087 ], [ 6.442531372000133, 51.848360901000106 ], [ 6.462891887000069, 51.848360901000106 ], [ 6.47942834400007, 51.853011780000159 ], [ 6.528624308000133, 51.876421204000124 ], [ 6.628153117000068, 51.897505189000142 ], [ 6.716674846000046, 51.899262187000133 ], [ 6.743753296000079, 51.908331401000012 ], [ 6.767007690000099, 51.925513815000059 ], [ 6.789848673000108, 51.951145325000041 ], [ 6.798013550000121, 51.956700542000036 ], [ 6.805661661000102, 51.957527365000075 ], [ 6.810725952000098, 51.960576274000104 ], [ 6.811656127000049, 51.972797751000101 ], [ 6.809175659000061, 51.97954152500013 ], [ 6.804008016000068, 51.984373271000052 ], [ 6.778169800000057, 52.001271465000158 ], [ 6.7128507890001, 52.02385406500018 ], [ 6.690939982000145, 52.027858988000091 ], [ 6.675023641000109, 52.034809469000081 ], [ 6.672956583000143, 52.050054016 ], [ 6.679881225000116, 52.060466818000137 ], [ 6.688872925000084, 52.063102316000069 ], [ 6.699414917000127, 52.063567404000182 ], [ 6.711403849000106, 52.067288107000181 ], [ 6.719465373000077, 52.073566793000097 ], [ 6.7276302490001, 52.086305033000073 ], [ 6.732901245000051, 52.091989441000109 ], [ 6.749851115000126, 52.102867330000052 ], [ 6.765870808000102, 52.108396709000075 ], [ 6.77157568400014, 52.108792502000128 ], [ 6.830673055000091, 52.11289255800007 ], [ 6.843282105000128, 52.119998067000111 ], [ 6.865399617000037, 52.147799988000159 ], [ 6.884829956000118, 52.160331523000153 ], [ 6.927721395000077, 52.171907044000122 ], [ 6.94766849700008, 52.182810771000092 ], [ 6.971129598000061, 52.206271871000141 ], [ 6.981878296000076, 52.213997498000069 ], [ 7.026320027000054, 52.230637309000159 ], [ 7.029110555000017, 52.235779114000152 ], [ 7.026600152000071, 52.238622687000074 ], [ 7.02073897300005, 52.245261739000128 ], [ 7.011850626000125, 52.266629944000059 ], [ 7.012470744000098, 52.284949239000028 ], [ 7.019705444000067, 52.300038758000127 ], [ 7.039755900000102, 52.328615825 ], [ 7.048230835000112, 52.365073547000108 ], [ 7.034174845000109, 52.39078257300018 ], [ 6.973300008000138, 52.451373190000041 ], [ 6.966995483000062, 52.449564515000148 ], [ 6.960794311000143, 52.442846578000129 ], [ 6.951492553000037, 52.437472229000079 ], [ 6.92648116100014, 52.432976380000142 ], [ 6.9002295330001, 52.431917013000074 ], [ 6.872014200000137, 52.434733378000132 ], [ 6.820337769000105, 52.446825663000098 ], [ 6.741169474000088, 52.453672791000159 ], [ 6.714814494000109, 52.461553447000099 ], [ 6.695074097000145, 52.475609437000131 ], [ 6.688976278000098, 52.490518087000098 ], [ 6.687529337000115, 52.508139751000087 ], [ 6.684015340000144, 52.525993958000029 ], [ 6.671716349000121, 52.54167775500018 ], [ 6.688252807000112, 52.542582093000036 ], [ 6.743753296000079, 52.55971283000018 ], [ 6.710990438000096, 52.576636862000086 ], [ 6.70396244300008, 52.583070577000129 ], [ 6.703652384000094, 52.591390483000097 ], [ 6.708199911000122, 52.599684550000134 ], [ 6.710163615000056, 52.608650411999989 ], [ 6.7017920320001, 52.619114889000045 ], [ 6.719083149000085, 52.626758982000027 ], [ 6.737035360000078, 52.634695333000153 ], [ 6.77052168700007, 52.641025696000085 ], [ 6.865399617000037, 52.641955872000139 ], [ 6.918419637000056, 52.632189026000091 ], [ 6.967718953000144, 52.636659038000104 ], [ 6.982808471000055, 52.632783305000046 ], [ 7.018465210000045, 52.625987854000087 ], [ 7.036655314000086, 52.647381897000017 ], [ 7.04399336700007, 52.682625224000091 ], [ 7.053295125000091, 52.790577291000105 ], [ 7.061976766000043, 52.824011942000098 ], [ 7.072150759000124, 52.841316552000066 ], [ 7.079856812000116, 52.854423523000051 ], [ 7.161918986000103, 52.9326358040001 ], [ 7.183623088000104, 52.96612213100012 ], [ 7.19282149300011, 52.998006490000151 ], [ 7.194371786000119, 53.03384409600001 ], [ 7.185070027000108, 53.105441793000168 ], [ 7.181349324000081, 53.114175111000137 ], [ 7.176491740000074, 53.119394430000156 ], [ 7.172667684000118, 53.125750631000173 ], [ 7.171944214000121, 53.13771372500004 ], [ 7.174424682000108, 53.145775249000124 ], [ 7.188584025000068, 53.167789408000104 ], [ 7.195405314000112, 53.184997661000082 ], [ 7.198505900000043, 53.200578105000105 ], [ 7.19747237100006, 53.216623637000069 ], [ 7.194590691000116, 53.24502187700007 ], [ 7.204437696000127, 53.248277085000112 ], [ 7.215830925000091, 53.255601304000137 ], [ 7.224619988000057, 53.262925523000135 ], [ 7.233571811000104, 53.273627020000063 ], [ 7.236989780000101, 53.285549221000011 ], [ 7.22950280000012, 53.296576239000146 ], [ 7.254730665000096, 53.319525458000143 ], [ 7.268321160000141, 53.323675848000065 ], [ 7.291514519000089, 53.323919989000117 ], [ 7.313161655000073, 53.32050202 ], [ 7.347666863000086, 53.307359117000047 ], [ 7.366547071000127, 53.302801825000117 ], [ 7.342539910000085, 53.324042059000092 ], [ 7.302907748000052, 53.33274974199999 ], [ 7.075205925000148, 53.337591864000061 ], [ 7.038259311000104, 53.348578192000033 ], [ 7.023610873000081, 53.376410223000065 ], [ 7.023285352000073, 53.450506903000033 ], [ 7.027679884000037, 53.467352606000034 ], [ 7.047048373000052, 53.497707424000012 ], [ 7.051442905000044, 53.512600002000156 ], [ 7.059743686000019, 53.52171458500014 ], [ 7.079356316000087, 53.521551825000174 ], [ 7.119639519000145, 53.516302802 ], [ 7.125010613000114, 53.524359442000119 ], [ 7.134532097000118, 53.527411200000031 ], [ 7.141774936000047, 53.537176825000145 ], [ 7.13998457100007, 53.549790757000054 ], [ 7.13111412900011, 53.556952216000084 ], [ 7.101898634000065, 53.565741278000147 ], [ 7.088877800000091, 53.573716539000102 ], [ 7.086761915000068, 53.586859442000062 ], [ 7.100922071000099, 53.597886460000112 ], [ 7.133148634000122, 53.611273505000113 ], [ 7.16944420700014, 53.635484117000104 ], [ 7.188975457000112, 53.643500067000062 ], [ 7.226084832000112, 53.666489976000136 ], [ 7.305023634000065, 53.684800523000106 ], [ 7.458832227000073, 53.695135809000121 ], [ 7.469574415000068, 53.690741278000033 ], [ 7.480235222000118, 53.682033596000124 ], [ 7.503916863000114, 53.678656317000119 ], [ 7.651377800000091, 53.696966864000089 ], [ 7.951426629000082, 53.721909898000106 ], [ 8.031423373000052, 53.708075262000122 ], [ 8.031423373000052, 53.700628973000121 ], [ 8.02491295700014, 53.672552802000141 ], [ 8.052907748000081, 53.636297919000029 ], [ 8.094086134000065, 53.604722398000135 ], [ 8.127614780000101, 53.590765692000062 ], [ 8.127614780000101, 53.584621486000074 ], [ 8.119151238000143, 53.571926174000126 ], [ 8.134613477000073, 53.56745026200015 ], [ 8.156748894000145, 53.563666083000143 ], [ 8.167979363000143, 53.553208726000051 ], [ 8.164886915000068, 53.535223700000117 ], [ 8.155446811000047, 53.526027736000131 ], [ 8.133799675000148, 53.516302802 ], [ 8.115733269000145, 53.510728257 ], [ 8.076345248000052, 53.508612372000172 ], [ 8.058767123000109, 53.502020575000088 ], [ 8.076996290000096, 53.468695380000113 ], [ 8.086192254000082, 53.456122137000122 ], [ 8.099782748000052, 53.447414455000128 ], [ 8.112478061000104, 53.451076565000093 ], [ 8.123871290000068, 53.454006252000013 ], [ 8.140635613000086, 53.453599351000108 ], [ 8.152354363000057, 53.449774481000091 ], [ 8.17139733200014, 53.436590887000037 ], [ 8.178558790000096, 53.433742580000015 ], [ 8.186696811000104, 53.429510809000178 ], [ 8.19483483200014, 53.420111395000063 ], [ 8.20533287900011, 53.410711981000034 ], [ 8.219737175000063, 53.40643952000012 ], [ 8.236501498000081, 53.406724351000051 ], [ 8.248708530000073, 53.408392645000063 ], [ 8.259450717000078, 53.412298895000063 ], [ 8.271739129000139, 53.419501044000086 ], [ 8.292816602000073, 53.440497137000037 ], [ 8.315114780000101, 53.47492096600017 ], [ 8.320485873000052, 53.509222723000121 ], [ 8.291514519000145, 53.529364325000174 ], [ 8.252207879000139, 53.523098049000126 ], [ 8.231211785000113, 53.525213934000035 ], [ 8.233164910000056, 53.539862372000144 ], [ 8.241709832000083, 53.556301174000126 ], [ 8.248871290000125, 53.590277411000088 ], [ 8.257334832000083, 53.604437567 ], [ 8.270681186000076, 53.612860419000143 ], [ 8.287608269000145, 53.616888739000117 ], [ 8.329356316000116, 53.618109442000119 ], [ 8.348480665000068, 53.612860419000143 ], [ 8.363291863000143, 53.600572007 ], [ 8.375498894000117, 53.586900132000054 ], [ 8.387705925000091, 53.57713450700011 ], [ 8.428070509000065, 53.564764716000084 ], [ 8.51343834700009, 53.554754950000088 ], [ 8.55209394600007, 53.543605861000074 ], [ 8.55209394600007, 53.536200262000094 ], [ 8.528168165000096, 53.523911851000136 ], [ 8.506195509000094, 53.507961330000128 ], [ 8.490000847000118, 53.486395575000117 ], [ 8.48389733200014, 53.457342841000141 ], [ 8.485036655000073, 53.40119049700003 ], [ 8.490896030000016, 53.376450914000074 ], [ 8.504405144000089, 53.358058986000017 ], [ 8.507334832000112, 53.38279857 ], [ 8.496755405000073, 53.445257880000142 ], [ 8.497569207000083, 53.474758205000015 ], [ 8.512868686000047, 53.496486721000096 ], [ 8.535817905000044, 53.506170966000141 ], [ 8.556651238000114, 53.51821523600016 ], [ 8.565765821000099, 53.546698309000149 ], [ 8.560801629000139, 53.551703192 ], [ 8.535166863000086, 53.590765692000062 ], [ 8.527517123000052, 53.596625067 ], [ 8.51710045700014, 53.610174872000172 ], [ 8.508311394000089, 53.625148830000015 ], [ 8.501231316000116, 53.644191799000012 ], [ 8.487071160000113, 53.666937567000119 ], [ 8.48389733200014, 53.68357982 ], [ 8.486094597000118, 53.70042552299999 ], [ 8.492198113000114, 53.71515534100017 ], [ 8.529633009000065, 53.770697333000115 ], [ 8.556162957000112, 53.83095937700007 ], [ 8.573252800000148, 53.857652085 ], [ 8.58757571700005, 53.870428778000061 ], [ 8.607106967000021, 53.881537177000084 ], [ 8.629242384000094, 53.889390367000047 ], [ 8.651866082000083, 53.892482815000122 ], [ 8.672699415000039, 53.891587632000054 ], [ 8.684580925000091, 53.888495184000149 ], [ 8.709157748000109, 53.871975002000099 ], [ 8.744639519000089, 53.854152736000017 ], [ 8.782481316000144, 53.842474677000112 ], [ 8.860687696000127, 53.831000067000062 ], [ 8.903575066000116, 53.831732489 ], [ 8.976247592000107, 53.842433986000017 ], [ 9.016286655000044, 53.840521552000055 ], [ 9.035004102000102, 53.85358307500006 ], [ 9.114512566000087, 53.865139065000065 ], [ 9.193614129000082, 53.864691473000065 ], [ 9.210703972000147, 53.871975002000099 ], [ 9.224294467000107, 53.865912177 ], [ 9.240733269000089, 53.864162502000099 ], [ 9.274668816000144, 53.865139065000065 ], [ 9.283376498000109, 53.86163971600017 ], [ 9.305349155000044, 53.84454987200003 ], [ 9.402679884000122, 53.742417710000083 ], [ 9.442881707000112, 53.714300848000065 ], [ 9.47095787900011, 53.700628973000121 ], [ 9.484711134000122, 53.690090236000074 ], [ 9.498383009000065, 53.659857489000089 ], [ 9.567067905000073, 53.599595445000105 ], [ 9.582367384000122, 53.591294664000046 ], [ 9.600922071000127, 53.586330471000096 ], [ 9.624766472000118, 53.584621486000074 ], [ 9.637217644000117, 53.581000067000119 ], [ 9.696625196000099, 53.556626695000077 ], [ 9.764008009000094, 53.54767487200003 ], [ 9.819021030000073, 53.540350653000033 ], [ 9.832041863000143, 53.543605861000074 ], [ 9.819590691000116, 53.556626695000077 ], [ 9.782074415000096, 53.56972890800013 ], [ 9.692393425000148, 53.575913804000024 ], [ 9.65577233200014, 53.584621486000074 ], [ 9.583669467000021, 53.612453518000152 ], [ 9.550791863000143, 53.634588934000121 ], [ 9.539073113000143, 53.666489976000136 ], [ 9.53614342500012, 53.693752346000124 ], [ 9.53223717500012, 53.71116771 ], [ 9.522227410000141, 53.716620184000035 ], [ 9.475271030000101, 53.732163804000137 ], [ 9.460215691000087, 53.735419012000179 ], [ 9.435801629000139, 53.748683986000017 ], [ 9.412445509000065, 53.778753973000065 ], [ 9.396657748000109, 53.811021225999987 ], [ 9.395192905000044, 53.831000067000062 ], [ 9.35873457100007, 53.839544989 ], [ 9.295583530000101, 53.871893622000115 ], [ 9.257823113000143, 53.885565497000059 ], [ 9.22046959700009, 53.890773830000128 ], [ 9.093435092000078, 53.892482815000122 ], [ 9.055430535000085, 53.902899481000034 ], [ 9.029958530000073, 53.907131252000156 ], [ 9.018321160000141, 53.902736721000068 ], [ 9.007823113000086, 53.892482815000122 ], [ 8.984629754000139, 53.897040106000176 ], [ 8.949473504000082, 53.912909247000115 ], [ 8.916026238000143, 53.93740469000015 ], [ 8.83334394600007, 54.036444403000033 ], [ 8.871836785000141, 54.046942450000088 ], [ 8.890635613000114, 54.047796942 ], [ 8.914561394000089, 54.043890692 ], [ 8.953868035000085, 54.02830638200011 ], [ 8.975352410000113, 54.024074611000074 ], [ 8.997243686000047, 54.030218817000062 ], [ 9.004893425000148, 54.041164455000128 ], [ 9.013031446000099, 54.060980536000145 ], [ 9.018565300000091, 54.082424221000096 ], [ 9.018321160000141, 54.097886460000026 ], [ 9.006683790000068, 54.108140367000132 ], [ 8.98812910200013, 54.117865302000084 ], [ 8.974457227000102, 54.128078518000038 ], [ 8.977305535000141, 54.139471747000172 ], [ 8.977305535000141, 54.145697333000143 ], [ 8.95289147200009, 54.150091864000117 ], [ 8.917979363000086, 54.146307684000092 ], [ 8.885427280000101, 54.137030341000141 ], [ 8.867442254000082, 54.125189520000092 ], [ 8.860687696000127, 54.125189520000092 ], [ 8.83334394600007, 54.153143622000115 ], [ 8.815684441000144, 54.175604559000121 ], [ 8.812836134000122, 54.180487372000087 ], [ 8.820974155000044, 54.200506903000147 ], [ 8.836273634000094, 54.217759507000054 ], [ 8.846690300000091, 54.233547268 ], [ 8.839610222000118, 54.248724677 ], [ 8.839610222000118, 54.255560614000117 ], [ 8.851898634000065, 54.261053778000061 ], [ 8.894216342000078, 54.268215236000074 ], [ 8.911468946000099, 54.269191799000154 ], [ 8.922048373000052, 54.274237372000087 ], [ 8.937510613000143, 54.286688544000114 ], [ 8.953135613000143, 54.302557684000035 ], [ 8.963145379000139, 54.31761302300005 ], [ 8.940277540000125, 54.315008856000148 ], [ 8.902598504000139, 54.295843817 ], [ 8.88111412900011, 54.29026927299999 ], [ 8.883067254000053, 54.293605861000017 ], [ 8.885915561000104, 54.300726630000057 ], [ 8.887950066000116, 54.303941148000106 ], [ 8.857595248000052, 54.301825262000094 ], [ 8.805430535000113, 54.292425848000093 ], [ 8.774668816000144, 54.29026927299999 ], [ 8.738942905000101, 54.293890692000147 ], [ 8.723480665000096, 54.29026927299999 ], [ 8.690196160000085, 54.271470445000134 ], [ 8.678477410000113, 54.269191799000154 ], [ 8.651866082000083, 54.27484772300015 ], [ 8.623383009000065, 54.290106512000122 ], [ 8.602712436000047, 54.312079169000029 ], [ 8.59986412900011, 54.33808014500012 ], [ 8.614024285000113, 54.348374742000132 ], [ 8.641368035000085, 54.355658270000148 ], [ 8.672048373000109, 54.35927969 ], [ 8.695567254000139, 54.358587958000086 ], [ 8.695567254000139, 54.365423895000092 ], [ 8.677582227000102, 54.367905992000104 ], [ 8.66382897200009, 54.375555731000063 ], [ 8.650645379000139, 54.377997137000179 ], [ 8.634776238000114, 54.365423895000092 ], [ 8.626231316000087, 54.37641022300015 ], [ 8.62916100400011, 54.387681382000139 ], [ 8.63843834700009, 54.398138739000117 ], [ 8.648448113000143, 54.406398830000015 ], [ 8.66976972700013, 54.400824286 ], [ 8.750824415000068, 54.413804429 ], [ 8.860687696000127, 54.413804429 ], [ 8.88607832100007, 54.417792059000149 ], [ 8.907237175000148, 54.425523179 ], [ 8.949473504000082, 54.447333075000031 ], [ 8.988047722000147, 54.458441473000065 ], [ 9.004730665000096, 54.465887762000037 ], [ 9.011485222000147, 54.482123114000089 ], [ 9.01156660200013, 54.506333725999987 ], [ 8.986094597000118, 54.529282945000077 ], [ 8.904470248000109, 54.580633856000176 ], [ 8.89283287900011, 54.591253973000121 ], [ 8.887950066000116, 54.60187409100017 ], [ 8.878754102000073, 54.606512762000094 ], [ 8.858164910000113, 54.606146552000084 ], [ 8.837087436000104, 54.602687893000095 ], [ 8.825856967000107, 54.598130601000136 ], [ 8.819021030000073, 54.605617580000015 ], [ 8.853282097000147, 54.619289455000128 ], [ 8.818369988000143, 54.673651434000149 ], [ 8.805430535000113, 54.687567450000031 ], [ 8.77670332100007, 54.697984117000132 ], [ 8.722666863000086, 54.725531317000147 ], [ 8.688731316000144, 54.735296942 ], [ 8.688731316000144, 54.742173570000105 ], [ 8.69434655000012, 54.760239976000108 ], [ 8.68132571700005, 54.780585028000118 ], [ 8.661875847000147, 54.800604559000178 ], [ 8.648448113000143, 54.817857163999989 ], [ 8.642751498000081, 54.844183661 ], [ 8.647227410000141, 54.86737702000012 ], [ 8.660816132543687, 54.896303911092375 ], [ 8.695882202000092, 54.889984029000132 ], [ 8.732779175000104, 54.889053854000096 ], [ 8.80088871200013, 54.903833314000011 ], [ 8.824246459000079, 54.905900370000055 ], [ 8.904138224000093, 54.8979422 ] ] ], [ [ [ 8.38835696700005, 54.894232489000032 ], [ 8.436534050000091, 54.887274481000119 ], [ 8.654470248000081, 54.89362213700015 ], [ 8.629405144000145, 54.882147528000118 ], [ 8.504405144000089, 54.886175848000065 ], [ 8.488780144000117, 54.881293036 ], [ 8.461192254000082, 54.868801174000097 ], [ 8.446055535000085, 54.866278387000179 ], [ 8.377126498000052, 54.866278387000179 ], [ 8.37061608200014, 54.868231512000037 ], [ 8.361989780000044, 54.876939195000105 ], [ 8.353526238000114, 54.879339911000059 ], [ 8.343923373000052, 54.879095770000035 ], [ 8.33741295700014, 54.87759023600016 ], [ 8.307139519000145, 54.8653832050001 ], [ 8.302012566000116, 54.862616278000033 ], [ 8.299327019000145, 54.855292059000121 ], [ 8.297862175000091, 54.835598049000069 ], [ 8.294932488000086, 54.831529039000131 ], [ 8.298350457000083, 54.776922919000143 ], [ 8.295746290000096, 54.759100653000175 ], [ 8.29070071700005, 54.745306708000086 ], [ 8.284434441000087, 54.742377020000148 ], [ 8.277842644000117, 54.756415106000091 ], [ 8.277028842000107, 54.782782294000114 ], [ 8.28858483200014, 54.891302802 ], [ 8.298024936000047, 54.912543036000088 ], [ 8.373708530000044, 55.034979559000035 ], [ 8.41578209700009, 55.065334377000013 ], [ 8.463389519000089, 55.05068594 ], [ 8.402354363000114, 55.048773505000142 ], [ 8.394541863000114, 55.043850002000099 ], [ 8.422211134000122, 55.042181708000086 ], [ 8.430430535000113, 55.03001536699999 ], [ 8.421560092000078, 55.016262111000074 ], [ 8.380869988000086, 55.003078518000123 ], [ 8.361989780000044, 54.986802475999987 ], [ 8.351573113000143, 54.966742255000113 ], [ 8.36036217500012, 54.948187567000119 ], [ 8.354502800000091, 54.912746486000046 ], [ 8.38835696700005, 54.894232489000032 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ADMIN": "Yemen", "ISO_A3": "YEM", "ISO_A2": "YE" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 53.308239457000155, 12.118394537000171 ], [ 53.310267307000146, 12.111443672000149 ], [ 53.277495146000064, 12.113829090000166 ], [ 53.263075575000101, 12.114869391000084 ], [ 53.248326142000082, 12.121302453000084 ], [ 53.268071121000077, 12.128831559000076 ], [ 53.286883850000123, 12.127337335000078 ], [ 53.298066459000069, 12.121873086000136 ], [ 53.308239457000155, 12.118394537000171 ] ] ], [ [ [ 53.03854985500007, 12.180332719000177 ], [ 53.053068072000229, 12.174919864000131 ], [ 53.068365706000151, 12.174940026000115 ], [ 53.082917786000081, 12.164794378000167 ], [ 53.087073883000159, 12.148554792000127 ], [ 53.086378447000158, 12.134344390000123 ], [ 53.071828726000064, 12.130282908000169 ], [ 53.05658965100011, 12.128251135000184 ], [ 53.026774464000113, 12.139741661000116 ], [ 53.006703274000216, 12.156644227000115 ], [ 52.985265038000108, 12.162727253000099 ], [ 52.988719992000114, 12.172197631000131 ], [ 53.00395319600014, 12.17694224000013 ], [ 53.017050409000063, 12.175576328000176 ], [ 53.027459725000227, 12.179647667000069 ], [ 53.03854985500007, 12.180332719000177 ] ] ], [ [ [ 52.178876221000138, 12.213943448000165 ], [ 52.200433520000075, 12.206442858000131 ], [ 52.216803629000225, 12.207334582000101 ], [ 52.246114464000158, 12.202370688000173 ], [ 52.289198679000179, 12.200815051000149 ], [ 52.319373805000197, 12.188263653000192 ], [ 52.374685092000078, 12.20058828300013 ], [ 52.389496290000153, 12.19725169500019 ], [ 52.389577670000136, 12.19725169500019 ], [ 52.394704623000024, 12.187323309000107 ], [ 52.381482241000043, 12.182545219000176 ], [ 52.371129100000104, 12.171565271000119 ], [ 52.378940027000141, 12.16569130000012 ], [ 52.388463594000228, 12.14886784300009 ], [ 52.359980980000074, 12.153853921000092 ], [ 52.347904101000012, 12.151296407000132 ], [ 52.33057701900006, 12.146185614000117 ], [ 52.284678582000112, 12.154486395000106 ], [ 52.24023003500011, 12.156877327000132 ], [ 52.235034030000151, 12.165283115000094 ], [ 52.224375847000061, 12.180324611000117 ], [ 52.218109571000099, 12.180609442000147 ], [ 52.211761915000153, 12.180894273000177 ], [ 52.190684441000116, 12.174627997000144 ], [ 52.179860873000081, 12.172837632000068 ], [ 52.175791863000114, 12.176336981000148 ], [ 52.164561394000117, 12.192531643000095 ], [ 52.16236412900011, 12.197414455000157 ], [ 52.156993035000113, 12.196234442000133 ], [ 52.13669149800009, 12.204540547000121 ], [ 52.123752918000179, 12.201978275000116 ], [ 52.112315300000063, 12.198635158000087 ], [ 52.105804884000094, 12.203802802000098 ], [ 52.10181725400011, 12.207017320000148 ], [ 52.068486652000018, 12.222007893000125 ], [ 52.06411842300011, 12.235473303000134 ], [ 52.078762953000108, 12.239736797000191 ], [ 52.094086134000094, 12.2417666690001 ], [ 52.118434634000067, 12.241548796000103 ], [ 52.147777224, 12.23489772900011 ], [ 52.178876221000138, 12.213943448000165 ] ] ], [ [ [ 43.448985222000175, 12.652980861000131 ], [ 43.447438998000024, 12.638657945000148 ], [ 43.43580162900011, 12.632147528000161 ], [ 43.428884311000019, 12.634670315000079 ], [ 43.417165561000076, 12.646714585000097 ], [ 43.411387566000172, 12.652655341000113 ], [ 43.399750196000099, 12.649847723000065 ], [ 43.392751498000194, 12.653062242000118 ], [ 43.390147332000112, 12.666327216000141 ], [ 43.397634311000076, 12.670803127000113 ], [ 43.406423373000024, 12.673041083000101 ], [ 43.428965691000116, 12.673773505000128 ], [ 43.442230665000153, 12.667222398000135 ], [ 43.44385826900006, 12.663804429000137 ], [ 43.448985222000175, 12.652980861000131 ] ] ], [ [ [ 53.573762123000023, 12.703771964000111 ], [ 53.606198326000111, 12.699984973000113 ], [ 53.629934549000126, 12.702304075000157 ], [ 53.65475484300012, 12.704757999000066 ], [ 53.69400944700007, 12.669778568000169 ], [ 53.762893950000063, 12.61970321700008 ], [ 53.808065318000132, 12.607996129000171 ], [ 53.846103927000087, 12.598604923000124 ], [ 53.866401107000087, 12.622933074000159 ], [ 53.875995481000103, 12.647293684000132 ], [ 53.903390997000116, 12.653031404000146 ], [ 53.92242660000008, 12.650655317000187 ], [ 53.940183635000182, 12.64242607800017 ], [ 53.973541389000019, 12.646988269000175 ], [ 54.008096581000103, 12.645744035000163 ], [ 54.045131377000047, 12.66655556400012 ], [ 54.05825853900015, 12.671163037000142 ], [ 54.082166225, 12.686200302000174 ], [ 54.093028191000116, 12.698879299000112 ], [ 54.11939537900011, 12.701117255000099 ], [ 54.13224613600002, 12.688365928000124 ], [ 54.146510630000108, 12.677860515000162 ], [ 54.16789046400018, 12.664994769000117 ], [ 54.183460054000108, 12.668444042000147 ], [ 54.195491248000195, 12.675400124000149 ], [ 54.200531446000099, 12.673000393000109 ], [ 54.210703972000175, 12.661688544000128 ], [ 54.218760613000114, 12.652655341000113 ], [ 54.23731530000012, 12.652044989000146 ], [ 54.260020379000167, 12.647528387000108 ], [ 54.269340904000018, 12.63211920800012 ], [ 54.284854219000209, 12.62624853100013 ], [ 54.31946791600015, 12.610993760000127 ], [ 54.360144596000083, 12.602688591000145 ], [ 54.40077485000009, 12.580403897000153 ], [ 54.421909149000186, 12.574027833000088 ], [ 54.470662090000104, 12.5435655980001 ], [ 54.496932476000069, 12.546913901000124 ], [ 54.51609239300015, 12.558434045000112 ], [ 54.526833136000022, 12.557213916000137 ], [ 54.540293816000172, 12.550238348000121 ], [ 54.527926842000198, 12.537446101000128 ], [ 54.498038406000063, 12.529471603000133 ], [ 54.476524115000103, 12.522613150000126 ], [ 54.45742273100015, 12.519228400000117 ], [ 54.446653804000135, 12.511149589000112 ], [ 54.444683563000098, 12.484720990000184 ], [ 54.402340262000195, 12.467224178000137 ], [ 54.368661045000209, 12.459568589000156 ], [ 54.328168806000093, 12.443456635000118 ], [ 54.283336512000147, 12.447290953000106 ], [ 54.245941602000102, 12.433539130000128 ], [ 54.237478061000076, 12.425197658000144 ], [ 54.218760613000114, 12.399400132000125 ], [ 54.209727410000113, 12.393784898000121 ], [ 54.183848504000167, 12.382513739000132 ], [ 54.154958530000073, 12.359808661000088 ], [ 54.140497888000169, 12.351344300000079 ], [ 54.110711403000124, 12.353810633000123 ], [ 54.064229389000189, 12.350547619000153 ], [ 54.047546481000069, 12.352962049000084 ], [ 54.030885983000104, 12.348360811000134 ], [ 54.008243941000018, 12.329857074000174 ], [ 53.985931837000095, 12.337144273000135 ], [ 53.985687696000156, 12.337144273000135 ], [ 53.969981316000172, 12.341864325000131 ], [ 53.939280815000103, 12.334757060000143 ], [ 53.896470940000228, 12.327908182000115 ], [ 53.776352020000076, 12.304968586000129 ], [ 53.731164780000228, 12.300413636000187 ], [ 53.672924037000115, 12.306341909000153 ], [ 53.618264982000113, 12.322706338000131 ], [ 53.572146675000141, 12.334614153000132 ], [ 53.552000143000072, 12.354383226000067 ], [ 53.535980665000096, 12.373765367000146 ], [ 53.519541863000114, 12.393540757000082 ], [ 53.505625847000061, 12.416327216000113 ], [ 53.479374615000069, 12.4251702010001 ], [ 53.437875078000076, 12.451956330000115 ], [ 53.33423912900011, 12.51552969000015 ], [ 53.309743686000076, 12.537665106000119 ], [ 53.30689537900011, 12.543402411000102 ], [ 53.315684441000116, 12.550279039000102 ], [ 53.342493709000081, 12.542609032000186 ], [ 53.363002195000178, 12.544912840000109 ], [ 53.384532097000175, 12.557318427000084 ], [ 53.389414910000113, 12.560777085000083 ], [ 53.39112389400006, 12.569647528000118 ], [ 53.399587436000189, 12.587591864000075 ], [ 53.403168165000153, 12.598049221000153 ], [ 53.396027098000133, 12.656467756000069 ], [ 53.410737671000078, 12.66213573700017 ], [ 53.428024418000092, 12.665390016000146 ], [ 53.470077106000218, 12.671423887000145 ], [ 53.479577989000092, 12.68653505800016 ], [ 53.490326709000129, 12.701620604000183 ], [ 53.499869245000156, 12.712064513000115 ], [ 53.518945864000074, 12.714350673000098 ], [ 53.573762123000023, 12.703771964000111 ] ] ], [ [ [ 42.688568556000092, 13.663804429000109 ], [ 42.688487175000063, 13.663763739000117 ], [ 42.68628991000017, 13.675970770000092 ], [ 42.68580162900011, 13.678452867000118 ], [ 42.68580162900011, 13.678534247000101 ], [ 42.693532748000194, 13.699204820000119 ], [ 42.719248894000174, 13.742621161000073 ], [ 42.761729363000228, 13.772162177000126 ], [ 42.782562696000099, 13.779933986000131 ], [ 42.794932488000228, 13.769924221000153 ], [ 42.791840040000153, 13.750718492000189 ], [ 42.761485222000175, 13.719305731000162 ], [ 42.754079623000194, 13.697902736000117 ], [ 42.743907097000061, 13.688421942000119 ], [ 42.688568556000092, 13.663804429000109 ] ] ], [ [ [ 42.788584832000112, 13.926703192000076 ], [ 42.781748894000117, 13.919989325000117 ], [ 42.754079623000194, 13.920721747000144 ], [ 42.767588738000057, 13.948635158000101 ], [ 42.767588738000057, 13.948675848000093 ], [ 42.746592644000231, 13.956529039000159 ], [ 42.721527540000153, 13.969387111000088 ], [ 42.712494337000209, 13.977443752000127 ], [ 42.700694207000168, 13.987941799000097 ], [ 42.699229363000114, 13.992254950000103 ], [ 42.691905144000117, 14.013169664000159 ], [ 42.700856967000135, 14.028265692000076 ], [ 42.72103925900015, 14.045965887000165 ], [ 42.743988477000158, 14.0601260440001 ], [ 42.76026451900006, 14.06468333500014 ], [ 42.767588738000057, 14.071519273000149 ], [ 42.795746290000153, 14.037176825000103 ], [ 42.801768425000063, 14.023138739000146 ], [ 42.801605665000096, 14.012274481000162 ], [ 42.78809655000012, 13.975327867000118 ], [ 42.786631707000055, 13.94403717700007 ], [ 42.786631707000055, 13.94399648600016 ], [ 42.788584832000112, 13.926703192000076 ] ] ], [ [ [ 42.581553582000225, 15.391587632000068 ], [ 42.59253991000017, 15.389471747000144 ], [ 42.605642123000081, 15.39301178600013 ], [ 42.618500196000099, 15.400091864000089 ], [ 42.628184441000116, 15.398667710000126 ], [ 42.628103061000076, 15.386460679000137 ], [ 42.61622155000012, 15.34808991100013 ], [ 42.613454623000024, 15.334702867000118 ], [ 42.615489129000167, 15.326361395000148 ], [ 42.613291863000057, 15.318548895000063 ], [ 42.60840905000012, 15.314032294000114 ], [ 42.609385613000114, 15.312201239000132 ], [ 42.615244988000228, 15.314032294000114 ], [ 42.614105665000096, 15.308050848000093 ], [ 42.593923373000081, 15.278713283000087 ], [ 42.582204623000081, 15.268215236000117 ], [ 42.568369988000057, 15.268866278000161 ], [ 42.557383660000113, 15.27757396000014 ], [ 42.545746290000096, 15.294419664000145 ], [ 42.545909050000063, 15.316961981000134 ], [ 42.556162957000112, 15.341457424000154 ], [ 42.55892988400015, 15.392971096000139 ], [ 42.570974155000187, 15.410101630000085 ], [ 42.583750847, 15.422796942000133 ], [ 42.593435092000078, 15.430731512000094 ], [ 42.597504102000158, 15.439154364000061 ], [ 42.601898634000094, 15.44627513200011 ], [ 42.623871290000153, 15.457342841000141 ], [ 42.631032748000081, 15.454250393000066 ], [ 42.635996941000116, 15.445542710000083 ], [ 42.610362175000063, 15.429388739000117 ], [ 42.607188347000175, 15.422919012000108 ], [ 42.611501498000194, 15.421291408000087 ], [ 42.611989780000187, 15.416571356000176 ], [ 42.608083530000187, 15.410386460000112 ], [ 42.598968946000099, 15.403631903000161 ], [ 42.584727410000113, 15.3966332050001 ], [ 42.581553582000225, 15.391587632000068 ] ] ], [ [ [ 52.902744588000104, 17.048262838000156 ], [ 52.965273072000201, 16.912922262 ], [ 53.027904908000124, 16.777478333000104 ], [ 53.090351917014772, 16.642406030281151 ], [ 53.09034264400006, 16.642401434000092 ], [ 53.090017123000138, 16.642238674000126 ], [ 53.069183790000153, 16.631822007000139 ], [ 53.021820509000094, 16.619452216000113 ], [ 52.98487389400006, 16.628159898000192 ], [ 52.973887566000116, 16.618312893000066 ], [ 52.962168816000116, 16.616278387000037 ], [ 52.950531446000099, 16.615627346000096 ], [ 52.940277540000096, 16.610174872000144 ], [ 52.921153191000116, 16.591131903000147 ], [ 52.909922722000118, 16.583075262000122 ], [ 52.885264519000117, 16.575425523000192 ], [ 52.851084832000112, 16.556138414000074 ], [ 52.80909264400006, 16.548325914000159 ], [ 52.788828972, 16.53969961100016 ], [ 52.752126498000194, 16.518296617000104 ], [ 52.73682701900006, 16.51194896 ], [ 52.597666863000171, 16.476711330000128 ], [ 52.532562696000099, 16.447251695000048 ], [ 52.42042076900006, 16.371242580000128 ], [ 52.31861412900011, 16.291164455000072 ], [ 52.292735222000061, 16.263820705000015 ], [ 52.279470248000194, 16.243882554000109 ], [ 52.261403842000078, 16.20897044500019 ], [ 52.228688998000081, 16.171942450000174 ], [ 52.221446160000113, 16.160874742000132 ], [ 52.21705162900011, 16.148382880000113 ], [ 52.21705162900011, 16.138088283000016 ], [ 52.219574415000153, 16.12596263200011 ], [ 52.222666863000228, 16.116400458000115 ], [ 52.224375847000061, 16.11359284100017 ], [ 52.216807488000114, 16.095160223000121 ], [ 52.19434655000012, 16.07029857000019 ], [ 52.18409264400006, 16.029445705000128 ], [ 52.160004102000158, 16.002101955000072 ], [ 52.155528191000172, 15.983872789000188 ], [ 52.163422071000156, 15.964789130000113 ], [ 52.177419467000135, 15.942368882 ], [ 52.18653405000012, 15.919094143000095 ], [ 52.175466342000078, 15.87791575700011 ], [ 52.191579623000024, 15.862982489000061 ], [ 52.224375847000061, 15.846747137000037 ], [ 52.225271030000073, 15.83193594000015 ], [ 52.21705162900011, 15.760728257000139 ], [ 52.221446160000113, 15.716986395000063 ], [ 52.23121178500017, 15.674750067000119 ], [ 52.238291863000228, 15.668646552000141 ], [ 52.242849155000073, 15.66347890800013 ], [ 52.244883660000113, 15.657700914000159 ], [ 52.243825717000078, 15.651556708 ], [ 52.238536004000167, 15.642523505 ], [ 52.237478061000132, 15.637518622000144 ], [ 52.23658287900011, 15.629339911000145 ], [ 52.233571811000019, 15.621771552 ], [ 52.228363477000102, 15.616115627000013 ], [ 52.220713738000114, 15.613959052 ], [ 52.198985222, 15.611476955000072 ], [ 52.047129754000167, 15.570013739000061 ], [ 52.038747592000192, 15.56313711100016 ], [ 52.031504754000167, 15.555812893000152 ], [ 52.025726759000094, 15.551214911000116 ], [ 52.016937696000156, 15.548651434000121 ], [ 52.001638217000192, 15.547267971000124 ], [ 51.991709832000112, 15.545070705000128 ], [ 51.913096550000063, 15.515326239000117 ], [ 51.874196811000189, 15.491522528000033 ], [ 51.875010613000114, 15.46938711100016 ], [ 51.874196811000189, 15.465033270000063 ], [ 51.871836785000113, 15.463771877000156 ], [ 51.86939537900011, 15.463771877000156 ], [ 51.868174675000063, 15.463120835000112 ], [ 51.868662957000055, 15.451564846000096 ], [ 51.865407748000138, 15.450100002000042 ], [ 51.859873894000117, 15.453314520000092 ], [ 51.853851759000094, 15.455715236000017 ], [ 51.846527540000096, 15.459540106000034 ], [ 51.838715040000096, 15.466294664000159 ], [ 51.829274936000189, 15.468695380000113 ], [ 51.81666100400011, 15.459418036000059 ], [ 51.809418165000096, 15.455755927000112 ], [ 51.75879967500012, 15.445624091000141 ], [ 51.67994225400011, 15.403469143000109 ], [ 51.667246941000172, 15.391424872000101 ], [ 51.662119988000057, 15.377142645000106 ], [ 51.667735222000175, 15.357652085000112 ], [ 51.676524285000113, 15.346991278000175 ], [ 51.676442905000073, 15.34027741100013 ], [ 51.655284050000063, 15.332749742000175 ], [ 51.549489780000016, 15.322984117000132 ], [ 51.530528191000116, 15.316839911000059 ], [ 51.513438347000175, 15.308050848000093 ], [ 51.498301629000167, 15.298041083000115 ], [ 51.474294467000021, 15.270697333000129 ], [ 51.454274936000076, 15.269517320000105 ], [ 51.446543816000172, 15.26642487200013 ], [ 51.44361412900011, 15.260199286000073 ], [ 51.432465040000096, 15.259670315000093 ], [ 51.382009311000189, 15.238023179000095 ], [ 51.367849155000073, 15.229722398000121 ], [ 51.342458530000073, 15.237697658000073 ], [ 51.314463738000228, 15.226711330000114 ], [ 51.288422071000156, 15.210272528000118 ], [ 51.268809441000172, 15.201808986000088 ], [ 51.069834832000225, 15.149644273000149 ], [ 50.851328972, 15.109930731000134 ], [ 50.661468946000156, 15.058498440000136 ], [ 50.554047071000099, 15.048570054000137 ], [ 50.45948326900006, 15.01044342700007 ], [ 50.43238366000017, 14.995428778000132 ], [ 50.358246290000096, 14.933335679000109 ], [ 50.343028191000116, 14.924750067000105 ], [ 50.302256707000055, 14.917466539000173 ], [ 50.243825717000192, 14.887152411000102 ], [ 50.179535352000158, 14.843329169000143 ], [ 50.16504967500012, 14.842474677000141 ], [ 50.146250847000175, 14.849798895000134 ], [ 50.121429884000094, 14.844224351000136 ], [ 50.079356316000172, 14.825669664000131 ], [ 50.060394727000158, 14.820217190000093 ], [ 50.051768425000063, 14.818752346000124 ], [ 50.041840040000153, 14.818264065000136 ], [ 50.035817905000016, 14.83893463700015 ], [ 50.029795769000117, 14.850287177000126 ], [ 50.021006707000055, 14.849269924000154 ], [ 50.006032748000024, 14.844387111000103 ], [ 49.942149285000113, 14.838771877000099 ], [ 49.798594597000061, 14.792181708000086 ], [ 49.578135613000228, 14.737290757000082 ], [ 49.460459832000112, 14.673570054000123 ], [ 49.417816602000158, 14.656927802000084 ], [ 49.372406446000156, 14.64980703300013 ], [ 49.35206139400006, 14.639797268000137 ], [ 49.312754754000167, 14.612779039000188 ], [ 49.228851759000094, 14.575262762000165 ], [ 49.190196160000113, 14.548570054000066 ], [ 49.181895379000167, 14.516587632000068 ], [ 49.171885613000057, 14.51825592700007 ], [ 49.15674889400006, 14.526109117000146 ], [ 49.13705488400015, 14.532660223000136 ], [ 49.113536004000167, 14.530218817000105 ], [ 49.092784050000063, 14.519598700000159 ], [ 49.077972852000102, 14.506089585000083 ], [ 49.028086785000113, 14.43634674700013 ], [ 49.009938998000024, 14.401109117000175 ], [ 49.00025475400011, 14.359564520000092 ], [ 49.007985873000194, 14.35443756700009 ], [ 49.00855553500017, 14.343003648000121 ], [ 49.006032748000081, 14.331203518000152 ], [ 49.003672722000118, 14.324774481000148 ], [ 48.991547071000099, 14.316880601000079 ], [ 48.950531446000099, 14.300604559000135 ], [ 48.941661004000167, 14.294378973000079 ], [ 48.93580162900011, 14.270453192000119 ], [ 48.921560092000192, 14.2618675800001 ], [ 48.903493686000189, 14.258490302000084 ], [ 48.88697350400011, 14.25031159100017 ], [ 48.882334832000055, 14.243231512000122 ], [ 48.880381707000225, 14.234605210000112 ], [ 48.880137566000172, 14.212103583000115 ], [ 48.876963738000114, 14.206732489000075 ], [ 48.86988366000017, 14.201361395000106 ], [ 48.862966342000078, 14.194647528000161 ], [ 48.852549675000063, 14.166978257000068 ], [ 48.835297071000156, 14.156236070000148 ], [ 48.79761803500017, 14.140448309000107 ], [ 48.738291863000114, 14.068182684000121 ], [ 48.71949303500017, 14.057277736000145 ], [ 48.713715040000096, 14.055405992000175 ], [ 48.701833530000073, 14.046698309000107 ], [ 48.695811394000231, 14.043605861000117 ], [ 48.689300977000158, 14.042425848000093 ], [ 48.681488477000158, 14.043605861000117 ], [ 48.56478925900015, 14.046047268000152 ], [ 48.548106316000116, 14.040513414000131 ], [ 48.503428582000055, 14.002630927000098 ], [ 48.493825717000192, 13.998968817000147 ], [ 48.485524936000189, 13.998480536000059 ], [ 48.477549675000063, 13.99673086100016 ], [ 48.468760613000114, 13.98895905200007 ], [ 48.450450066000116, 14.010646877000141 ], [ 48.415375196000156, 14.016831773000106 ], [ 48.338226759000094, 14.016302802000126 ], [ 48.341156446000099, 14.012396552000141 ], [ 48.345713738000057, 14.002630927000098 ], [ 48.304209832000055, 14.001898505000071 ], [ 48.188731316000116, 13.969142971000139 ], [ 48.193614129000167, 13.993394273000135 ], [ 48.177582227000158, 14.009182033000087 ], [ 48.155284050000063, 14.020209052000126 ], [ 48.140391472000175, 14.030585028000132 ], [ 48.13355553500017, 14.023138739000146 ], [ 48.105967644000231, 14.036037502000156 ], [ 48.016856316000172, 14.057277736000145 ], [ 48.001638217000192, 14.049139716000127 ], [ 47.948578321000156, 14.033392645000077 ], [ 47.931162957000112, 14.030585028000132 ], [ 47.917328321000099, 14.02138906500015 ], [ 47.866547071000156, 13.961655992000175 ], [ 47.820974155000187, 13.938462632000139 ], [ 47.667246941000172, 13.887193101000108 ], [ 47.645681186000076, 13.873195705000143 ], [ 47.564219597, 13.789129950000103 ], [ 47.43604576900006, 13.678045966000113 ], [ 47.398203972000061, 13.654852606000176 ], [ 47.166840040000096, 13.585598049000112 ], [ 46.911875847000175, 13.533270575000117 ], [ 46.824229363000057, 13.476304429000109 ], [ 46.700694207000055, 13.430324611000145 ], [ 46.683848504000167, 13.427232164000159 ], [ 46.663910352000158, 13.430080471000096 ], [ 46.628265821000099, 13.440822658000116 ], [ 46.604746941000172, 13.440904039000188 ], [ 46.583506707000055, 13.435126044000128 ], [ 46.540212436000189, 13.416896877000141 ], [ 46.52003014400006, 13.413031317000147 ], [ 46.31299889400006, 13.413560289000117 ], [ 46.269541863000228, 13.420477606000119 ], [ 46.247813347000175, 13.432114976000122 ], [ 46.234548373000024, 13.436346747000144 ], [ 46.228688998000194, 13.431057033000073 ], [ 46.224131707000225, 13.428697007000125 ], [ 46.19752037900011, 13.420477606000119 ], [ 46.111338738000228, 13.406805731000176 ], [ 45.940603061000076, 13.399359442000105 ], [ 45.923187696000099, 13.395453192000119 ], [ 45.890472852000158, 13.382310289000145 ], [ 45.87574303500017, 13.379461981000119 ], [ 45.833750847000175, 13.381333726000079 ], [ 45.81544030000012, 13.379543361000103 ], [ 45.803477410000113, 13.372015692000133 ], [ 45.665782097000175, 13.341986395000092 ], [ 45.632090691000172, 13.324896552000141 ], [ 45.535899285000113, 13.228664455000114 ], [ 45.508474155000073, 13.208685614000132 ], [ 45.494151238000057, 13.194647528000175 ], [ 45.48145592500012, 13.157538153000161 ], [ 45.43409264400006, 13.098334052000084 ], [ 45.403005405000187, 13.070135809000107 ], [ 45.365244988000114, 13.05369700700011 ], [ 45.193532748000081, 13.012681382000096 ], [ 45.154063347000175, 12.992132880000142 ], [ 45.11817467500012, 12.961737372000172 ], [ 45.104502800000063, 12.944891669000171 ], [ 45.099457227000102, 12.936183986000103 ], [ 45.093760613000228, 12.926255601000094 ], [ 45.093190951000082, 12.924709377000156 ], [ 45.086599155000187, 12.907294012000179 ], [ 45.083994988000114, 12.889471747000115 ], [ 45.08228600400011, 12.886623440000079 ], [ 45.058767123000024, 12.827134507000139 ], [ 45.056651238000228, 12.817124742000146 ], [ 45.062022332000112, 12.776556708000143 ], [ 45.058604363000057, 12.762030341000099 ], [ 45.03931725400011, 12.75629303600013 ], [ 45.017751498000024, 12.759833075000117 ], [ 44.99463951900006, 12.76919179900014 ], [ 44.979340040000096, 12.782294012000108 ], [ 44.980967644000231, 12.79730866100013 ], [ 44.997406446000156, 12.803452867000118 ], [ 45.017751498000024, 12.80174388200011 ], [ 45.035166863000114, 12.803656317000076 ], [ 45.042491082000112, 12.820868231000176 ], [ 45.038584832000112, 12.821234442000105 ], [ 45.023285352000158, 12.841050523000121 ], [ 45.021983269000231, 12.845119533000073 ], [ 45.020030144000117, 12.848944403000175 ], [ 45.021494988000057, 12.853461005000142 ], [ 45.021494988000057, 12.857163804000095 ], [ 45.015147332000225, 12.858710028000132 ], [ 45.009287957000112, 12.856675523000192 ], [ 45.008474155000187, 12.852240302000126 ], [ 45.009287957000112, 12.847560940000108 ], [ 45.008311394000117, 12.845119533000073 ], [ 45.001231316000172, 12.833482164000159 ], [ 44.998057488000114, 12.83144765800013 ], [ 44.993011915000153, 12.832464911000102 ], [ 44.983653191000116, 12.837144273000121 ], [ 44.977549675000063, 12.83820221600017 ], [ 44.955088738000228, 12.837062893000137 ], [ 44.944590691000172, 12.833970445000148 ], [ 44.940114780000187, 12.828029690000122 ], [ 44.933116082000225, 12.812648830000086 ], [ 44.916758660000113, 12.799465236000131 ], [ 44.898285352000102, 12.79621002800009 ], [ 44.884776238000114, 12.810939846000082 ], [ 44.871592644000231, 12.803534247000101 ], [ 44.86744225400011, 12.794826565000108 ], [ 44.871836785000113, 12.769964911000073 ], [ 44.879405144000231, 12.776434637000165 ], [ 44.885427280000073, 12.777980861000117 ], [ 44.91627037900011, 12.774888414000131 ], [ 44.920909050000063, 12.771389065000136 ], [ 44.91895592500012, 12.759426174000112 ], [ 44.912771030000016, 12.7481957050001 ], [ 44.898285352000102, 12.736761786000145 ], [ 44.881358269000117, 12.729885158000144 ], [ 44.868337436000189, 12.732123114000117 ], [ 44.839610222000061, 12.743475653000104 ], [ 44.830821160000113, 12.748846747000144 ], [ 44.824880405000073, 12.757025458000072 ], [ 44.82496178500017, 12.761623440000093 ], [ 44.822601759000094, 12.765082098000093 ], [ 44.809743686000076, 12.769964911000073 ], [ 44.785166863000171, 12.77228424700013 ], [ 44.764903191000116, 12.765570380000085 ], [ 44.727793816000116, 12.742010809000135 ], [ 44.726735873000081, 12.746527411000088 ], [ 44.722911004000167, 12.752346096000139 ], [ 44.72095787900011, 12.75629303600013 ], [ 44.725596550000063, 12.766506252000156 ], [ 44.719248894000117, 12.780096747000115 ], [ 44.706879102000158, 12.793646552000084 ], [ 44.693614129000167, 12.803452867000118 ], [ 44.652354363000114, 12.817938544000157 ], [ 44.610606316000172, 12.819566148000177 ], [ 44.572764519000117, 12.811590887000136 ], [ 44.542816602000158, 12.79730866100013 ], [ 44.489919467000192, 12.753485419000171 ], [ 44.432953321000156, 12.69358958500014 ], [ 44.430837436000076, 12.688177802000098 ], [ 44.423513217000078, 12.67597077000012 ], [ 44.415537957000112, 12.670152085000069 ], [ 44.411794467000078, 12.684027411000145 ], [ 44.40699303500017, 12.685248114000075 ], [ 44.383474155000016, 12.676336981000134 ], [ 44.354340040000153, 12.669338283000144 ], [ 44.289561394000231, 12.63898346600017 ], [ 44.267344597000175, 12.636786200000174 ], [ 44.247325066000116, 12.63898346600017 ], [ 44.228526238000057, 12.638657945000148 ], [ 44.191172722, 12.619126695000162 ], [ 44.169118686000019, 12.618150132000096 ], [ 44.149424675000063, 12.624986070000119 ], [ 44.138031446000099, 12.63898346600017 ], [ 44.151621941000172, 12.637884833000129 ], [ 44.176117384000094, 12.633246161000102 ], [ 44.189952019000117, 12.632147528000161 ], [ 44.198415561000076, 12.639064846000153 ], [ 44.198008660000113, 12.652248440000108 ], [ 44.191172722, 12.660467841000113 ], [ 44.179698113000057, 12.652655341000113 ], [ 44.153493686000076, 12.655951239000146 ], [ 44.121348504000167, 12.643377997000158 ], [ 44.062347852000158, 12.611721096000096 ], [ 44.033702019000174, 12.604315497000101 ], [ 44.017100457000112, 12.603705145000134 ], [ 43.991709832000112, 12.612127997000101 ], [ 43.961436394000117, 12.59959544500019 ], [ 43.94629967500012, 12.598049221000153 ], [ 43.927093946000156, 12.610174872000144 ], [ 43.909434441000116, 12.645331122000115 ], [ 43.89478600400011, 12.652655341000113 ], [ 43.874196811000189, 12.655462958000072 ], [ 43.857758009000094, 12.66254303600013 ], [ 43.829600457000112, 12.680609442000147 ], [ 43.81348717500012, 12.688381252000141 ], [ 43.794688347000175, 12.694891669000143 ], [ 43.773773634000094, 12.699408270000092 ], [ 43.751475457000055, 12.701117255000099 ], [ 43.737803582000225, 12.705755927000126 ], [ 43.69947350400011, 12.727850653000118 ], [ 43.679453972000061, 12.735256252000099 ], [ 43.644053582000225, 12.734564520000148 ], [ 43.634613477000102, 12.73867422100011 ], [ 43.619395379000167, 12.749579169000171 ], [ 43.60962975400011, 12.754339911000088 ], [ 43.60059655000012, 12.75629303600013 ], [ 43.587738477000158, 12.751369533000158 ], [ 43.530772332000168, 12.695502020000106 ], [ 43.525563998000081, 12.69037506700009 ], [ 43.511729363000171, 12.683172919000143 ], [ 43.490733269000117, 12.680609442000147 ], [ 43.468028191000172, 12.68390534100017 ], [ 43.462250196000099, 12.69334544500019 ], [ 43.481211785000113, 12.773423570000162 ], [ 43.481944207000168, 12.812079169000114 ], [ 43.473155144000117, 12.846625067000119 ], [ 43.452891472000175, 12.878607489000117 ], [ 43.42261803500017, 12.906195380000142 ], [ 43.41871178500017, 12.916449286000073 ], [ 43.415537957000225, 12.928900458000086 ], [ 43.408457879000167, 12.936957098000121 ], [ 43.40137780000012, 12.943426825000117 ], [ 43.398203972000061, 12.951157945000134 ], [ 43.39682050900015, 12.970851955000086 ], [ 43.39291425900015, 12.989691473000121 ], [ 43.386403842000078, 13.00726959800015 ], [ 43.377126498000194, 13.023179429000066 ], [ 43.341807488000114, 13.062648830000128 ], [ 43.336192254000167, 13.074408270000106 ], [ 43.334727410000113, 13.082180080000114 ], [ 43.322520379000167, 13.105780341000141 ], [ 43.312998894000231, 13.131252346000153 ], [ 43.30884850400011, 13.139308986000088 ], [ 43.248871290000096, 13.212713934000107 ], [ 43.226328972, 13.283880927000126 ], [ 43.239593946000156, 13.315130927000098 ], [ 43.24830162900011, 13.348944403000175 ], [ 43.25424238400015, 13.526556708000072 ], [ 43.274668816000116, 13.557603257000096 ], [ 43.278493686000019, 13.566595770000106 ], [ 43.28028405000012, 13.574123440000065 ], [ 43.284515821000156, 13.580389716000113 ], [ 43.295176629000167, 13.585598049000112 ], [ 43.281993035000113, 13.617132880000113 ], [ 43.285329623000081, 13.686590887000136 ], [ 43.280935092000078, 13.722113348000121 ], [ 43.247894727000102, 13.783677476000079 ], [ 43.243500196000156, 13.794338283000101 ], [ 43.233164910000113, 13.876369533000116 ], [ 43.22730553500017, 13.885443427000112 ], [ 43.161716747000099, 13.953990384000164 ], [ 43.139192865000069, 14.007348449000162 ], [ 43.118067129000138, 14.052491764000109 ], [ 43.095520001000096, 14.083955708000104 ], [ 43.084253391000203, 14.159187050000156 ], [ 43.075792233000101, 14.194759292000171 ], [ 43.0659165980002, 14.224865071000139 ], [ 43.047562871000224, 14.275507584000167 ], [ 43.019053582000055, 14.368353583000072 ], [ 43.010996941000116, 14.388413804000123 ], [ 43.006114129000167, 14.419419664000145 ], [ 42.993500196000099, 14.44830963700015 ], [ 42.989919467000135, 14.480210679000081 ], [ 42.98731530000012, 14.489243882000082 ], [ 42.981700066000116, 14.494777736000103 ], [ 42.963389519000174, 14.507757880000099 ], [ 42.959320509000094, 14.513495184000163 ], [ 42.961192254000167, 14.525376695000119 ], [ 42.965993686000076, 14.530259507000096 ], [ 42.973480665000096, 14.528469143000109 ], [ 42.983653191000172, 14.520331122000087 ], [ 42.994151238000228, 14.500474351000094 ], [ 43.006114129000167, 14.454779364000061 ], [ 43.021494988000114, 14.442084052000098 ], [ 43.021983269000117, 14.471096096000082 ], [ 43.020030144000231, 14.484605210000069 ], [ 43.01400800900015, 14.496771552000141 ], [ 43.028656446000156, 14.537990627000099 ], [ 43.017588738000114, 14.571234442000105 ], [ 42.998057488000228, 14.601507880000099 ], [ 42.98731530000012, 14.633856512000122 ], [ 42.989512566000116, 14.641058661000145 ], [ 42.99878991000017, 14.651271877000084 ], [ 43.000987175000063, 14.657171942000119 ], [ 42.999847852000102, 14.663316148000192 ], [ 42.997325066000116, 14.666205145000134 ], [ 42.994802280000187, 14.667914130000128 ], [ 42.99048912900011, 14.680080471000124 ], [ 42.983653191000172, 14.685126044000143 ], [ 42.976817254000167, 14.688381252000099 ], [ 42.973806186000076, 14.691880601000094 ], [ 42.971446160000113, 14.697007554000109 ], [ 42.966563347000061, 14.701849677000084 ], [ 42.96168053500017, 14.708563544000128 ], [ 42.95411217500012, 14.742661851000136 ], [ 42.953135613000228, 14.753729559000163 ], [ 42.942230665000153, 14.788885809000135 ], [ 42.894541863000114, 14.847479559000178 ], [ 42.883636915000096, 14.883693752000099 ], [ 42.88160241000017, 14.904608466000155 ], [ 42.883311394000117, 14.915513414000131 ], [ 42.89112389400006, 14.913804429000123 ], [ 42.895762566000116, 14.905991929000137 ], [ 42.894053582000112, 14.899318752000084 ], [ 42.890961134000094, 14.891424872000115 ], [ 42.89112389400006, 14.880316473000079 ], [ 42.898285352000102, 14.861761786000073 ], [ 42.91041100400011, 14.8413760440001 ], [ 42.926605665000096, 14.823228257000096 ], [ 42.94564863400015, 14.811428127000127 ], [ 42.946787957000112, 14.825873114000089 ], [ 42.953135613000228, 14.859198309000163 ], [ 42.952321811000019, 14.87954336100016 ], [ 42.94166100400011, 14.915350653000161 ], [ 42.937266472, 14.948472398000192 ], [ 42.932139519000117, 14.960842190000136 ], [ 42.923594597000175, 14.971421617000189 ], [ 42.898122592000078, 14.995266018000081 ], [ 42.887217644000117, 15.008205471000082 ], [ 42.880137566000116, 15.024847723000136 ], [ 42.877452019000231, 15.048529364000146 ], [ 42.882334832000225, 15.102484442000076 ], [ 42.877452019000231, 15.119859117000146 ], [ 42.86402428500017, 15.136419989000117 ], [ 42.828949415000096, 15.151760158000158 ], [ 42.796885613000114, 15.178697007000125 ], [ 42.776703321000156, 15.191392320000176 ], [ 42.754730665000153, 15.201808986000088 ], [ 42.733409050000063, 15.209295966000141 ], [ 42.711273634000094, 15.214260158000101 ], [ 42.691416863000114, 15.214260158000101 ], [ 42.676931186000076, 15.205796617000146 ], [ 42.671397332000225, 15.185370184000178 ], [ 42.660411004000167, 15.182562567000133 ], [ 42.63770592500012, 15.190863348000107 ], [ 42.618011915000096, 15.207505601000065 ], [ 42.616709832000112, 15.229722398000121 ], [ 42.610118035000113, 15.243597723000107 ], [ 42.62134850400011, 15.244696356000148 ], [ 42.654633009000094, 15.237209377000084 ], [ 42.671722852000158, 15.239650783000116 ], [ 42.682627800000063, 15.246486721000139 ], [ 42.688731316000116, 15.257025458000101 ], [ 42.691905144000117, 15.270697333000129 ], [ 42.690928582000112, 15.28123607000019 ], [ 42.680674675000063, 15.296047268000081 ], [ 42.678233269000231, 15.308294989000132 ], [ 42.704274936000019, 15.355454820000119 ], [ 42.712412957000225, 15.366278387000122 ], [ 42.717621290000153, 15.353461005000085 ], [ 42.71509850400011, 15.336981512000094 ], [ 42.707855665000096, 15.321519273000163 ], [ 42.699392123000081, 15.311672268000152 ], [ 42.718516472000061, 15.303127346000124 ], [ 42.733734571000099, 15.293890692000076 ], [ 42.774261915000153, 15.260443427000112 ], [ 42.779144727000102, 15.253322658000158 ], [ 42.781260613000114, 15.240301825000159 ], [ 42.778575066000116, 15.22162506700009 ], [ 42.781993035000113, 15.215073960000112 ], [ 42.794932488000228, 15.209295966000141 ], [ 42.79590905000012, 15.217352606000176 ], [ 42.794606967000135, 15.222601630000071 ], [ 42.791677280000187, 15.226304429000109 ], [ 42.78809655000012, 15.229722398000121 ], [ 42.80307050900015, 15.245184637000136 ], [ 42.80909264400006, 15.26776764500012 ], [ 42.806895379000167, 15.344305731000105 ], [ 42.79737389400006, 15.379706122000115 ], [ 42.781260613000114, 15.407904364000089 ], [ 42.777191602000158, 15.421942450000131 ], [ 42.77767988400015, 15.432806708000115 ], [ 42.77995853000013, 15.443182684000121 ], [ 42.781260613000114, 15.455715236000017 ], [ 42.780528191000172, 15.467474677 ], [ 42.778330925000063, 15.478989976000136 ], [ 42.774261915000153, 15.491034247000144 ], [ 42.759938998000024, 15.516058661000059 ], [ 42.719248894000174, 15.570013739000061 ], [ 42.721364780000073, 15.578192450000174 ], [ 42.733409050000063, 15.592230536000116 ], [ 42.723887566000172, 15.602199611000017 ], [ 42.714854363000057, 15.613959052 ], [ 42.708262566000116, 15.627834377000099 ], [ 42.705577019000231, 15.644354559000149 ], [ 42.716075066000116, 15.679836330000157 ], [ 42.71363366000017, 15.694728908000016 ], [ 42.691905144000117, 15.702093817 ], [ 42.699229363000114, 15.71743398600016 ], [ 42.709239129000167, 15.72589752800009 ], [ 42.72103925900015, 15.732814846000096 ], [ 42.733409050000063, 15.743068752000042 ], [ 42.741709832000055, 15.753241278000147 ], [ 42.745778842000135, 15.761948960000055 ], [ 42.746918165000153, 15.772650458000086 ], [ 42.747243686000189, 15.788397528000033 ], [ 42.75245201900006, 15.816392320000048 ], [ 42.765798373000194, 15.835760809000149 ], [ 42.78345787900011, 15.849432684000092 ], [ 42.801768425000063, 15.860337632 ], [ 42.819997592000078, 15.87494538 ], [ 42.830332879000167, 15.892523505000142 ], [ 42.834808790000096, 15.915350653000147 ], [ 42.843272332000168, 16.052191473000093 ], [ 42.84009850400011, 16.097805080000128 ], [ 42.81275475400011, 16.238267320000105 ], [ 42.80884850400011, 16.312648830000015 ], [ 42.80762780000012, 16.319566148000106 ], [ 42.801768425000063, 16.340155341000141 ], [ 42.802582227000158, 16.339422919000114 ], [ 42.80307050900015, 16.342352606000034 ], [ 42.802989129000167, 16.347357489000089 ], [ 42.801768425000063, 16.353216864000117 ], [ 42.798838738000228, 16.358465887000094 ], [ 42.790700717000021, 16.368638414000046 ], [ 42.789486890124664, 16.370944684065549 ], [ 42.837312459000174, 16.387217916000068 ], [ 42.87245243400011, 16.401635641 ], [ 42.898187297000192, 16.418895569000156 ], [ 42.906765584000226, 16.434915263000121 ], [ 42.905628703000133, 16.451089986000042 ], [ 42.902941528000184, 16.466282857000138 ], [ 42.906765584000226, 16.479356995 ], [ 42.917410929000113, 16.483801168000113 ], [ 42.956271606000058, 16.490725810000086 ], [ 42.970947713000072, 16.49579010000015 ], [ 43.014665975000156, 16.52069814100004 ], [ 43.036266723000125, 16.536304424000079 ], [ 43.04877242000012, 16.553460999000137 ], [ 43.074610636000131, 16.618780009000162 ], [ 43.078641398000201, 16.637693584000132 ], [ 43.079984986000085, 16.65882924400016 ], [ 43.08494592300022, 16.672575175000091 ], [ 43.097761678000126, 16.677794495000015 ], [ 43.122773071000125, 16.673298646000191 ], [ 43.162925659000138, 16.661516419000108 ], [ 43.179978882000142, 16.664617004000135 ], [ 43.186076701000133, 16.683272196000118 ], [ 43.185678910000064, 16.684847057000027 ], [ 43.179772176000114, 16.708231914000081 ], [ 43.17067712400015, 16.723476461000033 ], [ 43.168506714000074, 16.737222392000163 ], [ 43.18287276200013, 16.757996317 ], [ 43.191864461000108, 16.764249166000113 ], [ 43.201062867000104, 16.768124899000057 ], [ 43.208607625000155, 16.773395894000188 ], [ 43.212845092000094, 16.783886210000148 ], [ 43.211501505000143, 16.796856995000084 ], [ 43.204731893000172, 16.807709046000028 ], [ 43.194448283000185, 16.815460510000108 ], [ 43.157344604000201, 16.825382385000026 ], [ 43.145820760000078, 16.834477438000093 ], [ 43.133728475000197, 16.871012675000102 ], [ 43.112644491000168, 16.910028382000021 ], [ 43.108717082000084, 16.926978252000126 ], [ 43.115435018000227, 16.951834616000085 ], [ 43.131558065000121, 16.990436910000156 ], [ 43.135898885000103, 17.009608867000068 ], [ 43.136002238000202, 17.031416321 ], [ 43.130317830000052, 17.05348215700009 ], [ 43.1224630130001, 17.070121969000027 ], [ 43.118432251000144, 17.086245016000092 ], [ 43.124323365000151, 17.106967265000137 ], [ 43.145303996000024, 17.146551412000079 ], [ 43.150988404000174, 17.166860251000102 ], [ 43.150058228000063, 17.189959615000177 ], [ 43.15615604700011, 17.209700013000045 ], [ 43.176878296000126, 17.225513001000039 ], [ 43.203336630000109, 17.236313375000165 ], [ 43.226177612000214, 17.241274312000129 ], [ 43.248605184000127, 17.251919658000119 ], [ 43.252170858000085, 17.271970114000155 ], [ 43.241835571000166, 17.293415833 ], [ 43.222198527000018, 17.307833557000109 ], [ 43.165044393000102, 17.325920308000107 ], [ 43.167886597000091, 17.330519511000162 ], [ 43.2159456790001, 17.387208557000164 ], [ 43.303072143000207, 17.459038798000094 ], [ 43.391025431000088, 17.511955465000156 ], [ 43.412884562000073, 17.519965312000139 ], [ 43.434950399000144, 17.522859192000126 ], [ 43.453140503000185, 17.518776754000115 ], [ 43.487143596000095, 17.517484843000162 ], [ 43.503369995000213, 17.513454081000177 ], [ 43.577060587000148, 17.482964986000084 ], [ 43.619538615000096, 17.458832093000026 ], [ 43.689301799000219, 17.38384958900015 ], [ 43.730642945000085, 17.352430319000021 ], [ 43.750641724000189, 17.345660706000089 ], [ 43.768780151000129, 17.345505676000059 ], [ 43.806193888000195, 17.349588115000145 ], [ 43.845778035000166, 17.346177470000114 ], [ 43.863244670000114, 17.346952616000053 ], [ 43.886705770000191, 17.353670553000157 ], [ 43.892648560000083, 17.351035055000139 ], [ 43.892648560000083, 17.340079651000067 ], [ 43.89006473800012, 17.320184225000062 ], [ 43.894043823000089, 17.31217437800008 ], [ 43.897351115000077, 17.307368470000156 ], [ 43.903293905000197, 17.304319560000138 ], [ 43.915127808000108, 17.301839091000161 ], [ 43.938692260000124, 17.30519806000008 ], [ 43.954298543000078, 17.320029196000021 ], [ 43.967114299000144, 17.339562887000127 ], [ 43.982307170000155, 17.356822815000115 ], [ 44.003907918000124, 17.367829896 ], [ 44.020961141000072, 17.366021220000036 ], [ 44.059356730000076, 17.347055969000067 ], [ 44.085349976000231, 17.343438619000082 ], [ 44.104470256000155, 17.351965231000108 ], [ 44.119663126000063, 17.369948629000177 ], [ 44.134287557000135, 17.39470164 ], [ 44.149015340000147, 17.404830220000164 ], [ 44.169375855000084, 17.402349752000177 ], [ 44.211543824000074, 17.390619202 ], [ 44.23056075000008, 17.391859436000132 ], [ 44.307351929000077, 17.408964336000096 ], [ 44.404141887000179, 17.418731181000126 ], [ 44.465171753000078, 17.416457418000121 ], [ 44.533798055000119, 17.402866517000021 ], [ 44.561961711000066, 17.404468486000056 ], [ 44.624645223000101, 17.427206116000136 ], [ 44.646452677000212, 17.43180531900019 ], [ 44.849024292000223, 17.430513407000134 ], [ 44.97246636800017, 17.429696196000108 ], [ 44.997335652000032, 17.429531556000157 ], [ 45.165387411000125, 17.42839467400016 ], [ 45.222128133000211, 17.417387594000061 ], [ 45.38470219000007, 17.326488749000177 ], [ 45.430384155000212, 17.312019348000049 ], [ 45.642309204000099, 17.291090394000051 ], [ 45.890821167000098, 17.266647441000103 ], [ 46.079956909000117, 17.247992249000148 ], [ 46.322629435000152, 17.224066060000141 ], [ 46.487890665000151, 17.245976868000085 ], [ 46.71009932500013, 17.275380758 ], [ 46.747203003000124, 17.254761861000176 ], [ 46.811798543000151, 17.168462219000119 ], [ 46.885799194000157, 17.069553528000156 ], [ 46.970341838000223, 16.956847229000132 ], [ 46.983002564000088, 16.94909576400012 ], [ 46.997026374000171, 16.948514131000067 ], [ 47.128781779000093, 16.9430496210001 ], [ 47.161337931000133, 16.947442119000087 ], [ 47.19089685000003, 16.958914286000024 ], [ 47.313576701000073, 17.027902324000038 ], [ 47.427574911000164, 17.091826070000124 ], [ 47.428568591000015, 17.09310365900005 ], [ 47.457960653000129, 17.130893453000127 ], [ 47.524829956000104, 17.307575175000053 ], [ 47.572113892000147, 17.43232208300013 ], [ 47.589012085, 17.463276265000147 ], [ 47.686267130000061, 17.579651591000143 ], [ 47.835508667000084, 17.75819366400016 ], [ 47.993586874000158, 17.947587789000025 ], [ 48.084382365000096, 18.055901591000165 ], [ 48.161948690000116, 18.148919169000052 ], [ 48.184427937000095, 18.163931173000108 ], [ 48.312585490000203, 18.226588847000031 ], [ 48.484357951000078, 18.310408020000111 ], [ 48.675974162000074, 18.404019877000152 ], [ 48.847539917000091, 18.487709860000095 ], [ 48.991303752000107, 18.557886454000069 ], [ 49.035848837000145, 18.579719747000084 ], [ 49.128814738000102, 18.612095032000084 ], [ 49.257850790000163, 18.629509989000113 ], [ 49.418047729000108, 18.651059062000073 ], [ 49.5782446690001, 18.672608134000129 ], [ 49.738441610000137, 18.694157207000089 ], [ 49.898535197000143, 18.715706279000031 ], [ 50.058732137000078, 18.737255351 ], [ 50.218929078000116, 18.758856099000141 ], [ 50.379126018000221, 18.780353495 ], [ 50.539322957000223, 18.801902567000141 ], [ 50.69936486900022, 18.823529155000031 ], [ 50.859716838000196, 18.845026551000061 ], [ 51.019810425000202, 18.866575622000127 ], [ 51.179904012000094, 18.888150533 ], [ 51.340100952000199, 18.909699606000132 ], [ 51.500297892000077, 18.931248678000102 ], [ 51.660494832000182, 18.952823588000157 ], [ 51.820691773000107, 18.974372661000118 ], [ 51.978614950000207, 18.995637513000091 ], [ 51.985688749000104, 18.979731806000146 ], [ 52.013961629000192, 18.916159160000106 ], [ 52.056749715000109, 18.81962758400006 ], [ 52.099537801000082, 18.723044332000129 ], [ 52.142325887000112, 18.626512757000015 ], [ 52.185010620000099, 18.529929504000066 ], [ 52.227798706000129, 18.433423767000036 ], [ 52.270690145000088, 18.336866353000104 ], [ 52.313323202000078, 18.240283102000049 ], [ 52.356162964000106, 18.14377736400003 ], [ 52.39900272600002, 18.047271627000114 ], [ 52.441739136000109, 17.950636699000157 ], [ 52.484527222000082, 17.854156799000137 ], [ 52.527418660000222, 17.757625224000108 ], [ 52.570206747000071, 17.66109364800009 ], [ 52.612839803000014, 17.564562073000062 ], [ 52.655627889000158, 17.467978821000102 ], [ 52.698415975000074, 17.371447246000102 ], [ 52.730145305000207, 17.299875387000142 ], [ 52.728284953000099, 17.299358622000014 ], [ 52.723013957000177, 17.298686829000118 ], [ 52.72146366400014, 17.298170065000178 ], [ 52.736243124000083, 17.289178365000126 ], [ 52.773863566000188, 17.287111308000178 ], [ 52.791020141000132, 17.281220195000074 ], [ 52.801562134000193, 17.267422587000127 ], [ 52.840319458000153, 17.183706767000089 ], [ 52.902744588000104, 17.048262838000156 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ADMIN": "South Africa", "ISO_A3": "ZAF", "ISO_A2": "ZA" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 37.863780144000231, -46.940850518999838 ], [ 37.836436394000174, -46.958672783999987 ], [ 37.806488477000102, -46.965752862999963 ], [ 37.798106316000116, -46.964532158999859 ], [ 37.781097852000158, -46.959405205999843 ], [ 37.67017662900011, -46.955987237999835 ], [ 37.655039910000113, -46.958265882999981 ], [ 37.618825717000135, -46.954359632999896 ], [ 37.602061394000117, -46.948663018999923 ], [ 37.587412957000112, -46.938409112999977 ], [ 37.582530144000117, -46.930759372999873 ], [ 37.57667076900006, -46.916761976999908 ], [ 37.575368686000189, -46.90349700299997 ], [ 37.593597852000158, -46.892022393999838 ], [ 37.615407748000194, -46.868747653999918 ], [ 37.624847852000102, -46.863376559999864 ], [ 37.631114129000167, -46.858575127999956 ], [ 37.652354363000171, -46.836114190999965 ], [ 37.66244550900015, -46.828545831 ], [ 37.694834832000225, -46.822035414999917 ], [ 37.728526238000228, -46.825290622999958 ], [ 37.821055535000113, -46.844170830999985 ], [ 37.868418816000172, -46.882094007999839 ], [ 37.895762566000116, -46.88990650799991 ], [ 37.884938998000024, -46.916436455999886 ], [ 37.863780144000231, -46.940850518999838 ] ] ], [ [ [ 37.976410352000158, -46.64470794099995 ], [ 37.938649936000189, -46.654392184999921 ], [ 37.891123894000117, -46.649672132999825 ], [ 37.861094597000175, -46.636163018999852 ], [ 37.864919467000078, -46.614190362999835 ], [ 37.900401238000171, -46.599704684999963 ], [ 37.94556725400011, -46.598321221999981 ], [ 37.977793816000116, -46.615655205999971 ], [ 37.976410352000158, -46.64470794099995 ] ] ], [ [ [ 29.661424194000091, -22.12645192499987 ], [ 29.679614298000132, -22.138337503999978 ], [ 29.691448201000213, -22.13410003599985 ], [ 29.758885946000163, -22.13089609799988 ], [ 29.77924646000011, -22.13637379899987 ], [ 29.837330770000079, -22.17244394899987 ], [ 29.871488892000144, -22.179265238999918 ], [ 29.896035197000202, -22.191357523999983 ], [ 29.932105347000203, -22.194354756 ], [ 29.94667810100006, -22.198282165999885 ], [ 29.973963257000179, -22.213991800999949 ], [ 29.983781779000168, -22.217712503999948 ], [ 30.005279175000197, -22.222260029999902 ], [ 30.015511109000187, -22.227014260999894 ], [ 30.034528035000136, -22.246134541999979 ], [ 30.035871623000133, -22.250578714999804 ], [ 30.038145385000149, -22.253782653999949 ], [ 30.06791101100012, -22.257089944999947 ], [ 30.082587117000088, -22.262877705999841 ], [ 30.111112508000161, -22.282308044 ], [ 30.135090373000168, -22.293573506999877 ], [ 30.152660359000066, -22.294813740999913 ], [ 30.19699873800019, -22.289129333999952 ], [ 30.221700073000108, -22.290886331999943 ], [ 30.240406942000192, -22.296157327999879 ], [ 30.255289755000064, -22.304735615999988 ], [ 30.269345744000162, -22.316414488999882 ], [ 30.300765014000177, -22.336981709999876 ], [ 30.334974813000173, -22.344733174999959 ], [ 30.372078491000167, -22.343492939999848 ], [ 30.412696167000121, -22.336878355999929 ], [ 30.431713094000173, -22.3311939499999 ], [ 30.469230184000168, -22.315070901999917 ], [ 30.488453817000192, -22.310213316999977 ], [ 30.507367391000145, -22.309593200999927 ], [ 30.572169637000144, -22.316621195999844 ], [ 30.601108439000114, -22.316414488999882 ], [ 30.610306844000121, -22.318688251999902 ], [ 30.625551391000016, -22.328610127999895 ], [ 30.632424357000076, -22.330677184999942 ], [ 30.647410523000104, -22.326439717999818 ], [ 30.674282267000052, -22.308559671999944 ], [ 30.693919311000201, -22.30277191099988 ], [ 30.80528202300016, -22.294503681999927 ], [ 30.837889852000131, -22.282308044 ], [ 30.867087036000072, -22.289646096999988 ], [ 30.927186727000191, -22.29574391599995 ], [ 31.036120646000114, -22.319618427999856 ], [ 31.070330444000064, -22.333674417999873 ], [ 31.087642049000095, -22.336878355999929 ], [ 31.097047967000123, -22.334922386000017 ], [ 31.104540243000059, -22.333364359999891 ], [ 31.137716512000083, -22.318481546999848 ], [ 31.152599325000125, -22.316414488999882 ], [ 31.163348023000168, -22.322615661999961 ], [ 31.183656860000184, -22.345559997999899 ], [ 31.190684855000114, -22.350624287999878 ], [ 31.197867879000142, -22.352587991999911 ], [ 31.213474162000097, -22.361889749999847 ], [ 31.221535685000077, -22.364886982999948 ], [ 31.229597209000048, -22.363956806999809 ], [ 31.245720256000112, -22.357548929999865 ], [ 31.255642130000211, -22.357962340999876 ], [ 31.265615682000231, -22.365507099999917 ], [ 31.288921753000096, -22.397339782999964 ], [ 31.279103231000107, -22.415323181999952 ], [ 31.323338257000017, -22.542860616 ], [ 31.374911336000224, -22.691585387999908 ], [ 31.42638106300015, -22.840103454999877 ], [ 31.467618856000144, -22.958959247999871 ], [ 31.536348511000114, -23.156983337999876 ], [ 31.542446330000047, -23.187265726999897 ], [ 31.521465699000174, -23.415572203999929 ], [ 31.52761519300023, -23.456809996999922 ], [ 31.546270386000202, -23.492363382999898 ], [ 31.642285197000064, -23.587861429999847 ], [ 31.662025594000085, -23.624034931999873 ], [ 31.700627889000231, -23.749091898999936 ], [ 31.741193888000083, -23.836786803999971 ], [ 31.755198202000173, -23.857767434999971 ], [ 31.774060099000195, -23.87409718799999 ], [ 31.838655640000155, -23.917815449999893 ], [ 31.850437866000135, -23.930631204999969 ], [ 31.8558122150001, -23.94654754599999 ], [ 31.856491137000063, -23.962958052999866 ], [ 31.863046916000172, -24.121420592999826 ], [ 31.869454793000131, -24.163795268000015 ], [ 31.92631076700016, -24.276739754999937 ], [ 31.961335490000096, -24.346316425999831 ], [ 31.986553589000124, -24.423107604999885 ], [ 31.991927938000089, -24.500415546999889 ], [ 31.983763062000179, -24.569145201999959 ], [ 31.984589885000076, -24.708464864 ], [ 31.985623413000184, -24.876930032999894 ], [ 31.986295207000154, -24.996302590999832 ], [ 31.987225382000105, -25.155362649999901 ], [ 31.9887239990002, -25.372610371999954 ], [ 31.971670776000082, -25.421496276999861 ], [ 31.967640015000171, -25.446817728999932 ], [ 31.966399781000035, -25.479683938999869 ], [ 31.970120484000091, -25.51089650400003 ], [ 31.980559122000187, -25.531567076999863 ], [ 31.986398560000083, -25.552444356999928 ], [ 31.995648641000088, -25.615179544999961 ], [ 31.99575199400013, -25.636883646999877 ], [ 31.991617880000121, -25.650216165999979 ], [ 31.984796590000229, -25.65631398499994 ], [ 31.975081421000112, -25.661688333999905 ], [ 31.96226566600015, -25.672850443999934 ], [ 31.954410848000094, -25.684942728999843 ], [ 31.911932820000033, -25.785298359999899 ], [ 31.905835001000099, -25.812996927999833 ], [ 31.909969116000212, -25.842969258999872 ], [ 31.949243204000112, -25.958104349999857 ], [ 31.8918823650001, -25.983839212999854 ], [ 31.863356974000141, -25.989937031999901 ], [ 31.834573202000144, -25.982082213999874 ], [ 31.746966320000212, -25.930789517999969 ], [ 31.730600220000184, -25.921207377999835 ], [ 31.63877120000015, -25.867463887999833 ], [ 31.532834513000154, -25.805555521999906 ], [ 31.42689782700009, -25.743647154999977 ], [ 31.401473022000147, -25.735999044 ], [ 31.372017456000066, -25.736412455 ], [ 31.337394246000116, -25.74468068399996 ], [ 31.309282268000203, -25.757393086999826 ], [ 31.2084098710001, -25.838628437999972 ], [ 31.119836467000113, -25.910045266999987 ], [ 31.106865682, -25.930922546999952 ], [ 31.091621134000178, -25.983632506999982 ], [ 31.037774292000137, -26.100111185999936 ], [ 30.969871460000178, -26.209148457999959 ], [ 30.897333504000159, -26.29170946499984 ], [ 30.897317749000052, -26.291727396999903 ], [ 30.804558553000078, -26.397457376999839 ], [ 30.782906128000178, -26.472388203999969 ], [ 30.784146362000143, -26.57884165499982 ], [ 30.785696655000066, -26.716921080999924 ], [ 30.795670207000086, -26.78554738299988 ], [ 30.802439819000114, -26.808905130999833 ], [ 30.819803101000133, -26.807974954999963 ], [ 30.836442912000024, -26.805081074999975 ], [ 30.853392782000157, -26.796606139999881 ], [ 30.868740682000208, -26.784927266999986 ], [ 30.880212850000106, -26.772214863999949 ], [ 30.885294444000095, -26.785640599999866 ], [ 30.902588745000088, -26.831332701999912 ], [ 30.915817911000119, -26.849419453999928 ], [ 30.944446655000064, -26.876601257 ], [ 30.955092000000178, -26.891380717000018 ], [ 30.960983114000072, -26.911224467000011 ], [ 30.959742879000117, -26.936132506999982 ], [ 30.949407593000018, -26.975406595999956 ], [ 30.953645060000071, -27.000314635999928 ], [ 30.976072632000097, -27.035041197999959 ], [ 31.078753703000103, -27.118240253999872 ], [ 31.126502727000144, -27.182629089999949 ], [ 31.141953980000068, -27.196478372999835 ], [ 31.15704349700016, -27.205573425999901 ], [ 31.244706612000215, -27.232586323999854 ], [ 31.280136759000101, -27.243503925999818 ], [ 31.356669555000195, -27.26706838 ], [ 31.459453979000131, -27.298694355999899 ], [ 31.526529989000124, -27.310889993999822 ], [ 31.636910848000213, -27.312233580999973 ], [ 31.782535034000176, -27.313990580999942 ], [ 31.878601522000196, -27.315230814999893 ], [ 31.96826013200004, -27.316264342999958 ], [ 31.9677433680001, -27.303035175999881 ], [ 31.964849487000066, -27.291666360999983 ], [ 31.95978519700023, -27.281021015999897 ], [ 31.952963907000111, -27.270168964999854 ], [ 31.947382853000107, -27.255492858999958 ], [ 31.944850708000075, -27.181388854999838 ], [ 31.944204309000185, -27.162338389000013 ], [ 31.942111857000071, -27.100670267999988 ], [ 31.95968184400013, -27.008789570999838 ], [ 31.975288127000084, -26.926624042999904 ], [ 31.992237996000057, -26.838257344999988 ], [ 31.990067586000094, -26.808285013999949 ], [ 32.057143596000202, -26.808595071999846 ], [ 32.073163289000064, -26.811385599999895 ], [ 32.097761272000156, -26.833503112999907 ], [ 32.113884318000117, -26.840014342999879 ], [ 32.143184855000101, -26.84569875099983 ], [ 32.194086141000213, -26.840324401999865 ], [ 32.223024943000183, -26.841357930999848 ], [ 32.295837036000052, -26.85200327499993 ], [ 32.352216024000057, -26.860271503999883 ], [ 32.468901408000107, -26.857377624999984 ], [ 32.598092488000106, -26.853966979999868 ], [ 32.738445679000137, -26.85024627699994 ], [ 32.89307701900006, -26.846123955999929 ], [ 32.880544467000078, -26.886895440999893 ], [ 32.865244988000114, -27.017347914999817 ], [ 32.846934441000172, -27.080987237999878 ], [ 32.844574415000096, -27.102715752999856 ], [ 32.839366082000112, -27.123630467 ], [ 32.803721550000063, -27.168226820999891 ], [ 32.801036004000167, -27.176853122999972 ], [ 32.796885613000228, -27.205743097 ], [ 32.794688347000118, -27.214288018999838 ], [ 32.78541100400011, -27.22966887799987 ], [ 32.781016472000118, -27.255954684999978 ], [ 32.67652428500017, -27.520684503 ], [ 32.607188347000118, -27.813734632999981 ], [ 32.605723504000167, -27.836114190999922 ], [ 32.60377037900011, -27.846368096999853 ], [ 32.594411655000187, -27.870049737999963 ], [ 32.591481967000078, -27.880791924999883 ], [ 32.591319207000112, -27.892998955999943 ], [ 32.596934441000116, -27.911797783999987 ], [ 32.598317905000187, -27.922458591999927 ], [ 32.550547722000118, -28.171563408999972 ], [ 32.543955925000063, -28.190118096999896 ], [ 32.45997155000012, -28.306735934999907 ], [ 32.454274936000019, -28.322686455999914 ], [ 32.450368686000019, -28.345635675 ], [ 32.439219597000118, -28.366631768999852 ], [ 32.422048373000081, -28.381931247999987 ], [ 32.399668816000172, -28.387872002999842 ], [ 32.40333092500012, -28.397556247999972 ], [ 32.40699303500017, -28.400323174999855 ], [ 32.412119988000057, -28.398695570999834 ], [ 32.42017662900011, -28.394707940999936 ], [ 32.428233269000231, -28.429375908999916 ], [ 32.417246941000172, -28.466485283999845 ], [ 32.400726759000094, -28.502699476999865 ], [ 32.392100457000112, -28.535332940999908 ], [ 32.379405144000231, -28.552829684999864 ], [ 32.293142123000194, -28.630954684999878 ], [ 32.280039910000113, -28.640069268999952 ], [ 32.247894727000102, -28.653903903999961 ], [ 32.235118035000113, -28.661553643999895 ], [ 32.225433790000096, -28.672621351999922 ], [ 32.206797722000175, -28.701348565999979 ], [ 32.193614129000167, -28.716241143999937 ], [ 32.083750847000175, -28.799493096999967 ], [ 32.056325717000135, -28.779473565999908 ], [ 32.016856316000172, -28.784926039999931 ], [ 31.993988477000158, -28.806247653999989 ], [ 32.016123894000117, -28.833591403999975 ], [ 32.024099155000187, -28.824965101999879 ], [ 32.03736412900011, -28.814711195999948 ], [ 32.053396030000187, -28.807061456 ], [ 32.070078972000118, -28.805596612999864 ], [ 32.05103600400011, -28.837823174999983 ], [ 32.01205488400015, -28.866469007999967 ], [ 31.888356967000192, -28.924737237999892 ], [ 31.852061394000117, -28.931329033999958 ], [ 31.813731316000172, -28.930108330999943 ], [ 31.769053582000112, -28.922295830999857 ], [ 31.770355665000096, -28.93084075299997 ], [ 31.772308790000153, -28.936618748000015 ], [ 31.776052280000187, -28.94052499799993 ], [ 31.782725457000225, -28.943454684999864 ], [ 31.782725457000225, -28.949639580999914 ], [ 31.752126498000194, -28.966241143999966 ], [ 31.557465040000153, -29.161879164999817 ], [ 31.510264519000117, -29.198988539999831 ], [ 31.49447675900015, -29.20566171699997 ], [ 31.488454623000024, -29.209649346999939 ], [ 31.486094597000175, -29.21575286299985 ], [ 31.482188347000175, -29.233330987999878 ], [ 31.478200717000192, -29.236993096999925 ], [ 31.46534264400006, -29.244886976999979 ], [ 31.427012566000172, -29.292168877999941 ], [ 31.412608269000117, -29.303155205999914 ], [ 31.378591342000078, -29.321872653999975 ], [ 31.365000847000118, -29.332614841999899 ], [ 31.360036655000073, -29.342461847 ], [ 31.354665561000189, -29.363376559999878 ], [ 31.342133009000094, -29.370049737999921 ], [ 31.333994988000057, -29.376397393999866 ], [ 31.326508009000094, -29.384209893999952 ], [ 31.31861412900011, -29.40203215899993 ], [ 31.186859571000156, -29.560316664999903 ], [ 31.055511915000153, -29.789808851999894 ], [ 31.045258009000094, -29.82952239399998 ], [ 31.055837436000076, -29.86825937299993 ], [ 31.015798373000138, -29.868096612999878 ], [ 31.006114129000167, -29.876153253 ], [ 31.001231316000172, -29.902439059999921 ], [ 31.01636803500017, -29.895196221999981 ], [ 31.050466342000192, -29.885186455999914 ], [ 31.063324415000096, -29.87444426899999 ], [ 31.063324415000096, -29.881931247999873 ], [ 31.061534050000063, -29.888929945999948 ], [ 31.058278842000192, -29.895928643999838 ], [ 31.049571160000113, -29.908623955999985 ], [ 31.023773634000094, -29.935804945999905 ], [ 30.919932488000114, -30.018487237999963 ], [ 30.890635613000114, -30.050062757999868 ], [ 30.842539910000113, -30.12330494599982 ], [ 30.786468946000099, -30.23748137799997 ], [ 30.64161217500012, -30.459567966999984 ], [ 30.621429884000094, -30.50009531 ], [ 30.617686394000231, -30.515313408999972 ], [ 30.609548373000024, -30.529554945999976 ], [ 30.562347852000158, -30.57390715899993 ], [ 30.392344597000118, -30.847100518999909 ], [ 30.36402428500017, -30.882256768999966 ], [ 30.348155144000231, -30.896579684999864 ], [ 30.333750847000175, -30.902276299999926 ], [ 30.320323113000057, -30.912286065999922 ], [ 30.288747592000078, -30.971123955999985 ], [ 30.195974155000073, -31.077894789999888 ], [ 30.12338300900015, -31.161553643999923 ], [ 30.095062696000099, -31.178643487999963 ], [ 30.062754754000167, -31.238702080999886 ], [ 30.009938998000194, -31.292250257999981 ], [ 29.864105665000153, -31.411553643999881 ], [ 29.846202019000117, -31.419610283999916 ], [ 29.784515821000156, -31.434747002999913 ], [ 29.761729363000228, -31.443942966999884 ], [ 29.742035352000102, -31.457452080999943 ], [ 29.733734571000099, -31.474867445999834 ], [ 29.672373894000117, -31.539727472 ], [ 29.650401238000114, -31.547784112999949 ], [ 29.641368035000113, -31.553317966999956 ], [ 29.634613477000158, -31.572442315999851 ], [ 29.62769616000017, -31.580254815999936 ], [ 29.61988366000017, -31.58603281 ], [ 29.614431186000019, -31.58814869599982 ], [ 29.59205162900011, -31.593031507999882 ], [ 29.574066602000158, -31.6054013 ], [ 29.54200280000012, -31.635918877999941 ], [ 29.526052280000187, -31.643975518999895 ], [ 29.486664259000094, -31.656426690999908 ], [ 29.460785352000102, -31.672295830999843 ], [ 29.452159050000063, -31.674004815999851 ], [ 29.442718946000156, -31.674737237999878 ], [ 29.432139519000117, -31.677504164999931 ], [ 29.427256707000225, -31.677992445999919 ], [ 29.416188998000194, -31.676527601999865 ], [ 29.411631707000055, -31.677504164999931 ], [ 29.405528191000172, -31.68417734199997 ], [ 29.406911655000073, -31.689385674999883 ], [ 29.410655144000117, -31.693780205999872 ], [ 29.411631707000055, -31.698011976999979 ], [ 29.391856316000116, -31.735528252999984 ], [ 29.362478061000019, -31.749769789999817 ], [ 29.356944207000225, -31.755791924999912 ], [ 29.352875196000156, -31.780368748000015 ], [ 29.342051629000167, -31.79355234199997 ], [ 29.309255405000073, -31.814060154000018 ], [ 29.276703321000099, -31.844659112999935 ], [ 29.261241082000055, -31.863539320999962 ], [ 29.25456790500013, -31.879571221999953 ], [ 29.251963738000114, -31.889092705999872 ], [ 29.234141472000118, -31.916599216999899 ], [ 29.223399285000113, -31.921970309999864 ], [ 29.220469597000118, -31.924004815999979 ], [ 29.218760613000114, -31.927911065999965 ], [ 29.215505405000073, -31.940118096999953 ], [ 29.21363366000017, -31.943780206 ], [ 29.147634311000047, -31.969821872999887 ], [ 29.137950066000087, -31.982028903999861 ], [ 29.133799675000063, -31.998467705999857 ], [ 29.123789910000085, -32.017022393999866 ], [ 29.096364780000016, -32.053643487999977 ], [ 28.973317905000101, -32.166680596999925 ], [ 28.870371941000116, -32.287041924999954 ], [ 28.817149285000141, -32.315118096999967 ], [ 28.808360222000061, -32.32488372199991 ], [ 28.674082879000139, -32.430596612999935 ], [ 28.651215040000125, -32.459079684999864 ], [ 28.642751498000109, -32.465508721999953 ], [ 28.626231316000116, -32.472344658999887 ], [ 28.617198113000114, -32.47820403399993 ], [ 28.580332879000139, -32.511163018999987 ], [ 28.562673373000024, -32.531996351999965 ], [ 28.555023634000094, -32.550469658999987 ], [ 28.54859459700009, -32.562432549999926 ], [ 28.437510613000086, -32.636000257999825 ], [ 28.411957227000102, -32.647637628 ], [ 28.379405144000145, -32.670993747999916 ], [ 28.363291863000086, -32.678155205999943 ], [ 28.360118035000113, -32.693942966999984 ], [ 28.336924675000063, -32.709405205999914 ], [ 28.287608269000089, -32.732110283999873 ], [ 28.240570509000065, -32.760918877999984 ], [ 28.210785352000073, -32.77467213299991 ], [ 28.155528191000144, -32.788506768999909 ], [ 28.130137566000116, -32.80885182099982 ], [ 28.110850457000083, -32.836521092 ], [ 28.103282097000147, -32.866143487999949 ], [ 28.094004754000082, -32.887465101999908 ], [ 28.072276238000114, -32.908298434999978 ], [ 27.969899936000104, -32.980564059999878 ], [ 27.939626498000109, -32.989841404 ], [ 27.930674675000091, -32.997653903999918 ], [ 27.917653842000107, -33.013848565999965 ], [ 27.903981967000078, -33.02068450299997 ], [ 27.902354363000143, -33.02434661299985 ], [ 27.90211022200009, -33.02947356599995 ], [ 27.901133660000113, -33.034926039999974 ], [ 27.897146030000044, -33.039971612999835 ], [ 27.849294467000021, -33.058526299999841 ], [ 27.829844597000118, -33.077243747999901 ], [ 27.818695509000094, -33.081638278999975 ], [ 27.799327019000089, -33.084242445999962 ], [ 27.74984785200013, -33.099786065999965 ], [ 27.73267662900011, -33.108819268999895 ], [ 27.643239780000101, -33.188653252999913 ], [ 27.609873894000117, -33.211846612999935 ], [ 27.539235873000081, -33.234551690999893 ], [ 27.527842644000117, -33.24293385199995 ], [ 27.523285352000073, -33.244398695999905 ], [ 27.500010613000143, -33.273370049999912 ], [ 27.492360873000024, -33.277032158999958 ], [ 27.484711134000094, -33.278985284 ], [ 27.476328972000118, -33.278090101999908 ], [ 27.465668165000096, -33.273370049999912 ], [ 27.458506707000055, -33.298923434999978 ], [ 27.434580925000091, -33.320733330999857 ], [ 27.38021894600007, -33.357354424999969 ], [ 27.355804884000122, -33.369561455999857 ], [ 27.351735873000081, -33.369561455999857 ], [ 27.347504102000045, -33.367120049999912 ], [ 27.344248894000089, -33.364434502999842 ], [ 27.342295769000145, -33.363376559999963 ], [ 27.338877800000148, -33.366387627999885 ], [ 27.334808790000096, -33.377048435 ], [ 27.228282097000147, -33.438897393999987 ], [ 27.218760613000143, -33.448663018999852 ], [ 27.143077019000145, -33.479424737999835 ], [ 27.127452019000089, -33.489841404 ], [ 27.119802280000044, -33.49675872199991 ], [ 27.116384311000047, -33.50359465899993 ], [ 27.114431186000076, -33.511163018999881 ], [ 27.108897332000083, -33.519138278999932 ], [ 27.100922071000099, -33.525323174999983 ], [ 27.091807488000114, -33.527764580999843 ], [ 27.071299675000063, -33.530857028999918 ], [ 26.98462975400011, -33.57024505 ], [ 26.965342644000089, -33.574314059999949 ], [ 26.941254102000073, -33.575616143999866 ], [ 26.919118686000076, -33.581475518999909 ], [ 26.863047722000147, -33.622735283999944 ], [ 26.842784050000148, -33.627373955999886 ], [ 26.794606967000107, -33.632256768999952 ], [ 26.761241082000112, -33.64902109199997 ], [ 26.665375196000099, -33.683689059999949 ], [ 26.653330925000091, -33.684828382999981 ], [ 26.645518425000091, -33.689141533999972 ], [ 26.638926629000139, -33.707777601999879 ], [ 26.63257897200009, -33.712172132999868 ], [ 26.610850457000112, -33.714939059999921 ], [ 26.515147332000083, -33.755303643999881 ], [ 26.476084832000112, -33.764255467 ], [ 26.434825066000059, -33.766045830999985 ], [ 26.34986412900011, -33.755547784 ], [ 26.323415561000047, -33.756442966999913 ], [ 26.304209832000083, -33.763767184999921 ], [ 26.286631707000055, -33.766371351999908 ], [ 26.263194207000083, -33.757989190999865 ], [ 26.225596550000091, -33.739434502999856 ], [ 26.092539910000085, -33.717054945999919 ], [ 25.955251498000052, -33.710870049999869 ], [ 25.867442254000082, -33.721856378 ], [ 25.785411004000139, -33.743584893999895 ], [ 25.711110873000052, -33.774183851999823 ], [ 25.67904707100007, -33.795179945999948 ], [ 25.653086785000085, -33.822686455999886 ], [ 25.634043816000087, -33.855157158999873 ], [ 25.617523634000094, -33.911390882999953 ], [ 25.614919467000107, -33.934991143999895 ], [ 25.619395379000082, -33.945896091999956 ], [ 25.638926629000139, -33.953789971999853 ], [ 25.643402540000125, -33.962579034 ], [ 25.648203972000118, -33.968682549999897 ], [ 25.677012566000144, -33.986504815999879 ], [ 25.695648634000122, -34.01181406 ], [ 25.704356316000116, -34.02068450299987 ], [ 25.702891472000147, -34.028497002999941 ], [ 25.701019727000073, -34.031670831 ], [ 25.697520379000082, -34.034926039999874 ], [ 25.666026238000086, -34.026543878 ], [ 25.644297722000118, -34.032484632999839 ], [ 25.624196811000076, -34.043064059999978 ], [ 25.598155144000089, -34.048516534 ], [ 25.566905144000117, -34.045505467 ], [ 25.513926629000082, -34.031508070999863 ], [ 25.485199415000125, -34.027520440999965 ], [ 25.435394727000073, -34.032891533999845 ], [ 25.410492384000122, -34.032972914999831 ], [ 25.383555535000141, -34.019626559999907 ], [ 25.347992384000094, -34.014418226999823 ], [ 25.313812696000099, -33.993340752999984 ], [ 25.277517123000081, -33.981133722 ], [ 25.192637566000144, -33.962172132999896 ], [ 25.101084832000112, -33.960544528999975 ], [ 25.011485222000147, -33.970961195999877 ], [ 24.952891472000118, -33.985121351999894 ], [ 24.929047071000127, -33.995863539999817 ], [ 24.913340691000087, -34.011325779000018 ], [ 24.927419467000107, -34.052341403999932 ], [ 24.916351759000065, -34.072360934999907 ], [ 24.899261915000125, -34.089613539999903 ], [ 24.888682488000086, -34.096368096999853 ], [ 24.841075066000087, -34.132500908999887 ], [ 24.834157748000109, -34.147637627999885 ], [ 24.838226759000065, -34.159763278999961 ], [ 24.847666863000086, -34.166273695999877 ], [ 24.857106967000078, -34.171156507999939 ], [ 24.861338738000114, -34.178317966999884 ], [ 24.857920769000089, -34.18694426899998 ], [ 24.840830925000148, -34.198011976999837 ], [ 24.834157748000109, -34.205661716999941 ], [ 24.827321811000076, -34.205661716999941 ], [ 24.81470787900011, -34.19068775799991 ], [ 24.793711785000141, -34.184747002999899 ], [ 24.725352410000085, -34.183282158999845 ], [ 24.670258009000122, -34.170830987999906 ], [ 24.647227410000141, -34.168226820999919 ], [ 24.583994988000086, -34.178317966999884 ], [ 24.564952019000089, -34.176934502999984 ], [ 24.478526238000086, -34.157810154000018 ], [ 24.435231967000107, -34.138929945999891 ], [ 24.400157097000118, -34.112562757999981 ], [ 24.380869988000086, -34.106377862999921 ], [ 24.25912519600007, -34.094170830999943 ], [ 24.241709832000112, -34.086114190999922 ], [ 24.227875196000099, -34.077894789999831 ], [ 24.163096550000091, -34.054782809999878 ], [ 23.984222852000102, -34.041110934999935 ], [ 23.96265709700009, -34.036879164999917 ], [ 23.91960696700005, -34.023532809999907 ], [ 23.812998894000117, -34.014418226999823 ], [ 23.635508660000085, -33.979668877999941 ], [ 23.588552280000073, -33.981215101999979 ], [ 23.427582227000102, -34.012383721999967 ], [ 23.406097852000073, -34.020440362999921 ], [ 23.386892123000024, -34.031182549999841 ], [ 23.370860222000147, -34.044854424999954 ], [ 23.361175977000073, -34.066664320999834 ], [ 23.367930535000113, -34.08660247199991 ], [ 23.385590040000125, -34.100274346999853 ], [ 23.408376498000052, -34.103204033999873 ], [ 23.408376498000052, -34.110039971999967 ], [ 23.062836134000122, -34.08269622199991 ], [ 23.057465040000068, -34.07626718499999 ], [ 23.051524285000141, -34.047621351999837 ], [ 23.049001498000109, -34.041110934999935 ], [ 23.018890821000099, -34.039157809999892 ], [ 23.006521030000073, -34.035088799999841 ], [ 22.998057488000114, -34.027520440999965 ], [ 23.001638217000078, -34.042575778999989 ], [ 23.009043816000087, -34.048516534 ], [ 23.018728061000047, -34.051690362999892 ], [ 23.028819207000083, -34.0585263 ], [ 23.038747592000107, -34.072442315999979 ], [ 23.038910352000073, -34.079766533999972 ], [ 23.032237175000091, -34.086114190999922 ], [ 23.026215040000096, -34.080987237999906 ], [ 23.012217644000145, -34.077406507999925 ], [ 22.984548373000052, -34.075290623000015 ], [ 22.97169030000012, -34.077732028999947 ], [ 22.962087436000047, -34.081312757999839 ], [ 22.951508009000094, -34.083916924999841 ], [ 22.936045769000145, -34.08269622199991 ], [ 22.856211785000141, -34.061781507999939 ], [ 22.824229363000143, -34.045179945999976 ], [ 22.811371290000125, -34.041761976999979 ], [ 22.800140821000127, -34.035577080999914 ], [ 22.792002800000091, -34.02068450299987 ], [ 22.789805535000113, -34.011325779000018 ], [ 22.79053795700014, -34.004327080999857 ], [ 22.797211134000094, -34.000583591999913 ], [ 22.812510613000143, -34.000746351999879 ], [ 22.796722852000102, -33.989515882999882 ], [ 22.774587436000047, -33.983575127999856 ], [ 22.730479363000143, -33.979668877999941 ], [ 22.73991946700005, -33.994724216999956 ], [ 22.753184441000087, -34.009535414999931 ], [ 22.768890821000042, -34.021416924999897 ], [ 22.785166863000086, -34.027520440999965 ], [ 22.766774936000047, -34.032891533999845 ], [ 22.742523634000065, -34.028903903999947 ], [ 22.62989342500012, -33.995782158999916 ], [ 22.609873894000145, -33.993340752999984 ], [ 22.583669467000107, -33.994073174999912 ], [ 22.563975457000083, -33.99724700299997 ], [ 22.547699415000125, -34.003594658999916 ], [ 22.495860222000118, -34.039239190999965 ], [ 22.455414259000094, -34.057061455999943 ], [ 22.410492384000094, -34.06560637799987 ], [ 22.317067905000101, -34.056898695999976 ], [ 22.275157097000118, -34.057712497999987 ], [ 22.18921959700009, -34.075290623000015 ], [ 22.169200066000116, -34.083184502999899 ], [ 22.152842644000117, -34.093682549999954 ], [ 22.123545769000089, -34.120538018999952 ], [ 22.111013217000107, -34.141534112999977 ], [ 22.115407748000081, -34.157810154000018 ], [ 22.12989342500012, -34.169691664999974 ], [ 22.147715691000116, -34.178317966999884 ], [ 22.134043816000059, -34.188083592000012 ], [ 22.114105665000096, -34.19394296699987 ], [ 21.984060092000078, -34.210137628 ], [ 21.946950717000078, -34.223728122999958 ], [ 21.921722852000102, -34.24667734199987 ], [ 21.918711785000113, -34.262953382999896 ], [ 21.923838738000114, -34.295668226999837 ], [ 21.91431725400011, -34.306817315999851 ], [ 21.894541863000086, -34.336032809999978 ], [ 21.888682488000143, -34.33961353999986 ], [ 21.829600457000112, -34.368584893999937 ], [ 21.788747592000078, -34.381280205999914 ], [ 21.746104363000143, -34.388360283999958 ], [ 21.702647332000112, -34.390557549999869 ], [ 21.597178582000112, -34.372653903999989 ], [ 21.559743686000076, -34.35344817499994 ], [ 21.537608269000089, -34.34889088299991 ], [ 21.51587975400011, -34.352227471999925 ], [ 21.474131707000083, -34.366794528999961 ], [ 21.438975457000112, -34.372328382999967 ], [ 21.431895379000053, -34.377862237999906 ], [ 21.42750084700009, -34.384535414999945 ], [ 21.42212975400011, -34.390557549999869 ], [ 21.41553795700014, -34.394952080999857 ], [ 21.34896894600007, -34.419203382999925 ], [ 21.305918816000116, -34.424574476999894 ], [ 21.262461785000085, -34.421563408999972 ], [ 21.098399285000141, -34.37078215899993 ], [ 21.058360222000118, -34.363376559999864 ], [ 20.961273634000065, -34.356052341999856 ], [ 20.913422071000042, -34.36044687299993 ], [ 20.873545769000089, -34.376885674999841 ], [ 20.880869988000086, -34.376885674999841 ], [ 20.823741082000112, -34.390313409 ], [ 20.805186394000089, -34.398044528999932 ], [ 20.832204623000052, -34.401788018999952 ], [ 20.856130405000101, -34.416924737999949 ], [ 20.86817467500012, -34.437920830999985 ], [ 20.859873894000145, -34.458754164999888 ], [ 20.841075066000087, -34.465020440999922 ], [ 20.66431725400011, -34.438409112999892 ], [ 20.524424675000063, -34.454278253 ], [ 20.482676629000139, -34.470472914999874 ], [ 20.448008660000141, -34.493340752999885 ], [ 20.393239780000044, -34.554782809999864 ], [ 20.374522332000055, -34.569756768999895 ], [ 20.355479363000086, -34.576104424999926 ], [ 20.341156446000099, -34.578708592000012 ], [ 20.334320509000065, -34.585219007999825 ], [ 20.328868035000113, -34.594008070999976 ], [ 20.31861412900011, -34.603448174999897 ], [ 20.310069207000083, -34.607191664999931 ], [ 20.277598504000082, -34.617771091999884 ], [ 20.261485222000118, -34.627048434999935 ], [ 20.243337436000019, -34.6410458309999 ], [ 20.228526238000143, -34.657810153999918 ], [ 20.222422722000147, -34.675062757999925 ], [ 20.211680535000141, -34.672051690999922 ], [ 20.18726647200009, -34.677422783999972 ], [ 20.146657748000109, -34.692152601999965 ], [ 20.072601759000122, -34.736911716999913 ], [ 20.04444420700014, -34.768324476999851 ], [ 20.057871941000144, -34.795179945999834 ], [ 20.057871941000144, -34.801446221999882 ], [ 20.041758660000085, -34.805108330999929 ], [ 20.015635613000114, -34.818942966999927 ], [ 19.999278191000116, -34.82195403399993 ], [ 19.983571811000047, -34.820082289999959 ], [ 19.967946811000047, -34.815199476999894 ], [ 19.953461134000094, -34.80868906 ], [ 19.890472852000073, -34.769707940999922 ], [ 19.87598717500012, -34.757419528999961 ], [ 19.858409050000091, -34.749688408999859 ], [ 19.698090040000096, -34.753676039999931 ], [ 19.683604363000143, -34.75660572699995 ], [ 19.667002800000091, -34.770440362999949 ], [ 19.653168165000096, -34.774102472 ], [ 19.642425977000102, -34.77206796699997 ], [ 19.63575280000012, -34.76588307099982 ], [ 19.63111412900011, -34.758884373000015 ], [ 19.626475457000083, -34.753676039999931 ], [ 19.576019727000073, -34.727959893999966 ], [ 19.499685092000107, -34.664239190999837 ], [ 19.448496941000059, -34.640069268999923 ], [ 19.43295332100007, -34.629978122999944 ], [ 19.41732832100007, -34.614027601999936 ], [ 19.398692254000082, -34.601820570999877 ], [ 19.374766472000118, -34.599297783999944 ], [ 19.350759311000076, -34.604913018999866 ], [ 19.331716342000107, -34.617771091999884 ], [ 19.323008660000113, -34.612481378 ], [ 19.314219597000147, -34.610935153999961 ], [ 19.305511915000068, -34.612725518999937 ], [ 19.296885613000143, -34.617771091999884 ], [ 19.300629102000102, -34.60662200299987 ], [ 19.360118035000113, -34.53866952899989 ], [ 19.365082227000073, -34.527764580999914 ], [ 19.360199415000096, -34.500420830999929 ], [ 19.344411655000073, -34.46843840899993 ], [ 19.323903842000107, -34.438653252999842 ], [ 19.304372592000107, -34.417901299999926 ], [ 19.29037519600007, -34.409112237999878 ], [ 19.277679884000094, -34.406508070999877 ], [ 19.207774285000085, -34.41855234199997 ], [ 19.146494988000143, -34.414971612999906 ], [ 19.133067254000082, -34.411716403999876 ], [ 19.119313998000052, -34.400567315999936 ], [ 19.101084832000083, -34.372328382999967 ], [ 19.085215691000144, -34.363376559999864 ], [ 19.085215691000144, -34.356540623000015 ], [ 19.111013217000078, -34.35263437299993 ], [ 19.12289472700013, -34.33798593500002 ], [ 19.129567905000073, -34.317071221999967 ], [ 19.139903191000087, -34.294366143999838 ], [ 19.122569207000083, -34.302666925 ], [ 19.09896894600007, -34.335544528999989 ], [ 19.088389519000117, -34.34270598799985 ], [ 19.011973504000082, -34.338555596999981 ], [ 18.999034050000091, -34.339288018999838 ], [ 18.97022545700014, -34.348239841999956 ], [ 18.872894727000073, -34.361911716999899 ], [ 18.851898634000122, -34.373467706 ], [ 18.847911004000139, -34.381605726999936 ], [ 18.838226759000094, -34.383884373 ], [ 18.826996290000096, -34.38176848799999 ], [ 18.817637566000144, -34.376885674999841 ], [ 18.80827884200005, -34.364678643999952 ], [ 18.809418165000068, -34.354913018999987 ], [ 18.817637566000144, -34.34270598799985 ], [ 18.810883009000122, -34.30974700299987 ], [ 18.810313347000147, -34.301853122999987 ], [ 18.813731316000059, -34.29078541499986 ], [ 18.818369988000086, -34.286065362999935 ], [ 18.824229363000143, -34.282403252999899 ], [ 18.83139082100007, -34.273858330999957 ], [ 18.839691602000073, -34.254327080999985 ], [ 18.838226759000094, -34.239678643999966 ], [ 18.823903842000107, -34.205661716999941 ], [ 18.822520379000139, -34.184991143999937 ], [ 18.83139082100007, -34.175876559999935 ], [ 18.845062696000127, -34.167657158999859 ], [ 18.858164910000085, -34.150323174999869 ], [ 18.81617272200009, -34.097100518999881 ], [ 18.800059441000116, -34.08953215899993 ], [ 18.740733269000145, -34.077406507999925 ], [ 18.647227410000113, -34.070000908999859 ], [ 18.555023634000122, -34.073825778999961 ], [ 18.540293816000144, -34.079034112999864 ], [ 18.531748894000117, -34.083916924999841 ], [ 18.495616082000083, -34.096368096999853 ], [ 18.478363477000073, -34.106866143999909 ], [ 18.470062696000099, -34.114027601999865 ], [ 18.46078535200013, -34.124281507999981 ], [ 18.446055535000141, -34.137139580999914 ], [ 18.441661004000082, -34.144219658999958 ], [ 18.440277540000096, -34.157810154000018 ], [ 18.442718946000127, -34.168145440999936 ], [ 18.447764519000145, -34.173597914999959 ], [ 18.454356316000144, -34.177911065999879 ], [ 18.46078535200013, -34.184502862999949 ], [ 18.474457227000073, -34.226169528999989 ], [ 18.475922071000127, -34.235935153999947 ], [ 18.476573113000086, -34.24504973799985 ], [ 18.467621290000068, -34.311293226999823 ], [ 18.47169030000012, -34.331719658999887 ], [ 18.48878014400006, -34.34270598799985 ], [ 18.470062696000099, -34.347426039999945 ], [ 18.445160352000073, -34.336521091999956 ], [ 18.421397332000055, -34.318454684999949 ], [ 18.406260613000057, -34.301853122999987 ], [ 18.382172071000127, -34.262139580999886 ], [ 18.378916863000086, -34.250258070999934 ], [ 18.380056186000047, -34.243910414999817 ], [ 18.384613477000073, -34.230157158999887 ], [ 18.38575280000012, -34.222344658999987 ], [ 18.383799675000148, -34.218682549999897 ], [ 18.379567905000044, -34.216403903999876 ], [ 18.374766472000147, -34.214532158999901 ], [ 18.372080925000091, -34.212497653999876 ], [ 18.362478061000104, -34.186211846999953 ], [ 18.354340040000096, -34.175388278999947 ], [ 18.325450066000059, -34.16716887799987 ], [ 18.316254102000102, -34.157484632999896 ], [ 18.31381269600007, -34.144626559999963 ], [ 18.316905144000145, -34.130547783999845 ], [ 18.324229363000143, -34.122653903999961 ], [ 18.333506707000112, -34.119886976999908 ], [ 18.341319207000083, -34.114678643999909 ], [ 18.344737175000091, -34.099786065999865 ], [ 18.345225457000083, -34.086114190999922 ], [ 18.34717858200014, -34.075453382999981 ], [ 18.351410352000073, -34.06560637799987 ], [ 18.358409050000148, -34.054782809999878 ], [ 18.343760613000114, -34.056573174999954 ], [ 18.337901238000086, -34.058282158999958 ], [ 18.330414259000122, -34.062188408999944 ], [ 18.316172722000118, -34.043552341999956 ], [ 18.314789259000122, -34.029066664999831 ], [ 18.323090040000125, -34.015883070999877 ], [ 18.337901238000086, -34.000746351999879 ], [ 18.351817254000082, -33.982191664999874 ], [ 18.362559441000087, -33.946465752999927 ], [ 18.372080925000091, -33.925062757999896 ], [ 18.400959827587187, -33.897696937984165 ], [ 18.44304446700005, -33.90406666499986 ], [ 18.475352410000085, -33.899834893999838 ], [ 18.48878014400006, -33.862969658999958 ], [ 18.484385613000086, -33.843926690999965 ], [ 18.465098504000139, -33.817966403999961 ], [ 18.46078535200013, -33.804945570999891 ], [ 18.458343946000099, -33.785251559999935 ], [ 18.431813998000052, -33.696709893999937 ], [ 18.405609571000127, -33.652927341999956 ], [ 18.400075717000107, -33.633396091999984 ], [ 18.390961134000094, -33.629489841999899 ], [ 18.344737175000091, -33.582452080999886 ], [ 18.328298373000109, -33.573418877999956 ], [ 18.320323113000143, -33.567478122999944 ], [ 18.316905144000145, -33.5585263 ], [ 18.316905144000145, -33.517266533999873 ], [ 18.31430097700013, -33.496514580999872 ], [ 18.307383660000141, -33.479261976999865 ], [ 18.28272545700014, -33.445245049999841 ], [ 18.254161004000082, -33.419366143999923 ], [ 18.14616946700005, -33.355889580999914 ], [ 18.15601647200009, -33.339043877999913 ], [ 18.150157097000118, -33.319268487999892 ], [ 18.125010613000143, -33.28004322699995 ], [ 18.111989780000073, -33.253513278999904 ], [ 18.087738477000073, -33.22584400799991 ], [ 18.084727410000085, -33.215264580999943 ], [ 18.075205925000091, -33.202243747999873 ], [ 18.029307488000114, -33.164971612999977 ], [ 18.012380405000016, -33.157321872999873 ], [ 17.991709832000112, -33.150323174999969 ], [ 17.977793816000116, -33.134209893999987 ], [ 17.966644727000102, -33.115817966999956 ], [ 17.954925977000102, -33.101983330999957 ], [ 17.980479363000114, -33.091241143999866 ], [ 17.995290561000076, -33.088148695999877 ], [ 18.005869988000114, -33.091729424999855 ], [ 18.013682488000114, -33.103204033999972 ], [ 18.01921634200005, -33.114027601999979 ], [ 18.026052280000073, -33.1234677059999 ], [ 18.037445509000122, -33.129978122999987 ], [ 18.032969597000147, -33.140883070999877 ], [ 18.040212436000076, -33.149102471999953 ], [ 18.067637566000116, -33.167575778999975 ], [ 18.086110873000052, -33.189385674999855 ], [ 18.09913170700014, -33.200941664999874 ], [ 18.111989780000073, -33.205010674999841 ], [ 18.127452019000089, -33.19736093499999 ], [ 18.123383009000122, -33.186130466999899 ], [ 18.10181725400011, -33.167575778999975 ], [ 18.096527540000039, -33.159112237999949 ], [ 18.094493035000113, -33.142266533999859 ], [ 18.09156334700009, -33.135511976999823 ], [ 18.087168816000116, -33.133070570999962 ], [ 18.075938347000118, -33.132012627999913 ], [ 18.071055535000141, -33.129978122999987 ], [ 18.04908287900011, -33.111423434999892 ], [ 18.04086347700013, -33.101657809999935 ], [ 18.037445509000122, -33.091729424999855 ], [ 18.040537957000112, -33.048516533999944 ], [ 18.037445509000122, -33.033786716999941 ], [ 18.023203972000118, -33.014336846999953 ], [ 17.999522332000083, -33.004489842000012 ], [ 17.970550977000102, -33.002373955999914 ], [ 17.940684441000116, -33.006442966999884 ], [ 17.949717644000117, -33.022230726999837 ], [ 17.954925977000102, -33.027520440999908 ], [ 17.942718946000127, -33.029961846999939 ], [ 17.932302280000044, -33.034356377999913 ], [ 17.912771030000073, -33.047458591999984 ], [ 17.901866082000083, -33.036879164999846 ], [ 17.895843946000099, -33.026462497999859 ], [ 17.893402540000068, -33.017185153999989 ], [ 17.892832879000082, -33.010186455999914 ], [ 17.889008009000065, -33.001560154 ], [ 17.882090691000087, -32.992608330999886 ], [ 17.878591342000078, -32.981540622999944 ], [ 17.885508660000085, -32.966078382999925 ], [ 17.880707227000102, -32.958184502999856 ], [ 17.868500196000127, -32.929294528999932 ], [ 17.862478061000104, -32.907159112999864 ], [ 17.861664259000094, -32.899021091999941 ], [ 17.865082227000102, -32.890557549999983 ], [ 17.875254754000139, -32.879815362999892 ], [ 17.881032748000109, -32.867608330999914 ], [ 17.875498894000089, -32.855889580999914 ], [ 17.852386915000039, -32.82968515399989 ], [ 17.846853061000047, -32.827080987999892 ], [ 17.843028191000116, -32.823337497999944 ], [ 17.843923373000109, -32.814629815999879 ], [ 17.847829623000109, -32.813409112999864 ], [ 17.855153842000107, -32.814711195999863 ], [ 17.861827019000145, -32.815199476999851 ], [ 17.865000847000118, -32.811211846999868 ], [ 17.868174675000091, -32.808200778999947 ], [ 17.883555535000141, -32.796644789999846 ], [ 17.889170769000117, -32.794122003 ], [ 17.897308790000068, -32.792738539999846 ], [ 17.899099155000044, -32.789239190999936 ], [ 17.899424675000148, -32.783949476999879 ], [ 17.90284264400006, -32.777032158999958 ], [ 17.903575066000087, -32.769219658999887 ], [ 17.902679884000094, -32.738376559999921 ], [ 17.90593509200005, -32.72584400799991 ], [ 17.919688347000061, -32.716566664999874 ], [ 17.943369988000086, -32.708265882999981 ], [ 17.967458530000101, -32.703545830999886 ], [ 17.982269727000102, -32.704766533999901 ], [ 17.97486412900011, -32.712172132999967 ], [ 17.986582879000082, -32.726983330999943 ], [ 18.037445509000122, -32.766778252999856 ], [ 18.080577019000145, -32.781345309999878 ], [ 18.118825717000078, -32.773044528999989 ], [ 18.15211022200009, -32.751234632999854 ], [ 18.273122592000078, -32.647556248000015 ], [ 18.296397332000083, -32.608575127999956 ], [ 18.310801629000139, -32.572849216999927 ], [ 18.334157748000052, -32.491306247999901 ], [ 18.337901238000086, -32.451592705999971 ], [ 18.333181186000076, -32.382012627999984 ], [ 18.327403191000116, -32.366143487999949 ], [ 18.315440300000091, -32.343682549999869 ], [ 18.321055535000085, -32.327325127999856 ], [ 18.344737175000091, -32.3007138 ], [ 18.349375847000118, -32.260349216999856 ], [ 18.310720248000081, -32.129489841999927 ], [ 18.299489780000073, -32.022637627999956 ], [ 18.281748894000089, -31.979180597 ], [ 18.275889519000145, -31.957452080999943 ], [ 18.278330925000063, -31.913750908999944 ], [ 18.276866082000112, -31.892673434999935 ], [ 18.265635613000114, -31.872328382999854 ], [ 18.253103061000104, -31.858330987999977 ], [ 18.24170983200014, -31.841403903999904 ], [ 18.235687696000127, -31.828057549999983 ], [ 18.234873894000117, -31.819105726999865 ], [ 18.235850457000112, -31.811130467 ], [ 18.234873894000117, -31.800469658999958 ], [ 18.213715040000125, -31.730645440999922 ], [ 18.19678795700014, -31.697360934999935 ], [ 18.172862175000091, -31.663262627999927 ], [ 18.126231316000087, -31.612237237999935 ], [ 18.118825717000078, -31.598077080999914 ], [ 18.116709832000083, -31.590590101999851 ], [ 18.071055535000141, -31.533461195999962 ], [ 18.023285352000102, -31.490411065999837 ], [ 18.015798373000024, -31.474867445999834 ], [ 18.009450717000107, -31.456638278999932 ], [ 17.994151238000143, -31.441338799999969 ], [ 17.961192254000082, -31.416192315999908 ], [ 17.922211134000094, -31.363946221999896 ], [ 17.893728061000076, -31.344821873 ], [ 17.883799675000091, -31.320082289999945 ], [ 17.871836785000141, -31.272881768999966 ], [ 17.859385613000114, -31.260349216999956 ], [ 17.818614129000053, -31.232110283999987 ], [ 17.809743686000104, -31.221612237999935 ], [ 17.80437259200005, -31.208591403999947 ], [ 17.750254754000082, -31.131931247999972 ], [ 17.745290561000047, -31.1288388 ], [ 17.735036655000101, -31.104261976999894 ], [ 17.731211785000085, -31.097832940999965 ], [ 17.718272332000083, -31.080661716999941 ], [ 17.697113477000073, -31.035821221999839 ], [ 17.686778191000087, -31.018975518999838 ], [ 17.617198113000086, -30.934014580999985 ], [ 17.561696811000104, -30.838067315999979 ], [ 17.55648847700013, -30.823825778999975 ], [ 17.548187696000127, -30.787204684999963 ], [ 17.535980665000068, -30.752129815999979 ], [ 17.477224155000073, -30.682386976999837 ], [ 17.450368686000076, -30.639092705999943 ], [ 17.45411217500012, -30.601250908999901 ], [ 17.429535352000102, -30.576755466999956 ], [ 17.373545769000145, -30.487237237999892 ], [ 17.364593946000127, -30.464043877999941 ], [ 17.346202019000089, -30.44451262799997 ], [ 17.281993035000141, -30.347751559999963 ], [ 17.277517123000081, -30.337579034 ], [ 17.274424675000091, -30.311700127999913 ], [ 17.265879754000082, -30.279961846999953 ], [ 17.261729363000143, -30.271661065999879 ], [ 17.259450717000078, -30.245049737999935 ], [ 17.20687910200013, -30.165297132999896 ], [ 17.193369988000143, -30.132012627999899 ], [ 17.189626498000109, -30.093031507999825 ], [ 17.166351759000122, -30.01287200299987 ], [ 17.103688998000109, -29.884942315999879 ], [ 17.097178582000112, -29.850844007999868 ], [ 17.094981316000116, -29.845879815999989 ], [ 17.090342644000089, -29.84075286299999 ], [ 17.08570397200009, -29.833754164999831 ], [ 17.083506707000083, -29.82333749799993 ], [ 17.082774285000141, -29.812758070999962 ], [ 17.056325717000078, -29.730401299999926 ], [ 17.062510613000143, -29.730401299999926 ], [ 17.057627800000063, -29.717461846999839 ], [ 17.057790561000047, -29.690606377999856 ], [ 17.056325717000078, -29.676446221999925 ], [ 17.031586134000094, -29.618829033999944 ], [ 17.032074415000096, -29.608168226999837 ], [ 17.018809441000144, -29.598728123 ], [ 17.011973504000139, -29.577080987999921 ], [ 17.007823113000086, -29.539239190999879 ], [ 16.978282097000118, -29.467868747999987 ], [ 16.970876498000052, -29.456719658999958 ], [ 16.933929884000094, -29.357679945999976 ], [ 16.929698113000086, -29.351250908999887 ], [ 16.910329623000052, -29.332777601999865 ], [ 16.906016472000147, -29.322930596999925 ], [ 16.903168165000125, -29.318291924999912 ], [ 16.884938998000052, -29.299004815999879 ], [ 16.863780144000117, -29.238702080999929 ], [ 16.858083530000044, -29.229587498000015 ], [ 16.847666863000143, -29.219903252999885 ], [ 16.843272332000083, -29.211358330999943 ], [ 16.844248894000145, -29.188409112999963 ], [ 16.840586785000113, -29.178887627999956 ], [ 16.831228061000076, -29.16383228999986 ], [ 16.822927280000101, -29.140720309999907 ], [ 16.819183790000068, -29.11728281 ], [ 16.82406660200013, -29.101006768999895 ], [ 16.808767123000081, -29.078301690999936 ], [ 16.744965040000125, -29.028741143999909 ], [ 16.73568769600007, -29.016208592 ], [ 16.72046959700009, -28.977634372999944 ], [ 16.712738477000102, -28.963962498 ], [ 16.66773522200009, -28.908623955999914 ], [ 16.600352410000085, -28.85751718500002 ], [ 16.589528842000107, -28.835870049999901 ], [ 16.579437696000127, -28.800388278999961 ], [ 16.573903842000107, -28.765069268999937 ], [ 16.576996290000096, -28.744235934999864 ], [ 16.572927280000044, -28.737562757999896 ], [ 16.56430097700013, -28.720310153999989 ], [ 16.56275475400011, -28.712823174999841 ], [ 16.558929884000094, -28.707614842000012 ], [ 16.550547722000118, -28.705824476999936 ], [ 16.541188998000081, -28.705254815999965 ], [ 16.53484134200005, -28.703220309999949 ], [ 16.513519727000102, -28.660902601999851 ], [ 16.497080925000091, -28.649346612999921 ], [ 16.471853061000047, -28.625420830999943 ], [ 16.469981316000059, -28.62004973799999 ], [ 16.480316602000073, -28.61353932099982 ], [ 16.486664259000094, -28.598809502999913 ], [ 16.488942905000073, -28.582940362999892 ], [ 16.487071160000113, -28.572930596499859 ], [ 16.5053796790001, -28.565387063999964 ], [ 16.531527954000097, -28.5496774289999 ], [ 16.559123169000088, -28.53706837999988 ], [ 16.59736372800009, -28.526216328999837 ], [ 16.673121378000076, -28.459760436999872 ], [ 16.68345666500008, -28.456246439999916 ], [ 16.6923450110001, -28.461104024000022 ], [ 16.696789185000085, -28.472472838999835 ], [ 16.699683065000073, -28.485185241999972 ], [ 16.703817180000101, -28.494487 ], [ 16.720456990000116, -28.496037292999915 ], [ 16.740404093000052, -28.480947774000015 ], [ 16.758387492000026, -28.459657084000028 ], [ 16.769342895000108, -28.442603862 ], [ 16.772133423000071, -28.425757344999838 ], [ 16.773373657000093, -28.402916361999914 ], [ 16.778541301000104, -28.382969258999907 ], [ 16.7932174070001, -28.374287617999855 ], [ 16.803862753000089, -28.366122741999916 ], [ 16.796834758000074, -28.347829284999861 ], [ 16.775544067000084, -28.319097187999859 ], [ 16.768412719000139, -28.303697610999961 ], [ 16.764381958000058, -28.283233743999816 ], [ 16.76872277800004, -28.265353698999945 ], [ 16.78649947100007, -28.257602233999847 ], [ 16.795181111000119, -28.261219584 ], [ 16.805102987000112, -28.267730814999894 ], [ 16.815231567000069, -28.270831399999935 ], [ 16.824636678000047, -28.264526875999834 ], [ 16.826600382000066, -28.251917825999897 ], [ 16.820812622000091, -28.240032246999874 ], [ 16.813267863000135, -28.229903665999828 ], [ 16.810270630000048, -28.222875671 ], [ 16.814301391000129, -28.213470560999937 ], [ 16.819779094000097, -28.209749856999849 ], [ 16.841069783000108, -28.209853210999952 ], [ 16.856366007000133, -28.206649271999979 ], [ 16.855952596000122, -28.19941457099992 ], [ 16.838382609000064, -28.179467467999913 ], [ 16.83569543400003, -28.174196471999963 ], [ 16.837659139000067, -28.168202005999859 ], [ 16.843756958000114, -28.163861184999874 ], [ 16.847787720000042, -28.165411478999985 ], [ 16.852025188000084, -28.168305358999973 ], [ 16.868664998000099, -28.167891947999962 ], [ 16.87383264200011, -28.171509297999947 ], [ 16.878173462000092, -28.172026061999972 ], [ 16.885511515000076, -28.162000833999869 ], [ 16.892952921000102, -28.082625833999899 ], [ 16.896466919000147, -28.079938659999954 ], [ 16.913520142000095, -28.062678730999963 ], [ 16.919617961000142, -28.058337910999811 ], [ 16.927472778000066, -28.060198261999815 ], [ 16.937498006000084, -28.071050312999859 ], [ 16.94752323400013, -28.072703958999895 ], [ 16.959512167000071, -28.068569843999882 ], [ 16.973774862000141, -28.055030618999989 ], [ 16.985350382000092, -28.052240091999849 ], [ 17.012015421000058, -28.058337910999811 ], [ 17.045398397000099, -28.036323751 ], [ 17.056663859000082, -28.031156106999916 ], [ 17.076404256000046, -28.026815286999934 ], [ 17.086532837000078, -28.027021992999892 ], [ 17.097798299000146, -28.031156106999916 ], [ 17.111750936000135, -28.046038919999944 ], [ 17.123223103000072, -28.066502787999909 ], [ 17.136348917000134, -28.084692891999865 ], [ 17.155779256000102, -28.092547708999987 ], [ 17.180894002000116, -28.09947235099996 ], [ 17.189989054000108, -28.116835631999976 ], [ 17.189782349000041, -28.139366556999917 ], [ 17.18709517400012, -28.162000833999869 ], [ 17.191952758000127, -28.208819681999969 ], [ 17.213140096000103, -28.232074075999904 ], [ 17.24517948400009, -28.237448424999869 ], [ 17.308638143000053, -28.224115904999849 ], [ 17.334476359000064, -28.222875671 ], [ 17.345741821000104, -28.227629902999979 ], [ 17.349772583000117, -28.238688658999905 ], [ 17.351219523000111, -28.251401061999942 ], [ 17.355043579000039, -28.261012877999875 ], [ 17.364138631000117, -28.273311868999912 ], [ 17.367032512000094, -28.283543802999972 ], [ 17.368066040000087, -28.293775735999873 ], [ 17.371993449000058, -28.30607472699991 ], [ 17.378918090000127, -28.316306660999985 ], [ 17.394834432000067, -28.335116881999895 ], [ 17.400002075000145, -28.346382344999867 ], [ 17.402069133000111, -28.367776386999878 ], [ 17.399692017000092, -28.395268248999855 ], [ 17.391320435000097, -28.418832702999936 ], [ 17.375404094000089, -28.428961282999989 ], [ 17.358557577000113, -28.43278533899985 ], [ 17.341194295000093, -28.442810566999867 ], [ 17.328171834000045, -28.456143086999887 ], [ 17.324244425000074, -28.470509134999972 ], [ 17.332409302000087, -28.488595885999985 ], [ 17.359487752000064, -28.519808451999978 ], [ 17.365275512000039, -28.54254608099987 ], [ 17.373026978000041, -28.559392597999846 ], [ 17.409613892000067, -28.571381529999897 ], [ 17.420569295000064, -28.593395690999884 ], [ 17.41426477100012, -28.632669778999855 ], [ 17.401759073000051, -28.674217630999848 ], [ 17.403619425000045, -28.704293314999902 ], [ 17.440929810000085, -28.709564310999852 ], [ 17.485164836000109, -28.700159199999888 ], [ 17.526609334000057, -28.695818379999906 ], [ 17.546969849000106, -28.691374206999811 ], [ 17.565986776000074, -28.683519388999869 ], [ 17.582936646000064, -28.68021209799987 ], [ 17.598026163000071, -28.689617206999912 ], [ 17.603400513000111, -28.710804544999974 ], [ 17.602573690000099, -28.735402526999948 ], [ 17.607121216000053, -28.755659687999952 ], [ 17.628721965000096, -28.764134622999876 ], [ 17.660968058000066, -28.772299499999889 ], [ 17.673783813000057, -28.771576028999803 ], [ 17.683395630000064, -28.767545267999978 ], [ 17.703239379000138, -28.755556334999937 ], [ 17.71409143000011, -28.751112161999842 ], [ 17.746337524000069, -28.748631692999865 ], [ 17.913252401000108, -28.78129119799992 ], [ 17.949529256000062, -28.794727070999883 ], [ 17.983325643000057, -28.813743997999936 ], [ 18.044097127000072, -28.858392434999885 ], [ 18.082441040000077, -28.875962422999862 ], [ 18.166466919000101, -28.901903990999983 ], [ 18.185070434000068, -28.902214050999888 ], [ 18.220727173000057, -28.891258646999901 ], [ 18.308680461000051, -28.879993183999858 ], [ 18.331004679000017, -28.881440123999852 ], [ 18.37306929500005, -28.895186055999972 ], [ 18.39756392400011, -28.898906758999971 ], [ 18.416994262000088, -28.891672057999912 ], [ 18.42474572800009, -28.887227884999916 ], [ 18.435701131000059, -28.8842306519999 ], [ 18.455234822000079, -28.881440123999852 ], [ 18.460712525000076, -28.879889831 ], [ 18.46939416500004, -28.874928893999879 ], [ 18.474975219000044, -28.87399871800001 ], [ 18.479419393000057, -28.876272480999845 ], [ 18.491615031000066, -28.886297708999948 ], [ 18.496162557000105, -28.888261412999896 ], [ 18.517659953000134, -28.882266946999962 ], [ 18.553936808000088, -28.864696960999893 ], [ 18.745656372000099, -28.839892272999862 ], [ 18.954532511000139, -28.866660664999927 ], [ 18.971172323000076, -28.880509948999972 ], [ 18.996390422000104, -28.915546569999989 ], [ 19.00693241400009, -28.926295267999919 ], [ 19.013960408000088, -28.92846567699992 ], [ 19.048997030000095, -28.93239308699998 ], [ 19.060055786000106, -28.935700377999979 ], [ 19.064706665000074, -28.939834492999822 ], [ 19.081656535000093, -28.959368183999828 ], [ 19.12020715400007, -28.957507832999823 ], [ 19.161548299000088, -28.945415547999914 ], [ 19.218495727000061, -28.918853860999988 ], [ 19.226660604000074, -28.911515808 ], [ 19.237616007000071, -28.895599466999982 ], [ 19.243713826000118, -28.891878763999884 ], [ 19.276580037000144, -28.889501647999921 ], [ 19.288362264000057, -28.883093769999803 ], [ 19.288879028000082, -28.871001484999908 ], [ 19.251568645000134, -28.814260762999893 ], [ 19.244954061000044, -28.792453307999949 ], [ 19.248571411000114, -28.771576028999803 ], [ 19.265934692000144, -28.742637226999918 ], [ 19.277303508000045, -28.729408059999841 ], [ 19.29001590900009, -28.719692890999809 ], [ 19.304485310000132, -28.718659361999826 ], [ 19.328359822000095, -28.735815938999878 ], [ 19.339005168000114, -28.737469583999925 ], [ 19.353474569000127, -28.731888528999988 ], [ 19.434606567000088, -28.71349171899999 ], [ 19.455070434000049, -28.705223489999867 ], [ 19.472433716000069, -28.692717793999961 ], [ 19.482872355000097, -28.678248392999933 ], [ 19.51170780400011, -28.598046568999848 ], [ 19.517805623000072, -28.589364928999885 ], [ 19.527417439000089, -28.585954283999953 ], [ 19.533721965000097, -28.582440286999983 ], [ 19.542196900000107, -28.564043476999984 ], [ 19.547571248000082, -28.55587860099989 ], [ 19.556459594000074, -28.546163430999854 ], [ 19.562350708000082, -28.538101908999863 ], [ 19.568758586000115, -28.531177265999958 ], [ 19.579197225000144, -28.525182799999854 ], [ 19.587982219000139, -28.522702331999966 ], [ 19.688337850000039, -28.515984394999933 ], [ 19.705597778000111, -28.508026224999966 ], [ 19.725338175000076, -28.494176940999921 ], [ 19.748075805000042, -28.48714894599999 ], [ 19.796341593000079, -28.484151712999889 ], [ 19.825590454000121, -28.476710306999877 ], [ 19.870342245000074, -28.440846862999919 ], [ 19.896697225000139, -28.427721048999871 ], [ 19.907859334000079, -28.426480814000016 ], [ 19.940208781000138, -28.430201516999844 ], [ 19.950544067000067, -28.42927134099989 ], [ 19.981653280000103, -28.422346699999906 ], [ 19.983203572000036, -28.392684427999853 ], [ 19.983203572000036, -28.353203632999907 ], [ 19.983203572000036, -28.297186380999889 ], [ 19.983203572000036, -28.241065774999853 ], [ 19.983203572000036, -28.185048522999836 ], [ 19.983100219000107, -28.12903127 ], [ 19.982996867000082, -28.072910664999867 ], [ 19.982996867000082, -28.016790059 ], [ 19.982996867000082, -27.960772806999984 ], [ 19.982996867000082, -27.904652200999848 ], [ 19.982996867000082, -27.848531595999987 ], [ 19.982996867000082, -27.79261769599999 ], [ 19.982996867000082, -27.736497090999862 ], [ 19.982996867000082, -27.680376485 ], [ 19.982893514000068, -27.624359232999979 ], [ 19.982893514000068, -27.568238626999843 ], [ 19.982893514000068, -27.512118021999981 ], [ 19.982893514000068, -27.456100768999875 ], [ 19.982893514000068, -27.400186868999882 ], [ 19.982893514000068, -27.344066263000016 ], [ 19.982893514000068, -27.287945657999884 ], [ 19.982790161000111, -27.231928405999867 ], [ 19.982686808000096, -27.175807799999902 ], [ 19.982686808000096, -27.119687193999866 ], [ 19.982686808000096, -27.063669941999848 ], [ 19.982686808000096, -27.00765268999983 ], [ 19.982686808000096, -26.951532083999879 ], [ 19.982686808000096, -26.895514831999861 ], [ 19.982583456000071, -26.839394225999897 ], [ 19.982583456000071, -26.783376973999978 ], [ 19.982583456000071, -26.727256367999843 ], [ 19.982583456000071, -26.671239115999825 ], [ 19.982583456000071, -26.615118509999874 ], [ 19.982480103000057, -26.559101257999856 ], [ 19.9823767500001, -26.503084005 ], [ 19.9823767500001, -26.446963399999973 ], [ 19.9823767500001, -26.390946146999866 ], [ 19.9823767500001, -26.33482554199982 ], [ 19.9823767500001, -26.278808287999894 ], [ 19.9823767500001, -26.222687682999847 ], [ 19.982273396000096, -26.166670430000011 ], [ 19.982273396000096, -26.110549824999879 ], [ 19.982273396000096, -26.054532571999857 ], [ 19.982273396000096, -25.998515319999839 ], [ 19.982273396000096, -25.942394713999889 ], [ 19.982170044000071, -25.886274108999842 ], [ 19.982066691000114, -25.830256856 ], [ 19.982066691000114, -25.774136250999874 ], [ 19.982066691000114, -25.718118997999852 ], [ 19.982066691000114, -25.662101745999834 ], [ 19.982066691000114, -25.618988071999965 ], [ 19.982066691000114, -25.606084492999898 ], [ 19.982066691000114, -25.549963887999866 ], [ 19.982066691000114, -25.493843282 ], [ 19.982066691000114, -25.437826029999982 ], [ 19.981963338000099, -25.381705423999847 ], [ 19.981963338000099, -25.325688172 ], [ 19.981963338000099, -25.269670918999893 ], [ 19.981963338000099, -25.21355031399986 ], [ 19.981963338000099, -25.157429708 ], [ 19.981963338000099, -25.101412455999977 ], [ 19.981963338000099, -25.045395201999867 ], [ 19.981859985000085, -24.989274596999905 ], [ 19.981756632000042, -24.933257343999898 ], [ 19.981756632000042, -24.877136738999852 ], [ 19.981756632000042, -24.821016132999901 ], [ 19.981756632000042, -24.764998880999883 ], [ 19.981446574000074, -24.752493183999974 ], [ 19.986407511000095, -24.768822936999825 ], [ 19.992918742000086, -24.775850931999926 ], [ 20.010488729000144, -24.78804656999985 ], [ 20.029298950000054, -24.815228372999925 ], [ 20.081078735000119, -24.852642109999891 ], [ 20.107847128000088, -24.880340677999826 ], [ 20.1189058840001, -24.887368672999926 ], [ 20.128414348000092, -24.889745787999956 ], [ 20.149084920000092, -24.890986022999911 ], [ 20.159316853000092, -24.893673196999927 ], [ 20.23569462100005, -24.936047870999857 ], [ 20.364885702000038, -25.033199564999947 ], [ 20.375531047000038, -25.046118672999867 ], [ 20.406846965000057, -25.107820332999921 ], [ 20.43392541500009, -25.146784362999909 ], [ 20.444777466000062, -25.168385110999964 ], [ 20.44322717300011, -25.183061217999963 ], [ 20.434442179000143, -25.199804381999826 ], [ 20.443847290000093, -25.213343606999899 ], [ 20.462450806000049, -25.223678893999903 ], [ 20.481674439000074, -25.230500182999862 ], [ 20.483534790000078, -25.256648456999869 ], [ 20.485498495000115, -25.263159687999931 ], [ 20.491803019000116, -25.269050801999839 ], [ 20.509889770000143, -25.277525736999934 ], [ 20.516401001000105, -25.283623555999895 ], [ 20.518571411000096, -25.293028666999945 ], [ 20.514850708000097, -25.299126484999903 ], [ 20.510406534000083, -25.3047075399999 ], [ 20.510509888000115, -25.312252298999965 ], [ 20.514644002000125, -25.319280292999963 ], [ 20.525082642000058, -25.332199401999972 ], [ 20.529216756000096, -25.340054220000013 ], [ 20.535831340000101, -25.371163430999971 ], [ 20.542239217000116, -25.382222188999975 ], [ 20.558775676000039, -25.392040710999936 ], [ 20.588024536000148, -25.404029642999987 ], [ 20.593605590000095, -25.413228046999819 ], [ 20.596912882000083, -25.432865091999929 ], [ 20.612002401000098, -25.431004739999935 ], [ 20.611382283000125, -25.439376322 ], [ 20.605904582000022, -25.451778665999882 ], [ 20.606628051000115, -25.462010599999957 ], [ 20.616549927000108, -25.466144713999967 ], [ 20.6256449790001, -25.462734069999954 ], [ 20.634429972000078, -25.457669778999886 ], [ 20.643525024000041, -25.457359720999989 ], [ 20.656547486000079, -25.467798359999932 ], [ 20.626885213000037, -25.484748229999937 ], [ 20.620373983000064, -25.500561218999934 ], [ 20.61851363100007, -25.528466492 ], [ 20.663368774000048, -25.564743346999876 ], [ 20.671430298000132, -25.591201680999959 ], [ 20.665229126000042, -25.601020202999919 ], [ 20.643318319000088, -25.613215840999942 ], [ 20.637943969000048, -25.620347187999883 ], [ 20.641044556000082, -25.631199238999926 ], [ 20.651379842000097, -25.634609883999943 ], [ 20.663058716000137, -25.63626352899982 ], [ 20.670810181000064, -25.642257994999923 ], [ 20.671430298000132, -25.653316751999938 ], [ 20.662748657000066, -25.674917500999911 ], [ 20.662852010000108, -25.685252786999826 ], [ 20.671016887000121, -25.6954847209999 ], [ 20.696545044000061, -25.70706024199994 ], [ 20.706880330000075, -25.714811705999935 ], [ 20.716698853000139, -25.73258839899988 ], [ 20.737782837000054, -25.798940937999987 ], [ 20.727137492000082, -25.818164570999926 ], [ 20.7265173750001, -25.827362975999918 ], [ 20.740056600000088, -25.823125507999961 ], [ 20.749978475000063, -25.818474628999823 ], [ 20.755766235000038, -25.818991393999951 ], [ 20.766928344000092, -25.830670266999917 ], [ 20.767135050000036, -25.834390970999848 ], [ 20.794110148000073, -25.893922220999826 ], [ 20.802791789000111, -25.980531921999855 ], [ 20.800518026000105, -26.052465514999895 ], [ 20.803928670000118, -26.071275735999905 ], [ 20.841445760000113, -26.131323750999826 ], [ 20.837931763000086, -26.146826680999837 ], [ 20.794730265000027, -26.2019137569999 ], [ 20.776230103000103, -26.240567727999903 ], [ 20.753285767000079, -26.276224466999892 ], [ 20.695511515000078, -26.341956887999856 ], [ 20.665952596000125, -26.391772969999977 ], [ 20.652103312000094, -26.407792663999842 ], [ 20.622544392000066, -26.427533059999902 ], [ 20.618203573000073, -26.439728698999915 ], [ 20.60528446400005, -26.493265482999945 ], [ 20.602287232000037, -26.52220428499983 ], [ 20.60528446400005, -26.547732441999955 ], [ 20.611485636000054, -26.559928079999878 ], [ 20.627712036000048, -26.580805358999854 ], [ 20.632362915000101, -26.595274759999882 ], [ 20.630709269000079, -26.618322448999848 ], [ 20.608901815000138, -26.686121927999864 ], [ 20.609211873000021, -26.716197611999931 ], [ 20.614689575000114, -26.753197936999968 ], [ 20.62481815600006, -26.789371438999822 ], [ 20.63866744000012, -26.816966653999913 ], [ 20.64486861200001, -26.824511413999957 ], [ 20.650553019000142, -26.82967905699995 ], [ 20.665642537000053, -26.839084168 ], [ 20.675461059000042, -26.850039570999812 ], [ 20.685692993000117, -26.8817689 ], [ 20.690757283000096, -26.891794128000029 ], [ 20.693547810000041, -26.889003600999885 ], [ 20.714941854000045, -26.875050964999986 ], [ 20.779434042000076, -26.848075866999949 ], [ 20.82604618300013, -26.818827006 ], [ 20.851884400000074, -26.806528014999969 ], [ 20.907694946000021, -26.800016783999908 ], [ 20.950172973000065, -26.816036478999862 ], [ 20.990377238000093, -26.838567402999885 ], [ 21.122462199000068, -26.86533579499995 ], [ 21.153468058000101, -26.864508971999925 ], [ 21.240594523000084, -26.841978047999987 ], [ 21.254857218000069, -26.841771341999859 ], [ 21.28286584500006, -26.844975280999833 ], [ 21.296921834000074, -26.844458515999975 ], [ 21.380844360000083, -26.823994648999829 ], [ 21.426629679000115, -26.822651061999863 ], [ 21.449470662000124, -26.826371764999962 ], [ 21.498666626000102, -26.846422220999912 ], [ 21.583932739000147, -26.848385924999945 ], [ 21.643360636000097, -26.86275197299986 ], [ 21.664547974000072, -26.863062031999846 ], [ 21.68718225100011, -26.855207213999904 ], [ 21.743819620000096, -26.820480651999873 ], [ 21.762319784000027, -26.804460957999989 ], [ 21.773378540000124, -26.78678761799999 ], [ 21.777512654000077, -26.76849416099985 ], [ 21.776479126000083, -26.749167174999982 ], [ 21.767487427000049, -26.704312031999905 ], [ 21.768727661000071, -26.688705748999865 ], [ 21.780613241000111, -26.678163756999979 ], [ 21.807278280000048, -26.66958546899987 ], [ 21.838800903000106, -26.664521178999806 ], [ 21.935849243000092, -26.663901061999923 ], [ 21.998997843000041, -26.650258484 ], [ 22.057702271000096, -26.617598978999851 ], [ 22.108138469000096, -26.571917011999929 ], [ 22.146172322000041, -26.51920705099991 ], [ 22.17831506400006, -26.439935404999872 ], [ 22.19743534400007, -26.404071959999925 ], [ 22.237742961000095, -26.366761575999888 ], [ 22.248284953000081, -26.346917826999899 ], [ 22.257276652000115, -26.340923360999952 ], [ 22.303165324000076, -26.333585305999875 ], [ 22.318771606000041, -26.328831074999883 ], [ 22.342852824000147, -26.317358906999871 ], [ 22.395046020000052, -26.271883645999907 ], [ 22.428842407000047, -26.226511738999974 ], [ 22.45085656800012, -26.210078633999913 ], [ 22.482585897000035, -26.204807637999977 ], [ 22.527957805000142, -26.213695983999813 ], [ 22.545114380000115, -26.207391458999979 ], [ 22.563821248000096, -26.181139830999939 ], [ 22.580254354000061, -26.146516621999851 ], [ 22.59151981600013, -26.133184101999831 ], [ 22.611156861000069, -26.120575052999897 ], [ 22.62086310300009, -26.111532484999913 ], [ 22.623249146000148, -26.109309590000024 ], [ 22.665003702000092, -26.051431985999912 ], [ 22.665830526000036, -26.039856465999961 ], [ 22.662109823, -26.029831237999929 ], [ 22.661593058000079, -26.020942891 ], [ 22.67223840300008, -26.012881367999924 ], [ 22.700660441000082, -26.003269551999921 ], [ 22.710478963000071, -25.996861673999888 ], [ 22.719367309000063, -25.984252624999954 ], [ 22.724224894000088, -25.967509459999818 ], [ 22.72722212700009, -25.943945006999897 ], [ 22.726808716000079, -25.921620788999846 ], [ 22.721641072000097, -25.90901173899999 ], [ 22.708825318000095, -25.891028339999835 ], [ 22.719470662000106, -25.874285176999962 ], [ 22.739521118000141, -25.858472187999965 ], [ 22.754713989000066, -25.843382669999883 ], [ 22.765462687000081, -25.826536152999907 ], [ 22.76411910000013, -25.820334980999831 ], [ 22.75791792800004, -25.805968932999917 ], [ 22.750889934000043, -25.796047058 ], [ 22.74499882000012, -25.79408335399998 ], [ 22.741174764000107, -25.790879413999917 ], [ 22.74045129400011, -25.777030130999862 ], [ 22.746445760000114, -25.75532602899986 ], [ 22.759778280000148, -25.734862161999899 ], [ 22.804426717000069, -25.687216490999859 ], [ 22.810214478000148, -25.677397968999884 ], [ 22.812798299000065, -25.667062682999969 ], [ 22.81496871000013, -25.652799987999813 ], [ 22.813418416000019, -25.641947936999856 ], [ 22.809594360000091, -25.633266296999892 ], [ 22.810834594000113, -25.625308125999837 ], [ 22.824373819000101, -25.615799661999944 ], [ 22.83336551900004, -25.606084492999898 ], [ 22.828714640000072, -25.595542499999851 ], [ 22.819206177000098, -25.584897155999855 ], [ 22.813418416000019, -25.575078632999976 ], [ 22.814038534000105, -25.566603697999881 ], [ 22.816829061000135, -25.558438822999946 ], [ 22.824683879000077, -25.543039245999879 ], [ 22.844630981000108, -25.481130879999952 ], [ 22.851348918000042, -25.471312356999888 ], [ 22.876773722000053, -25.462010599999957 ], [ 22.887625773000082, -25.450228372999945 ], [ 22.903645467000047, -25.4113676959999 ], [ 22.911913696000084, -25.399068704999863 ], [ 22.920491984000108, -25.390490416999839 ], [ 22.930930623000052, -25.384289244999849 ], [ 22.944779907000111, -25.378708190999916 ], [ 22.956148722000108, -25.372093606999925 ], [ 22.960282837000136, -25.364342142999831 ], [ 22.962556600000141, -25.355763854999807 ], [ 22.968034302000035, -25.346875507999883 ], [ 23.006998332000109, -25.310805358999971 ], [ 23.030666138000043, -25.299436543999889 ], [ 23.054540649000046, -25.30253712899993 ], [ 23.061155233000136, -25.310702005999858 ], [ 23.065496053000118, -25.320830586999904 ], [ 23.071697225000094, -25.32599823 ], [ 23.083892863000102, -25.319693705999896 ], [ 23.093401327000095, -25.312459004999837 ], [ 23.168538859000108, -25.280006204999907 ], [ 23.216081176000046, -25.267190449999916 ], [ 23.26569055100012, -25.263986510999942 ], [ 23.320364217000076, -25.273391621999821 ], [ 23.365942831000041, -25.289307962999843 ], [ 23.381445760000076, -25.292615253999841 ], [ 23.399222453000078, -25.29137502 ], [ 23.431985310000101, -25.280316263999808 ], [ 23.444904419000096, -25.278145852999984 ], [ 23.459270467000096, -25.282176615999902 ], [ 23.468158813000116, -25.290238138999982 ], [ 23.483455037000084, -25.311528828999968 ], [ 23.496580851000147, -25.324241230999917 ], [ 23.506606079000079, -25.330959166999861 ], [ 23.535854940000036, -25.343258157999898 ], [ 23.561073038000075, -25.357314147999915 ], [ 23.666699666000056, -25.432658385999886 ], [ 23.674244425000012, -25.442580261999964 ], [ 23.686750122000035, -25.454362486999884 ], [ 23.742664022000099, -25.469968769999923 ], [ 23.752069133000077, -25.477616882999982 ], [ 23.762301066000134, -25.498494160999968 ], [ 23.769019002000078, -25.507382506999889 ], [ 23.778320760000099, -25.512550150999985 ], [ 23.798577921000089, -25.518544616999833 ], [ 23.807466268000098, -25.523608906999897 ], [ 23.845396769000104, -25.569084166999858 ], [ 23.890665324000111, -25.598849791999939 ], [ 23.905754842000107, -25.61848683599996 ], [ 23.924771769000074, -25.629235533999989 ], [ 23.976448202000114, -25.617556660999924 ], [ 23.988023723000083, -25.619520364999943 ], [ 23.99825565600014, -25.625308125999837 ], [ 24.008694296000101, -25.633162943999949 ], [ 24.009624471000052, -25.641327818999883 ], [ 24.004250122000087, -25.649906107999826 ], [ 24.005697062000081, -25.654660338999818 ], [ 24.027091105000096, -25.65176645899983 ], [ 24.130960734000098, -25.626238301999976 ], [ 24.183463990000064, -25.62592824299999 ], [ 24.227699015000098, -25.648975931999956 ], [ 24.29673872900014, -25.72349334799982 ], [ 24.338906698000102, -25.751812031999904 ], [ 24.389239542000098, -25.759460143999974 ], [ 24.416731405000064, -25.753052265999926 ], [ 24.4367818610001, -25.745300801999932 ], [ 24.456728963000018, -25.743027038999827 ], [ 24.50085111700011, -25.757848433999925 ], [ 24.576721639000112, -25.783334655999951 ], [ 24.629638306000089, -25.816097512999875 ], [ 24.664984985000103, -25.823332213999933 ], [ 24.737952107000126, -25.815890807999988 ], [ 24.770714966000128, -25.822608743999936 ], [ 24.798620239000115, -25.829223326999923 ], [ 24.82890262900014, -25.826019388999867 ], [ 24.888537231000043, -25.811653340999868 ], [ 24.90838098200004, -25.804108580999824 ], [ 24.967912231000099, -25.762870787999987 ], [ 25.013284139000035, -25.743027038999827 ], [ 25.051731405000083, -25.737859395 ], [ 25.090282023000071, -25.743647154999977 ], [ 25.135963990000079, -25.756566263999986 ], [ 25.177821899000065, -25.763284199999831 ], [ 25.386491333000038, -25.743543802999952 ], [ 25.458424927000095, -25.71119435599995 ], [ 25.587254272000081, -25.619520364999943 ], [ 25.608855021000068, -25.559265644999968 ], [ 25.652837702000085, -25.46331855 ], [ 25.66352868700011, -25.439996438999884 ], [ 25.695464722000082, -25.309978535999861 ], [ 25.782901245000062, -25.131384784999838 ], [ 25.804915405000116, -25.064825540999848 ], [ 25.835197795000056, -25.016353047999957 ], [ 25.837058146000061, -24.979146015999959 ], [ 25.866203654000088, -24.918167826999976 ], [ 25.876745646000131, -24.886025084999957 ], [ 25.877262411000089, -24.845717468999823 ], [ 25.866927124000085, -24.772646992999952 ], [ 25.868374064000079, -24.748152363999893 ], [ 25.874058472000115, -24.7433981329999 ], [ 25.881706583000096, -24.742157897999874 ], [ 25.914676148000069, -24.73182261099987 ], [ 25.966042521000105, -24.733579610999939 ], [ 25.981132039000101, -24.726344909999881 ], [ 26.013584839000117, -24.704537455999855 ], [ 26.165910617000094, -24.660846194999891 ], [ 26.27878829000008, -24.628469745999965 ], [ 26.32571049000012, -24.622371927999922 ], [ 26.344520711000143, -24.624025573999958 ], [ 26.363537638000111, -24.628056334999954 ], [ 26.381624390000127, -24.629503274999948 ], [ 26.404001092000073, -24.632758067999873 ], [ 26.404362020000093, -24.632810566999865 ], [ 26.469474325000107, -24.571418965999882 ], [ 26.476812378000091, -24.559946797999871 ], [ 26.506061238000143, -24.488840026999853 ], [ 26.531175985000061, -24.458660990999931 ], [ 26.558357788000137, -24.438197122999966 ], [ 26.623470093000037, -24.39943979899995 ], [ 26.684086547000106, -24.34145884199998 ], [ 26.692923218000118, -24.326576028999952 ], [ 26.714007202000033, -24.315930683999866 ], [ 26.802270549000127, -24.289679055999926 ], [ 26.823251180000113, -24.278827005999887 ], [ 26.839167522000139, -24.26559783899998 ], [ 26.849709513000107, -24.248131204999851 ], [ 26.868933146000131, -24.160384622999814 ], [ 26.870896851000083, -24.115839537999989 ], [ 26.941176798000072, -23.850222676999834 ], [ 26.945000854000114, -23.823247578999897 ], [ 26.938127889000043, -23.80288706499995 ], [ 26.966601603000072, -23.755189718 ], [ 26.964542365000057, -23.747139969999822 ], [ 26.962054077000118, -23.737413024999881 ], [ 26.967170044000113, -23.718706155999897 ], [ 26.986548706000093, -23.686976826999967 ], [ 27.004170370000082, -23.645842386999988 ], [ 27.013833862000098, -23.638504333999904 ], [ 27.024272502000144, -23.6425350949999 ], [ 27.029853557000138, -23.654730732999909 ], [ 27.037605021000076, -23.665686135999891 ], [ 27.05476159600002, -23.666409606999977 ], [ 27.070057821000091, -23.656074319999959 ], [ 27.069437703000119, -23.641708272999878 ], [ 27.063133178000101, -23.624241638000015 ], [ 27.061531209000066, -23.604397887999923 ], [ 27.068404175000126, -23.607291767999911 ], [ 27.075225464000084, -23.611219176999981 ], [ 27.078326050000044, -23.602020772999893 ], [ 27.084113811000094, -23.596026305999956 ], [ 27.102510620000089, -23.583830667999933 ], [ 27.095792684000088, -23.583830667999933 ], [ 27.103750855000044, -23.571738382999868 ], [ 27.113362671000061, -23.564296975999937 ], [ 27.124421427000044, -23.56316009499993 ], [ 27.136720418000095, -23.570188089999846 ], [ 27.141164591000091, -23.55830250999982 ], [ 27.135686889000112, -23.551894632999876 ], [ 27.127418661000064, -23.545280049999874 ], [ 27.123077840000093, -23.532981057999919 ], [ 27.127418661000064, -23.525022887999953 ], [ 27.137650594000064, -23.523369241999916 ], [ 27.149122762000076, -23.527503356999929 ], [ 27.157184285000142, -23.536701761999851 ], [ 27.161525106000028, -23.529880472999892 ], [ 27.168966512000054, -23.52161224399994 ], [ 27.171446981000116, -23.515617777 ], [ 27.178681681000086, -23.523575947999959 ], [ 27.18663985200007, -23.527296650999887 ], [ 27.195631551000105, -23.527089945999919 ], [ 27.205656779000037, -23.523059183999933 ], [ 27.191497437000066, -23.503835550999909 ], [ 27.202504516000147, -23.492053323999912 ], [ 27.239711548000088, -23.48140797999983 ], [ 27.27810713700012, -23.46363128699997 ], [ 27.295573771000136, -23.451745706999944 ], [ 27.312006877000016, -23.437069599999873 ], [ 27.335571330000107, -23.40244639099987 ], [ 27.349989055000037, -23.391490986999969 ], [ 27.36120284000009, -23.42249684699999 ], [ 27.371331421000036, -23.417019143999923 ], [ 27.380839885000114, -23.405340270999858 ], [ 27.383733765000102, -23.399552510999882 ], [ 27.395826050000096, -23.394074808999804 ], [ 27.410502156000092, -23.389320576999978 ], [ 27.418460327000048, -23.391284280999841 ], [ 27.411122274000064, -23.405753681999869 ], [ 27.425178263000078, -23.412678324999931 ], [ 27.434996786000056, -23.406580505999969 ], [ 27.443161661000147, -23.395108336999954 ], [ 27.452670125000054, -23.385289814999894 ], [ 27.465692586000074, -23.380432230999887 ], [ 27.507240438000082, -23.379088643999907 ], [ 27.528841186000136, -23.37309417699997 ], [ 27.548891642000086, -23.360795186999852 ], [ 27.563671102000086, -23.342811787999864 ], [ 27.569355509000047, -23.320384215999951 ], [ 27.567753540000098, -23.313769632999964 ], [ 27.564911336000137, -23.305811461999909 ], [ 27.563309367000102, -23.299196878999823 ], [ 27.565893189000093, -23.296509703999973 ], [ 27.56961389200012, -23.294856058999841 ], [ 27.573076212000046, -23.290515237999855 ], [ 27.575246623000055, -23.284830830999908 ], [ 27.576073446000066, -23.279146422999958 ], [ 27.580414266000048, -23.263850198999904 ], [ 27.599224487000072, -23.244626565999965 ], [ 27.608009481000039, -23.216721292999988 ], [ 27.619171590000093, -23.217031350999889 ], [ 27.633434285000135, -23.223439229999926 ], [ 27.647128540000068, -23.227573343999936 ], [ 27.658755737000035, -23.223439229999926 ], [ 27.698443237000106, -23.193466898999887 ], [ 27.725728394000043, -23.221682229999857 ], [ 27.739164266000074, -23.227573343999936 ], [ 27.753633667000116, -23.220752053999988 ], [ 27.759421428000081, -23.211450296999871 ], [ 27.774200887000092, -23.173003030999922 ], [ 27.775751180000043, -23.172486266999883 ], [ 27.783295939000084, -23.16690521299995 ], [ 27.784587850000037, -23.165561624999981 ], [ 27.789290405000088, -23.163804626 ], [ 27.787378377000095, -23.159773864999835 ], [ 27.783037557000114, -23.155433043999935 ], [ 27.781022176000135, -23.152539163999947 ], [ 27.779058472000116, -23.147681579999901 ], [ 27.774614298000103, -23.140756936999864 ], [ 27.771720418000115, -23.13300547299994 ], [ 27.774200887000092, -23.125150654999828 ], [ 27.784949585000106, -23.127011006999837 ], [ 27.806446981000079, -23.128354593999973 ], [ 27.822259969000072, -23.122980245 ], [ 27.815748738000082, -23.104686787999867 ], [ 27.853782593000119, -23.095591735999804 ], [ 27.895537150000081, -23.07946868899991 ], [ 27.93005700700013, -23.057041117999916 ], [ 27.946076700000106, -23.029032491 ], [ 27.937911825000072, -22.986657815999891 ], [ 27.937498413000071, -22.963816832999967 ], [ 27.949177287000055, -22.953894957999893 ], [ 27.968400920000079, -22.951001077999905 ], [ 27.989381551000065, -22.943766377999935 ], [ 28.008295125000103, -22.934774677999897 ], [ 28.021834350000091, -22.926609802999877 ], [ 28.037440633000131, -22.911416930999934 ], [ 28.049739624000068, -22.891366474999899 ], [ 28.053977091000036, -22.869145609999947 ], [ 28.045398804000087, -22.847751565999857 ], [ 28.047155802000077, -22.836899515999903 ], [ 28.065759318000119, -22.82883799199999 ], [ 28.088807007000071, -22.822636820000014 ], [ 28.103689819000124, -22.816745706999924 ], [ 28.107720581000109, -22.810647887999963 ], [ 28.113198283000116, -22.795351663999909 ], [ 28.117435751000073, -22.78946055099999 ], [ 28.125600626000079, -22.785533141999849 ], [ 28.135625855000114, -22.783362731999858 ], [ 28.145857788000086, -22.779745381999874 ], [ 28.154952840000135, -22.771993915999872 ], [ 28.162497599000091, -22.758971455999927 ], [ 28.162704305000148, -22.751013284999871 ], [ 28.15970707200006, -22.743261819999944 ], [ 28.157743367000108, -22.73106618199985 ], [ 28.15970707200006, -22.718147074999933 ], [ 28.164668010000099, -22.708638610999856 ], [ 28.196190633000072, -22.671638284999901 ], [ 28.205492391000092, -22.66595387699995 ], [ 28.216344442000036, -22.663163349999977 ], [ 28.240684041000065, -22.660889586999971 ], [ 28.250554240000042, -22.65561859099985 ], [ 28.286831095000082, -22.61582773899984 ], [ 28.301817261000053, -22.60383880599997 ], [ 28.338559204000035, -22.584615172999861 ], [ 28.376851441000042, -22.575003357000028 ], [ 28.459378703000084, -22.569629006999975 ], [ 28.522475626000102, -22.584821878999989 ], [ 28.538495321000056, -22.580274352999879 ], [ 28.559837687000055, -22.563014424999977 ], [ 28.577562703000069, -22.560017191999876 ], [ 28.597199747000104, -22.56270436599999 ], [ 28.623864787000059, -22.562807718999835 ], [ 28.659004761000119, -22.551955667999962 ], [ 28.731351766000074, -22.513921813999943 ], [ 28.774759969000058, -22.501416116999934 ], [ 28.796774129000141, -22.49821217799996 ], [ 28.816824585000091, -22.492941181999853 ], [ 28.83119063400008, -22.482295836999938 ], [ 28.836771688000113, -22.463175556999943 ], [ 28.846590210000073, -22.44994639099987 ], [ 28.869379517000084, -22.448912861999887 ], [ 28.912529338000098, -22.453667093999968 ], [ 28.930409383000068, -22.440851338999892 ], [ 28.953457072000106, -22.400750426999977 ], [ 28.963378947000109, -22.392172138999868 ], [ 28.967926473000148, -22.380389912999959 ], [ 28.960226685000066, -22.310213316999977 ], [ 28.983739461000141, -22.281997985999837 ], [ 29.002756388000108, -22.26339447099997 ], [ 29.018052612000076, -22.2550228879999 ], [ 29.017845906000105, -22.250372008999847 ], [ 29.038723186000084, -22.223913675999853 ], [ 29.047818237000058, -22.220296325999868 ], [ 29.168844442000136, -22.213991800999949 ], [ 29.186621134000063, -22.207687275999845 ], [ 29.202795858000087, -22.194458108999854 ], [ 29.222071167000109, -22.182159117999902 ], [ 29.248219441000202, -22.179265238999918 ], [ 29.302893107000074, -22.190220641999986 ], [ 29.33152185000003, -22.192804463999977 ], [ 29.350073689000084, -22.186706645000015 ], [ 29.356946656000133, -22.190944111999983 ], [ 29.363251180000162, -22.192287699999952 ], [ 29.378030640000162, -22.192907816 ], [ 29.399528036000135, -22.182159117999902 ], [ 29.436114949000086, -22.163142190999935 ], [ 29.456888875000089, -22.158801370999953 ], [ 29.506911662000078, -22.170066832999908 ], [ 29.531819703000082, -22.17244394899987 ], [ 29.54251672400008, -22.162522073999952 ], [ 29.551043335000173, -22.145985615999876 ], [ 29.570163615000098, -22.141954853999962 ], [ 29.603960001000161, -22.145055439999922 ], [ 29.641063680000144, -22.129242451999914 ], [ 29.661424194000091, -22.12645192499987 ] ], [ [ 28.33644047000007, -28.684656269999877 ], [ 28.317216837000046, -28.700055846999945 ], [ 28.297063029000071, -28.706877136 ], [ 28.273911987000076, -28.709564310999852 ], [ 28.250864298000124, -28.707393899999857 ], [ 28.230710490000035, -28.69953908299992 ], [ 28.218116094000067, -28.700652075999983 ], [ 28.164047892000042, -28.705430196 ], [ 28.154952840000135, -28.702329609999879 ], [ 28.145030965000075, -28.714731953999944 ], [ 28.13169844500004, -28.729304707999816 ], [ 28.104103231000124, -28.765064799 ], [ 28.100899292000065, -28.770852559999895 ], [ 28.056560913000112, -28.812503763999914 ], [ 28.018733765000036, -28.856842142999866 ], [ 28.014496297000079, -28.864800313999922 ], [ 28.014806355000076, -28.872551778000016 ], [ 28.013566121000053, -28.878442890999835 ], [ 28.004677775000118, -28.880716654999944 ], [ 27.977495972000042, -28.880716654999944 ], [ 27.96623050900007, -28.875652363999876 ], [ 27.956928751000135, -28.865110371999904 ], [ 27.945043173000016, -28.855498555999986 ], [ 27.926232951000117, -28.853431497999921 ], [ 27.91166019700006, -28.860769550999834 ], [ 27.903598673000147, -28.87399871800001 ], [ 27.897294149000061, -28.889811705999918 ], [ 27.887992391000125, -28.904901224999918 ], [ 27.861327352000075, -28.915443216999975 ], [ 27.747432495000112, -28.908621928000017 ], [ 27.754770549000114, -28.925468444999908 ], [ 27.744073527000126, -28.933219909 ], [ 27.72831221500013, -28.937974140999984 ], [ 27.720147339000107, -28.945932311999869 ], [ 27.720043986000093, -28.959781594999839 ], [ 27.71901045700011, -28.967843119 ], [ 27.716685018000078, -28.973217468999962 ], [ 27.714462931000071, -28.976421406999947 ], [ 27.71337772600009, -28.979521992999892 ], [ 27.713326049000074, -28.98686004599989 ], [ 27.711672404000097, -28.990994160999989 ], [ 27.707641642000112, -28.990684101999832 ], [ 27.70288741100012, -28.989340514999867 ], [ 27.699063355000078, -28.990580749999978 ], [ 27.679736369000125, -29.015075377999949 ], [ 27.6674890540001, -29.026650898999989 ], [ 27.655035034000036, -29.031508483999829 ], [ 27.639170369000112, -29.035332539999942 ], [ 27.643769572000053, -29.044530944999863 ], [ 27.656275268000059, -29.055796406999917 ], [ 27.664956909000125, -29.065718281999821 ], [ 27.65860070800008, -29.066751810999804 ], [ 27.649350626000086, -29.070885925999917 ], [ 27.644389689000036, -29.07253957099995 ], [ 27.637516724000079, -29.065718281999821 ], [ 27.630747111000119, -29.07253957099995 ], [ 27.634479067000086, -29.09104054099987 ], [ 27.635604696000144, -29.096620789 ], [ 27.612970418000089, -29.133827819999908 ], [ 27.55571293200012, -29.195426126999863 ], [ 27.548478231000075, -29.198940124999822 ], [ 27.538246297000086, -29.202350768999935 ], [ 27.52816939300007, -29.207621764999871 ], [ 27.521503133000124, -29.216510110999977 ], [ 27.520986369000099, -29.226121927999898 ], [ 27.527239217000101, -29.249376322999822 ], [ 27.528892863000067, -29.260951842999944 ], [ 27.518919311000047, -29.268393248999885 ], [ 27.510686378000088, -29.270752952 ], [ 27.4698783770001, -29.282449238999902 ], [ 27.453290243000112, -29.291647643999809 ], [ 27.450293009000092, -29.299709166999889 ], [ 27.448329305000073, -29.322963562 ], [ 27.445848837000085, -29.331955260999948 ], [ 27.436133667000064, -29.343530781999888 ], [ 27.426831909000015, -29.347974954999984 ], [ 27.417633504000037, -29.350662129999932 ], [ 27.408641805000087, -29.357070006999876 ], [ 27.406264689000125, -29.363994649999952 ], [ 27.41029545100011, -29.369782408999839 ], [ 27.416186564000043, -29.375983582 ], [ 27.419080444000116, -29.383838398999856 ], [ 27.417633504000037, -29.396550801999989 ], [ 27.413706095000066, -29.402545267999841 ], [ 27.407091512000136, -29.406886087999823 ], [ 27.365543660000071, -29.446676940999922 ], [ 27.35448490400006, -29.462283222999957 ], [ 27.350247436000103, -29.480266621999945 ], [ 27.344873088000043, -29.484504089999902 ], [ 27.32141198700009, -29.483573913999933 ], [ 27.316037638000125, -29.487191263999918 ], [ 27.314073934000078, -29.498663430999855 ], [ 27.309112996000124, -29.509205424 ], [ 27.302498413000137, -29.518093769999922 ], [ 27.300306527000146, -29.520119603999945 ], [ 27.295677124000093, -29.524398294999926 ], [ 27.263120972000138, -29.541141459999892 ], [ 27.241830281000148, -29.548996277 ], [ 27.213718302000103, -29.554060566999809 ], [ 27.195838257000048, -29.562638854999918 ], [ 27.185709676000101, -29.565946145999916 ], [ 27.15635746300012, -29.568633320999865 ], [ 27.128142130000072, -29.57855519599994 ], [ 27.122767782000096, -29.581759134999913 ], [ 27.09041833500001, -29.611628112999938 ], [ 27.085870809000085, -29.614418639999897 ], [ 27.077705932000072, -29.611318053999952 ], [ 27.07512211100007, -29.605116882999965 ], [ 27.07202152500011, -29.599949238999869 ], [ 27.062203002000047, -29.600155944999912 ], [ 27.0568286540001, -29.60439341199988 ], [ 27.049180542000101, -29.620516458999859 ], [ 27.042359253000143, -29.628061218999818 ], [ 27.032954142000108, -29.616175638999877 ], [ 27.022412150000036, -29.616175638999877 ], [ 27.014867391000081, -29.625580749999841 ], [ 27.01445398000007, -29.641703796 ], [ 27.002154989000132, -29.666508483999948 ], [ 27.010216512000113, -29.669919127999961 ], [ 27.024530884000114, -29.680047709 ], [ 27.037656698000092, -29.686455586999955 ], [ 27.050989217000108, -29.696790873999973 ], [ 27.080134725000107, -29.735134785999989 ], [ 27.088661336000143, -29.750017598999847 ], [ 27.088661336000143, -29.750120950999872 ], [ 27.088764690000062, -29.750120950999872 ], [ 27.171350065000098, -29.92149529799994 ], [ 27.198835490000079, -29.978530782 ], [ 27.21795577000006, -29.998064472999843 ], [ 27.265911499000083, -30.033307800999822 ], [ 27.280174194000068, -30.053461607999893 ], [ 27.293713419000142, -30.10090057399988 ], [ 27.300431356000075, -30.114956562999808 ], [ 27.312782023000125, -30.131596373999827 ], [ 27.322032104000129, -30.134800312999971 ], [ 27.33443444800011, -30.132216491999969 ], [ 27.356655314000136, -30.132216491999969 ], [ 27.371951538000104, -30.135937194999897 ], [ 27.381356649000054, -30.142655130999913 ], [ 27.380529825000053, -30.152577005999916 ], [ 27.365543660000071, -30.165806172999822 ], [ 27.343684529000114, -30.212935078999919 ], [ 27.345544881000137, -30.241563821999989 ], [ 27.367817424000094, -30.295410664999835 ], [ 27.366163778000043, -30.311016946999871 ], [ 27.377015829000072, -30.312153828999882 ], [ 27.377707729000122, -30.312323768999988 ], [ 27.397634725000074, -30.317218118999861 ], [ 27.407814982000048, -30.318561705999826 ], [ 27.414842977000063, -30.317528176999843 ], [ 27.436030314000107, -30.309880065999863 ], [ 27.452101684000098, -30.310086770999916 ], [ 27.459388062000073, -30.316598001999978 ], [ 27.466726115000142, -30.341092630999938 ], [ 27.477474813000072, -30.356285501999963 ], [ 27.493184448000136, -30.367654316999861 ], [ 27.529668009000147, -30.382227070999917 ], [ 27.533363824000048, -30.393424839999966 ], [ 27.536592651000035, -30.403207701999918 ], [ 27.56274092600006, -30.425531920999887 ], [ 27.586822144000081, -30.454987486999968 ], [ 27.59012943500008, -30.463875833999893 ], [ 27.590646200000037, -30.472867532999942 ], [ 27.59229984500007, -30.48185923299998 ], [ 27.598604370000089, -30.49033416799989 ], [ 27.659530883000059, -30.530538431999915 ], [ 27.71353275600012, -30.583765156999959 ], [ 27.743608439000099, -30.600301614999964 ], [ 27.778438354000059, -30.609706726000013 ], [ 27.820399617000135, -30.614564310999853 ], [ 27.830424846000085, -30.613117370999859 ], [ 27.849545125000077, -30.604952493999932 ], [ 27.858226766000115, -30.603712259999895 ], [ 27.869802287000084, -30.607122904999912 ], [ 27.878277221000076, -30.612910663999898 ], [ 27.88613204000012, -30.619731953999946 ], [ 27.895640503000095, -30.626243183999918 ], [ 27.915587606000116, -30.63492482499997 ], [ 27.93656823800012, -30.640815938999879 ], [ 28.054700562000107, -30.649704284999984 ], [ 28.078781779000053, -30.658799335999959 ], [ 28.07898848500011, -30.639265644999952 ], [ 28.076508016000048, -30.623245950999902 ], [ 28.075836223000067, -30.607019551999898 ], [ 28.081572306000112, -30.586865742999919 ], [ 28.088031861000076, -30.577563984999983 ], [ 28.096351766000026, -30.572396341999891 ], [ 28.104878378000137, -30.568365579999892 ], [ 28.112836548000104, -30.562474466999973 ], [ 28.120846394000097, -30.553379415 ], [ 28.124257039000099, -30.547281595999948 ], [ 28.141206909000118, -30.500772805999915 ], [ 28.14244714300014, -30.49260793099991 ], [ 28.139243205000099, -30.482686055 ], [ 28.127564331000116, -30.465116068999848 ], [ 28.125393921000125, -30.457261250999906 ], [ 28.133248739000067, -30.44537567099988 ], [ 28.218204793000041, -30.38739471399991 ], [ 28.231433960000118, -30.373855488999851 ], [ 28.238461955000048, -30.352254739999879 ], [ 28.235774780000099, -30.32941375699987 ], [ 28.224095907000049, -30.320525410999949 ], [ 28.209419800000063, -30.314634297999859 ], [ 28.198464396000077, -30.301095072999956 ], [ 28.200634807000057, -30.282491555999826 ], [ 28.216034383000135, -30.267402038999919 ], [ 28.237015015000054, -30.256343282 ], [ 28.25530847200011, -30.249935403999956 ], [ 28.284712362000107, -30.246214700999957 ], [ 28.294375854000123, -30.242493997999858 ], [ 28.301300496000124, -30.236499531999911 ], [ 28.313702840000076, -30.220789895999857 ], [ 28.323004598000125, -30.214692076999896 ], [ 28.338662557000077, -30.201049499999982 ], [ 28.355596048000052, -30.17324002699992 ], [ 28.364087362000078, -30.159294941999931 ], [ 28.383879436000143, -30.14420542399985 ], [ 28.407960653000089, -30.140898131999933 ], [ 28.456226441000098, -30.14699595099999 ], [ 28.480927775000112, -30.139347839999914 ], [ 28.524335978000124, -30.116713561999958 ], [ 28.540562377000128, -30.113302916999857 ], [ 28.55730554200008, -30.114956562999808 ], [ 28.605881389000075, -30.131286315999844 ], [ 28.639677775000052, -30.131493020999983 ], [ 28.729491414000051, -30.101830749999898 ], [ 28.795637248000048, -30.089428404999865 ], [ 28.860026082000047, -30.066380716999902 ], [ 28.976298055000115, -29.999924824999852 ], [ 29.015786029000111, -29.978587462999911 ], [ 29.094120321000048, -29.936259459999931 ], [ 29.106315959000142, -29.931505227999949 ], [ 29.132774292000136, -29.924683939999809 ], [ 29.144246460000147, -29.919723002999859 ], [ 29.150654337000105, -29.911144713999832 ], [ 29.148277221000058, -29.901326191999857 ], [ 29.137321818000061, -29.882102558999918 ], [ 29.13515140800007, -29.86804657 ], [ 29.135771525000052, -29.859158222999895 ], [ 29.132980998000079, -29.852026874999865 ], [ 29.12037194800007, -29.843448588000015 ], [ 29.105799194000099, -29.825568541999871 ], [ 29.106315959000142, -29.80159067799994 ], [ 29.112310425000089, -29.77513234499996 ], [ 29.113599444000073, -29.752850734999953 ], [ 29.113757365000083, -29.750120950999872 ], [ 29.132412557000123, -29.720251972999861 ], [ 29.145073283000073, -29.691933288999863 ], [ 29.161299682000077, -29.666921894999959 ], [ 29.190341837000091, -29.646871439 ], [ 29.267339721000127, -29.626097513999966 ], [ 29.278605184000043, -29.613591817999875 ], [ 29.278398478000128, -29.597055358999881 ], [ 29.279948771000107, -29.581449076000027 ], [ 29.296278524000087, -29.571630553999967 ], [ 29.282015828000084, -29.556127623999956 ], [ 29.275142863000013, -29.532253112999967 ], [ 29.275198725000138, -29.528294891999934 ], [ 29.27550459800014, -29.50662160199991 ], [ 29.282739298000166, -29.48564097099991 ], [ 29.303823282000195, -29.4668307499999 ], [ 29.332038615000187, -29.455978698999857 ], [ 29.361804240000055, -29.447917174999944 ], [ 29.388159220000063, -29.437788594999816 ], [ 29.399528036000135, -29.430347188999889 ], [ 29.407899618000073, -29.421458841999964 ], [ 29.412550497000069, -29.410296732999925 ], [ 29.411878703000099, -29.395827330999907 ], [ 29.413739054000104, -29.380117696000013 ], [ 29.432239217000102, -29.356966654999852 ], [ 29.435908244000103, -29.34239390099998 ], [ 29.432807657000154, -29.336606139999915 ], [ 29.419475138000024, -29.325030618999875 ], [ 29.415030965000113, -29.318932799999914 ], [ 29.413997437000063, -29.311698098999855 ], [ 29.414927613000117, -29.296401875999891 ], [ 29.413997437000063, -29.290304056999929 ], [ 29.403868855000184, -29.268703307999871 ], [ 29.375963582000196, -29.235527037999859 ], [ 29.365008178000068, -29.200283711999958 ], [ 29.357463420000187, -29.183333841999954 ], [ 29.34371748900017, -29.169794616999894 ], [ 29.328059530000104, -29.159355976999862 ], [ 29.316845744000119, -29.147367044999896 ], [ 29.311781453000066, -29.089799498999952 ], [ 29.281395711000215, -29.078637389999912 ], [ 29.241398153000063, -29.077707213999872 ], [ 29.208428589000192, -29.068922220999966 ], [ 29.125953003000092, -28.992441100999983 ], [ 29.091536499000114, -28.978591816999938 ], [ 29.069005575000119, -28.973320820999987 ], [ 29.055776408000099, -28.965362649999932 ], [ 29.049988647000134, -28.952650248999973 ], [ 29.049678589000052, -28.933013203999863 ], [ 29.040531861000062, -28.922987975999931 ], [ 29.018982788000102, -28.913996275999892 ], [ 28.995418335000124, -28.908311868999931 ], [ 28.980845581000068, -28.909035339000027 ], [ 28.925861857000115, -28.859529316999982 ], [ 28.885657593000104, -28.79720753999986 ], [ 28.872841837000095, -28.783564960999854 ], [ 28.859013629000117, -28.772990447999859 ], [ 28.858785848000082, -28.772816262999839 ], [ 28.843696330000085, -28.764754740999848 ], [ 28.827936586000135, -28.759534324999919 ], [ 28.827159871000106, -28.759277037999937 ], [ 28.795947306000102, -28.754316100999816 ], [ 28.787679077000064, -28.748735045999979 ], [ 28.758636922000079, -28.700469257999956 ], [ 28.743857462000079, -28.689513854999987 ], [ 28.699519083000013, -28.688480326 ], [ 28.688977092000044, -28.674424336999977 ], [ 28.681742391000085, -28.633393249999855 ], [ 28.675644572000124, -28.613756205 ], [ 28.666549520000075, -28.597219747 ], [ 28.653217, -28.583060403999966 ], [ 28.634303426000088, -28.570761414000017 ], [ 28.619420614000063, -28.57241505899988 ], [ 28.562473185000073, -28.606521503999943 ], [ 28.542629435000094, -28.6107589719999 ], [ 28.403413127000078, -28.618923848999913 ], [ 28.382949260000089, -28.626468607999868 ], [ 28.363518921000036, -28.643625182999926 ], [ 28.33644047000007, -28.684656269999877 ] ] ] ] } } +] +} diff --git a/homebytwo/importers/tests/test_country.py b/homebytwo/importers/tests/test_country.py new file mode 100644 index 00000000..c8144f20 --- /dev/null +++ b/homebytwo/importers/tests/test_country.py @@ -0,0 +1,43 @@ +import pytest +from requests.exceptions import ConnectionError + +from ...routes.models import Country +from ..coutries import GEO_COUNTRIES_URL, import_country_geometries + +######### +# model # +######### + + +@pytest.mark.django_db +def test_country_str(): + country = Country.objects.last() + assert str(country) == country.name + + +################ +# countries.py # +################ + + +@pytest.mark.django_db +def test_import_country_geometries(mock_json_response): + Country.objects.all().delete() + url = GEO_COUNTRIES_URL + file = "countries.geojson" + mock_json_response(url, file) + + import_country_geometries() + + assert Country.objects.count() == 4 + countries = ["Yemen", "Switzerland", "Germany", "South Africa"] + for country in countries: + assert country in Country.objects.values_list("name", flat=True) + + +@pytest.mark.django_db +def test_import_country_geometries_connection_error(mock_connection_error): + url = GEO_COUNTRIES_URL + mock_connection_error(url) + with pytest.raises(ConnectionError): + import_country_geometries() diff --git a/homebytwo/routes/models/route.py b/homebytwo/routes/models/route.py index 48d33d0a..84d86673 100644 --- a/homebytwo/routes/models/route.py +++ b/homebytwo/routes/models/route.py @@ -371,10 +371,9 @@ def get_gpx_waypoints(self, start_time): # retrieve end_place GPX if self.end_place: gpx_end_place = self.end_place.get_gpx_waypoint( - route=self, line_location=0, start_time=start_time + route=self, line_location=1, start_time=start_time ) gpx_waypoints.append(gpx_end_place) - return gpx_waypoints def get_gpx_track(self, start_time): diff --git a/homebytwo/routes/tests/factories.py b/homebytwo/routes/tests/factories.py index 4539841f..138da734 100644 --- a/homebytwo/routes/tests/factories.py +++ b/homebytwo/routes/tests/factories.py @@ -107,8 +107,8 @@ class Meta: total_elevation_loss = Faker("random_int", min=0, max=5000) total_distance = Faker("random_int", min=1, max=5000) geom = fromfile(get_data_file_path("route.ewkb").as_posix()) - start_place = SubFactory(PlaceFactory, geom=Point(geom.coords[0])) - end_place = SubFactory(PlaceFactory, geom=Point(geom.coords[-1])) + start_place = SubFactory(PlaceFactory, geom=Point(geom.coords[0], srid=geom.srid)) + end_place = SubFactory(PlaceFactory, geom=Point(geom.coords[-1], srid=geom.srid)) data = read_json(load_data("route_data.json"), orient="records") diff --git a/homebytwo/routes/tests/test_gpx.py b/homebytwo/routes/tests/test_gpx.py index e1915867..afe1b7a1 100644 --- a/homebytwo/routes/tests/test_gpx.py +++ b/homebytwo/routes/tests/test_gpx.py @@ -3,7 +3,6 @@ from xml.dom import minidom from django.conf import settings -from django.contrib.gis.geos import Point from django.test import TestCase, override_settings from django.urls import reverse @@ -12,9 +11,9 @@ from mock import patch from ...utils.factories import AthleteFactory +from ...utils.tests import create_route_with_checkpoints from ..tasks import upload_route_to_garmin_task from ..utils import GARMIN_ACTIVITY_TYPE_MAP -from .factories import PlaceFactory, RouteFactory CURRENT_DIR = dirname(realpath(__file__)) @@ -142,22 +141,9 @@ class GPXTestCase(TestCase): def setUp(self): self.athlete = AthleteFactory(user__password="testpassword") self.client.login(username=self.athlete.user.username, password="testpassword") - self.route = RouteFactory(athlete=self.athlete) - - # add checkpoints to the route - number_of_checkpoints = 9 - for index in range(1, number_of_checkpoints + 1): - line_location = index / (number_of_checkpoints + 1) - place = PlaceFactory( - geom=Point( - *self.route.geom.coords[ - int(self.route.geom.num_coords * line_location) - ] - ) - ) - self.route.places.add( - place, through_defaults={"line_location": line_location} - ) + self.route = create_route_with_checkpoints( + number_of_checkpoints=9, athlete=self.athlete + ) def test_gpx_no_start_no_end_no_checkpoints(self): self.route.calculate_projected_time_schedule(self.athlete.user) @@ -181,26 +167,6 @@ def test_gpx_success(self): self.assertEqual(len(waypoints), self.route.places.count() + 2) self.assertEqual(len(trackpoints), len(self.route.data.index)) - def test_download_route_gpx_view(self): - wpt_xml = '' - xml_start_place = wpt_xml.format(*self.route.start_place.get_coords()) - xml_end_place = wpt_xml.format(*self.route.end_place.get_coords()) - xml_waypoints = [ - wpt_xml.format(*place.get_coords()) for place in self.route.places.all() - ] - xml_segment_name = "{}".format(self.route.name) - - url = reverse("routes:gpx", kwargs={"pk": self.route.pk}) - response = self.client.get(url) - file_content = b"".join(response.streaming_content).decode("utf-8") - - for xml_waypoint in xml_waypoints: - self.assertIn(xml_waypoint, file_content) - - self.assertIn(xml_start_place, file_content) - self.assertIn(xml_end_place, file_content) - self.assertIn(xml_segment_name, file_content) - def test_download_route_gpx_other_athlete_view(self): second_athlete = AthleteFactory(user__password="123456") self.client.login(username=second_athlete.user.username, password="123456") @@ -331,3 +297,19 @@ def test_garmin_delete_failure(self): response = upload_route_to_garmin_task(self.route.pk, self.athlete.id) self.assertIn("Failed to delete activity", response) + + +def test_download_route_gpx_view(athlete, client): + route = create_route_with_checkpoints(number_of_checkpoints=5, athlete=athlete) + wpt_xml = '' + xml_waypoints = [ + wpt_xml.format(*place.get_coords()) for place in route.places.all() + ] + xml_segment_name = "{}".format(route.name) + + url = route.get_absolute_url(action="gpx") + response = client.get(url) + file_content = b"".join(response.streaming_content).decode("utf-8") + assert xml_segment_name in file_content + for xml_waypoint in xml_waypoints: + assert xml_waypoint in file_content diff --git a/homebytwo/routes/tests/test_route.py b/homebytwo/routes/tests/test_route.py index 7914725d..420c9a18 100644 --- a/homebytwo/routes/tests/test_route.py +++ b/homebytwo/routes/tests/test_route.py @@ -102,7 +102,9 @@ def test_get_start_altitude(self): route = RouteFactory.build( data=data, total_distance=1000, - geom=LineString(((500000.0, 300000.0), (501000.0, 300000.0)), srid=21781), + geom=LineString( + ((500000.0, 300000.0), (501000.0, 300000.0)), srid=21781 + ).transform(3857, clone=True), ) start_altitude = route.get_start_altitude() end_altitude = route.get_end_altitude() @@ -126,16 +128,19 @@ def test_get_distance_data(self): def test_get_start_and_end_places(self): route = RouteFactory.build() - PlaceFactory(name="Start_Place", geom="POINT(%s %s)" % route.geom[0]) - PlaceFactory(name="End_Place", geom="POINT(%s %s)" % route.geom[-1]) + route.start_place.name = "Start Place" + route.start_place.save() + route.end_place.name = "End Place" + route.end_place.save() + start_place = route.get_closest_places_along_line()[0] end_place = route.get_closest_places_along_line(1)[0] self.assertEqual(start_place.distance_from_line.m, 0) - self.assertEqual(start_place.name, "Start_Place") + self.assertEqual(start_place.name, "Start Place") self.assertEqual(end_place.distance_from_line.m, 0) - self.assertEqual(end_place.name, "End_Place") + self.assertEqual(end_place.name, "End Place") @override_settings( STRAVA_ROUTE_URL="https://strava_route_url/%d", @@ -493,51 +498,33 @@ def test_find_additional_places(athlete, switzerland_mobility_data_from_json): PlaceFactory( name="Sur Frête", - geom=Point(x=565586.0225000009, y=112197.4462499991, srid=21781), - ) - PlaceFactory( - name="Noudane Dessus", - geom=Point(x=565091.2349999994, y=111464.0387500003, srid=21781), + geom=Point(x=778472.6635249017, y=5806086.097085138, srid=3857), ) PlaceFactory( name="Col du Jorat", - geom=Point(x=564989.3350000009, y=111080.0012499988, srid=21781), - ) - PlaceFactory( - name="Saut Peca", - geom=Point(x=564026.3412499987, y=110762.4175000004, srid=21781), + geom=Point(x=777622.1292536028, y=5804465.781388815, srid=3857), ) PlaceFactory( name="Haute Cime", - geom=Point(x=560188.0975000001, y=112309.0137500018, srid=21781), + geom=Point(x=770692.9180045408, y=5806199.473715298, srid=3857), ) PlaceFactory( name="Col des Paresseux", - geom=Point(x=560211.875, y=112011.8737500012, srid=21781), + geom=Point(x=770730.0014088114, y=5805770.126578271, srid=3857), ) PlaceFactory( name="Col de Susanfe", - geom=Point(x=559944.7375000007, y=110888.6424999982, srid=21781), - ) - PlaceFactory( - name="Cabane de Susanfe CAS", - geom=Point(x=558230.2575000003, y=109914.8912499994, srid=21781), - ) - PlaceFactory( - name="Pas d'Encel", - geom=Point(x=556894.5662500001, y=110045.9137500003, srid=21781), - ) - PlaceFactory( - name="Refuge de Bonaveau", - geom=Point(x=555775.7837500013, y=111198.6625000015, srid=21781), + geom=Point(x=770355.7793282912, y=5804143.91778818, srid=3857), ) checkpoints = route.find_possible_checkpoints(max_distance=100) + checkpoint_names = [checkpoint.place.name for checkpoint in checkpoints] - assert len(checkpoints) == 12 - for checkpoint in checkpoints: - assert not checkpoint.line_location == 0 - assert not checkpoint.line_location == 1 + assert len(checkpoints) == 6 + assert checkpoint_names.count("Col des Paresseux") == 2 + assert "Haute Cime" in [checkpoint.place.name for checkpoint in checkpoints] + assert route.start_place.name not in checkpoint_names + assert route.end_place.name not in checkpoint_names def test_calculate_step_distances(): @@ -886,9 +873,7 @@ def test_get_checkpoints_list_empty(athlete, client): assert not response.json()["checkpoints"] -def test_get_checkpoints_list( - athlete, client, switzerland_mobility_data_from_json -): +def test_get_checkpoints_list(athlete, client, switzerland_mobility_data_from_json): number_of_checkpoints = 20 geom = LineString([(x, 0) for x in range(number_of_checkpoints + 2)]) route = RouteFactory(athlete=athlete, start_place=None, end_place=None, geom=geom) diff --git a/homebytwo/utils/tests.py b/homebytwo/utils/tests.py index 1321c413..f40248a1 100644 --- a/homebytwo/utils/tests.py +++ b/homebytwo/utils/tests.py @@ -3,7 +3,8 @@ from django.forms import model_to_dict from homebytwo.routes.forms import RouteForm -from homebytwo.routes.tests.factories import PlaceFactory +from homebytwo.routes.models import Place +from homebytwo.routes.tests.factories import PlaceFactory, RouteFactory def open_data(file, dir_path, binary=True): @@ -31,6 +32,18 @@ def create_checkpoints_from_geom(geom, number_of_checkpoints): return checkpoints_data +def create_route_with_checkpoints(number_of_checkpoints, *args, **kwargs): + route = RouteFactory(*args, **kwargs) + checkpoints_data = create_checkpoints_from_geom(route.geom, number_of_checkpoints) + for checkpoint_data in checkpoints_data: + pk, line_location = checkpoint_data.split("_") + place = Place.objects.get(pk=pk) + route.places.add( + place, through_defaults={"line_location": line_location} + ) + return route + + def get_route_post_data(route, activity_type=1): post_data = {"activity_type": activity_type} for key, value in model_to_dict(route, fields=RouteForm.Meta.fields).items(): From 4c060c74116dcd38214455c0ec0a14156219fdc9 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Sun, 8 Nov 2020 17:06:06 +0200 Subject: [PATCH 15/21] HB2-66 django doctor fixes --- homebytwo/routes/models/country.py | 2 +- homebytwo/routes/models/place.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homebytwo/routes/models/country.py b/homebytwo/routes/models/country.py index 15cc4cfe..1e086565 100644 --- a/homebytwo/routes/models/country.py +++ b/homebytwo/routes/models/country.py @@ -9,7 +9,7 @@ class Country(models.Model): iso3 = models.CharField(max_length=3, primary_key=True) iso2 = models.CharField(max_length=2) name = models.CharField(max_length=250) - geom = models.MultiPolygonField(srid=4326) + geom = models.MultiPolygonField() def __str__(self): return self.name diff --git a/homebytwo/routes/models/place.py b/homebytwo/routes/models/place.py index 00eb1551..0e77f871 100644 --- a/homebytwo/routes/models/place.py +++ b/homebytwo/routes/models/place.py @@ -85,7 +85,7 @@ class Place(TimeStampedModel): on_delete="SET_NULL", ) geom = models.PointField(srid=3857) - altitude = models.FloatField(null=True) + altitude = models.FloatField(null=True, blank=True) class Meta: # The pair 'data_source' and 'source_id' should be unique together. From 190f455b3e1c2f656f0456d08a9739cd7a97e256 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Sun, 8 Nov 2020 17:12:01 +0200 Subject: [PATCH 16/21] HB2-66 update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 369d4e9b..8af7569b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,11 @@ # Change Log +## [0.13.0] - 2020-11-08 import places from geonames.org +- Places can be imported from geonames.org for any country +- Import SwissNAMES3D from CSV file instead of shapefile +- Use a worldwide geometric projection SRID 3857 +- New country model to locate places and routes +- Add a country field to places + ## [0.12.1] - 2020-10-23 Remove extreme gradient values from imported routes - Routes from Strava now have a much more realistic schedule From fb061f133f35b5260b89ca4ef15d28e5cdf3f324 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Sun, 8 Nov 2020 17:25:28 +0200 Subject: [PATCH 17/21] HB2-66 fix imports --- homebytwo/importers/swissnames3d.py | 1 + homebytwo/importers/utils.py | 4 ++-- homebytwo/routes/models/__init__.py | 2 +- homebytwo/routes/tests/factories.py | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 642025cd..5dad736f 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -4,6 +4,7 @@ from zipfile import ZipFile from django.contrib.gis.geos import Point + from requests import ConnectionError, HTTPError from ..routes.models import Country diff --git a/homebytwo/importers/utils.py b/homebytwo/importers/utils.py index 1a37e961..9e894e85 100644 --- a/homebytwo/importers/utils.py +++ b/homebytwo/importers/utils.py @@ -1,6 +1,6 @@ import csv -from tempfile import TemporaryFile from io import TextIOWrapper +from tempfile import TemporaryFile from typing import Iterator from zipfile import ZipFile @@ -12,7 +12,7 @@ from requests.exceptions import ConnectionError from tqdm import tqdm -from ..routes.models import Place, PlaceType, Route, Country +from ..routes.models import Country, Place, PlaceType, Route from ..routes.models.place import PlaceTuple from .exceptions import SwitzerlandMobilityError, SwitzerlandMobilityMissingCredentials diff --git a/homebytwo/routes/models/__init__.py b/homebytwo/routes/models/__init__.py index f979a494..ea1c563c 100644 --- a/homebytwo/routes/models/__init__.py +++ b/homebytwo/routes/models/__init__.py @@ -1,8 +1,8 @@ from .activity import Activity, ActivityPerformance, ActivityType, Gear # NOQA from .athlete import Athlete # NOQA +from .country import Country # NOQA from .event import WebhookTransaction # NOQA from .place import Checkpoint, Place, PlaceType # NOQA -from .country import Country # NOQA from .track import Track # NOQA # isort:skip from .route import Route, RouteManager # NOQA # isort:skip diff --git a/homebytwo/routes/tests/factories.py b/homebytwo/routes/tests/factories.py index 138da734..03fb5e06 100644 --- a/homebytwo/routes/tests/factories.py +++ b/homebytwo/routes/tests/factories.py @@ -9,7 +9,6 @@ from pandas import DataFrame, read_json from pytz import utc -from ..models import Country from ...routes.models import ( Activity, ActivityPerformance, @@ -21,6 +20,7 @@ WebhookTransaction, ) from ...utils.factories import AthleteFactory, get_field_choices +from ..models import Country COUNTRIES = ["CH", "DE", "FR", "IT"] From 6f63dc3ff6bd49d0339b8fa4e80596c1b6ef81ff Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Sun, 8 Nov 2020 20:29:16 +0200 Subject: [PATCH 18/21] HB2-66 from 10 minutes to 5 secondas --- .../migrations/0053_migrate_to_3857_srid.py | 89 ++----------------- 1 file changed, 8 insertions(+), 81 deletions(-) diff --git a/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py b/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py index 2e955794..04d3a81b 100644 --- a/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py +++ b/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py @@ -1,45 +1,6 @@ # Generated by Django 2.2.17 on 2020-11-05 15:36 import django.contrib.gis.db.models.fields -from django.db import migrations, router -from tqdm import tqdm - - -class RunUpdateSRID(migrations.RunPython): - """ - Monkey patch migrations.RunPython for the sake of DRY. - This operation is not reversible. - """ - def __init__(self, *args, **kwargs): - self.model = kwargs.pop("model") - self.new_srid = kwargs.pop("new_srid") - code = migrate_geom_to_new_srid - super().__init__(code, *args, **kwargs) - - def database_forwards(self, app_label, schema_editor, from_state, to_state): - from_state.clear_delayed_apps_cache() - if router.allow_migrate( - schema_editor.connection.alias, app_label, **self.hints - ): - self.code( - from_state.apps, - schema_editor, - self.model, - self.new_srid, - ) - - -def migrate_geom_to_new_srid(apps, schema_editor, model, new_srid): - print(f"migrating {model} to srid: {new_srid}...") - - Model = apps.get_model("routes", model) - for instance in tqdm( - Model.objects.all(), - total=Model.objects.count(), - unit=model + "s", - unit_scale=True, - ): - instance.geom = instance.old_geom.transform(new_srid, clone=True) - instance.save() +from django.db import migrations class Migration(migrations.Migration): @@ -49,54 +10,20 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RenameField( - model_name="route", - old_name="geom", - new_name="old_geom", - ), - migrations.AddField( - model_name="route", - name="geom", - field=django.contrib.gis.db.models.fields.LineStringField( - null=True, srid=3857 - ), - ), - migrations.RenameField( - model_name="place", - old_name="geom", - new_name="old_geom", + migrations.RunSQL( + "SELECT UpdateGeometrySRID('routes_place','geom',3857);", ), - migrations.AddField( - model_name="place", - name="geom", - field=django.contrib.gis.db.models.fields.PointField(null=True, srid=3857), - ), - RunUpdateSRID( - model="route", - new_srid=3857, + migrations.RunSQL( + "SELECT UpdateGeometrySRID('routes_route','geom',3857);", ), - RunUpdateSRID( - model="place", - new_srid=3857, - ), - migrations.RemoveField( + migrations.AlterField( model_name="route", - name="old_geom", - ), - migrations.RemoveField( - model_name="place", - name="old_geom", + name="geom", + field=django.contrib.gis.db.models.fields.LineStringField(srid=3857), ), migrations.AlterField( model_name="place", name="geom", field=django.contrib.gis.db.models.fields.PointField(srid=3857), ), - migrations.AlterField( - model_name="route", - name="geom", - field=django.contrib.gis.db.models.fields.LineStringField( - srid=3857, verbose_name="line geometry" - ), - ), ] From e7ae73ea4f3a69c4560406ad3e53ef2e91d45bdc Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 9 Nov 2020 07:19:40 +0200 Subject: [PATCH 19/21] HB2-66 migrate geoms as well --- .../routes/migrations/0053_migrate_to_3857_srid.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py b/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py index 04d3a81b..96c43d90 100644 --- a/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py +++ b/homebytwo/routes/migrations/0053_migrate_to_3857_srid.py @@ -11,10 +11,18 @@ class Migration(migrations.Migration): operations = [ migrations.RunSQL( - "SELECT UpdateGeometrySRID('routes_place','geom',3857);", + """ + ALTER TABLE routes_place + ALTER COLUMN geom TYPE geometry(POINT, 3857) + USING ST_Transform(ST_SetSRID(geom, 21781), 3857); + """ ), migrations.RunSQL( - "SELECT UpdateGeometrySRID('routes_route','geom',3857);", + """ + ALTER TABLE routes_route + ALTER COLUMN geom TYPE geometry(LINESTRING, 3857) + USING ST_Transform(ST_SetSRID(geom, 21781), 3857); + """ ), migrations.AlterField( model_name="route", From 374d0b8bacbd174f1a5126ad2fea928043cbe9dc Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 9 Nov 2020 07:32:17 +0200 Subject: [PATCH 20/21] fabfile typo --- fabfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index c2287bdd..63642551 100644 --- a/fabfile.py +++ b/fabfile.py @@ -369,7 +369,7 @@ def fetch_media(): """ sync local media folder with remote data """ - # absolute media root on remote environement + # absolute media root on remote environment with cd(get_project_root()), quiet(): remote_media_root = run("cat envdir/MEDIA_ROOT") From dd289b98dd6e625f127bb96f67ee7d299f44d462 Mon Sep 17 00:00:00 2001 From: Cedric Hofstetter Date: Mon, 9 Nov 2020 07:55:26 +0200 Subject: [PATCH 21/21] HB2-66 add source info during places import --- homebytwo/importers/geonames.py | 4 ++-- homebytwo/importers/swissnames3d.py | 4 ++-- homebytwo/importers/tests/test_import_places.py | 6 +++--- homebytwo/importers/utils.py | 6 ++++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/homebytwo/importers/geonames.py b/homebytwo/importers/geonames.py index 42f60621..fdbde40b 100644 --- a/homebytwo/importers/geonames.py +++ b/homebytwo/importers/geonames.py @@ -24,7 +24,6 @@ def import_places_from_geonames( see https://www.geonames.org/countries/), e.g. `CH` or `allCountries` :param file: path to local unzipped file. If provided, the `scope` parameter will be ignored and the local file will be used. - :param update: should existing places be updated with the downloaded data. """ try: file = file or get_geonames_remote_file(scope) @@ -36,8 +35,9 @@ def import_places_from_geonames( with file: count = get_csv_line_count(file, header=False) data = parse_places_from_csv(file) + source_info = f"geonames.org {scope}" - return save_places_from_generator(data, count) + return save_places_from_generator(data, count, source_info) def get_geonames_remote_file(scope: str = "allCountries") -> TextIOWrapper: diff --git a/homebytwo/importers/swissnames3d.py b/homebytwo/importers/swissnames3d.py index 5dad736f..ea4fbe6e 100644 --- a/homebytwo/importers/swissnames3d.py +++ b/homebytwo/importers/swissnames3d.py @@ -66,7 +66,6 @@ def import_places_from_swissnames3d( see http://mapref.org/CoordinateReferenceFrameChangeLV03.LV95.html#Zweig1098 :param file: path to local unzipped file. if provided, the `projection` parameter will be ignored. - :param update: should existing places be updated with the downloaded data. """ try: file = file or get_swissnames3d_remote_file(projection=projection) @@ -78,8 +77,9 @@ def import_places_from_swissnames3d( with file: count = get_csv_line_count(file, header=True) data = parse_places_from_csv(file, projection=projection) + source_info = f"SwissNAMES3D {projection}" - return save_places_from_generator(data=data, count=count) + return save_places_from_generator(data, count, source_info) def get_swissnames3d_remote_file(projection: str = "LV95") -> TextIOWrapper: diff --git a/homebytwo/importers/tests/test_import_places.py b/homebytwo/importers/tests/test_import_places.py index fb9125e6..6fc2e72e 100644 --- a/homebytwo/importers/tests/test_import_places.py +++ b/homebytwo/importers/tests/test_import_places.py @@ -78,7 +78,7 @@ def test_save_places_from_generator(): for place in places ) msg = "Created 20 new places and updated 5 places. " - assert save_places_from_generator(data, count=20) == msg + assert save_places_from_generator(data, count=20, source_info="test_source") == msg assert Place.objects.count() == 25 @@ -87,7 +87,7 @@ def test_save_places_from_generator_empty(): places = [] data = (place for place in places) msg = "Created 0 new places and updated 0 places. " - assert save_places_from_generator(data, count=0) == msg + assert save_places_from_generator(data, count=0, source_info="test_source") == msg assert Place.objects.count() == 0 @@ -111,7 +111,7 @@ def test_save_places_from_generator_bad_place_type(capsys): for place in [place] ) msg = "Created 0 new places and updated 0 places. " - assert save_places_from_generator(data, count=1) == msg + assert save_places_from_generator(data, count=1, source_info="test_source") == msg captured = capsys.readouterr() assert "Place type code: BADCODE does not exist.\n" in captured.out assert Place.objects.count() == 0 diff --git a/homebytwo/importers/utils.py b/homebytwo/importers/utils.py index 9e894e85..7cfe4730 100644 --- a/homebytwo/importers/utils.py +++ b/homebytwo/importers/utils.py @@ -146,7 +146,9 @@ def get_csv_line_count(csv_file: TextIOWrapper, header: bool) -> int: return max(count - int(header), 0) -def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: +def save_places_from_generator( + data: Iterator[PlaceTuple], count: int, source_info: str +) -> str: """ Save places from csv parsers in geonames.py or swissnames3d.py """ @@ -158,7 +160,7 @@ def save_places_from_generator(data: Iterator[PlaceTuple], count: int) -> str: total=count, unit="places", unit_scale=True, - desc="saving places", + desc=f"saving places from {source_info}", ): # retrieve PlaceType from the database