[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,8 +2,8 @@
<service name="tar_git">
<param name="url">https://github.com/rinigus/pure-maps.git</param>
<param name="branch">master</param>
- <param name="revision">2.8.1</param>
+ <param name="revision">2.9.0</param>
<param name="debian">N</param>
<param name="dumb">N</param>
</service>
-</services>
+</services>
\ No newline at end of file
|
[-]
[+]
|
Deleted |
_service:tar_git:harbour-pure-maps-2.8.1.tar.xz/tools/apikeys_dummy.py
^
|
@@ -1,22 +0,0 @@
-
-Keys = {
- # https://developer.foursquare.com [old key]
- "<FOURSQUARE_CLIENT>": "REPLACE WITH FOURSQUARE_CLIENT KEY",
- "<FOURSQUARE_SECRET>": "REPLACE WITH FOURSQUARE_SECRET KEY",
-
- # mapbox.com
- "<MAPBOX_KEY>": "REPLACE WITH MAPBOX KEY",
-
- # http://open.mapquestapi.com
- "<MAPQUEST_KEY>": "REPLACE WITH MAPQUEST KEY",
-
- # https://geocoder.opencagedata.com/api [old key]
- "<OPENCAGE_KEY>": "REPLACE WITH OPENCAGE KEY",
-
- # https://docs.stadiamaps.com/
- "<STADIAMAPS_KEY>": "REPLACE WITH STADIAMAPS KEY",
-
- # here.com
- "<HERE_APP_ID>": "REPLACE WITH HERE APP ID",
- "<HERE_APP_CODE>": "REPLACE WITH HERE APP CODE",
-}
|
[-]
[+]
|
Deleted |
_service:tar_git:harbour-pure-maps-2.8.1.tar.xz/tools/manage-keys
^
|
@@ -1,48 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-
-import os, sys, glob
-
-strip_allowed = True
-
-try:
- from apikeys import Keys
-except:
- from apikeys_dummy import Keys
- strip_allowed = False
- plain = {key: "" for key in Keys}
- Keys = plain
-
-if len(sys.argv) != 3 or sys.argv[1] not in ["inject", "strip"]:
- print('Usage: %s inject|strip dirname\nwhere dirname is a root of a project and either strip or inject should be given\n' % sys.argv[0])
- sys.exit(-1)
-
-inject = (sys.argv[1] == "inject")
-root = sys.argv[2]
-
-if not inject and not strip_allowed:
- print("Stripping empty keys is not allowed")
- sys.exit(-1)
-
-if inject: print('Injecting keys into %s' % root)
-else: print( 'Stripping keys from %s' % root)
-
-for ext in ["py", "qml", "json"]:
- for fname in glob.glob(os.path.join(root, "*." + ext)):
- with open(fname, 'r', encoding='utf-8') as f:
- s = f.read()
- keys = ""
- for k, v in Keys.items():
- if inject:
- old = k
- new = v
- else:
- old = v
- new = k
- if s.find(old) >= 0:
- keys += k + " "
- s = s.replace(old, new)
- if len(keys) > 0:
- print(fname, ":", keys)
- with open(fname, 'w') as f:
- f.write(s)
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/.gitmodules
^
|
@@ -4,3 +4,6 @@
[submodule "thirdparty/geomag"]
path = thirdparty/geomag
url = https://github.com/rinigus/geomag.git
+[submodule "thirdparty/flexible-polyline"]
+ path = thirdparty/flexible-polyline
+ url = https://github.com/heremaps/flexible-polyline.git
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/CMakeLists.txt
^
|
@@ -1,27 +1,27 @@
cmake_minimum_required(VERSION 3.5.1) # Latest version as supported by Ubuntu Touch
project(pure-maps
- VERSION 2.8.1
+ VERSION 2.9.0
DESCRIPTION "Maps and navigation")
# options
set(APP_NAME "" CACHE STRING "Name of the application, specify if custom name is needed")
set(FLAVOR "kirigami" CACHE STRING "Platform to build support for. Supported platforms: kirigami, silica, qtcontrols, uuitk")
-option(MAPMATCHING_CHECK_RUNTIME "Check map matching availibility at runtime" ON)
-option(MAPMATCHING_AVAILABLE "Availability of map matching if not checked at runtime. If checking is enabled at runtime, this option is ignored" ON)
set(PYTHON_EXE "auto" CACHE STRING "Set python3 executable. If set to 'auto', cmake will try to find it.")
option(RUN_FROM_SOURCE "Run from source, this is mainly intended for easy development" OFF)
set(S2INCLUDES "" CACHE STRING "Custom installed location for s2geometry, includes")
set(S2LIBS "" CACHE STRING "Custom installed location for s2geometry, libs")
option(USE_BUNDLED_GPXPY "Use a bundled version of GPXPY rather than a system-wide version" ON)
+option(USE_BUNDLED_GEOMAG "Use a bundled version of geomag rather than a system-wide version" ON)
+option(USE_BUNDLED_GEOCLUE2 "Use a bundled version of Geoclue2 Qt plugin with bugfixes" OFF)
set(QML_IMPORT_PATH "" CACHE STRING "Additional QML import path")
set(DEFAULT_PROFILE "online" CACHE STRING "Default profile. Supported profile selection: online, offline")
-set(DEFAULT_BASEMAP "Mapbox" CACHE STRING "Default basemap for online profile")
+set(DEFAULT_BASEMAP "MapTiler" CACHE STRING "Default basemap for online profile")
set(DEFAULT_GEOCODER "photon" CACHE STRING "Default geocoder for online profile")
set(DEFAULT_GUIDE "foursquare" CACHE STRING "Default guide for online profile")
set(DEFAULT_ROUTER "stadiamaps" CACHE STRING "Default router for online profile")
-set(DEFAULT_FONTPROVIDER "mapbox" CACHE STRING "Default font provider. Supported: mapbox, osmscout")
+set(DEFAULT_FONTPROVIDER "maptiler" CACHE STRING "Default font provider. Supported: mapbox, maptiler, osmscout")
# set project version used in About message
if(NOT PM_VERSION)
@@ -51,6 +51,7 @@
set(VALID_FONTPROVIDERS
"mapbox"
+ "maptiler"
"osmscout")
if(NOT DEFAULT_FONTPROVIDER IN_LIST VALID_FONTPROVIDERS)
@@ -148,6 +149,10 @@
file(GLOB PM_SRC src/*.cpp)
file(GLOB PM_HEADERS src/*.h)
+file(GLOB GCLUE2_SRC src/geoclue2/*.cpp)
+file(GLOB GCLUE2_HEADERS src/geoclue2/*.h)
+file(GLOB GCLUE2_XML src/geoclue2/*.xml)
+
# custom target for showing all sources in Qt Creator
add_custom_target(Sources SOURCES
${GEOCODERS_SRC} ${GEOCODERS_EXTRA}
@@ -157,6 +162,7 @@
${POOR_SRC}
${QML_SRC} ${QML_JS} ${QML_PLATFORMS} ${QML_DOCS}
${PM_SRC} ${PM_HEADERS}
+ ${GCLUE2_SRC} ${GCLUE2_HEADERS} ${GCLUE2_XML}
)
# process linking and installation in the subdirs where needed
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/NEWS.md
^
|
@@ -1,3 +1,22 @@
+2021-11-22: Pure Maps 2.9.0
+===========================
+
+* Add support for HERE through dedicated profile
+* Add support for licenses
+* Add support for MapTiler
+* Add and fix Geoclue2 plugin [fix by tpikonen]
+* Set center of the map as a reference point for geocoders
+* Disable plugins with missing API keys or licenses
+* Indicate when routing has failed
+* Fix direction calculations used by positioning source
+* Allow to use system-wide Geomag [tpikonen]
+* Update Ubuntu Touch packaging [jonnius]
+* Try to activate map matching if requested
+* Allow to specify accuracy of positioning
+* Revise API keys handling
+* Update translations
+* Bugfixes
+
2021-10-17: Pure Maps 2.8.0
===========================
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/README.md
^
|
@@ -255,9 +255,9 @@
click. Several distributions provide packaging scripts in their source
trees.
-For packaging, please copy `tools/apikeys_dummy.py` to
-`tools/apikeys.py` and fill missing API keys for the services that you
-plan to use.
+For packaging, please copy `poor/apikeys.py` to `tools/apikeys.py` and
+fill missing API keys for the services that you plan to use. Note that
+the format of `tools/apikeys.py` has changed with 2.9 release.
Flatpak specific instructions are available under `packaging/flatpak`.
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/RELEASING.md
^
|
@@ -12,9 +12,9 @@
git commit -m "Update translations"
# Check, test, do final edits and release.
-tools/manage-keys inject poor
+cp tools/apikeys.py poor
make -f Makefile.test
-tools/manage-keys strip poor
+git checkout poor/apikeys.py
git status
emacs rpm/*.spec CMakeLists.txt packaging/click/manifest.json
emacs NEWS.md packaging/pure-maps.appdata.xml
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/attic/maps/sputnik.json
^
|
(renamed from maps/sputnik.json)
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/geocoders/here.json
^
|
@@ -0,0 +1,11 @@
+{
+ "attribution": {
+ "© HERE": "https://legal.here.com",
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
+ },
+ "_description": "Search based on HERE data. Supports autocomplete",
+ "keys": ["HERE_APIKEY"],
+ "name": "HERE",
+ "profiles": ["HERE"]
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/geocoders/here.py
^
|
@@ -0,0 +1,203 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021 Rinigus
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Geocoding using HERE.
+
+https://developer.here.com/
+"""
+
+import copy
+import poor
+import random
+import urllib.parse
+from poor.i18n import _
+
+URL = ("https://discover.search.hereapi.com/v1/discover?"
+ "apiKey=" + poor.key.get("HERE_APIKEY") +
+ "&q={query}"
+ "&limit={limit}"
+ "&language={lang}")
+
+URL_AUTOSUGGEST = ("https://autosuggest.search.hereapi.com/v1/autosuggest?"
+ "apiKey=" + poor.key.get("HERE_APIKEY") +
+ "&q={query}"
+ "&language={lang}")
+
+URL_REVERSE = ("https://revgeocode.search.hereapi.com/v1/revgeocode?"
+ "apiKey=" + poor.key.get("HERE_APIKEY") +
+ "&at={lat},{lon}"
+ "&language={lang}")
+cache = {}
+
+def autocomplete(query, x=0, y=0, params={}):
+ """Return a list of autocomplete dictionaries matching `query`."""
+ query = query.strip()
+ if len(query) < 3: return []
+ query = urllib.parse.quote_plus(query)
+ lang = poor.util.get_default_language("en")
+ url = URL_AUTOSUGGEST.format(**locals())
+ if x and y:
+ url += "&at={:.3f},{:.3f}".format(y,x)
+ else:
+ # HERE requires reference point
+ url += "&at={:.3f},{:.3f}".format(59,24)
+ with poor.util.silent(KeyError):
+ return copy.deepcopy(cache[url])
+ results = poor.http.get_json(url)["items"]
+ results = list(map(poor.AttrDict, results))
+ results = parse_results(results)
+ if results and results[0]:
+ cache[url] = copy.deepcopy(results)
+ return results
+
+def geocode(query, x=0, y=0, params={}):
+ """Return a list of dictionaries of places matching `query`."""
+ if isinstance(query, str):
+ query = urllib.parse.quote_plus(query)
+ limit = params.get("limit", 20)
+ lang = poor.util.get_default_language("en")
+ #lang = (lang if lang in ("de", "en", "it", "fr") else "en")
+ url = URL.format(**locals())
+ if x and y:
+ url += "&at={:.3f},{:.3f}".format(y,x)
+ else:
+ # HERE requires reference point
+ url += "&at={:.3f},{:.3f}".format(59,24)
+ else: # should be query type with reference
+ url = query['href'] + "&apiKey=" + poor.key.get("HERE_APIKEY")
+ with poor.util.silent(KeyError):
+ return copy.deepcopy(cache[url])
+ results = poor.http.get_json(url)["items"]
+ results = list(map(poor.AttrDict, results))
+ results = parse_results(results)
+ if results and results[0]:
+ cache[url] = copy.deepcopy(results)
+ return results
+
+def merge(d, t, delim="\n", categ=""):
+ if t:
+ if categ: t = categ.format(t)
+ if d: return d + delim + t
+ return t
+ return d
+
+def parse_results(results):
+ res = []
+ for result in results:
+ # x=lng, y=lat
+ x, y = parse_position(result)
+ res.append(
+ dict(
+ address=parse_address(result),
+ label=parse_label(result),
+ poi_type=parse_type(result),
+ postcode=parse_postcode(result),
+ title=result.title,
+ description=parse_description(result),
+ phone=parse_contact(result, "phone"),
+ link=parse_contact(result, "www"),
+ email=parse_contact(result, "email"),
+ text=parse_extras(result),
+ x=x,
+ y=y,
+ query=result)
+ )
+ return res
+
+def parse_address(result):
+ with poor.util.silent(Exception):
+ return result.address.label
+ return ""
+
+def parse_contact(result, key):
+ with poor.util.silent(Exception):
+ t = []
+ for c in result.contacts:
+ if key in c:
+ t.extend([v.value for v in c[key]])
+ if len(t) == 1:
+ return t[0]
+ return ", ".join(t)
+ return ""
+
+def parse_description(result):
+ r = parse_type(result)
+ if r == "PM:Query":
+ return _("Search suggestion")
+ return r
+
+def parse_extras(result):
+ """Parse description from geocoding result."""
+ description = ""
+ with poor.util.silent(Exception):
+ t = ", ".join([c.name for c in result.foodTypes])
+ description = merge(description, t, categ=_("Food types: {}"))
+ with poor.util.silent(Exception):
+ t = []
+ for i in result.openingHours:
+ if "isOpen" not in i or i.isOpen:
+ t.extend(i.text)
+ t = "; ".join(t)
+ description = merge(description, t, categ=_("Opening hours: {}"))
+ return description
+
+def parse_label(result):
+ a = parse_address(result)
+ t = result.title
+ if a:
+ return "{}: {}".format(t,a)
+ return t
+
+def parse_position(result):
+ # As many POIs share the same coordinates in HERE, add random
+ # jitter to spread the points on a map. Used spread corresponds to
+ # ~50 cm on equator
+ ja = 5e-6
+ jitter_x = random.uniform(-ja, ja)
+ jitter_y = random.uniform(-ja, ja)
+ with poor.util.silent(Exception):
+ return float(result.access[0].lng)+jitter_x, float(result.access[0].lat)+jitter_y
+ with poor.util.silent(Exception):
+ return float(result.position.lng)+jitter_x, float(result.position.lat)+jitter_y
+ return 0, 0
+
+def parse_postcode(result):
+ with poor.util.silent(Exception):
+ return result.address.postalCode
+ return ""
+
+def parse_type(result):
+ with poor.util.silent(Exception):
+ if "href" in result: return "PM:Query"
+ return ", ".join([c.name.capitalize() for c in result.categories])
+ return ""
+
+def reverse(x, y, radius, limit=1, params={}):
+ """Return a list of dictionaries of places nearby given coordinates."""
+ lon = x
+ lat = y
+ lang = poor.util.get_default_language("en")
+ url = URL_REVERSE.format(**locals())
+ with poor.util.silent(KeyError):
+ return copy.deepcopy(cache[url])
+ results = poor.http.get_json(url)["items"]
+ results = list(map(poor.AttrDict, results))
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/geocoders/opencage.json
^
|
@@ -12,6 +12,7 @@
"© Yahoo GeoPlanet": "https://developer.yahoo.com/geo/geoplanet/data/"
},
"_description": "Search based on open data sources",
+ "keys": ["OPENCAGE_KEY"],
"name": "OpenCage",
"profiles": ["mixed", "online"]
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/geocoders/osmscout.py
^
|
@@ -32,11 +32,7 @@
def autocomplete(query, x=0, y=0, params={}):
"""Return a list of autocomplete dictionaries matching `query`."""
if len(query) < 3: return []
- key = "autocomplete:{}".format(query)
- with poor.util.silent(KeyError):
- return copy.deepcopy(cache[key])
results = geocode(query=query, x=x, y=y, params=params)
- cache[key] = copy.deepcopy(results)
return results
def geocode(query, x=0, y=0, params={}):
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/geocoders/photon.py
^
|
@@ -32,11 +32,7 @@
def autocomplete(query, x=0, y=0, params={}):
"""Return a list of autocomplete dictionaries matching `query`."""
if len(query) < 3: return []
- key = "autocomplete:{}".format(query)
- with poor.util.silent(KeyError):
- return copy.deepcopy(cache[key])
results = geocode(query=query, x=x, y=y, params=params)
- cache[key] = copy.deepcopy(results)
return results
def geocode(query, x=0, y=0, params={}):
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/guides/foursquare.json
^
|
@@ -3,6 +3,7 @@
"© Foursquare": "https://foursquare.com/"
},
"_description": "Venues listed and reviewed by Foursquare users",
+ "keys": ["FOURSQUARE_CLIENT", "FOURSQUARE_SECRET"],
"name": "Foursquare",
- "profiles": ["mixed", "online"]
+ "profiles": ["mixed", "online", "HERE"]
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/guides/nominatim.json
^
|
@@ -4,6 +4,7 @@
"© OpenStreetMap": "https://www.openstreetmap.org/copyright"
},
"_description": "Points of interest from OpenStreetMap data",
+ "keys": ["MAPQUEST_KEY"],
"name": "MapQuest Nominatim",
"profiles": ["mixed", "online"]
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_0_normal_day.json
^
|
@@ -1,17 +1,18 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Normal Day",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.day/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"type": "default"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_0_normal_day_pedestrian.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Normal Day Pedestrian",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.base.maps.api.here.com/maptile/2.1/maptile/newest/pedestrian.day/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/pedestrian.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"type": "default",
"vehicle": "foot"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_0_normal_day_transit.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Normal Day Transit",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.day.transit/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.day.transit/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"type": "default",
"vehicle": "transit"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_0_normal_night.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "night",
"name": "HERE Normal Night",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.night/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.night/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"style_gui": {
"fg": "white",
"iconVariant": "white",
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_0_normal_night_pedestrian.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "night",
"name": "HERE Normal Night Pedestrian",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.base.maps.api.here.com/maptile/2.1/maptile/newest/pedestrian.night/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/pedestrian.night/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"style_gui": {
"fg": "white",
"iconVariant": "white",
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_0_normal_night_transit.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "night",
"name": "HERE Normal Night Transit",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.night.transit/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.night.transit/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"style_gui": {
"fg": "white",
"iconVariant": "white",
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_1_terrain.json
^
|
@@ -1,17 +1,18 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Terrain",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.aerial.maps.api.here.com/maptile/2.1/maptile/newest/terrain.day/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.aerial.maps.ls.hereapi.com/maptile/2.1/maptile/newest/terrain.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"type": "terrain"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_2_satellite_day.json
^
|
@@ -1,15 +1,16 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"light": "day",
"name": "HERE Satellite",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.aerial.maps.api.here.com/maptile/2.1/maptile/newest/satellite.day/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#",
+ "tile_size": 256,
+ "tile_url": "https://3.aerial.maps.ls.hereapi.com/maptile/2.1/maptile/newest/satellite.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#",
"type": "satellite"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_3_hybrid.json
^
|
@@ -1,17 +1,18 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Hybrid",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.aerial.maps.api.here.com/maptile/2.1/maptile/newest/hybrid.day/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.aerial.maps.ls.hereapi.com/maptile/2.1/maptile/newest/hybrid.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"type": "hybrid"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_4_traffic_day.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "day",
"name": "HERE Traffic Day",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.traffic.maps.api.here.com/maptile/2.1/traffictile/newest/normal.traffic.day/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.traffic.maps.ls.hereapi.com/maptile/2.1/traffictile/newest/normal.traffic.day/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"type": "traffic",
"vehicle": "car"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/here_4_traffic_night.json
^
|
@@ -1,18 +1,19 @@
{
"attribution": {
"© HERE": "https://legal.here.com",
- "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices"
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
},
"format": "raster",
- "keys": ["HERE_APP_ID", "HERE_APP_CODE"],
+ "keys": ["HERE_APIKEY"],
"lang": {"local": "mul", "ar": "ara", "eu": "baq", "ca": "cat", "zh-simpl": "chi", "zh": "cht", "cs": "cze", "da": "dan", "nl": "dut", "en": "eng", "fi": "fin", "fr": "fre", "de": "ger", "ga": "gle", "el": "gre", "he": "heb", "hi": "hin", "id": "ind", "it": "ita", "no": "nor", "fa": "per", "pl": "pol", "pt": "por", "ru": "rus", "si": "sin", "es": "spa", "sv": "swe", "th": "tha", "tr": "tur", "uk": "ukr", "ur": "urd", "vi": "vie", "cy": "wel"},
"lang_key": "#LANG#",
"light": "night",
"name": "HERE Traffic Night",
- "profiles": ["mixed", "online"],
+ "profiles": ["mixed", "online", "HERE"],
"provider": "HERE",
- "tile_size": 512,
- "tile_url": "https://3.traffic.maps.api.here.com/maptile/2.1/traffictile/newest/normal.traffic.night/{z}/{x}/{y}/512/png8?app_id=#HERE_APP_ID#&app_code=#HERE_APP_CODE#&ppi=250&lg=#LANG#",
+ "tile_size": 256,
+ "tile_url": "https://3.traffic.maps.ls.hereapi.com/maptile/2.1/traffictile/newest/normal.traffic.night/{z}/{x}/{y}/512/png8?apiKey=#HERE_APIKEY#&ppi=500&pois&lg=#LANG#",
"style_gui": {
"fg": "white",
"iconVariant": "white",
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/maptiler_0_streets.json
^
|
@@ -0,0 +1,18 @@
+{
+ "attribution": {
+ "© MapTiler": "https://www.maptiler.com/",
+ "© MapTiler Copyright": "https://www.maptiler.com/copyright/",
+ "© OpenStreetMap contributors": "https://www.openstreetmap.org/copyright"
+ },
+ "fingerprint": { "id": "streets" },
+ "first_label_layer": "water_name_line",
+ "format": "mapbox-gl",
+ "keys": ["MAPTILER_KEY"],
+ "light": "day",
+ "logo": "maptiler",
+ "name": "MapTiler Streets",
+ "profiles": ["mixed", "online"],
+ "provider": "MapTiler",
+ "style_url": "https://api.maptiler.com/maps/streets/style.json?key=#MAPTILER_KEY#",
+ "type": "default"
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/maptiler_1_outdoors.json
^
|
@@ -0,0 +1,18 @@
+{
+ "attribution": {
+ "© MapTiler": "https://www.maptiler.com/",
+ "© MapTiler Copyright": "https://www.maptiler.com/copyright/",
+ "© OpenStreetMap contributors": "https://www.openstreetmap.org/copyright"
+ },
+ "fingerprint": { "id": "outdoor" },
+ "first_label_layer": "outdoor_poi_parking",
+ "format": "mapbox-gl",
+ "keys": ["MAPTILER_KEY"],
+ "light": "day",
+ "logo": "maptiler",
+ "name": "MapTiler Outdoor",
+ "profiles": ["mixed", "online"],
+ "provider": "MapTiler",
+ "style_url": "https://api.maptiler.com/maps/outdoor/style.json?key=#MAPTILER_KEY#",
+ "type": "terrain"
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/maps/maptiler_3_satellite_hybrid.json
^
|
@@ -0,0 +1,18 @@
+{
+ "attribution": {
+ "© MapTiler": "https://www.maptiler.com/",
+ "© MapTiler Copyright": "https://www.maptiler.com/copyright/",
+ "© OpenStreetMap contributors": "https://www.openstreetmap.org/copyright"
+ },
+ "fingerprint": { "id": "hybrid" },
+ "first_label_layer": "road_label",
+ "format": "mapbox-gl",
+ "keys": ["MAPTILER_KEY"],
+ "light": "day",
+ "logo": "maptiler",
+ "name": "MapTiler Satellite Hybrid",
+ "profiles": ["mixed", "online"],
+ "provider": "MapTiler",
+ "style_url": "https://api.maptiler.com/maps/hybrid/style.json?key=#MAPTILER_KEY#",
+ "type": "hybrid"
+}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/packaging/click/full-build.json
^
|
@@ -31,8 +31,6 @@
"install_lib": [
"${MAPBOX_GL_NATIVE_LIB_INSTALL_DIR}/lib/*.so*",
"${MAPBOX_GL_QML_LIB_INSTALL_DIR}/usr/lib/${ARCH_TRIPLET}/qt5/qml/*",
- "${NEMO_QML_PLUGIN_DBUS_LIB_INSTALL_DIR}/usr/lib/${ARCH_TRIPLET}/qt5/qml/*",
- "${NEMO_QML_PLUGIN_DBUS_LIB_INSTALL_DIR}/usr/lib/${ARCH_TRIPLET}/*.so*",
"${S2GEOMETRY_LIB_INSTALL_DIR}/lib/*.so*"
],
"scripts": {
@@ -63,9 +61,6 @@
"LIBS+=-L${BUILD_DIR}/../mapbox-gl-native/install/lib"
]
},
- "nemo-qml-plugin-dbus": {
- "builder": "qmake"
- },
"s2geometry": {
"builder": "cmake",
"build_args": [
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/packaging/click/manifest.json
^
|
@@ -9,7 +9,7 @@
"desktop": "pure-maps.desktop"
}
},
- "version": "2.8.1",
+ "version": "2.9.0",
"maintainer": "Rinigus <rinigus.git@gmail.org>",
"framework" : "@CLICK_FRAMEWORK@"
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/packaging/click/prepare-deps.sh
^
|
@@ -9,19 +9,17 @@
ROOT_DIR=$(git rev-parse --show-toplevel)
MAPBOX_GL_NATIVE_SRC_DIR=$ROOT_DIR/libs/mapbox-gl-native
MAPBOX_GL_QML_SRC_DIR=$ROOT_DIR/libs/mapbox-gl-qml
-NEMO_QML_PLUGIN_DBUS_SRC_DIR=$ROOT_DIR/libs/nemo-qml-plugin-dbus
QMLRUNNER_SRC_DIR=$ROOT_DIR/libs/qmlrunner
MIMIC_SRC_DIR=$ROOT_DIR/libs/mimic
PICOTTS_SRC_DIR=$ROOT_DIR/libs/picotts
S2GEOMETRY_SRC_DIR=$ROOT_DIR/libs/s2geometry
# Remove old downloads
-rm -rf $MAPBOX_GL_NATIVE_SRC_DIR $MAPBOX_GL_QML_SRC_DIR $NEMO_QML_PLUGIN_DBUS_SRC_DIR $QMLRUNNER_SRC_DIR $MIMIC_SRC_DIR $PICOTTS_SRC_DIR $S2GEOMETRY_SRC_DIR
+rm -rf $MAPBOX_GL_NATIVE_SRC_DIR $MAPBOX_GL_QML_SRC_DIR $QMLRUNNER_SRC_DIR $MIMIC_SRC_DIR $PICOTTS_SRC_DIR $S2GEOMETRY_SRC_DIR
# Download sources
git clone -b mapbox-update-200607 https://github.com/rinigus/mapbox-gl-native.git $MAPBOX_GL_NATIVE_SRC_DIR --recurse-submodules --shallow-submodules
git clone -b 1.7.5 https://github.com/rinigus/mapbox-gl-qml.git $MAPBOX_GL_QML_SRC_DIR
-git clone https://git.merproject.org/mer-core/nemo-qml-plugin-dbus.git $NEMO_QML_PLUGIN_DBUS_SRC_DIR
git clone https://github.com/rinigus/qmlrunner.git $QMLRUNNER_SRC_DIR
git clone https://github.com/rinigus/s2geometry.git $S2GEOMETRY_SRC_DIR
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/packaging/click/slim-build.json
^
|
@@ -30,8 +30,6 @@
"install_lib": [
"${MAPBOX_GL_NATIVE_LIB_INSTALL_DIR}/lib/*.so*",
"${MAPBOX_GL_QML_LIB_INSTALL_DIR}/usr/lib/${ARCH_TRIPLET}/qt5/qml/*",
- "${NEMO_QML_PLUGIN_DBUS_LIB_INSTALL_DIR}/usr/lib/${ARCH_TRIPLET}/qt5/qml/*",
- "${NEMO_QML_PLUGIN_DBUS_LIB_INSTALL_DIR}/usr/lib/${ARCH_TRIPLET}/*.so*",
"${S2GEOMETRY_LIB_INSTALL_DIR}/lib/*.so*"
],
"scripts": {
@@ -62,9 +60,6 @@
"LIBS+=-L${BUILD_DIR}/../mapbox-gl-native/install/lib"
]
},
- "nemo-qml-plugin-dbus": {
- "builder": "qmake"
- },
"s2geometry": {
"builder": "cmake",
"build_args": [
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/packaging/pure-maps.appdata.xml
^
|
@@ -38,6 +38,27 @@
</screenshots>
<metadata_license>CC-BY-SA-3.0</metadata_license>
<releases>
+ <release version="2.9.0" date="2021-11-22">
+ <description>
+ <ul>
+ <li>Add support for HERE through dedicated profile</li>
+ <li>Add support for licenses</li>
+ <li>Add support for MapTiler</li>
+ <li>Add and fix Geoclue2 plugin [fix by tpikonen]</li>
+ <li>Set center of the map as a reference point for geocoders</li>
+ <li>Disable plugins with missing API keys or licenses</li>
+ <li>Indicate when routing has failed</li>
+ <li>Fix direction calculations used by positioning source</li>
+ <li>Allow to use system-wide Geomag [tpikonen]</li>
+ <li>Update Ubuntu Touch packaging [jonnius]</li>
+ <li>Try to activate map matching if requested</li>
+ <li>Allow to specify accuracy of positioning</li>
+ <li>Revise API keys handling</li>
+ <li>Bugfixes and small enhancements</li>
+ <li>Update translations</li>
+ </ul>
+ </description>
+ </release>
<release version="2.8.1" date="2021-10-17">
<description>
<ul>
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/cs.po
^
|
@@ -6,17 +6,18 @@
# Translators:
# PawelSpoon, 2019
# Jan Straka <jstraka88@gmail.com>, 2019
-# trendspotter, 2019
+# trendspotter <jirka.p@volny.cz>, 2019
# Malakay X <Malakay.666@seznam.cz>, 2020
+# rinigus github, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-17 22:10+0200\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
-"Last-Translator: Malakay X <Malakay.666@seznam.cz>, 2020\n"
+"Last-Translator: rinigus github, 2021\n"
"Language-Team: Czech (https://www.transifex.com/rinigus/teams/89597/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,159 +25,193 @@
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Otevírací doba"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Bod z geografického odkazu"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Bod ze souřadnic"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Nasměrování pomocí Plus code"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Spojení vypršelo"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:527
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
-#: qml/NearbyPage.qml:155 qml/NearbyPage.qml:170 qml/RoutePage.qml:40
-#: qml/RoutePage.qml:42 qml/RoutePage.qml:46 qml/RoutePage.qml:104
-#: qml/RoutePage.qml:461 qml/RoutePage.qml:466 qml/RoutePage.qml:693
-#: qml/RoutePage.qml:736 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Aktuální pozice"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID Foursquare klient. Zaregistrujte se na https://developer.foursquare.com a"
-" vyplňte svůj osobní ID aplikace a osobní klíč"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID Foursquare klienta"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare klíč"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox API klíč. Zaregistrujte se na adrese https://www.mapbox.com a "
-"vytvořte si vlastní API klíč"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox API klíč"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest API klíč. Zaregistrujte se na https://developer.mapquest.com/ a "
-"vytvořte svůj vlastní API klíč"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest API klíč"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage API klíč. Zaregistrujte se na https://opencagedata.com/ a vytvořte "
-"svůj vlastní API klíč"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage API klíč"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID Foursquare klienta"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare klíč"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox API klíč"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps API klíč. Zaregistrujte se na https://stadiamaps.com/ a vytvořte"
-" svůj vlastní API klíč"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest API klíč"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API klíč"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps API klíč"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"ID HERE App. Zaregistrujte se na https://developer.here.com a vyplňte svůj "
-"osobní ID aplikace a osobní klíč"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/de_DE.po
^
|
@@ -21,7 +21,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: German (Germany) (https://www.transifex.com/rinigus/teams/89597/de_DE/)\n"
@@ -31,29 +31,41 @@
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Öffnungszeiten:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punkt aus Geo-Link"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punkt aus Koordinaten"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punkt aus Plus-Code"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Zeitüberschreitung bei der Verbindung"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -61,129 +73,151 @@
msgid "Current position"
msgstr "Aktuelle Position"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare Client ID. Registriere dich auf https://developer.foursquare.com "
-"und erzeuge deine eigene Client ID und Secret Keys"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare Client ID"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare Client Secret"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox API-Key. Registriere dich auf https://www.mapbox.com und erzeuge "
-"deinen eigenen API-Key"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox API-Key"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest API-Schlüssel. Registriere dich auf https://developer.mapquest.com/"
-" und erzeuge deinen eigenen API-Schlüssel"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest API-Key"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage API-Key. Registriere dich auf https://opencagedata.com/ und erzeuge"
-" deinen eigenen API-Key"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage API-Key"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare Client ID"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare Client Secret"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox API-Key"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps API-Key. Registriere dich auf https://stadiamaps.com/ und "
-"erzeuge deinen eigenen API-Key"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest API-Key"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API-Key"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps API-Key"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"HERE App ID. Registriere dich auf https://developer.here.com und erzeuge "
-"deine eigene App ID und Code"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "HERE App ID"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/el.po
^
|
@@ -2,330 +2,416 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+#
# Translators:
# rinigus github, 2018
-# Panagiotis Melas <pmelas@gmail.com>, 2018
-#
+# Panagiotis Melas <pmelas@gmail.com>, 2019
+#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-01-13 13:52+0200\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
-"Last-Translator: Panagiotis Melas <pmelas@gmail.com>, 2018\n"
+"Last-Translator: Panagiotis Melas <pmelas@gmail.com>, 2019\n"
"Language-Team: Greek (https://www.transifex.com/rinigus/teams/89597/el/)\n"
+"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: guides/foursquare.py:191
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
+#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Ώρες λειτουργίας:"
-#: poor/geocoder.py:108
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Σημείο από γεωγραφικό σύνδεσμο"
-#: poor/geocoder.py:120
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Σημείο από συντεταγμένες"
-#: poor/geocoder.py:130 poor/geocoder.py:167 poor/guide.py:123
-#: poor/router.py:115
+#: poor/geocoder.py:136
+msgid "Point from Plus code"
+msgstr ""
+
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
+#: poor/router.py:136
msgid "Connection timed out"
msgstr "Λήξη χρονικού ορίου σύνδεσης"
-#: poor/history.py:32 qml/GeocodeItem.qml:207 qml/GeocodeItem.qml:516
-#: qml/NearbyPage.qml:28 qml/NearbyPage.qml:135 qml/NearbyPage.qml:150
-#: qml/RoutePage.qml:28 qml/RoutePage.qml:29 qml/RoutePage.qml:228
-#: qml/RoutePage.qml:238 qml/RoutePage.qml:240 qml/RoutePoint.qml:42
-#: qml/RoutePoint.qml:58
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Παρούσα θέση"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
-msgstr ""
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-#: poor/keystore.py:56
-msgid "Mapbox API key"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
#: poor/keystore.py:60
-msgid "MapQuest API key"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-#: poor/keystore.py:64
-msgid "OpenCage API key"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
msgstr ""
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
msgstr ""
-#: poor/keystore.py:68
-msgid "Stadia Maps API key"
+#: poor/keystore.py:69
+msgid "Mapbox API key"
msgstr ""
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-#: poor/keystore.py:72
-msgid "HERE App ID"
+#: poor/keystore.py:75
+msgid "MapQuest API key"
msgstr ""
-#: poor/keystore.py:73 poor/keystore.py:74
-msgid "HERE App Code"
+#: poor/keystore.py:78
+msgid "OpenCage API key"
msgstr ""
-#: poor/narrative.py:130
-#, python-brace-format
-msgid "In {distance}, {direction}"
-msgstr "Σε {distance}, {direction}"
+#: poor/keystore.py:81
+msgid "Stadia Maps API key"
+msgstr ""
-#: poor/narrative.py:221 poor/narrative.py:223
-msgid "Exit: "
-msgstr "Έξοδος"
+#: poor/keystore.py:84
+msgid "HERE API Key"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/es.po
^
|
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Spanish (https://www.transifex.com/rinigus/teams/89597/es/)\n"
@@ -22,29 +22,41 @@
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Horario:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punto desde geo enlace"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punto de coordenadas"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punto código plus"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Tiempo de conexión finalizado"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,129 +64,151 @@
msgid "Current position"
msgstr "Posición actual"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID de cliente Foursquare. Regístrate en https://developer.foursquare.com y "
-"crea tu propio ID de cliente y claves de cliente secreto"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID de cliente Foursquare"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Cliente secreto Foursquare"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Clave API de Mapbox. Regístrate en https://www.mapbox.com y crea tu propia "
-"clave API"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Clave API de Mapbox"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Clave API de MapQuest. Regístrate en https://developer.mapquest.com/ y crea "
-"tu propia clave API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Clave API de MapQuest"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Clave API de OpenCage. Regístrate en https://opencagedata.com/ y crea tu "
-"propia clave API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Clave API de OpenCage"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID de cliente Foursquare"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Cliente secreto Foursquare"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Clave API de Mapbox"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Clave API de Stadia Maps. Regístrate en https://stadiamaps.com/ y crea tu "
-"propia clave API"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Clave API de MapQuest"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "Clave API de OpenCage"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Clave API de Stadia Map"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"ID de HERE. Regístrate en https://developer.here.com y crea tu propio id de "
-"aplicación y código"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "ID de HERE"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/et.po
^
|
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Estonian (https://www.transifex.com/rinigus/teams/89597/et/)\n"
@@ -22,29 +22,41 @@
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Tööajad:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Asukoht geolingi alusel"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Asukoht koordinaatide alusel"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Asukoht OLC-koodi alusel"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Ühendus aegus"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,129 +64,151 @@
msgid "Current position"
msgstr "Praegune asukoht"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare klienditunnus. Registreeru https://developer.foursquare.com "
-"saidis ning loo oma klienditunnus ning kliendivõti"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare klienditunnus"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare kliendivõti"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox API võti. Registreeru https://www.mapbox.com saidis ja loo oma API "
-"võti"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox API võti"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest API võti. Registreeru https://developer.mapquest.com/ saidis ja loo"
-" oma API võti"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest API võti"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage API võti. Registreeru https://opencagedata.com/ saidis ja loo oma "
-"API võti"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage API võti"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare klienditunnus"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare kliendivõti"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox API võti"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps API võti. Registreeru https://stadiamaps.com/ saidis ja loo oma "
-"API võti"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest API võti"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API võti"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps API võti"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"HERE rakenduse tunnus (App ID). Registreeru https://developer.here.com "
-"saidis ja loo oma rakenduse tunnus ning kood"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "HERE rakenduse tunnus"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/fi.po
^
|
@@ -13,7 +13,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Finnish (https://www.transifex.com/rinigus/teams/89597/fi/)\n"
@@ -23,29 +23,41 @@
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Aukioloajat:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Piste geolinkistä"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Piste koordinaateista"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Piste plus-koodiosoitteesta"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Yhteys aikakatkaistiin"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -53,129 +65,151 @@
msgid "Current position"
msgstr "Nykyinen sijainti"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare-käyttäjätunnus. Luo oma tunnus ja salasana osoitteessa "
-"https://developer.foursquare.com "
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare-käyttäjätunnus"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare-salasana"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox API-rajapinnan avainkoodi. Luo oma avainkoodisi osoitteessa "
-"https://www.mapbox.com "
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox-rajapinnan avain"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest API-rajapinnan avainkoodi. Luo oma avainkoodisi osoitteessa "
-"https://developer.mapquest.com/"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest-rajapinnan avain"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage API-rajapinnan avainkoodi. Luo oma avainkoodisi osoitteessa "
-"https://opencagedata.com/"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage API-rajapinnan avainkoodi"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare-käyttäjätunnus"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare-salasana"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox-rajapinnan avain"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps API-rajapinnan avainkoodi. Luo oma avainkoodisi osoitteessa "
-"https://stadiamaps.com/"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest-rajapinnan avain"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API-rajapinnan avainkoodi"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps API-rajapinnan avainkoodi"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"HERE käyttäjätunnus. Luo oma käyttäjätunnus ja -koodi osoitteessa "
-"https://developer.here.com"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "HERE-käyttäjätunnus"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/fr.po
^
|
@@ -16,7 +16,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: French (https://www.transifex.com/rinigus/teams/89597/fr/)\n"
@@ -26,29 +26,41 @@
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Heures d'ouverture :"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Position du lien géographique"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Position à partir de coordonnées"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Point code plus"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Délai de connexion dépassé"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -56,129 +68,151 @@
msgid "Current position"
msgstr "Position actuelle"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID Client Foursquare. Générez le vôtre en vous inscrivant sur : "
-"https://developer.foursquare.com/"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID Client Foursquare"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Secret Client Foursquare"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Clé API Mapbox. Générez la vôtre en vous inscrivant sur : "
-"https://www.mapbox.com/"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Clé API Mapbox"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Clé API MapQuest. Générez la vôtre en vous inscrivant sur : "
-"https://developer.mapquest.com/"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Clé API MapQuest"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Clé API OpenCage. Générez la vôtre en vous inscrivant sur : "
-"https://opencagedata.com/"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Clé API OpenCage"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID Client Foursquare"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Secret Client Foursquare"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Clé API Mapbox"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Clé API Stadia Maps. Générez la vôtre en vous inscrivant sur : "
-"https://stadiamaps.com/"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Clé API MapQuest"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "Clé API OpenCage"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Clé API Stadia Maps"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"ID HERE. Générez le vôtre en vous inscrivant sur : "
-"https://developer.here.com/"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "ID HERE"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/fur.po
^
|
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Friulian (https://www.transifex.com/rinigus/teams/89597/fur/)\n"
@@ -22,29 +22,41 @@
"Language: fur\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Oraris di viertidure:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Pont di gjeo-colegament"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Pont di coordenade"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Pont di codiç Plus"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Conession scjadude"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,128 +64,151 @@
msgid "Current position"
msgstr "Posizion atuâl"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID client Foursquare. Regjistriti su https://developer.foursquare.com e cree"
-" il tô ID client e lis clâfs segretis dal client"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID di client Foursquare"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Segret dal client di Foursquare"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Clâf API Mapbox. Regjistriti su https://www.mapbox.com e cree la tô clâf API"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Clâf API di Mapbox"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Clâf API MapQuest. Regjistriti su https://developer.mapquest.com/ e cree la "
-"tô clâf API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Clâf API di MapQuest"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Clâf API OpenCage. Regjistriti su https://opencagedata.com/ e cree la tô "
-"clâf API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Clâf API di OpenCage"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID di client Foursquare"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Segret dal client di Foursquare"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Clâf API di Mapbox"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Clâf API Stadia Maps. Regjistriti su https://stadiamaps.com/ e cree la tô "
-"clâf API"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Clâf API di MapQuest"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "Clâf API di OpenCage"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Clâf API di Stadia Maps"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"ID di HERE. Regjistriti su https://developer.here.com e cree il to ID di "
-"aplicazion e il to codiç personâl"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "ID di HERE"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
+"policy of 2018 for details regarding use of HERE together with other "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/hu_HU.po
^
|
@@ -3,14 +3,19 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
+# Translators:
+# PizzaProgram <info@pizzaprogram.hu>, 2020
+# Szabó G. <leo.kanak@yahoo.com>, 2021
+# rinigus github, 2021
+#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-26 13:00+0300\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: rinigus github, 2018\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
+"PO-Revision-Date: 2018-08-22 13:49+0000\n"
+"Last-Translator: rinigus github, 2021\n"
"Language-Team: Hungarian (Hungary) (https://www.transifex.com/rinigus/teams/89597/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,234 +23,400 @@
"Language: hu_HU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: poor/geocoder.py:108
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
+#: guides/foursquare.py:198
+msgid "Opening hours:"
+msgstr "Nyitvatartás:"
+
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Pont geo linkből"
-#: poor/geocoder.py:120
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Pont koordinátákból"
-#: poor/geocoder.py:130 poor/guide.py:123 poor/router.py:102
+#: poor/geocoder.py:136
+msgid "Point from Plus code"
+msgstr ""
+
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
+#: poor/router.py:136
msgid "Connection timed out"
msgstr "Kapcsolat időtúllépés"
-#: poor/history.py:32 qml/NearbyPage.qml:27 qml/NearbyPage.qml:88
-#: qml/NearbyPage.qml:96 qml/NearbyPage.qml:172 qml/NearbyPage.qml:182
-#: qml/RoutePage.qml:27 qml/RoutePage.qml:28 qml/RoutePage.qml:80
-#: qml/RoutePage.qml:88 qml/RoutePage.qml:113 qml/RoutePage.qml:121
-#: qml/RoutePage.qml:179 qml/RoutePage.qml:184 qml/RoutePage.qml:186
-#: qml/RoutePointPage.qml:94 qml/RoutePointPage.qml:97
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Jelenlegi helyzet"
-#: poor/narrative.py:127
-#, python-brace-format
-msgid "In {distance}, {direction}"
-msgstr "Ennyi: {distance}, erre: {direction}"
+#: poor/keystore.py:55
+msgid ""
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
+msgstr ""
-#: poor/narrative.py:218 poor/narrative.py:220
-msgid "Exit: "
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
msgstr ""
-#: poor/narrative.py:415 qml/pure-maps.qml:163
-msgid "Rerouting"
-msgstr "Újratervezés"
+#: poor/keystore.py:57
+msgid ""
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
+msgstr ""
-#: poor/narrative.py:416 qml/pure-maps.qml:185
-msgid "Rerouting failed"
-msgstr "Az újratervezés sikertelen"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/narrative.py:417 qml/pure-maps.qml:179
-msgid "New route found"
-msgstr "Új útvonal megtalálva"
+#: poor/keystore.py:59
+msgid ""
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
+"your own API key"
+msgstr ""
-#: poor/util.py:183 poor/util.py:201
-msgid "mi"
+#: poor/keystore.py:60
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
msgstr ""
-#: poor/util.py:183 poor/util.py:201
+#: poor/keystore.py:61
+msgid ""
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
+msgstr ""
+
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare kliens ID"
+
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr ""
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox API kulcs"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
+msgstr ""
+
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest API kulcs"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API kulcs"
+
+#: poor/keystore.py:81
+msgid "Stadia Maps API key"
+msgstr "Stadia Maps API kulcs"
+
+#: poor/keystore.py:84
+msgid "HERE API Key"
+msgstr ""
+
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
+"policy of 2018 for details regarding use of HERE together with other "
+"providers under <a href=\"https://legal.here.com/en-gb/terms/acceptable-use-"
+"policy-2018\">Layering and Modifications</a> section of the "
+"document.</p><br><p>Please either accept the terms and the policy or decline"
+" them. If declined, HERE support will be inactive and can be enabled later "
+"by accepting the terms in Preferences under Licenses.</p>"
+msgstr ""
+
+#: poor/keystore.py:106
+msgid "HERE End-User Terms"
+msgstr ""
+
+#: poor/router.py:104 poor/router.py:106
+msgid "Exit: "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/it.po
^
|
@@ -5,18 +5,18 @@
#
# Translators:
# Watchmaker <alessandro.pra@gmail.com>, 2018
-# rinigus github, 2019
# albanobattistella <albano_battistella@hotmail.com>, 2019
# Michele Claus <claus.miki@hotmail.it>, 2020
+# rinigus github, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-22 13:56+0200\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
-"Last-Translator: Michele Claus <claus.miki@hotmail.it>, 2020\n"
+"Last-Translator: rinigus github, 2021\n"
"Language-Team: Italian (https://www.transifex.com/rinigus/teams/89597/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,181 +24,193 @@
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: guides/foursquare.py:191
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
+#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Orari di apertura:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punto da geo link"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punto da coordinate"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punto dal codice Plus"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
-#: poor/router.py:134
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
+#: poor/router.py:136
msgid "Connection timed out"
msgstr "Connessione scaduta"
-#: poor/history.py:32 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:527
-#: qml/MenuPage.qml:87 qml/NearbyPage.qml:30 qml/NearbyPage.qml:137
-#: qml/NearbyPage.qml:152 qml/RoutePage.qml:30 qml/RoutePage.qml:31
-#: qml/RoutePage.qml:220 qml/RoutePage.qml:225 qml/RoutePage.qml:428
-#: qml/RoutePage.qml:443 qml/RoutePage.qml:445 qml/RoutePoint.qml:42
-#: qml/RoutePoint.qml:58
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Posizione attuale"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID cliente Foursquare. Registrati su https://developer.foursquare.com e crea"
-" il tuo ID cliente e le tue chiavi segrete"
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID cliente Foursquare"
-
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare client Segreto"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Chiave API Mapbox. Registrati su https://www.mapbox.com e crea la tua chiave"
-" API"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Chiave API Mapbox"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Chiave API MapQuest. Registrati su https://developer.mapquest.com/ e crea la"
-" tua chiave API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Chiave API MapQuest"
-
-#: poor/keystore.py:63
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
msgstr ""
-"Chiave API OpenCage. Registrati su https://opencagedata.com/ e crea la tua "
-"chiave API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Chiave API OpenCage"
-
-#: poor/keystore.py:67
+#: poor/keystore.py:61
msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Chiave API Stadia Maps. Registrati su https://stadiamaps.com/ e crea la tua "
-"chiave API"
-#: poor/keystore.py:68
-msgid "Stadia Maps API key"
-msgstr "Chiave API Stadia Maps"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID cliente Foursquare"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
-msgstr ""
-"QUI ID app. Registrati su https://developer.here.com e crea il tuo ID e "
-"codice personale"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare client Segreto"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Chiave API Mapbox"
#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "QUI ID app"
+msgid "MapTiler API key"
+msgstr ""
-#: poor/keystore.py:73 poor/keystore.py:74
-msgid "HERE App Code"
-msgstr "QUI Codice app"
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Chiave API MapQuest"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/nb.po
^
|
@@ -4,17 +4,17 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
-# rinigus github, 2019
# Peer-Atle Motland <PeerAtle@online.no>, 2019
+# rinigus github, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-02 22:21+0200\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
-"Last-Translator: Peer-Atle Motland <PeerAtle@online.no>, 2019\n"
+"Last-Translator: rinigus github, 2021\n"
"Language-Team: Norwegian Bokmål (https://www.transifex.com/rinigus/teams/89597/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,159 +22,193 @@
"Language: nb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Åpningstider:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punkt fra geo-kobling"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punkt fra koordinater"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punkt fra Plus-kode"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Tidsavbrudd for tilkoblingen"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:527
-#: qml/MenuPage.qml:87 qml/Navigator.qml:183 qml/NearbyPage.qml:30
-#: qml/NearbyPage.qml:155 qml/NearbyPage.qml:170 qml/RoutePage.qml:40
-#: qml/RoutePage.qml:42 qml/RoutePage.qml:46 qml/RoutePage.qml:441
-#: qml/RoutePage.qml:446 qml/RoutePage.qml:673 qml/RoutePage.qml:716
-#: qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Nåværende posisjon"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare klient-ID. Registrer deg på https://developer.foursquare.com og "
-"lag din egen klient-ID og hemmelige nøkler"
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare klient-ID"
-
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare hemmelig nøkkel"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox API-nøkkel. Registrer deg på https://www.mapbox.com og lag din egen "
-"API-nøkkel"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox API-nøkkel"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest API-nøkkel. Registrer deg på https://developer.mapquest.com/ og lag"
-" din egen API-nøkkel"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest API-nøkkel"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage API-nøkkel. Registrer deg på https://opencagedata.com/ og lag din "
-"egen API-nøkkel"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage API-nøkkel"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare klient-ID"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare hemmelig nøkkel"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox API-nøkkel"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps API-nøkkel. Registrer deg på https://stadiamaps.com/ og lag din "
-"egen API-nøkkel"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest API-nøkkel"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API-nøkkel"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps API-nøkkel"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"HER App-ID. Registrer deg på https://developer.here.com og lag din egen app-"
-"ID og kode"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/nl.po
^
|
@@ -13,7 +13,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Dutch (https://www.transifex.com/rinigus/teams/89597/nl/)\n"
@@ -23,29 +23,41 @@
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Openingstijden:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punt van geolink"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punt van coördinaten"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punt van pluscode"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Verbinding verlopen"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -53,129 +65,151 @@
msgid "Current position"
msgstr "Huidige positie"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare-client-id. Registreer je op https://developer.foursquare.com en "
-"maak je eigen client-id en clientgeheim aan."
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare-client-id"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare-clientgeheim"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox-api-sleutel. Registreer je op https://www.mapbox.com en maak je eigen"
-" api-sleutel aan."
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox-api-sleutel"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest-api-sleutel. Registreer je op https://developer.mapquest.com/ en "
-"maak je eigen api-sleutel aan."
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest-api-sleutel"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage-api-sleutel. Registreer je op https://opencagedata.com/ en maak je "
-"eigen api-sleutel aan."
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage-api-sleutel"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare-client-id"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare-clientgeheim"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox-api-sleutel"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps-api-sleutel. Registreer je op https://stadiamaps.com/ en maak je"
-" eigen api-sleutel aan."
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest-api-sleutel"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage-api-sleutel"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps-api-sleutel"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"HERE-app-id. Registreer je op https://developer.here.com en maak je eigen "
-"app-id en -code aan."
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "HERE-app-id"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/nl_BE.po
^
|
@@ -4,17 +4,17 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
-# rinigus github, 2018
# Nathan Follens, 2021
+# rinigus github, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-03-30 21:01+0300\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
-"Last-Translator: Nathan Follens, 2021\n"
+"Last-Translator: rinigus github, 2021\n"
"Language-Team: Dutch (Belgium) (https://www.transifex.com/rinigus/teams/89597/nl_BE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,159 +22,193 @@
"Language: nl_BE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Openingsuren:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punt van geolink"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punt van coördinaten"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punt van pluscode"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Time-out bij verbinding"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:527
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
-#: qml/NearbyPage.qml:155 qml/NearbyPage.qml:170 qml/RoutePage.qml:40
-#: qml/RoutePage.qml:42 qml/RoutePage.qml:46 qml/RoutePage.qml:104
-#: qml/RoutePage.qml:461 qml/RoutePage.qml:466 qml/RoutePage.qml:693
-#: qml/RoutePage.qml:736 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Huidige positie"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare-cliënt-ID. Registreert u op https://developer.foursquare.com en "
-"maakt uw(en) eigen cliënt-ID en cliëntgeheim aan"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare-cliënt-ID"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare-cliëntgeheim"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Mapbox-API-sleutel. Registreert u op https://www.mapbox.com en maakt uwen "
-"eigen API-sleutel aan"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox-API-sleutel"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"MapQuest-API-sleutel. Registreert u op https://developer.mapquest.com/ en "
-"maakt uwen eigen API-sleutel aan"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest-API-sleutel"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"OpenCage-API-sleutel. Registreert u op https://opencagedata.com/ en maakt "
-"uwen eigen API-sleutel aan"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage-API-sleutel"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare-cliënt-ID"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare-cliëntgeheim"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox-API-sleutel"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Stadia Maps-API-sleutel. Registreert u op https://stadiamaps.com/ en maakt "
-"uwen eigen API-sleutel aan"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest-API-sleutel"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage-API-sleutel"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps-API-sleutel"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"HERE-app-ID. Registreert u op https://developer.here.com en maakt uw(en) "
-"eigen app-ID en -code aan"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/pl.po
^
|
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Polish (https://www.transifex.com/rinigus/teams/89597/pl/)\n"
@@ -22,29 +22,41 @@
"Language: pl\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Godziny otwarcia:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punkt z geo linku"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Wskaż współrzędne"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punkt z Plus code"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Czas połączenia przekroczony"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,129 +64,151 @@
msgid "Current position"
msgstr "Obecna pozycja"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID klienta Foursquare. Zarejestruj się na https://developer.foursquare.com i"
-" stwórz własne ID klienta oraz Client Secret keys"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID klienta Foursquare"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare Client Secret"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Klucz API Mapbox. Zarejestruj się na https://www.mapbox.com i stwórz własny "
-"klucz API"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Klucz API Mapbox"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Klucz API MapQuest. Zarejestruj się na https://developer.mapquest.com/ i "
-"stwórz własny klucz API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Klucz API MapQuest"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Klucz API OpenCage. Zarejestruj się na https://opencagedata.com/ i stwórz "
-"własny klucz API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Klucz API OpenCage"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID klienta Foursquare"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare Client Secret"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Klucz API Mapbox"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Klucz API Stadia Maps. Zarejestruj się na https://stadiamaps.com/ i stwórz "
-"własny klucz API"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Klucz API MapQuest"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "Klucz API OpenCage"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Klucz API Stadia Maps"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"ID aplikacji HERE. Zarejestruj się na https://developer.here.com i stwórz "
-"własne ID i kod aplikacji"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "ID aplikacji HERE"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/pt_BR.po
^
|
@@ -13,7 +13,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/rinigus/teams/89597/pt_BR/)\n"
@@ -23,29 +23,41 @@
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Aberto:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Ponto do geo link"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Ponto das coordenadas"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Ponto do Código Plus"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Não foi possível se conectar"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -53,129 +65,151 @@
msgid "Current position"
msgstr "Posição atual"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"ID do cliente Foursquare. Registre em https://developer.foursquare.com e "
-"cria sua própria ID de Cliente e Chaves secretas de Cliente."
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID de Cliente do Foursquare"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Segredo de Cliente do Foursquare"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Chave de API do Mapbox. Registre em https://www.mapbox.com e crie sua "
-"própria chave de API"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Chave de API do Mapbox"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Chave de API do MapQuest. Registre em https://developer.mapquest.com/ e crie"
-" sua própria chave de API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Chave de API do MapQuest"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Chave de API do OpenCage Registre em https://opencagedata.com/ e crie sua "
-"própria chave de API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Chave de API do OpenCage"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "ID de Cliente do Foursquare"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Segredo de Cliente do Foursquare"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Chave de API do Mapbox"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Chave de API do Stadia Maps. Registre em https://stadiamaps.com/ e crie sua "
-"própria chave de API"
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Chave de API do MapQuest"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "Chave de API do OpenCage"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Chave de API do Stadia Maps"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"Chave de API do HERE. Registre em https://developer.here.com E crie sua "
-"própria ID do App e Código"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "ID de App do HERE"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/pure-maps.pot
^
|
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-22 21:12+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,29 +17,41 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr ""
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr ""
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr ""
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr ""
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr ""
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -47,117 +59,147 @@
msgid "Current position"
msgstr ""
-#: poor/keystore.py:50
+#: poor/keystore.py:57
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a href=\"https://developer.foursquare.com\">https://developer."
+"foursquare.com</a> and create your own Client ID and Client Secret keys"
msgstr ""
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr ""
-
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:59
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-#: poor/keystore.py:56
-msgid "Mapbox API key"
+#: poor/keystore.py:60
+msgid ""
+"Register at <a href=\"https://developer.mapquest.com\">https://developer."
+"mapquest.com</a> and create your own API key"
msgstr ""
-#: poor/keystore.py:59
+#: poor/keystore.py:61
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
-"your own API key"
+"Register at <a href=\"https://opencagedata.com\">https://opencagedata.com</"
+"a> and create your own API key"
msgstr ""
-#: poor/keystore.py:60
-msgid "MapQuest API key"
+#: poor/keystore.py:62
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
msgstr ""
#: poor/keystore.py:63
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
-msgstr ""
-
-#: poor/keystore.py:64
-msgid "OpenCage API key"
+"Register at <a href=\"https://developer.here.com\">https://developer.here."
+"com</a> and create your own App API Key"
msgstr ""
#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own "
-"API key"
+msgid "Foursquare Client ID"
msgstr ""
#: poor/keystore.py:68
-msgid "Stadia Maps API key"
+msgid "Foursquare Client Secret"
msgstr ""
#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+msgid "Mapbox API key"
+msgstr ""
+
+#: poor/keystore.py:74
+msgid "MapTiler API key"
msgstr ""
-#: poor/keystore.py:72
-msgid "HERE App ID"
+#: poor/keystore.py:77
+msgid "MapQuest API key"
+msgstr ""
+
+#: poor/keystore.py:80
+msgid "OpenCage API key"
msgstr ""
-#: poor/keystore.py:73 poor/keystore.py:74
-msgid "HERE App Code"
+#: poor/keystore.py:83
+msgid "Stadia Maps API key"
+msgstr ""
+
+#: poor/keystore.py:86
+msgid "HERE API Key"
+msgstr ""
+
+#: poor/keystore.py:94
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE services.</"
+"p><br><p>Please consult <a href=\"https://legal.here.com/en-gb/terms/here-"
+"end-user-terms\">end-user terms</a>, <a href=\"https://legal.here.com/en-gb/"
+"terms/acceptable-use-policy\">acceptable use policy</a>, and <a href="
+"\"https://legal.here.com/en-gb/privacy\">HERE Privacy policies</a>. In "
+"context of use of HERE and privacy policy, Pure Maps communicates with HERE "
+"using REST API.<p></br><p>For <a href=\"https://knowledge.here.com/csm_kb?"
+"id=public_kb_csm_details&number=KB0016412\">legal reasons</a>, Pure Maps "
+"enables HERE search and routing in a dedicated \"HERE Online\" profile only. "
+"While not active anymore, see acceptable use policy of 2018 for details "
+"regarding use of HERE together with other providers under <a href=\"https://"
+"legal.here.com/en-gb/terms/acceptable-use-policy-2018\">Layering and "
+"Modifications</a> section of the document.</p><br><p>Please either accept "
+"the terms and the policy or decline them. If declined, HERE support will be "
+"inactive and can be enabled later by accepting the terms in Preferences "
+"under Licenses.</p>"
+msgstr ""
+
+#: poor/keystore.py:108
+msgid "HERE End-User Terms"
msgstr ""
#: poor/router.py:104 poor/router.py:106
msgid "Exit: "
msgstr ""
-#: poor/util.py:227 poor/util.py:238 src/navigator.cpp:902
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/ru.po
^
|
@@ -13,7 +13,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Russian (https://www.transifex.com/rinigus/teams/89597/ru/)\n"
@@ -23,29 +23,41 @@
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Часы работы:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Местоположение от geo link"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Местоположение по координатам"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Пункт из Plus кода"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Время ожидания соединения истекло"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -53,130 +65,151 @@
msgid "Current position"
msgstr "Текущая позиция"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Идентификатор клиента Foursquare. Зарегистрируйтесь на "
-"https://developer.foursquare.com и создайте персональный Идентификатор и "
-"Секретный ключ клиента"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Идентификатор Foursquare"
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Секретный ключ Foursquare"
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:55
+#: poor/keystore.py:57
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"Ключ Mapbox API. Зарегистрируйтесь на https://www.mapbox.com и создайте "
-"персональный ключ API"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Ключ Mapbox API"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
"your own API key"
msgstr ""
-"Ключ MapQuest API. Зарегистрируйтесь на https://developer.mapquest.com/ и "
-"создайте персональный ключ API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Ключ MapQuest API"
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
msgstr ""
-"Ключ OpenCage API. Зарегистрируйтесь на https://opencagedata.com/ и создайте"
-" персональный ключ API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Ключ OpenCage API"
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Идентификатор Foursquare"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Секретный ключ Foursquare"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Ключ Mapbox API"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
msgstr ""
-"Ключ Stadia Maps API. Зарегистрируйтесь на https://stadiamaps.com/ и "
-"создайте персональный ключ API."
-#: poor/keystore.py:68
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "Ключ MapQuest API"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "Ключ OpenCage API"
+
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Ключ Stadia Maps API"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
+#: poor/keystore.py:84
+msgid "HERE API Key"
msgstr ""
-"Идентификатор приложения HERE . Зарегистрируйтесь на "
-"https://developer.here.com и создайте персональные Идентификатор и Код."
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "Идентификатор HERE"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/sk_SK.po
^
|
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-22 21:12+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Slovak (Slovakia) (https://www.transifex.com/rinigus/teams/89597/sk_SK/)\n"
@@ -22,29 +22,41 @@
"Language: sk_SK\n"
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr "Vyhľadať návrh"
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr "Druh jedla: {}"
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr "Otváracia doba: {}"
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Otváracia doba:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Bod z geo link"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Bod zo súradníc"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Bod z Plus code"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Čas pripojenia vypršal"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,129 +64,173 @@
msgid "Current position"
msgstr "Aktuálna poloha"
-#: poor/keystore.py:50
+#: poor/keystore.py:57
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare Client ID. Zaregistrujte sa na https://developer.foursquare.com a"
-" vytvorte svoje osobné ID aplikácie a osobný kľúč"
+"Registrujte sa na <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" a vytvorte si vlastný Client ID a kľúče Client Secret"
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "ID klienta Foursquare"
-
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Osobný kľúč Foursquare"
-
-#: poor/keystore.py:55
+#: poor/keystore.py:58
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
msgstr ""
-"Mapbox API kľúč. Zaregistrujte sa na https://www.mapbox.com a vytvorte svoj "
-"osobný kľúč"
-
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Osobný kľúč Mapbox API"
+"Registrujte sa na <a "
+"href=\"https://www.mapbox.com\">https://www.mapbox.com</a> a vytvorte si "
+"vlastný kľúč API"
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
-"your own API key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"MapQuest API kľúč. Zaregistrujte sa na https://developer.mapquest.com/ a "
-"vytvorte svoj osobný API kľúč"
+"Registrujte sa na <a href=\"https://maptiler.com\">https://maptiler.com</a> "
+"a vytvorte si vlastný kľúč API"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "Osobný kľúč MapQuest API"
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
+"Registrujte sa na <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> a"
+" vytvorte si vlastný kľúč API"
-#: poor/keystore.py:63
+#: poor/keystore.py:61
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
+"your own API key"
msgstr ""
-"OpenCage API kľúč. Zaregistrujte sa na https://opencagedata.com/ a vytvorte "
-"svoj osobný API kľúč"
+"Registrujte sa na <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> a vytvorte si"
+" vlastný kľúč API"
+
+#: poor/keystore.py:62
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
+"Registrujte sa na <a "
+"href=\"https://stadiamaps.com\">https://stadiamaps.com</a> a vytvorte si "
+"vlastný kľúč API"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "Osobný kľúč OpenCage API"
+#: poor/keystore.py:63
+msgid ""
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
+msgstr ""
+"Registrujte sa na <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> a "
+"vytvorte si vlastný kľúč API"
#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
-msgstr ""
-"Stadia Maps API kľúč. Zaregistrujte sa na https://stadiamaps.com/ a vytvorte"
-" svoj osobný API kľúč"
+msgid "Foursquare Client ID"
+msgstr "ID klienta Foursquare"
#: poor/keystore.py:68
-msgid "Stadia Maps API key"
-msgstr "Osobný kľúč Stadia Maps API"
+msgid "Foursquare Client Secret"
+msgstr "Osobný kľúč Foursquare"
#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
-msgstr ""
-"ID HERE App. Zaregistrujte sa na https://developer.here.com a vytvorte svoje"
-" osobné ID aplikácie a osobný kód"
+msgid "Mapbox API key"
+msgstr "Osobný kľúč Mapbox API"
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "ID aplikácie HERE"
-
-#: poor/keystore.py:73 poor/keystore.py:74
-msgid "HERE App Code"
-msgstr "Osobný kód aplikácie HERE"
+#: poor/keystore.py:74
+msgid "MapTiler API key"
+msgstr "Kľúč MapTiler API"
+
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/sl_SI.po
^
|
@@ -2,248 +2,420 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+#
+# Translators:
+# Boštjan Štrumbelj <sponka@gmail.com>, 2019
+# rinigus github, 2019
+#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-26 13:00+0300\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: rinigus github, 2018\n"
+"POT-Creation-Date: 2021-11-20 17:14+0200\n"
+"PO-Revision-Date: 2018-08-22 13:49+0000\n"
+"Last-Translator: rinigus github, 2019\n"
"Language-Team: Slovenian (Slovenia) (https://www.transifex.com/rinigus/teams/89597/sl_SI/)\n"
+"Language: sl_SI\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: sl_SI\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
-#: poor/geocoder.py:108
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
+#: guides/foursquare.py:198
+msgid "Opening hours:"
+msgstr "Odpiralni čas:"
+
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Točka iz geo povezave"
-#: poor/geocoder.py:120
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Točka iz koodinat"
-#: poor/geocoder.py:130 poor/guide.py:123 poor/router.py:102
+#: poor/geocoder.py:136
+msgid "Point from Plus code"
+msgstr ""
+
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
+#: poor/router.py:136
msgid "Connection timed out"
msgstr "Čas za povezavo je potekel"
-#: poor/history.py:32 qml/NearbyPage.qml:27 qml/NearbyPage.qml:88
-#: qml/NearbyPage.qml:96 qml/NearbyPage.qml:172 qml/NearbyPage.qml:182
-#: qml/RoutePage.qml:27 qml/RoutePage.qml:28 qml/RoutePage.qml:80
-#: qml/RoutePage.qml:88 qml/RoutePage.qml:113 qml/RoutePage.qml:121
-#: qml/RoutePage.qml:179 qml/RoutePage.qml:184 qml/RoutePage.qml:186
-#: qml/RoutePointPage.qml:94 qml/RoutePointPage.qml:97
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
+#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
+#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
+#: qml/RoutePage.qml:747 qml/RoutePoint.qml:44 qml/RoutePoint.qml:62
msgid "Current position"
msgstr "Trenuten položaj"
-#: poor/narrative.py:127
-#, python-brace-format
-msgid "In {distance}, {direction}"
-msgstr "V {distance}, {direction}"
+#: poor/keystore.py:55
+msgid ""
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
+msgstr ""
-#: poor/narrative.py:218 poor/narrative.py:220
-msgid "Exit: "
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
msgstr ""
-#: poor/narrative.py:415 qml/pure-maps.qml:163
-msgid "Rerouting"
-msgstr "Preusmerjanje"
+#: poor/keystore.py:57
+msgid ""
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
+msgstr ""
-#: poor/narrative.py:416 qml/pure-maps.qml:185
-msgid "Rerouting failed"
-msgstr "Preusmerjanje ni uspelo"
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
-#: poor/narrative.py:417 qml/pure-maps.qml:179
-msgid "New route found"
-msgstr "Najdena nova pot"
+#: poor/keystore.py:59
+msgid ""
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
+"your own API key"
+msgstr ""
-#: poor/util.py:183 poor/util.py:201
-msgid "mi"
+#: poor/keystore.py:60
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
+
+#: poor/keystore.py:61
+msgid ""
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
+msgstr ""
+
+#: poor/keystore.py:65
+msgid "Foursquare Client ID"
+msgstr "Foursquare Client ID"
+
+#: poor/keystore.py:66
+msgid "Foursquare Client Secret"
+msgstr "Foursquare geslo"
+
+#: poor/keystore.py:69
+msgid "Mapbox API key"
+msgstr "Mapbox API ključ"
+
+#: poor/keystore.py:72
+msgid "MapTiler API key"
+msgstr ""
+
+#: poor/keystore.py:75
+msgid "MapQuest API key"
+msgstr "MapQuest API ključ"
+
+#: poor/keystore.py:78
+msgid "OpenCage API key"
+msgstr "OpenCage API ključ"
+
+#: poor/keystore.py:81
+msgid "Stadia Maps API key"
+msgstr "Stadia Maps API ključ"
+
+#: poor/keystore.py:84
+msgid "HERE API Key"
+msgstr ""
+
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
+"policy of 2018 for details regarding use of HERE together with other "
+"providers under <a href=\"https://legal.here.com/en-gb/terms/acceptable-use-"
+"policy-2018\">Layering and Modifications</a> section of the "
+"document.</p><br><p>Please either accept the terms and the policy or decline"
+" them. If declined, HERE support will be inactive and can be enabled later "
+"by accepting the terms in Preferences under Licenses.</p>"
msgstr ""
-#: poor/util.py:183 poor/util.py:201
+#: poor/keystore.py:106
+msgid "HERE End-User Terms"
+msgstr ""
+
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/sv.po
^
|
@@ -4,17 +4,17 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
-# Åke Engelbrektson, 2021
# rinigus github, 2021
+# Åke Engelbrektson, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-22 21:12+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
-"Last-Translator: rinigus github, 2021\n"
+"Last-Translator: Åke Engelbrektson, 2021\n"
"Language-Team: Swedish (https://www.transifex.com/rinigus/teams/89597/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,29 +22,41 @@
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr "Sökförslag"
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr "Typ av mat: {}"
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr "Öppettider: {}"
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "Öppettider:"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "Punkt från geolänk"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "Punkt från koordinater"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "Punkt från Plus-kod"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "Tidsgränsen för anslutning överskreds"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,129 +64,187 @@
msgid "Current position"
msgstr "Aktuell position"
-#: poor/keystore.py:50
+#: poor/keystore.py:57
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
msgstr ""
-"Foursquare klient-ID. Registrera dig på https://developer.foursquare.com och"
-" skapa ditt eget klient-ID och klienthemlighet"
-
-#: poor/keystore.py:51
-msgid "Foursquare Client ID"
-msgstr "Foursquare klient-ID"
-
-#: poor/keystore.py:52
-msgid "Foursquare Client Secret"
-msgstr "Foursquare klienthemlighet"
+"Registrera dig på <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" och skapa ditt eget klient-ID och klientnycklar"
-#: poor/keystore.py:55
+#: poor/keystore.py:58
msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
msgstr ""
-"Mapbox API-nyckel. Registrera dig på https://www.mapbox.com och skapa din "
+"Registrera dig på <a "
+"href=\"https://www.mapbox.com\">https://www.mapbox.com</a> och skapa din "
"egen API-nyckel"
-#: poor/keystore.py:56
-msgid "Mapbox API key"
-msgstr "Mapbox API-nyckel"
-
#: poor/keystore.py:59
msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
-"your own API key"
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
msgstr ""
-"MapQuest API-nyckel. Registrera dig på https://developer.mapquest.com/ och "
-"skapa din egen API-nyckel"
+"Registrera dig på <a href=\"https://maptiler.com\">https://maptiler.com</a> "
+"och skapa din egen API-nyckel"
#: poor/keystore.py:60
-msgid "MapQuest API key"
-msgstr "MapQuest API-nyckel"
-
-#: poor/keystore.py:63
msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
msgstr ""
-"OpenCage API-nyckel. Registrera dig på https://opencagedata.com/ och skapa "
-"din egen API-nyckel"
+"Registrera dig på<a href=\"https://developer.mapquest.com\"> "
+"https://developer.mapquest.com</a> och skapa din egen API-nyckel"
-#: poor/keystore.py:64
-msgid "OpenCage API key"
-msgstr "OpenCage API-nyckel"
+#: poor/keystore.py:61
+msgid ""
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
+"your own API key"
+msgstr ""
+"Registrera dig på <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> och skapa din"
+" egen API-nyckel"
-#: poor/keystore.py:67
+#: poor/keystore.py:62
msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
msgstr ""
-"Stadia Maps API-nyckel. Registrera dig på https://stadiamaps.com/ och skapa "
-"din egen API-nyckel"
+"Registrera dig på <a "
+"href=\"https://stadiamaps.com\">https://stadiamaps.com</a> och skapa din "
+"egen API-nyckel"
+
+#: poor/keystore.py:63
+msgid ""
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
+msgstr ""
+"Registrera dig på <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> och skapa"
+" din egen App-API-nyckel"
+
+#: poor/keystore.py:67
+msgid "Foursquare Client ID"
+msgstr "Foursquare klient-ID"
#: poor/keystore.py:68
-msgid "Stadia Maps API key"
-msgstr "Stadia Maps API-nyckel"
+msgid "Foursquare Client Secret"
+msgstr "Foursquare klienthemlighet"
#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
-msgstr ""
-"HERE app-ID. Registrera dig på https://developer.here.com och skapa ditt "
-"eget app-ID och kod"
+msgid "Mapbox API key"
+msgstr "Mapbox API-nyckel"
-#: poor/keystore.py:72
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/po/zh_CN.po
^
|
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-10-17 15:51+0300\n"
+"POT-Creation-Date: 2021-11-21 15:10+0200\n"
"PO-Revision-Date: 2018-08-22 13:49+0000\n"
"Last-Translator: rinigus github, 2021\n"
"Language-Team: Chinese (China) (https://www.transifex.com/rinigus/teams/89597/zh_CN/)\n"
@@ -22,29 +22,41 @@
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+#: geocoders/here.py:141
+msgid "Search suggestion"
+msgstr ""
+
+#: geocoders/here.py:149
+msgid "Food types: {}"
+msgstr ""
+
+#: geocoders/here.py:156
+msgid "Opening hours: {}"
+msgstr ""
+
#: guides/foursquare.py:198
msgid "Opening hours:"
msgstr "营业时间 :"
-#: poor/geocoder.py:110
+#: poor/geocoder.py:112
msgid "Point from geo link"
msgstr "地理链接位置"
-#: poor/geocoder.py:122
+#: poor/geocoder.py:124
msgid "Point from coordinates"
msgstr "按坐标划分的位置"
-#: poor/geocoder.py:134
+#: poor/geocoder.py:136
msgid "Point from Plus code"
msgstr "从附加代码指向"
-#: poor/geocoder.py:143 poor/geocoder.py:180 poor/guide.py:123
+#: poor/geocoder.py:145 poor/geocoder.py:182 poor/guide.py:123
#: poor/router.py:136
msgid "Connection timed out"
msgstr "连接超时"
-#: poor/history.py:33 qml/GeocodeItem.qml:209 qml/GeocodeItem.qml:529
-#: qml/MenuPage.qml:87 qml/Navigator.qml:192 qml/NearbyPage.qml:30
+#: poor/history.py:33 qml/GeocodeItem.qml:210 qml/GeocodeItem.qml:544
+#: qml/MenuPage.qml:87 qml/Navigator.qml:193 qml/NearbyPage.qml:30
#: qml/NearbyPage.qml:161 qml/NearbyPage.qml:176 qml/RoutePage.qml:40
#: qml/RoutePage.qml:42 qml/RoutePage.qml:102 qml/RoutePage.qml:461
#: qml/RoutePage.qml:466 qml/RoutePage.qml:694 qml/RoutePage.qml:723
@@ -52,117 +64,151 @@
msgid "Current position"
msgstr "当前位置"
-#: poor/keystore.py:50
+#: poor/keystore.py:55
+msgid ""
+"Register at <a "
+"href=\"https://developer.foursquare.com\">https://developer.foursquare.com</a>"
+" and create your own Client ID and Client Secret keys"
+msgstr ""
+
+#: poor/keystore.py:56
+msgid ""
+"Register at <a href=\"https://www.mapbox.com\">https://www.mapbox.com</a> "
+"and create your own API key"
+msgstr ""
+
+#: poor/keystore.py:57
+msgid ""
+"Register at <a href=\"https://maptiler.com\">https://maptiler.com</a> and "
+"create your own API key"
+msgstr ""
+
+#: poor/keystore.py:58
+msgid ""
+"Register at <a "
+"href=\"https://developer.mapquest.com\">https://developer.mapquest.com</a> "
+"and create your own API key"
+msgstr ""
+
+#: poor/keystore.py:59
msgid ""
-"Foursquare Client ID. Register at https://developer.foursquare.com and "
-"create your own Client ID and Client Secret keys"
-msgstr "Foursquare 客户端账号,在 https://developer.foursquare.com 注册和创建你的客户端账号和密码。"
+"Register at <a "
+"href=\"https://opencagedata.com\">https://opencagedata.com</a> and create "
+"your own API key"
+msgstr ""
+
+#: poor/keystore.py:60
+msgid ""
+"Register at <a href=\"https://stadiamaps.com\">https://stadiamaps.com</a> "
+"and create your own API key"
+msgstr ""
+
+#: poor/keystore.py:61
+msgid ""
+"Register at <a "
+"href=\"https://developer.here.com\">https://developer.here.com</a> and "
+"create your own App API Key"
+msgstr ""
-#: poor/keystore.py:51
+#: poor/keystore.py:65
msgid "Foursquare Client ID"
msgstr "Foursquare 客户端账号"
-#: poor/keystore.py:52
+#: poor/keystore.py:66
msgid "Foursquare Client Secret"
msgstr "Foursquare 客户端密码"
-#: poor/keystore.py:55
-msgid ""
-"Mapbox API key. Register at https://www.mapbox.com and create your own API "
-"key"
-msgstr "Mapbox API 秘钥,在https://www.mapbox.com 注册和创建你的 API 秘钥"
-
-#: poor/keystore.py:56
+#: poor/keystore.py:69
msgid "Mapbox API key"
msgstr "Mapbox API 秘钥"
-#: poor/keystore.py:59
-msgid ""
-"MapQuest API key. Register at https://developer.mapquest.com/ and create "
-"your own API key"
-msgstr "MapQuest API 秘钥, 在 https://developer.mapquest.com/ 注册和创建你的API 秘钥"
+#: poor/keystore.py:72
+msgid "MapTiler API key"
+msgstr ""
-#: poor/keystore.py:60
+#: poor/keystore.py:75
msgid "MapQuest API key"
msgstr "MapQuest API 秘钥"
-#: poor/keystore.py:63
-msgid ""
-"OpenCage API key. Register at https://opencagedata.com/ and create your own "
-"API key"
-msgstr "OpenCage API 秘钥, 在 https://opencagedata.com/ 注册和创建你的API 秘钥"
-
-#: poor/keystore.py:64
+#: poor/keystore.py:78
msgid "OpenCage API key"
msgstr "OpenCage API 秘钥"
-#: poor/keystore.py:67
-msgid ""
-"Stadia Maps API key. Register at https://stadiamaps.com/ and create your own"
-" API key"
-msgstr "Stadia Maps API 秘钥, 在 https://stadiamaps.com/ 注册和创建你的 API 秘钥"
-
-#: poor/keystore.py:68
+#: poor/keystore.py:81
msgid "Stadia Maps API key"
msgstr "Stadia Maps API 秘钥"
-#: poor/keystore.py:71
-msgid ""
-"HERE App ID. Register at https://developer.here.com and create your own App "
-"ID and Code"
-msgstr "HERE 地图账号,在 https://developer.here.com 注册和创建你的账号和密码"
+#: poor/keystore.py:84
+msgid "HERE API Key"
+msgstr ""
-#: poor/keystore.py:72
-msgid "HERE App ID"
-msgstr "HERE 软件账号"
+#: poor/keystore.py:92
+msgid ""
+"<p>Your Pure Maps installation has enabled support for HERE "
+"services.</p><br><p>Please consult <a href=\"https://legal.here.com/en-"
+"gb/terms/here-end-user-terms\">end-user terms</a>, <a "
+"href=\"https://legal.here.com/en-gb/terms/acceptable-use-policy\">acceptable"
+" use policy</a>, and <a href=\"https://legal.here.com/en-gb/privacy\">HERE "
+"Privacy policies</a>. In context of use of HERE and privacy policy, Pure "
+"Maps communicates with HERE using REST API.<p></br><p>For <a "
+"href=\"https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412\">legal"
+" reasons</a>, Pure Maps enables HERE search and routing in a dedicated "
+"\"HERE Online\" profile only. While not active anymore, see acceptable use "
+"policy of 2018 for details regarding use of HERE together with other "
+"providers under <a href=\"https://legal.here.com/en-gb/terms/acceptable-use-"
+"policy-2018\">Layering and Modifications</a> section of the "
+"document.</p><br><p>Please either accept the terms and the policy or decline"
+" them. If declined, HERE support will be inactive and can be enabled later "
+"by accepting the terms in Preferences under Licenses.</p>"
+msgstr ""
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/CMakeLists.txt
^
|
@@ -14,17 +14,16 @@
add_custom_target(sed_default_providers ALL
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/config.py")
-add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/keystore.py"
- COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/keystore.py ${CMAKE_CURRENT_BINARY_DIR}/keystore.py
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../tools/manage-keys inject ${CMAKE_CURRENT_BINARY_DIR})
+add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/apikeys.py"
+ COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/../tools/apikeys.py ${CMAKE_CURRENT_BINARY_DIR})
add_custom_target(inject_keys ALL
- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/keystore.py")
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/apikeys.py")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/paths.py
DESTINATION ${DATADIR}/poor)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/config.py
- ${CMAKE_CURRENT_BINARY_DIR}/keystore.py
+ ${CMAKE_CURRENT_BINARY_DIR}/apikeys.py
DESTINATION ${DATADIR}/poor)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/astral/astral.py
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/apikeys.py
^
|
@@ -0,0 +1,23 @@
+Keys = {
+ # https://developer.foursquare.com
+ "FOURSQUARE_CLIENT": "",
+ "FOURSQUARE_SECRET": "",
+
+ # here.com
+ "HERE_APIKEY": "",
+
+ # mapbox.com
+ "MAPBOX_KEY": "",
+
+ # maptiler.com
+ "MAPTILER_KEY": "",
+
+ # http://open.mapquestapi.com
+ "MAPQUEST_KEY": "",
+
+ # https://geocoder.opencagedata.com/api
+ "OPENCAGE_KEY": "",
+
+ # https://docs.stadiamaps.com/
+ "STADIAMAPS_KEY": "",
+}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/application.py
^
|
@@ -18,6 +18,7 @@
"""An application to display maps and stuff."""
import poor
+import random
import sys
__all__ = ("Application",)
@@ -29,14 +30,20 @@
def __init__(self):
"""Initialize an :class:`Application` instance."""
- self.basemap = poor.MapManager()
- self.geocoder = None
- self.guide = None
+ # some of the components are initialized separately
+ # after handling of all licenses
+ random.seed()
self.history = poor.HistoryManager()
self.magfield = poor.MagField()
- self.router = None
self.sun = poor.Sun()
self._voice = {}
+
+ def initialize(self):
+ """Initialize all components that may depend on licenses."""
+ self.basemap = poor.MapManager()
+ self.geocoder = None
+ self.guide = None
+ self.router = None
self.set_basemap(poor.conf.basemap)
self.set_geocoder(poor.conf.geocoder)
self.set_guide(poor.conf.guide)
@@ -53,10 +60,6 @@
items.append(item)
return items
- def has_mapmatching(self):
- """Return True if map matching requirements are met"""
- return (poor.util.requirement_found("harbour-osmscout-server") or poor.util.requirement_found("osmscout-server"))
-
def quit(self):
"""Quit the application."""
print("Quitting")
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/config.py
^
|
@@ -26,7 +26,7 @@
__all__ = ("ConfigurationStore",)
-_default_basemap = "Mapbox"
+_default_basemap = "MapTiler"
_default_geocoder = "photon"
_default_guide = "foursquare"
_default_router = "stadiamaps"
@@ -39,6 +39,7 @@
"auto_rotate_when_navigating": True,
"basemap_auto_light": "none",
"basemap_auto_mode": True,
+ "basemap_fallback": "OpenTopoMap", # should work without any API keys or API keys are always added
"basemap_lang": "local",
"basemap_light": "",
"basemap_type": "",
@@ -76,6 +77,7 @@
"map_zoom_auto_time": 60.0,
"map_zoom_auto_when_navigating": False,
"map_zoom_auto_zero_speed_z": 16.0,
+ "navigation_horizontal_accuracy": 15.0,
"poi_list_show_bookmarked": False,
"profile": _default_profile,
"profiles": {
@@ -96,6 +98,12 @@
"geocoder": "osmscout",
"guide": "osmscout",
"router": "osmscout"
+ },
+ "HERE": {
+ "basemap": "HERE",
+ "geocoder": "here",
+ "guide": _default_guide,
+ "router": "here"
}
},
"reroute": True,
@@ -228,6 +236,10 @@
"""Add configuration `values` for keys if missing."""
self._register({"keys": values})
+ def register_licenses(self, values):
+ """Add configuration `values` for licenses if missing."""
+ self._register({"licenses": values})
+
def register_guide(self, name, values):
"""Add configuration `values` for guide `name` if missing."""
self._register({"guides": {name: values}})
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/flexpolyline
^
|
+(symlink to ../thirdparty/flexible-polyline/python/flexpolyline)
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/geocoder.py
^
|
@@ -63,7 +63,7 @@
"""Return a list of attribution dictionaries."""
return [{"text": k, "url": v} for k, v in self._attribution.items()]
- def autocomplete(self, query, x=0, y=0, params=None):
+ def autocomplete(self, query, x=0, y=0, center_x=0, center_y=0, params=None):
"""
Return a list of autocomplete dictionaries matching `query`.
@@ -78,7 +78,7 @@
olc_isFull(query.strip())):
return []
try:
- results = self._provider.autocomplete(query=query, x=x, y=y, params=params)
+ results = self._provider.autocomplete(query=query, x=center_x, y=center_y, params=params)
except Exception:
print("Autocomplete failed:", file=sys.stderr)
traceback.print_exc()
@@ -93,7 +93,7 @@
bearing = poor.util.calculate_bearing(x1, y1, x2, y2)
return poor.util.format_distance_and_bearing(distance, bearing)
- def geocode(self, query, x=0, y=0, params=None):
+ def geocode(self, query, x=0, y=0, center_x=0, center_y=0, params=None):
"""
Return a list of dictionaries of places matching `query`.
@@ -102,43 +102,45 @@
the results will include correct distance and bearing.
"""
params = params or {}
- # Parse coordinates if query is a geo URI.
- match = RE_GEO_URI.search(query)
- if match is not None:
- qy = float(match.group(1))
- qx = float(match.group(2))
- return [dict(title=_("Point from geo link"),
- description=match.group(0),
- x=qx,
- y=qy,
- distance=self._format_distance(x, y, qx, qy),
- provider=self.id)]
-
- # Parse coordinates if query is "LAT,LON".
- match = RE_LAT_LON.search(query)
- if match is not None:
- qy = float(match.group(1))
- qx = float(match.group(3))
- return [dict(title=_("Point from coordinates"),
- description=match.group(0),
- x=qx,
- y=qy,
- distance=self._format_distance(x, y, qx, qy),
- provider=self.id)]
-
- # Parse if query is a Plus code
- qtrimmed = query.strip()
- if olc_isFull(qtrimmed):
- latlng = olc_decode(qtrimmed).latlng()
- return [dict(title=qtrimmed.upper(),
- description=_("Point from Plus code"),
- x=latlng[1],
- y=latlng[0],
- distance=self._format_distance(x, y, latlng[1], latlng[0]),
- provider=self.id)]
+ # check special string queries
+ if isinstance(query, str):
+ # Parse coordinates if query is a geo URI.
+ match = RE_GEO_URI.search(query)
+ if match is not None:
+ qy = float(match.group(1))
+ qx = float(match.group(2))
+ return [dict(title=_("Point from geo link"),
+ description=match.group(0),
+ x=qx,
+ y=qy,
+ distance=self._format_distance(x, y, qx, qy),
+ provider=self.id)]
+
+ # Parse coordinates if query is "LAT,LON".
+ match = RE_LAT_LON.search(query)
+ if match is not None:
+ qy = float(match.group(1))
+ qx = float(match.group(3))
+ return [dict(title=_("Point from coordinates"),
+ description=match.group(0),
+ x=qx,
+ y=qy,
+ distance=self._format_distance(x, y, qx, qy),
+ provider=self.id)]
+
+ # Parse if query is a Plus code
+ qtrimmed = query.strip()
+ if olc_isFull(qtrimmed):
+ latlng = olc_decode(qtrimmed).latlng()
+ return [dict(title=qtrimmed.upper(),
+ description=_("Point from Plus code"),
+ x=latlng[1],
+ y=latlng[0],
+ distance=self._format_distance(x, y, latlng[1], latlng[0]),
+ provider=self.id)]
try:
- results = self._provider.geocode(query=query, x=x, y=y, params=params)
+ results = self._provider.geocode(query=query, x=center_x, y=center_y, params=params)
except socket.timeout:
return dict(error=True, message=_("Connection timed out"))
except Exception:
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/http.py
^
|
@@ -270,7 +270,7 @@
that imply a connection error. `headers` should be a dictionary of custom
headers to add to the defaults :attr:`http.HEADERS`.
"""
- print("{} {}".format(method, url))
+ #print("{} {}".format(method, url))
try:
connection = pool.get(url)
# Do relative requests (without scheme and netloc)
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/keystore.py
^
|
@@ -15,63 +15,97 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import copy
import poor
from collections import namedtuple
from poor.i18n import _
+from .apikeys import Keys as ApiKeys
__all__ = ("KeyStore",)
-DEFAULTS = {
+HeaderDesc = namedtuple('HeaderDesc', ['description', 'title'])
+LicenseDesc = namedtuple('LicenseDesc', ['text', 'title'])
+
+# key has to start with the same prefix as used in the HEADERS, then
+# underscore and folowed by any string
+KEYNAMES = [
# https://developer.foursquare.com
- "FOURSQUARE_CLIENT": "<FOURSQUARE_CLIENT>",
- "FOURSQUARE_SECRET": "<FOURSQUARE_SECRET>",
+ "FOURSQUARE_CLIENT",
+ "FOURSQUARE_SECRET",
+
+ # here.com
+ "HERE_APIKEY",
# mapbox.com
- "MAPBOX_KEY": "<MAPBOX_KEY>",
+ "MAPBOX_KEY",
+
+ # maptiler.com
+ "MAPTILER_KEY",
# http://open.mapquestapi.com
- "MAPQUEST_KEY": "<MAPQUEST_KEY>",
+ "MAPQUEST_KEY",
- # https://geocoder.opencagedata.com/api [old key]
- "OPENCAGE_KEY": "<OPENCAGE_KEY>",
+ # https://geocoder.opencagedata.com/api
+ "OPENCAGE_KEY",
# https://docs.stadiamaps.com/
- "STADIAMAPS_KEY": "<STADIAMAPS_KEY>",
+ "STADIAMAPS_KEY"
+]
- # here.com
- "HERE_APP_ID": "<HERE_APP_ID>",
- "HERE_APP_CODE": "<HERE_APP_CODE>",
+HEADERS = {
+ "FOURSQUARE": HeaderDesc(_('Register at <a href="https://developer.foursquare.com">https://developer.foursquare.com</a> and create your own Client ID and Client Secret keys'), "Foursquare"),
+ "MAPBOX": HeaderDesc(_('Register at <a href="https://www.mapbox.com">https://www.mapbox.com</a> and create your own API key'), "Mapbox"),
+ "MAPTILER": HeaderDesc(_('Register at <a href="https://maptiler.com">https://maptiler.com</a> and create your own API key'), "MapTiler"),
+ "MAPQUEST": HeaderDesc(_('Register at <a href="https://developer.mapquest.com">https://developer.mapquest.com</a> and create your own API key'), "MapQuest"),
+ "OPENCAGE": HeaderDesc(_('Register at <a href="https://opencagedata.com">https://opencagedata.com</a> and create your own API key'), "OpenCage"),
+ "STADIAMAPS": HeaderDesc(_('Register at <a href="https://stadiamaps.com">https://stadiamaps.com</a> and create your own API key'), "Stadia Maps"),
+ "HERE": HeaderDesc(_('Register at <a href="https://developer.here.com">https://developer.here.com</a> and create your own App API Key'), "HERE")
}
-ApiKeyDesc = namedtuple('ApiKeyDesc', ['description', 'label'])
-
KEYDESC = {
- "FOURSQUARE_CLIENT": ApiKeyDesc(_("Foursquare Client ID. Register at https://developer.foursquare.com and create your own Client ID and Client Secret keys"),
- _("Foursquare Client ID")),
- "FOURSQUARE_SECRET": ApiKeyDesc(_("Foursquare Client Secret"),_("Foursquare Client Secret")),
+ "FOURSQUARE_CLIENT": _("Foursquare Client ID"),
+ "FOURSQUARE_SECRET": _("Foursquare Client Secret"),
# mapbox.com
- "MAPBOX_KEY": ApiKeyDesc(_("Mapbox API key. Register at https://www.mapbox.com and create your own API key"),
- _("Mapbox API key")),
+ "MAPBOX_KEY": _("Mapbox API key"),
+
+ # maptiler.com
+ "MAPTILER_KEY": _("MapTiler API key"),
# http://open.mapquestapi.com
- "MAPQUEST_KEY": ApiKeyDesc(_("MapQuest API key. Register at https://developer.mapquest.com/ and create your own API key"),
- _("MapQuest API key")),
+ "MAPQUEST_KEY": _("MapQuest API key"),
# https://geocoder.opencagedata.com/api [old key]
- "OPENCAGE_KEY": ApiKeyDesc(_("OpenCage API key. Register at https://opencagedata.com/ and create your own API key"),
- _("OpenCage API key")),
+ "OPENCAGE_KEY": _("OpenCage API key"),
# https://docs.stadiamaps.com/
- "STADIAMAPS_KEY": ApiKeyDesc(_("Stadia Maps API key. Register at https://stadiamaps.com/ and create your own API key"),
- _("Stadia Maps API key")),
+ "STADIAMAPS_KEY": _("Stadia Maps API key"),
# here.com
- "HERE_APP_ID": ApiKeyDesc(_("HERE App ID. Register at https://developer.here.com and create your own App ID and Code"),
- _("HERE App ID")),
- "HERE_APP_CODE": ApiKeyDesc(_("HERE App Code"),
- _("HERE App Code")),
+ "HERE_APIKEY": _("HERE API Key"),
+}
+
+# List of keys that are made available only after end user license is
+# accepted
+LICENSES = {
+ "HERE_APIKEY": LicenseDesc(
+ _(
+ '<p>Your Pure Maps installation has enabled support for HERE services.</p><br>'
+ '<p>Please consult <a href="https://legal.here.com/en-gb/terms/here-end-user-terms">end-user terms</a>, '
+ '<a href="https://legal.here.com/en-gb/terms/acceptable-use-policy">acceptable use policy</a>, '
+ 'and <a href="https://legal.here.com/en-gb/privacy">HERE Privacy policies</a>. '
+ 'In context of use of HERE and privacy policy, Pure Maps communicates with HERE using REST API.<p></br>'
+ '<p>For <a href="https://knowledge.here.com/csm_kb?id=public_kb_csm_details&number=KB0016412">legal reasons</a>, '
+ 'Pure Maps enables HERE search and routing in a dedicated "HERE Online" profile only. '
+ 'While not active anymore, see acceptable use policy of 2018 for details regarding '
+ 'use of HERE together with other providers under '
+ '<a href="https://legal.here.com/en-gb/terms/acceptable-use-policy-2018">Layering and Modifications</a> '
+ 'section of the document.</p><br>'
+ '<p>Please either accept the terms and the policy or decline them. If declined, '
+ 'HERE support will be inactive and '
+ 'can be enabled later by accepting the terms in Preferences under Licenses.</p>'
+ ), _('HERE End-User Terms'))
}
class KeyStore:
@@ -80,30 +114,82 @@
def __init__(self):
"""Initialize a :class:`KeyStore` instance."""
- plain = {key: "" for key in DEFAULTS}
+ plain = {key: "" for key in KEYNAMES}
poor.conf.register_keys(plain)
+ licenses = {key: 0 for key in LICENSES}
+ poor.conf.register_licenses(licenses)
+ plain.update(ApiKeys)
+ self.defaults = plain
- def get(self, key):
- """Return API key with the preference of the personal one"""
- return poor.conf.get("keys." + key) or DEFAULTS.get(key, "")
+ def license_accept(self, key):
+ poor.conf.set("licenses." + key, 1)
- def get_mapbox_key(self):
- """Return Mapbox access key with the preference of the personal one"""
- p = poor.conf.get("keys.MAPBOX_KEY")
- if p: return p
- p = DEFAULTS.get("MAPBOX_KEY", "")
- if p: return p
- return "EMPTY"
+ def license_decline(self, key):
+ poor.conf.set("licenses." + key, -1)
+
+ def get(self, key, skip_license_check=False):
+ """Return API key with the preference of the personal one"""
+ if not skip_license_check and key in LICENSES:
+ if poor.conf.get("licenses." + key) <= 0:
+ # license either declined or not accepted
+ return ""
+ return poor.conf.get("keys." + key).strip() or self.defaults.get(key, "").strip()
+
+ def licenses(self):
+ return [dict(id = key,
+ text = LICENSES[key].text,
+ title = LICENSES[key].title,
+ status = poor.conf.get("licenses." + key)) for key in LICENSES]
+
+ def get_licenses_missing(self):
+ missing = []
+ for key in LICENSES:
+ if not poor.conf.get("licenses." + key) and self.get(key, skip_license_check=True):
+ missing.append(dict(id = key,
+ text = LICENSES[key].text,
+ title = LICENSES[key].title))
+ return missing
+
+ @property
+ def has_here(self):
+ return self.get("HERE_APIKEY")
+
+ @property
+ def has_mapbox(self):
+ return self.mapbox_key
+
+ @property
+ def has_maptiler(self):
+ return self.maptiler_key
- def list(self):
+ def list(self, headers=False):
"""Return a list of dictionaries of API key properties"""
- keys = list(DEFAULTS.keys())
+ keys = copy.copy(KEYNAMES)
keys.sort()
- return [ { "id": k,
- "description": KEYDESC[k].description,
- "label": KEYDESC[k].label,
- "value": poor.conf.get("keys." + k)
- } for k in keys ]
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/magfield.py
^
|
@@ -18,7 +18,10 @@
"""Calculates magnetic declination."""
from datetime import datetime, timedelta
-from poor.geomag import WorldMagneticModel
+try:
+ from poor.geomag import WorldMagneticModel
+except ImportError:
+ from geomag import WorldMagneticModel
__all__ = ("MagField")
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/map.py
^
|
@@ -67,8 +67,16 @@
self.type = values.get("type", "")
self.url_suffix = values.get("url_suffix", "")
self.vehicle = values.get("vehicle", "")
+ self.available = True
+ # check mapbox for availability
+ if self.style_url.startswith('mapbox://') and not poor.key.has_mapbox:
+ print('Mapbox API key missing: skipping', id)
+ self.available = False
for k in self.keys:
- v = poor.key.get(k)
+ v = poor.key.get(k).strip()
+ if not v:
+ print('API key missing:', k, 'disabling', id)
+ self.available = False
self.style_url = self.style_url.replace("#" + k + "#", v)
self.tile_url = self.tile_url.replace("#" + k + "#", v)
@@ -126,6 +134,8 @@
glyphs = "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
if poor.conf.font_provider == "osmscout":
glyphs = "http://127.0.0.1:8553/v1/mbgl/glyphs?stack={fontstack}&range={range}"
+ elif poor.conf.font_provider == "maptiler":
+ glyphs = "https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key=" + poor.key.maptiler_key
return json.dumps({
"id": "raster",
"glyphs": glyphs,
@@ -178,18 +188,25 @@
def __init__(self):
"""Initialize a :class:`MapManager` instance."""
- if hasattr(self, "profile"): return
+ # always reset on init
self.basemap = None
self.basemap_types = set()
self.current_lang = None
self.current_map = None
- # load map descriptions
+ # load map descriptions only when initializing manager the first time
+ if hasattr(self, "profile"): return
+ self.profile = poor.conf.profile
maps = poor.util.get_basemaps()
maps.sort(key=lambda x: x["pid"])
self._providers = collections.defaultdict(list)
+ self._providers_disabled = set()
for m in maps:
provider = m.get("provider", m["name"])
- self._providers[provider].append(Map(m["pid"], values=m))
+ mi = Map(m["pid"], values=m)
+ if mi.available:
+ self._providers[provider].append(mi)
+ else:
+ self._providers_disabled.add(provider)
@property
def attribution(self):
@@ -249,11 +266,19 @@
provider = {
"pid": i,
"active": (i == self.basemap),
+ "available": True,
"default": (i == default),
"name": i
}
providers.append(provider)
- providers.sort(key=lambda x: x["name"])
+ for i in self._providers_disabled:
+ provider = {
+ "pid": i,
+ "name": i,
+ "available": False
+ }
+ providers.append(provider)
+ providers.sort(key=lambda x: (not x["available"],x["name"]))
return providers
@property
@@ -321,6 +346,8 @@
self.basemap = id
if self.basemap not in self._providers.keys():
self.basemap = poor.conf.get_default("basemap")
+ if self.basemap not in self._providers.keys():
+ self.basemap = poor.conf.basemap_fallback
self.basemap_types = set([i.type for i in self._providers[self.basemap]])
self._find_map()
poor.conf.set_basemap(self.basemap)
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/router.py
^
|
@@ -137,7 +137,7 @@
except Exception:
print("Routing failed:", file=sys.stderr)
traceback.print_exc()
- return {}
+ return dict(error=True)
if isinstance(route, dict):
route["provider"] = self.id
self._process_route(route)
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/poor/util.py
^
|
@@ -373,8 +373,16 @@
provider["pid"] = pid
provider["default"] = matches(pid, default)
provider["active"] = matches(pid, active)
+ # check for availability
+ available = True
+ for k in provider.get("keys", []):
+ v = poor.key.get(k).strip()
+ if not v:
+ print('API key missing:', k, 'disabling', pid)
+ available = False
+ provider["available"] = available
providers.append(provider)
- providers.sort(key=lambda x: x["name"])
+ providers.sort(key=lambda x: (not x["available"], x["name"]))
return providers
def get_routers():
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/BasemapPage.qml
^
|
@@ -32,26 +32,33 @@
ListItemLabel {
id: nameLabel
- color: (model.active || listItem.highlighted) ?
- styler.themeHighlightColor : styler.themePrimaryColor;
+ color: {
+ if (!model.available)
+ return styler.themeSecondaryHighlightColor;
+ if (model.active || listItem.highlighted)
+ return styler.themeHighlightColor;
+ return styler.themePrimaryColor;
+ }
height: styler.themeItemSizeSmall
text: model.name
}
onClicked: {
+ if (!model.available) return;
app.hideMenu(app.tr("Map: %1").arg(model.name));
py.call_sync("poor.app.set_basemap", [model.pid]);
- for (var i = 0; i < page.model.count; i++)
- page.model.setProperty(i, "active", false);
- model.active = true;
+ update();
}
}
model: ListModel {}
- Component.onCompleted: {
+ Component.onCompleted: update()
+
+ function update() {
// Load basemap model items from the Python backend.
py.call("poor.app.basemap.list", [], function(basemaps) {
+ page.model.clear();
Util.markDefault(basemaps, app.conf.getDefault("basemap"));
Util.appendAll(page.model, basemaps);
});
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/Config.qml
^
|
@@ -53,6 +53,7 @@
property real mapZoomAutoTime
property bool mapZoomAutoWhenNavigating: false
property real mapZoomAutoZeroSpeedZ
+ property real navigationHorizontalAccuracy: 15.0
property string profile
property bool reroute
property bool routePageShowDestinationsHelp: true
@@ -101,6 +102,7 @@
"mapZoomAutoTime": "map_zoom_auto_time",
"mapZoomAutoWhenNavigating": "map_zoom_auto_when_navigating",
"mapZoomAutoZeroSpeedZ": "map_zoom_auto_zero_speed_z",
+ "navigationHorizontalAccuracy": "navigation_horizontal_accuracy",
"reroute": "reroute",
"routePageShowDestinationsHelp": "route_page_show_destinations_help",
"profile": "profile",
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/GeocodeItem.qml
^
|
@@ -146,7 +146,8 @@
property bool currentPosition: model.type === "current position"
property bool setHeightToSmall: model.type === "poi" ||
model.type === "recent search" ||
- model.type === "autocomplete"
+ model.type === "autocomplete" ||
+ model.type === "subquery"
property bool visited: model.visited
Column {
@@ -173,7 +174,7 @@
color: (listItem.highlighted || listItem.visited || !listItem.enabled) ?
styler.themeHighlightColor : styler.themePrimaryColor
height: visible ? implicitHeight : 0
- text: model.markup ? model.markup : model.title
+ text: (model.type === "subquery" ? "\u2794 " : "") + (model.markup ? model.markup : model.title)
textFormat: Text.StyledText
visible: !listItem.header && text
}
@@ -231,6 +232,14 @@
// No autocompletion, no POI, open results geo.
searchField.text = model.text;
fetchResults();
+ } else if (model.type === "subquery"){
+ var q = geo._resultDetails[model.detailId];
+ if (!q) {
+ console.log("GeocoderItem Unexpected result: " + model.detailId);
+ return;
+ }
+ searchField.text = model.title;
+ fetchResults(q.query);
} else {
console.log("Unknown type in Geocoder Item: " + model.type)
}
@@ -326,8 +335,9 @@
geo._autocompletePending = true;
geo._prevAutocompleteQuery = query;
py.call("poor.app.geocoder.autocomplete",
- gps.coordinateValid ? [query, gps.coordinate.longitude, gps.coordinate.latitude] :
- [query],
+ gps.coordinateValid ? [query, gps.coordinate.longitude, gps.coordinate.latitude,
+ map.center.longitude, map.center.latitude] :
+ [query, 0, 0, map.center.longitude, map.center.latitude],
function(results) {
if (!geo._autocompletePending) return;
@@ -344,19 +354,23 @@
});
}
- function fetchResults() {
+ function fetchResults(queryStructure) {
_searchIndex += 1;
var mySearchIndex = _searchIndex;
+ var q = queryStructure ? queryStructure : query
_searchPending = true;
_searchDone = false;
_searchHits = [];
setSearchResults([]);
_autocompletePending = false; // skip any ongoing autocomplete search
- py.call_sync("poor.app.history.add_place", [query]);
- geo.update();
+ if (queryStructure == null) {
+ py.call_sync("poor.app.history.add_place", [query]);
+ geo.update();
+ }
py.call("poor.app.geocoder.geocode",
- gps.coordinateValid ? [query, gps.coordinate.longitude, gps.coordinate.latitude] :
- [query],
+ gps.coordinateValid ? [q, gps.coordinate.longitude, gps.coordinate.latitude,
+ map.center.longitude, map.center.latitude] :
+ [q, 0, 0, map.center.longitude, map.center.latitude],
function(results) {
// skip, new search or autocomplete was started
if (_searchIndex !== mySearchIndex || !_searchPending) return;
@@ -393,7 +407,8 @@
found.push({
"detailId": k,
"markup": p.label,
- "type": "autocomplete"
+ "title": p.label,
+ "type": p.poiType === "PM:Query" ? "subquery" : "autocomplete"
});
_resultDetails[k] = p;
});
@@ -437,7 +452,7 @@
"title": p.title,
"description": p.description,
"distance": p.distance,
- "type": "result"
+ "type": p.poiType === "PM:Query" ? "subquery" : "result"
});
_resultDetails[k] = p;
});
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/GeocodePage.qml
^
|
@@ -43,7 +43,9 @@
iconName: styler.iconMaps
text: app.tr("Map")
onClicked: {
- var pois = geo.searchResults;
+ var pois = geo.searchResults.filter(function(p) {
+ return p.poiType !== "PM:Query"
+ });
app.hideMenu(app.tr("Search: %1").arg(geo.query));
map.fitViewToPois(pois);
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/GeocoderPage.qml
^
|
@@ -43,10 +43,15 @@
ListItemLabel {
id: nameLabel
anchors.top: defaultHeader.bottom
- color: (model.active || listItem.highlighted) ?
- styler.themeHighlightColor : styler.themePrimaryColor;
+ color: {
+ if (!model.available)
+ return styler.themeSecondaryHighlightColor;
+ if (model.active || listItem.highlighted)
+ return styler.themeHighlightColor;
+ return styler.themePrimaryColor;
+ }
height: text && visible ? implicitHeight + app.listItemVerticalMargin : 0
- text: model.name
+ text: model.available ? model.name : app.tr("%1 (disabled)", model.name)
verticalAlignment: Text.AlignBottom
visible: !model.header
}
@@ -55,7 +60,7 @@
id: descriptionLabel
anchors.top: nameLabel.bottom
anchors.topMargin: height > 0 ? styler.themePaddingSmall : 0
- color: listItem.highlighted ? styler.themeSecondaryHighlightColor : styler.themeSecondaryColor
+ color: listItem.highlighted || !model.available ? styler.themeSecondaryHighlightColor : styler.themeSecondaryColor
font.pixelSize: styler.themeFontSizeExtraSmall
height: text && visible ? implicitHeight + app.listItemVerticalMargin : 0
lineHeight: 1.15
@@ -72,7 +77,7 @@
}
onClicked: {
- if (model.header) return;
+ if (model.header || !model.available) return;
dialog.pid = model.pid;
dialog.accept();
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/GuidePage.qml
^
|
@@ -43,10 +43,15 @@
ListItemLabel {
id: nameLabel
anchors.top: defaultHeader.bottom
- color: (model.active || listItem.highlighted) ?
- styler.themeHighlightColor : styler.themePrimaryColor;
+ color: {
+ if (!model.available)
+ return styler.themeSecondaryHighlightColor;
+ if (model.active || listItem.highlighted)
+ return styler.themeHighlightColor;
+ return styler.themePrimaryColor;
+ }
height: text && visible ? implicitHeight + app.listItemVerticalMargin : 0
- text: model.name
+ text: model.available ? model.name : app.tr("%1 (disabled)", model.name)
verticalAlignment: Text.AlignBottom
visible: !model.header
}
@@ -55,7 +60,7 @@
id: descriptionLabel
anchors.top: nameLabel.bottom
anchors.topMargin: height > 0 ? styler.themePaddingSmall : 0
- color: listItem.highlighted ? styler.themeSecondaryHighlightColor : styler.themeSecondaryColor
+ color: listItem.highlighted || !model.available? styler.themeSecondaryHighlightColor : styler.themeSecondaryColor
font.pixelSize: styler.themeFontSizeExtraSmall
height: text && visible ? implicitHeight + app.listItemVerticalMargin : 0
lineHeight: 1.15
@@ -71,7 +76,7 @@
}
}
onClicked: {
- if (model.header) return;
+ if (model.header || !model.available) return;
dialog.pid = model.pid;
dialog.accept();
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/InitPage.qml
^
|
@@ -25,11 +25,13 @@
title: "Pure Maps"
property bool ready: false
+ property var licensesMissing
+ property int licenseIndex: -1
BusyModal {
id: busy
- running: !py.ready
- text: !py.ready ? app.tr("Initializing") : ""
+ running: true
+ text: app.tr("Initializing")
}
Connections {
@@ -39,25 +41,50 @@
page.ready = true
// initialize conf before anything else
app.conf.initialize();
+ // check licenses
+ licensesMissing = py.call_sync("poor.key.get_licenses_missing", [])
+ // check font provider
app.conf.set("font_provider", defaultFontProvider);
- var k = py.call_sync("poor.key.get_mapbox_key", [])
- if (defaultFontProvider == "mapbox" && k == "EMPTY") {
+ var hasMapboxKey = py.evaluate("poor.key.has_mapbox")
+ var hasMaptilerKey = py.evaluate("poor.key.has_maptiler")
+ if ( (defaultFontProvider === "mapbox" && !hasMapboxKey) ||
+ (defaultFontProvider === "maptiler" && !hasMaptilerKey) ) {
+ var provider = (defaultFontProvider === "mapbox") ? "Mapbox" : "MapTiler"
var d = app.push(Qt.resolvedUrl("MessagePage.qml"), {
- "acceptText": app.tr("Dismiss"),
- "title": app.tr("Missing Mapbox key"),
- "message": app.tr("Your installation is missing Mapbox API key. " +
- "Please register at Mapbox and fill in your personal API key " +
- "in Preferences. This key is not needed if you plan to use " +
- "Pure Maps with the offline map provider.")
- });
- app.mapboxKeyMissing = true;
- } else start();
+ "acceptText": app.tr("Dismiss"),
+ "title": app.tr("Missing %1 key", provider),
+ "message": app.tr("Your installation is missing %1 API key. " +
+ "Please register at %1 and fill in your personal API key " +
+ "in Preferences. This key is not needed if you plan to use " +
+ "Pure Maps with the offline map provider.", provider)
+ });
+ d.Component.destruction.connect(showNextLicense)
+ app.fontKeyMissing = true;
+ } else if (licensesMissing.length > 0) {
+ showNextLicense();
+ } else {
+ start();
+ }
}
}
- onPageStatusActive: if (page.ready) start()
+ function showNextLicense() {
+ licenseIndex += 1;
+ if (licenseIndex < licensesMissing.length) {
+ app.pages.completeAnimation();
+ var d = app.push(Qt.resolvedUrl("LicensePage.qml"), {
+ "title": licensesMissing[licenseIndex].title,
+ "key": licensesMissing[licenseIndex].id,
+ "text": licensesMissing[licenseIndex].text
+ });
+ d.Component.destruction.connect(showNextLicense)
+ } else start();
+ }
function start() {
- app.rootPage = app.pages.replace(Qt.resolvedUrl("RootPage.qml"));
+ py.call("poor.app.initialize", [], function () {
+ busy.running = false
+ app.rootPage = app.pages.replace(Qt.resolvedUrl("RootPage.qml"));
+ });
}
}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/LicensePage.qml
^
|
@@ -0,0 +1,62 @@
+/* -*- coding: utf-8-unix -*-
+ *
+ * Copyright (C) 2021 Rinigus
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.0
+import "."
+import "platform"
+
+DialogPL {
+ id: dialog
+ acceptText: acceptSwitch.checked ? app.tr("Accept") : app.tr("Decline")
+
+ property alias acceptLicense: acceptSwitch.checked
+ property string key
+ property alias text: text.text
+
+ Column {
+ id: column
+ spacing: styler.themePaddingLarge
+ width: parent.width
+
+ ListItemLabel {
+ id: text
+ color: styler.themeHighlightColor
+ font.pixelSize: styler.themeFontSizeMedium
+ height: implicitHeight
+ truncMode: truncModes.none
+ wrapMode: Text.WordWrap
+ }
+
+ TextSwitchPL {
+ id: acceptSwitch
+ checked: true
+ text: app.tr("Accept license")
+ }
+
+ Spacer {
+ height: styler.themePaddingLarge
+ }
+ }
+
+ onAccepted: {
+ if (acceptLicense)
+ py.call_sync("poor.key.license_accept", [key])
+ else
+ py.call_sync("poor.key.license_decline", [key])
+ }
+}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/MapErrorPage.qml
^
|
@@ -115,15 +115,20 @@
anchors.right: parent.right
anchors.topMargin: styler.isSilica ? parent.top : undefined
anchors.verticalCenter: styler.isSilica ? undefined : label.verticalCenter
- model: [ app.tr("Online"), app.tr("Offline"), app.tr("Mixed") ]
- property var values: ["online", "offline", "mixed"]
+ model: [ app.tr("Online"), app.tr("Offline"),
+ hereAvailable ? app.tr("HERE - Online") : app.tr("HERE (disabled)"),
+ app.tr("Mixed") ]
+ property var values: ["online", "offline", "HERE", "mixed"]
+ property bool hereAvailable: py.evaluate("poor.key.has_here")
Component.onCompleted: {
var value = app.conf.profile;
profileComboBox.currentIndex = profileComboBox.values.indexOf(value);
}
onCurrentIndexChanged: {
var index = profileComboBox.currentIndex;
- py.call_sync("poor.app.set_profile", [profileComboBox.values[index]]);
+ var val = profileComboBox.values[index];
+ if (val === "HERE" && !hereAvailable) return;
+ py.call_sync("poor.app.set_profile", [val]);
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/MessagePage.qml
^
|
@@ -25,11 +25,17 @@
property alias message: text.text
- ListItemLabel {
- id: text
- color: styler.themeHighlightColor
- font.pixelSize: styler.themeFontSizeMedium
- height: implicitHeight
- wrapMode: Text.WordWrap
+ Column {
+ id: column
+ spacing: styler.themePaddingLarge
+ width: parent.width
+
+ ListItemLabel {
+ id: text
+ color: styler.themeHighlightColor
+ font.pixelSize: styler.themeFontSizeMedium
+ truncMode: truncModes.none
+ wrapMode: Text.WordWrap
+ }
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/Navigator.qml
^
|
@@ -69,6 +69,7 @@
NavigatorBase {
id: navigatorBase
+ horizontalAccuracy: app.conf.navigationHorizontalAccuracy
units: app.conf.units
property bool voicePrepared: false
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/Poi.qml
^
|
@@ -58,6 +58,7 @@
"address": poi.address || "",
"bookmarked": poi.bookmarked || false,
"coordinate": poi.coordinate || QtPositioning.coordinate(poi.y, poi.x),
+ "email": poi.email || "",
"link": poi.link || "",
"phone": poi.phone || "",
"poiId": poi.poiId || Util.uuidv4(),
@@ -93,7 +94,8 @@
function addList(pois, stateId) {
// Add new POIs
pois.forEach(function (p) {
- _add(p, stateId);
+ if (p.poiType !== "PM:Query")
+ _add(p, stateId);
});
save();
poiChanged("");
@@ -135,16 +137,18 @@
// methods into JS representation
return {
"address": pyPoi.address || "",
+ "email": pyPoi.email || "",
"link": pyPoi.link || "",
"phone": pyPoi.phone || "",
"poiType": pyPoi.poi_type || "",
"postcode": pyPoi.postcode || "",
"provider": pyPoi.provider || "",
"text": pyPoi.text || "",
- "title": pyPoi.title || model.place,
+ "title": pyPoi.title || "",
"type": "geocode",
"x": pyPoi.x,
"y": pyPoi.y,
+ "query": pyPoi.query,
};
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/PoiBlock.qml
^
|
@@ -37,6 +37,7 @@
property string address
property bool bookmarked: false
property var coordinate
+ property string email
property string link
property string phone
property string poiId
@@ -115,6 +116,7 @@
}
ListItemLabel {
+ id: textItem
color: styler.themeHighlightColor
font.pixelSize: styler.themeFontSizeSmall
height: text ? implicitHeight + styler.themePaddingSmall: 0
@@ -135,6 +137,7 @@
if (item.postcode) info += app.tr("Postal code") + " ";
if (item.link) info += app.tr("Web") + " ";
if (item.phone) info += app.tr("Phone") + " ";
+ if (item.email) info += app.tr("Email") + " ";
if (item.shortlisted) info += app.tr("Shortlisted") + " ";
if (item.text && textItem.truncated) info += app.tr("Text") + " ";
if (info)
@@ -393,6 +396,7 @@
item.address = poi.address || "";
item.bookmarked = poi.bookmarked || false;
item.coordinate = poi.coordinate || QtPositioning.coordinate(poi.y, poi.x);
+ item.email = poi.email || "";
item.link = poi.link || "";
item.phone = poi.phone || "";
item.poiId = poi.poiId || "";
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/PoiEditPage.qml
^
|
@@ -106,6 +106,14 @@
label: app.tr("URL")
placeholderText: app.tr("Enter URL")
text: poi.link ? poi.link : ""
+ onEnter: emailField.focus = true
+ }
+
+ TextFieldPL {
+ id: emailField
+ label: app.tr("Email")
+ placeholderText: app.tr("Enter Email")
+ text: poi.email ? poi.email : ""
onEnter: textArea.focus = true
}
@@ -126,6 +134,7 @@
function accepted() {
poi.address = addressField.text;
+ poi.email = emailField.text;
poi.link = linkField.text;
poi.phone = phoneField.text;
poi.poiType = typeField.text;
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/PoiInfoPage.qml
^
|
@@ -238,6 +238,14 @@
onClicked: Qt.openUrlExternally(poi.link)
}
+ IconListItem {
+ height: styler.themeItemSizeSmall
+ icon: poi.email ? styler.iconEmail : ""
+ label: poi.email
+ visible: poi.email
+ onClicked: Qt.openUrlExternally("mailto:" + poi.email)
+ }
+
Spacer {
height: styler.themePaddingMedium
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/PositionSource.qml
^
|
@@ -29,7 +29,6 @@
// if we already have a lock, otherwise keep trying for a couple minutes
// and give up if we still don't gain that lock.
active: app.running || (!accurate && waitForLock)
- hasMapMatching: app.hasMapMatching
mapMatchingMode: {
if (app.mapMatchingMode == "none") return 0;
else if (app.mapMatchingMode == "car") return 1;
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/PreferencesPage.qml
^
|
@@ -272,9 +272,108 @@
}
ExpandingSectionPL {
+ id: sectionLicenses
+ title: app.tr("Licenses")
+ content.sourceComponent: Column {
+ spacing: styler.themePaddingMedium
+ width: sectionLicenses.width
+
+ ListItemLabel {
+ color: styler.themeHighlightColor
+ text: app.tr("List of the licenses and whether they are accepted or declined. " +
+ "Here you can change the acceptance of each license.")
+ truncMode: truncModes.none
+ wrapMode: Text.WordWrap
+ }
+
+ ListItemLabel {
+ color: styler.themeHighlightColor
+ text: app.tr("Please restart application after changing the acceptance state of the license(s).")
+ truncMode: truncModes.none
+ wrapMode: Text.WordWrap
+ }
+
+ Column {
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Repeater {
+ id: licenseRep
+ delegate: ListItemPL {
+ id: listItem
+ contentHeight: licenseItemColumn.height
+ Column {
+ id: licenseItemColumn
+ anchors.left: parent.left
+ anchors.right: parent.right
+ spacing: styler.themePaddingSmall
+
+ Spacer {
+ height: Math.max(0, styler.themePaddingLarge / 2 - styler.themePaddingSmall)
+ }
+
+ ListItemLabel {
+ color: listItem.highlighted ? styler.themeHighlightColor :
+ styler.themePrimaryColor
+ text: model.title
+ }
+
+ ListItemLabel {
+ color: listItem.highlighted ? styler.themeHighlightColor :
+ styler.themePrimaryColor
+ horizontalAlignment: Text.AlignRight
+ text: {
+ if (model.status === -1) return app.tr("Declined")
+ if (model.status === 1) return app.tr("Accepted")
+ return app.tr("Unset")
+ }
+ }
+
+ Spacer {
+ height: Math.max(0, styler.themePaddingLarge / 2 - styler.themePaddingSmall)
+ }
+ }
+
+ onClicked: {
+ var d = app.push(Qt.resolvedUrl("LicensePage.qml"), {
+ "title": model.title,
+ "key": model.key,
+ "text": model.text,
+ "acceptLicense": model.status!==-1
+ });
+ d.accepted.connect(licenseRep.load)
+ }
+ }
+ model: ListModel {}
+
+ Component.onCompleted: load()
+
+ function load() {
+ model.clear();
+ py.call("poor.key.licenses", [], function(licenses) {
+ for (var i = 0; i < licenses.length; i++)
+ model.append({
+ "key": licenses[i].id,
+ "text": licenses[i].text,
+ "title": licenses[i].title,
+ "status": licenses[i].status
+ });
+ });
+ }
+ }
+ }
+
+ Spacer {
+ height: styler.themePaddingLarge
+ }
+ }
+ }
+
+ ExpandingSectionPL {
id: sectionKeys
title: app.tr("API keys")
content.sourceComponent: Column {
+ id: keysColumn
spacing: styler.themePaddingMedium
width: sectionKeys.width
@@ -294,28 +393,49 @@
wrapMode: Text.WordWrap
}
- FormLayoutPL {
- spacing: styler.themePaddingMedium
+ Column {
+ id: keysForm
+ spacing: styler.themePaddingLarge
+ width: keysColumn.width
Repeater {
- delegate: TextFieldPL {
- description: model.description
- label: model.label
- placeholderText: model.label
- text: model.value
- onTextChanged: py.call_sync("poor.key.set",
- [model.key, text])
+ delegate: Column {
+ spacing: styler.themePaddingMedium
+ width: keysForm.width
+ property bool isHeader: model.header
+
+ SectionHeaderPL {
+ text: model.header
+ visible: text
+ }
+
+ ListItemLabel {
+ color: styler.themeHighlightColor
+ text: model.description
+ truncMode: truncModes.none
+ visible: text
+ wrapMode: Text.WordWrap
+ }
+
+ TextFieldPL {
+ label: model.label
+ placeholderText: model.label
+ text: model.value
+ visible: !parent.isHeader
+ onTextChanged: py.call_sync("poor.key.set",
+ [model.key, text])
+ }
}
model: ListModel {}
Component.onCompleted: {
- // Load router model items from the Python backend.
- py.call("poor.key.list", [], function(keys) {
+ py.call("poor.key.list", [true], function(keys) {
for (var i = 0; i < keys.length; i++)
model.append({
- "key": keys[i].id,
- "description": keys[i].description,
- "label": keys[i].label,
- "value": keys[i].value
+ "header": keys[i].header || "",
+ "key": keys[i].id || "",
+ "description": keys[i].description || "",
+ "label": keys[i].label || "",
+ "value": keys[i].value || ""
});
});
}
@@ -339,7 +459,6 @@
description: app.tr("Select mode of transportation. Only applies when Pure Maps is not navigating. Uses OSM Scout Server for its operation.")
label: app.tr("Snap position to road")
model: [ app.tr("None"), app.tr("Car"), app.tr("Bicycle"), app.tr("Foot") ]
- visible: app.hasMapMatching
property var values: ["none", "car", "bicycle", "foot"]
Component.onCompleted: {
var value = app.conf.mapMatchingWhenIdle;
@@ -408,7 +527,6 @@
checked: app.conf.mapMatchingWhenNavigating
description: app.tr("Uses OSM Scout Server for its operation.")
text: app.tr("Snap position to road")
- visible: app.hasMapMatching
onCheckedChanged: {
if (mapmatchingSwitch.checked===app.conf.mapMatchingWhenNavigating) return;
app.conf.set("map_matching_when_navigating", mapmatchingSwitch.checked);
@@ -490,6 +608,38 @@
app.conf.set("show_speed_limit", v);
}
}
+
+ ComboBoxPL {
+ id: horizontalAccuracyComboBox
+ description: app.tr("Accuracy of the positioning supported by device. Deviation from the route below the specified accuracy will be ignored.")
+ label: app.tr("Positioning accuracy")
+ model: [
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/RootPage.qml
^
|
@@ -33,7 +33,7 @@
GeocodeButton { id: geocodeButton }
Map {
id: map
- accessToken: py.call_sync("poor.key.get_mapbox_key", [])
+ accessToken: py.evaluate("poor.key.mapbox_key")
}
MenuButton { id: menuButton }
Meters { id: meters }
@@ -137,7 +137,7 @@
// finish initialization after the root page is shown
if (!app.initialized) {
app.initialize();
- if (app.mapboxKeyMissing) app.showMenu();
+ if (app.fontKeyMissing) app.showMenu();
}
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/RouterPage.qml
^
|
@@ -41,10 +41,15 @@
ListItemLabel {
id: nameLabel
anchors.top: defaultHeader.bottom
- color: (model.active || listItem.highlighted) ?
- styler.themeHighlightColor : styler.themePrimaryColor;
+ color: {
+ if (!model.available)
+ return styler.themeSecondaryHighlightColor;
+ if (model.active || listItem.highlighted)
+ return styler.themeHighlightColor;
+ return styler.themePrimaryColor;
+ }
height: text && visible ? implicitHeight + app.listItemVerticalMargin : 0
- text: model.name
+ text: model.available ? model.name : app.tr("%1 (disabled)", model.name)
verticalAlignment: Text.AlignBottom
visible: !model.header
}
@@ -53,7 +58,7 @@
id: descriptionLabel
anchors.top: nameLabel.bottom
anchors.topMargin: height > 0 ? styler.themePaddingSmall : 0
- color: listItem.highlighted ? styler.themeSecondaryHighlightColor : styler.themeSecondaryColor
+ color: listItem.highlighted || !model.available ? styler.themeSecondaryHighlightColor : styler.themeSecondaryColor
font.pixelSize: styler.themeFontSizeExtraSmall
height: text && visible ? implicitHeight + app.listItemVerticalMargin : 0
lineHeight: 1.15
@@ -70,7 +75,7 @@
}
onClicked: {
- if (model.header) return;
+ if (model.header || !model.available) return;
dialog.pid = model.pid;
dialog.accept();
}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/icons/attribution/maptiler-white.svg
^
|
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 812 212" style="enable-background:new 0 0 812 212;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#3A1888;}
+ .st1{fill:#03A1C4;}
+ .st2{fill:#05D0DF;}
+ .st3{fill:#761FE8;}
+ .st4{fill:#FFAA01;}
+ .st5{fill:#F1175D;}
+ .st6{fill:#FB3A1B;}
+ .st7{fill:#FBC935;}
+ .st8{fill:#FFFFFF;}
+</style>
+<g>
+ <path class="st0" d="M94.3,164.2c9.2,9.2,33.8,34.3,33.8,34.3c-0.1,0.2,24.4-24.5,34.2-34.2l-34.1-34.1L94.3,164.2z"/>
+ <path class="st1" d="M128.3,130.2l34.1,34.1c0.1-0.1,0.1-0.1,0.2-0.2l34-34L162.5,96L128.3,130.2z"/>
+ <path class="st2" d="M196.6,130.1L196.6,130.1c18.9-18.9,18.9-49.4,0.1-68.3L162.5,96L196.6,130.1z"/>
+ <path class="st3" d="M94.1,96l-34,34c0,0,0,0,0,0l34.1,34.1c0,0,0,0,0.1,0.1l34-34L94.1,96z"/>
+ <path class="st4" d="M128.3,61.8L162.5,96l34.2-34.2c0,0,0,0-0.1-0.1l-34.1-34.1c0,0,0,0,0,0L128.3,61.8z"/>
+ <path class="st5" d="M60,61.9c-18.7,18.9-18.6,49.3,0.1,68.1l34-34L60,61.9z"/>
+ <path class="st6" d="M128.3,61.8L94.2,27.7l-34,34c-0.1,0.1-0.1,0.1-0.2,0.2L94.1,96L128.3,61.8z"/>
+ <path class="st7" d="M162.5,27.6c-18.9-18.8-49.4-18.8-68.2,0l-0.1,0.1l34.1,34.1L162.5,27.6z"/>
+</g>
+<path class="st8" d="M303.8,138.6v-34.9c0-8.6-4.5-16.4-13.3-16.4c-8.7,0-13.9,7.8-13.9,16.4v34.9h-16.1V73.4h14.9l1.2,7.9
+ c3.4-6.6,11-9,17.2-9c7.8,0,15.6,3.2,19.3,12.2c5.8-9.2,13.3-11.9,21.8-11.9c18.5,0,27.6,11.4,27.6,30.9v35.1h-16.1v-35.1
+ c0-8.6-3.6-15.9-12.3-15.9c-8.7,0-14.1,7.5-14.1,16.1v34.9H303.8z"/>
+<path class="st8" d="M430.5,73.5h15.5v65.1h-15.2l-0.8-9.5c-3.7,7.7-13.9,11.4-21.1,11.5c-19.3,0.1-33.6-11.8-33.6-34.6
+ c0-22.5,14.9-34.2,34-34.1c8.7,0,17,4.1,20.7,10.6L430.5,73.5z M391.4,106c0,12.4,8.6,19.8,19.3,19.8c25.4,0,25.4-39.5,0-39.5
+ C399.9,86.3,391.4,93.6,391.4,106z"/>
+<path class="st8" d="M459.5,165.8V73.5h15.1l1.1,9c5-7.3,13.7-10.4,21.1-10.4c20.1,0,33.4,14.9,33.4,34.1c0,19-12,34.1-32.9,34.1
+ c-6.9,0-17-2.1-21.7-9.3v34.9H459.5z M514.1,106.1c0-10.2-6.9-18.5-18.5-18.5c-11.6,0-18.5,8.3-18.5,18.5c0,10.2,7.5,18.5,18.5,18.5
+ C506.6,124.6,514.1,116.3,514.1,106.1z"/>
+<path class="st8" d="M559,53.7v19.7h22.2v5.4H559v39.8c0,8.8,1.9,15.1,12,15.1c3.2,0,6.7-1.1,10-2.6l2.2,5.3
+ c-4.1,2-8.2,3.3-12.3,3.3c-13.9,0-18.4-8.2-18.4-21V78.8h-13.9v-5.4h13.9v-19L559,53.7z"/>
+<path class="st8" d="M604.7,52.1c0,6.9-10.4,6.9-10.4,0C594.3,45.2,604.7,45.2,604.7,52.1z M596.1,73.1v65.5h6.5V73.1H596.1z"/>
+<path class="st8" d="M627.6,46.2v92.5h-6.5V46.2H627.6z"/>
+<path class="st8" d="M730.2,73.4l0.3,11.6c4.1-8.9,13.3-12.3,21.7-12.3c4.9-0.1,9.6,1.2,14,3.8l-2.9,5.3c-3.4-2.1-7.3-3-11.1-3
+ c-12.2,0.1-21.5,9.9-21.5,21.8v38h-6.5V73.4H730.2z"/>
+<g>
+ <path class="st8" d="M675.1,134.7c-11.5,0-21.4-7.2-25.5-17.4l0,0l0,0c0,0,0,0,0,0l52.8-14c0,0,0,0,0,0.1l5.6-1.5
+ c-2.3-16.5-16.2-29.3-33-29.3c-18.4,0-33.3,15.2-33.3,34c0,18.8,14.9,34,33.3,34c13.8,0,25.6-8.5,30.6-20.7l-5.3-2.3
+ C696.2,127.6,686.4,134.7,675.1,134.7z M647.5,106.6c0-15.5,12.3-28.1,27.5-28.1c11.9,0,22,7.7,25.9,18.5L647.9,111
+ C647.6,109.5,647.5,108.1,647.5,106.6z"/>
+</g>
+</svg>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/icons/attribution/maptiler.svg
^
|
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 812 212" style="enable-background:new 0 0 812 212;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#3A1888;}
+ .st1{fill:#03A1C4;}
+ .st2{fill:#05D0DF;}
+ .st3{fill:#761FE8;}
+ .st4{fill:#FFAA01;}
+ .st5{fill:#F1175D;}
+ .st6{fill:#FB3A1B;}
+ .st7{fill:#FBC935;}
+ .st8{fill:#333359;}
+</style>
+<path class="st0" d="M94.3,164.2c9.2,9.2,33.8,34.3,33.8,34.3c-0.1,0.2,24.4-24.5,34.2-34.2l-34.1-34.1L94.3,164.2z"/>
+<path class="st1" d="M128.3,130.2l34.1,34.1c0.1-0.1,0.1-0.1,0.2-0.2l34-34L162.5,96L128.3,130.2z"/>
+<path class="st2" d="M196.6,130.1L196.6,130.1c18.9-18.9,18.9-49.4,0.1-68.3L162.5,96L196.6,130.1z"/>
+<path class="st3" d="M94.1,96l-34,34c0,0,0,0,0,0l34.1,34.1c0,0,0,0,0.1,0.1l34-34L94.1,96z"/>
+<path class="st4" d="M128.3,61.8L162.5,96l34.2-34.2c0,0,0,0-0.1-0.1l-34.1-34.1c0,0,0,0,0,0L128.3,61.8z"/>
+<path class="st5" d="M60,61.9c-18.7,18.9-18.6,49.3,0.1,68.1l34-34L60,61.9z"/>
+<path class="st6" d="M128.3,61.8L94.2,27.7l-34,34c-0.1,0.1-0.1,0.1-0.2,0.2L94.1,96L128.3,61.8z"/>
+<path class="st7" d="M162.5,27.6c-18.9-18.8-49.4-18.8-68.2,0l-0.1,0.1l34.1,34.1L162.5,27.6z"/>
+<path class="st8" d="M303.7,138.6v-34.9c0-8.6-4.5-16.4-13.3-16.4c-8.7,0-13.9,7.8-13.9,16.4v34.9h-16.1V73.4h14.9l1.2,7.9
+ c3.4-6.6,11-9,17.2-9c7.8,0,15.6,3.2,19.3,12.2c5.8-9.2,13.3-11.9,21.8-11.9c18.5,0,27.6,11.4,27.6,30.9v35.1h-16.1v-35.1
+ c0-8.6-3.6-15.9-12.3-15.9c-8.7,0-14.1,7.5-14.1,16.1v34.9H303.7z"/>
+<path class="st8" d="M430.3,73.5h15.5v65.1h-15.2l-0.8-9.5c-3.7,7.7-13.9,11.4-21.1,11.5c-19.3,0.1-33.6-11.8-33.6-34.6
+ c0-22.5,14.9-34.2,34-34.1c8.7,0,17,4.1,20.7,10.6L430.3,73.5z M391.2,106c0,12.4,8.6,19.8,19.3,19.8c25.4,0,25.4-39.5,0-39.5
+ C399.8,86.3,391.2,93.6,391.2,106z"/>
+<path class="st8" d="M459.4,165.8V73.5h15.1l1.1,9c5-7.3,13.7-10.4,21.1-10.4c20.1,0,33.4,14.9,33.4,34.1c0,19-12,34.1-32.9,34.1
+ c-6.9,0-17-2.1-21.7-9.3v34.9H459.4z M514,106.1c0-10.2-6.9-18.5-18.5-18.5c-11.6,0-18.5,8.3-18.5,18.5c0,10.2,7.5,18.5,18.5,18.5
+ C506.4,124.6,514,116.3,514,106.1z"/>
+<path class="st8" d="M558.9,53.7v19.7h22.2v5.4h-22.2v39.8c0,8.8,1.9,15.1,12,15.1c3.2,0,6.7-1.1,10-2.6l2.2,5.3
+ c-4.1,2-8.2,3.3-12.3,3.3c-13.9,0-18.4-8.2-18.4-21V78.8h-13.9v-5.4h13.9v-19L558.9,53.7z"/>
+<path class="st8" d="M604.6,52.1c0,6.9-10.4,6.9-10.4,0C594.1,45.2,604.6,45.2,604.6,52.1z M596,73.1v65.5h6.5V73.1H596z"/>
+<path class="st8" d="M627.4,46.2v92.5H621V46.2H627.4z"/>
+<path class="st8" d="M730.1,73.4l0.3,11.6c4.1-8.9,13.3-12.3,21.7-12.3c4.9-0.1,9.6,1.2,14,3.8l-2.9,5.3c-3.4-2.1-7.3-3-11.1-3
+ c-12.2,0.1-21.5,9.9-21.5,21.8v38H724V73.4H730.1z"/>
+<g>
+ <path class="st8" d="M674.9,134.7c-11.5,0-21.4-7.2-25.5-17.4l0,0l0,0c0,0,0,0,0,0l52.8-14c0,0,0,0,0,0.1l5.6-1.5
+ c-2.3-16.5-16.2-29.3-33-29.3c-18.4,0-33.3,15.2-33.3,34c0,18.8,14.9,34,33.3,34c13.8,0,25.6-8.5,30.6-20.7l-5.3-2.3
+ C696.1,127.6,686.3,134.7,674.9,134.7z M647.4,106.6c0-15.5,12.3-28.1,27.5-28.1c11.9,0,22,7.7,25.9,18.5L647.7,111
+ C647.5,109.5,647.4,108.1,647.4,106.6z"/>
+</g>
+</svg>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/icons/fallback/mail-unread-symbolic.svg
^
|
@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
+ <defs id="defs3051">
+ <style type="text/css" id="current-color-scheme">
+ .ColorScheme-Text {
+ color:#232629;
+ }
+ </style>
+ </defs>
+ <path style="fill:currentColor;fill-opacity:1;stroke:none"
+ d="M 1 2 L 1 14 L 15 14 L 15 2 L 1 2 z M 2.7070312 3 L 13.292969 3 L 8 8.2929688 L 2.7070312 3 z M 2 3.7070312 L 5.9335938 7.640625 L 2 12.230469 L 2 3.7070312 z M 14 3.7070312 L 14 12.232422 L 10.066406 7.640625 L 14 3.7070312 z M 6.6425781 8.3496094 L 8 9.7070312 L 9.3574219 8.3496094 L 13.341797 13 L 2.65625 13 L 6.6425781 8.3496094 z "
+ class="ColorScheme-Text"
+ />
+</svg>
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/js/util.js
^
|
@@ -152,10 +152,14 @@
function markDefault(providers, defpid) {
// Edit the default provider's name in-place.
- for (var i = 0; i < providers.length; i++)
+ for (var i = 0; i < providers.length; i++) {
if (providers[i].pid === defpid)
providers[i].name = (qsTranslate("", "%1 (default)")
.arg(providers[i].name));
+ if (!providers[i].available)
+ providers[i].name = (qsTranslate("", "%1 (disabled)")
+ .arg(providers[i].name));
+ }
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/platform.generic/ExpandingSectionGroupPL.qml
^
|
@@ -56,9 +56,7 @@
Item {
id: item
anchors.left: parent.left
- anchors.leftMargin: styler.themeHorizontalPageMargin
anchors.right: parent.right
- anchors.rightMargin: styler.themeHorizontalPageMargin
data: selections[model.index]
height: childrenRect.height
visible: del.expanded
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/platform.kirigami/StylerPL.qml
^
|
@@ -64,6 +64,7 @@
property string iconDown: "go-down-symbolic"
property string iconEdit: "document-edit-symbolic"
property string iconEditClear: "edit-clear-symbolic"
+ property string iconEmail: "mail-unread-symbolic"
property string iconFavorite: "bookmark-new-symbolic"
property string iconFavoriteSelected: "user-bookmarks-symbolic"
property string iconForward: "go-next-symbolic"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/platform.qtcontrols/StylerPL.qml
^
|
@@ -63,6 +63,7 @@
property string iconDown: "go-down-symbolic"
property string iconEdit: "document-edit-symbolic"
property string iconEditClear: "edit-clear-symbolic"
+ property string iconEmail: "mail-unread-symbolic"
property string iconFavorite: "bookmark-new-symbolic"
property string iconFavoriteSelected: "user-bookmarks-symbolic"
property string iconForward: "go-next-symbolic"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/platform.silica/StylerPL.qml
^
|
@@ -66,6 +66,7 @@
property string iconDown: "image://theme/icon-m-down"
property string iconEdit: "image://theme/icon-m-edit"
property string iconEditClear: "image://theme/icon-m-clear"
+ property string iconEmail: "image://theme/icon-m-mail"
property string iconFavorite: "image://theme/icon-m-favorite"
property string iconFavoriteSelected: "image://theme/icon-m-favorite-selected"
property string iconManeuvers: "image://theme/icon-m-shuffle"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/platform.uuitk/StylerPL.qml
^
|
@@ -66,6 +66,7 @@
property string iconDown: "image://theme/down" //Qt.resolvedUrl("../../icons/go-down-symbolic.svg")
property string iconEdit: "image://theme/edit" //Qt.resolvedUrl("../../icons/document-edit-symbolic.svg")
property string iconEditClear: "image://theme/edit-clear" //Qt.resolvedUrl("../../icons/edit-clear-symbolic.svg")
+ property string iconEmail: "image://theme/mail"
property string iconFavorite: Qt.resolvedUrl("../icons/uuitk/bookmark-new-symbolic.svg")
property string iconFavoriteSelected: Qt.resolvedUrl("../icons/uuitk/user-bookmarks-symbolic.svg")
property string iconForward: "image://theme/next" //Qt.resolvedUrl("../../icons/go-next-symbolic.svg")
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/qml/pure-maps.qml
^
|
@@ -39,7 +39,7 @@
property var conf: Config {}
property bool errorPageOpen: false
- property bool hasMapMatching: false
+ property bool fontKeyMissing: false
property bool initialized: false
property bool infoActive: infoPanel && infoPanel.infoText
property var infoPanel: null
@@ -50,10 +50,8 @@
// and the associated constant Theme.itemSizeSmall.
property real listItemVerticalMargin: (styler.themeItemSizeSmall - 1.125 * styler.themeFontSizeMedium) / 2
property var map: null
- property bool mapboxKeyMissing: false
property string mapMatchingMode: {
- if (!hasMapMatching) return "none";
- else if (app.mode === modes.navigate || app.mode === modes.followMe || app.mode === modes.navigatePost)
+ if (app.mode === modes.navigate || app.mode === modes.followMe || app.mode === modes.navigatePost)
return (app.conf.mapMatchingWhenNavigating && map && app.transportMode) ?
app.transportMode : "none";
return app.conf.mapMatchingWhenIdle;
@@ -217,10 +215,6 @@
function initialize() {
initPages();
- if (mapMatchingCheck)
- app.hasMapMatching = py.call_sync("poor.app.has_mapmatching", []);
- else
- app.hasMapMatching = mapMatchingAvailable;
initialized = true;
// after all objects and pages are initialized
CmdLineParser.process()
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/routers/here.json
^
|
@@ -0,0 +1,13 @@
+{
+ "attribution": {
+ "© HERE": "https://legal.here.com",
+ "© HERE. All rights reserved.": "https://legal.here.com/en-gb/terms/general-content-supplier-terms-and-notices",
+ "© HERE. Report an issue.": "https://mapfeedback.here.com"
+ },
+ "_description": "Routing by HERE",
+ "_modes": ["car", "bicycle", "foot"],
+ "keys": ["HERE_APIKEY"],
+ "name": "HERE",
+ "source": "here.com",
+ "profiles": ["HERE"]
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/routers/here.py
^
|
@@ -0,0 +1,464 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021 Rinigus
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Routing using HERE.
+
+https://developer.here.com
+"""
+
+
+# https://developer.here.com/documentation/routing-api/api-reference-swagger.html
+#
+# Maneuvers are described under "actions" with the drop-down list
+# opening specific options. Also, see Android SDK description for
+# public enum ManeuverAction is helpful.
+
+
+import copy
+import poor
+import poor.flexpolyline
+from poor.i18n import __
+from poor.util import calculate_distance, format_distance
+
+CONF_DEFAULTS = {
+ "avoid_car_train": 0,
+ "avoid_difficult_turn": 0,
+ "avoid_dirt": 0,
+ "avoid_highway": 0,
+ "avoid_ferry": 0,
+ "avoid_seasonal_closure": 0,
+ "avoid_toll": 0,
+ "avoid_tunnel": 0,
+ "language": poor.util.get_default_language("en-US"),
+ "shorter": 0,
+ "type": "car",
+}
+
+MODE = {
+ "car": "car",
+ "bicycle": "bicycle",
+ "bus": "car",
+ "taxi": "car",
+ "scooter": "car",
+ "pedestrian": "foot",
+}
+
+MODEOPTIONS = {
+ "auto": ["use_ferry", "use_highways", "use_tolls"],
+ "bicycle": ["bicycle_type", "use_ferry", "use_hills", "use_roads"],
+ "bus": ["use_ferry", "use_highways", "use_tolls"],
+ "hov": ["use_ferry", "use_highways", "use_tolls"],
+ "motorcycle": ["use_ferry", "use_highways", "use_tolls", "use_trails"],
+ "motor_scooter": ["use_ferry", "use_highways", "use_hills", "use_primary", "use_tolls"],
+ "pedestrian": ["use_ferry", "max_hiking_difficulty"],
+ "transit": ["use_bus", "use_rail", "use_transfers"]
+}
+
+URL = ("https://router.hereapi.com/v8/routes?apiKey=" + poor.key.get("HERE_APIKEY") +
+ "&return=polyline,turnByTurnActions,summary,actions,instructions,travelSummary"
+ "&alternatives=0"
+ "&lang={lang}"
+ "&transportMode={transportMode}"
+ "&routingMode={routingMode}"
+ "&origin={origin}"
+ "&destination={destination}"
+ )
+
+cache = {}
+
+def prepare_endpoint(point):
+ """Return `point` as a dictionary ready to be passed on to the router."""
+ if isinstance(point, (list, tuple)):
+ return dict(lat=point[1], lon=point[0])
+ if isinstance(point, dict):
+ d = dict(lat=point["y"], lon=point["x"])
+ if "text" in point: d["name"] = point["text"]
+ if "destination" in point and not point["destination"]:
+ d["type"] = "break_through"
+ else:
+ d["type"] = "break"
+ return d
+ geocoder = poor.Geocoder("default")
+ results = geocoder.geocode(point, params=dict(limit=1))
+ return prepare_endpoint((results[0]["x"], results[0]["y"]))
+
+def prepare_txtpoint(point):
+ """Return URL component describing a location"""
+ s = "{},{}".format(point["lat"], point["lon"])
+ if "heading" in point:
+ s += ";course={}".format(int(point["heading"]))
+ if "type" in point and point["type"] == "break_through":
+ s += "!passThrough=true"
+ return s
+
+
+def route(locations, params):
+ """Find route and return its properties as a dictionary."""
+ loc = list(map(prepare_endpoint, locations))
+ if len(loc) < 2: return None
+ loc[0]["type"] = "break" # pass through not supported for origin
+ heading = params.get('heading', None)
+ if heading is not None:
+ loc[0]["heading"] = heading
+ lang = poor.conf.routers.here.language
+ units = "metric" if poor.conf.units == "metric" else "imperial"
+ transportMode = poor.conf.routers.here.type
+ routingMode = "short" if poor.conf.routers.here.shorter else "fast"
+ origin = prepare_txtpoint(loc[0])
+ destination = prepare_txtpoint(loc[-1])
+ via = ''
+ for point in loc[1:-1]:
+ via += "&via=" + prepare_txtpoint(point)
+ avoid = []
+ if poor.conf.routers.here.avoid_car_train: avoid.append("carShuttleTrain")
+ if transportMode=="truck" and poor.conf.routers.here.avoid_difficult_turn: avoid.append("difficultTurns")
+ if poor.conf.routers.here.avoid_dirt: avoid.append("dirtRoad")
+ if poor.conf.routers.here.avoid_highway: avoid.append("controlledAccessHighway")
+ if poor.conf.routers.here.avoid_ferry: avoid.append("ferry")
+ if poor.conf.routers.here.avoid_seasonal_closure: avoid.append("seasonalClosure")
+ if poor.conf.routers.here.avoid_toll: avoid.append("tollRoad")
+ if poor.conf.routers.here.avoid_tunnel: avoid.append("tunnel")
+ if len(avoid) > 0:
+ avoid = "&avoid[features]=" + (",".join(avoid))
+ else:
+ avoid = ""
+
+ url = URL.format(**locals()) + via + avoid
+ with poor.util.silent(KeyError):
+ return copy.deepcopy(cache[url])
+ result = poor.http.get_json(url)
+ result = poor.AttrDict(result)
+ #return result
+ mode = MODE.get(transportMode,"car")
+ return parse_result(url, locations, result, mode, lang, loc)
+
+
+def parse_result(url, locations, result, mode, lang_translation, locations_processed):
+ """Parse and return route"""
+
+ X, Y, Man, LocPointInd = [], [], [], [0]
+ location_candidates = []
+ for legs in result.routes[0].sections:
+ x, y = [], []
+ for p in poor.flexpolyline.decode(legs.polyline):
+ x.append(p[1])
+ y.append(p[0])
+
+ instructions = { i.offset: i.instruction for i in legs.actions }
+ language = legs.language
+ transport_mode = legs.transport.mode
+ maneuvers = []
+
+ if "preActions" in legs:
+ for maneuver in legs.preActions:
+ m = dict(
+ x=float(x[0]),
+ y=float(y[0]),
+ )
+ m.update(process_maneuver(maneuver,
+ transport_mode=transport_mode,
+ language=language,
+ lang_translation=lang_translation,
+ fill_narrative=True))
+ maneuvers.append(m)
+
+ # preprocess roundabouts
+ for i in range(len(legs.turnByTurnActions)-1):
+ m0 = legs.turnByTurnActions[i]
+ m1 = legs.turnByTurnActions[i+1]
+ if m0.action == "roundaboutEnter" and m1.action == "roundaboutExit":
+ m0["exit"] = m1.get("exit", None)
+
+ for maneuver in legs.turnByTurnActions:
+ m = dict(
+ x=float(x[maneuver.offset]),
+ y=float(y[maneuver.offset]),
+ narrative=instructions.get(maneuver.offset, None),
+ )
+ m.update(process_maneuver(maneuver,
+ transport_mode=transport_mode,
+ language=language,
+ lang_translation=lang_translation,
+ fill_narrative=(m["narrative"] is None)))
+ maneuvers.append(m)
+
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/routers/here_settings.qml
^
|
@@ -0,0 +1,283 @@
+/* -*- coding: utf-8-unix -*-
+ *
+ * Copyright (C) 2021 Rinigus
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.0
+import "../qml/platform"
+import "../qml"
+
+FormLayoutPL {
+ id: settingsBlock
+ spacing: styler.themePaddingLarge
+
+ property bool full: true
+
+ SectionHeaderPL {
+ text: app.tr("General options")
+ visible: full
+ }
+
+ ComboBoxPL {
+ id: typeComboBox
+ label: app.tr("Type")
+ model: [ app.tr("Car"), app.tr("Bicycle"), app.tr("Foot"), app.tr("Motor Scooter"),
+ app.tr("Bus"), app.tr("Taxi")]
+ property string current_key
+ property var keys: ["car", "bicycle", "pedestrian", "scooter", "bus", "taxi"]
+ Component.onCompleted: {
+ var key = app.conf.get("routers.here.type");
+ var index = typeComboBox.keys.indexOf(key);
+ typeComboBox.currentIndex = index > -1 ? index : 0;
+ current_key = typeComboBox.keys[typeComboBox.currentIndex];
+ }
+ onCurrentIndexChanged: {
+ var key = typeComboBox.keys[typeComboBox.currentIndex]
+ current_key = key;
+ app.conf.set("routers.here.type", key);
+ }
+ }
+
+ LanguageSelector {
+ id: langComboBox
+ key: app.conf.get("routers.here.language")
+ // list generated using tools/generate-valhalla-lang.py
+ languages: [
+ { "key": "af", "name": app.tr("Afrikaans") },
+ { "key": "sq", "name": app.tr("Albanian") },
+ { "key": "am", "name": app.tr("Amharic") },
+ { "key": "ar-sa", "name": app.tr("Arabic (Saudi Arabia)") },
+ { "key": "hy", "name": app.tr("Armenian") },
+ { "key": "as", "name": app.tr("Assamese") },
+ { "key": "az-Latn", "name": app.tr("Azerbaijani (Latin)") },
+ { "key": "eu", "name": app.tr("Basque") },
+ { "key": "be", "name": app.tr("Belarusian") },
+ { "key": "bn-bd", "name": app.tr("Bangla (Bangladesh)") },
+ { "key": "bn-in", "name": app.tr("Bangla (India)") },
+ { "key": "bs", "name": app.tr("Bosnian") },
+ { "key": "bg", "name": app.tr("Bulgarian") },
+ { "key": "ca", "name": app.tr("Catalan") },
+ { "key": "ca-ES", "name": app.tr("Catalan (Spain)") },
+ { "key": "zh-cn", "name": app.tr("Chinese (China)") },
+ { "key": "zh-hk", "name": app.tr("Chinese (Hong Kong SAR China)") },
+ { "key": "zh-tw", "name": app.tr("Chinese (Taiwan)") },
+ { "key": "hr", "name": app.tr("Croatian") },
+ { "key": "cs-cz", "name": app.tr("Czech (Czechia)") },
+ { "key": "da-dk", "name": app.tr("Danish (Denmark)") },
+ { "key": "prs-Arab", "name": app.tr("Persian (Afghanistan)") },
+ { "key": "nl-nl", "name": app.tr("Dutch (Netherlands)") },
+ { "key": "en-gb", "name": app.tr("English (United Kingdom)") },
+ { "key": "en-us", "name": app.tr("English (United States)") },
+ { "key": "et", "name": app.tr("Estonian") },
+ { "key": "fil-Latn", "name": app.tr("Filipino (Latin)") },
+ { "key": "fi-FI", "name": app.tr("Finnish (Finland)") },
+ { "key": "fr-FR", "name": app.tr("French (France)") },
+ { "key": "gl", "name": app.tr("Galician") },
+ { "key": "ka", "name": app.tr("Georgian") },
+ { "key": "de-de", "name": app.tr("German (Germany)") },
+ { "key": "el-gr", "name": app.tr("Greek (Greece)") },
+ { "key": "gu", "name": app.tr("Gujarati") },
+ { "key": "ha-Latn", "name": app.tr("Hausa (Latin)") },
+ { "key": "he-IL", "name": app.tr("Hebrew (Israel)") },
+ { "key": "hi-IN", "name": app.tr("Hindi (India)") },
+ { "key": "hu-hu", "name": app.tr("Hungarian (Hungary)") },
+ { "key": "is", "name": app.tr("Icelandic") },
+ { "key": "ig-Latn", "name": app.tr("Igbo (Latin)") },
+ { "key": "id-ID", "name": app.tr("Indonesian (Indonesia)") },
+ { "key": "ga", "name": app.tr("Irish") },
+ { "key": "it-IT", "name": app.tr("Italian (Italy)") },
+ { "key": "ja-jp", "name": app.tr("Japanese (Japan)") },
+ { "key": "quc-Latn", "name": app.tr("Kʼicheʼ (Latin)") },
+ { "key": "kn", "name": app.tr("Kannada") },
+ { "key": "kk", "name": app.tr("Kazakh") },
+ { "key": "km", "name": app.tr("Khmer") },
+ { "key": "rw-RW", "name": app.tr("Kinyarwanda (Rwanda)") },
+ { "key": "kok", "name": app.tr("Konkani") },
+ { "key": "ko-KR", "name": app.tr("Korean (South Korea)") },
+ { "key": "ku-Arab", "name": app.tr("Kurdish (Arabic)") },
+ { "key": "ky-Cyrl", "name": app.tr("Kyrgyz (Cyrillic)") },
+ { "key": "lv", "name": app.tr("Latvian") },
+ { "key": "lt", "name": app.tr("Lithuanian") },
+ { "key": "lb", "name": app.tr("Luxembourgish") },
+ { "key": "mk", "name": app.tr("Macedonian") },
+ { "key": "ms-MY", "name": app.tr("Malay (Malaysia)") },
+ { "key": "ml", "name": app.tr("Malayalam") },
+ { "key": "mt", "name": app.tr("Maltese") },
+ { "key": "mi-Latn", "name": app.tr("Maori (Latin)") },
+ { "key": "mr", "name": app.tr("Marathi") },
+ { "key": "mn-Cyrl", "name": app.tr("Mongolian (Cyrillic)") },
+ { "key": "ne-NP", "name": app.tr("Nepali (Nepal)") },
+ { "key": "no", "name": app.tr("Norwegian") },
+ { "key": "nn", "name": app.tr("Norwegian Nynorsk") },
+ { "key": "or", "name": app.tr("Odia") },
+ { "key": "nso", "name": app.tr("Northern Sotho") },
+ { "key": "fa", "name": app.tr("Persian") },
+ { "key": "pl-pl", "name": app.tr("Polish (Poland)") },
+ { "key": "pt-BR", "name": app.tr("Portuguese (Brazil)") },
+ { "key": "pt-pt", "name": app.tr("Portuguese (Portugal)") },
+ { "key": "pa", "name": app.tr("Punjabi") },
+ { "key": "pa-Arab", "name": app.tr("Punjabi (Arabic)") },
+ { "key": "quz-Latn-PE", "name": app.tr("Cusco Quechua (Latin, Peru)") },
+ { "key": "ro-ro", "name": app.tr("Romanian (Romania)") },
+ { "key": "ru-ru", "name": app.tr("Russian (Russia)") },
+ { "key": "gd-Latn", "name": app.tr("Scottish Gaelic (Latin)") },
+ { "key": "sr-Cyrl-BA", "name": app.tr("Serbian (Cyrillic, Bosnia & Herzegovina)") },
+ { "key": "sr-Cyrl-RS", "name": app.tr("Serbian (Cyrillic, Serbia)") },
+ { "key": "sr-Latn-RS", "name": app.tr("Serbian (Latin, Serbia)") },
+ { "key": "sd-Arab", "name": app.tr("Sindhi (Arabic)") },
+ { "key": "si", "name": app.tr("Sinhala") },
+ { "key": "sk-sk", "name": app.tr("Slovak (Slovakia)") },
+ { "key": "sl-si", "name": app.tr("Slovenian (Slovenia)") },
+ { "key": "es-es", "name": app.tr("Spanish (Spain)") },
+ { "key": "sw", "name": app.tr("Swahili") },
+ { "key": "sv-SE", "name": app.tr("Swedish (Sweden)") },
+ { "key": "tg-Cyrl", "name": app.tr("Tajik (Cyrillic)") },
+ { "key": "ta", "name": app.tr("Tamil") },
+ { "key": "tt-Cyrl", "name": app.tr("Tatar (Cyrillic)") },
+ { "key": "te", "name": app.tr("Telugu") },
+ { "key": "th-TH", "name": app.tr("Thai (Thailand)") },
+ { "key": "ti", "name": app.tr("Tigrinya") },
+ { "key": "tn", "name": app.tr("Tswana") },
+ { "key": "tr-TR", "name": app.tr("Turkish (Turkey)") },
+ { "key": "tk-Latn", "name": app.tr("Turkmen (Latin)") },
+ { "key": "uk", "name": app.tr("Ukrainian") },
+ { "key": "ur", "name": app.tr("Urdu") },
+ { "key": "ug-Arab", "name": app.tr("Uyghur (Arabic)") },
+ { "key": "uz-Cyrl", "name": app.tr("Uzbek (Cyrillic)") },
+ { "key": "vi", "name": app.tr("Vietnamese") },
+ { "key": "cy", "name": app.tr("Welsh") },
+ { "key": "wo-Latn", "name": app.tr("Wolof (Latin)") },
+ { "key": "xh", "name": app.tr("Xhosa") },
+ { "key": "yo-Latn", "name": app.tr("Yoruba (Latin)") },
+ { "key": "zu-ZA", "name": app.tr("Zulu (South Africa)") }
+ ]
+ visible: full
+ onKeyChanged: app.conf.set("routers.here.language", key)
+ }
+
+ SectionHeaderPL {
+ text: app.tr("Advanced options")
+ visible: full
+ }
+
+ TextSwitchPL {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ text: app.tr("Prefer shorter route")
+ visible: full && (typeComboBox.current_key == "car" || typeComboBox.current_key == "truck")
+ Component.onCompleted: checked = app.conf.get("routers.here.shorter")
+ onCheckedChanged: {
+ if (!visible) return;
+ app.conf.set("routers.here.shorter", checked ? 1 : 0);
+ }
+ }
+
+ TextSwitchPL {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ text: app.tr("Avoid tolls")
+ visible: full
+ Component.onCompleted: checked = app.conf.get("routers.here.avoid_toll")
+ onCheckedChanged: {
+ if (!visible) return;
+ app.conf.set("routers.here.avoid_toll", checked ? 1 : 0);
+ }
+ }
+
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/routers/mapquest_open.json
^
|
@@ -5,6 +5,7 @@
},
"_description": "Routing based on OpenStreetMap data",
"_modes": ["car", "bicycle", "foot"],
+ "keys": ["MAPQUEST_KEY"],
"name": "MapQuest Open",
"profiles": ["mixed", "online"]
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/routers/stadiamaps.json
^
|
@@ -7,6 +7,7 @@
},
"_description": "Routing by Valhalla based on OpenStreetMap data",
"_modes": ["car", "bicycle", "foot"],
+ "keys": ["STADIAMAPS_KEY"],
"name": "Stadia Maps",
"source": "stadiamaps.com",
"profiles": ["mixed", "online"]
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/CMakeLists.txt
^
|
@@ -24,13 +24,6 @@
-QT_NO_DEBUG_OUTPUT)
endif()
-if(MAPMATCHING_CHECK_RUNTIME)
- add_definitions(-DMAPMATCHING_CHECK_RUNTIME)
-endif()
-if(MAPMATCHING_AVAILABLE)
- add_definitions(-DMAPMATCHING_AVAILABLE)
-endif()
-
if(S2INCLUDES)
include_directories(${S2INCLUDES})
endif()
@@ -43,6 +36,17 @@
add_definitions(-DQML_IMPORT_PATH=${QML_IMPORT_PATH})
endif()
+if(USE_BUNDLED_GEOCLUE2)
+ add_definitions(-DUSE_BUNDLED_GEOCLUE2)
+
+ list(APPEND PM_SRC ${GCLUE2_SRC})
+ list(APPEND PM_HEADERS ${GCLUE2_HEADERS})
+
+ set_source_files_properties(${GCLUE2_XML}
+ PROPERTIES INCLUDE geoclue2/geocluetypes.h NO_NAMESPACE ON)
+ qt5_add_dbus_interfaces(PM_SRC ${GCLUE2_XML})
+endif()
+
add_executable(${APP_NAME} ${PM_SRC} ${PM_HEADERS})
if(FLAVOR STREQUAL "silica")
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/geocluetypes.cpp
^
|
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Denis Shienkov <denis.shienkov@gmail.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "geocluetypes.h"
+
+QT_BEGIN_NAMESPACE
+
+QDBusArgument &operator<<(QDBusArgument &arg, const Timestamp &ts)
+{
+ arg.beginStructure();
+ arg << ts.m_seconds;
+ arg << ts.m_microseconds;
+ arg.endStructure();
+ return arg;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &arg, Timestamp &ts)
+{
+ arg.beginStructure();
+ arg >> ts.m_seconds;
+ arg >> ts.m_microseconds;
+ arg.endStructure();
+ return arg;
+}
+
+QT_END_NAMESPACE
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/geocluetypes.h
^
|
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Denis Shienkov <denis.shienkov@gmail.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GEOCLUETYPES_H
+#define GEOCLUETYPES_H
+
+#include <QtDBus/QDBusArgument>
+
+class Timestamp
+{
+public:
+ quint64 m_seconds = 0;
+ quint64 m_microseconds = 0;
+};
+
+Q_DECLARE_METATYPE(Timestamp)
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_TYPEINFO(Timestamp, Q_MOVABLE_TYPE);
+
+QDBusArgument &operator<<(QDBusArgument &arg, const Timestamp &ts);
+const QDBusArgument &operator>>(const QDBusArgument &arg, Timestamp &ts);
+
+QT_END_NAMESPACE
+
+#endif // GEOCLUETYPES_H
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/org.freedesktop.GeoClue2.Client.xml
^
|
@@ -0,0 +1,122 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<!--
+ GeoClue 2.0 Interface Specification
+
+ Copyright 2013 Red Hat, Inc.
+-->
+
+<node>
+
+ <!--
+ org.freedesktop.GeoClue2.Client:
+ @short_description: The Application-specific client API
+
+ This is the interface you use to retrieve location information and receive
+ location update signals from GeoClue service. You get the client object to
+ use this interface on from org.freedesktop.GeoClue2.Manager.GetClient()
+ method.
+ -->
+ <interface name="org.freedesktop.GeoClue2.Client">
+ <!--
+ Location:
+
+ Current location as path to a #org.freedesktop.GeoClue2.Location object.
+ Please note that this property will be set to "/" (D-Bus equivalent of
+ null) initially, until Geoclue finds user's location. You want to delay
+ reading this property until your callback to
+ #org.freedesktop.GeoClue2.Client::LocationUpdated signal is called for
+ the first time after starting the client.
+ -->
+ <property name="Location" type="o" access="read"/>
+
+ <!--
+ DistanceThreshold:
+
+ Contains the current distance threshold in meters. This value is used
+ by the service when it gets new location info. If the distance moved is
+ below the threshold, it won't emit the LocationUpdated signal.
+ The default value is 0. When TimeThreshold is zero, it always emits
+ the signal.
+ -->
+ <property name="DistanceThreshold" type="u" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="0"/>
+ </property>
+
+ <!--
+ TimeThreshold:
+
+ Contains the current time threshold in seconds. This value is used
+ by the service when it gets new location info. If the time since the
+ last update is below the threshold, it won't emit the LocationUpdated
+ signal. The default value is 0. When TimeThreshold is zero, it always
+ emits the signal.
+ -->
+ <property name="TimeThreshold" type="u" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="0"/>
+ </property>
+
+ <!--
+ DesktopId:
+
+ The desktop file id (the basename of the desktop file). This property
+ must be set by applications for authorization to work.
+ -->
+ <property name="DesktopId" type="s" access="readwrite"/>
+
+ <!--
+ RequestedAccuracyLevel:
+
+ The level of accuracy requested by client, as
+ <link linkend="GClueAccuracyLevel">GClueAccuracyLevel</link>.
+
+ Please keep in mind that the actual accuracy of location information is
+ dependent on available hardware on your machine, external resources
+ and/or how much accuracy user agrees to be confortable with.
+ -->
+ <property name="RequestedAccuracyLevel" type="u" access="readwrite"/>
+
+ <!--
+ Active:
+
+ If client is active, i-e started successfully using
+ org.freedesktop.GeoClue2.Client.Start() and receiving location updates.
+
+ Please keep in mind that geoclue can at any time stop and start the
+ client on user (agent) request. Applications that are interested in
+ in these changes, should watch for changes in this property.
+ -->
+ <property name="Active" type="b" access="read"/>
+
+ <!--
+ Start:
+
+ Start receiving events about the current location. Applications should
+ hook-up to #org.freedesktop.GeoClue2.Client::LocationUpdated signal
+ before calling this method.
+ -->
+ <method name="Start"/>
+
+ <!--
+ Stop:
+
+ Stop receiving events about the current location.
+ -->
+ <method name="Stop"/>
+
+ <!--
+ LocationUpdated:
+ @old: old location as path to a #org.freedesktop.GeoClue2.Location object
+ @new: new location as path to a #org.freedesktop.GeoClue2.Location object
+
+ The signal is emitted every time the location changes.
+ The client should set the DistanceThreshold property to control how
+ often this signal is emitted.
+ -->
+ <signal name="LocationUpdated">
+ <arg name="oldLocation" type="o"/>
+ <arg name="newLocation" type="o"/>
+ </signal>
+ </interface>
+</node>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/org.freedesktop.GeoClue2.Location.xml
^
|
@@ -0,0 +1,96 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<!--
+ GeoClue 2.0 Interface Specification
+
+ Copyright 2013 Red Hat, Inc.
+-->
+
+<node>
+
+ <!--
+ org.freedesktop.GeoClue2.Location:
+ @short_description: The Location interface
+
+ This is the interface you use on location objects.
+ -->
+ <interface name="org.freedesktop.GeoClue2.Location">
+
+ <!--
+ Latitude:
+
+ The latitude of the location, in degrees.
+ -->
+ <property name="Latitude" type="d" access="read"/>
+
+ <!--
+ Longitude:
+
+ The longitude of the location, in degrees.
+ -->
+ <property name="Longitude" type="d" access="read"/>
+
+ <!--
+ Accuracy:
+
+ The accuracy of the location fix, in meters.
+ -->
+ <property name="Accuracy" type="d" access="read"/>
+
+ <!--
+ Altitude:
+
+ The altitude of the location fix, in meters. When unknown, its set to
+ minimum double value, -1.7976931348623157e+308.
+ -->
+ <property name="Altitude" type="d" access="read"/>
+
+ <!--
+ Speed:
+
+ The speed in meters per second. When unknown, it's set to -1.0.
+ -->
+ <property name="Speed" type="d" access="read"/>
+
+ <!--
+ Heading:
+
+ The heading direction in degrees with respect to North direction, in
+ clockwise order. That means North becomes 0 degree, East: 90 degrees,
+ South: 180 degrees, West: 270 degrees and so on. When unknown,
+ it's set to -1.0.
+ -->
+ <property name="Heading" type="d" access="read"/>
+
+ <!--
+ Description:
+
+ A human-readable description of the location, if available.
+
+ WARNING: Applications should not rely on this property since not all
+ sources provide a description. If you really need a description (or
+ more details) about current location, use a reverse-geocoding API, e.g
+ geocode-glib.
+ -->
+ <property name="Description" type="s" access="read"/>
+
+
+ <!--
+ Timestamp:
+
+ The timestamp when the location was determined, in seconds and
+ microseconds since the Epoch. This is the time of measurement if the
+ backend provided that information, otherwise the time when GeoClue
+ received the new location.
+
+ Note that GeoClue can't guarantee that the timestamp will always
+ monotonically increase, as a backend may not respect that.
+ Also note that a timestamp can be very old, e.g. because of a cached
+ location.
+ -->
+ <property name="Timestamp" type="(tt)" access="read">
+ <annotation name="org.qtproject.QtDBus.QtTypeName" value="Timestamp"/>
+ </property>
+ </interface>
+</node>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/org.freedesktop.GeoClue2.Manager.xml
^
|
@@ -0,0 +1,60 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<!--
+ GeoClue 2.0 Interface Specification
+
+ Copyright 2013 Red Hat, Inc.
+-->
+
+<node>
+
+ <!--
+ org.freedesktop.GeoClue2.Manager:
+ @short_description: The GeoClue service manager
+
+ This is the interface you use to talk to main GeoClue2 manager object at
+ path "/org/freedesktop/GeoClue2/Manager". The only thing you do with this
+ interface is to call org.freedesktop.GeoClue2.Manager.GetClient() on it
+ to get your application specific client object.
+ -->
+ <interface name="org.freedesktop.GeoClue2.Manager">
+ <!--
+ InUse:
+
+ Whether service is currently is use by any application.
+ -->
+ <property name="InUse" type="b" access="read"/>
+
+ <!--
+ AvailableAccuracyLevel:
+
+ The level of available accuracy, as
+ <link linkend="GClueAccuracyLevel">GClueAccuracyLevel</link>.
+ -->
+ <property name="AvailableAccuracyLevel" type="u" access="read"/>
+
+ <!--
+ GetClient:
+ @client: The path for newly created client object
+
+ Retrieves a client object which can only be used by the calling
+ application only.
+ -->
+ <method name="GetClient">
+ <arg name="client" type="o" direction="out"/>
+ </method>
+
+ <!--
+ AddAgent:
+ @id: The Desktop ID (excluding .desktop) of the agent
+
+ An API for user authorization agents to register themselves. Each agent
+ is responsible for the user it is running as. Application developers
+ can and should simply ignore this API.
+ -->
+ <method name="AddAgent">
+ <arg name="id" type="s" direction="in"/>
+ </method>
+ </interface>
+</node>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/qgeopositioninfosource_geoclue2.cpp
^
|
@@ -0,0 +1,450 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Denis Shienkov <denis.shienkov@gmail.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This version has changes to separate it from Qt provided version and
+// fixes by @tpikonen (Teemu Ikonen) for speed and direction reporting
+
+#include "qgeopositioninfosource_geoclue2.h"
+
+#include <QtCore/QLoggingCategory>
+#include <QtCore/QSaveFile>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QTimer>
+#include <QtDBus/QDBusPendingCallWatcher>
+
+// Auto-generated D-Bus files.
+#include "clientinterface.h"
+#include "locationinterface.h"
+
+Q_LOGGING_CATEGORY(lcPositioningGeoclue2, "qt.positioning.geoclue2patched")
+
+QT_BEGIN_NAMESPACE
+
+namespace {
+
+// NOTE: Copied from the /usr/include/libgeoclue-2.0/gclue-client.h
+enum GClueAccuracyLevel {
+ GCLUE_ACCURACY_LEVEL_NONE = 0,
+ GCLUE_ACCURACY_LEVEL_COUNTRY = 1,
+ GCLUE_ACCURACY_LEVEL_CITY = 4,
+ GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD = 5,
+ GCLUE_ACCURACY_LEVEL_STREET = 6,
+ GCLUE_ACCURACY_LEVEL_EXACT = 8
+};
+
+const char GEOCLUE2_SERVICE_NAME[] = "org.freedesktop.GeoClue2";
+const int MINIMUM_UPDATE_INTERVAL = 1000;
+const int UPDATE_TIMEOUT_COLD_START = 120000;
+
+static QString lastPositionFilePath()
+{
+ return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)
+ + QStringLiteral("/qtposition-geoclue2");
+}
+
+} // namespace
+
+PM::QGeoPositionInfoSourceGeoclue2::QGeoPositionInfoSourceGeoclue2(QObject *parent)
+ : QGeoPositionInfoSource(parent)
+ , m_requestTimer(new QTimer(this))
+ , m_manager(QLatin1String(GEOCLUE2_SERVICE_NAME),
+ QStringLiteral("/org/freedesktop/GeoClue2/Manager"),
+ QDBusConnection::systemBus(),
+ this)
+{
+ qDBusRegisterMetaType<Timestamp>();
+
+ restoreLastPosition();
+
+ m_requestTimer->setSingleShot(true);
+ connect(m_requestTimer, &QTimer::timeout,
+ this, &QGeoPositionInfoSourceGeoclue2::requestUpdateTimeout);
+}
+
+PM::QGeoPositionInfoSourceGeoclue2::~QGeoPositionInfoSourceGeoclue2()
+{
+ saveLastPosition();
+}
+
+void PM::QGeoPositionInfoSourceGeoclue2::setUpdateInterval(int msec)
+{
+ QGeoPositionInfoSource::setUpdateInterval(msec);
+ configureClient();
+}
+
+QGeoPositionInfo PM::QGeoPositionInfoSourceGeoclue2::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const
+{
+ if (fromSatellitePositioningMethodsOnly && !m_lastPositionFromSatellite)
+ return QGeoPositionInfo();
+ return m_lastPosition;
+}
+
+PM::QGeoPositionInfoSourceGeoclue2::PositioningMethods PM::QGeoPositionInfoSourceGeoclue2::supportedPositioningMethods() const
+{
+ bool ok;
+ const auto accuracy = m_manager.property("AvailableAccuracyLevel").toUInt(&ok);
+ if (!ok) {
+ const_cast<QGeoPositionInfoSourceGeoclue2 *>(this)->setError(AccessError);
+ return NoPositioningMethods;
+ }
+
+ switch (accuracy) {
+ case GCLUE_ACCURACY_LEVEL_COUNTRY:
+ case GCLUE_ACCURACY_LEVEL_CITY:
+ case GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD:
+ case GCLUE_ACCURACY_LEVEL_STREET:
+ return NonSatellitePositioningMethods;
+ case GCLUE_ACCURACY_LEVEL_EXACT:
+ return AllPositioningMethods;
+ case GCLUE_ACCURACY_LEVEL_NONE:
+ default:
+ return NoPositioningMethods;
+ }
+}
+
+void PM::QGeoPositionInfoSourceGeoclue2::setPreferredPositioningMethods(PositioningMethods methods)
+{
+ QGeoPositionInfoSource::setPreferredPositioningMethods(methods);
+ configureClient();
+}
+
+int PM::QGeoPositionInfoSourceGeoclue2::minimumUpdateInterval() const
+{
+ return MINIMUM_UPDATE_INTERVAL;
+}
+
+QGeoPositionInfoSource::Error PM::QGeoPositionInfoSourceGeoclue2::error() const
+{
+ return m_error;
+}
+
+void PM::QGeoPositionInfoSourceGeoclue2::startUpdates()
+{
+ if (m_running) {
+ qCWarning(lcPositioningGeoclue2) << "Already running";
+ return;
+ }
+
+ qCDebug(lcPositioningGeoclue2) << "Starting updates";
+ m_running = true;
+
+ startClient();
+
+ if (m_lastPosition.isValid()) {
+ QMetaObject::invokeMethod(this, "positionUpdated", Qt::QueuedConnection,
+ Q_ARG(QGeoPositionInfo, m_lastPosition));
+ }
+}
+
+void PM::QGeoPositionInfoSourceGeoclue2::stopUpdates()
+{
+ if (!m_running) {
+ qCWarning(lcPositioningGeoclue2) << "Already stopped";
+ return;
+ }
+
+ qCDebug(lcPositioningGeoclue2) << "Stopping updates";
+ m_running = false;
+
+ stopClient();
+}
+
+void PM::QGeoPositionInfoSourceGeoclue2::requestUpdate(int timeout)
+{
+ if (timeout < minimumUpdateInterval() && timeout != 0) {
+ emit updateTimeout();
+ return;
+ }
+
+ if (m_requestTimer->isActive()) {
+ qCDebug(lcPositioningGeoclue2) << "Request timer was active, ignoring startUpdates";
+ return;
+ }
+
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/geoclue2/qgeopositioninfosource_geoclue2.h
^
|
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Denis Shienkov <denis.shienkov@gmail.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// This version has changes to separate it from Qt provided version and
+// fixes by @tpikonen (Teemu Ikonen) for speed and direction reporting
+
+#ifndef QGEOPOSITIONINFOSOURCE_GEOCLUE2_P_H
+#define QGEOPOSITIONINFOSOURCE_GEOCLUE2_P_H
+
+#include <QtPositioning/QGeoPositionInfoSource>
+#include <QtCore/QPointer>
+#include "managerinterface.h"
+
+class OrgFreedesktopGeoClue2ClientInterface;
+
+QT_BEGIN_NAMESPACE
+class QDBusObjectPath;
+class QTimer;
+
+namespace PM {
+ class QGeoPositionInfoSourceGeoclue2 : public QGeoPositionInfoSource
+ {
+ Q_OBJECT
+
+ public:
+ explicit QGeoPositionInfoSourceGeoclue2(QObject *parent = nullptr);
+ ~QGeoPositionInfoSourceGeoclue2();
+
+ // From QGeoPositionInfoSource
+ void setUpdateInterval(int msec) override;
+ QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override;
+ PositioningMethods supportedPositioningMethods() const override;
+ void setPreferredPositioningMethods(PositioningMethods methods) override;
+ int minimumUpdateInterval() const override;
+
+ Error error() const override;
+
+ void startUpdates() override;
+ void stopUpdates() override;
+ void requestUpdate(int timeout = 5000) override;
+
+ private:
+ void setError(QGeoPositionInfoSource::Error error);
+ void restoreLastPosition();
+ void saveLastPosition();
+ void createClient();
+ bool configureClient();
+ void startClient();
+ void stopClient();
+ void requestUpdateTimeout();
+ void handleNewLocation(const QDBusObjectPath &oldLocation,
+ const QDBusObjectPath &newLocation);
+
+ QTimer *m_requestTimer = nullptr;
+ OrgFreedesktopGeoClue2ManagerInterface m_manager;
+ QPointer<OrgFreedesktopGeoClue2ClientInterface> m_client;
+ bool m_running = false;
+ bool m_lastPositionFromSatellite = false;
+ QGeoPositionInfoSource::Error m_error = NoError;
+ QGeoPositionInfo m_lastPosition;
+ };
+}
+
+QT_END_NAMESPACE
+
+#endif // QGEOPOSITIONINFOSOURCE_GEOCLUE2_P_H
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/main.cpp
^
|
@@ -155,22 +155,6 @@
rootContext->setContextProperty("programVersion", APP_VERSION);
rootContext->setContextProperty("defaultFontProvider", DEFAULT_FONTPROVIDER);
- // handle map matching setting
- rootContext->setContextProperty("mapMatchingCheck",
- #ifdef MAPMATCHING_CHECK_RUNTIME
- true
- #else
- false
- #endif
- );
- rootContext->setContextProperty("mapMatchingAvailable",
- #ifdef MAPMATCHING_AVAILABLE
- true
- #else
- false
- #endif
- );
-
// ////////////////////////////
// register QML types
#ifdef INTERNAL_CLIPBOARD
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/navigator.cpp
^
|
@@ -22,7 +22,6 @@
#define MAX_OFFROAD_COUNTS 3 // times position was updated and point was off the route (counted in a sequence)
#define MAX_OFFROAD_COUNTS_TO_REROUTE 5 // request reroute when driving along route but in opposite direction. should be larger than MAX_OFFROAD_COUNTS
#define REROUTE_REQUEST_TIME_INTERVAL_MS 5000 // min time elapsed since last rerouting request in milliseconds
-#define MAP_HORIZONTAL_ACCURACY_M 15.0 // amount of meters that are not considered to be offroad
// use var without m_ prefix
#define SET(var, value) { auto t=(value); if (m_##var != t) { m_##var=t; /*qDebug() << "Emit " #var;*/ emit var##Changed(); } }
@@ -45,6 +44,12 @@
DBusService::instance()->registerNavigator(this);
}
+void Navigator::setHorizontalAccuracy(double accuracy)
+{
+ m_horizontalAccuracy = accuracy;
+ emit horizontalAccuracyChanged();
+}
+
void Navigator::setupTranslator()
{
QString lang = m_language;
@@ -177,7 +182,7 @@
SET(narrative, trans("Preparing to start navigation"));
}
- double accuracy_rad = S2Earth::MetersToRadians(std::max(horizontalAccuracy, MAP_HORIZONTAL_ACCURACY_M));
+ double accuracy_rad = S2Earth::MetersToRadians(std::max(horizontalAccuracy, m_horizontalAccuracy));
S1ChordAngle accuracy = S1ChordAngle::Radians(accuracy_rad);
S2Point point = S2LatLng::FromDegrees(c.latitude(), c.longitude()).ToPoint();
@@ -479,7 +484,7 @@
SET(icon, QLatin1String("away-from-route")); // away from route icon
SET(narrative, trans("Away from route"));
SET(manDist,
- m_distance_to_route_m > 1 ?
+ m_distance_to_route_m > m_horizontalAccuracy ?
distanceToStr(m_distance_to_route_m) : QLatin1String("-"));
}
@@ -508,6 +513,7 @@
{
const double accuracy_m = 5;
const double accuracy = S2Earth::MetersToRadians(accuracy_m);
+ const S1ChordAngle accuracy_s1ca = S1ChordAngle::Radians(accuracy);
// copy route coordinates
QVariantList x = m.value("x").toList();
@@ -563,12 +569,12 @@
orig2new_index.append(route.length()-1);
}
- std::vector<S2LatLng> coor;
+ std::vector<S2Point> coor;
coor.reserve(x.length());
m_route.reserve(route.length());
for (QGeoCoordinate c: route)
{
- coor.push_back(S2LatLng::FromDegrees(c.latitude(), c.longitude()));
+ coor.push_back(S2LatLng::FromDegrees(c.latitude(), c.longitude()).ToPoint());
m_route.append(QVariant::fromValue(c));
}
@@ -786,9 +792,9 @@
break;
}
- ne = orig2new_index[ne];
- if (ne > 0)
+ if (ne > 0 && (ne = orig2new_index[ne]) > 0)
{
+ // determine those parameters for locations with the missing index later
li.length_on_route = m_edges[ne-1].length + m_edges[ne-1].length_before;
li.length_on_route_m = S2Earth::RadiansToMeters(li.length_on_route);
const Maneuver &man = m_maneuvers[m_edges[ne-1].maneuver];
@@ -796,10 +802,13 @@
if (man.length > 0)
li.duration_on_route +=
(li.length_on_route - man.length_on_route) / man.length * man.duration;
+ // update to new edge index
+ locindexes[i] = ne;
}
li.point = S2LatLng::FromDegrees(li.latitude, li.longitude).ToPoint();
- li.distance_to_route = S1ChordAngle(li.point, coor[ne].ToPoint()).radians();
+ if (ne >= 0)
+ li.distance_to_route = S1ChordAngle(li.point, coor[ne]).radians();
locations_processed.push_back(li);
@@ -809,6 +818,56 @@
// << S2Earth::RadiansToMeters(li.distance_to_route) << "m"
// << " duration along route: " << li.duration_on_route << "s";
}
+
+ // go through locations with the missing indexes and fill them the best
+ // we can by assuming that the closest coordinate on the route would correspond
+ // to it
+ for (int i=0; i < locindexes.length(); ++i)
+ if (locindexes[i].toInt() < 0)
+ {
+ // set bounds where the search is conducted
+ int e0 = i > 0 ? locindexes[i-1].toInt() : 0;
+ int e1 = m_edges.size();
+ for (int k=i; k < locindexes.length(); ++k)
+ if (locindexes[k].toInt() >= 0)
+ {
+ e1 = locindexes[k].toInt();
+ break;
+ }
+
+ Location &li = locations_processed[i];
+ int ne = e0;
+ S1ChordAngle min_d(li.point, coor[ne]);
+ for (int e = e0 + 1; e < e1 && min_d > accuracy_s1ca; ++e)
+ {
+ S1ChordAngle a(li.point, coor[e]);
+ if (a < min_d)
+ {
+ ne = e;
+ min_d = a;
+ }
+ }
+
+ // fill missing location info - same as was done earlier for
+ // locations with index
+ if (ne > 0 && (ne = orig2new_index[ne]) > 0)
+ {
+ // determine those parameters for locations with the missing index later
+ li.length_on_route = m_edges[ne-1].length + m_edges[ne-1].length_before;
+ li.length_on_route_m = S2Earth::RadiansToMeters(li.length_on_route);
+ const Maneuver &man = m_maneuvers[m_edges[ne-1].maneuver];
+ li.duration_on_route = man.duration_on_route;
+ if (man.length > 0)
+ li.duration_on_route +=
+ (li.length_on_route - man.length_on_route) / man.length * man.duration;
+ }
+ li.distance_to_route = S1ChordAngle(li.point, coor[ne]).radians();
+
+ // update locindexes to be used in the following search if needed
+ locindexes[i] = ne;
+ }
+
+
}
else
qWarning() << "Number of locations and number of their indexes do not match. Number of indexes:"
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/navigator.h
^
|
@@ -33,6 +33,7 @@
Q_PROPERTY(QString destTime READ destTime NOTIFY destTimeChanged)
Q_PROPERTY(double direction READ direction NOTIFY directionChanged)
Q_PROPERTY(bool directionValid READ directionValid NOTIFY directionValidChanged)
+ Q_PROPERTY(double horizontalAccuracy READ horizontalAccuracy WRITE setHorizontalAccuracy NOTIFY horizontalAccuracyChanged)
Q_PROPERTY(QString icon READ icon NOTIFY iconChanged)
Q_PROPERTY(QString language READ language NOTIFY languageChanged)
Q_PROPERTY(QVariantList locations READ locations WRITE setLocations NOTIFY locationsChanged)
@@ -66,6 +67,7 @@
QString destTime() const { return m_destTime; }
double direction() const { return m_direction; }
bool directionValid() const { return m_directionValid; }
+ double horizontalAccuracy() const { return m_horizontalAccuracy; }
QString icon() const { return m_icon; }
QString language() const { return m_language; }
QVariantList locations();
@@ -82,6 +84,8 @@
QString totalDist() const { return m_totalDist; }
QString totalTime() const { return m_totalTime; }
+ void setHorizontalAccuracy(double accuracy);
+
// locations
Q_INVOKABLE bool locationRemove(int index);
void setLocations(const QVariantList &locations);
@@ -120,6 +124,7 @@
void destTimeChanged();
void directionChanged();
void directionValidChanged();
+ void horizontalAccuracyChanged();
void iconChanged();
void languageChanged();
void locationsChanged();
@@ -219,6 +224,7 @@
QString m_destTime;
double m_direction{0};
bool m_directionValid{false};
+ double m_horizontalAccuracy{15};
QString m_icon;
QString m_manDist;
QString m_manTime;
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/positionsource.cpp
^
|
@@ -13,6 +13,10 @@
#include "dbustracker.h"
+#ifdef USE_BUNDLED_GEOCLUE2
+#include "geoclue2/qgeopositioninfosource_geoclue2.h"
+#endif
+
// use var without m_ prefix
#define SET(var, value) { auto t=(value); if (m_##var != t) { m_##var=t; /*qDebug() << "Emit " #var;*/ emit var##Changed(); } }
@@ -27,9 +31,12 @@
#define MAPMATCHING_SERVICE "io.github.rinigus.OSMScoutServer"
#define MAPMATCHING_PATH "/io/github/rinigus/OSMScoutServer/mapmatching"
+Q_LOGGING_CATEGORY(lcPositioning, "puremaps.positioning", QtCriticalMsg)
+
PositionSource::PositionSource(QObject *parent) : QObject(parent)
{
m_source = QGeoPositionInfoSource::createDefaultSource(this);
+
if (!m_source)
{
qWarning() << "Failed to acquire QGeoPositionInfoSource";
@@ -41,6 +48,13 @@
{
m_directionCalculate = true;
qInfo() << "Calculate direction using a sequence of coordinates";
+
+#ifdef USE_BUNDLED_GEOCLUE2
+ // replace system-provided geoclue2 with the bundled one
+ m_source->deleteLater();
+ m_source = new PM::QGeoPositionInfoSourceGeoclue2(this);
+ qInfo() << "Replacing system-provided Geoclue2 with the bundled plugin";
+#endif
}
m_source->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods);
@@ -55,6 +69,13 @@
// network
connect(&m_networkManager, &QNetworkAccessManager::finished, this, &PositionSource::onNetworkFinished);
+ // map matching
+ m_mapmatch = new OSMScoutMapMatch(MAPMATCHING_SERVICE,
+ MAPMATCHING_PATH,
+ QDBusConnection::sessionBus(), this);
+ connect(m_mapmatch, &OSMScoutMapMatch::ActiveChanged,
+ this, &PositionSource::checkMapMatchAvailable);
+
// track map matching service
DBusTracker::instance()->track(MAPMATCHING_SERVICE);
connect(DBusTracker::instance(), &DBusTracker::serviceAppeared,
@@ -67,8 +88,12 @@
connect(&m_timer, &QTimer::timeout, this, &PositionSource::onTestingTimer);
m_mapMatchingActivateTimer.setInterval(5000);
- m_mapMatchingActivateTimer.setSingleShot(false);
+ m_mapMatchingActivateTimer.setSingleShot(true);
connect(&m_mapMatchingActivateTimer, &QTimer::timeout, this, &PositionSource::onMapMatchingActivateTimer);
+
+ // check current state
+ checkMapMatchAvailable();
+ resetMapMatchingValues();
}
void PositionSource::setActive(bool active)
@@ -89,6 +114,7 @@
void PositionSource::setPosition(const QGeoPositionInfo &info)
{
+ qCInfo(lcPositioning) << "setPosition:" << info;
SETWITHVALID(coordinateDevice, info.coordinate(),
info.isValid() &&
!qIsNaN(info.coordinate().latitude()) &&
@@ -103,9 +129,9 @@
{
if (m_horizontalAccuracyValid && m_coordinateDeviceValid && m_horizontalAccuracy < 100)
{
- float threshold = m_horizontalAccuracy;
+ float threshold = std::max(10.0f, m_horizontalAccuracy);
if (m_history.empty()) m_history.push_back(m_coordinateDevice);
- QGeoCoordinate &last = m_history.back();
+ QGeoCoordinate last = m_history.back();
if (last.distanceTo(m_coordinateDevice) > threshold)
{
m_history.push_back(m_coordinateDevice);
@@ -126,6 +152,8 @@
SET(directionDevice, dir);
SET(directionDeviceValid, true);
m_directionTimestamp = QTime::currentTime();
+ qCInfo(lcPositioning) << "Calculated direction:" << m_directionDevice << "history:" << m_history.size() << "distance to last:"
+ << last.distanceTo(m_coordinateDevice) << "threshold:" << threshold;
}
}
@@ -245,32 +273,6 @@
/// Map matching support
///
-void PositionSource::setHasMapMatching(bool hasMapMatching)
-{
- SET(hasMapMatching, hasMapMatching);
-
- if (!m_hasMapMatching)
- {
- if (m_mapmatch)
- {
- m_mapmatch->deleteLater();
- m_mapmatch = nullptr;
- }
- }
- else if (!m_mapmatch && m_hasMapMatching)
- {
- m_mapmatch = new OSMScoutMapMatch(MAPMATCHING_SERVICE,
- MAPMATCHING_PATH,
- QDBusConnection::sessionBus(), this);
- // connect signals
- connect(m_mapmatch, &OSMScoutMapMatch::ActiveChanged,
- this, &PositionSource::checkMapMatchAvailable);
- }
-
- checkMapMatchAvailable();
- resetMapMatchingValues();
-}
-
void PositionSource::setMapMatchingMode(int mapMatchingMode)
{
SET(mapMatchingMode, mapMatchingMode);
@@ -282,7 +284,7 @@
void PositionSource::checkMapMatchAvailable()
{
- bool want = (m_active && m_hasMapMatching && m_mapmatch && m_mapMatchingMode > 0);
+ bool want = (m_active && m_mapmatch && m_mapMatchingMode > 0);
// if we don't need map matching, do not activate it via DBus
// or network
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/src/positionsource.h
^
|
@@ -27,7 +27,6 @@
Q_PROPERTY(bool directionDeviceValid READ directionDeviceValid NOTIFY directionDeviceValidChanged)
Q_PROPERTY(int directionMapMatch READ directionMapMatch NOTIFY directionMapMatchChanged)
Q_PROPERTY(bool directionMapMatchValid READ directionMapMatchValid NOTIFY directionMapMatchValidChanged)
- Q_PROPERTY(bool hasMapMatching READ hasMapMatching WRITE setHasMapMatching NOTIFY hasMapMatchingChanged)
Q_PROPERTY(float horizontalAccuracy READ horizontalAccuracy NOTIFY horizontalAccuracyChanged)
Q_PROPERTY(bool horizontalAccuracyValid READ horizontalAccuracyValid NOTIFY horizontalAccuracyValidChanged)
Q_PROPERTY(int mapMatchingMode READ mapMatchingMode WRITE setMapMatchingMode NOTIFY mapMatchingModeChanged)
@@ -56,7 +55,6 @@
bool directionDeviceValid() const { return m_directionDeviceValid; }
int directionMapMatch() const { return m_directionMapMatch; }
bool directionMapMatchValid() const { return m_directionMapMatchValid; }
- bool hasMapMatching() const { return m_hasMapMatching; }
float horizontalAccuracy() const { return m_horizontalAccuracy; }
bool horizontalAccuracyValid() const { return m_horizontalAccuracyValid; }
int mapMatchingMode() const { return m_mapMatchingMode; }
@@ -73,7 +71,6 @@
// setters
void setActive(bool active);
- void setHasMapMatching(bool hasMapMatching);
void setMapMatchingMode(int mapMatchingMode);
void setStickyDirection(bool stickyDirection);
void setTestingCoordinate(QGeoCoordinate testingCoordinate);
@@ -91,7 +88,6 @@
void directionDeviceValidChanged();
void directionMapMatchChanged();
void directionMapMatchValidChanged();
- void hasMapMatchingChanged();
void horizontalAccuracyChanged();
void horizontalAccuracyValidChanged();
void mapMatchingModeChanged();
@@ -142,7 +138,6 @@
bool m_directionDeviceValid{false};
int m_directionMapMatch{0};
bool m_directionMapMatchValid{false};
- bool m_hasMapMatching{false};
float m_horizontalAccuracy{0};
bool m_horizontalAccuracyValid{false};
int m_mapMatchingMode{0};
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/CMakeLists.txt
^
|
@@ -1,7 +1,12 @@
-file(GLOB GEOMAG_SRC LIST_DIRECTORIES false geomag/geomag/*.py)
-install(FILES ${GEOMAG_SRC} DESTINATION ${DATADIR}/poor/geomag)
-install(FILES geomag/geomag/model_data/WMM.COF
- DESTINATION ${DATADIR}/poor/geomag/model_data)
+if(USE_BUNDLED_GEOMAG)
+ file(GLOB GEOMAG_SRC LIST_DIRECTORIES false geomag/geomag/*.py)
+ install(FILES ${GEOMAG_SRC} DESTINATION ${DATADIR}/poor/geomag)
+ install(FILES geomag/geomag/model_data/WMM.COF
+ DESTINATION ${DATADIR}/poor/geomag/model_data)
+endif()
+
+file(GLOB FLEXPOLYLINE_SRC LIST_DIRECTORIES false flexible-polyline/python/flexpolyline/*.py)
+install(FILES ${FLEXPOLYLINE_SRC} DESTINATION ${DATADIR}/poor/flexpolyline)
if(USE_BUNDLED_GPXPY)
file(GLOB GPXPY_SRC LIST_DIRECTORIES false gpxpy/gpxpy/*.py)
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline
^
|
+(directory)
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/.gitignore
^
|
@@ -0,0 +1,13 @@
+rust/target
+**/*.rs.bk
+rust/Cargo.lock
+cpp/build
+[Bb]in
+[Dd]ebug*/
+obj/
+*.suo
+.idea
+.vs
+
+*.user
+*.class
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/.ort.yml
^
|
@@ -0,0 +1,21 @@
+excludes:
+ paths:
+ - pattern: "cpp/test"
+ reason : "TEST_TOOL_OF"
+ comment: "Directory containing code only used for testing. Not included in released artifacts in the context of this project."
+ - pattern: "golang/*_test.go"
+ reason : "TEST_TOOL_OF"
+ comment: "Files containing code only used for testing. Not included in released artifacts in the context of this project."
+ - pattern: "python/test_flexpolyline.py"
+ reason : "TEST_TOOL_OF"
+ comment: "File containing code only used for testing. Not included in released artifacts in the context of this project."
+ - pattern: "test"
+ reason : "TEST_TOOL_OF"
+ comment: "Directory containing code only used for testing. Not included in released artifacts in the context of this project."
+ scopes:
+ - name : "dev-dependencies"
+ reason : "BUILD_TOOL_OF"
+ comment: "Scope with dependencies only used for development. Not included in released artifacts in the context of this project."
+ - name : "devDependencies"
+ reason : "BUILD_TOOL_OF"
+ comment: "Scope with dependencies only used for development. Not included in released artifacts in the context of this project."
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/CONTRIBUTING.md
^
|
@@ -0,0 +1,28 @@
+# Introduction
+
+The team behind the [Flexible Polyline](https://github.com/heremaps/flexible-polyline) gratefully accepts contributions via
+[pull requests](https://help.github.com/articles/about-pull-requests/) filed against the
+[GitHub project](https://github.com/heremaps/flexible-polyline/pulls).
+
+# Signing each Commit
+
+As part of filing a pull request we ask you to sign off the
+[Developer Certificate of Origin](https://developercertificate.org/) (DCO) in each commit.
+Any Pull Request with commits that are not signed off will be reject by the
+[DCO check](https://probot.github.io/apps/dco/).
+
+A DCO is lightweight way for a contributor to confirm that they wrote or otherwise have the right
+to submit code or documentation to a project. Simply add `Signed-off-by` as shown in the example below
+to indicate that you agree with the DCO.
+
+An example signed commit message:
+
+```
+ README.md: Fix minor spelling mistake
+
+ Signed-off-by: John Doe <john.doe@example.com>
+```
+
+Git has the `-s` flag that can sign a commit for you, see example below:
+
+`$ git commit -s -m 'README.md: Fix minor spelling mistake'`
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/LICENSE
^
|
@@ -0,0 +1,7 @@
+Copyright 2019 HERE Europe B.V
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/R/README.md
^
|
@@ -0,0 +1,96 @@
+
+# Flexible Polyline Encoding for R
+
+<!-- badges: start -->
+[![CRAN status](https://www.r-pkg.org/badges/version/flexpolyline)](https://CRAN.R-project.org/package=flexpolyline)
+[![CRAN checks](https://cranchecks.info/badges/worst/flexpolyline)](https://cran.r-project.org/web/checks/check_results_flexpolyline.html)
+[![CRAN downloads](https://cranlogs.r-pkg.org/badges/last-month/flexpolyline?color=brightgreen)](https://CRAN.R-project.org/package=flexpolyline)
+[![Codecov test coverage](https://codecov.io/gh/munterfinger/flexpolyline/branch/master/graph/badge.svg)](https://codecov.io/gh/munterfinger/flexpolyline?branch=master)
+<!-- badges: end -->
+
+The **[flexpolyline](https://CRAN.R-project.org/package=flexpolyline)** R package
+binds to the [C++ implementation](https://github.com/heremaps/flexible-polyline/tree/master/cpp)
+of the flexible polyline encoding by HERE. The package is designed to interface
+with simple features of the **[sf](https://CRAN.R-project.org/package=sf)** package,
+which is a common way of handling spatial data in R. For detailed information on
+encoding and decoding polylines in R, see the package
+[documentation](https://munterfinger.github.io/flexpolyline/index.html)
+or the [repository](https://github.com/munterfinger/flexpolyline) on GitHub.
+
+**Note:**
+* The order of the coordinates (lng, lat) does not correspond to the original
+C++ implementation (lat, lng). This enables direct conversion to simple feature
+objects without reordering the columns.
+* Decoding gives reliable results up to a precision of 7 digits.
+The package tests are also limited to this range.
+
+## Get started
+
+Install the released version of **flexpolyline** from CRAN:
+
+``` r
+install.packages("flexpolyline")
+```
+
+Encoding and decoding in R is straightforward by using `encode()` and `decode()`.
+These functions are binding to the flexpolyline C++ implementation and reflect
+the arguments and return values of their counterparts (`hf::encode_polyline` and
+`hf::decode_polyline`):
+
+``` r
+library(flexpolyline)
+
+line <- matrix(
+ c(8.69821, 50.10228, 10,
+ 8.69567, 50.10201, 20,
+ 8.69150, 50.10063, 30,
+ 8.68752, 50.09878, 40),
+ ncol = 3, byrow = TRUE
+)
+
+encode(line)
+#> [1] "B1Voz5xJ67i1Bgkh9B1B7Pgkh9BzIhagkh9BxL7Ygkh9B"
+
+decode("B1Voz5xJ67i1Bgkh9B1B7Pgkh9BzIhagkh9BxL7Ygkh9B")
+#> LNG LAT ELEVATION
+#> [1,] 8.69821 50.10228 10
+#> [2,] 8.69567 50.10201 20
+#> [3,] 8.69150 50.10063 30
+#> [4,] 8.68752 50.09878 40
+```
+
+A common way to deal with spatial data in R is the **sf** package, which is
+built on the concept of simple features. The functions `encode_sf()` and
+`decode_sf()` provide an interface that support the encoding of sf objects with
+geometry type `LINESTRING`:
+
+``` r
+sfg <- sf::st_linestring(line, dim = "XYZ")
+print(sfg)
+#> LINESTRING Z (8.69821 50.10228 10, 8.69567 50.10201 20, 8.6915 50.10063 3...
+
+encode_sf(sfg)
+#> [1] "B1Voz5xJ67i1Bgkh9B1B7Pgkh9BzIhagkh9BxL7Ygkh9B"
+
+decode_sf("B1Voz5xJ67i1Bgkh9B1B7Pgkh9BzIhagkh9BxL7Ygkh9B", crs = 4326)
+#> Simple feature collection with 1 feature and 2 fields
+#> geometry type: LINESTRING
+#> dimension: XYZ
+#> bbox: xmin: 8.68752 ymin: 50.09878 xmax: 8.69821 ymax: 50.10228
+#> z_range: zmin: 10 zmax: 40
+#> geographic CRS: WGS 84
+#> id dim3 geometry
+#> 1 1 ELEVATION LINESTRING Z (8.69821 50.10...
+```
+
+## References
+
+* [Flexible Polyline Encoding](https://github.com/heremaps/flexible-polyline)
+* [flexpolyline R package](https://github.com/munterfinger/flexpolyline)
+* [Simple Features for R](https://CRAN.R-project.org/package=sf)
+
+## License
+
+* The C++ implementation of the flexible polyline encoding by HERE Europe B.V.
+is licensed under MIT.
+* The **flexpolyline** R package is licensed under GNU GPL v3.0.
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/README.md
^
|
@@ -0,0 +1,186 @@
+# Flexible Polyline encoding
+
+The flexible polyline encoding is a lossy compressed representation of a list of coordinate pairs or
+coordinate triples.
+
+It achieves that by:
+
+1. Reducing the decimal digits of each value.
+2. Encoding only the offset from the previous point.
+3. Using variable length for each coordinate delta.
+4. Using 64 URL-safe characters to display the result.
+
+The encoding is a variant of [Encoded Polyline Algorithm Format]. The advantage of this encoding
+over the original are the following:
+
+* Output string is composed by only URL-safe characters, i.e. may be used without URL encoding as
+ query parameters.
+* Floating point precision is configurable: This allows to represent coordinates with
+ precision up to microns (5 decimal places allow meter precision only).
+* It allows to encode a 3rd dimension with a given precision, which may be a level, altitude,
+ elevation or some other custom value.
+
+## Specifications
+
+An encoded flexible polyline is composed by two main parts: A header and the actual polyline data.
+The header always starts with a version number that refers to the specifications in use. A change in
+the version may affect the logic to encode and decode the rest of the header and data. v.1 is the
+only version currently defined and this is the version assumed in the rest of the document.
+
+```[header version][header content][data]```
+
+### Encoding
+
+Both header and data make use of variable length integer encoding.
+
+Every input integer is converted in one or more chunks of 6 bits where the highest bit is a control
+bit while the remaining five store actual data. Each of these chunks gets encoded separately as a
+printable character using the following character set:
+
+```ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_```
+
+Where `A` represents 0 and `_` represents 63.
+
+#### Encoding an unsigned integer
+
+The variable encoding uses the highest bit (the sixth in this case) as control bit: When it's set to
+`1` it means another chunk needs to be read. Here is the algorithm to encode an unsigned integer:
+
+1. Given the binary representation of the number, split it in chunks of 5 bits.
+2. Convert every chunk from right to left.
+ 1. Every chunk that is followed by another chunk will be in OR with `0x20` (set the sixth bit to
+ `1`) and then encoded as a character.
+ 2. The last chunk (leftmost) is encoded as a character directly since the sixth bit is already set
+ to `0`.
+
+#### Encoding a signed integer
+
+In the binary representation of signed integers, the least significant bit stores the sign and the
+subsequent bits encode the number value resp. `abs(n)-1` for `n < 0`. That is, a positive integer
+`p` is stored as `2*p` while a negative integer `n` is stored as `2*abs(n)-1`. So for example, the
+number 7 is represented as `1110` and -7 as `1101`. After this transformation, the normal unsigned
+integer encoding algorithm can be used.
+
+
+### Header version
+
+The first unsigned varint of the encoded string refers to the specification version.
+
+### Header content
+
+It's encoded as an unsigned varint. The bits of the header content have the following structure:
+
+```
+bit [10 7] [6 4] [3 0]
+value [3rd dim precision] [3rd dim flag] [precision]
+```
+
+#### precision
+
+Refers to the precision (decimal digits after the comma) of the latitude and longitude coordinates.
+It is encoded as an unsigned integer with a range 0 to 15.
+
+#### 3rd dim flag
+
+This flag specifies whether the third dimension is present and what meaning it has. It's encoded as
+an unsigned integer with a range 0 to 7.
+
+Possible values are:
+
+ * 0 – absent
+ * 1 – level
+ * 2 – altitude
+ * 3 – elevation
+ * 4 – *reserved1*
+ * 5 – *reserved2*
+ * 6 – custom1
+ * 7 – custom2
+
+
+#### 3rd dim precision
+
+Refers to the precision (decimal digits after the comma) of the third dimension. Possible values are
+0 to 15.
+
+### Data
+
+All data values need to be normalized before encoding by transforming them to integers with the
+given precision. For example if precision is 5, the value 12.3 becomes 1230000.
+
+The data section is composed by a sequence of signed varints grouped in tuples of the same size (2
+if the 3rd dimension flag is absent and 3 otherwise).
+
+The first tuple contains the first set of normalized coordinates, while any other subsequent tuple
+contains the offset between two consecutive values on the same dimension.
+
+```Lat0 Lng0 3rd0 (Lat1-Lat0) (Lng1-Lng0) (3rdDim1-3rdDim0) ...```
+
+## Example
+
+The following coordinates
+
+```
+(50.10228, 8.69821), (50.10201, 8.69567), (50.10063, 8.69150), (50.09878, 8.68752)
+```
+
+are encoded with precision 5 as follows:
+
+```
+B F oz5xJ 67i1B 1B 7P zI ha xL 7Y
+```
+
+* The initial `B` is the header version (v.1)
+* The second letter `F` is the header, corresponding to the precision 5 and no 3rd dimension set.
+* The rest of the string are the encoded coordinates.
+
+## My favorite language is not supported. What now?
+
+Feel free to contribute an implementation. You can either use C-bindings, or
+provide an implementation in your language. Take a look at the implementations in other languages
+already available. Usually, the encoding/decoding is very straight-forward. The interface should
+match roughly the following API:
+
+```
+encode(coordinates, precision, third_dimension, third_dimension_precision) -> string;
+decode(string) -> coordinates;
+get_third_dimension(string) -> third_dimension;
+```
+
+To test your implementation, use the polylines defined in [test/original.txt]. Depending on the
+round function available in the language the expected encoded and decoded files need to be used:
+
+* Round to nearest, ties away from zero:
+ * [test/round\_half_up/encoded.txt]
+ * [test/round\_half_up/decoded.txt]
+* Round to nearest, ties to even:
+ * [test/round\_half_even/encoded.txt]
+ * [test/round\_half_even/decoded.txt]
+
+Check that encoded the original data results in the encoded form, and that decoding it again results
+in the decoded form.
+Format of the unencoded data is:
+
+* 2d: `{(precision2d); [(lat, lon), ..., (lat, lon), ]}`
+* 3d: `{(precision2d, precision3d, type3d); [(lat, lon, z), ..., (lat, lon, z), ]}`
+
+Floating point numbers are printed with 15 digits decimal precision. Be aware that encoding is
+lossy: Decoding an encoded polyline will not always yield the original, and neither will encoding a
+decoded polyline result in the same encoded representation.
+
+## TODO
+
+* Extend provided tests. We should cover all combinations of parameters.
+* Add C-bindings for people who just want to wrap them.
+
+[Encoded Polyline Algorithm Format]: https://developers.google.com/maps/documentation/utilities/polylinealgorithm
+[test/original.txt]: test/original.txt
+[test/round\_half_up/encoded.txt]: test/round_half_up/encoded.txt
+[test/round\_half_up/decoded.txt]: test/round_half_up/decoded.txt
+[test/round\_half_even/encoded.txt]: test/round_half_even/encoded.txt
+[test/round\_half_even/decoded.txt]: test/round_half_even/decoded.txt
+
+## License
+
+Copyright (C) 2019 HERE Europe B.V.
+
+See the [LICENSE](./LICENSE) file in the root of this project for license details.
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/cpp/CMakeLists.txt
^
|
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 3.5)
+project(flexpolyline)
+
+add_library(flexpolyline INTERFACE)
+target_include_directories(flexpolyline INTERFACE include)
+
+add_executable(flexpolyline_cli src/cli.cpp)
+set_property(TARGET flexpolyline_cli PROPERTY CXX_STANDARD 17)
+target_link_libraries(flexpolyline_cli flexpolyline)
+
+if(MSVC)
+ target_compile_options(flexpolyline_cli PRIVATE /W4 /WX)
+else()
+ target_compile_options(flexpolyline_cli PRIVATE -Wall -Wextra -pedantic -Werror)
+endif()
+
+enable_testing()
+add_executable(test_polyline test/test.cpp)
+set_property(TARGET test_polyline PROPERTY CXX_STANDARD 17)
+target_link_libraries(test_polyline flexpolyline)
+add_test(NAME test_polyline COMMAND test_polyline)
+
+if(MSVC)
+ target_compile_options(test_polyline PRIVATE /W4 /WX)
+else()
+ target_compile_options(test_polyline PRIVATE -Wall -Wextra -pedantic -Werror)
+endif()
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/cpp/include/hf/flexpolyline.h
^
|
@@ -0,0 +1,468 @@
+/*
+ * Copyright (C) 2019 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+#include <array>
+#include <cmath>
+#include <optional>
+#include <sstream>
+#include <string>
+#include <tuple>
+#include <variant>
+#include <vector>
+
+/// # Flexible Polyline encoding
+///
+/// The flexible polyline encoding is a lossy compressed representation of a list of coordinate
+/// pairs or coordinate triples. It achieves that by:
+///
+/// 1. Reducing the decimal digits of each value.
+/// 2. Encoding only the offset from the previous point.
+/// 3. Using variable length for each coordinate delta.
+/// 4. Using 64 URL-safe characters to display the result.
+///
+/// The encoding is a variant of [Encoded Polyline Algorithm Format]. The advantage of this encoding
+/// over the original are the following:
+///
+/// * Output string is composed by only URL-safe characters, i.e. may be used without URL encoding
+/// as query parameters.
+/// * Floating point precision is configurable: This allows to represent coordinates with precision
+/// up to microns (5 decimal places allow meter precision only).
+/// * It allows to encode a 3rd dimension with a given precision, which may be a level, altitude,
+/// elevation or some other custom value.
+///
+/// ## Specification
+///
+/// See [Specification].
+///
+/// [Encoded Polyline Algorithm Format]:
+/// https://developers.google.com/maps/documentation/utilities/polylinealgorithm
+///
+/// [Specification]: https://github.com/heremaps/flexible-polyline#specifications
+///
+/// ## Example
+///
+/// ```cpp
+/// #include< hf/flexpoly.h>
+///
+/// // encode
+/// std::vector<std::tuple<double, double>> coordinates = {{50.1022829, 8.6982122},
+/// {50.1020076, 8.6956695},
+/// {50.1006313, 8.6914960},
+/// {50.0987800, 8.6875156}};
+/// hf::Polyline polyline = hf::Polyline2d{std::move(coordinates), *hf::Precision::from_u32(5)};
+///
+/// std::string encoded;
+/// auto error = hf::polyline_encode(polyline, encoded));
+/// assert(!error);
+/// assert(encoded == "BFoz5xJ67i1B1B7PzIhaxL7Y");
+///
+/// // decode
+/// hf::Polyline result;
+/// auto decode_error = hf::polyline_decode(encoded, result);
+/// assert(!decode_error);
+/// ```
+namespace hf::flexpolyline {
+
+/// Coordinate precision in the polyline
+///
+/// Represents how many digits are to be encoded after the decimal point, e.g.
+/// precision 3 would encode 4.456787 as 4.457.
+///
+/// Supported values: `[0,16)`
+class Precision {
+public:
+ static std::optional<Precision> from_u32(uint32_t value) {
+ if (value > 15) {
+ return {};
+ }
+ return Precision(static_cast<uint8_t>(value));
+ }
+ uint32_t as_u32() const { return m_value; }
+
+private:
+ explicit Precision(uint8_t value) : m_value(value) {}
+ uint8_t m_value;
+};
+
+/// Informs about the type of the 3rd dimension of a 3D coordinate vector
+enum class Type3d {
+ /// E.g. floor of a building
+ LEVEL = 1,
+ /// E.g. altitude (in the air) relative to ground level or mean sea level
+ ALTITUDE = 2,
+ /// E.g. elevation above mean-sea-level
+ ELEVATION = 3,
+ /// Reserved for future types
+ RESERVED1 = 4,
+ /// Reserved for future types
+ RESERVED2 = 5,
+ /// Reserved for custom types
+ CUSTOM1 = 6,
+ /// Reserved for custom types
+ CUSTOM2 = 7,
+};
+
+/// 2-dimensional polyline
+struct Polyline2d {
+ /// List of 2D coordinates making up this polyline
+ std::vector<std::tuple<double, double>> coordinates;
+ /// Precision of the coordinates (e.g. used for encoding,
+ /// or to report the precision supplied in encoded data)
+ Precision precision2d = *Precision::from_u32(7);
+
+ Polyline2d() = default;
+ Polyline2d(std::vector<std::tuple<double, double>> coordinates, Precision precision2d)
+ : coordinates(std::move(coordinates)), precision2d(precision2d) {}
+};
+
+/// 3-dimensional polyline
+struct Polyline3d {
+ /// List of 3D coordinates making up this polyline
+ std::vector<std::tuple<double, double, double>> coordinates;
+ /// Precision of the 2D part of the coordinates (e.g. used for encoding,
+ /// or to report the precision supplied in encoded data)
+ Precision precision2d = *Precision::from_u32(7);
+ /// Precision of the 3D part of the coordinates (e.g. used for encoding,
+ /// or to report the precision supplied in encoded data)
+ Precision precision3d = *Precision::from_u32(3);
+ /// Type of the 3D component
+ Type3d type3d = Type3d::ELEVATION;
+
+ Polyline3d() = default;
+ Polyline3d(std::vector<std::tuple<double, double, double>> coordinates, Precision precision2d,
+ Precision precision3d, Type3d type3d)
+ : coordinates(std::move(coordinates)), precision2d(precision2d), precision3d(precision3d),
+ type3d(type3d) {}
+};
+
+/// 2- or 3-dimensional polyline
+using Polyline = std::variant<Polyline2d, Polyline3d>;
+
+inline std::string to_string(const Polyline &polyline, std::optional<int> precision = {}) {
+ std::ostringstream out;
+ out << std::fixed;
+ std::visit(
+ [&](auto &&arg) {
+ using T = std::decay_t<decltype(arg)>;
+ if constexpr (std::is_same_v<T, Polyline2d>) {
+ out << "{(" << arg.precision2d.as_u32() << "); [";
+ out.precision(precision.value_or(arg.precision2d.as_u32()));
+ for (auto &coord : arg.coordinates) {
+ out << "(" << std::get<0>(coord) << ", " << std::get<1>(coord) << "), ";
+ }
+ out << "]}";
+ } else if constexpr (std::is_same_v<T, Polyline3d>) {
+ out << "{(" << arg.precision2d.as_u32() << ", " << arg.precision3d.as_u32() << ", "
+ << static_cast<uint32_t>(arg.type3d) << "); [";
+ for (auto &coord : arg.coordinates) {
+ out.precision(precision.value_or(arg.precision2d.as_u32()));
+ out << "(" << std::get<0>(coord) << ", " << std::get<1>(coord);
+ out.precision(precision.value_or(arg.precision3d.as_u32()));
+ out << ", " << std::get<2>(coord) << "), ";
+ }
+ out << "]}";
+ } else {
+ static_assert(sizeof(T) == 0, "non-exhaustive visitor!");
+ }
+ },
+ polyline);
+ return out.str();
+}
+
+enum class Error {
+ /// Data is encoded with unsupported version
+ UNSUPPORTED_VERSION,
+ /// Precision is not supported by encoding
+ INVALID_PRECISION,
+ /// Encoding is corrupt
+ INVALID_ENCODING,
+};
+
+/// Encodes a polyline into a string.
+///
+/// The precision of the polyline is used to round coordinates, so the transformation is lossy
+/// in nature.
+inline std::optional<Error> polyline_encode(const Polyline &polyline, std::string &result) {
+ auto var_encode_u64 = [](uint64_t value, std::string &result) {
+ static const char *ENCODING_TABLE =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+
+ // var-length encode the number in chunks of 5 bits starting with the least significant
+ // to the most significant
+ while (value > 0x1F) {
+ uint32_t pos = (value & 0x1F) | 0x20;
+ char c = ENCODING_TABLE[pos];
+ result.push_back(c);
+ value >>= 5;
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/cpp/src/cli.cpp
^
|
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2021 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+
+#include <charconv>
+#include <iostream>
+
+#include <hf/flexpolyline.h>
+
+std::string_view remove_decoration(std::string_view x, std::string_view prefix,
+ std::string_view suffix) {
+ if (x.size() < suffix.size() + suffix.size() || x.substr(0, prefix.size()) != prefix ||
+ x.substr(x.size() - suffix.length(), suffix.length()) != suffix) {
+ throw std::runtime_error(std::string(prefix) + suffix.data() + " missing");
+ }
+ x.remove_prefix(prefix.size());
+ x.remove_suffix(suffix.size());
+ return x;
+}
+
+std::string_view split_next(std::string_view &x, std::string_view sep, bool required) {
+ auto pos = x.find(sep);
+ auto result = x.substr(0, pos);
+ if (pos == std::string::npos) {
+ if (required) {
+ throw std::runtime_error(std::string("Missing seperator: ") + sep.data());
+ }
+ x = std::string_view();
+ } else {
+ x = x.substr(pos + sep.size());
+ }
+ return result;
+}
+
+hf::flexpolyline::Precision parse_precision(std::string_view x) {
+ uint32_t prec_u32 = std::atoi(x.data());
+ if (auto prec = hf::flexpolyline::Precision::from_u32(prec_u32)) {
+ return *prec;
+ }
+ throw std::runtime_error("Precision outside of supported range: " + std::to_string(prec_u32));
+}
+
+hf::flexpolyline::Type3d parse_3d_type(std::string_view x) {
+ uint32_t value_u32 = std::atoi(x.data());
+ switch (value_u32) {
+ case 1:
+ return hf::flexpolyline::Type3d::LEVEL;
+ case 2:
+ return hf::flexpolyline::Type3d::ALTITUDE;
+ case 3:
+ return hf::flexpolyline::Type3d::ELEVATION;
+ case 4:
+ return hf::flexpolyline::Type3d::RESERVED1;
+ case 5:
+ return hf::flexpolyline::Type3d::RESERVED2;
+ case 6:
+ return hf::flexpolyline::Type3d::CUSTOM1;
+ case 7:
+ return hf::flexpolyline::Type3d::CUSTOM2;
+ default:
+ throw std::runtime_error("Unexpected 3d type: " + std::to_string(value_u32));
+ }
+}
+
+hf::flexpolyline::Polyline from_str(std::string_view input) {
+
+ auto data = remove_decoration(input, "{", "}");
+ auto header = remove_decoration(split_next(data, "; ", true), "(", ")");
+ auto coords_data = remove_decoration(data, "[(", "), ]");
+ auto precision2d = parse_precision(split_next(header, ", ", false));
+ if (header.empty()) {
+ std::vector<std::tuple<double, double>> coordinates;
+ while (!coords_data.empty()) {
+ auto lat_str = split_next(coords_data, ", ", true);
+ double lat = std::atof(lat_str.data());
+ auto lng_str = split_next(coords_data, "), (", false);
+ double lng = std::atof(lng_str.data());
+
+ coordinates.emplace_back(lat, lng);
+ }
+ return hf::flexpolyline::Polyline2d{std::move(coordinates), precision2d};
+ } else {
+ auto precision3d = parse_precision(split_next(header, ", ", true));
+ auto type3d = parse_3d_type(header);
+ std::vector<std::tuple<double, double, double>> coordinates;
+ while (!coords_data.empty()) {
+ auto lat_str = split_next(coords_data, ", ", true);
+ double lat = std::atof(lat_str.data());
+ auto lng_str = split_next(coords_data, ", ", true);
+ double lng = std::atof(lng_str.data());
+ auto third_str = split_next(coords_data, "), (", false);
+ double third = std::atof(third_str.data());
+
+ coordinates.emplace_back(lat, lng, third);
+ }
+ return hf::flexpolyline::Polyline3d{std::move(coordinates), precision2d, precision3d, type3d};
+ }
+}
+
+int main(int argc, const char *argv[]) {
+ if (argc != 2 ||
+ (std::string_view(argv[1]) != "encode" && std::string_view(argv[1]) != "decode")) {
+ std::cerr << "Usage: flexpolyline encode|decode" << std::endl;
+ std::cerr << " input: stdin" << std::endl;
+ std::cerr << " output: stdout" << std::endl;
+ return 1;
+ }
+
+ try {
+ std::string input_line;
+ while (std::cin) {
+ std::getline(std::cin, input_line);
+ if (input_line.empty()) {
+ continue;
+ }
+ if (std::string_view(argv[1]) == "encode") {
+ auto polyline = from_str(input_line);
+ std::string result;
+ if (auto error = hf::flexpolyline::polyline_encode(polyline, result)) {
+ std::cerr << "Failed to encode: " << static_cast<uint32_t>(*error) << std::endl;
+ return 1;
+ }
+ std::cout << result << std::endl;
+ } else if (std::string_view(argv[1]) == "decode") {
+ hf::flexpolyline::Polyline result;
+ if (auto error = hf::flexpolyline::polyline_decode(input_line, result)) {
+ std::cerr << "Failed to decode: " << static_cast<uint32_t>(*error) << std::endl;
+ return 1;
+ }
+ std::cout << hf::flexpolyline::to_string(result, 15) << std::endl;
+ } else {
+ std::cerr << "Command not recognized: " << argv[1] << std::endl;
+ return 1;
+ }
+ }
+ } catch (std::exception &e) {
+ std::cerr << "[ERROR] " << e.what() << std::endl;
+ return -1;
+ }
+
+ return 0;
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/cpp/test/test.cpp
^
|
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2019 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+#include <hf/flexpolyline.h>
+#include <iostream>
+#include <sstream>
+#include <tuple>
+#include <vector>
+
+using namespace hf::flexpolyline;
+
+void check_encode_decode(const Polyline &poly, const std::string &reference_encoded,
+ const Polyline &reference_decoded) {
+ std::string result;
+ if (auto error = polyline_encode(poly, result)) {
+ std::cerr << "Failed to encode " << to_string(poly) << std::endl;
+ std::exit(1);
+ }
+ if (result != reference_encoded) {
+ std::cerr << "Encoded " << to_string(poly) << std::endl
+ << "Got " << result << std::endl
+ << "Expected " << reference_encoded << std::endl;
+ std::exit(1);
+ }
+
+ Polyline decoded;
+ if (auto error = polyline_decode(reference_encoded, decoded)) {
+ std::cerr << "Failed to decode " << reference_encoded << std::endl;
+ std::exit(1);
+ }
+
+ if (to_string(reference_decoded) != to_string(decoded)) {
+ std::cerr << "Decoded " << reference_encoded << std::endl
+ << "Got " << to_string(decoded) << std::endl
+ << "Expected " << to_string(poly) << std::endl;
+ std::exit(1);
+ }
+}
+
+void test_2d_example_1() {
+ std::vector<std::tuple<double, double>> coordinates = {{50.1022829, 8.6982122},
+ {50.1020076, 8.6956695},
+ {50.1006313, 8.6914960},
+ {50.0987800, 8.6875156}};
+
+ std::vector<std::tuple<double, double>> coordinates_result = {
+ {50.102280, 8.698210}, {50.102010, 8.695670}, {50.100630, 8.691500}, {50.098780, 8.687520}};
+
+ check_encode_decode(Polyline2d{coordinates, *Precision::from_u32(5)}, "BFoz5xJ67i1B1B7PzIhaxL7Y",
+ Polyline2d{coordinates_result, *Precision::from_u32(5)});
+}
+
+void test_2d_example_2() {
+ std::vector<std::tuple<double, double>> coordinates = {
+ {52.5199356, 13.3866272}, {52.5100899, 13.2816896}, {52.4351807, 13.1935196},
+ {52.4107285, 13.1964502}, {52.3887100, 13.1557798}, {52.3727798, 13.1491003},
+ {52.3737488, 13.1154604}, {52.3875198, 13.0872202}, {52.4029388, 13.0706196},
+ {52.4105797, 13.0755529}};
+
+ std::vector<std::tuple<double, double>> coordinates_result = {
+ {52.519940, 13.386630}, {52.510090, 13.281690}, {52.435180, 13.193520},
+ {52.410730, 13.196450}, {52.388710, 13.155780}, {52.372780, 13.149100},
+ {52.373750, 13.115460}, {52.387520, 13.087220}, {52.402940, 13.070620},
+ {52.410580, 13.075550}};
+
+ check_encode_decode(Polyline2d{coordinates, *Precision::from_u32(5)},
+ "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e",
+ Polyline2d{coordinates_result, *Precision::from_u32(5)});
+}
+
+void test_3d_example_1() {
+ std::vector<std::tuple<double, double, double>> coordinates = {{50.1022829, 8.6982122, 10.0},
+ {50.1020076, 8.6956695, 20.0},
+ {50.1006313, 8.6914960, 30.0},
+ {50.0987800, 8.6875156, 40.0}};
+
+ std::vector<std::tuple<double, double, double>> coordinates_result = {
+ {50.102280, 8.698210, 10.0},
+ {50.102010, 8.695670, 20.0},
+ {50.100630, 8.691500, 30.0},
+ {50.098780, 8.687520, 40.0}};
+
+ check_encode_decode(
+ Polyline3d{coordinates, *Precision::from_u32(5), *Precision::from_u32(0), Type3d::LEVEL},
+ "BVoz5xJ67i1BU1B7PUzIhaUxL7YU",
+ Polyline3d{coordinates_result, *Precision::from_u32(5), *Precision::from_u32(0),
+ Type3d::LEVEL});
+}
+
+void test_rounding_2d() {
+ std::vector<std::tuple<uint64_t, uint64_t>> coordinate_values = {
+ {96821474666297905, 78334196549606266}, {29405294060895017, 70361389340728572},
+ {16173544634348013, 17673855782924183}, {22448654820449524, 13005139703027850},
+ {73351231936757857, 78298027377720633}, {78008331957098324, 4847613123220218},
+ {62755680515396509, 49165433608990700}, {93297154866561429, 52373802822465027},
+ {89973844644540399, 75975762025877533}, {48555821719956867, 31591090068957813}};
+
+ for (uint32_t precision2d = 0; precision2d < 16; precision2d++) {
+ auto to_f64 = [](const std::tuple<uint64_t, uint64_t> &value) {
+ return std::make_tuple(static_cast<double>(std::get<0>(value)) / std::pow(10, 15),
+ static_cast<double>(std::get<1>(value)) / std::pow(10, 15));
+ };
+
+ auto to_rounded_f64 = [&](const std::tuple<uint64_t, uint64_t> &input) {
+ auto value = to_f64(input);
+ auto scale = std::pow(10, precision2d);
+ return std::make_tuple(std::round(std::get<0>(value) * scale) / scale,
+ std::round(std::get<1>(value) * scale) / scale);
+ };
+
+ Polyline2d expected;
+ expected.precision2d = *Precision::from_u32(precision2d);
+ for (auto coord : coordinate_values) {
+ expected.coordinates.emplace_back(to_rounded_f64(coord));
+ }
+
+ Polyline2d actual;
+ actual.precision2d = *Precision::from_u32(precision2d);
+ for (auto coord : coordinate_values) {
+ actual.coordinates.emplace_back(to_f64(coord));
+ }
+
+ std::string expected_encoded;
+ if (auto error = polyline_encode(expected, expected_encoded)) {
+ std::cerr << "Failed to encode " << to_string(expected) << std::endl;
+ std::exit(1);
+ }
+
+ std::string actual_encoded;
+ if (auto error = polyline_encode(actual, actual_encoded)) {
+ std::cerr << "Failed to encode " << to_string(actual) << std::endl;
+ std::exit(1);
+ }
+
+ if (expected_encoded != actual_encoded) {
+ std::cerr << "Precision " << precision2d << std::endl
+ << "Expected " << expected_encoded << std::endl
+ << "Got " << actual_encoded << std::endl;
+ exit(1);
+ }
+ }
+}
+
+void test_rounding_3d() {
+ std::vector<std::tuple<uint64_t, uint64_t, uint64_t>> coordinate_values = {
+ {96821474666297905, 78334196549606266, 23131023979661380},
+ {29405294060895017, 70361389340728572, 81917934930416924},
+ {16173544634348013, 17673855782924183, 86188502094968953},
+ {22448654820449524, 13005139703027850, 68774670569614983},
+ {73351231936757857, 78298027377720633, 52078352171243855},
+ {78008331957098324, 4847613123220218, 6550838806837986},
+ {62755680515396509, 49165433608990700, 39041897671300539},
+ {93297154866561429, 52373802822465027, 67310807938230681},
+ {89973844644540399, 75975762025877533, 66789448009436096},
+ {48555821719956867, 31591090068957813, 49203621966471323}};
+
+ uint32_t precision2d = 5;
+ for (uint32_t precision3d = 0; precision3d < 16; precision3d++) {
+ for (auto type3d : {
+ Type3d::LEVEL,
+ Type3d::ALTITUDE,
+ Type3d::ELEVATION,
+ Type3d::RESERVED1,
+ Type3d::RESERVED2,
+ Type3d::CUSTOM1,
+ Type3d::CUSTOM2,
+ }) {
+ auto to_f64 = [](const std::tuple<uint64_t, uint64_t, uint64_t> &value) {
+ return std::make_tuple(static_cast<double>(std::get<0>(value)) / std::pow(10, 15),
+ static_cast<double>(std::get<1>(value)) / std::pow(10, 15),
+ static_cast<double>(std::get<2>(value)) / std::pow(10, 15));
+ };
+
+ auto to_rounded_f64 = [&](const std::tuple<uint64_t, uint64_t, uint64_t> &input) {
+ auto value = to_f64(input);
+ auto scale2d = std::pow(10, precision2d);
+ auto scale3d = std::pow(10, precision3d);
+ return std::make_tuple(std::round(std::get<0>(value) * scale2d) / scale2d,
+ std::round(std::get<1>(value) * scale2d) / scale2d,
+ std::round(std::get<2>(value) * scale3d) / scale3d);
+ };
+
+ Polyline3d expected;
+ expected.precision2d = *Precision::from_u32(precision2d);
+ expected.precision3d = *Precision::from_u32(precision3d);
+ expected.type3d = type3d;
+ for (auto coord : coordinate_values) {
+ expected.coordinates.emplace_back(to_rounded_f64(coord));
+ }
+
+ Polyline3d actual;
+ actual.precision2d = *Precision::from_u32(precision2d);
+ actual.precision3d = *Precision::from_u32(precision3d);
+ actual.type3d = type3d;
+ for (auto coord : coordinate_values) {
+ actual.coordinates.emplace_back(to_f64(coord));
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/.gitignore
^
|
@@ -0,0 +1,3 @@
+pubspec.lock
+.packages
+.dart_tool/
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/CHANGELOG.md
^
|
@@ -0,0 +1,2 @@
+# 1.0.0-alpha
+ * Initial commit
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/LICENSE
^
|
+(symlink to ../LICENSE)
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/README.md
^
|
@@ -0,0 +1,40 @@
+# Flexible Polyline encoder/decoder for Dart
+
+The flexible polyline encoding is a lossy compressed representation of a list of coordinate pairs or
+coordinate triples.
+
+For more information see the [github repo].
+
+# Usage
+
+## Encoding
+```
+List<LatLngZ> pairs = List<LatLngZ>();
+pairs.add(LatLngZ(50.1022829, 8.6982122));
+pairs.add(LatLngZ(50.1020076, 8.6956695));
+pairs.add(LatLngZ(50.1006313, 8.6914960));
+pairs.add(LatLngZ(50.0987800, 8.6875156));
+
+String encoded = FlexiblePolyline.encode(pairs /* coordinates */,
+ 5 /* coordinate precision */, ThirdDimension.ABSENT /* third dimension */,
+ 0 /* third dimension precision */);
+
+// encoded == 'BFoz5xJ67i1B1B7PzIhaxL7Y'
+```
+
+## Decoding
+```
+List<LatLngZ> decoded =
+ FlexiblePolyline.decode("BFoz5xJ67i1B1B7PzIhaxL7Y");
+
+/*
+decoded == [
+ LatLngZ(50.10228, 8.69821),
+ LatLngZ(50.10201, 8.69567),
+ LatLngZ(50.10063, 8.69150),
+ LatLngZ(50.09878, 8.68752),
+]
+*/
+```
+
+[github repo]: https://github.com/heremaps/flexible-polyline
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/lib/converter.dart
^
|
@@ -0,0 +1,107 @@
+import 'dart:math';
+
+import 'package:flexible_polyline/flexible_polyline.dart';
+import 'package:tuple/tuple.dart';
+
+///
+/// Stateful instance for encoding and decoding on a sequence of Coordinates
+/// part of a request.
+/// Instance should be specific to type of coordinates (e.g. Lat, Lng)
+/// so that specific type delta is computed for encoding.
+/// Lat0 Lng0 3rd0 (Lat1-Lat0) (Lng1-Lng0) (3rdDim1-3rdDim0)
+///
+class Converter {
+ final int precision;
+ late int multiplier;
+ int lastValue = 0;
+
+ Converter(this.precision) {
+ multiplier = pow(10, precision) as int;
+ }
+
+ // Returns decoded int, new index in tuple
+ static Tuple2<int, int> decodeUnsignedVarint(
+ List<String> encoded, int index) {
+ int shift = 0;
+ int delta = 0;
+ int value;
+
+ while (index < encoded.length) {
+ value = decodeChar(encoded[index]);
+ if (value < 0) {
+ throw ArgumentError("Invalid encoding");
+ }
+ index++;
+ delta |= (value & 0x1F) << shift;
+ if ((value & 0x20) == 0) {
+ return Tuple2(delta, index);
+ } else {
+ shift += 5;
+ }
+ }
+
+ if (shift > 0) {
+ throw ArgumentError("Invalid encoding");
+ }
+ return Tuple2(0, index);
+ }
+
+ // Decode single coordinate (say lat|lng|z) starting at index
+ // Returns decoded coordinate, new index in tuple
+ Tuple2<double, int> decodeValue(List<String> encoded, int index) {
+ final Tuple2<int, int> result = decodeUnsignedVarint(encoded, index);
+ double coordinate = 0;
+ int delta = result.item1;
+ if ((delta & 1) != 0) {
+ delta = ~delta;
+ }
+ delta = delta >> 1;
+ lastValue += delta;
+ coordinate = lastValue / multiplier;
+ return Tuple2(coordinate, result.item2);
+ }
+
+ static String encodeUnsignedVarint(int value) {
+ String result = '';
+ while (value > 0x1F) {
+ int pos = ((value & 0x1F) | 0x20);
+ result += FlexiblePolyline.encodingTable[pos];
+ value >>= 5;
+ }
+ result += (FlexiblePolyline.encodingTable[value]);
+ return result;
+ }
+
+ // Encode a single double to a string
+ String encodeValue(double value) {
+ /*
+ * Round-half-up
+ * round(-1.4) --> -1
+ * round(-1.5) --> -2
+ * round(-2.5) --> -3
+ */
+ final double scaledValue = (value * multiplier).abs().round() * value.sign;
+ int delta = (scaledValue - lastValue).toInt();
+ final bool negative = delta < 0;
+
+ lastValue = scaledValue.toInt();
+
+ // make room on lowest bit
+ delta <<= 1;
+
+ // invert bits if the value is negative
+ if (negative) {
+ delta = ~delta;
+ }
+ return encodeUnsignedVarint(delta);
+ }
+
+ //Decode a single char to the corresponding value
+ static int decodeChar(String charValue) {
+ final int pos = charValue.codeUnitAt(0) - 45;
+ if (pos < 0 || pos > 77) {
+ return -1;
+ }
+ return FlexiblePolyline.decodingTable[pos];
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/lib/flexible_polyline.dart
^
|
@@ -0,0 +1,290 @@
+import 'package:flexible_polyline/converter.dart';
+import 'package:flexible_polyline/latlngz.dart';
+import 'package:tuple/tuple.dart';
+
+class FlexiblePolyline {
+ static final int version = 1;
+ static final List<String> encodingTable =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
+ .split('');
+ static final List<int> decodingTable = [
+ 62,
+ -1,
+ -1,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ -1,
+ -1,
+ -1,
+ -1,
+ 63,
+ -1,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51
+ ];
+
+ ///
+ /// Decode the encoded input {@link String} to {@link List} of coordinate
+ /// triples.
+ ///
+ /// @param encoded URL-safe encoded {@link String}
+ /// @return {@link List} of coordinate triples that are decoded from input
+ ///
+ /// @see FlexiblePolyline#getThirdDimension(String) getThirdDimension
+ /// @see LatLngZ
+ ///
+ static List<LatLngZ> decode(String? encoded) {
+ if (encoded == null || encoded.trim().isEmpty) {
+ throw ArgumentError("Invalid argument!");
+ }
+ final List<LatLngZ> results = [];
+ final _Decoder dec = _Decoder(encoded);
+ LatLngZ? result;
+
+ do {
+ result = dec.decodeOne();
+ if (result != null) results.add(result);
+ } while (result != null);
+ return results;
+ }
+
+ ///
+ /// Encode the list of coordinate triples.<BR><BR>
+ /// The third dimension value will be eligible for encoding only when
+ /// ThirdDimension is other than ABSENT.
+ /// This is lossy compression based on precision accuracy.
+ ///
+ /// @param coordinates {@link List} of coordinate triples that to be encoded.
+ /// @param precision Floating point precision of the coordinate to be
+ /// encoded.
+ /// @param thirdDimension {@link ThirdDimension} which may be a level,
+ /// altitude, elevation or some other custom value
+ /// @param thirdDimPrecision Floating point precision for thirdDimension value
+ /// @return URL-safe encoded {@link String} for the given coordinates.
+ ///
+ static String encode(List<LatLngZ>? coordinates, int precision,
+ ThirdDimension? thirdDimension, int thirdDimPrecision) {
+ if (coordinates == null || coordinates.isEmpty) {
+ throw ArgumentError("Invalid coordinates!");
+ }
+ if (thirdDimension == null) {
+ throw ArgumentError("Invalid thirdDimension");
+ }
+ final _Encoder enc = _Encoder(precision, thirdDimension, thirdDimPrecision);
+ final Iterator<LatLngZ> iter = coordinates.iterator;
+ while (iter.moveNext()) {
+ enc.add(iter.current);
+ }
+ return enc.getEncoded();
+ }
+
+ /**
+ * ThirdDimension type from the encoded input {@link String}
+ * @param encoded URL-safe encoded coordinate triples {@link String}
+ * @return type of {@link ThirdDimension}
+ */
+ static ThirdDimension getThirdDimension(List<String> encoded) {
+ int index = 0;
+ Tuple2<int, int> headerResult =
+ _Decoder.decodeHeaderFromString(encoded, index);
+ final int header = headerResult.item1;
+ return ThirdDimension.values[(header >> 4) & 7];
+ }
+}
+
+/// Single instance for decoding an input request.
+class _Decoder {
+ final String encoded;
+ late int index;
+ late Converter latConverter;
+ late Converter lngConverter;
+ late Converter zConverter;
+ late List<String> split;
+
+ late int precision;
+ late int thirdDimPrecision;
+ late ThirdDimension thirdDimension;
+
+ _Decoder(this.encoded) {
+ index = 0;
+ split = encoded.split('');
+ _decodeHeader();
+ latConverter = Converter(precision);
+ lngConverter = Converter(precision);
+ zConverter = Converter(thirdDimPrecision);
+ }
+
+ bool hasThirdDimension() => thirdDimension != ThirdDimension.ABSENT;
+
+ void _decodeHeader() {
+ final Tuple2<int, int> headerResult = decodeHeaderFromString(split, index);
+ int header = headerResult.item1;
+ index = headerResult.item2;
+ precision = header & 15; // we pick the first 3 bits only
+ header = header >> 4;
+
+ thirdDimension =
+ ThirdDimension.values[header & 7]; // we pick the first 4 bits only
+ thirdDimPrecision = (header >> 3) & 15;
+ }
+
+ // Returns polyline header, new index in tuple.
+ static Tuple2<int, int> decodeHeaderFromString(
+ List<String> encoded, int index) {
+ // Decode the header version
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/lib/latlngz.dart
^
|
@@ -0,0 +1,32 @@
+/// Coordinate triple
+class LatLngZ {
+ final double lat;
+ final double lng;
+ final double z;
+
+ LatLngZ(this.lat, this.lng, [this.z = 0]);
+
+ @override
+ String toString() => "LatLngZ [lat=$lat, lng=$lng, z=$z]";
+
+ @override
+ bool operator ==(other) =>
+ other is LatLngZ && other.lat == lat && other.lng == lng && other.z == z;
+
+ @override
+ int get hashCode => lat.hashCode + lng.hashCode + z.hashCode;
+}
+
+/// 3rd dimension specification.
+/// Example a level, altitude, elevation or some other custom value.
+/// ABSENT is default when there is no third dimension en/decoding required.
+enum ThirdDimension {
+ ABSENT,
+ LEVEL,
+ ALTITUDE,
+ ELEVATION,
+ RESERVED1,
+ RESERVED2,
+ CUSTOM1,
+ CUSTOM2
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/pubspec.yaml
^
|
@@ -0,0 +1,17 @@
+name: flexible_polyline
+description: >-
+ Flexible Polyline encoder and decoder for representing a list of GPS
+ coordinates (and optional elevation) into a compressed URL-safe string.
+version: 1.0.1
+homepage: https://github.com/heremaps/flexible-polyline
+repository: https://github.com/heremaps/flexible-polyline/dart
+
+environment:
+ sdk: '>=2.12.0 <3.0.0'
+
+dependencies:
+ path: ^1.8.0
+ tuple: ^2.0.0
+
+dev_dependencies:
+ test: ^1.17.5
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/test/decode_test.dart
^
|
@@ -0,0 +1,11 @@
+import 'package:test/test.dart';
+
+import '../lib/flexible_polyline.dart';
+
+void main() {
+ test('decode polyline - null safety', () {
+ final encoded = "BFoz5xJ67i1B1B7PzIhaxL7Y";
+ final coords = FlexiblePolyline.decode(encoded);
+ expect(coords.isNotEmpty, true);
+ });
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/test/polyline_test.dart
^
|
@@ -0,0 +1,277 @@
+import 'dart:convert';
+import 'dart:io' show Platform, File;
+
+import 'package:flexible_polyline/converter.dart';
+import 'package:flexible_polyline/flexible_polyline.dart';
+import 'package:flexible_polyline/latlngz.dart';
+import "package:path/path.dart" show dirname, join;
+import 'package:test/test.dart';
+import 'package:tuple/tuple.dart';
+
+void main() {
+ test('testInvalidCoordinates', () {
+ //Null coordinates
+ expect(() => FlexiblePolyline.encode(null, 5, ThirdDimension.ABSENT, 0), throwsArgumentError);
+
+ //Empty coordinates list test
+ expect(() => FlexiblePolyline.encode([], 5, ThirdDimension.ABSENT, 0), throwsArgumentError);
+ });
+
+ test('testInvalidThirdDimension', () {
+ List<LatLngZ> pairs = [];
+ pairs.add(LatLngZ(50.1022829, 8.6982122));
+ ThirdDimension? invalid;
+
+ //Invalid Third Dimension
+ expect(() => FlexiblePolyline.encode(pairs, 5, invalid, 0), throwsArgumentError);
+ });
+
+ test('testConvertValue', () {
+ Converter conv = Converter(5);
+ String result = conv.encodeValue(-179.98321);
+ expect(result, equals("h_wqiB"));
+ });
+
+ test('testSimpleLatLngEncoding', () {
+ List<LatLngZ> pairs = [];
+ pairs.add(LatLngZ(50.1022829, 8.6982122));
+ pairs.add(LatLngZ(50.1020076, 8.6956695));
+ pairs.add(LatLngZ(50.1006313, 8.6914960));
+ pairs.add(LatLngZ(50.0987800, 8.6875156));
+
+ String expected = "BFoz5xJ67i1B1B7PzIhaxL7Y";
+ String computed = FlexiblePolyline.encode(pairs, 5, ThirdDimension.ABSENT, 0);
+ expect(computed, expected);
+ });
+
+ test('testComplexLatLngEncoding', () {
+ List<LatLngZ> pairs = [];
+ pairs.add(LatLngZ(52.5199356, 13.3866272));
+ pairs.add(LatLngZ(52.5100899, 13.2816896));
+ pairs.add(LatLngZ(52.4351807, 13.1935196));
+ pairs.add(LatLngZ(52.4107285, 13.1964502));
+ pairs.add(LatLngZ(52.38871, 13.1557798));
+ pairs.add(LatLngZ(52.3727798, 13.1491003));
+ pairs.add(LatLngZ(52.3737488, 13.1154604));
+ pairs.add(LatLngZ(52.3875198, 13.0872202));
+ pairs.add(LatLngZ(52.4029388, 13.0706196));
+ pairs.add(LatLngZ(52.4105797, 13.0755529));
+
+ String expected = "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e";
+ String computed = FlexiblePolyline.encode(pairs, 5, ThirdDimension.ABSENT, 0);
+ expect(computed, expected);
+ });
+
+ test('testLatLngZEncode', () {
+ List<LatLngZ> tuples = [];
+ tuples.add(LatLngZ(50.1022829, 8.6982122, 10));
+ tuples.add(LatLngZ(50.1020076, 8.6956695, 20));
+ tuples.add(LatLngZ(50.1006313, 8.6914960, 30));
+ tuples.add(LatLngZ(50.0987800, 8.6875156, 40));
+
+ String expected = "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU";
+ String computed = FlexiblePolyline.encode(tuples, 5, ThirdDimension.ALTITUDE, 0);
+ expect(computed, expected);
+ });
+
+ /********** Decoder test starts ***************/
+ test('testInvalidEncoderInput', () {
+ //Null coordinates
+ expect(() => FlexiblePolyline.decode(null), throwsArgumentError);
+
+ //Empty coordinates list test
+ expect(() => FlexiblePolyline.decode(""), throwsArgumentError);
+ });
+
+ test('testThirdDimension', () {
+ expect(FlexiblePolyline.getThirdDimension("BFoz5xJ67i1BU".split('')), equals(ThirdDimension.ABSENT));
+ expect(FlexiblePolyline.getThirdDimension("BVoz5xJ67i1BU".split('')), equals(ThirdDimension.LEVEL));
+ expect(FlexiblePolyline.getThirdDimension("BlBoz5xJ67i1BU".split('')), equals(ThirdDimension.ALTITUDE));
+ expect(FlexiblePolyline.getThirdDimension("B1Boz5xJ67i1BU".split('')), equals(ThirdDimension.ELEVATION));
+ });
+
+ test('testDecodeConvertValue', () {
+ final encoded = "h_wqiB".split('');
+ double expected = -179.98321;
+ Converter conv = new Converter(5);
+ Tuple2<double, int> result = conv.decodeValue(encoded, 0);
+ expect(result.item1, expected);
+ });
+
+ test('testSimpleLatLngDecoding', () {
+ List<LatLngZ> computed = FlexiblePolyline.decode("BFoz5xJ67i1B1B7PzIhaxL7Y");
+ List<LatLngZ> expected = [];
+ expected.add(LatLngZ(50.10228, 8.69821));
+ expected.add(LatLngZ(50.10201, 8.69567));
+ expected.add(LatLngZ(50.10063, 8.69150));
+ expected.add(LatLngZ(50.09878, 8.68752));
+
+ expect(computed, orderedEquals(expected));
+ });
+
+ test('testComplexLatLngDecoding', () {
+ List<LatLngZ> computed = FlexiblePolyline.decode("BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e");
+
+ List<LatLngZ> expected = [];
+ expected.add(LatLngZ(52.51994, 13.38663));
+ expected.add(LatLngZ(52.51009, 13.28169));
+ expected.add(LatLngZ(52.43518, 13.19352));
+ expected.add(LatLngZ(52.41073, 13.19645));
+ expected.add(LatLngZ(52.38871, 13.15578));
+ expected.add(LatLngZ(52.37278, 13.14910));
+ expected.add(LatLngZ(52.37375, 13.11546));
+ expected.add(LatLngZ(52.38752, 13.08722));
+ expected.add(LatLngZ(52.40294, 13.07062));
+ expected.add(LatLngZ(52.41058, 13.07555));
+
+ expect(computed, orderedEquals(expected));
+ });
+
+ test('testLatLngZDecode', () {
+ List<LatLngZ> computed = FlexiblePolyline.decode("BlBoz5xJ67i1BU1B7PUzIhaUxL7YU");
+ List<LatLngZ> expected = [];
+
+ expected.add(LatLngZ(50.10228, 8.69821, 10));
+ expected.add(LatLngZ(50.10201, 8.69567, 20));
+ expected.add(LatLngZ(50.10063, 8.69150, 30));
+ expected.add(LatLngZ(50.09878, 8.68752, 40));
+
+ expect(computed, orderedEquals(expected));
+ });
+
+ test('encodingSmokeTest', () {
+ List<String> input = [];
+ final inputFile = File(join(dirname(Platform.script.path), 'res/original.txt'));
+ Stream<List<int>> inputStream = inputFile.openRead();
+ inputStream
+ .transform(utf8.decoder) // Decode bytes to UTF-8.
+ .transform(LineSplitter()) // Convert stream to individual lines.
+ .listen((String line) {
+ // Process results.
+ input.add(line);
+ }, onError: (e) {
+ print(e.toString());
+ });
+
+ List<String> encoded = [];
+ final encodedFile = File(join(dirname(Platform.script.path), 'res/encoded.txt'));
+ Stream<List<int>> encodedStream = encodedFile.openRead();
+ encodedStream
+ .transform(utf8.decoder) // Decode bytes to UTF-8.
+ .transform(LineSplitter()) // Convert stream to individual lines.
+ .listen((String line) {
+ // Process results.
+ encoded.add(line);
+ }, onError: (e) {
+ print(e.toString());
+ });
+
+ // Assert both files have the same number of lines before comparing data.
+ expect(input.length, equals(encoded.length));
+
+ for (int i = 0; i < input.length; i++) {
+ int precision = 0;
+ int thirdDimPrecision = 0;
+ bool hasThirdDimension = false;
+ ThirdDimension thirdDimension = ThirdDimension.ABSENT;
+ String inputLine = input[i].trim();
+ String encodedLine = encoded[i].trim();
+
+ //File parsing
+ List<String> inputs = inputLine.substring(1, inputLine.length - 1).split(";");
+ List<String> meta = inputs[0].trim().substring(1, inputs[0].trim().length - 1).split(",");
+ precision = int.parse(meta[0]);
+
+ if (meta.length > 1) {
+ thirdDimPrecision = int.parse(meta[1].trim());
+ thirdDimension = ThirdDimension.values[int.parse(meta[2].trim())];
+ hasThirdDimension = true;
+ }
+ List<LatLngZ> latLngZs = extractLatLngZ(inputs[1], hasThirdDimension);
+ String encodedComputed = FlexiblePolyline.encode(latLngZs, precision, thirdDimension, thirdDimPrecision);
+ String encodedExpected = encodedLine;
+ expect(encodedComputed, encodedExpected);
+ }
+ });
+
+ test('decodingSmokeTest', () {
+ List<String> encoded = [];
+ final encodedFile = File(join(dirname(Platform.script.path), 'res/encoded.txt'));
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/test/res/decoded.txt
^
|
@@ -0,0 +1,3072 @@
+{(0, 15, 1); [(-97.000000000000000, 34.000000000000000, 228.390420353746407), ]}
+{(0, 15, 2); [(150.000000000000000, 46.000000000000000, -361.514615703930417), ]}
+{(0, 15, 3); [(107.000000000000000, 12.000000000000000, 590.877724345333036), ]}
+{(0, 15, 4); [(-88.000000000000000, 48.000000000000000, -724.072266325115038), ]}
+{(0, 15, 5); [(91.000000000000000, -41.000000000000000, -749.020580897311334), ]}
+{(0, 15, 6); [(-109.000000000000000, 74.000000000000000, 198.648082139788812), ]}
+{(0, 15, 7); [(-172.000000000000000, -82.000000000000000, -936.782939718311809), ]}
+{(0); [(-76.000000000000000, 74.000000000000000), ]}
+{(1, 14, 1); [(35.500000000000000, 89.099999999999994, 110.656668458282184), ]}
+{(1, 14, 2); [(-165.900000000000006, 79.099999999999994, 932.043507695096537), ]}
+{(1, 14, 3); [(40.299999999999997, -16.100000000000001, -795.325547749692760), ]}
+{(1, 14, 4); [(7.900000000000000, 88.900000000000006, 610.604874031274676), ]}
+{(1, 14, 5); [(-167.000000000000000, 82.599999999999994, 535.405899632264777), ]}
+{(1, 14, 6); [(-6.500000000000000, 71.200000000000003, -148.786816375532993), ]}
+{(1, 14, 7); [(109.700000000000003, -19.899999999999999, 292.387963103321056), ]}
+{(1); [(37.200000000000003, 57.100000000000001), ]}
+{(2, 13, 1); [(-100.530000000000001, -20.090000000000000, -783.570854149396951), ]}
+{(2, 13, 2); [(153.360000000000014, -67.790000000000006, -71.666489238810897), ]}
+{(2, 13, 3); [(126.180000000000007, 17.199999999999999, 666.522159882170172), ]}
+{(2, 13, 4); [(120.670000000000002, 40.170000000000002, 774.608401787319053), ]}
+{(2, 13, 5); [(-102.959999999999994, -21.649999999999999, -363.331171055102288), ]}
+{(2, 13, 6); [(101.379999999999995, 73.590000000000003, 801.595032687253479), ]}
+{(2, 13, 7); [(76.989999999999995, -62.649999999999999, -968.711536031164428), ]}
+{(2); [(-109.579999999999998, 19.820000000000000), ]}
+{(3, 12, 1); [(161.614000000000004, 31.370000000000001, 177.188143335314010), ]}
+{(3, 12, 2); [(-55.197000000000003, -71.269000000000005, -669.071372916466999), ]}
+{(3, 12, 3); [(111.209000000000003, -19.116000000000000, 556.410372880436967), ]}
+{(3, 12, 4); [(-7.842000000000000, 59.677999999999997, -866.037011797580021), ]}
+{(3, 12, 5); [(32.100999999999999, 13.680999999999999, -134.727188820344992), ]}
+{(3, 12, 6); [(-64.513999999999996, 34.932000000000002, -100.359269124402999), ]}
+{(3, 12, 7); [(-77.009000000000000, 59.170000000000002, -937.595069785072042), ]}
+{(3); [(-163.229999999999990, -46.962000000000003), ]}
+{(4, 11, 1); [(24.753599999999999, -52.970700000000001, -221.700311200019996), ]}
+{(4, 11, 2); [(-87.558700000000002, -2.271300000000000, -637.761106536970033), ]}
+{(4, 11, 3); [(35.411900000000003, -75.316500000000005, 804.016272289999961), ]}
+{(4, 11, 4); [(93.840500000000006, -41.533799999999999, -929.889005107379944), ]}
+{(4, 11, 5); [(159.418700000000001, 76.896799999999999, 58.025323505579998), ]}
+{(4, 11, 6); [(-15.819900000000001, 49.875799999999998, -856.212513040320005), ]}
+{(4, 11, 7); [(-5.832800000000000, -87.347200000000001, -713.729371309819953), ]}
+{(4); [(-75.180499999999995, 37.029499999999999), ]}
+{(5, 10, 1); [(-7.878950000000000, 83.812370000000001, 107.149447130200002), ]}
+{(5, 10, 2); [(157.096399999999988, -83.593249999999998, -246.103388527300012), ]}
+{(5, 10, 3); [(6.894930000000000, -16.158490000000000, 201.380364007299988), ]}
+{(5, 10, 4); [(-154.768900000000002, -9.018929999999999, 101.319675829299996), ]}
+{(5, 10, 5); [(-1.871230000000000, -65.574200000000005, 416.407619455100019), ]}
+{(5, 10, 6); [(-124.411230000000003, -76.537480000000002, -810.010750486600045), ]}
+{(5, 10, 7); [(-142.460640000000012, 79.870639999999995, -807.947901059700030), ]}
+{(5); [(119.947159999999997, -52.208480000000002), ]}
+{(6, 9, 1); [(-26.148087000000000, 56.308255000000003, 113.601667565000000), ]}
+{(6, 9, 2); [(34.191388000000003, -52.276789000000001, 25.084041953000000), ]}
+{(6, 9, 3); [(160.095271999999994, 89.201217000000000, -439.178377157999989), ]}
+{(6, 9, 4); [(-160.207469000000003, -15.410795999999999, -268.797752511999988), ]}
+{(6, 9, 5); [(-132.625310000000013, -44.764879999999998, -541.302744537999956), ]}
+{(6, 9, 6); [(-74.103588000000002, 54.949531000000000, -486.645581945000004), ]}
+{(6, 9, 7); [(1.732010000000000, -39.518619999999999, 499.114024771999993), ]}
+{(6); [(-27.095124999999999, -61.510271000000003), ]}
+{(7, 8, 1); [(-87.279298600000004, -89.300717800000001, -33.019102619999998), ]}
+{(7, 8, 2); [(-99.359727800000002, -79.421503400000006, 734.002529669999944), ]}
+{(7, 8, 3); [(-32.735042300000003, 20.590074200000000, 726.544831939999995), ]}
+{(7, 8, 4); [(-60.910613400000003, -9.769338800000000, 383.981879470000024), ]}
+{(7, 8, 5); [(-34.708648900000000, 53.314298200000003, 962.573549970000045), ]}
+{(7, 8, 6); [(-71.569464499999995, -76.340744599999994, 619.388478039999995), ]}
+{(7, 8, 7); [(-10.086054300000001, 64.205687100000006, -528.165943409999954), ]}
+{(7); [(6.784728500000000, 82.742761900000005), ]}
+{(8, 7, 1); [(16.489797480000000, -64.927545210000005, 255.572505500000005), ]}
+{(8, 7, 2); [(-40.761273500000001, 10.594928800000000, -799.445602900000040), ]}
+{(8, 7, 3); [(33.556037850000003, -51.341034450000002, 34.473165000000002), ]}
+{(8, 7, 4); [(132.004110139999995, -43.186010500000002, -535.235927500000003), ]}
+{(8, 7, 5); [(77.125067939999994, -32.613762710000003, -606.003542899999957), ]}
+{(8, 7, 6); [(110.796073829999997, -76.845306760000000, 489.682805700000017), ]}
+{(8, 7, 7); [(-69.576440950000006, 67.501347940000002, 685.321670799999993), ]}
+{(8); [(20.667478129999999, 12.116174239999999), ]}
+{(9, 6, 1); [(173.224834270000002, -51.578559542000001, 623.070742999999993), ]}
+{(9, 6, 2); [(-118.527232502999993, -66.851689448000002, -415.316754000000003), ]}
+{(9, 6, 3); [(-112.215186360000004, -0.812381528000000, 842.973481999999990), ]}
+{(9, 6, 4); [(-65.468443331000003, -13.450836141000000, 597.300674999999956), ]}
+{(9, 6, 5); [(144.509416901000009, -39.665513390000001, -392.197113000000002), ]}
+{(9, 6, 6); [(-69.905059627000000, -83.680819821000000, 725.549344000000019), ]}
+{(9, 6, 7); [(-107.097325769999998, 13.544733920000001, -414.603135000000009), ]}
+{(9); [(50.851824286000003, 6.880171876000000), ]}
+{(10, 5, 1); [(-37.135035136399999, -39.346646961399998, -542.987430000000018), ]}
+{(10, 5, 2); [(129.503261242399986, -29.370103596700002, 484.249990000000025), ]}
+{(10, 5, 3); [(-173.256619410000013, 56.834477302000003, 578.882619999999974), ]}
+{(10, 5, 4); [(-146.591328141699989, -52.162241089500000, -345.427990000000023), ]}
+{(10, 5, 5); [(-144.694461896200011, 42.763053307500002, 246.874300000000005), ]}
+{(10, 5, 6); [(-93.607661635200003, -77.341891258600000, -839.487949999999955), ]}
+{(10, 5, 7); [(23.515850799900001, 48.739804948000000, 905.684930000000008), ]}
+{(10); [(-88.783815707700001, 88.123684034299998), ]}
+{(11, 4, 1); [(175.148632289830005, 43.959191624340001, 279.023799999999994), ]}
+{(11, 4, 2); [(-2.237542376410000, -35.986508821359998, 171.173200000000008), ]}
+{(11, 4, 3); [(-29.512716639790000, 13.623026563370001, -765.759699999999953), ]}
+{(11, 4, 4); [(-54.735036244980002, -52.877854342189998, -273.318100000000015), ]}
+{(11, 4, 5); [(-96.013681408669996, -88.059118406520000, 581.416299999999978), ]}
+{(11, 4, 6); [(10.455724682200000, -59.009674269409999, -940.564499999999953), ]}
+{(11, 4, 7); [(-52.250029876109998, -44.734401443229999, 877.009900000000016), ]}
+{(11); [(35.616724674490001, 31.656018035810000), ]}
+{(12, 3, 1); [(-7.954060127209000, -64.010331940756998, 419.370000000000005), ]}
+{(12, 3, 2); [(-51.529087858547001, 27.663975936351999, -910.494000000000028), ]}
+{(12, 3, 3); [(59.040678317233002, -21.197115442636999, -210.030000000000001), ]}
+{(12, 3, 4); [(-112.957807915581000, -33.449756022351004, 312.939000000000021), ]}
+{(12, 3, 5); [(-72.215870433248995, 38.388199808396998, 747.123000000000047), ]}
+{(12, 3, 6); [(28.592997699028000, 52.361601084703999, -566.586999999999989), ]}
+{(12, 3, 7); [(-170.232549469861993, 73.382415590820003, 261.423999999999978), ]}
+{(12); [(-29.665067942120999, -20.412152002233000), ]}
+{(13, 2, 1); [(-131.621985186306603, -65.267762693484599, -386.000000000000000), ]}
+{(13, 2, 2); [(-91.890052577664605, 20.137457325144201, 488.300000000000011), ]}
+{(13, 2, 3); [(-139.743585019239504, -49.282042380237797, 246.560000000000002), ]}
+{(13, 2, 4); [(172.415186312622495, 57.431117466215802, 251.210000000000008), ]}
+{(13, 2, 5); [(-100.479328676662604, 53.623915449344899, -238.069999999999993), ]}
+{(13, 2, 6); [(-84.247830267599497, -20.577165104563800, 832.470000000000027), ]}
+{(13, 2, 7); [(-123.208011265460200, 71.824748887910005, -241.400000000000006), ]}
+{(13); [(-8.704623797530401, 13.930760827451500), ]}
+{(14, 1, 1); [(-116.587183775328256, -29.339494325922178, 787.299999999999955), ]}
+{(14, 1, 2); [(35.150216672546392, 52.714056356926307, 120.799999999999997), ]}
+{(14, 1, 3); [(8.302900345920429, -48.479828042241522, 256.300000000000011), ]}
+{(14, 1, 4); [(-145.880403486020413, 78.411604422157509, -589.100000000000023), ]}
+{(14, 1, 5); [(-68.582021592287958, -55.175318276001867, 726.200000000000045), ]}
+{(14, 1, 6); [(118.927628999217660, 18.732775893467039, 151.699999999999989), ]}
+{(14, 1, 7); [(115.334108065899485, 88.999630466034446, 624.100000000000023), ]}
+{(14); [(88.897075386144110, 32.870126294369001), ]}
+{(15, 0, 1); [(-124.913415557445830, 17.817284375950933, -137.000000000000000), ]}
+{(15, 0, 2); [(-146.864263375333536, -62.492281108997147, 708.000000000000000), ]}
+{(15, 0, 3); [(-39.267910031467096, -9.620616147069011, 600.000000000000000), ]}
+{(15, 0, 4); [(-144.820257983099737, 64.838603772210433, 910.000000000000000), ]}
+{(15, 0, 5); [(-164.868873394778291, 77.065657465639489, -611.000000000000000), ]}
+{(15, 0, 6); [(112.172857518170289, -1.407572730255838, 101.000000000000000), ]}
+{(15, 0, 7); [(171.861535899958028, 36.145261162701601, 944.000000000000000), ]}
+{(15); [(46.904312427053810, 34.963862600094707), ]}
+{(0, 15, 1); [(-5.000000000000000, -41.000000000000000, 361.708448353905908), (176.000000000000000, -14.000000000000000, -107.564622060807466), ]}
+{(0, 15, 2); [(79.000000000000000, -22.000000000000000, 117.695341434458300), (-121.000000000000000, 65.000000000000000, -628.961479383289088), ]}
+{(0, 15, 3); [(46.000000000000000, -19.000000000000000, -123.623715095231844), (-30.000000000000000, 84.000000000000000, 980.677685274976625), ]}
+{(0, 15, 4); [(69.000000000000000, -12.000000000000000, 430.163254796638057), (84.000000000000000, -13.000000000000000, 679.003308436807629), ]}
+{(0, 15, 5); [(-115.000000000000000, 42.000000000000000, 519.359752710566909), (44.000000000000000, 49.000000000000000, 90.796498009738059), ]}
+{(0, 15, 6); [(105.000000000000000, -85.000000000000000, 16.140331121891030), (-108.000000000000000, 23.000000000000000, -448.870417901860094), ]}
+{(0, 15, 7); [(28.000000000000000, -85.000000000000000, 235.411676264766868), (-156.000000000000000, 3.000000000000000, -424.259027395042324), ]}
+{(0); [(132.000000000000000, -67.000000000000000), (38.000000000000000, 62.000000000000000), ]}
+{(1, 14, 1); [(-69.500000000000000, 20.300000000000001, 467.225670906984419), (-71.500000000000000, 25.399999999999999, 983.755462977823527), ]}
+{(1, 14, 2); [(-81.099999999999994, 57.100000000000001, 886.094239602465336), (118.200000000000003, 41.600000000000001, -705.783532627241016), ]}
+{(1, 14, 3); [(-65.000000000000000, -40.700000000000003, -112.080135125796446), (-53.799999999999997, -43.899999999999999, -154.360805343933521), ]}
+{(1, 14, 4); [(40.000000000000000, 71.599999999999994, -213.685311617196163), (-110.200000000000003, 7.700000000000000, -467.374994852750092), ]}
+{(1, 14, 5); [(3.200000000000000, 13.300000000000001, 675.195570535907564), (168.199999999999989, 68.500000000000000, -470.658622832800177), ]}
+{(1, 14, 6); [(129.599999999999994, -82.000000000000000, -848.764052731434731), (-102.500000000000000, 0.300000000000000, -373.610514054078806), ]}
+{(1, 14, 7); [(-19.699999999999999, 29.699999999999999, -512.300814618991467), (-45.799999999999997, 89.400000000000006, 22.731626716685081), ]}
+{(1); [(149.699999999999989, -69.599999999999994), (29.100000000000001, -45.000000000000000), ]}
+{(2, 13, 1); [(-103.819999999999993, 9.859999999999999, -603.138584904996719), (-124.200000000000003, 62.420000000000002, 274.871067222638203), ]}
+{(2, 13, 2); [(143.039999999999992, -75.840000000000003, 717.413592862660039), (-70.010000000000005, 3.410000000000000, 616.398249487439216), ]}
+{(2, 13, 3); [(-61.600000000000001, 67.390000000000001, 758.787262266232688), (35.750000000000000, 69.950000000000003, 83.411681304012504), ]}
+{(2, 13, 4); [(41.619999999999997, -55.670000000000002, 314.423563957637327), (-165.189999999999998, 72.579999999999998, -119.721413860354701), ]}
+{(2, 13, 5); [(-118.930000000000007, 69.129999999999995, 265.366117504635383), (0.730000000000000, -32.060000000000002, 667.241240638668728), ]}
+{(2, 13, 6); [(-99.230000000000004, 14.199999999999999, 203.195078741524213), (-176.430000000000007, 79.030000000000001, -154.062085678639903), ]}
+{(2, 13, 7); [(88.230000000000004, 72.040000000000006, 821.728559501759150), (37.689999999999998, -73.219999999999999, -347.645370065438897), ]}
+{(2); [(-66.280000000000001, -17.660000000000000), (52.020000000000003, 13.580000000000000), ]}
+{(3, 12, 1); [(124.436000000000007, -81.691999999999993, 976.922106395031051), (146.854999999999990, 46.256999999999998, -642.932785872019963), ]}
+{(3, 12, 2); [(-174.854000000000013, 73.644999999999996, -916.594161748391002), (-139.497000000000014, 23.314000000000000, 655.470405937409055), ]}
+{(3, 12, 3); [(71.254999999999995, -73.733999999999995, -769.885117253900034), (68.209999999999994, -31.422999999999998, -375.388784214021996), ]}
+{(3, 12, 4); [(-6.776000000000000, -50.539000000000001, -834.860701015707036), (-41.729999999999997, -68.436000000000007, -983.572709529895974), ]}
+{(3, 12, 5); [(51.220999999999997, -50.935000000000002, -401.088703661064983), (61.972999999999999, -31.677000000000000, -267.935824724195015), ]}
+{(3, 12, 6); [(98.576999999999998, -77.417000000000002, -260.218528743023001), (72.456000000000003, 50.591999999999999, -575.994655497068038), ]}
+{(3, 12, 7); [(-179.492999999999995, -16.853000000000002, -599.587980511548039), (-134.229000000000013, -14.346000000000000, -892.926313462668986), ]}
+{(3); [(165.473000000000013, 7.243000000000000), (18.113000000000000, 35.866000000000000), ]}
+{(4, 11, 1); [(-87.671400000000006, 12.858700000000001, -712.533747708729948), (172.154100000000000, -38.863500000000002, -264.682021094509992), ]}
+{(4, 11, 2); [(-129.383999999999986, 58.277000000000001, -291.863359028300010), (-169.315599999999989, 40.673499999999997, 398.562329870690007), ]}
+{(4, 11, 3); [(166.685699999999997, 64.337100000000007, 175.201704576959997), (-50.591700000000003, 24.444800000000001, 536.689308441489970), ]}
+{(4, 11, 4); [(151.356200000000001, 86.418300000000002, 558.059403676009993), (122.263900000000007, -27.195499999999999, 818.860656393689965), ]}
+{(4, 11, 5); [(60.622799999999998, -50.801400000000001, 778.957509113490005), (82.897400000000005, -44.751899999999999, -940.753864567029950), ]}
+{(4, 11, 6); [(-62.667700000000004, 88.487399999999994, 231.787305534399991), (138.048300000000012, -74.972200000000001, 144.396211112140008), ]}
+{(4, 11, 7); [(37.904400000000003, -5.807300000000000, -817.703847733559996), (-10.408799999999999, 46.988500000000002, 134.633188873910001), ]}
+{(4); [(-144.411300000000011, 62.683700000000002), (-18.898599999999998, 6.684900000000000), ]}
+{(5, 10, 1); [(-72.284649999999999, -43.142670000000003, 643.120880325899975), (63.594560000000001, -0.892160000000000, -42.832984224000000), ]}
+{(5, 10, 2); [(-95.700590000000005, 53.578009999999999, 188.728215120399994), (-4.862450000000000, -32.400109999999998, -257.594550122200019), ]}
+{(5, 10, 3); [(-16.132690000000000, 11.849720000000000, 492.240797792199999), (164.715360000000004, 86.422569999999993, 331.196353159900013), ]}
+{(5, 10, 4); [(127.251379999999997, -33.886180000000003, -685.433826579199945), (155.042689999999993, -56.327050000000000, 473.747114781400001), ]}
+{(5, 10, 5); [(-45.580500000000001, -41.394979999999997, 374.279795723400014), (-102.532790000000006, -55.783569999999997, -779.885864589499988), ]}
+{(5, 10, 6); [(-85.376609999999999, 85.449709999999996, 797.101019441700032), (-158.111490000000003, 16.250389999999999, -683.673245703699990), ]}
+{(5, 10, 7); [(157.908729999999991, 64.218500000000006, -405.599320725700011), (150.226270000000000, 62.333440000000003, -662.788375223899948), ]}
+{(5); [(95.694090000000003, -5.656000000000000), (39.173549999999999, -68.113069999999993), ]}
+{(6, 9, 1); [(-147.371212000000014, -65.049169000000006, 764.500844039999947), (-38.258935000000001, -76.712637999999998, -635.131326682000008), ]}
+{(6, 9, 2); [(129.412317999999999, -68.617121999999995, -437.125494457999991), (-105.316654999999997, 80.068516000000002, 839.973604076000015), ]}
+{(6, 9, 3); [(117.001904999999994, 4.357320000000000, 604.595359988000041), (-50.091005000000003, -9.487428000000000, 393.505968483000004), ]}
+{(6, 9, 4); [(172.858654000000001, -46.982396999999999, -258.658795752000003), (-58.968618999999997, 86.742090000000005, -180.715148883000012), ]}
+{(6, 9, 5); [(-104.102922000000007, 74.910601000000000, -682.158035246000054), (-56.638961999999999, 68.357586999999995, 449.473777800999983), ]}
+{(6, 9, 6); [(167.420674999999989, 11.951025000000000, -528.985294826999962), (-68.018859000000006, 3.467421000000000, -179.206823619999994), ]}
+{(6, 9, 7); [(145.332322000000005, 59.913395999999999, 978.339917105000040), (-141.030431999999990, 89.245014999999995, 993.450596647999987), ]}
+{(6); [(106.225813000000002, -15.354350999999999), (162.440475999999990, -64.563202000000004), ]}
+{(7, 8, 1); [(128.651322499999992, -49.864493299999999, 119.050213560000003), (-29.753112300000002, 35.322063999999997, -665.423344219999990), ]}
+{(7, 8, 2); [(97.547068800000005, -85.426051799999996, -940.055633289999946), (-75.442530399999995, -13.587594400000000, 885.333428730000037), ]}
+{(7, 8, 3); [(-19.005702500000002, 64.577576800000003, 577.154229669999950), (37.039072400000002, 27.000987899999998, -517.013614999999959), ]}
+{(7, 8, 4); [(172.902740499999993, 2.989476000000000, 74.013731129999996), (-23.460602000000002, 25.541405600000001, 134.082122349999992), ]}
+{(7, 8, 5); [(-92.133890300000004, 38.370960400000001, 719.964168070000028), (-118.982805400000004, -24.778047500000000, -905.949539410000057), ]}
+{(7, 8, 6); [(18.878961799999999, 42.660064100000000, -333.742181159999973), (-133.305168199999997, -20.854327699999999, 879.367146159999947), ]}
+{(7, 8, 7); [(-15.188042400000000, -0.756051200000000, -688.297359799999981), (-80.548968000000002, 86.949077500000001, 745.863082350000013), ]}
+{(7); [(-91.794220100000004, 41.681522500000000), (-139.096931200000000, 78.328906900000007), ]}
+{(8, 7, 1); [(-89.139280420000006, -20.414106980000000, -713.981716699999993), (161.607705820000007, -62.950260960000001, -472.053403300000014), ]}
+{(8, 7, 2); [(-72.391130219999994, 75.844741540000001, 593.547143799999958), (53.992365200000002, -52.668221230000000, 71.938582600000004), ]}
+{(8, 7, 3); [(-26.448574189999999, -48.938803450000002, 170.612429399999996), (93.072003789999997, 55.484355309999998, 667.976624300000026), ]}
+{(8, 7, 4); [(114.626329310000003, 66.435589559999997, -860.515886199999954), (-153.329184940000005, -88.829935899999995, -13.796511300000001), ]}
+{(8, 7, 5); [(56.123883690000000, -62.660666020000001, 476.085172399999976), (-106.094184679999998, -6.997272370000000, 90.583369599999997), ]}
+{(8, 7, 6); [(133.447773149999989, -40.709803209999997, -241.707502299999987), (-118.205646750000000, -71.518740649999998, -51.963188600000002), ]}
+{(8, 7, 7); [(1.245825070000000, -59.507198610000003, -104.830665699999997), (172.637697300000013, 82.099867020000005, 938.328041399999961), ]}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/test/res/encoded.txt
^
|
@@ -0,0 +1,3072 @@
+Bw8BhGkCg-impzk4v21M
+Bg9BsJ8C_jj0kqlo3liU
+Bw9B2GYgw6tphnqwz5gB
+Bg-BvFgD_ng1gy-43mmoB
+Bw-B2FxC_nl961_v8wypB
+Bg_B5G0Egg7kozm467gL
+Bw_B3KjF_3v5xx2n-hg0B
+BA3E0E
+Bx4BmW23B0nyxx1yqg1T
+Bh5B1nDuxBgx6sk7n3hylF
+Bx5BmZhK_79jur_78otE
+Bh6B-Ey3Bwqhnv1ks8usD
+Bx6BroD0zBg32q6lw4tj_C
+Bh7BhEwsBnpiu3lol4ta
+Bx7BykCtMwshz3j-hh-zB
+BBoX2jB
+By0Bp0Tx9Djtx3lwoit9N
+Bi1Bw-d1nN5w51qssz3oB
+By1B00YwrDs0-831--76L
+Bi2BmyXi7Huywkp6thq4N
+By2BvjUpnE7-t27ty-wuG
+Bi3B05T-rOu9804_290nO
+By3BmhPxnM31ss-tq40mR
+BC7sV87D
+BzwB807J0o9Bk5j-q02piK
+BjxB55rDpmrEjvrswxihhmB
+BzxBym5G3qlBqj8_zirj0f
+BjyBjqP8x0D3krtu0_pnxB
+BzyBq2-Bi3ax34sn-ki1H
+BjzBjg-DonkClzk4y21x2F
+BzzBht2EkyzD_-xvi9mvp1B
+BD75-Jj37C
+B0sBgvjP1yqgBjovx68uqoB
+BktBlku1BxrsBhw4utoog0D
+B0tBu0zV5g_tBw014t2_nyE
+BkuBq6o5BzmrZjhmosq1kpF
+B0uB20phDw89uB8l1k8h4xK
+BkvBt_0Jskue_l1zog637E
+B0vBv9xD__p1Br-5hyuu6hE
+BE5r8tBunzW
+B1oBt7iwBqzx_Psovwh6r-B
+BlpBw86-d55m-Pxl3zhhovE
+B1pBq1iqBx-ziDyw6zhgn1D
+BlqBzp0wdpwh3Bqxuunn_6B
+B1qBlvtL3unwMuvlhpmsyH
+BlrBlir3Xn3kzOjum_g0v3O
+B1rB_qwlbw3vnPpy6nvmp2O
+BF4lj8W_-0-J
+B2kBtv-7xB-h5srD6-w_lzzG
+BmlB4h8mhCpj32jDiutgk3uB
+B2lBwiurxJiktkqFr87oihyZ
+BmmB5mpyxJ3mzsd_r6gz10P
+B2mB755-8H_sns1Cz9yhlowf
+BmnBny9qtE2p75oDxnk5quqc
+B2nB062pD35gsrCo0vuw1hd
+BGpl41zB9npq1D
+B3gBz5h3g0Bz06on1Brvz85kG
+BnhB71rkn7Bznh7qvBui97_2oE
+B3hBtp8rwTs8l3oM0v3txqnE
+BniBrt84pkB3s3q6F26s32wnC
+B3iBxpvg2Us8u84fqv2qspzF
+BnjBpjxi1qBrl2iwtB4jo_6rzD
+B3jB9nhsgGuqh0omBp6i1jsiD
+BHqnithEmylmqxB
+B4coy3lpiDxlp-_iM-vi1q4E
+Bodrniz-yHghq6k_B597mw8O
+B4dy05pgoGp55wgyJkg4wxU
+Boes4k55yYz1vithI12i6g_J
+B4e06hu2rO9wzysiGp2mzmpL
+Bofuly1s0Un_wihqOyp1-7jJ
+B4f9z802-M0gx7qyMo8kvv4M
+BIq6ogm7Dgpo_moC
+B5Y8t6kg1iKrjupqigDuhntklB
+BpZt_k4448Gv-pv1w8Djx9k4Y
+B5Zv7tvxgxGv16vtwB0yg7nyB
+Bpals1kn-5D5q8t3hZm8qozjB
+B5aq866tltI765-n8pCx_5hsX
+Bpb1ynq1miE5m9v477Egyg8nrB
+B5bzsg-vvnGgu-wqnZ93r52Y
+BJ8phlg3-Co2r8i6M
+B6Ung3ym2zV7uu3t88WtnkynD
+BqVwk71-lsrC97zo-hjRui0r8C
+B6Vn7r4_k7kD45g0_zihBsgntuD
+BqWx4l2nvq1C9or5jzre9sq8hC
+B6Wj986zkn0Cm9sw4w8Ys05ivB
+BqX_pxuwyv2Bz0lwrzgtB1v6jgF
+B6X-9ooxg2Nwsjgm7rc6y73sF
+BKpx08o31zBu5n85tpzB
+B7Quj8tm_v7fkk-smh8_H81pqF
+BrRxs7q54gNvl86pgvxGonvoD
+B7R12k_vl5rFi1vjyvpvC5nszO
+BrSjz-0nmz-J1mmqyo5zJ5n6mF
+B7Slk2sk-7uR34j9npygQm57iL
+BrT4_-m_w78B539kitv3K5si-R
+B7T1l4puqkwJl8l-5tskImjp3Q
+BLy_xjnkqvG6z2oyso4F
+B8Mx-129y_uOp5zjjx8t0D0izZ
+BsNl37o_ss39Cg241uloqyB7py3B
+B8Nirmi16zsrD58ilx26xmB7m6M
+BsO5j5vgqgvtG9krt6gh78B2mjT
+B8Oh-z3pxwrjE64utgzv6lCmnztB
+BsPo9mivzqg0Bgy2n0i7n_C1zyiB
+B8Prq3v06601Jo6yh6stvlEgz-P
+BMxug56v3-1Bxr7mizkklB
+B9Izh692wim6qC7j7sj66mjlBvsrC
+BtJrw_wtzhvn0Bk3l_8rxpuL8r_C
+B9J1g7pujv9tvCzg_xpy9tgcglwB
+BtKgt08qj7mgiD8g05x9p10gBiixB
+B9Kji449q12j5Byg8lqontve9vuB
+BtL1hi5-j2u8vBrwsplyvp2L-yiF
+B9LzwssuhwkhmC4_89tmwv6oB3kvB
+BNvw5_io4q-Eml7lw04s9H
+B-Ez5u3tn3i32Uz17_21q64mFisP
+BuF82gr7hm55nGul0nskm00rJwrC
+B-F2ykqy2npmvBvpkx903tyzImgF
+BuGzrnq-y2vn9Zu0-j5uz_29NlwL
+B-G33z-v_8_6lM1z97z8zq05J8lO
+BuHs29whk95gkVg5s9otjvvqD6-C
+B-H4_0zl27kzvUqr1g9_g-85PimM
+BO2ok8_zipq5Po-s5kkqh76F
+Bf_r8t_x3lw89Gsl78iquu50fxI
+BvB_p0-14nxo8kIvhyy2ow5ogvDosB
+B_Bvlx9vkm9j4lCnl09-_x57iRwlB
+BvC_15zrhvwiohIgw2sy5u30lzD84B
+B_C_r47mpv327kJgkp8zh1z18oElmB
+BvDgrw-590nponG79s0ywwrgwCqG
+B_Dgw967lgqmpxJgyxq9rj7zmgCg7B
+BPgvh40gqumqzCo_pkoi18uj-B
+Bw8BJxCgw2xs4263wiUqL2B_ipn3o43izha
+Bg9B-ErBgsot95wymixGvMuF_7u7-th7wqupB
+Bw9B8ClB_1-iiopnmz7G3EuGguvhh2uxo0p9B
+Bg-BqEXg4rxy97s-j8XeBgokyj7ut9g6N
+Bw-BlH0Cgg6q-is8ly6c-JO_q0pnwzggp5X
+Bg_ByGpFstrviv9iv1cpN4Gr9lypgg05g6Z
+Bw_B4BpFg6u237grzliNvLwF_58_ro0g-5zkB
+BAoIlE7FiI
+Bx4BtrB2Mws89t-q77_yCnBmDw4rqnljnk47C
+Bh5B1yB2jBgwk882pz7s9Ey8D1Jvwm2-hl8446I
+Bx5BzoBtZ3jt4hgooj9TgH_B387v9w85qwH
+Bh6BgZ4sB_zxwo9mk1-lB79C9nB_jw5n5p8hitB
+Bx6BgCqIwu2oytvrh-3DknDwiBv31tgwn1txrG
+Bh7BgxCnzB_q04jygp142EhxEuzBwipn1sz99s0C
+Bx7BpMySv4nnr3m_ig7CpQqlBoqmm9k26ph_C
+BBy9CvrBrrCsP
+By0B7oU09B925khz7g72Kr_DwoK67l6nm88izP
+Bi1Bg-b_5Ow6uizv1153MxzpBqvP_ox5ys1ut5B
+By1B_gMmlNurp5okqoqvNugTgQ1r069vqg9_L
+Bi2BkkI97Kozrssozq3yFxsoByhZ70366r0h52H
+By2BpnXiwNktwl2jt_62E8rXt4T6y32yvjiukH
+Bi3BlsT44C0smq8ojjwzDviPm1Mvqlm5nhvirG
+By3BunRoiOw34i9k_kjzO77J7rc5qji64m524U
+BCn-MruDsjXojG
+BzwBohzH3x_Eu58_jnrgx3Bm5rB685H1i7ju7-vi8C
+BjxBrw1K66vEt6kot15oj0B6hlC1piDwq57jumyr5C
+BzxBulrErgwE3wk694mt4rBp-Fu0yCswkv512ytW
+BjyBvnN12iD1pv1wnpzuvBzokCx-iB5o9ju2lwuI
+BzyBqhkDtvjDxgiy29ty5WggV0zlBsyhzhywmyH
+BjzBixgGxm3E9m_g_42q5OxgzByg6H5vu077ys-R
+BzzBpy-Kp9gB3zk8y0z0iiBgt4C28Ehl5pknxy1Q
+BDimjK2kO_5_I-83B
+B0sBzqw1B2k7Hxrv-i4vzhE-2y-Ermyf8qi7p86uxC
+BktB_g_uCknyjB7mm8l57i1Bn9rYl63K2ijs555y9D
+B0tByy3lD2yonBgmtlx757fr2zkE1krYq5t2gqk4hC
+BkuB0ls8Cu730Bivgio1qwlD1m4RzgrlCwt_ozgiuvB
+B0uBohglB7mgfq3igykk2tE0hzN-k2Dn_33xmh64J
+BkvBp_nmB0og2Bgmghg4llqBwnw6Dny4jDjrpuw718P
+B0vBoqkXxtxD3uoz3m130E3zvdslngB2smvizqntF
+BEhxk4CqpomButzsCn3liB
+B1oBhjm5N1pqnI27lq9hr2Li9q9Z2h8hI1_g1r8ovM
+BlpB1wjoSyugnKoy_g5q7tDs6tqRnz4sQz0kljt5jI
+B1pBp9uiD4sqoCk8hks2w-Iq85viBqglnOlntg_139C
+BlqBk51oYzs6uG_rh3sm_uM2_zpFt_-oEs-461t3iV
+B1qBjum2Iz-08Hknkykw75G5vz7K1o63Cx_k-qg6_U
+BlrB5jjpQ2sxpQi_1snl_vO_g-7N3vrmN7ju2ny99a
+B1rByx5je01-nMx9kjh8isHrv8uBzlwLr1o9zw21E
+BFioioS_1wiBrl_4K10m9L
+B2kB3s6i5Ihlpi8Dwgv05_vsBq91jwG5m8nWjunwygvxC
+BmlB8t262Hj6h8iEzr722muZ5g32_Ns0hz7Is6gnh5qqC
+B2lBirnl_Gws-pIovok2kmjB7qx2-J3wgtah5_h9lpM
+BmmB8xu2pK5vyz5Cvugwo5hPx0zl6Nu08h_Hqp125lxE
+B2mBzg-xmGy4l8uE7yom5z2nBwh_w6Cr7-vMu7wsw67hC
+BmnBmwxq_Ji7t5W1-js_p5e76iihOnx5lQuy0vtwrU
+B2nBkmsm1Ior6oyDiz2pzp-4BjommiRmqo-3Bu_1q1kc
+BGqpwzqG9-kpduoinrDlhv79C
+B3gBykx61sCp87i3d466gzlW3zsqt-Cq-354yBj4zu6jyE
+BnhBgmgyk6Bry9r9yBh8nsljvFvjvwjnD872m6qB0l1qlg0K
+B3hBhklwqLw5g3vmBuv7tjwrDqwg_shBh492sWllx-35rG
+BniB60u7hnDwm0g5By7-_k5Nhx1qh1DgszkuNk1rkhmL
+B3iBthiq92Bo6477WuyxoqjmE97ojgQ9hjv0lB3_2tm7uJ
+BnjBk35ioLis01tZn4zool-Bnp6126C7uju7lB4v3n2-hH
+B3jBvuh2hJ_zutO3i2pymgEvyk1-mBu5-6o0Bur1sokrI
+BHx73622Bynsg7Ytipnmcon5_6V
+B4cz2_-pzQzo6115D9s7jypNg4kmy2uBryikx9H8rqtmwE
+Bod7zswvvN0iynikO80tg5hLsu03pxXph88_9X3mz882J
+B4d1kp109Exh4q2jJsgyl2lDs823soWomsktuT6tgvuoJ
+Boem-ynnrV4i1y_rM78mh9gQhs1uk9xBj-xxu9cq5v814P
+B4eihg5wuKzqryv1L4wqz47Ipvw08meqys-4rK3i074lH
+Bofmmykt7Yhu940yH90xmiwEryyi_7uB_y6q03Fi03ijxD
+B4f2m9ztHp3jj2iLh-xvv-Buh_sy9fmg-shsa-vx14tT
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dart/test/res/original.txt
^
|
@@ -0,0 +1,3072 @@
+{(0, 15, 1); [(-96.628241002595274, 34.155307026461529, 228.390420353746407), ]}
+{(0, 15, 2); [(150.300518642964391, 45.699041698644933, -361.514615703930417), ]}
+{(0, 15, 3); [(106.956263816231854, 12.147560121864949, 590.877724345333036), ]}
+{(0, 15, 4); [(-88.122844295135991, 48.343773002135315, -724.072266325115038), ]}
+{(0, 15, 5); [(91.414950703190613, -41.235760053174971, -749.020580897311334), ]}
+{(0, 15, 6); [(-109.077048572005779, 74.320491640072319, 198.648082139788812), ]}
+{(0, 15, 7); [(-172.232870422800261, -82.237076952576828, -936.782939718311809), ]}
+{(0); [(-76.282695518610637, 74.280950984373561), ]}
+{(1, 14, 1); [(35.532078876193232, 89.050085485636274, 110.656668458282184), ]}
+{(1, 14, 2); [(-165.927462204818653, 79.089659033891692, 932.043507695096537), ]}
+{(1, 14, 3); [(40.318402005897994, -16.143284758549907, -795.325547749692760), ]}
+{(1, 14, 4); [(7.894036383711107, 88.949339370979274, 610.604874031274676), ]}
+{(1, 14, 5); [(-166.965014582129299, 82.615874365610182, 535.405899632264777), ]}
+{(1, 14, 6); [(-6.515207605925003, 71.150562298137260, -148.786816375532993), ]}
+{(1, 14, 7); [(109.715185049749550, -19.948568919695116, 292.387963103321056), ]}
+{(1); [(37.200320240246342, 57.110721491493983), ]}
+{(2, 13, 1); [(-100.534369033144756, -20.093735677798552, -783.570854149396951), ]}
+{(2, 13, 2); [(153.356565614211604, -67.791498310127338, -71.666489238810925), ]}
+{(2, 13, 3); [(126.183787025309357, 17.196047502127637, 666.522159882170172), ]}
+{(2, 13, 4); [(120.666210832455903, 40.169464189660602, 774.608401787319053), ]}
+{(2, 13, 5); [(-102.959016344911049, -21.646800211506307, -363.331171055102232), ]}
+{(2, 13, 6); [(101.384118587733454, 73.593367247399357, 801.595032687253479), ]}
+{(2, 13, 7); [(76.987276614616491, -62.652395192797968, -968.711536031164428), ]}
+{(2); [(-109.581461924700122, 19.822799248906414), ]}
+{(3, 12, 1); [(161.613535696658147, 31.370207283075224, 177.188143335314322), ]}
+{(3, 12, 2); [(-55.197497574151846, -71.268846763139166, -669.071372916466544), ]}
+{(3, 12, 3); [(111.209212706272467, -19.115718125068248, 556.410372880436853), ]}
+{(3, 12, 4); [(-7.841931973344585, 59.678242280352158, -866.037011797579567), ]}
+{(3, 12, 5); [(32.100745807577866, 13.680789924366293, -134.727188820344963), ]}
+{(3, 12, 6); [(-64.514059788523056, 34.932231320350454, -100.359269124402957), ]}
+{(3, 12, 7); [(-77.008539907608309, 59.170150987036358, -937.595069785072269), ]}
+{(3); [(-163.229523092621378, -46.962410782515256), ]}
+{(4, 11, 1); [(24.753622583183446, -52.970715095406327, -221.700311200019399), ]}
+{(4, 11, 2); [(-87.558724373064450, -2.271308532036607, -637.761106536972875), ]}
+{(4, 11, 3); [(35.411948511034815, -75.316464466821770, 804.016272290001893), ]}
+{(4, 11, 4); [(93.840536265980830, -41.533823826789096, -929.889005107380285), ]}
+{(4, 11, 5); [(159.418708381420117, 76.896832822807170, 58.025323505583287), ]}
+{(4, 11, 6); [(-15.819879767143824, 49.875838506803433, -856.212513040321710), ]}
+{(4, 11, 7); [(-5.832798552913143, -87.347200603388586, -713.729371309818134), ]}
+{(4); [(-75.180517431889086, 37.029458752565326), ]}
+{(5, 10, 1); [(-7.878946976199580, 83.812374167500010, 107.149447130154556), ]}
+{(5, 10, 2); [(157.096398701794215, -83.593245667122446, -246.103388527295238), ]}
+{(5, 10, 3); [(6.894932590339783, -16.158493864880466, 201.380364007271368), ]}
+{(5, 10, 4); [(-154.768899642536581, -9.018931421316752, 101.319675829294241), ]}
+{(5, 10, 5); [(-1.871232107407420, -65.574203823513116, 416.407619455104452), ]}
+{(5, 10, 6); [(-124.411226378108623, -76.537476566508332, -810.010750486570714), ]}
+{(5, 10, 7); [(-142.460643394880947, 79.870635361368983, -807.947901059707078), ]}
+{(5); [(119.947159802476222, -52.208475199290874), ]}
+{(6, 9, 1); [(-26.148086981613726, 56.308255057609301, 113.601667564576715), ]}
+{(6, 9, 2); [(34.191388182135434, -52.276788891512886, 25.084041952992660), ]}
+{(6, 9, 3); [(160.095272020113413, 89.201216798231215, -439.178377158330647), ]}
+{(6, 9, 4); [(-160.207469213211454, -15.410795983709567, -268.797752511670808), ]}
+{(6, 9, 5); [(-132.625309660997146, -44.764879822567309, -541.302744538057027), ]}
+{(6, 9, 6); [(-74.103587830603075, 54.949530801929107, -486.645581944912237), ]}
+{(6, 9, 7); [(1.732009768188307, -39.518620194550273, 499.114024771784216), ]}
+{(6); [(-27.095124980457143, -61.510271081920322), ]}
+{(7, 8, 1); [(-87.279298617358108, -89.300717772025195, -33.019102623076627), ]}
+{(7, 8, 2); [(-99.359727801017428, -79.421503415185242, 734.002529671537104), ]}
+{(7, 8, 3); [(-32.735042261558348, 20.590074239127972, 726.544831938664515), ]}
+{(7, 8, 4); [(-60.910613407320639, -9.769338841762508, 383.981879465606539), ]}
+{(7, 8, 5); [(-34.708648938662158, 53.314298151947746, 962.573549971052444), ]}
+{(7, 8, 6); [(-71.569464498349149, -76.340744574407083, 619.388478041713938), ]}
+{(7, 8, 7); [(-10.086054341343225, 64.205687093103023, -528.165943410145701), ]}
+{(7); [(6.784728543294822, 82.742761879739291), ]}
+{(8, 7, 1); [(16.489797476721076, -64.927545206003813, 255.572505539681174), ]}
+{(8, 7, 2); [(-40.761273496142046, 10.594928803903974, -799.445602949225076), ]}
+{(8, 7, 3); [(33.556037851081570, -51.341034445067663, 34.473165013522760), ]}
+{(8, 7, 4); [(132.004110141999462, -43.186010498043366, -535.235927478138024), ]}
+{(8, 7, 5); [(77.125067943873375, -32.613762709700055, -606.003542938226360), ]}
+{(8, 7, 6); [(110.796073825925035, -76.845306756959360, 489.682805692010731), ]}
+{(8, 7, 7); [(-69.576440949331172, 67.501347940522834, 685.321670761315090), ]}
+{(8); [(20.667478126196759, 12.116174240455580), ]}
+{(9, 6, 1); [(173.224834270081629, -51.578559541868223, 623.070742746266887), ]}
+{(9, 6, 2); [(-118.527232502817554, -66.851689448439387, -415.316753649318059), ]}
+{(9, 6, 3); [(-112.215186359834448, -0.812381528064743, 842.973482381957638), ]}
+{(9, 6, 4); [(-65.468443331005844, -13.450836141334577, 597.300675027520356), ]}
+{(9, 6, 5); [(144.509416900509336, -39.665513389747908, -392.197113019916799), ]}
+{(9, 6, 6); [(-69.905059627125397, -83.680819821340037, 725.549343817732620), ]}
+{(9, 6, 7); [(-107.097325769754121, 13.544733919664980, -414.603134879089851), ]}
+{(9); [(50.851824285808114, 6.880171876247154), ]}
+{(10, 5, 1); [(-37.135035136398344, -39.346646961365749, -542.987427065888596), ]}
+{(10, 5, 2); [(129.503261242409309, -29.370103596657327, 484.249990512666727), ]}
+{(10, 5, 3); [(-173.256619409991231, 56.834477302004707, 578.882615898150789), ]}
+{(10, 5, 4); [(-146.591328141696124, -52.162241089509259, -345.427992572313656), ]}
+{(10, 5, 5); [(-144.694461896215330, 42.763053307514831, 246.874302664048315), ]}
+{(10, 5, 6); [(-93.607661635208089, -77.341891258559258, -839.487949345803372), ]}
+{(10, 5, 7); [(23.515850799893183, 48.739804947977760, 905.684927530613095), ]}
+{(10); [(-88.783815707707205, 88.123684034320831), ]}
+{(11, 4, 1); [(175.148632289828754, 43.959191624344321, 279.023829409503207), ]}
+{(11, 4, 2); [(-2.237542376406492, -35.986508821356843, 171.173238314680162), ]}
+{(11, 4, 3); [(-29.512716639792139, 13.623026563367068, -765.759667905632796), ]}
+{(11, 4, 4); [(-54.735036244983014, -52.877854342188151, -273.318059454920899), ]}
+{(11, 4, 5); [(-96.013681408666898, -88.059118406517001, 581.416258928715365), ]}
+{(11, 4, 6); [(10.455724682201591, -59.009674269408819, -940.564549788127806), ]}
+{(11, 4, 7); [(-52.250029876112080, -44.734401443227576, 877.009934375994362), ]}
+{(11); [(35.616724674491238, 31.656018035805754), ]}
+{(12, 3, 1); [(-7.954060127208753, -64.010331940757197, 419.369561997797462), ]}
+{(12, 3, 2); [(-51.529087858547150, 27.663975936351733, -910.494251448574232), ]}
+{(12, 3, 3); [(59.040678317232675, -21.197115442636552, -210.030356134436317), ]}
+{(12, 3, 4); [(-112.957807915581114, -33.449756022350776, 312.938859251515339), ]}
+{(12, 3, 5); [(-72.215870433248895, 38.388199808396777, 747.123041537688323), ]}
+{(12, 3, 6); [(28.592997699028285, 52.361601084704141, -566.586902917139810), ]}
+{(12, 3, 7); [(-170.232549469861908, 73.382415590820457, 261.423927903178708), ]}
+{(12); [(-29.665067942120562, -20.412152002233249), ]}
+{(13, 2, 1); [(-131.621985186306603, -65.267762693484613, -385.999935419573035), ]}
+{(13, 2, 2); [(-91.890052577664576, 20.137457325144211, 488.298223642837172), ]}
+{(13, 2, 3); [(-139.743585019239532, -49.282042380237797, 246.559156019025437), ]}
+{(13, 2, 4); [(172.415186312622438, 57.431117466215746, 251.212490513077427), ]}
+{(13, 2, 5); [(-100.479328676662590, 53.623915449344913, -238.069633554504236), ]}
+{(13, 2, 6); [(-84.247830267599539, -20.577165104563800, 832.470538382848190), ]}
+{(13, 2, 7); [(-123.208011265460158, 71.824748887910005, -241.402867650956551), ]}
+{(13); [(-8.704623797530385, 13.930760827451456), ]}
+{(14, 1, 1); [(-116.587183775328256, -29.339494325922178, 787.315969918452765), ]}
+{(14, 1, 2); [(35.150216672546385, 52.714056356926314, 120.751166246460642), ]}
+{(14, 1, 3); [(8.302900345920431, -48.479828042241522, 256.296195829319458), ]}
+{(14, 1, 4); [(-145.880403486020413, 78.411604422157509, -589.149596746693760), ]}
+{(14, 1, 5); [(-68.582021592287958, -55.175318276001875, 726.159353549564912), ]}
+{(14, 1, 6); [(118.927628999217660, 18.732775893467043, 151.656887056446237), ]}
+{(14, 1, 7); [(115.334108065899485, 88.999630466034446, 624.106150893530753), ]}
+{(14); [(88.897075386144110, 32.870126294368994), ]}
+{(15, 0, 1); [(-124.913415557445830, 17.817284375950933, -137.355681454931727), ]}
+{(15, 0, 2); [(-146.864263375333536, -62.492281108997147, 708.472313070586438), ]}
+{(15, 0, 3); [(-39.267910031467096, -9.620616147069011, 599.566078946259381), ]}
+{(15, 0, 4); [(-144.820257983099737, 64.838603772210433, 910.399823203559095), ]}
+{(15, 0, 5); [(-164.868873394778291, 77.065657465639489, -610.977518004380954), ]}
+{(15, 0, 6); [(112.172857518170289, -1.407572730255838, 101.251865999278820), ]}
+{(15, 0, 7); [(171.861535899958028, 36.145261162701601, 943.902386572852606), ]}
+{(15); [(46.904312427053810, 34.963862600094707), ]}
+{(0, 15, 1); [(-5.281988541537555, -41.114856704856031, 361.708448353905908), (176.025561158535936, -14.061835277132053, -107.564622060807480), ]}
+{(0, 15, 2); [(78.603352143729950, -21.917964970892399, 117.695341434458300), (-120.924389397580001, 64.559247951370892, -628.961479383289088), ]}
+{(0, 15, 3); [(46.379119660609817, -19.296530661393128, -123.623715095231844), (-29.545731933317647, 83.612539281371951, 980.677685274976625), ]}
+{(0, 15, 4); [(68.688899101362964, -11.684948094164424, 430.163254796638057), (84.487917118940516, -12.758423751755510, 679.003308436807629), ]}
+{(0, 15, 5); [(-114.550796774290802, 42.374287882565241, 519.359752710566909), (44.227485971747534, 48.850041981939633, 90.796498009738059), ]}
+{(0, 15, 6); [(104.766594857416564, -85.471309603203792, 16.140331121891030), (-108.418859461517101, 23.371480437974519, -448.870417901860094), ]}
+{(0, 15, 7); [(28.315629770287167, -85.368133078466727, 235.411676264766868), (-155.685049452358925, 3.341250739290166, -424.259027395042324), ]}
+{(0); [(132.214677475033511, -66.776980042797163), (37.889281642819697, 61.887826478033347), ]}
+{(1, 14, 1); [(-69.539056196509634, 20.299259491346461, 467.225670906984419), (-71.501057769222157, 25.351269369832853, 983.755462977823527), ]}
+{(1, 14, 2); [(-81.145216037508931, 57.073390671625937, 886.094239602465336), (118.196916181782782, 41.556977072943326, -705.783532627241016), ]}
+{(1, 14, 3); [(-65.037959724826933, -40.712258531585043, -112.080135125796446), (-53.753639899751619, -43.926010407443641, -154.360805343933521), ]}
+{(1, 14, 4); [(39.960960734211270, 71.600540709478835, -213.685311617196163), (-110.207659886184615, 7.689449439741475, -467.374994852750092), ]}
+{(1, 14, 5); [(3.229395664953045, 13.296389755971580, 675.195570535907564), (168.175202959248026, 68.500705269421715, -470.658622832800177), ]}
+{(1, 14, 6); [(129.569676906443846, -82.013663987750434, -848.764052731434731), (-102.476976052111127, 0.255678282114429, -373.610514054078806), ]}
+{(1, 14, 7); [(-19.650789922697637, 29.670823439673384, -512.300814618991467), (-45.750986062113697, 89.424829383118137, 22.731626716685081), ]}
+{(1); [(149.681808898699842, -69.560221515153316), (29.114439949336784, -44.981973784352171), ]}
+{(2, 13, 1); [(-103.821930349328554, 9.864718114682931, -603.138584904996719), (-124.196015086159932, 62.415521182317825, 274.871067222638146), ]}
+{(2, 13, 2); [(143.041200686576445, -75.835448320554420, 717.413592862660039), (-70.009720105412271, 3.411495837274359, 616.398249487439216), ]}
+{(2, 13, 3); [(-61.598289426571107, 67.386897961832986, 758.787262266232688), (35.749623661823705, 69.951638325963515, 83.411681304012447), ]}
+{(2, 13, 4); [(41.622765091257861, -55.666296995940051, 314.423563957637271), (-165.187296330744402, 72.582980139185295, -119.721413860354644), ]}
+{(2, 13, 5); [(-118.933786732344970, 69.127232151800158, 265.366117504635383), (0.731751415019795, -32.056460304231528, 667.241240638668728), ]}
+{(2, 13, 6); [(-99.228047797147056, 14.201744473714218, 203.195078741524156), (-176.432519957501739, 79.028779786997703, -154.062085678639846), ]}
+{(2, 13, 7); [(88.229721832730149, 72.038561806726406, 821.728559501759150), (37.694624083332016, -73.217114480353558, -347.645370065438897), ]}
+{(2); [(-66.275326313079987, -17.660111773857061), (52.022628249768211, 13.582720543304470), ]}
+{(3, 12, 1); [(124.436150247112863, -81.691528160076047, 976.922106395031165), (146.855045145332156, 46.256553669847008, -642.932785872019849), ]}
+{(3, 12, 2); [(-174.853653719726424, 73.645074324358902, -916.594161748391343), (-139.497392955125406, 23.313791692627465, 655.470405937408600), ]}
+{(3, 12, 3); [(71.255248796512092, -73.734400890016204, -769.885117253900148), (68.209763421345045, -31.423387380538490, -375.388784214021541), ]}
+{(3, 12, 4); [(-6.775820588971461, -50.538859843709581, -834.860701015706582), (-41.729641330392241, -68.435792169961474, -983.572709529895974), ]}
+{(3, 12, 5); [(51.221373395389925, -50.935174071693581, -401.088703661065438), (61.972907176496577, -31.677130482579749, -267.935824724194902), ]}
+{(3, 12, 6); [(98.576980163486525, -77.416618818625309, -260.218528743022546), (72.456475002035660, 50.592249946112702, -575.994655497068038), ]}
+{(3, 12, 7); [(-179.493437603915453, -16.852580154113440, -599.587980511548039), (-134.229075661150745, -14.346374505872619, -892.926313462668759), ]}
+{(3); [(165.472694453095642, 7.243176242909896), (18.112616866291631, 35.866295989851054), ]}
+{(4, 11, 1); [(-87.671400031613814, 12.858706262441151, -712.533747708726992), (172.154124166334185, -38.863488964490102, -264.682021094514255), ]}
+{(4, 11, 2); [(-129.384047614336595, 58.276997003123512, -291.863359028298873), (-169.315567574947380, 40.673511990317195, 398.562329870692906), ]}
+{(4, 11, 3); [(166.685721881098402, 64.337074265355596, 175.201704576958093), (-50.591735494865667, 24.444804906377257, 536.689308441488038), ]}
+{(4, 11, 4); [(151.356231717525588, 86.418271905199603, 558.059403676007946), (122.263886413140369, -27.195533226921786, 818.860656393687691), ]}
+{(4, 11, 5); [(60.622771796628577, -50.801400011907752, 778.957509113489095), (82.897430533989819, -44.751907855465888, -940.753864567030746), ]}
+{(4, 11, 6); [(-62.667732627123854, 88.487441695174596, 231.787305534397916), (138.048266917993402, -74.972228616289939, 144.396211112136854), ]}
+{(4, 11, 7); [(37.904376517699411, -5.807287201333986, -817.703847733561588), (-10.408777966961196, 46.988492654314079, 134.633188873913269), ]}
+{(4); [(-144.411292506733787, 62.683688039308635), (-18.898632487155016, 6.684886636855388), ]}
+{(5, 10, 1); [(-72.284653034103300, -43.142672933869761, 643.120880325906114), (63.594559069466690, -0.892159512243762, -42.832984223960402), ]}
+{(5, 10, 2); [(-95.700587834242128, 53.578009338674399, 188.728215120377513), (-4.862448721917774, -32.400114757829122, -257.594550122216049), ]}
+{(5, 10, 3); [(-16.132693236097733, 11.849715779370724, 492.240797792210572), (164.715360051938774, 86.422572439550606, 331.196353159896262), ]}
+{(5, 10, 4); [(127.251380682387136, -33.886183346445591, -685.433826579208926), (155.042691436176170, -56.327045705299646, 473.747114781375842), ]}
+{(5, 10, 5); [(-45.580504239237456, -41.394981232853802, 374.279795723435768), (-102.532794287953834, -55.783574615201637, -779.885864589509083), ]}
+{(5, 10, 6); [(-85.376605968898161, 85.449706953289549, 797.101019441713788), (-158.111493612888665, 16.250392420279542, -683.673245703708403), ]}
+{(5, 10, 7); [(157.908727827374776, 64.218502564859733, -405.599320725710811), (150.226271246503359, 62.333437303128726, -662.788375223859816), ]}
+{(5); [(95.694086775679722, -5.655996012684942), (39.173551549870410, -68.113070328939969), ]}
+{(6, 9, 1); [(-147.371211947239743, -65.049168824962763, 764.500844040380912), (-38.258934722054335, -76.712638278472667, -635.131326681851078), ]}
+{(6, 9, 2); [(129.412317845892375, -68.617121595604985, -437.125494457948719), (-105.316655402342079, 80.068516293954474, 839.973604076362562), ]}
+{(6, 9, 3); [(117.001905491142139, 4.357320119584757, 604.595359987628285), (-50.091004696729470, -9.487428122417276, 393.505968482784226), ]}
+{(6, 9, 4); [(172.858653577268512, -46.982397481902339, -258.658795752392280), (-58.968618622987030, 86.742089515642036, -180.715148883055150), ]}
+{(6, 9, 5); [(-104.102921612490178, 74.910601424215812, -682.158035245527003), (-56.638961570136040, 68.357586754545494, 449.473777800551545), ]}
+{(6, 9, 6); [(167.420675137956806, 11.951025038199354, -528.985294826950621), (-68.018858864348914, 3.467420883670883, -179.206823620193546), ]}
+{(6, 9, 7); [(145.332322008775975, 59.913396057276664, 978.339917104886922), (-141.030432247982162, 89.245015216281075, 993.450596647692919), ]}
+{(6); [(106.225813374984838, -15.354350974101312), (162.440475705944777, -64.563201585861947), ]}
+{(7, 8, 1); [(128.651322453124777, -49.864493308130662, 119.050213555547899), (-29.753112311495400, 35.322063970922109, -665.423344218057991), ]}
+{(7, 8, 2); [(97.547068841330656, -85.426051803857931, -940.055633293436472), (-75.442530394492678, -13.587594384170760, 885.333428725200179), ]}
+{(7, 8, 3); [(-19.005702474230816, 64.577576762518603, 577.154229667134018), (37.039072360483097, 27.000987945543010, -517.013614995667126), ]}
+{(7, 8, 4); [(172.902740522751770, 2.989475970876025, 74.013731128940378), (-23.460601970227568, 25.541405620671881, 134.082122354894437), ]}
+{(7, 8, 5); [(-92.133890299876441, 38.370960439627495, 719.964168066951061), (-118.982805429407165, -24.778047530882223, -905.949539406284998), ]}
+{(7, 8, 6); [(18.878961777693217, 42.660064137575077, -333.742181155090691), (-133.305168199304859, -20.854327650793287, 879.367146163586995), ]}
+{(7, 8, 7); [(-15.188042386987528, -0.756051192202890, -688.297359799521132), (-80.548968037455822, 86.949077532596576, 745.863082352914716), ]}
+{(7); [(-91.794220113760929, 41.681522484079451), (-139.096931242954696, 78.328906900237868), ]}
+{(8, 7, 1); [(-89.139280419448724, -20.414106976611190, -713.981716692297482), (161.607705817336267, -62.950260955909883, -472.053403299977788), ]}
+{(8, 7, 2); [(-72.391130216584614, 75.844741536016315, 593.547143820526003), (53.992365204543411, -52.668221225499138, 71.938582611965245), ]}
+{(8, 7, 3); [(-26.448574186099112, -48.938803453475629, 170.612429360267527), (93.072003794029257, 55.484355313717813, 667.976624272707568), ]}
+{(8, 7, 4); [(114.626329310321523, 66.435589560659537, -860.515886164161770), (-153.329184943944824, -88.829935899967580, -13.796511315491189), ]}
+{(8, 7, 5); [(56.123883691847098, -62.660666015682636, 476.085172366256018), (-106.094184683698003, -6.997272374685162, 90.583369576555398), ]}
+{(8, 7, 6); [(133.447773146652167, -40.709803213511258, -241.707502349346669), (-118.205646746202689, -71.518740650368727, -51.963188616761670), ]}
+{(8, 7, 7); [(1.245825072460562, -59.507198607254175, -104.830665698562242), (172.637697299886781, 82.099867023172436, 938.328041387094231), ]}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/HERE.FlexiblePolyline.sln
^
|
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29911.84
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HERE.FlexiblePolyline", "src\HERE.FlexiblePolyline.csproj", "{43B7F4E7-7D7D-4FE9-A6AB-ACF6F4760975}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FlexiblePolylineEncoder.Tests", "test\FlexiblePolylineEncoder.Tests\FlexiblePolylineEncoder.Tests.csproj", "{58A3B4E0-A356-493F-AAD1-0BB7C8FE4D5C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {43B7F4E7-7D7D-4FE9-A6AB-ACF6F4760975}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {43B7F4E7-7D7D-4FE9-A6AB-ACF6F4760975}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43B7F4E7-7D7D-4FE9-A6AB-ACF6F4760975}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {43B7F4E7-7D7D-4FE9-A6AB-ACF6F4760975}.Release|Any CPU.Build.0 = Release|Any CPU
+ {58A3B4E0-A356-493F-AAD1-0BB7C8FE4D5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {58A3B4E0-A356-493F-AAD1-0BB7C8FE4D5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {58A3B4E0-A356-493F-AAD1-0BB7C8FE4D5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {58A3B4E0-A356-493F-AAD1-0BB7C8FE4D5C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {CBF7FB00-A4E8-4249-A71C-41043293767D}
+ EndGlobalSection
+EndGlobal
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/src/HERE.FlexiblePolyline.csproj
^
|
@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>netstandard2.0</TargetFramework>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.Bcl.HashCode" Version="1.1.1" />
+ </ItemGroup>
+
+</Project>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/src/LatLngZ.cs
^
|
@@ -0,0 +1,49 @@
+using System;
+
+namespace HERE.FlexiblePolyline
+{
+ /// <summary>
+ /// Coordinate triple
+ /// </summary>
+ public class LatLngZ
+ {
+ public double Lat { get; }
+ public double Lng { get; }
+ public double Z { get; }
+
+ public LatLngZ(double latitude, double longitude, double thirdDimension = 0)
+ {
+ Lat = latitude;
+ Lng = longitude;
+ Z = thirdDimension;
+ }
+
+ public override string ToString()
+ {
+ return "LatLngZ [lat=" + Lat + ", lng=" + Lng + ", z=" + Z + "]";
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+
+ if (obj is LatLngZ latLngZ)
+ {
+ if (latLngZ.Lat == Lat && latLngZ.Lng == Lng && latLngZ.Z == Z)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Lat, Lng, Z);
+ }
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/src/PolylineEncoderDecoder.cs
^
|
@@ -0,0 +1,410 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HERE.FlexiblePolyline
+{
+ public class PolylineEncoderDecoder
+ {
+ /// <summary>Header version
+ /// A change in the version may affect the logic to encode and decode the rest of the header and data
+ /// </summary>
+ private static readonly byte FORMAT_VERSION = 1;
+
+ // Base64 URL-safe characters
+ private static readonly char[] ENCODING_TABLE =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".ToCharArray();
+
+ private static readonly int[] DECODING_TABLE =
+ {
+ 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
+ };
+
+ /// <summary>
+ /// Encode the list of coordinate triples.
+ /// The third dimension value will be eligible for encoding only when ThirdDimension is other than ABSENT.
+ /// This is lossy compression based on precision accuracy.
+ /// </summary>
+ /// <param name="coordinates">coordinates {@link List} of coordinate triples that to be encoded.</param>
+ /// <param name="precision">Floating point precision of the coordinate to be encoded.</param>
+ /// <param name="thirdDimension">{@link ThirdDimension} which may be a level, altitude, elevation or some other custom value</param>
+ /// <param name="thirdDimPrecision">Floating point precision for thirdDimension value</param>
+ /// <returns>URL-safe encoded {@link String} for the given coordinates.</returns>
+ public static string Encode(List<LatLngZ> coordinates, int precision, ThirdDimension thirdDimension, int thirdDimPrecision)
+ {
+ if (coordinates == null || coordinates.Count == 0)
+ {
+ throw new ArgumentException("Invalid coordinates!");
+ }
+
+ if (!Enum.IsDefined(typeof(ThirdDimension), thirdDimension))
+ {
+ throw new ArgumentException("Invalid thirdDimension");
+ //thirdDimension = ThirdDimension.Absent;
+ }
+
+ Encoder enc = new Encoder(precision, thirdDimension, thirdDimPrecision);
+ foreach (var coordinate in coordinates)
+ {
+ enc.Add(coordinate);
+ }
+
+ return enc.GetEncoded();
+ }
+
+ /// <summary>
+ /// Decode the encoded input {@link String} to {@link List} of coordinate triples.
+ /// @see PolylineDecoder#getThirdDimension(String) getThirdDimension
+ /// @see LatLngZ
+ /// </summary>
+ /// <param name="encoded">encoded URL-safe encoded {@link String}</param>
+ /// <returns>{@link List} of coordinate triples that are decoded from input</returns>
+ public static List<LatLngZ> Decode(string encoded)
+ {
+ if (string.IsNullOrEmpty(encoded?.Trim()))
+ {
+ throw new ArgumentException("Invalid argument!", nameof(encoded));
+ }
+
+ List<LatLngZ> result = new List<LatLngZ>();
+ Decoder dec = new Decoder(encoded);
+
+ double lat = 0;
+ double lng = 0;
+ double z = 0;
+
+ while (dec.DecodeOne(ref lat, ref lng, ref z))
+ {
+ result.Add(new LatLngZ(lat, lng, z));
+ lat = 0;
+ lng = 0;
+ z = 0;
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// ThirdDimension type from the encoded input {@link String}
+ /// </summary>
+ /// <param name="encoded">URL-safe encoded coordinate triples {@link String}</param>
+ public static ThirdDimension GetThirdDimension(string encoded)
+ {
+ int index = 0;
+ long header = 0;
+ Decoder.DecodeHeaderFromString(encoded.ToCharArray(), ref index, ref header);
+ return (ThirdDimension)((header >> 4) & 0b_111);
+ }
+
+ public byte GetVersion()
+ {
+ return FORMAT_VERSION;
+ }
+
+ /// <summary>
+ /// Internal class for configuration, validation and encoding for an input request.
+ /// </summary>
+ private class Encoder
+ {
+ private readonly StringBuilder _result;
+ private readonly Converter _latConverter;
+ private readonly Converter _lngConverter;
+ private readonly Converter _zConverter;
+ private readonly ThirdDimension _thirdDimension;
+
+ public Encoder(int precision, ThirdDimension thirdDimension, int thirdDimPrecision)
+ {
+ _latConverter = new Converter(precision);
+ _lngConverter = new Converter(precision);
+ _zConverter = new Converter(thirdDimPrecision);
+ _thirdDimension = thirdDimension;
+ _result = new StringBuilder();
+ EncodeHeader(precision, (int)_thirdDimension, thirdDimPrecision);
+ }
+
+ private void EncodeHeader(int precision, int thirdDimensionValue, int thirdDimPrecision)
+ {
+ // Encode the `precision`, `third_dim` and `third_dim_precision` into one encoded char
+ if (precision < 0 || precision > 15)
+ {
+ throw new ArgumentException("precision out of range");
+ }
+
+ if (thirdDimPrecision < 0 || thirdDimPrecision > 15)
+ {
+ throw new ArgumentException("thirdDimPrecision out of range");
+ }
+
+ if (thirdDimensionValue < 0 || thirdDimensionValue > 7)
+ {
+ throw new ArgumentException("thirdDimensionValue out of range");
+ }
+
+ long res = (thirdDimPrecision << 7) | (thirdDimensionValue << 4) | precision;
+ Converter.EncodeUnsignedVarint(PolylineEncoderDecoder.FORMAT_VERSION, _result);
+ Converter.EncodeUnsignedVarint(res, _result);
+ }
+
+ private void Add(double lat, double lng)
+ {
+ _latConverter.EncodeValue(lat, _result);
+ _lngConverter.EncodeValue(lng, _result);
+ }
+
+ private void Add(double lat, double lng, double z)
+ {
+ Add(lat, lng);
+ if (_thirdDimension != ThirdDimension.Absent)
+ {
+ _zConverter.EncodeValue(z, _result);
+ }
+ }
+
+ public void Add(LatLngZ tuple)
+ {
+ if (tuple == null)
+ {
+ throw new ArgumentNullException(nameof(tuple), "Invalid LatLngZ tuple");
+ }
+
+ Add(tuple.Lat, tuple.Lng, tuple.Z);
+ }
+
+ public string GetEncoded()
+ {
+ return _result.ToString();
+ }
+ }
+
+ /// <summary>
+ /// Single instance for decoding an input request.
+ /// </summary>
+ private class Decoder
+ {
+ private readonly char[] _encoded;
+ private int _index;
+ private readonly Converter _latConverter;
+ private readonly Converter _lngConverter;
+ private readonly Converter _zConverter;
+
+ private int _precision;
+ private int _thirdDimPrecision;
+ private ThirdDimension _thirdDimension;
+
+
+ public Decoder(string encoded)
+ {
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/src/ThirdDimension.cs
^
|
@@ -0,0 +1,19 @@
+namespace HERE.FlexiblePolyline
+{
+ /// <summary>
+ /// 3rd dimension specification.
+ /// Example a level, altitude, elevation or some other custom value.
+ /// ABSENT is default when there is no third dimension en/decoding required.
+ /// </summary>
+ public enum ThirdDimension
+ {
+ Absent = 0,
+ Level = 1,
+ Altitude = 2,
+ Elevation = 3,
+ Reserved1 = 4,
+ Reserved2 = 5,
+ Custom1 = 6,
+ Custom2 = 7
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/test/FlexiblePolylineEncoder.Tests/FlexiblePolylineEncoder.Tests.csproj
^
|
@@ -0,0 +1,28 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>netcoreapp3.1</TargetFramework>
+
+ <IsPackable>false</IsPackable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="nunit" Version="3.12.0" />
+ <PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\..\src\HERE.FlexiblePolyline.csproj" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <None Update="decoded.txt">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Update="encoded.txt">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
+
+</Project>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/dotnet/test/FlexiblePolylineEncoder.Tests/FlexiblePolylineEncoderTests.cs
^
|
@@ -0,0 +1,339 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using HERE.FlexiblePolyline;
+using NUnit.Framework;
+
+namespace FlexiblePolylineEncoder.Tests
+{
+ public class FlexiblePolylineEncoderTests
+ {
+ [Test]
+ public void EncodedFlexilineMatchesDecodedResultTest()
+ {
+ using (var decodedEnumerator = File.ReadLines("../../../../../../test/round_half_up/decoded.txt").GetEnumerator())
+ {
+ foreach (var flexiline in File.ReadLines("../../../../../../test/round_half_up/encoded.txt"))
+ {
+ decodedEnumerator.MoveNext();
+ var testResultStr = decodedEnumerator.Current;
+
+ var expectedResult = ParseExpectedTestResult(testResultStr);
+
+ var decoded = PolylineEncoderDecoder.Decode(flexiline);
+ var encoded = PolylineEncoderDecoder.Encode(
+ decoded,
+ expectedResult.Precision.Precision2d,
+ expectedResult.Precision.Type3d,
+ expectedResult.Precision.Precision3d);
+
+ ThirdDimension thirdDimension = PolylineEncoderDecoder.GetThirdDimension(encoded);
+ Assert.AreEqual(expectedResult.Precision.Type3d, thirdDimension);
+
+ for (int i = 0; i < decoded.Count; i++)
+ {
+ AssertEqualWithPrecision(
+ expectedResult.Coordinates[i].Lat,
+ decoded[i].Lat,
+ expectedResult.Precision.Precision2d);
+
+ AssertEqualWithPrecision(
+ expectedResult.Coordinates[i].Lng,
+ decoded[i].Lng,
+ expectedResult.Precision.Precision2d);
+
+ AssertEqualWithPrecision(
+ expectedResult.Coordinates[i].Z,
+ decoded[i].Z,
+ expectedResult.Precision.Precision3d);
+ }
+
+ if (flexiline != encoded)
+ {
+ Console.WriteLine($@"WARNING expected {flexiline} but got {encoded}");
+ }
+ }
+ }
+ }
+
+ private void AssertEqualWithPrecision(double expected, double actual, int precision)
+ {
+ long expectedLong = (long)(Math.Round(expected * (int)Math.Pow(10, precision), MidpointRounding.AwayFromZero));
+ long actualLong = (long)(Math.Round(actual * (int)Math.Pow(10, precision), MidpointRounding.AwayFromZero));
+
+ Assert.AreEqual(expectedLong, actualLong);
+ }
+
+ [Test]
+ public void TestInvalidCoordinates()
+ {
+
+ //Null coordinates
+ Assert.Throws<ArgumentException>(() =>
+ {
+ PolylineEncoderDecoder.Encode(null, 5, ThirdDimension.Absent, 0);
+ });
+
+
+ //Empty coordinates list test
+ Assert.Throws<ArgumentException>(() =>
+ {
+ PolylineEncoderDecoder.Encode(new List<LatLngZ>(), 5, ThirdDimension.Absent, 0);
+ });
+ }
+
+ [Test]
+ public void TestInvalidThirdDimension()
+ {
+
+ var pairs = new List<LatLngZ>();
+ pairs.Add(new LatLngZ(50.1022829, 8.6982122));
+ ThirdDimension invalid = (ThirdDimension)999;
+ Assert.Throws<ArgumentException>(() =>
+ {
+ PolylineEncoderDecoder.Encode(pairs, 5, invalid, 0);
+ });
+ }
+
+ [Test]
+ public void TestConvertValue()
+ {
+ PolylineEncoderDecoder.Converter conv = new PolylineEncoderDecoder.Converter(5);
+ StringBuilder result = new StringBuilder();
+ conv.EncodeValue(-179.98321, result);
+ Assert.AreEqual(result.ToString(), "h_wqiB");
+ }
+
+ [Test]
+ public void TestSimpleLatLngEncoding()
+ {
+ var pairs = new List<LatLngZ>();
+ pairs.Add(new LatLngZ(50.1022829, 8.6982122));
+ pairs.Add(new LatLngZ(50.1020076, 8.6956695));
+ pairs.Add(new LatLngZ(50.1006313, 8.6914960));
+ pairs.Add(new LatLngZ(50.0987800, 8.6875156));
+
+ var expected = "BFoz5xJ67i1B1B7PzIhaxL7Y";
+ var computed = PolylineEncoderDecoder.Encode(pairs, 5, ThirdDimension.Absent, 0);
+ Assert.AreEqual(computed, expected);
+ }
+
+ [Test]
+ public void TestComplexLatLngEncoding()
+ {
+
+ var pairs = new List<LatLngZ>();
+ pairs.Add(new LatLngZ(52.5199356, 13.3866272));
+ pairs.Add(new LatLngZ(52.5100899, 13.2816896));
+ pairs.Add(new LatLngZ(52.4351807, 13.1935196));
+ pairs.Add(new LatLngZ(52.4107285, 13.1964502));
+ pairs.Add(new LatLngZ(52.38871, 13.1557798));
+ pairs.Add(new LatLngZ(52.3727798, 13.1491003));
+ pairs.Add(new LatLngZ(52.3737488, 13.1154604));
+ pairs.Add(new LatLngZ(52.3875198, 13.0872202));
+ pairs.Add(new LatLngZ(52.4029388, 13.0706196));
+ pairs.Add(new LatLngZ(52.4105797, 13.0755529));
+
+ var expected = "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e";
+ var computed = PolylineEncoderDecoder.Encode(pairs, 5, ThirdDimension.Absent, 0);
+ Assert.AreEqual(computed, expected);
+ }
+
+ [Test]
+ public void TestLatLngZEncode()
+ {
+
+ var tuples = new List<LatLngZ>();
+ tuples.Add(new LatLngZ(50.1022829, 8.6982122, 10));
+ tuples.Add(new LatLngZ(50.1020076, 8.6956695, 20));
+ tuples.Add(new LatLngZ(50.1006313, 8.6914960, 30));
+ tuples.Add(new LatLngZ(50.0987800, 8.6875156, 40));
+
+ var expected = "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU";
+ var computed = PolylineEncoderDecoder.Encode(tuples, 5, ThirdDimension.Altitude, 0);
+ Assert.AreEqual(computed, expected);
+ }
+ /**********************************************/
+ /********** Decoder test starts ***************/
+ /**********************************************/
+ [Test]
+ public void TestInvalidEncoderInput()
+ {
+ //Null coordinates
+ Assert.Throws<ArgumentException>(() =>
+ {
+ PolylineEncoderDecoder.Decode(null);
+ });
+
+
+ //Empty coordinates list test
+ Assert.Throws<ArgumentException>(() =>
+ {
+ PolylineEncoderDecoder.Decode(string.Empty);
+ });
+ }
+ [Test]
+ public void TestThirdDimension()
+ {
+ Assert.IsTrue(PolylineEncoderDecoder.GetThirdDimension("BFoz5xJ67i1BU") == ThirdDimension.Absent);
+ Assert.IsTrue(PolylineEncoderDecoder.GetThirdDimension("BVoz5xJ67i1BU") == ThirdDimension.Level);
+ Assert.IsTrue(PolylineEncoderDecoder.GetThirdDimension("BlBoz5xJ67i1BU") == ThirdDimension.Altitude);
+ Assert.IsTrue(PolylineEncoderDecoder.GetThirdDimension("B1Boz5xJ67i1BU") == ThirdDimension.Elevation);
+ }
+
+ [Test]
+ public void TestDecodeConvertValue()
+ {
+ var encoded = "h_wqiB";
+ var expected = -179.98321;
+ var index = 0;
+ var computed = 0d;
+ var conv = new PolylineEncoderDecoder.Converter(5);
+ conv.DecodeValue(encoded.ToCharArray(), ref index, ref computed);
+ Assert.AreEqual(computed, expected);
+ }
+
+ [Test]
+ public void TestSimpleLatLngDecoding()
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/golang/flexpolyline/data.go
^
|
@@ -0,0 +1,144 @@
+// Copyright (C) 2019 HERE Europe B.V.
+// Licensed under MIT, see full license in LICENSE
+// SPDX-License-Identifier: MIT
+// License-Filename: LICENSE
+
+// Package flexpolyline contains tools to encode and decode FlexPolylines
+// This file defines data structures to store FlexPolylines
+
+package flexpolyline
+
+import (
+ "fmt"
+ "math"
+)
+
+// FlexPolyline specification version
+const FormatVersion uint = 1
+
+// Number of decimal digits after the comma
+type Precision uint8
+
+func (p Precision) factor() float64 {
+ return math.Pow10(int(p))
+}
+
+// Whether the third dimension is present and what meaning it has
+type Type3D uint8
+
+const (
+ Absent Type3D = iota
+ Level
+ Altitude
+ Elevation
+ Reserved1
+ Reserved2
+ Custom1
+ Custom2
+)
+
+// A point on the Earth surface with an optional third dimension
+type Point struct {
+ Lat float64
+ Lng float64
+ ThirdDim float64
+}
+
+// Structure to store FlexPolyline
+type Polyline struct {
+ coordinates []Point
+ precision2D Precision
+ precision3D Precision
+ type3D Type3D
+}
+
+func (p* Polyline) Coordinates() []Point {
+ return p.coordinates
+}
+
+func (p* Polyline) Precision2D() Precision {
+ return p.precision2D
+}
+
+func (p* Polyline) Precision3D() Precision {
+ return p.precision3D
+}
+
+func (p* Polyline) Type3D() Type3D {
+ return p.type3D
+}
+
+// Creates a two dimensional FlexPolyline
+func CreatePolyline(precision Precision, points []Point) (*Polyline, error) {
+ err := checkArgs(Absent, precision, 0)
+ if err != nil {
+ return nil, err
+ }
+ return &Polyline{
+ coordinates: points,
+ precision2D: precision,
+ }, nil
+}
+
+// Creates a two dimensional FlexPolyline. Panics if arguments are bad.
+func MustCreatePolyline(precision Precision, points []Point) *Polyline {
+ p, err := CreatePolyline(precision, points)
+ if err != nil {
+ panic(err)
+ }
+ return p
+}
+
+// Creates a three dimensional FlexPolyline
+func CreatePolyline3D(type3D Type3D, precision2D, precision3D Precision, points []Point) (*Polyline, error) {
+ err := checkArgs(type3D, precision2D, precision3D)
+ if err != nil {
+ return nil, err
+ }
+ return &Polyline{
+ coordinates: points,
+ precision2D: precision2D,
+ precision3D: precision3D,
+ type3D: type3D,
+ }, nil
+}
+
+// Creates a three dimensional FlexPolyline. Panics if arguments are bad.
+func MustCreatePolyline3D(type3D Type3D, precision2D, precision3D Precision, points []Point) *Polyline {
+ p, err := CreatePolyline3D(type3D, precision2D, precision3D, points)
+ if err != nil {
+ panic(err)
+ }
+ return p
+}
+
+// Encodes a Polyline to a string
+func (p *Polyline) Encode() (string, error) {
+ return Encode(p)
+}
+
+func circaCharsPerPoint(header *Polyline) int {
+ const assumedMaxThirdDimValue = 10000.
+ circaNumChars := 2.*math.Log(360.*header.Precision2D().factor())/math.Log(64)
+ if header.Type3D() != Absent {
+ circaNumChars += math.Log(assumedMaxThirdDimValue*header.Precision3D().factor())/math.Log(64)
+ }
+ return int(math.Ceil(circaNumChars))
+}
+
+
+func checkArgs(type3D Type3D, precision2D, precision3D Precision) error {
+ if precision2D > 15 {
+ return fmt.Errorf("Precision2D %d > max Precision2D (15)", precision2D)
+ }
+ if type3D > Custom2 {
+ return fmt.Errorf("Type3D %d > max Type3D (7)", type3D)
+ }
+ if type3D == Reserved1 || type3D == Reserved2 {
+ return fmt.Errorf("Type3D %d reserved for future use", type3D)
+ }
+ if precision3D > 15 {
+ return fmt.Errorf("Precision3D %d > max Precision3D (15)", precision3D)
+ }
+ return nil
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/golang/flexpolyline/data_test.go
^
|
@@ -0,0 +1,60 @@
+// Copyright (C) 2019 HERE Europe B.V.
+// Licensed under MIT, see full license in LICENSE
+// SPDX-License-Identifier: MIT
+// License-Filename: LICENSE
+
+package flexpolyline
+
+import "testing"
+
+func TestPrecisionIsChecked(t *testing.T) {
+ for i := 0; i <= 15; i++ {
+ _, err := CreatePolyline(Precision(i), emptyPolyline)
+ if err != nil {
+ t.Error("Precision2D in allowed range, but returns an error")
+ }
+ }
+ _, err := CreatePolyline(16, emptyPolyline)
+ if err == nil {
+ t.Error("Precision2D too high, but does not return an error")
+ }
+}
+
+func TestThirdDimensionFlagIsChecked(t *testing.T) {
+ for i := 0; i <= 3; i++ {
+ _, err := CreatePolyline3D(Type3D(i), 5, 5, emptyPolyline)
+ if err != nil {
+ t.Error("Third dimension flag in allowed range, but returns an error")
+ }
+ }
+ for i := 4; i <= 5; i++ {
+ _, err := CreatePolyline3D(Type3D(i), 5, 5, emptyPolyline)
+ if err == nil {
+ t.Error("Third dimension flag has reserved value, but does not return an error")
+ }
+ }
+ for i := 6; i <= 7; i++ {
+ _, err := CreatePolyline3D(Type3D(i), 5, 5, emptyPolyline)
+ if err != nil {
+ t.Error("Third dimension flag in allowed range, but returns an error")
+ }
+ }
+ _, err := CreatePolyline3D(8, 5, 5, emptyPolyline)
+ if err == nil {
+ t.Error("Third dimension flag too big, but does not return an error")
+ }
+}
+
+func TestThirdDimensionPrecisionIsChecked(t *testing.T) {
+ for i := 0; i <= 15; i++ {
+ _, err := CreatePolyline3D(0, 5, Precision(i), emptyPolyline)
+ if err != nil {
+ t.Error("Third dimension precision in allowed range, but returns an error")
+ }
+ }
+ _, err := CreatePolyline3D(0, 5, 16, emptyPolyline)
+ if err == nil {
+ t.Error("Third dimension precision too high, but does not return an error")
+ }
+}
+
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/golang/flexpolyline/decode.go
^
|
@@ -0,0 +1,145 @@
+// Copyright (C) 2019 HERE Europe B.V.
+// Licensed under MIT, see full license in LICENSE
+// SPDX-License-Identifier: MIT
+// License-Filename: LICENSE
+
+// Package flexpolyline contains tools to encode and decode FlexPolylines
+// This file defines the Decode() function
+
+package flexpolyline
+
+import (
+ "fmt"
+)
+
+// Decodes a Polyline from a string following the format specified in
+// https://github.com/heremaps/flexible-polyline/blob/master/README.md
+func Decode(polyline string) (*Polyline, error) {
+ header, body, err := decodeHeader(polyline)
+ if err != nil {
+ return nil, err
+ }
+ multiplierDegree := header.Precision2D().factor()
+ multiplierZ := header.Precision3D().factor()
+ var lastLat, lastLng, lastZ float64
+ circaNumChars := len(body)/circaCharsPerPoint(header) + 1
+ result := make([]Point, 0, circaNumChars)
+ for line := body; len(line) > 0; {
+ nextIntValue, polylineTail, err := decodeValueAndAdvance(line)
+ if err != nil {
+ return nil, err
+ }
+
+ deltaLat := float64(toSigned(nextIntValue)) / multiplierDegree
+ lastLat += deltaLat
+
+ nextIntValue, polylineTail, err = decodeValueAndAdvance(polylineTail)
+ if err != nil {
+ return nil, err
+ }
+ deltaLng := float64(toSigned(nextIntValue)) / multiplierDegree
+ lastLng += deltaLng
+ nextPoint := Point{Lat: lastLat, Lng: lastLng}
+ if header.Type3D() != Absent {
+ nextIntValue, polylineTail, err = decodeValueAndAdvance(polylineTail)
+ if err != nil {
+ return nil, err
+ }
+ deltaZ := float64(toSigned(nextIntValue)) / multiplierZ
+ lastZ += deltaZ
+ nextPoint.ThirdDim = lastZ
+ }
+ result = append(result, nextPoint)
+
+ line = polylineTail
+ }
+
+ if header.Type3D() != Absent {
+ return MustCreatePolyline3D(header.Type3D(), header.Precision2D(), header.Precision3D(), result), nil
+ } else {
+ return MustCreatePolyline(header.Precision2D(), result), nil
+ }
+}
+
+// Returns the type of the third dimension data, parsing only the header
+func GetThirdDimension(polyline string) (Type3D, error) {
+ header, _, err := decodeHeader(polyline)
+ if err != nil {
+ return 0, err
+ }
+ if header == nil {
+ return 0, fmt.Errorf("received nil header")
+ }
+ return header.Type3D(), nil
+}
+
+var decodingTable = [...]int8 {
+ 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51}
+
+func decodeChar(char byte) (int8, error) {
+ charValue := uint8(char)
+ value := decodingTable[charValue-45]
+ if value < 0 {
+ return 0, fmt.Errorf("invalid encoding")
+ }
+ return value, nil
+}
+
+func toSigned(value int64) int64 {
+ if value & 1 != 0 {
+ value = ^value
+ }
+ value >>= 1
+ return value
+}
+
+func decodeHeader(polyline string) (*Polyline, string, error) {
+ version, err := decodeChar(polyline[0])
+ if err != nil {
+ return nil, "", err
+ }
+ if uint(version) != FormatVersion {
+ return nil, "", fmt.Errorf("Invalid format version %d, can only handle %d", version, FormatVersion)
+ }
+ headerContent, body, err := decodeValueAndAdvance(polyline[1:])
+ if err != nil {
+ return nil, "", err
+ }
+
+ precision2D := Precision(headerContent & 15)
+ headerContent >>= 4
+ type3D := Type3D(headerContent & 7)
+ precision3D := Precision(headerContent >> 3)
+
+ return &Polyline{
+ coordinates: nil,
+ precision2D: precision2D,
+ precision3D: precision3D,
+ type3D: type3D,
+ }, body, nil
+}
+
+func decodeValueAndAdvance(polyline string) (int64, string, error) {
+ var (
+ result int64
+ shift uint8
+ )
+ for i := 0; i < len(polyline); i++ {
+ char := polyline[i]
+ value, err := decodeChar(char)
+ if err != nil {
+ return 0, "", err
+ }
+ orValue := int64(value & 0x1F) << shift
+ result |= orValue
+ if (value & 0x20) == 0 {
+ return result, polyline[i+1:], nil
+ } else {
+ shift += 5
+ }
+ }
+ return result, "", nil
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/golang/flexpolyline/decode_test.go
^
|
@@ -0,0 +1,116 @@
+// Copyright (C) 2019 HERE Europe B.V.
+// Licensed under MIT, see full license in LICENSE
+// SPDX-License-Identifier: MIT
+// License-Filename: LICENSE
+
+package flexpolyline
+
+import (
+ "math"
+ "testing"
+)
+
+const testDataPrecision = 7
+var testData2D = []Point{
+ {Lat: 50.10228, Lng: 8.69821},
+ {Lat: 50.10201, Lng: 8.69567},
+ {Lat: 50.10063, Lng: 8.69150},
+ {Lat: 50.09878, Lng: 8.68752},
+}
+var testData3D = []Point {
+ {Lat: 50.10228, Lng: 8.69821, ThirdDim: 10},
+ {Lat: 50.10201, Lng: 8.69567, ThirdDim: 20},
+ {Lat: 50.10063, Lng: 8.69150, ThirdDim: 30},
+ {Lat: 50.09878, Lng: 8.68752, ThirdDim: 40},
+}
+
+func arePointsEqualToPrecision(actual, expected []Point, precision Precision) bool {
+ if len(actual) != len(expected) {return false}
+ precisionMultiplier := precision.factor()
+ for i := 0; i < len(actual); i++ {
+ roundedLatActual := int64(math.Round(actual[i].Lat * precisionMultiplier))
+ roundedLatExpected := int64(math.Round(expected[i].Lat * precisionMultiplier))
+ roundedLngActual := int64(math.Round(actual[i].Lng * precisionMultiplier))
+ roundedLngExpected := int64(math.Round(expected[i].Lng * precisionMultiplier))
+ rounded3rdActual := int64(math.Round(actual[i].ThirdDim * precisionMultiplier))
+ rounded3rdExpected := int64(math.Round(expected[i].ThirdDim * precisionMultiplier))
+ if roundedLatActual != roundedLatExpected || roundedLngActual != roundedLngExpected || rounded3rdActual != rounded3rdExpected{
+ return false
+ }
+ }
+ return true
+}
+
+func TestDecodeStaticHeader(t *testing.T) {
+ polyline := "BFoz5xJ67i1B1B7PzIhaxL7Y"
+ result, _, err := decodeHeader(polyline)
+ if err != nil {
+ t.Errorf("Decode returned error %s", err)
+ }
+ if result.Precision2D() != 5 || result.Type3D() != 0 || result.Precision3D() != 0 {
+ t.Errorf("Decode returned unexpected header %v", result)
+ }
+}
+
+func TestDecodeStaticHeaderWithAltitude(t *testing.T) {
+ polyline := "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU"
+ result, _, err := decodeHeader(polyline)
+ if err != nil {
+ t.Errorf("Decode returned error %s", err)
+ }
+ if result.Type3D() != Altitude || result.Precision3D() != 0 {
+ t.Errorf("Decode returned unexpected header %v", result)
+ }
+}
+
+func TestDecodeValue(t *testing.T) {
+ polyline := "BFoz5xJ67i1B1B7PzIhaxL7Y"
+ result, err := Decode(polyline)
+ if err != nil {
+ t.Errorf("Decode returned error %s", err)
+ }
+ if !arePointsEqualToPrecision(result.Coordinates(), testData2D, testDataPrecision) {
+ t.Errorf("Expected: %v, got: %v", testData2D, result)
+ }
+}
+
+func TestDecodeValueWithAltitude(t *testing.T) {
+ polyline := "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU"
+ result, err := Decode(polyline)
+ if err != nil {
+ t.Errorf("Decode returned error %s", err)
+ }
+ if !arePointsEqualToPrecision(result.Coordinates(), testData3D, 7) {
+ t.Errorf("Expected: %v, got: %v", testData3D, result)
+ }
+}
+
+func TestDecodeValueEncodedWithDifferent3rdDimPrecisions(t *testing.T) {
+ for i := 0.; i <= 15.; i++ {
+ toEncode := MustCreatePolyline3D(Altitude, 5, Precision(i), testData3D)
+ polyline, _ := Encode(toEncode)
+ result, err := Decode(polyline)
+ if err != nil {
+ t.Errorf("Decode returned error %s", err)
+ }
+ comparisonPrecision := Precision(math.Min(i, testDataPrecision))
+ if !arePointsEqualToPrecision(result.Coordinates(), testData3D, comparisonPrecision) {
+ t.Errorf("Precision2D: %f, Expected: %v, got: %v", i, testData3D, result)
+ }
+ }
+}
+
+func TestThirdDimensionFlagWithDifferentValues(t *testing.T) {
+ flags := []Type3D{Absent, Level, Altitude, Elevation, Custom1, Custom2}
+ for i := 0; i < len(flags); i++ {
+ toEncode := MustCreatePolyline3D(flags[i], 5, 0, []Point{{Lat: 0, Lng: 0}})
+ polyline, _ := Encode(toEncode)
+ thirdDimensionFlag, err := GetThirdDimension(polyline)
+ if err != nil {
+ t.Errorf("GetThirdDimension returned error %s", err)
+ }
+ if thirdDimensionFlag != flags[i] {
+ t.Errorf("%d Expected: %d, got: %d", i, flags[i], thirdDimensionFlag)
+ }
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/golang/flexpolyline/encode.go
^
|
@@ -0,0 +1,71 @@
+// Copyright (C) 2019 HERE Europe B.V.
+// Licensed under MIT, see full license in LICENSE
+// SPDX-License-Identifier: MIT
+// License-Filename: LICENSE
+
+// Package flexpolyline contains tools to encode and decode FlexPolyline
+// This file defines the Encode() function
+
+package flexpolyline
+
+import (
+ "math"
+ "strings"
+)
+
+// Encodes a Polyline to a string following the format specified in
+// https://github.com/heremaps/flexible-polyline/blob/master/README.md
+func Encode(polyline *Polyline) (string, error) {
+ multiplierDegree := polyline.Precision2D().factor()
+ multiplierZ := polyline.Precision3D().factor()
+
+ var lastLat, lastLng, lastZ int64
+ var builder strings.Builder
+ builder.Grow(circaCharsPerPoint(polyline)*len(polyline.Coordinates())+4)
+ encodeHeader(polyline, &builder)
+
+ for i := 0; i < len(polyline.Coordinates()); i++ {
+ location := polyline.Coordinates()[i]
+ lat := int64(math.Round(location.Lat * multiplierDegree))
+ encodeScaledValue(lat - lastLat, &builder)
+ lastLat = lat
+
+ lng := int64(math.Round(location.Lng * multiplierDegree))
+ encodeScaledValue(lng - lastLng, &builder)
+ lastLng = lng
+
+ if polyline.Type3D() != Absent {
+ z := int64(math.Round(location.ThirdDim * multiplierZ))
+ encodeScaledValue(z - lastZ, &builder)
+ lastZ = z
+ }
+
+ }
+ return builder.String(), nil
+}
+
+const encodingTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
+
+func encodeUint(value uint64, builder *strings.Builder) {
+ for ; value > 0x1F; {
+ pos := (value & 0x1F) | 0x20
+ builder.WriteString(string(encodingTable[pos]))
+ value >>= 5
+ }
+ builder.WriteString(string(encodingTable[value]))
+}
+
+func encodeScaledValue(value int64, builder* strings.Builder) {
+ uintValue := uint64(value)
+ uintValue <<= 1
+ if value < 0 {
+ uintValue = ^uintValue
+ }
+ encodeUint(uintValue, builder)
+}
+
+func encodeHeader(polyline *Polyline, builder *strings.Builder) {
+ headerContent := (uint64(polyline.Precision3D()) << 7) | (uint64(polyline.Type3D()) << 4) | uint64(polyline.Precision2D())
+ encodeUint(uint64(FormatVersion), builder)
+ encodeUint(headerContent, builder)
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/golang/flexpolyline/encode_test.go
^
|
@@ -0,0 +1,109 @@
+// Copyright (C) 2019 HERE Europe B.V.
+// Licensed under MIT, see full license in LICENSE
+// SPDX-License-Identifier: MIT
+// License-Filename: LICENSE
+
+package flexpolyline
+
+import (
+ "math/rand"
+ "testing"
+)
+
+
+var emptyPolyline = []Point{{Lat: 0, Lng: 0}}
+
+var toEncode2D = []Point{
+ {Lat: 50.1022829, Lng: 8.6982122},
+ {Lat: 50.1020076, Lng: 8.6956695},
+ {Lat: 50.1006313, Lng: 8.6914960},
+ {Lat: 50.0987800, Lng: 8.6875156},
+}
+
+var toEncode3D = []Point{
+ {Lat: 50.1022829, Lng: 8.6982122, ThirdDim: 10},
+ {Lat: 50.1020076, Lng: 8.6956695, ThirdDim: 20},
+ {Lat: 50.1006313, Lng: 8.6914960, ThirdDim: 30},
+ {Lat: 50.0987800, Lng: 8.6875156, ThirdDim: 40},
+}
+
+var toEncodeLong = []Point{
+ {Lat: 52.5199356, Lng: 13.3866272},
+ {Lat: 52.5100899, Lng: 13.2816896},
+ {Lat: 52.4351807, Lng: 13.1935196},
+ {Lat: 52.4107285, Lng: 13.1964502},
+ {Lat: 52.38871, Lng: 13.1557798},
+ {Lat: 52.3727798, Lng: 13.1491003},
+ {Lat: 52.3737488, Lng: 13.1154604},
+ {Lat: 52.3875198, Lng: 13.0872202},
+ {Lat: 52.4029388, Lng: 13.0706196},
+ {Lat: 52.4105797, Lng: 13.0755529},
+}
+
+
+func testEncoding(t *testing.T, expected string, precision Precision, thirdDimensionFlag Type3D, thirdDimensionPrecision Precision, pointsToEncode []Point) {
+ toEncode := MustCreatePolyline3D(thirdDimensionFlag, precision, thirdDimensionPrecision, pointsToEncode)
+ result, err := Encode(toEncode)
+ checkResult(t, result, expected, err)
+}
+
+func checkResult(t *testing.T, expected string, result string, err error) {
+ if err != nil {
+ t.Errorf("Encode returned error %s", err)
+ }
+ if result != expected {
+ t.Errorf("Expected: %s, got: %s", expected, result)
+ }
+}
+
+func TestEncodeValue(t *testing.T) {
+ expected := "BFoz5xJ67i1B1B7PzIhaxL7Y"
+ testEncoding(t, expected, 5, Absent, 0, toEncode2D)
+}
+
+func TestAltitude(t *testing.T) {
+ expected := "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU"
+ testEncoding(t, expected, 5, Altitude, 0, toEncode3D)
+}
+
+func TestLongerPolyline(t *testing.T) {
+ expected := "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e"
+ testEncoding(t, expected, 5, Absent, 0, toEncodeLong)
+}
+
+func TestAsMethod(t *testing.T) {
+ expected := "BFoz5xJ67i1B1B7PzIhaxL7Y"
+ result, err := MustCreatePolyline(5, toEncode2D).Encode()
+ checkResult(t, result, expected, err)
+ expected = "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU"
+ result, err = MustCreatePolyline3D(Altitude, 5, 0, toEncode3D).Encode()
+ checkResult(t, result, expected, err)
+ expected = "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e"
+ result, err = MustCreatePolyline(5, toEncodeLong).Encode()
+ checkResult(t, result, expected, err)
+}
+
+func BenchmarkEncode(b *testing.B) {
+ points := buildPoints(b.N)
+ polyline := MustCreatePolyline(4, points)
+
+ b.ResetTimer()
+ _, err := Encode(polyline)
+ if err != nil {
+ b.Fail()
+ }
+}
+
+func buildPoints(n int) []Point {
+ base := Point{Lat: 50, Lng: 8}
+
+ points := make([]Point, 0, n)
+ for i := 0; i < n; i++ {
+ points = append(points, Point{
+ Lat: base.Lat + 10*rand.Float64(),
+ Lng: base.Lat + 10*rand.Float64(),
+ })
+ }
+
+ return points
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/java/README.md
^
|
@@ -0,0 +1,10 @@
+# Quick compilation and testing instructions
+```bash
+$ javac -d out src/com/here/flexpolyline/PolylineEncoderDecoder*.java
+$ java -cp out com.here.flexpolyline.PolylineEncoderDecoderTest
+```
+to run the performance test with the default polyline length of 1000 vertices, or
+```bash
+$ java -cp out com.here.flexpolyline.PolylineEncoderDecoderTest $POLYLINE_LENGTH
+```
+to use `$POLYLINE_LENGTH` vertices for the performance test.
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/java/pom.xml
^
|
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <name>Flexible Polyline</name>
+ <groupId>com.here</groupId>
+ <artifactId>flexpolyline</artifactId>
+ <version>0.1.0</version>
+ <packaging>pom</packaging>
+ <description>Flexible Polyline encoding: a lossy compressed representation of a list of coordinate pairs or triples</description>
+ <url>https://github.com/heremaps/flexible-polyline</url>
+
+ <licenses>
+ <license>
+ <name>MIT</name>
+ <url>https://opensource.org/licenses/MIT</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+
+ <scm>
+ <connection>scm:git:https://github.com/heremaps/flexible-polyline.git</connection>
+ <developerConnection>scm:git:git@github.com:heremaps/flexible-polyline.git</developerConnection>
+ <url>https://github.com/heremaps/flexible-polyline</url>
+ </scm>
+</project>
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/java/src/com/here/flexpolyline/PolylineEncoderDecoder.java
^
|
@@ -0,0 +1,446 @@
+/*
+ * Copyright (C) 2019 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+package com.here.flexpolyline;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * The polyline encoding is a lossy compressed representation of a list of coordinate pairs or coordinate triples.
+ * It achieves that by:
+ * <p><ol>
+ * <li>Reducing the decimal digits of each value.
+ * <li>Encoding only the offset from the previous point.
+ * <li>Using variable length for each coordinate delta.
+ * <li>Using 64 URL-safe characters to display the result.
+ * </ol><p>
+ *
+ * The advantage of this encoding are the following:
+ * <p><ul>
+ * <li> Output string is composed by only URL-safe characters
+ * <li> Floating point precision is configurable
+ * <li> It allows to encode a 3rd dimension with a given precision, which may be a level, altitude, elevation or some other custom value
+ * </ul><p>
+ */
+public class PolylineEncoderDecoder {
+
+ /**
+ * Header version
+ * A change in the version may affect the logic to encode and decode the rest of the header and data
+ */
+ public static final byte FORMAT_VERSION = 1;
+
+ //Base64 URL-safe characters
+ public static final char[] ENCODING_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".toCharArray();
+
+ public static final int[] DECODING_TABLE = {
+ 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
+ };
+ /**
+ * Encode the list of coordinate triples.<BR><BR>
+ * The third dimension value will be eligible for encoding only when ThirdDimension is other than ABSENT.
+ * This is lossy compression based on precision accuracy.
+ *
+ * @param coordinates {@link List} of coordinate triples that to be encoded.
+ * @param precision Floating point precision of the coordinate to be encoded.
+ * @param thirdDimension {@link ThirdDimension} which may be a level, altitude, elevation or some other custom value
+ * @param thirdDimPrecision Floating point precision for thirdDimension value
+ * @return URL-safe encoded {@link String} for the given coordinates.
+ */
+ public static String encode(List<LatLngZ> coordinates, int precision, ThirdDimension thirdDimension, int thirdDimPrecision) {
+ if (coordinates == null || coordinates.size() == 0) {
+ throw new IllegalArgumentException("Invalid coordinates!");
+ }
+ if (thirdDimension == null) {
+ throw new IllegalArgumentException("Invalid thirdDimension");
+ }
+ Encoder enc = new Encoder(precision, thirdDimension, thirdDimPrecision);
+ Iterator<LatLngZ> iter = coordinates.iterator();
+ while (iter.hasNext()) {
+ enc.add(iter.next());
+ }
+ return enc.getEncoded();
+ }
+
+ /**
+ * Decode the encoded input {@link String} to {@link List} of coordinate triples.<BR><BR>
+ * @param encoded URL-safe encoded {@link String}
+ * @return {@link List} of coordinate triples that are decoded from input
+ *
+ * @see PolylineDecoder#getThirdDimension(String) getThirdDimension
+ * @see LatLngZ
+ */
+ public static final List<LatLngZ> decode(String encoded) {
+
+ if (encoded == null || encoded.trim().isEmpty()) {
+ throw new IllegalArgumentException("Invalid argument!");
+ }
+ List<LatLngZ> result = new ArrayList<>();
+ Decoder dec = new Decoder(encoded);
+ AtomicReference<Double> lat = new AtomicReference<>(0d);
+ AtomicReference<Double> lng = new AtomicReference<>(0d);
+ AtomicReference<Double> z = new AtomicReference<>(0d);
+
+ while (dec.decodeOne(lat, lng, z)) {
+ result.add(new LatLngZ(lat.get(), lng.get(), z.get()));
+ lat = new AtomicReference<>(0d);
+ lng = new AtomicReference<>(0d);
+ z = new AtomicReference<>(0d);
+ }
+ return result;
+ }
+
+ /**
+ * ThirdDimension type from the encoded input {@link String}
+ * @param encoded URL-safe encoded coordinate triples {@link String}
+ * @return type of {@link ThirdDimension}
+ */
+ public static ThirdDimension getThirdDimension(String encoded) {
+ AtomicInteger index = new AtomicInteger(0);
+ AtomicLong header = new AtomicLong(0);
+ Decoder.decodeHeaderFromString(encoded.toCharArray(), index, header);
+ return ThirdDimension.fromNum((header.get() >> 4) & 7);
+ }
+
+ public byte getVersion() {
+ return FORMAT_VERSION;
+ }
+
+ /*
+ * Single instance for configuration, validation and encoding for an input request.
+ */
+ private static class Encoder {
+
+ private final StringBuilder result;
+ private final Converter latConveter;
+ private final Converter lngConveter;
+ private final Converter zConveter;
+ private final ThirdDimension thirdDimension;
+
+ public Encoder(int precision, ThirdDimension thirdDimension, int thirdDimPrecision) {
+ this.latConveter = new Converter(precision);
+ this.lngConveter = new Converter(precision);
+ this.zConveter = new Converter(thirdDimPrecision);
+ this.thirdDimension = thirdDimension;
+ this.result = new StringBuilder();
+ encodeHeader(precision, this.thirdDimension.getNum(), thirdDimPrecision);
+ }
+
+ private void encodeHeader(int precision, int thirdDimensionValue, int thirdDimPrecision) {
+ /*
+ * Encode the `precision`, `third_dim` and `third_dim_precision` into one encoded char
+ */
+ if (precision < 0 || precision > 15) {
+ throw new IllegalArgumentException("precision out of range");
+ }
+
+ if (thirdDimPrecision < 0 || thirdDimPrecision > 15) {
+ throw new IllegalArgumentException("thirdDimPrecision out of range");
+ }
+
+ if (thirdDimensionValue < 0 || thirdDimensionValue > 7) {
+ throw new IllegalArgumentException("thirdDimensionValue out of range");
+ }
+ long res = (thirdDimPrecision << 7) | (thirdDimensionValue << 4) | precision;
+ Converter.encodeUnsignedVarint(PolylineEncoderDecoder.FORMAT_VERSION, result);
+ Converter.encodeUnsignedVarint(res, result);
+ }
+
+ private void add(double lat, double lng) {
+ latConveter.encodeValue(lat, result);
+ lngConveter.encodeValue(lng, result);
+ }
+
+ private void add(double lat, double lng, double z) {
+ add(lat, lng);
+ if (this.thirdDimension != ThirdDimension.ABSENT) {
+ zConveter.encodeValue(z, result);
+ }
+ }
+
+ private void add(LatLngZ tuple) {
+ if(tuple == null) {
+ throw new IllegalArgumentException("Invalid LatLngZ tuple");
+ }
+ add(tuple.lat, tuple.lng, tuple.z);
+ }
+
+ private String getEncoded() {
+ return this.result.toString();
+ }
+ }
+
+ /*
+ * Single instance for decoding an input request.
+ */
+ private static class Decoder {
+
+ private final char[] encoded;
+ private final AtomicInteger index;
+ private final Converter latConverter;
+ private final Converter lngConverter;
+ private final Converter zConverter;
+
+ private int precision;
+ private int thirdDimPrecision;
+ private ThirdDimension thirdDimension;
+
+
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/java/src/com/here/flexpolyline/PolylineEncoderDecoderTest.java
^
|
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2019 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+package com.here.flexpolyline;
+
+import static com.here.flexpolyline.PolylineEncoderDecoder.decode;
+import static com.here.flexpolyline.PolylineEncoderDecoder.encode;
+import static com.here.flexpolyline.PolylineEncoderDecoder.getThirdDimension;
+import static com.here.flexpolyline.PolylineEncoderDecoder.ThirdDimension.ABSENT;
+import static com.here.flexpolyline.PolylineEncoderDecoder.ThirdDimension.ALTITUDE;
+import static com.here.flexpolyline.PolylineEncoderDecoder.ThirdDimension.ELEVATION;
+import static com.here.flexpolyline.PolylineEncoderDecoder.ThirdDimension.LEVEL;
+
+import java.io.BufferedReader;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.here.flexpolyline.PolylineEncoderDecoder.Converter;
+import com.here.flexpolyline.PolylineEncoderDecoder.LatLngZ;
+import com.here.flexpolyline.PolylineEncoderDecoder.ThirdDimension;
+
+/**
+ * Validate polyline encoding with different input combinations.
+ */
+public class PolylineEncoderDecoderTest {
+
+ private void testInvalidCoordinates() {
+
+ //Null coordinates
+ assertThrows(IllegalArgumentException.class,
+ () -> { encode(null, 5, ThirdDimension.ABSENT, 0); });
+
+
+ //Empty coordinates list test
+ assertThrows(IllegalArgumentException.class,
+ () -> { encode(new ArrayList<LatLngZ>(), 5, ThirdDimension.ABSENT, 0); });
+ }
+
+ private void testInvalidThirdDimension() {
+
+ List<LatLngZ> pairs = new ArrayList<>();
+ pairs.add(new LatLngZ(50.1022829, 8.6982122));
+ ThirdDimension invalid = null;
+
+ //Invalid Third Dimension
+ assertThrows(IllegalArgumentException.class,
+ () -> { encode(pairs, 5, invalid, 0); });
+ }
+
+ private void testConvertValue() {
+
+ PolylineEncoderDecoder.Converter conv = new PolylineEncoderDecoder.Converter(5);
+ StringBuilder result = new StringBuilder();
+ conv.encodeValue(-179.98321, result);
+ assertEquals(result.toString(), "h_wqiB");
+ }
+
+ private void testSimpleLatLngEncoding() {
+
+ List<LatLngZ> pairs = new ArrayList<>();
+ pairs.add(new LatLngZ(50.1022829, 8.6982122));
+ pairs.add(new LatLngZ(50.1020076, 8.6956695));
+ pairs.add(new LatLngZ(50.1006313, 8.6914960));
+ pairs.add(new LatLngZ(50.0987800, 8.6875156));
+
+ String expected = "BFoz5xJ67i1B1B7PzIhaxL7Y";
+ String computed = encode(pairs, 5, ThirdDimension.ABSENT, 0);
+ assertEquals(computed, expected);
+ }
+
+ private void testComplexLatLngEncoding() {
+
+ List<LatLngZ> pairs = new ArrayList<>();
+ pairs.add(new LatLngZ(52.5199356, 13.3866272));
+ pairs.add(new LatLngZ(52.5100899, 13.2816896));
+ pairs.add(new LatLngZ(52.4351807, 13.1935196));
+ pairs.add(new LatLngZ(52.4107285, 13.1964502));
+ pairs.add(new LatLngZ(52.38871, 13.1557798));
+ pairs.add(new LatLngZ(52.3727798, 13.1491003));
+ pairs.add(new LatLngZ(52.3737488, 13.1154604));
+ pairs.add(new LatLngZ(52.3875198, 13.0872202));
+ pairs.add(new LatLngZ(52.4029388, 13.0706196));
+ pairs.add(new LatLngZ(52.4105797, 13.0755529));
+
+ String expected = "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e";
+ String computed = encode(pairs, 5, ThirdDimension.ABSENT, 0);
+ assertEquals(computed, expected);
+ }
+
+ private void testLatLngZEncode() {
+
+ List<LatLngZ> tuples = new ArrayList<>();
+ tuples.add(new LatLngZ(50.1022829, 8.6982122, 10));
+ tuples.add(new LatLngZ(50.1020076, 8.6956695, 20));
+ tuples.add(new LatLngZ(50.1006313, 8.6914960, 30));
+ tuples.add(new LatLngZ(50.0987800, 8.6875156, 40));
+
+ String expected = "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU";
+ String computed = encode(tuples, 5, ThirdDimension.ALTITUDE, 0);
+ assertEquals(computed, expected);
+ }
+
+
+ /**********************************************/
+ /********** Decoder test starts ***************/
+ /**********************************************/
+ private void testInvalidEncoderInput() {
+
+ //Null coordinates
+ assertThrows(IllegalArgumentException.class,
+ () -> { decode(null); });
+
+
+ //Empty coordinates list test
+ assertThrows(IllegalArgumentException.class,
+ () -> { decode(""); });
+ }
+
+ private void testThirdDimension() {
+ assertTrue(getThirdDimension("BFoz5xJ67i1BU") == ABSENT);
+ assertTrue(getThirdDimension("BVoz5xJ67i1BU") == LEVEL);
+ assertTrue(getThirdDimension("BlBoz5xJ67i1BU") == ALTITUDE);
+ assertTrue(getThirdDimension("B1Boz5xJ67i1BU") == ELEVATION);
+ }
+
+ private void testDecodeConvertValue() {
+
+ String encoded = "h_wqiB";
+ double expected = -179.98321;
+ AtomicReference<Double> computed = new AtomicReference<>(0d);
+ Converter conv = new Converter(5);
+ conv.decodeValue(encoded,
+ new AtomicInteger(0),
+ computed);
+ assertEquals(computed.get(), expected);
+ }
+
+
+ private void testSimpleLatLngDecoding() {
+
+ List<LatLngZ> computed = decode("BFoz5xJ67i1B1B7PzIhaxL7Y");
+ List<LatLngZ> expected = new ArrayList<>();
+ expected.add(new LatLngZ(50.10228, 8.69821));
+ expected.add(new LatLngZ(50.10201, 8.69567));
+ expected.add(new LatLngZ(50.10063, 8.69150));
+ expected.add(new LatLngZ(50.09878, 8.68752));
+
+ assertEquals(computed.size(), expected.size());
+ for (int i = 0; i < computed.size(); ++i) {
+ assertEquals(computed.get(i), expected.get(i));
+ }
+ }
+
+ private void testComplexLatLngDecoding() {
+
+ List<LatLngZ> computed = decode("BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e");
+
+ List<LatLngZ> pairs = new ArrayList<>();
+ pairs.add(new LatLngZ(52.51994, 13.38663));
+ pairs.add(new LatLngZ(52.51009, 13.28169));
+ pairs.add(new LatLngZ(52.43518, 13.19352));
+ pairs.add(new LatLngZ(52.41073, 13.19645));
+ pairs.add(new LatLngZ(52.38871, 13.15578));
+ pairs.add(new LatLngZ(52.37278, 13.14910));
+ pairs.add(new LatLngZ(52.37375, 13.11546));
+ pairs.add(new LatLngZ(52.38752, 13.08722));
+ pairs.add(new LatLngZ(52.40294, 13.07062));
+ pairs.add(new LatLngZ(52.41058, 13.07555));
+
+ assertEquals(computed.size(), pairs.size());
+ for (int i = 0; i < computed.size(); ++i) {
+ assertEquals(computed.get(i), pairs.get(i));
+ }
+ }
+
+ private void testLatLngZDecode() {
+ List<LatLngZ> computed = decode("BlBoz5xJ67i1BU1B7PUzIhaUxL7YU");
+ List<LatLngZ> tuples = new ArrayList<>();
+
+ tuples.add(new LatLngZ(50.10228, 8.69821, 10));
+ tuples.add(new LatLngZ(50.10201, 8.69567, 20));
+ tuples.add(new LatLngZ(50.10063, 8.69150, 30));
+ tuples.add(new LatLngZ(50.09878, 8.68752, 40));
+
+ assertEquals(computed.size(), tuples.size());
+ for (int i = 0; i < computed.size(); ++i) {
+ assertEquals(computed.get(i), tuples.get(i));
+ }
+ }
+
+ private static final String TEST_FILES_RELATIVE_PATH = "../test/";
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/javascript/.gitignore
^
|
@@ -0,0 +1 @@
+node_modules/
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/javascript/index.js
^
|
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2019 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+const DEFAULT_PRECISION = 5;
+
+const ENCODING_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+
+const DECODING_TABLE = [
+ 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
+];
+
+const FORMAT_VERSION = 1;
+
+const ABSENT = 0;
+const LEVEL = 1;
+const ALTITUDE = 2;
+const ELEVATION = 3;
+// Reserved values 4 and 5 should not be selectable
+const CUSTOM1 = 6;
+const CUSTOM2 = 7;
+
+const Num = typeof BigInt !== "undefined" ? BigInt : Number;
+
+function decode(encoded) {
+ const decoder = decodeUnsignedValues(encoded);
+ const header = decodeHeader(decoder[0], decoder[1]);
+
+ const factorDegree = 10 ** header.precision;
+ const factorZ = 10 ** header.thirdDimPrecision;
+ const { thirdDim } = header;
+
+ let lastLat = 0;
+ let lastLng = 0;
+ let lastZ = 0;
+ const res = [];
+
+ let i = 2;
+ for (;i < decoder.length;) {
+ const deltaLat = toSigned(decoder[i]) / factorDegree;
+ const deltaLng = toSigned(decoder[i + 1]) / factorDegree;
+ lastLat += deltaLat;
+ lastLng += deltaLng;
+
+ if (thirdDim) {
+ const deltaZ = toSigned(decoder[i + 2]) / factorZ;
+ lastZ += deltaZ;
+ res.push([lastLat, lastLng, lastZ]);
+ i += 3;
+ } else {
+ res.push([lastLat, lastLng]);
+ i += 2;
+ }
+ }
+
+ if (i !== decoder.length) {
+ throw new Error('Invalid encoding. Premature ending reached');
+ }
+
+ return {
+ ...header,
+ polyline: res,
+ };
+}
+
+function decodeChar(char) {
+ const charCode = char.charCodeAt(0);
+ return DECODING_TABLE[charCode - 45];
+}
+
+function decodeUnsignedValues(encoded) {
+ let result = Num(0);
+ let shift = Num(0);
+ const resList = [];
+
+ encoded.split('').forEach((char) => {
+ const value = Num(decodeChar(char));
+ result |= (value & Num(0x1F)) << shift;
+ if ((value & Num(0x20)) === Num(0)) {
+ resList.push(result);
+ result = Num(0);
+ shift = Num(0);
+ } else {
+ shift += Num(5);
+ }
+ });
+
+ if (shift > 0) {
+ throw new Error('Invalid encoding');
+ }
+
+ return resList;
+}
+
+function decodeHeader(version, encodedHeader) {
+ if (+version.toString() !== FORMAT_VERSION) {
+ throw new Error('Invalid format version');
+ }
+ const headerNumber = +encodedHeader.toString();
+ const precision = headerNumber & 15;
+ const thirdDim = (headerNumber >> 4) & 7;
+ const thirdDimPrecision = (headerNumber >> 7) & 15;
+ return { precision, thirdDim, thirdDimPrecision };
+}
+
+function toSigned(val) {
+ // Decode the sign from an unsigned value
+ let res = val;
+ if (res & Num(1)) {
+ res = ~res;
+ }
+ res >>= Num(1);
+ return +res.toString();
+}
+
+function encode({ precision = DEFAULT_PRECISION, thirdDim = ABSENT, thirdDimPrecision = 0, polyline }) {
+ // Encode a sequence of lat,lng or lat,lng(,{third_dim}). Note that values should be of type BigNumber
+ // `precision`: how many decimal digits of precision to store the latitude and longitude.
+ // `third_dim`: type of the third dimension if present in the input.
+ // `third_dim_precision`: how many decimal digits of precision to store the third dimension.
+
+ const multiplierDegree = 10 ** precision;
+ const multiplierZ = 10 ** thirdDimPrecision;
+ const encodedHeaderList = encodeHeader(precision, thirdDim, thirdDimPrecision);
+ const encodedCoords = [];
+
+ let lastLat = Num(0);
+ let lastLng = Num(0);
+ let lastZ = Num(0);
+ polyline.forEach((location) => {
+ const lat = Num(Math.round(location[0] * multiplierDegree));
+ encodedCoords.push(encodeScaledValue(lat - lastLat));
+ lastLat = lat;
+
+ const lng = Num(Math.round(location[1] * multiplierDegree));
+ encodedCoords.push(encodeScaledValue(lng - lastLng));
+ lastLng = lng;
+
+ if (thirdDim) {
+ const z = Num(Math.round(location[2] * multiplierZ));
+ encodedCoords.push(encodeScaledValue(z - lastZ));
+ lastZ = z;
+ }
+ });
+
+ return [...encodedHeaderList, ...encodedCoords].join('');
+}
+
+function encodeHeader(precision, thirdDim, thirdDimPrecision) {
+ // Encode the `precision`, `third_dim` and `third_dim_precision` into one encoded char
+ if (precision < 0 || precision > 15) {
+ throw new Error('precision out of range. Should be between 0 and 15');
+ }
+ if (thirdDimPrecision < 0 || thirdDimPrecision > 15) {
+ throw new Error('thirdDimPrecision out of range. Should be between 0 and 15');
+ }
+ if (thirdDim < 0 || thirdDim > 7 || thirdDim === 4 || thirdDim === 5) {
+ throw new Error('thirdDim should be between 0, 1, 2, 3, 6 or 7');
+ }
+
+ const res = (thirdDimPrecision << 7) | (thirdDim << 4) | precision;
+ return encodeUnsignedNumber(FORMAT_VERSION) + encodeUnsignedNumber(res);
+}
+
+function encodeUnsignedNumber(val) {
+ // Uses variable integer encoding to encode an unsigned integer. Returns the encoded string.
+ let res = '';
+ let numVal = Num(val);
+ while (numVal > 0x1F) {
+ const pos = (numVal & Num(0x1F)) | Num(0x20);
+ res += ENCODING_TABLE[pos];
+ numVal >>= Num(5);
+ }
+ return res + ENCODING_TABLE[numVal];
+}
+
+function encodeScaledValue(value) {
+ // Transform a integer `value` into a variable length sequence of characters.
+ // `appender` is a callable where the produced chars will land to
+ let numVal = Num(value);
+ const negative = numVal < 0;
+ numVal <<= Num(1);
+ if (negative) {
+ numVal = ~numVal;
+ }
+
+ return encodeUnsignedNumber(numVal);
+}
+
+module.exports = {
+ encode,
+ decode,
+
+ ABSENT,
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/javascript/package-lock.json
^
|
@@ -0,0 +1,5 @@
+{
+ "name": "@here/flexpolyline",
+ "version": "0.1.0",
+ "lockfileVersion": 1
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/javascript/package.json
^
|
@@ -0,0 +1,26 @@
+{
+ "name": "@here/flexpolyline",
+ "version": "0.1.0",
+ "description": "Flexible Polyline encoding: a lossy compressed representation of a list of coordinate pairs or triples",
+ "main": "index.js",
+ "scripts": {
+ "test": "node test/test.js"
+ },
+ "keywords": [
+ "polyline",
+ "encoding"
+ ],
+ "author": {
+ "name": "HERE Europe B.V.",
+ "url": "https://here.com"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/heremaps/flexible-polyline.git",
+ "directory": "javascript"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/javascript/test/test.js
^
|
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 HERE Europe B.V.
+ * Licensed under MIT, see full license in LICENSE
+ * SPDX-License-Identifier: MIT
+ * License-Filename: LICENSE
+ */
+const poly = require("../");
+const assert = require('assert');
+const fs = require('fs');
+
+const originalLines = fs.readFileSync('../test/original.txt', { encoding: 'utf-8' }).split('\n');
+const encodedLines = fs.readFileSync('../test/encoded.txt', { encoding: 'utf-8' }).split('\n');
+const decodedLines = fs.readFileSync('../test/decoded.txt', { encoding: 'utf-8' }).split('\n');
+
+function runTests() {
+ originalLines.forEach((original, index) => {
+ if (!original) {
+ return;
+ }
+ const input = parseLine(original);
+ if (input.thirdDim === 4 || input.thirdDim === 5 || input.precision > 10 || input.thirdDimPrecision > 10) {
+ return;
+ }
+ const encoded = encodedLines[index];
+ const decoded = decodedLines[index].replace(/ /g, '');
+
+ const encodedInput = poly.encode(input);
+ assert.strictEqual(encodedInput, encoded);
+
+ const expectedDecoded = parseLine(decoded);
+ const resDecoded = poly.decode(encodedInput);
+ assert.strictEqual(resDecoded.precision, expectedDecoded.precision);
+ assert.strictEqual(resDecoded.thirdDim, expectedDecoded.thirdDim || 0);
+ assert.strictEqual(resDecoded.thirdDimPrecision, expectedDecoded.thirdDimPrecision);
+ expectedDecoded.polyline.forEach((expectedPos, i0) => {
+ expectedPos.forEach((val, i1) => {
+ const precision = i1 === 2 ? resDecoded.thirdDimPrecision : resDecoded.precision;
+ assert(approxEq(val, resDecoded.polyline[i0][i1], 1 / (10 ** precision)));
+ });
+ });
+ });
+}
+
+runTests();
+
+function parseLine(line) {
+ // Strip off all spaces, curly braces, square brackets and trailing comma
+ const [rawHeader, rawPolyline] = line.replace(/[ {}\[\]]/g, '').slice(0, -1).split(';');
+ const [precision, thirdDimPrecision, thirdDim] = rawHeader.slice(1, -1).split(',').map((num) => num ? +num : undefined);
+ const polyline = rawPolyline.split('),(').map((rawLocation) => {
+ return rawLocation.replace(/[()]/g, '').split(',').map((num) => +num);
+ });
+
+ return { precision, thirdDim, thirdDimPrecision, polyline };
+}
+
+function approxEq(v1, v2, epsilon) {
+ if (epsilon == null) {
+ epsilon = 0.001;
+ }
+ return Math.abs(v1 - v2) < epsilon;
+}
+
+console.log('Tests succeeded');
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/.gitattributes
^
|
@@ -0,0 +1,16 @@
+# Path-based git attributes
+# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
+
+# Ignore all test and documentation with "export-ignore".
+/.editorconfig export-ignore
+/.gitattributes export-ignore
+/.gitignore export-ignore
+/.scrutinizer.yml export-ignore
+/.styleci.yml export-ignore
+/.travis.yml export-ignore
+/PULL_REQUEST_TEMPLATE.md export-ignore
+/ISSUE_TEMPLATE.md export-ignore
+/phpcs.xml.dist export-ignore
+/phpunit.xml.dist export-ignore
+/tests export-ignore
+/docs export-ignore
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/.gitignore
^
|
@@ -0,0 +1,6 @@
+build
+composer.lock
+vendor
+phpcs.xml
+phpunit.xml
+.phpunit.result.cache
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/.travis.yml
^
|
@@ -0,0 +1,30 @@
+dist: trusty
+language: php
+
+php:
+ - 7.2
+ - 7.3
+ - 7.4
+
+## Cache composer
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+matrix:
+ include:
+ - php: 7.2
+ env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"'
+
+before_script:
+ - travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-dist
+
+script:
+ - vendor/bin/phpcs --standard=psr2 src/
+
+after_script:
+ - |
+ if [[ "$TRAVIS_PHP_VERSION" != 'hhvm' ]]; then
+ wget https://scrutinizer-ci.com/ocular.phar
+ php ocular.phar code-coverage:upload --format=php-clover coverage.clover
+ fi
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/README.md
^
|
@@ -0,0 +1,55 @@
+## Testing
+
+```
+composer test
+```
+
+## Usage
+
+### Decode
+
+FlexiblePolyline::decode(string $encoded): array
+
+```
+$data = FlexiblePolyline::decode('BlBoz5xJ67i1BU1B7PUzIhaUxL7YU');
+/** $data:
+[
+ 'precision' => 5,
+ 'thirdDim' => 2,
+ 'thirdDimPrecision' => 0,
+ 'polyline' => [
+ [50.10228, 8.69821, 10],
+ [50.10201, 8.69567, 20],
+ [50.10063, 8.6915, 30],
+ [50.09878, 8.68752, 40]
+ ]
+]
+*/
+```
+
+### Encode
+
+FlexiblePolyline::encode(array $coordinates [, int $precision = null, int $thirdDim = null, int $thirdDimPrecision = 0]): string
+
+```
+$encoded = FlexiblePolyline::encode([
+ [50.10228, 8.69821, 10],
+ [50.10201, 8.69567, 20],
+ [50.10063, 8.6915, 30],
+ [50.09878, 8.68752, 40]
+], 5, 2, 0);
+/** $encoded:
+BlBoz5xJ67i1BU1B7PUzIhaUxL7YU
+*/
+```
+
+### Third Dimension
+
+FlexiblePolyline::getThirdDimension(string $encoded): int
+
+```
+$thirdDimension = FlexiblePolyline::getThirdDimension('BVoz5xJ67i1BU')
+/** $thirdDimension:
+1
+*/
+```
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/composer.json
^
|
@@ -0,0 +1,44 @@
+
+{
+ "name": "heremaps/flexible-polyline",
+ "type": "library",
+ "description": "Flexible Polyline encoding: a lossy compressed representation of a list of coordinate pairs or triples",
+ "keywords": [
+ "heremaps",
+ "flexible-polyline"
+ ],
+ "homepage": "https://github.com/heremaps/flexible-polyline",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "rozklad",
+ "email": "jan.rozklad@gmail.com"
+ }
+ ],
+ "require": {
+ "php" : "~7.2",
+ "ext-mbstring": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit" : ">=8.0",
+ "squizlabs/php_codesniffer": "^3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Heremaps\\FlexiblePolyline\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Heremaps\\FlexiblePolyline\\Tests\\": "tests"
+ }
+ },
+ "scripts": {
+ "test": "phpunit tests",
+ "check-style": "phpcs src tests",
+ "fix-style": "phpcbf src tests"
+ },
+ "config": {
+ "sort-packages": true
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/src/FlexiblePolyline.php
^
|
@@ -0,0 +1,31 @@
+<?php
+
+namespace Heremaps\FlexiblePolyline;
+
+use Heremaps\FlexiblePolyline\Traits\DecodableTrait;
+use Heremaps\FlexiblePolyline\Traits\EncodableTrait;
+
+class FlexiblePolyline
+{
+
+ public const FORMAT_VERSION = 1;
+ public const DEFAULT_PRECISION = 5;
+ public const ENCODING_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+ public const DECODING_TABLE = [
+ 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
+ ];
+
+ public const ABSENT = 0;
+ public const LEVEL = 1;
+ public const ALTITUDE = 2;
+ public const ELEVATION = 3;
+ public const RESERVED1 = 4;
+ public const RESERVED2 = 5;
+ public const CUSTOM1 = 6;
+ public const CUSTOM2 = 7;
+
+ use DecodableTrait, EncodableTrait;
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/src/Traits/DecodableTrait.php
^
|
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * Flexible Polyline Decoder
+ *
+ * @package FlexiblePolyline
+ */
+
+namespace Heremaps\FlexiblePolyline\Traits;
+
+use Exception;
+
+trait DecodableTrait
+{
+
+ public static function decode(string $encoded): array
+ {
+ $decoded = self::decodeUnsignedValues($encoded);
+ $header = self::decodeHeader($decoded[0], $decoded[1]);
+
+ $factorDegree = 10 ** $header['precision'];
+ $factorZ = 10 ** $header['thirdDimPrecision'];
+ $thirdDim = $header['thirdDim'];
+
+ $lastLat = 0;
+ $lastLng = 0;
+ $lastZ = 0;
+ $res = [];
+
+ $i = 2;
+ for (; $i < count($decoded);) {
+ $deltaLat = self::toSigned($decoded[$i]) / $factorDegree;
+ $deltaLng = self::toSigned($decoded[$i + 1]) / $factorDegree;
+ $lastLat += $deltaLat;
+ $lastLng += $deltaLng;
+
+ if ($thirdDim) {
+ $deltaZ = self::toSigned($decoded[$i + 2]) / $factorZ;
+ $lastZ += $deltaZ;
+ $res[] = [$lastLat, $lastLng, $lastZ];
+ $i += 3;
+ } else {
+ $res[] = [$lastLat, $lastLng];
+ $i += 2;
+ }
+ }
+
+ if ($i !== count($decoded)) {
+ throw new Exception('Invalid encoding. Premature ending reached');
+ }
+
+ return [
+ 'precision' => $header['precision'],
+ 'thirdDim' => $header['thirdDim'],
+ 'thirdDimPrecision' => $header['thirdDimPrecision'],
+ 'polyline' => $res
+ ];
+ }
+
+ public static function decodeHeader(int $version, int $encodedHeader): array
+ {
+ if ($version !== self::FORMAT_VERSION) {
+ throw new Exception('Invalid format version');
+ }
+ $headerNumber = (string)+$encodedHeader;
+ $precision = $headerNumber & 15;
+ $thirdDim = ($headerNumber >> 4) & 7;
+ $thirdDimPrecision = ($headerNumber >> 7) & 15;
+ return compact('precision', 'thirdDim', 'thirdDimPrecision');
+ }
+
+ public static function toSigned(int $val): string
+ {
+ $res = $val;
+ if ($res & 1) {
+ $res = ~$res;
+ }
+ $res >>= 1;
+ return (string)+$res;
+ }
+
+ public static function decodeUnsignedValues(string $encoded): array
+ {
+ $result = 0;
+ $shift = 0;
+ $resList = [];
+
+ $characters = str_split($encoded);
+
+ foreach ($characters as $char) {
+ $value = self::decodeChar($char);
+ $result |= ($value & 0x1F) << $shift;
+
+ if (($value & 0x20) === 0) {
+ $resList[] = $result;
+ $result = 0;
+ $shift = 0;
+ } else {
+ $shift += 5;
+ }
+ }
+
+ if ($shift > 0) {
+ throw new Exception('Invalid encoding');
+ }
+
+ return $resList;
+ }
+
+ public static function decodeChar(string $char): string
+ {
+ try {
+ $charcode = mb_ord($char);
+ $decoded = self::DECODING_TABLE[$charcode - 45];
+ } catch (Exception $e) {
+ throw new Exception('Char could not be decoded');
+ }
+
+ return $decoded;
+ }
+
+ public static function getThirdDimension(string $encoded): int
+ {
+ $decoded = self::decodeUnsignedValues($encoded);
+ $header = self::decodeHeader($decoded[0], $decoded[1]);
+ return $header['thirdDim'];
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/src/Traits/EncodableTrait.php
^
|
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * Flexible Polyline Encoder
+ *
+ * @package FlexiblePolyline
+ */
+
+namespace Heremaps\FlexiblePolyline\Traits;
+
+use Exception;
+
+trait EncodableTrait
+{
+
+ public static function encode(
+ array $coordinates,
+ int $precision = null,
+ int $thirdDim = null,
+ int $thirdDimPrecision = 0
+ ): string {
+ if (is_null($precision)) {
+ $precision = self::DEFAULT_PRECISION;
+ }
+
+ $multiplierDegree = 10 ** $precision;
+ $multiplierZ = 10 ** $thirdDimPrecision;
+ $encodedHeaderList = self::encodeHeader($precision, $thirdDim, $thirdDimPrecision);
+ $encodedCoords = [];
+
+ $lastLat = 0;
+ $lastLng = 0;
+ $lastZ = 0;
+
+ foreach ($coordinates as $location) {
+ $lat = (int)round($location[0] * $multiplierDegree);
+ $encodedCoords[] = self::encodeScaledValue($lat - $lastLat);
+ $lastLat = $lat;
+
+ $lng = (int)round($location[1] * $multiplierDegree);
+ $encodedCoords[] = self::encodeScaledValue($lng - $lastLng);
+ $lastLng = $lng;
+
+ if ($thirdDim) {
+ $z = (int)round($location[2] * $multiplierZ);
+ $encodedCoords[] = self::encodeScaledValue($z - $lastZ);
+ $lastZ = $z;
+ }
+ };
+
+ return implode('', array_merge([$encodedHeaderList], $encodedCoords));
+ }
+
+ public static function encodeHeader(int $precision, int $thirdDim, int $thirdDimPrecision): string
+ {
+ if ($precision < 0 || $precision > 15) {
+ throw new Exception('precision out of range. Should be between 0 and 15');
+ }
+ if ($thirdDimPrecision < 0 || $thirdDimPrecision > 15) {
+ throw new Exception('thirdDimPrecision out of range. Should be between 0 and 15');
+ }
+ if ($thirdDim < 0 || $thirdDim > 7 || $thirdDim === 4 || $thirdDim === 5) {
+ throw new Exception('thirdDim should be between 0, 1, 2, 3, 6 or 7');
+ }
+
+ $res = ($thirdDimPrecision << 7) | ($thirdDim << 4) | $precision;
+ return self::encodeUnsignedNumber(self::FORMAT_VERSION) . self::encodeUnsignedNumber($res);
+ }
+
+ public static function encodeUnsignedNumber(float $val): string
+ {
+ $res = '';
+ $numVal = (float)$val;
+ while ($numVal > 0x1F) {
+ $pos = ($numVal & 0x1F) | 0x20;
+ $pos = (int)$pos;
+ $res .= self::ENCODING_TABLE[$pos];
+ $numVal >>= 5;
+ }
+ $numVal = (int)$numVal;
+ return $res . self::ENCODING_TABLE[$numVal];
+ }
+
+ public static function encodeScaledValue(float $value): string
+ {
+ $negative = $value < 0;
+ $value <<= 1;
+ if ($negative) {
+ $value = ~$value;
+ }
+
+ return self::encodeUnsignedNumber($value);
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/tests/DecoderTest.php
^
|
@@ -0,0 +1,49 @@
+<?php
+
+namespace Heremaps\FlexiblePolyline\Tests;
+
+use Heremaps\FlexiblePolyline\FlexiblePolyline;
+use Heremaps\FlexiblePolyline\Tests\FlexiblePolylineTest;
+
+class DecoderTest extends FlexiblePolylineTest
+{
+ public function testLines(): void
+ {
+ $folders = ['round_half_even', 'round_half_up'];
+
+ foreach($folders as $folder) {
+ $this->runFolder($folder);
+ }
+ }
+
+ public function runFolder(string $folder): void
+ {
+ $originalLines = self::getOriginalLines();
+ $encodedLines = self::getEncodedLines($folder);
+ $decodedLines = self::getDecodedLines($folder);
+
+ $results = [];
+
+ for($i = 0; $i < count($encodedLines); $i++)
+ {
+ $input = self::parseLine($originalLines[$i]);
+ $encoded = $encodedLines[$i];
+ $decoded = $decodedLines[$i];
+
+ if ($input['thirdDim'] === 4 || $input['thirdDim'] === 5 || $input['thirdDimPrecision'] > 10 || $input['precision'] > 10) {
+ // Test decoding only
+ $expectedDecoded = self::parseLine($decoded);
+ $decodedEncodedValue = FlexiblePolyline::decode($encoded);
+ $this->assertEqualsCanonicalizing($expectedDecoded, $decodedEncodedValue);
+ } else {
+ // Test full
+ $expectedDecoded = self::parseLine($decoded);
+ $encodedInput = FlexiblePolyline::encode($input['polyline'], $input['precision'], $input['thirdDim'], $input['thirdDimPrecision']);
+ $decodedInput = FlexiblePolyline::decode($encodedInput);
+
+ $this->assertEqualsCanonicalizing($expectedDecoded, $decodedInput);
+ }
+ }
+ }
+
+}
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/tests/EncoderTest.php
^
|
@@ -0,0 +1,40 @@
+<?php
+
+namespace Heremaps\FlexiblePolyline\Tests;
+
+use Heremaps\FlexiblePolyline\FlexiblePolyline;
+use Heremaps\FlexiblePolyline\Tests\FlexiblePolylineTest;
+
+class EncoderTest extends FlexiblePolylineTest
+{
+ public function testLines(): void
+ {
+ $folders = ['round_half_even', 'round_half_up'];
+
+ foreach($folders as $folder) {
+ $this->runFolder($folder);
+ }
+ }
+
+ public function runFolder(string $folder): void
+ {
+ $originalLines = self::getOriginalLines();
+ $encodedLines = self::getEncodedLines($folder);
+
+ $results = [];
+
+ for($i = 0; $i < count($encodedLines); $i++) {
+ $input = self::parseLine($originalLines[$i]);
+ $encodedInput = $encodedLines[$i];
+
+ if ($input['thirdDim'] === 4 || $input['thirdDim'] === 5 || $input['thirdDimPrecision'] > 10 || $input['precision'] > 10) {
+ continue;
+ }
+
+ $encodedResult = FlexiblePolyline::encode($input['polyline'], $input['precision'], $input['thirdDim'], $input['thirdDimPrecision']);
+
+ $this->assertEquals($encodedInput, $encodedResult);
+ }
+ }
+
+}
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/tests/FlexiblePolylineTest.php
^
|
@@ -0,0 +1,66 @@
+<?php
+
+namespace Heremaps\FlexiblePolyline\Tests;
+
+use PHPUnit\Framework\TestCase;
+
+abstract class FlexiblePolylineTest extends TestCase
+{
+ protected static function getFilepath(string $relativePath): string
+ {
+ return sprintf(__DIR__ . '/../../test/%s', $relativePath);
+ }
+
+ protected static function getOriginalLines(): array
+ {
+ return self::getLinesFromTestFile('original.txt');
+ }
+
+ protected static function getEncodedLines(string $folder = 'round_half_even'): array
+ {
+ return self::getLinesFromTestFile('round_half_even/encoded.txt');
+ }
+
+ protected static function getDecodedLines(string $folder = 'round_half_even'): array
+ {
+ return self::getLinesFromTestFile('round_half_even/decoded.txt');
+ }
+
+ protected static function getLinesFromTestFile(string $filepath): array
+ {
+ return self::getLines(self::getFilepath($filepath));
+ }
+
+ protected static function getLines(string $filepath): array
+ {
+ return array_filter(explode("\n", file_get_contents($filepath)));
+ }
+
+ protected static function parseLine(string $line): array
+ {
+ list($rawHeader, $rawPolyline) = explode(';', preg_replace('/[ {}\[\]]/', '', $line));
+ list($precision, $thirdDimPrecision, $thirdDim) = array_replace(
+ [0, 0, 0], array_map(
+ function ($value) {
+ return (int)$value ?: 0;
+ }, explode(',', trim($rawHeader, '()'))
+ )
+ );
+ $polyline = array_map(
+ function ($point) use ($thirdDim) {
+ $coordinates = array_map(
+ function ($coordinate) {
+ return (float)$coordinate ?: null;
+ }, explode(',', preg_replace('/[()]/', '', $point))
+ );
+ $values = array_map(
+ function ($coordinate) {
+ return is_null($coordinate) ? 0 : $coordinate;
+ }, $coordinates
+ );
+ return array_slice($values, 0, $thirdDim ? 3 : 2);
+ }, explode('),(', $rawPolyline)
+ );
+ return compact('precision', 'thirdDim', 'thirdDimPrecision', 'polyline');
+ }
+}
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/php/tests/OtherTest.php
^
|
@@ -0,0 +1,53 @@
+<?php
+
+namespace Heremaps\FlexiblePolyline\Tests;
+
+use Heremaps\FlexiblePolyline\FlexiblePolyline;
+use Heremaps\FlexiblePolyline\Tests\FlexiblePolylineTest;
+
+class OtherTest extends FlexiblePolylineTest
+{
+ public function testReadmeExampleDecode(): void
+ {
+ $decoded = FlexiblePolyline::decode('BlBoz5xJ67i1BU1B7PUzIhaUxL7YU');
+
+ $expected = [
+ 'precision' => 5,
+ 'thirdDim' => 2,
+ 'thirdDimPrecision' => 0,
+ 'polyline' => [
+ [50.10228, 8.69821, 10],
+ [50.10201, 8.69567, 20],
+ [50.10063, 8.6915, 30],
+ [50.09878, 8.68752, 40]
+ ]
+ ];
+
+ $this->assertEqualsCanonicalizing($expected, $decoded);
+ }
+
+ public function testReadmeExampleEncode(): void
+ {
+ $encoded = FlexiblePolyline::encode(
+ [
+ [50.10228, 8.69821, 10],
+ [50.10201, 8.69567, 20],
+ [50.10063, 8.6915, 30],
+ [50.09878, 8.68752, 40]
+ ], 5, 2, 0
+ );
+
+ $expected = 'BlBoz5xJ67i1BU1B7PUzIhaUxL7YU';
+
+ $this->assertEquals($expected, $encoded);
+ }
+
+ public function testThirdDimension(): void
+ {
+ $this->assertEquals(FlexiblePolyline::getThirdDimension('BFoz5xJ67i1BU'), FlexiblePolyline::ABSENT);
+ $this->assertEquals(FlexiblePolyline::getThirdDimension('BVoz5xJ67i1BU'), FlexiblePolyline::LEVEL);
+ $this->assertEquals(FlexiblePolyline::getThirdDimension('BlBoz5xJ67i1BU'), FlexiblePolyline::ALTITUDE);
+ $this->assertEquals(FlexiblePolyline::getThirdDimension('B1Boz5xJ67i1BU'), FlexiblePolyline::ELEVATION);
+ }
+
+}
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/.gitignore
^
|
@@ -0,0 +1,9 @@
+_env/
+__pycache__/
+*.pyc
+build/
+dist/
+*.egg-info/
+.eggs/
+_env*
+LICENSE
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/MANIFEST.in
^
|
@@ -0,0 +1,2 @@
+include LICENSE
+include README.md
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/README.md
^
|
@@ -0,0 +1,139 @@
+# FlexPolyline
+
+This is a python implementation of the Flexible Polyline format.
+
+The polyline encoding is a lossy compressed representation of a list of coordinate pairs or
+coordinate triples. It achieves that by:
+
+1. Reducing the decimal digits of each value.
+2. Encoding only the offset from the previous point.
+3. Using variable length for each coordinate delta.
+4. Using 64 URL-safe characters to display the result.
+
+## Install
+
+```python
+pip install flexpolyline
+```
+
+## Usage
+
+### Encoding
+
+#### `encode(iterable, precision=5, third_dim=ABSENT, third_dim_precision=0)`
+
+Encodes a list (or iterator) of coordinates to the corresponding string representation. See the optional parameters below for further customization. Coordinate order is `(lat, lng[, third_dim])`.
+```
+
+**Optional parameters**
+
+* `precision` - Defines how many decimal digits to round latitude and longitude to (ranges from `0` to `15`).
+* `third_dim` - Defines the type of the third dimension when present. Possible values are defined in the module: `ALTITUDE`, `LEVEL`, `ELEVATION`, `CUSTOM1` and `CUSTOM2`. The last two values can be used in case your third dimension has a user defined meaning.
+* `third_dim_precision` - Defines how many decimal digits to round the third dimension to (ranges from `0` to `15`). This parameter is ignored when `third_dim` is `ABSENT` (default).
+
+
+#### `dict_encode(iterable, precision=5, third_dim=ABSENT, third_dim_precision=0)`
+
+Similar to the `encode` function, but accepts a list (or iterator) of dictionaries instead. Required keys are `"lat"` and `"lng"`. If `third_dim` is set, the corresponding key is expected `"alt"`, `"elv"`, `"lvl"`, `"cst1"` or `"cst2"`.
+
+
+#### Examples
+
+Following is a simple example encoding a 2D poyline with 5 decimal digits of precision:
+
+```python
+import flexpolyline as fp
+
+example = [
+ (50.1022829, 8.6982122),
+ (50.1020076, 8.6956695),
+ (50.1006313, 8.6914960),
+ (50.0987800, 8.6875156),
+]
+
+print(fp.encode(example))
+```
+
+**Output**: `BFoz5xJ67i1B1B7PzIhaxL7Y`.
+
+Another example for the 3D case with altitude as the third coordinate:
+
+```python
+example = [
+ (50.1022829, 8.6982122, 10),
+ (50.1020076, 8.6956695, 20),
+ (50.1006313, 8.6914960, 30),
+ (50.0987800, 8.6875156, 40),
+]
+
+print(fp.encode(example, third_dim=flexpolyline.ALTITUDE))
+```
+
+**Output**: `BlBoz5xJ67i1BU1B7PUzIhaUxL7YU`
+
+### Decoding
+
+#### `decode(encoded_string)`
+
+Decodes the passed encoded string and returns a list of tuples `(lat, lng[, third_dim])`.
+
+#### `iter_decode(encoded_string)`
+
+Similar to `decode` but returns an iterator instead.
+
+#### `dict_decode(encoded_string)`
+
+Similar to `decode` but returns a list of dictionaries instead. The keys `"lat"` and `"lng"` are always present, while the third dimension key depends on the type of third dimension encoded. It can be one of the following: `"alt"`, `"elv"`, `"lvl"`, `"cst1"` or `"cst2"`.
+
+#### `iter_dict_decode(encoded_string)`
+
+Similar to `dict_decode` but returns an iterator instead.
+
+#### `get_third_dimension(encoded_string)`
+
+Returns the value corresponding to the third dimension encoded in the string. Possible values defined in the module are: `ABSENT`, `ALTITUDE`, `LEVEL`, `ELEVATION`, `CUSTOM1` and `CUSTOM2`
+
+#### Examples
+
+Example of decoding of a 2D polyline:
+
+```python
+import flexpolyline as fp
+
+print(fp.decode("BFoz5xJ67i1B1B7PzIhaxL7Y"))
+```
+
+**Output**:
+
+```
+[
+ (50.10228, 8.69821),
+ (50.10201, 8.69567),
+ (50.10063, 8.69150),
+ (50.09878, 8.68752)
+]
+```
+
+
+Example of decoding dicts from a 3D polyline:
+
+```python
+import flexpolyline as fp
+
+print(fp.dict_decode("BlBoz5xJ67i1BU1B7PUzIhaUxL7YU"))
+```
+
+**Output**:
+
+```
+[
+ {'lat': 50.10228, 'lng': 8.69821, 'alt': 10},
+ {'lat': 50.10201, 'lng': 8.69567, 'alt': 20},
+ {'lat': 50.10063, 'lng': 8.69150, 'alt': 30},
+ {'lat': 50.09878, 'lng': 8.68752, 'alt': 40}
+]
+```
+
+
+
+
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/flexpolyline/__init__.py
^
|
@@ -0,0 +1,44 @@
+# Copyright (C) 2019 HERE Europe B.V.
+# Licensed under MIT, see full license in LICENSE
+# SPDX-License-Identifier: MIT
+# License-Filename: LICENSE
+
+from .encoding import _dict_to_tuple, ABSENT, ALTITUDE, LEVEL, ELEVATION, CUSTOM1, CUSTOM2
+from .decoding import THIRD_DIM_MAP, get_third_dimension
+
+from .decoding import iter_decode
+from .encoding import encode
+
+
+def dict_encode(coordinates, precision=5, third_dim=ABSENT, third_dim_precision=0):
+ """Encode the sequence of coordinates dicts into a polyline string"""
+ return encode(
+ _dict_to_tuple(coordinates, third_dim),
+ precision=precision,
+ third_dim=third_dim,
+ third_dim_precision=third_dim_precision
+ )
+
+
+def decode(encoded):
+ """Return a list of coordinates. The number of coordinates are 2 or 3
+ depending on the polyline content."""
+ return list(iter_decode(encoded))
+
+
+def iter_dict_decode(encoded):
+ """Return an iterator over coordinates dicts. The dict contains always the keys 'lat', 'lng' and
+ depending on the polyline can contain a third key ('elv', 'lvl', 'alt', ...)."""
+ third_dim_key = THIRD_DIM_MAP[get_third_dimension(encoded)]
+ for row in iter_decode(encoded):
+ yield {
+ 'lat': row[0],
+ 'lng': row[1],
+ third_dim_key: row[2]
+ }
+
+
+def dict_decode(encoded):
+ """Return an list of coordinates dicts. The dict contains always the keys 'lat', 'lng' and
+ depending on the polyline can contain a third key ('elv', 'lvl' or 'alt')."""
+ return list(iter_dict_decode(encoded))
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/flexpolyline/decoding.py
^
|
@@ -0,0 +1,112 @@
+# Copyright (C) 2019 HERE Europe B.V.
+# Licensed under MIT, see full license in LICENSE
+# SPDX-License-Identifier: MIT
+# License-Filename: LICENSE
+
+from collections import namedtuple
+
+from .encoding import THIRD_DIM_MAP, FORMAT_VERSION
+
+__all__ = [
+ 'decode', 'dict_decode', 'iter_decode',
+ 'get_third_dimension', 'decode_header', 'PolylineHeader'
+]
+
+DECODING_TABLE = [
+ 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
+]
+
+
+PolylineHeader = namedtuple('PolylineHeader', 'precision,third_dim,third_dim_precision')
+
+
+def decode_header(decoder):
+ """Decode the polyline header from an `encoded_char`. Returns a PolylineHeader object."""
+ version = next(decoder)
+ if version != FORMAT_VERSION:
+ raise ValueError('Invalid format version')
+ value = next(decoder)
+ precision = value & 15
+ value >>= 4
+ third_dim = value & 7
+ third_dim_precision = (value >> 3) & 15
+ return PolylineHeader(precision, third_dim, third_dim_precision)
+
+
+def get_third_dimension(encoded):
+ """Return the third dimension of an encoded polyline.
+ Possible returned values are: ABSENT, LEVEL, ALTITUDE, ELEVATION, CUSTOM1, CUSTOM2."""
+ header = decode_header(decode_unsigned_values(encoded))
+ return header.third_dim
+
+
+def decode_char(char):
+ """Decode a single char to the corresponding value"""
+ char_value = ord(char)
+
+ try:
+ value = DECODING_TABLE[char_value - 45]
+ except IndexError:
+ raise ValueError('Invalid encoding')
+ if value < 0:
+ raise ValueError('Invalid encoding')
+ return value
+
+
+def to_signed(value):
+ """Decode the sign from an unsigned value"""
+ if value & 1:
+ value = ~value
+ value >>= 1
+ return value
+
+
+def decode_unsigned_values(encoded):
+ """Return an iterator over encoded unsigned values part of an `encoded` polyline"""
+ result = shift = 0
+
+ for char in encoded:
+ value = decode_char(char)
+
+ result |= (value & 0x1F) << shift
+ if (value & 0x20) == 0:
+ yield result
+ result = shift = 0
+ else:
+ shift += 5
+
+ if shift > 0:
+ raise ValueError('Invalid encoding')
+
+
+def iter_decode(encoded):
+ """Return an iterator over coordinates. The number of coordinates are 2 or 3
+ depending on the polyline content."""
+
+ last_lat = last_lng = last_z = 0
+ decoder = decode_unsigned_values(encoded)
+
+ header = decode_header(decoder)
+ factor_degree = 10.0 ** header.precision
+ factor_z = 10.0 ** header.third_dim_precision
+ third_dim = header.third_dim
+
+ while True:
+ try:
+ last_lat += to_signed(next(decoder))
+ except StopIteration:
+ return # sequence completed
+
+ try:
+ last_lng += to_signed(next(decoder))
+
+ if third_dim:
+ last_z += to_signed(next(decoder))
+ yield (last_lat / factor_degree, last_lng / factor_degree, last_z / factor_z)
+ else:
+ yield (last_lat / factor_degree, last_lng / factor_degree)
+ except StopIteration:
+ raise ValueError("Invalid encoding. Premature ending reached")
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/flexpolyline/encoding.py
^
|
@@ -0,0 +1,105 @@
+# Copyright (C) 2019 HERE Europe B.V.
+# Licensed under MIT, see full license in LICENSE
+# SPDX-License-Identifier: MIT
+# License-Filename: LICENSE
+
+from collections import namedtuple
+import warnings
+
+__all__ = ['ABSENT', 'LEVEL', 'ALTITUDE', 'ELEVATION', 'encode', 'dict_encode', 'THIRD_DIM_MAP']
+
+ENCODING_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
+
+FORMAT_VERSION = 1
+
+ABSENT = 0
+LEVEL = 1
+ALTITUDE = 2
+ELEVATION = 3
+# Reserved values 4 and 5 should not be selectable
+CUSTOM1 = 6
+CUSTOM2 = 7
+
+THIRD_DIM_MAP = {ALTITUDE: 'alt', ELEVATION: 'elv', LEVEL: 'lvl', CUSTOM1: 'cst1', CUSTOM2: 'cst2'}
+
+PolylineHeader = namedtuple('PolylineHeader', 'precision,third_dim,third_dim_precision')
+
+
+def encode_unsigned_varint(value, appender):
+ """Uses veriable integer encoding to encode an unsigned integer.
+ Returns the encoded string."""
+ while value > 0x1F:
+ pos = (value & 0x1F) | 0x20
+ appender(ENCODING_TABLE[pos])
+ value >>= 5
+ appender(ENCODING_TABLE[value])
+
+
+def encode_scaled_value(value, appender):
+ """Transform a integer `value` into a variable length sequence of characters.
+ `appender` is a callable where the produced chars will land to"""
+ negative = value < 0
+
+ value = value << 1
+ if negative:
+ value = ~value
+
+ encode_unsigned_varint(value, appender)
+
+
+def encode_header(appender, precision, third_dim, third_dim_precision):
+ """Encode the `precision`, `third_dim` and `third_dim_precision` into one
+ encoded char"""
+ if precision < 0 or precision > 15:
+ raise ValueError("precision out of range")
+ if third_dim_precision < 0 or third_dim_precision > 15:
+ raise ValueError("third_dim_precision out of range")
+ if third_dim < 0 or third_dim > 7:
+ raise ValueError("third_dim out of range")
+ if third_dim == 4 or third_dim == 5:
+ warnings.warn("Third dimension types 4 and 5 are reserved and should not be used "
+ "as meaning may change in the future")
+
+ res = (third_dim_precision << 7) | (third_dim << 4) | precision
+ encode_unsigned_varint(FORMAT_VERSION, appender)
+ encode_unsigned_varint(res, appender)
+
+
+def encode(coordinates, precision=5, third_dim=ABSENT, third_dim_precision=0):
+ """Encode a sequence of lat,lng or lat,lng(,{third_dim}).
+ `precision`: how many decimal digits of precision to store the latitude and longitude.
+ `third_dim`: type of the third dimension if present in the input.
+ `third_dim_precision`: how many decimal digits of precision to store the third dimension."""
+ multiplier_degree = 10 ** precision
+ multiplier_z = 10 ** third_dim_precision
+
+ last_lat = last_lng = last_z = 0
+
+ res = []
+ appender = res.append
+ encode_header(appender, precision, third_dim, third_dim_precision)
+
+ for location in coordinates:
+ lat = int(round(location[0] * multiplier_degree))
+ encode_scaled_value(lat - last_lat, appender)
+ last_lat = lat
+
+ lng = int(round(location[1] * multiplier_degree))
+ encode_scaled_value(lng - last_lng, appender)
+ last_lng = lng
+
+ if third_dim:
+ z = int(round(location[2] * multiplier_z))
+ encode_scaled_value(z - last_z, appender)
+ last_z = z
+
+ return ''.join(res)
+
+
+def _dict_to_tuple(coordinates, third_dim):
+ """Convert a sequence of dictionaries to a sequence of tuples"""
+ if third_dim:
+ third_dim_key = THIRD_DIM_MAP[third_dim]
+ return ((point['lat'], point['lng'], point[third_dim_key]) for point in coordinates)
+
+ return ((point['lat'], point['lng']) for point in coordinates)
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/setup.py
^
|
@@ -0,0 +1,41 @@
+from setuptools import setup
+from setuptools.command.sdist import sdist as _sdist
+import shutil
+from os import path
+import io
+
+this_directory = path.abspath(path.dirname(__file__))
+with io.open(path.join(this_directory, 'README.md'), encoding='utf-8') as f:
+ long_description = f.read()
+
+
+class sdist(_sdist):
+ def run(self):
+ shutil.copy('../LICENSE', 'LICENSE')
+ _sdist.run(self)
+
+
+setup(
+ name='flexpolyline',
+ description='Flexible Polyline encoding: a lossy compressed representation of a list of coordinate pairs or triples',
+ long_description=long_description,
+ long_description_content_type='text/markdown',
+ version='0.1.0',
+ author='HERE Europe B.V.',
+ url='https://here.com',
+ packages=['flexpolyline'],
+ # SPDX-License-Identifier: MIT
+ license='MIT',
+ classifiers=[
+ 'Intended Audience :: Developers',
+ 'Programming Language :: Python :: 2.7',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'License :: OSI Approved :: MIT License'
+ ],
+ project_urls={
+ 'Source': 'https://github.com/heremaps/flexible-polyline.git'
+ },
+ test_suite="test_flexpolyline",
+ cmdclass={'sdist': sdist}
+)
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/python/test_flexpolyline.py
^
|
@@ -0,0 +1,128 @@
+# Copyright (C) 2019 HERE Europe B.V.
+# Licensed under MIT, see full license in LICENSE
+# SPDX-License-Identifier: MIT
+# License-Filename: LICENSE
+
+import unittest
+
+import flexpolyline as fp
+
+
+class TestFlexPolyline(unittest.TestCase):
+ def test_encode1(self):
+ input = [
+ (50.1022829, 8.6982122),
+ (50.1020076, 8.6956695),
+ (50.1006313, 8.6914960),
+ (50.0987800, 8.6875156),
+ ]
+ res = fp.encode(input)
+ expected = "BFoz5xJ67i1B1B7PzIhaxL7Y"
+
+ self.assertEqual(res, expected)
+
+ def test_dict_encode(self):
+ input = [
+ {'lat': 50.1022829, 'lng': 8.6982122},
+ {'lat': 50.1020076, 'lng': 8.6956695},
+ {'lat': 50.1006313, 'lng': 8.6914960},
+ {'lat': 50.0987800, 'lng': 8.6875156}
+ ]
+ res = fp.dict_encode(input)
+ expected = "BFoz5xJ67i1B1B7PzIhaxL7Y"
+
+ self.assertEqual(res, expected)
+
+ def test_encode_alt(self):
+ input = [
+ (50.1022829, 8.6982122, 10),
+ (50.1020076, 8.6956695, 20),
+ (50.1006313, 8.6914960, 30),
+ (50.0987800, 8.6875156, 40),
+ ]
+ res = fp.encode(input, third_dim=fp.ALTITUDE)
+ expected = "BlBoz5xJ67i1BU1B7PUzIhaUxL7YU"
+
+ self.assertEqual(res, expected)
+
+ def test_encode2(self):
+ input = [
+ [52.5199356, 13.3866272],
+ [52.5100899, 13.2816896],
+ [52.4351807, 13.1935196],
+ [52.4107285, 13.1964502],
+ [52.38871, 13.1557798],
+ [52.3727798, 13.1491003],
+ [52.3737488, 13.1154604],
+ [52.3875198, 13.0872202],
+ [52.4029388, 13.0706196],
+ [52.4105797, 13.0755529],
+ ]
+
+ res = fp.encode(input)
+ expected = "BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e"
+
+ self.assertEqual(res, expected)
+
+ def assertAlmostEqualSequence(self, first, second, places=None):
+ for row1, row2 in zip(first, second):
+ for a, b in zip(row1, row2):
+ self.assertAlmostEqual(a, b, places=places)
+
+ def assertAlmostEqualDictSequence(self, first, second, places=None):
+ for row1, row2 in zip(first, second):
+ for k, a in row1.items():
+ self.assertAlmostEqual(a, row2[k], places=places)
+
+ def test_iter_decode1(self):
+ polyline = list(p for p in fp.iter_decode("BFoz5xJ67i1B1B7PzIhaxL7Y"))
+ expected = [
+ (50.10228, 8.69821),
+ (50.10201, 8.69567),
+ (50.10063, 8.69150),
+ (50.09878, 8.68752)
+ ]
+ self.assertAlmostEqualSequence(polyline, expected, places=7)
+
+ def test_iter_decode_fails(self):
+ with self.assertRaises(ValueError):
+ list(fp.iter_decode("BFoz5xJ67i1B1B7PzIhaxL7"))
+
+ with self.assertRaises(ValueError):
+ list(fp.iter_decode("CFoz5xJ67i1B1B7PzIhaxL7"))
+
+ def test_dict_decode(self):
+ polyline = fp.dict_decode("BlBoz5xJ67i1BU1B7PUzIhaUxL7YU")
+ expected = [
+ {'lat': 50.10228, 'lng': 8.69821, 'alt': 10},
+ {'lat': 50.10201, 'lng': 8.69567, 'alt': 20},
+ {'lat': 50.10063, 'lng': 8.69150, 'alt': 30},
+ {'lat': 50.09878, 'lng': 8.68752, 'alt': 40}
+ ]
+ self.assertAlmostEqualDictSequence(polyline, expected, places=7)
+
+ def test_iter_decode2(self):
+ polyline = list(fp.iter_decode("BF05xgKuy2xCx9B7vUl0OhnR54EqSzpEl-HxjD3pBiGnyGi2CvwFsgD3nD4vB6e"))
+ expected = [
+ (52.51994, 13.38663),
+ (52.51009, 13.28169),
+ (52.43518, 13.19352),
+ (52.41073, 13.19645),
+ (52.38871, 13.15578),
+ (52.37278, 13.14910),
+ (52.37375, 13.11546),
+ (52.38752, 13.08722),
+ (52.40294, 13.07062),
+ (52.41058, 13.07555),
+ ]
+ self.assertAlmostEqualSequence(polyline, expected, places=7)
+
+ def test_get_third_dimension(self):
+ self.assertEqual(fp.get_third_dimension("BFoz5xJ67i1BU"), fp.ABSENT)
+ self.assertEqual(fp.get_third_dimension("BVoz5xJ67i1BU"), fp.LEVEL)
+ self.assertEqual(fp.get_third_dimension("BlBoz5xJ67i1BU"), fp.ALTITUDE)
+ self.assertEqual(fp.get_third_dimension("B1Boz5xJ67i1BU"), fp.ELEVATION)
+
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/rust/Cargo.toml
^
|
@@ -0,0 +1,18 @@
+[package]
+name = "flexpolyline"
+version = "0.1.0"
+description = "Flexible Polyline encoding: a lossy compressed representation of a list of coordinate pairs or triples"
+authors = ["HERE Europe B.V."]
+repository = "https://github.com/heremaps/flexible-polyline.git"
+license = "MIT"
+keywords = ["polyline", "encoding"]
+edition = "2018"
+
+[dependencies]
+
+[dev-dependencies]
+rand = "0.6.5"
+
+[[bin]]
+name = "flexpolyline"
+path = "src/cli.rs"
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/rust/examples/random.rs
^
|
@@ -0,0 +1,70 @@
+//! Example which generates random polylines covering all possible cases.
+
+use rand::prelude::*;
+
+fn main() {
+ let mut rng = rand::thread_rng();
+ let range_lat = 180 * 10_i64.pow(15);
+ let range_lon = 90 * 10_i64.pow(15);
+ let range_z = 1000 * 10_i64.pow(14);
+ for &divisor in [
+ 1,
+ 10_i64.pow(4),
+ 10_i64.pow(8),
+ 10_i64.pow(12),
+ 10_i64.pow(17),
+ 10_i64.pow(18),
+ ]
+ .iter()
+ {
+ for num_coords in 1..5 {
+ for prec2d in 0..=15 {
+ for &type3d in [
+ flexpolyline::Type3d::Level,
+ flexpolyline::Type3d::Altitude,
+ flexpolyline::Type3d::Elevation,
+ flexpolyline::Type3d::Reserved1,
+ flexpolyline::Type3d::Reserved2,
+ flexpolyline::Type3d::Custom1,
+ flexpolyline::Type3d::Custom2,
+ ]
+ .iter()
+ {
+ let polyline = flexpolyline::Polyline::Data3d {
+ precision2d: flexpolyline::Precision::from_u32(prec2d).unwrap(),
+ precision3d: flexpolyline::Precision::from_u32(15 - prec2d).unwrap(),
+ type3d,
+ coordinates: (0..num_coords)
+ .map(|_| {
+ (
+ (rng.gen_range(-range_lat, range_lat) / divisor) as f64
+ / 10_i64.pow(15) as f64,
+ (rng.gen_range(-range_lon, range_lon) / divisor) as f64
+ / 10_i64.pow(15) as f64,
+ (rng.gen_range(-range_z, range_z) / divisor) as f64
+ / 10_i64.pow(14) as f64,
+ )
+ })
+ .collect(),
+ };
+ println!("{:.15}", polyline);
+ }
+
+ let polyline = flexpolyline::Polyline::Data2d {
+ precision2d: flexpolyline::Precision::from_u32(prec2d).unwrap(),
+ coordinates: (0..num_coords)
+ .map(|_| {
+ (
+ (rng.gen_range(-range_lat, range_lat) / divisor) as f64
+ / 10_i64.pow(15) as f64,
+ (rng.gen_range(-range_lon, range_lon) / divisor) as f64
+ / 10_i64.pow(15) as f64,
+ )
+ })
+ .collect(),
+ };
+ println!("{:.15}", polyline);
+ }
+ }
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/rust/src/cli.rs
^
|
@@ -0,0 +1,138 @@
+use std::io::BufRead;
+use std::str::FromStr;
+
+fn remove_decoration<'a>(x: &'a str, prefix: &str, suffix: &str) -> &'a str {
+ if !x.starts_with(prefix) || !x.ends_with(suffix) {
+ panic!("{}{} missing", prefix, suffix);
+ }
+ &x[prefix.len()..x.len() - suffix.len()]
+}
+
+fn from_str(data: &str) -> flexpolyline::Polyline {
+ let parse_precision = |x: Option<&str>| {
+ let prec_u32 = u32::from_str(x.expect("Precision missing"))
+ .unwrap_or_else(|e| panic!("Precision not parsable: {}", e));
+ flexpolyline::Precision::from_u32(prec_u32)
+ .unwrap_or_else(|| panic!("Precision outside of supported range: {}", prec_u32))
+ };
+ let parse_3d_type = |x: Option<&str>| {
+ let value_u32 = u32::from_str(x.expect("Type3d missing"))
+ .unwrap_or_else(|e| panic!("Type3d not parsable: {}", e));
+ match value_u32 {
+ 1 => flexpolyline::Type3d::Level,
+ 2 => flexpolyline::Type3d::Altitude,
+ 3 => flexpolyline::Type3d::Elevation,
+ 4 => flexpolyline::Type3d::Reserved1,
+ 5 => flexpolyline::Type3d::Reserved2,
+ 6 => flexpolyline::Type3d::Custom1,
+ 7 => flexpolyline::Type3d::Custom2,
+ _ => panic!("Unexpected 3d type: {}", value_u32),
+ }
+ };
+
+ let data = remove_decoration(data, "{", "}");
+ let mut split = data.split("; ");
+ let header = remove_decoration(split.next().expect("header not found"), "(", ")");
+ let mut components = header.split(", ");
+ let precision2d = parse_precision(components.next());
+ let result = match components.next() {
+ None => {
+ let data = remove_decoration(split.next().expect("data not found"), "[(", "), ]");
+ let coordinates = data
+ .split("), (")
+ .filter_map(|x| {
+ if x.is_empty() {
+ None
+ } else {
+ let mut coord = x.split(", ");
+ let lat = f64::from_str(coord.next().expect("Missing latitude"))
+ .unwrap_or_else(|e| panic!("latitude not parseable: {}", e));
+ let lon = f64::from_str(coord.next().expect("Missing longitude"))
+ .unwrap_or_else(|e| panic!("longitude not parseable: {}", e));
+ if let Some(trail) = coord.next() {
+ panic!("Too many components in 2d coordinate: {}", trail);
+ }
+ Some((lat, lon))
+ }
+ })
+ .collect();
+ flexpolyline::Polyline::Data2d {
+ precision2d,
+ coordinates,
+ }
+ }
+ Some(precision) => {
+ let precision3d = parse_precision(Some(precision));
+ let type3d = parse_3d_type(components.next());
+ if let Some(trail) = components.next() {
+ panic!("Too many components in header: {}", trail);
+ }
+
+ let data = remove_decoration(split.next().expect("data not found"), "[(", "), ]");
+ let coordinates = data
+ .split("), (")
+ .filter_map(|x| {
+ if x.is_empty() {
+ None
+ } else {
+ let mut coord = x.split(", ");
+ let lat = f64::from_str(coord.next().expect("Missing latitude"))
+ .unwrap_or_else(|e| panic!("latitude not parseable: {}", e));
+ let lon = f64::from_str(coord.next().expect("Missing longitude"))
+ .unwrap_or_else(|e| panic!("longitude not parseable: {}", e));
+ let z = f64::from_str(coord.next().expect("Missing 3d component"))
+ .unwrap_or_else(|e| panic!("3d component not parseable: {}", e));
+ if let Some(trail) = coord.next() {
+ panic!("Too many components in 3d coordinate: {}", trail);
+ }
+ Some((lat, lon, z))
+ }
+ })
+ .collect();
+ flexpolyline::Polyline::Data3d {
+ precision2d,
+ precision3d,
+ type3d,
+ coordinates,
+ }
+ }
+ };
+
+ if let Some(trail) = components.next() {
+ panic!("Too many components in data: {}", trail);
+ }
+
+ result
+}
+
+fn main() {
+ let args: Vec<String> = std::env::args().collect();
+ if args.len() != 2 || (args[1] != "encode" && args[1] != "decode") {
+ eprintln!("Usage: flexpolyline encode|decode");
+ eprintln!(" input: stdin");
+ eprintln!(" output: stdout");
+ std::process::exit(1);
+ }
+
+ let stdin = std::io::stdin();
+
+ if args[1] == "encode" {
+ for line in stdin.lock().lines() {
+ let input = line.unwrap();
+ let polyline = from_str(&input);
+ println!(
+ "{}",
+ polyline
+ .encode()
+ .unwrap_or_else(|e| panic!("Failed to encode {}: {}", input, e))
+ );
+ }
+ } else {
+ for line in stdin.lock().lines() {
+ let input = line.unwrap();
+ let polyline = flexpolyline::Polyline::decode(&input)
+ .unwrap_or_else(|e| panic!("Failed to decode {}: {}", input, e));
+ println!("{:.15}", polyline);
+ }
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/rust/src/lib.rs
^
|
@@ -0,0 +1,823 @@
+//! # Flexible Polyline encoding
+//!
+//! The flexible polyline encoding is a lossy compressed representation of a list of coordinate
+//! pairs or coordinate triples. It achieves that by:
+//!
+//! 1. Reducing the decimal digits of each value.
+//! 2. Encoding only the offset from the previous point.
+//! 3. Using variable length for each coordinate delta.
+//! 4. Using 64 URL-safe characters to display the result.
+//!
+//! The encoding is a variant of [Encoded Polyline Algorithm Format]. The advantage of this encoding
+//! over the original are the following:
+//!
+//! * Output string is composed by only URL-safe characters, i.e. may be used without URL encoding
+//! as query parameters.
+//! * Floating point precision is configurable: This allows to represent coordinates with precision
+//! up to microns (5 decimal places allow meter precision only).
+//! * It allows to encode a 3rd dimension with a given precision, which may be a level, altitude,
+//! elevation or some other custom value.
+//!
+//! ## Specification
+//!
+//! See [Specification].
+//!
+//! [Encoded Polyline Algorithm Format]: https://developers.google.com/maps/documentation/utilities/polylinealgorithm
+//! [Specification]: https://github.com/heremaps/flexible-polyline#specifications
+//!
+//! ## Example
+//!
+//! ```rust
+//! use flexpolyline::{Polyline, Precision};
+//!
+//! // encode
+//! let coordinates = vec![
+//! (50.1022829, 8.6982122),
+//! (50.1020076, 8.6956695),
+//! (50.1006313, 8.6914960),
+//! (50.0987800, 8.6875156),
+//! ];
+//!
+//! let polyline = Polyline::Data2d {
+//! coordinates,
+//! precision2d: Precision::Digits5,
+//! };
+//!
+//! let encoded = polyline.encode().unwrap();
+//! assert_eq!(encoded, "BFoz5xJ67i1B1B7PzIhaxL7Y");
+//!
+//! // decode
+//! let decoded = Polyline::decode("BFoz5xJ67i1B1B7PzIhaxL7Y").unwrap();
+//! assert_eq!(
+//! decoded,
+//! Polyline::Data2d {
+//! coordinates: vec![
+//! (50.10228, 8.69821),
+//! (50.10201, 8.69567),
+//! (50.10063, 8.69150),
+//! (50.09878, 8.68752)
+//! ],
+//! precision2d: Precision::Digits5
+//! }
+//! );
+//! ```
+
+#![doc(html_playground_url = "https://play.rust-lang.org/")]
+#![deny(warnings, missing_docs)]
+#![allow(clippy::unreadable_literal)]
+
+/// Coordinate precision in the polyline
+///
+/// Represents how many digits are to be encoded after the decimal point, e.g.
+/// precision 3 would encode 4.456787 as 4.457.
+///
+/// Supported values: `[0,16)`
+#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
+pub enum Precision {
+ /// 0 decimal digits
+ Digits0 = 0,
+ /// 1 decimal digits
+ Digits1 = 1,
+ /// 2 decimal digits
+ Digits2 = 2,
+ /// 3 decimal digits
+ Digits3 = 3,
+ /// 4 decimal digits
+ Digits4 = 4,
+ /// 5 decimal digits
+ Digits5 = 5,
+ /// 6 decimal digits
+ Digits6 = 6,
+ /// 7 decimal digits
+ Digits7 = 7,
+ /// 8 decimal digits
+ Digits8 = 8,
+ /// 9 decimal digits
+ Digits9 = 9,
+ /// 10 decimal digits
+ Digits10 = 10,
+ /// 11 decimal digits
+ Digits11 = 11,
+ /// 12 decimal digits
+ Digits12 = 12,
+ /// 13 decimal digits
+ Digits13 = 13,
+ /// 14 decimal digits
+ Digits14 = 14,
+ /// 15 decimal digits
+ Digits15 = 15,
+}
+
+impl Precision {
+ /// Converts `u32` to precision.
+ pub fn from_u32(digits: u32) -> Option<Precision> {
+ match digits {
+ 0 => Some(Precision::Digits0),
+ 1 => Some(Precision::Digits1),
+ 2 => Some(Precision::Digits2),
+ 3 => Some(Precision::Digits3),
+ 4 => Some(Precision::Digits4),
+ 5 => Some(Precision::Digits5),
+ 6 => Some(Precision::Digits6),
+ 7 => Some(Precision::Digits7),
+ 8 => Some(Precision::Digits8),
+ 9 => Some(Precision::Digits9),
+ 10 => Some(Precision::Digits10),
+ 11 => Some(Precision::Digits11),
+ 12 => Some(Precision::Digits12),
+ 13 => Some(Precision::Digits13),
+ 14 => Some(Precision::Digits14),
+ 15 => Some(Precision::Digits15),
+ _ => None,
+ }
+ }
+
+ /// Converts precision to `u32`.
+ pub fn to_u32(self) -> u32 {
+ self as u32
+ }
+}
+
+/// Informs about the type of the 3rd dimension of a 3D coordinate vector
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum Type3d {
+ /// E.g. floor of a building
+ Level = 1,
+ /// E.g. altitude (in the air) relative to ground level or mean sea level
+ Altitude = 2,
+ /// E.g. elevation above mean-sea-level
+ Elevation = 3,
+ /// Reserved for future types
+ Reserved1 = 4,
+ /// Reserved for future types
+ Reserved2 = 5,
+ /// Reserved for custom types
+ Custom1 = 6,
+ /// Reserved for custom types
+ Custom2 = 7,
+}
+
+/// 2- or 3-dimensional polyline
+#[derive(Debug, Clone, PartialEq)]
+pub enum Polyline {
+ /// 2-dimensional polyline
+ Data2d {
+ /// List of 2D coordinates making up this polyline
+ coordinates: Vec<(f64, f64)>,
+ /// Precision of the coordinates (e.g. used for encoding,
+ /// or to report the precision supplied in encoded data)
+ precision2d: Precision,
+ },
+ /// 3-dimensional polyline
+ Data3d {
+ /// List of 3D coordinates making up this polyline
+ coordinates: Vec<(f64, f64, f64)>,
+ /// Precision of the 2D part of the coordinates (e.g. used for encoding,
+ /// or to report the precision supplied in encoded data)
+ precision2d: Precision,
+ /// Precision of the 3D part of the coordinates (e.g. used for encoding,
+ /// or to report the precision supplied in encoded data)
+ precision3d: Precision,
+ /// Type of the 3D component
+ type3d: Type3d,
+ },
+}
+
+impl std::fmt::Display for Polyline {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ let prec = f.precision().unwrap_or(6);
+ match self {
+ Polyline::Data2d {
+ coordinates,
+ precision2d,
+ } => {
+ write!(f, "{{({}); [", precision2d.to_u32())?;
+ for coord in coordinates {
+ write!(
+ f,
+ "({:.*}, {:.*}), ",
+ prec as usize, coord.0, prec as usize, coord.1
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/test/original.txt
^
|
@@ -0,0 +1,3072 @@
+{(0, 15, 1); [(-96.628241002595274, 34.155307026461529, 228.390420353746407), ]}
+{(0, 15, 2); [(150.300518642964391, 45.699041698644933, -361.514615703930417), ]}
+{(0, 15, 3); [(106.956263816231854, 12.147560121864949, 590.877724345333036), ]}
+{(0, 15, 4); [(-88.122844295135991, 48.343773002135315, -724.072266325115038), ]}
+{(0, 15, 5); [(91.414950703190613, -41.235760053174971, -749.020580897311334), ]}
+{(0, 15, 6); [(-109.077048572005779, 74.320491640072319, 198.648082139788812), ]}
+{(0, 15, 7); [(-172.232870422800261, -82.237076952576828, -936.782939718311809), ]}
+{(0); [(-76.282695518610637, 74.280950984373561), ]}
+{(1, 14, 1); [(35.532078876193232, 89.050085485636274, 110.656668458282184), ]}
+{(1, 14, 2); [(-165.927462204818653, 79.089659033891692, 932.043507695096537), ]}
+{(1, 14, 3); [(40.318402005897994, -16.143284758549907, -795.325547749692760), ]}
+{(1, 14, 4); [(7.894036383711107, 88.949339370979274, 610.604874031274676), ]}
+{(1, 14, 5); [(-166.965014582129299, 82.615874365610182, 535.405899632264777), ]}
+{(1, 14, 6); [(-6.515207605925003, 71.150562298137260, -148.786816375532993), ]}
+{(1, 14, 7); [(109.715185049749550, -19.948568919695116, 292.387963103321056), ]}
+{(1); [(37.200320240246342, 57.110721491493983), ]}
+{(2, 13, 1); [(-100.534369033144756, -20.093735677798552, -783.570854149396951), ]}
+{(2, 13, 2); [(153.356565614211604, -67.791498310127338, -71.666489238810925), ]}
+{(2, 13, 3); [(126.183787025309357, 17.196047502127637, 666.522159882170172), ]}
+{(2, 13, 4); [(120.666210832455903, 40.169464189660602, 774.608401787319053), ]}
+{(2, 13, 5); [(-102.959016344911049, -21.646800211506307, -363.331171055102232), ]}
+{(2, 13, 6); [(101.384118587733454, 73.593367247399357, 801.595032687253479), ]}
+{(2, 13, 7); [(76.987276614616491, -62.652395192797968, -968.711536031164428), ]}
+{(2); [(-109.581461924700122, 19.822799248906414), ]}
+{(3, 12, 1); [(161.613535696658147, 31.370207283075224, 177.188143335314322), ]}
+{(3, 12, 2); [(-55.197497574151846, -71.268846763139166, -669.071372916466544), ]}
+{(3, 12, 3); [(111.209212706272467, -19.115718125068248, 556.410372880436853), ]}
+{(3, 12, 4); [(-7.841931973344585, 59.678242280352158, -866.037011797579567), ]}
+{(3, 12, 5); [(32.100745807577866, 13.680789924366293, -134.727188820344963), ]}
+{(3, 12, 6); [(-64.514059788523056, 34.932231320350454, -100.359269124402957), ]}
+{(3, 12, 7); [(-77.008539907608309, 59.170150987036358, -937.595069785072269), ]}
+{(3); [(-163.229523092621378, -46.962410782515256), ]}
+{(4, 11, 1); [(24.753622583183446, -52.970715095406327, -221.700311200019399), ]}
+{(4, 11, 2); [(-87.558724373064450, -2.271308532036607, -637.761106536972875), ]}
+{(4, 11, 3); [(35.411948511034815, -75.316464466821770, 804.016272290001893), ]}
+{(4, 11, 4); [(93.840536265980830, -41.533823826789096, -929.889005107380285), ]}
+{(4, 11, 5); [(159.418708381420117, 76.896832822807170, 58.025323505583287), ]}
+{(4, 11, 6); [(-15.819879767143824, 49.875838506803433, -856.212513040321710), ]}
+{(4, 11, 7); [(-5.832798552913143, -87.347200603388586, -713.729371309818134), ]}
+{(4); [(-75.180517431889086, 37.029458752565326), ]}
+{(5, 10, 1); [(-7.878946976199580, 83.812374167500010, 107.149447130154556), ]}
+{(5, 10, 2); [(157.096398701794215, -83.593245667122446, -246.103388527295238), ]}
+{(5, 10, 3); [(6.894932590339783, -16.158493864880466, 201.380364007271368), ]}
+{(5, 10, 4); [(-154.768899642536581, -9.018931421316752, 101.319675829294241), ]}
+{(5, 10, 5); [(-1.871232107407420, -65.574203823513116, 416.407619455104452), ]}
+{(5, 10, 6); [(-124.411226378108623, -76.537476566508332, -810.010750486570714), ]}
+{(5, 10, 7); [(-142.460643394880947, 79.870635361368983, -807.947901059707078), ]}
+{(5); [(119.947159802476222, -52.208475199290874), ]}
+{(6, 9, 1); [(-26.148086981613726, 56.308255057609301, 113.601667564576715), ]}
+{(6, 9, 2); [(34.191388182135434, -52.276788891512886, 25.084041952992660), ]}
+{(6, 9, 3); [(160.095272020113413, 89.201216798231215, -439.178377158330647), ]}
+{(6, 9, 4); [(-160.207469213211454, -15.410795983709567, -268.797752511670808), ]}
+{(6, 9, 5); [(-132.625309660997146, -44.764879822567309, -541.302744538057027), ]}
+{(6, 9, 6); [(-74.103587830603075, 54.949530801929107, -486.645581944912237), ]}
+{(6, 9, 7); [(1.732009768188307, -39.518620194550273, 499.114024771784216), ]}
+{(6); [(-27.095124980457143, -61.510271081920322), ]}
+{(7, 8, 1); [(-87.279298617358108, -89.300717772025195, -33.019102623076627), ]}
+{(7, 8, 2); [(-99.359727801017428, -79.421503415185242, 734.002529671537104), ]}
+{(7, 8, 3); [(-32.735042261558348, 20.590074239127972, 726.544831938664515), ]}
+{(7, 8, 4); [(-60.910613407320639, -9.769338841762508, 383.981879465606539), ]}
+{(7, 8, 5); [(-34.708648938662158, 53.314298151947746, 962.573549971052444), ]}
+{(7, 8, 6); [(-71.569464498349149, -76.340744574407083, 619.388478041713938), ]}
+{(7, 8, 7); [(-10.086054341343225, 64.205687093103023, -528.165943410145701), ]}
+{(7); [(6.784728543294822, 82.742761879739291), ]}
+{(8, 7, 1); [(16.489797476721076, -64.927545206003813, 255.572505539681174), ]}
+{(8, 7, 2); [(-40.761273496142046, 10.594928803903974, -799.445602949225076), ]}
+{(8, 7, 3); [(33.556037851081570, -51.341034445067663, 34.473165013522760), ]}
+{(8, 7, 4); [(132.004110141999462, -43.186010498043366, -535.235927478138024), ]}
+{(8, 7, 5); [(77.125067943873375, -32.613762709700055, -606.003542938226360), ]}
+{(8, 7, 6); [(110.796073825925035, -76.845306756959360, 489.682805692010731), ]}
+{(8, 7, 7); [(-69.576440949331172, 67.501347940522834, 685.321670761315090), ]}
+{(8); [(20.667478126196759, 12.116174240455580), ]}
+{(9, 6, 1); [(173.224834270081629, -51.578559541868223, 623.070742746266887), ]}
+{(9, 6, 2); [(-118.527232502817554, -66.851689448439387, -415.316753649318059), ]}
+{(9, 6, 3); [(-112.215186359834448, -0.812381528064743, 842.973482381957638), ]}
+{(9, 6, 4); [(-65.468443331005844, -13.450836141334577, 597.300675027520356), ]}
+{(9, 6, 5); [(144.509416900509336, -39.665513389747908, -392.197113019916799), ]}
+{(9, 6, 6); [(-69.905059627125397, -83.680819821340037, 725.549343817732620), ]}
+{(9, 6, 7); [(-107.097325769754121, 13.544733919664980, -414.603134879089851), ]}
+{(9); [(50.851824285808114, 6.880171876247154), ]}
+{(10, 5, 1); [(-37.135035136398344, -39.346646961365749, -542.987427065888596), ]}
+{(10, 5, 2); [(129.503261242409309, -29.370103596657327, 484.249990512666727), ]}
+{(10, 5, 3); [(-173.256619409991231, 56.834477302004707, 578.882615898150789), ]}
+{(10, 5, 4); [(-146.591328141696124, -52.162241089509259, -345.427992572313656), ]}
+{(10, 5, 5); [(-144.694461896215330, 42.763053307514831, 246.874302664048315), ]}
+{(10, 5, 6); [(-93.607661635208089, -77.341891258559258, -839.487949345803372), ]}
+{(10, 5, 7); [(23.515850799893183, 48.739804947977760, 905.684927530613095), ]}
+{(10); [(-88.783815707707205, 88.123684034320831), ]}
+{(11, 4, 1); [(175.148632289828754, 43.959191624344321, 279.023829409503207), ]}
+{(11, 4, 2); [(-2.237542376406492, -35.986508821356843, 171.173238314680162), ]}
+{(11, 4, 3); [(-29.512716639792139, 13.623026563367068, -765.759667905632796), ]}
+{(11, 4, 4); [(-54.735036244983014, -52.877854342188151, -273.318059454920899), ]}
+{(11, 4, 5); [(-96.013681408666898, -88.059118406517001, 581.416258928715365), ]}
+{(11, 4, 6); [(10.455724682201591, -59.009674269408819, -940.564549788127806), ]}
+{(11, 4, 7); [(-52.250029876112080, -44.734401443227576, 877.009934375994362), ]}
+{(11); [(35.616724674491238, 31.656018035805754), ]}
+{(12, 3, 1); [(-7.954060127208753, -64.010331940757197, 419.369561997797462), ]}
+{(12, 3, 2); [(-51.529087858547150, 27.663975936351733, -910.494251448574232), ]}
+{(12, 3, 3); [(59.040678317232675, -21.197115442636552, -210.030356134436317), ]}
+{(12, 3, 4); [(-112.957807915581114, -33.449756022350776, 312.938859251515339), ]}
+{(12, 3, 5); [(-72.215870433248895, 38.388199808396777, 747.123041537688323), ]}
+{(12, 3, 6); [(28.592997699028285, 52.361601084704141, -566.586902917139810), ]}
+{(12, 3, 7); [(-170.232549469861908, 73.382415590820457, 261.423927903178708), ]}
+{(12); [(-29.665067942120562, -20.412152002233249), ]}
+{(13, 2, 1); [(-131.621985186306603, -65.267762693484613, -385.999935419573035), ]}
+{(13, 2, 2); [(-91.890052577664576, 20.137457325144211, 488.298223642837172), ]}
+{(13, 2, 3); [(-139.743585019239532, -49.282042380237797, 246.559156019025437), ]}
+{(13, 2, 4); [(172.415186312622438, 57.431117466215746, 251.212490513077427), ]}
+{(13, 2, 5); [(-100.479328676662590, 53.623915449344913, -238.069633554504236), ]}
+{(13, 2, 6); [(-84.247830267599539, -20.577165104563800, 832.470538382848190), ]}
+{(13, 2, 7); [(-123.208011265460158, 71.824748887910005, -241.402867650956551), ]}
+{(13); [(-8.704623797530385, 13.930760827451456), ]}
+{(14, 1, 1); [(-116.587183775328256, -29.339494325922178, 787.315969918452765), ]}
+{(14, 1, 2); [(35.150216672546385, 52.714056356926314, 120.751166246460642), ]}
+{(14, 1, 3); [(8.302900345920431, -48.479828042241522, 256.296195829319458), ]}
+{(14, 1, 4); [(-145.880403486020413, 78.411604422157509, -589.149596746693760), ]}
+{(14, 1, 5); [(-68.582021592287958, -55.175318276001875, 726.159353549564912), ]}
+{(14, 1, 6); [(118.927628999217660, 18.732775893467043, 151.656887056446237), ]}
+{(14, 1, 7); [(115.334108065899485, 88.999630466034446, 624.106150893530753), ]}
+{(14); [(88.897075386144110, 32.870126294368994), ]}
+{(15, 0, 1); [(-124.913415557445830, 17.817284375950933, -137.355681454931727), ]}
+{(15, 0, 2); [(-146.864263375333536, -62.492281108997147, 708.472313070586438), ]}
+{(15, 0, 3); [(-39.267910031467096, -9.620616147069011, 599.566078946259381), ]}
+{(15, 0, 4); [(-144.820257983099737, 64.838603772210433, 910.399823203559095), ]}
+{(15, 0, 5); [(-164.868873394778291, 77.065657465639489, -610.977518004380954), ]}
+{(15, 0, 6); [(112.172857518170289, -1.407572730255838, 101.251865999278820), ]}
+{(15, 0, 7); [(171.861535899958028, 36.145261162701601, 943.902386572852606), ]}
+{(15); [(46.904312427053810, 34.963862600094707), ]}
+{(0, 15, 1); [(-5.281988541537555, -41.114856704856031, 361.708448353905908), (176.025561158535936, -14.061835277132053, -107.564622060807480), ]}
+{(0, 15, 2); [(78.603352143729950, -21.917964970892399, 117.695341434458300), (-120.924389397580001, 64.559247951370892, -628.961479383289088), ]}
+{(0, 15, 3); [(46.379119660609817, -19.296530661393128, -123.623715095231844), (-29.545731933317647, 83.612539281371951, 980.677685274976625), ]}
+{(0, 15, 4); [(68.688899101362964, -11.684948094164424, 430.163254796638057), (84.487917118940516, -12.758423751755510, 679.003308436807629), ]}
+{(0, 15, 5); [(-114.550796774290802, 42.374287882565241, 519.359752710566909), (44.227485971747534, 48.850041981939633, 90.796498009738059), ]}
+{(0, 15, 6); [(104.766594857416564, -85.471309603203792, 16.140331121891030), (-108.418859461517101, 23.371480437974519, -448.870417901860094), ]}
+{(0, 15, 7); [(28.315629770287167, -85.368133078466727, 235.411676264766868), (-155.685049452358925, 3.341250739290166, -424.259027395042324), ]}
+{(0); [(132.214677475033511, -66.776980042797163), (37.889281642819697, 61.887826478033347), ]}
+{(1, 14, 1); [(-69.539056196509634, 20.299259491346461, 467.225670906984419), (-71.501057769222157, 25.351269369832853, 983.755462977823527), ]}
+{(1, 14, 2); [(-81.145216037508931, 57.073390671625937, 886.094239602465336), (118.196916181782782, 41.556977072943326, -705.783532627241016), ]}
+{(1, 14, 3); [(-65.037959724826933, -40.712258531585043, -112.080135125796446), (-53.753639899751619, -43.926010407443641, -154.360805343933521), ]}
+{(1, 14, 4); [(39.960960734211270, 71.600540709478835, -213.685311617196163), (-110.207659886184615, 7.689449439741475, -467.374994852750092), ]}
+{(1, 14, 5); [(3.229395664953045, 13.296389755971580, 675.195570535907564), (168.175202959248026, 68.500705269421715, -470.658622832800177), ]}
+{(1, 14, 6); [(129.569676906443846, -82.013663987750434, -848.764052731434731), (-102.476976052111127, 0.255678282114429, -373.610514054078806), ]}
+{(1, 14, 7); [(-19.650789922697637, 29.670823439673384, -512.300814618991467), (-45.750986062113697, 89.424829383118137, 22.731626716685081), ]}
+{(1); [(149.681808898699842, -69.560221515153316), (29.114439949336784, -44.981973784352171), ]}
+{(2, 13, 1); [(-103.821930349328554, 9.864718114682931, -603.138584904996719), (-124.196015086159932, 62.415521182317825, 274.871067222638146), ]}
+{(2, 13, 2); [(143.041200686576445, -75.835448320554420, 717.413592862660039), (-70.009720105412271, 3.411495837274359, 616.398249487439216), ]}
+{(2, 13, 3); [(-61.598289426571107, 67.386897961832986, 758.787262266232688), (35.749623661823705, 69.951638325963515, 83.411681304012447), ]}
+{(2, 13, 4); [(41.622765091257861, -55.666296995940051, 314.423563957637271), (-165.187296330744402, 72.582980139185295, -119.721413860354644), ]}
+{(2, 13, 5); [(-118.933786732344970, 69.127232151800158, 265.366117504635383), (0.731751415019795, -32.056460304231528, 667.241240638668728), ]}
+{(2, 13, 6); [(-99.228047797147056, 14.201744473714218, 203.195078741524156), (-176.432519957501739, 79.028779786997703, -154.062085678639846), ]}
+{(2, 13, 7); [(88.229721832730149, 72.038561806726406, 821.728559501759150), (37.694624083332016, -73.217114480353558, -347.645370065438897), ]}
+{(2); [(-66.275326313079987, -17.660111773857061), (52.022628249768211, 13.582720543304470), ]}
+{(3, 12, 1); [(124.436150247112863, -81.691528160076047, 976.922106395031165), (146.855045145332156, 46.256553669847008, -642.932785872019849), ]}
+{(3, 12, 2); [(-174.853653719726424, 73.645074324358902, -916.594161748391343), (-139.497392955125406, 23.313791692627465, 655.470405937408600), ]}
+{(3, 12, 3); [(71.255248796512092, -73.734400890016204, -769.885117253900148), (68.209763421345045, -31.423387380538490, -375.388784214021541), ]}
+{(3, 12, 4); [(-6.775820588971461, -50.538859843709581, -834.860701015706582), (-41.729641330392241, -68.435792169961474, -983.572709529895974), ]}
+{(3, 12, 5); [(51.221373395389925, -50.935174071693581, -401.088703661065438), (61.972907176496577, -31.677130482579749, -267.935824724194902), ]}
+{(3, 12, 6); [(98.576980163486525, -77.416618818625309, -260.218528743022546), (72.456475002035660, 50.592249946112702, -575.994655497068038), ]}
+{(3, 12, 7); [(-179.493437603915453, -16.852580154113440, -599.587980511548039), (-134.229075661150745, -14.346374505872619, -892.926313462668759), ]}
+{(3); [(165.472694453095642, 7.243176242909896), (18.112616866291631, 35.866295989851054), ]}
+{(4, 11, 1); [(-87.671400031613814, 12.858706262441151, -712.533747708726992), (172.154124166334185, -38.863488964490102, -264.682021094514255), ]}
+{(4, 11, 2); [(-129.384047614336595, 58.276997003123512, -291.863359028298873), (-169.315567574947380, 40.673511990317195, 398.562329870692906), ]}
+{(4, 11, 3); [(166.685721881098402, 64.337074265355596, 175.201704576958093), (-50.591735494865667, 24.444804906377257, 536.689308441488038), ]}
+{(4, 11, 4); [(151.356231717525588, 86.418271905199603, 558.059403676007946), (122.263886413140369, -27.195533226921786, 818.860656393687691), ]}
+{(4, 11, 5); [(60.622771796628577, -50.801400011907752, 778.957509113489095), (82.897430533989819, -44.751907855465888, -940.753864567030746), ]}
+{(4, 11, 6); [(-62.667732627123854, 88.487441695174596, 231.787305534397916), (138.048266917993402, -74.972228616289939, 144.396211112136854), ]}
+{(4, 11, 7); [(37.904376517699411, -5.807287201333986, -817.703847733561588), (-10.408777966961196, 46.988492654314079, 134.633188873913269), ]}
+{(4); [(-144.411292506733787, 62.683688039308635), (-18.898632487155016, 6.684886636855388), ]}
+{(5, 10, 1); [(-72.284653034103300, -43.142672933869761, 643.120880325906114), (63.594559069466690, -0.892159512243762, -42.832984223960402), ]}
+{(5, 10, 2); [(-95.700587834242128, 53.578009338674399, 188.728215120377513), (-4.862448721917774, -32.400114757829122, -257.594550122216049), ]}
+{(5, 10, 3); [(-16.132693236097733, 11.849715779370724, 492.240797792210572), (164.715360051938774, 86.422572439550606, 331.196353159896262), ]}
+{(5, 10, 4); [(127.251380682387136, -33.886183346445591, -685.433826579208926), (155.042691436176170, -56.327045705299646, 473.747114781375842), ]}
+{(5, 10, 5); [(-45.580504239237456, -41.394981232853802, 374.279795723435768), (-102.532794287953834, -55.783574615201637, -779.885864589509083), ]}
+{(5, 10, 6); [(-85.376605968898161, 85.449706953289549, 797.101019441713788), (-158.111493612888665, 16.250392420279542, -683.673245703708403), ]}
+{(5, 10, 7); [(157.908727827374776, 64.218502564859733, -405.599320725710811), (150.226271246503359, 62.333437303128726, -662.788375223859816), ]}
+{(5); [(95.694086775679722, -5.655996012684942), (39.173551549870410, -68.113070328939969), ]}
+{(6, 9, 1); [(-147.371211947239743, -65.049168824962763, 764.500844040380912), (-38.258934722054335, -76.712638278472667, -635.131326681851078), ]}
+{(6, 9, 2); [(129.412317845892375, -68.617121595604985, -437.125494457948719), (-105.316655402342079, 80.068516293954474, 839.973604076362562), ]}
+{(6, 9, 3); [(117.001905491142139, 4.357320119584757, 604.595359987628285), (-50.091004696729470, -9.487428122417276, 393.505968482784226), ]}
+{(6, 9, 4); [(172.858653577268512, -46.982397481902339, -258.658795752392280), (-58.968618622987030, 86.742089515642036, -180.715148883055150), ]}
+{(6, 9, 5); [(-104.102921612490178, 74.910601424215812, -682.158035245527003), (-56.638961570136040, 68.357586754545494, 449.473777800551545), ]}
+{(6, 9, 6); [(167.420675137956806, 11.951025038199354, -528.985294826950621), (-68.018858864348914, 3.467420883670883, -179.206823620193546), ]}
+{(6, 9, 7); [(145.332322008775975, 59.913396057276664, 978.339917104886922), (-141.030432247982162, 89.245015216281075, 993.450596647692919), ]}
+{(6); [(106.225813374984838, -15.354350974101312), (162.440475705944777, -64.563201585861947), ]}
+{(7, 8, 1); [(128.651322453124777, -49.864493308130662, 119.050213555547899), (-29.753112311495400, 35.322063970922109, -665.423344218057991), ]}
+{(7, 8, 2); [(97.547068841330656, -85.426051803857931, -940.055633293436472), (-75.442530394492678, -13.587594384170760, 885.333428725200179), ]}
+{(7, 8, 3); [(-19.005702474230816, 64.577576762518603, 577.154229667134018), (37.039072360483097, 27.000987945543010, -517.013614995667126), ]}
+{(7, 8, 4); [(172.902740522751770, 2.989475970876025, 74.013731128940378), (-23.460601970227568, 25.541405620671881, 134.082122354894437), ]}
+{(7, 8, 5); [(-92.133890299876441, 38.370960439627495, 719.964168066951061), (-118.982805429407165, -24.778047530882223, -905.949539406284998), ]}
+{(7, 8, 6); [(18.878961777693217, 42.660064137575077, -333.742181155090691), (-133.305168199304859, -20.854327650793287, 879.367146163586995), ]}
+{(7, 8, 7); [(-15.188042386987528, -0.756051192202890, -688.297359799521132), (-80.548968037455822, 86.949077532596576, 745.863082352914716), ]}
+{(7); [(-91.794220113760929, 41.681522484079451), (-139.096931242954696, 78.328906900237868), ]}
+{(8, 7, 1); [(-89.139280419448724, -20.414106976611190, -713.981716692297482), (161.607705817336267, -62.950260955909883, -472.053403299977788), ]}
+{(8, 7, 2); [(-72.391130216584614, 75.844741536016315, 593.547143820526003), (53.992365204543411, -52.668221225499138, 71.938582611965245), ]}
+{(8, 7, 3); [(-26.448574186099112, -48.938803453475629, 170.612429360267527), (93.072003794029257, 55.484355313717813, 667.976624272707568), ]}
+{(8, 7, 4); [(114.626329310321523, 66.435589560659537, -860.515886164161770), (-153.329184943944824, -88.829935899967580, -13.796511315491189), ]}
+{(8, 7, 5); [(56.123883691847098, -62.660666015682636, 476.085172366256018), (-106.094184683698003, -6.997272374685162, 90.583369576555398), ]}
+{(8, 7, 6); [(133.447773146652167, -40.709803213511258, -241.707502349346669), (-118.205646746202689, -71.518740650368727, -51.963188616761670), ]}
+{(8, 7, 7); [(1.245825072460562, -59.507198607254175, -104.830665698562242), (172.637697299886781, 82.099867023172436, 938.328041387094231), ]}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/test/round_half_even/decoded.txt
^
|
@@ -0,0 +1,3072 @@
+{(0, 15, 1); [(-97.000000000000000, 34.000000000000000, 228.390420353746407), ]}
+{(0, 15, 2); [(150.000000000000000, 46.000000000000000, -361.514615703930417), ]}
+{(0, 15, 3); [(107.000000000000000, 12.000000000000000, 590.877724345333036), ]}
+{(0, 15, 4); [(-88.000000000000000, 48.000000000000000, -724.072266325115038), ]}
+{(0, 15, 5); [(91.000000000000000, -41.000000000000000, -749.020580897311334), ]}
+{(0, 15, 6); [(-109.000000000000000, 74.000000000000000, 198.648082139788812), ]}
+{(0, 15, 7); [(-172.000000000000000, -82.000000000000000, -936.782939718311809), ]}
+{(0); [(-76.000000000000000, 74.000000000000000), ]}
+{(1, 14, 1); [(35.500000000000000, 89.099999999999994, 110.656668458282184), ]}
+{(1, 14, 2); [(-165.900000000000006, 79.099999999999994, 932.043507695096537), ]}
+{(1, 14, 3); [(40.299999999999997, -16.100000000000001, -795.325547749692760), ]}
+{(1, 14, 4); [(7.900000000000000, 88.900000000000006, 610.604874031274676), ]}
+{(1, 14, 5); [(-167.000000000000000, 82.599999999999994, 535.405899632264777), ]}
+{(1, 14, 6); [(-6.500000000000000, 71.200000000000003, -148.786816375532993), ]}
+{(1, 14, 7); [(109.700000000000003, -19.899999999999999, 292.387963103321056), ]}
+{(1); [(37.200000000000003, 57.100000000000001), ]}
+{(2, 13, 1); [(-100.530000000000001, -20.090000000000000, -783.570854149396951), ]}
+{(2, 13, 2); [(153.360000000000014, -67.790000000000006, -71.666489238810897), ]}
+{(2, 13, 3); [(126.180000000000007, 17.199999999999999, 666.522159882170172), ]}
+{(2, 13, 4); [(120.670000000000002, 40.170000000000002, 774.608401787319053), ]}
+{(2, 13, 5); [(-102.959999999999994, -21.649999999999999, -363.331171055102175), ]}
+{(2, 13, 6); [(101.379999999999995, 73.590000000000003, 801.595032687253479), ]}
+{(2, 13, 7); [(76.989999999999995, -62.649999999999999, -968.711536031164428), ]}
+{(2); [(-109.579999999999998, 19.820000000000000), ]}
+{(3, 12, 1); [(161.614000000000004, 31.370000000000001, 177.188143335314010), ]}
+{(3, 12, 2); [(-55.197000000000003, -71.269000000000005, -669.071372916465975), ]}
+{(3, 12, 3); [(111.209000000000003, -19.116000000000000, 556.410372880436967), ]}
+{(3, 12, 4); [(-7.842000000000000, 59.677999999999997, -866.037011797580021), ]}
+{(3, 12, 5); [(32.100999999999999, 13.680999999999999, -134.727188820344992), ]}
+{(3, 12, 6); [(-64.513999999999996, 34.932000000000002, -100.359269124402999), ]}
+{(3, 12, 7); [(-77.009000000000000, 59.170000000000002, -937.595069785072042), ]}
+{(3); [(-163.229999999999990, -46.962000000000003), ]}
+{(4, 11, 1); [(24.753599999999999, -52.970700000000001, -221.700311200019996), ]}
+{(4, 11, 2); [(-87.558700000000002, -2.271300000000000, -637.761106536970033), ]}
+{(4, 11, 3); [(35.411900000000003, -75.316500000000005, 804.016272289999961), ]}
+{(4, 11, 4); [(93.840500000000006, -41.533799999999999, -929.889005107379944), ]}
+{(4, 11, 5); [(159.418700000000001, 76.896799999999999, 58.025323505579998), ]}
+{(4, 11, 6); [(-15.819900000000001, 49.875799999999998, -856.212513040320005), ]}
+{(4, 11, 7); [(-5.832800000000000, -87.347200000000001, -713.729371309819953), ]}
+{(4); [(-75.180499999999995, 37.029499999999999), ]}
+{(5, 10, 1); [(-7.878950000000000, 83.812370000000001, 107.149447130200002), ]}
+{(5, 10, 2); [(157.096399999999988, -83.593249999999998, -246.103388527300012), ]}
+{(5, 10, 3); [(6.894930000000000, -16.158490000000000, 201.380364007299988), ]}
+{(5, 10, 4); [(-154.768900000000002, -9.018929999999999, 101.319675829299996), ]}
+{(5, 10, 5); [(-1.871230000000000, -65.574200000000005, 416.407619455100019), ]}
+{(5, 10, 6); [(-124.411230000000003, -76.537480000000002, -810.010750486600045), ]}
+{(5, 10, 7); [(-142.460640000000012, 79.870639999999995, -807.947901059700030), ]}
+{(5); [(119.947159999999997, -52.208480000000002), ]}
+{(6, 9, 1); [(-26.148087000000000, 56.308255000000003, 113.601667565000000), ]}
+{(6, 9, 2); [(34.191388000000003, -52.276789000000001, 25.084041953000000), ]}
+{(6, 9, 3); [(160.095271999999994, 89.201217000000000, -439.178377157999989), ]}
+{(6, 9, 4); [(-160.207469000000003, -15.410795999999999, -268.797752511999988), ]}
+{(6, 9, 5); [(-132.625310000000013, -44.764879999999998, -541.302744537999956), ]}
+{(6, 9, 6); [(-74.103588000000002, 54.949531000000000, -486.645581945000004), ]}
+{(6, 9, 7); [(1.732010000000000, -39.518619999999999, 499.114024771999993), ]}
+{(6); [(-27.095124999999999, -61.510271000000003), ]}
+{(7, 8, 1); [(-87.279298600000004, -89.300717800000001, -33.019102619999998), ]}
+{(7, 8, 2); [(-99.359727800000002, -79.421503400000006, 734.002529669999944), ]}
+{(7, 8, 3); [(-32.735042300000003, 20.590074200000000, 726.544831939999995), ]}
+{(7, 8, 4); [(-60.910613400000003, -9.769338800000000, 383.981879470000024), ]}
+{(7, 8, 5); [(-34.708648900000000, 53.314298200000003, 962.573549970000045), ]}
+{(7, 8, 6); [(-71.569464499999995, -76.340744599999994, 619.388478039999995), ]}
+{(7, 8, 7); [(-10.086054300000001, 64.205687100000006, -528.165943409999954), ]}
+{(7); [(6.784728500000000, 82.742761900000005), ]}
+{(8, 7, 1); [(16.489797480000000, -64.927545210000005, 255.572505500000005), ]}
+{(8, 7, 2); [(-40.761273500000001, 10.594928800000000, -799.445602900000040), ]}
+{(8, 7, 3); [(33.556037850000003, -51.341034450000002, 34.473165000000002), ]}
+{(8, 7, 4); [(132.004110139999995, -43.186010500000002, -535.235927500000003), ]}
+{(8, 7, 5); [(77.125067939999994, -32.613762710000003, -606.003542899999957), ]}
+{(8, 7, 6); [(110.796073829999997, -76.845306760000000, 489.682805700000017), ]}
+{(8, 7, 7); [(-69.576440950000006, 67.501347940000002, 685.321670799999993), ]}
+{(8); [(20.667478129999999, 12.116174239999999), ]}
+{(9, 6, 1); [(173.224834270000002, -51.578559542000001, 623.070742999999993), ]}
+{(9, 6, 2); [(-118.527232502999993, -66.851689448000002, -415.316754000000003), ]}
+{(9, 6, 3); [(-112.215186360000004, -0.812381528000000, 842.973481999999990), ]}
+{(9, 6, 4); [(-65.468443331000003, -13.450836141000000, 597.300674999999956), ]}
+{(9, 6, 5); [(144.509416901000009, -39.665513390000001, -392.197113000000002), ]}
+{(9, 6, 6); [(-69.905059627000000, -83.680819821000000, 725.549344000000019), ]}
+{(9, 6, 7); [(-107.097325769999998, 13.544733920000001, -414.603135000000009), ]}
+{(9); [(50.851824286000003, 6.880171876000000), ]}
+{(10, 5, 1); [(-37.135035136399999, -39.346646961399998, -542.987430000000018), ]}
+{(10, 5, 2); [(129.503261242399986, -29.370103596700002, 484.249990000000025), ]}
+{(10, 5, 3); [(-173.256619410000013, 56.834477302000003, 578.882619999999974), ]}
+{(10, 5, 4); [(-146.591328141699989, -52.162241089500000, -345.427990000000023), ]}
+{(10, 5, 5); [(-144.694461896200011, 42.763053307500002, 246.874300000000005), ]}
+{(10, 5, 6); [(-93.607661635200003, -77.341891258600000, -839.487949999999955), ]}
+{(10, 5, 7); [(23.515850799900001, 48.739804948000000, 905.684930000000008), ]}
+{(10); [(-88.783815707700001, 88.123684034299998), ]}
+{(11, 4, 1); [(175.148632289830005, 43.959191624340001, 279.023799999999994), ]}
+{(11, 4, 2); [(-2.237542376410000, -35.986508821359998, 171.173200000000008), ]}
+{(11, 4, 3); [(-29.512716639790000, 13.623026563370001, -765.759699999999953), ]}
+{(11, 4, 4); [(-54.735036244980002, -52.877854342189998, -273.318100000000015), ]}
+{(11, 4, 5); [(-96.013681408669996, -88.059118406520000, 581.416299999999978), ]}
+{(11, 4, 6); [(10.455724682200000, -59.009674269409999, -940.564499999999953), ]}
+{(11, 4, 7); [(-52.250029876109998, -44.734401443229999, 877.009900000000016), ]}
+{(11); [(35.616724674490001, 31.656018035810000), ]}
+{(12, 3, 1); [(-7.954060127209000, -64.010331940756998, 419.370000000000005), ]}
+{(12, 3, 2); [(-51.529087858547001, 27.663975936351999, -910.494000000000028), ]}
+{(12, 3, 3); [(59.040678317233002, -21.197115442636999, -210.030000000000001), ]}
+{(12, 3, 4); [(-112.957807915581000, -33.449756022351004, 312.939000000000021), ]}
+{(12, 3, 5); [(-72.215870433248995, 38.388199808396998, 747.123000000000047), ]}
+{(12, 3, 6); [(28.592997699028000, 52.361601084703999, -566.586999999999989), ]}
+{(12, 3, 7); [(-170.232549469861993, 73.382415590820003, 261.423999999999978), ]}
+{(12); [(-29.665067942120999, -20.412152002233000), ]}
+{(13, 2, 1); [(-131.621985186306603, -65.267762693484599, -386.000000000000000), ]}
+{(13, 2, 2); [(-91.890052577664605, 20.137457325144201, 488.300000000000011), ]}
+{(13, 2, 3); [(-139.743585019239504, -49.282042380237797, 246.560000000000002), ]}
+{(13, 2, 4); [(172.415186312622410, 57.431117466215802, 251.210000000000008), ]}
+{(13, 2, 5); [(-100.479328676662604, 53.623915449344899, -238.069999999999993), ]}
+{(13, 2, 6); [(-84.247830267599497, -20.577165104563800, 832.470000000000027), ]}
+{(13, 2, 7); [(-123.208011265460200, 71.824748887910005, -241.400000000000006), ]}
+{(13); [(-8.704623797530401, 13.930760827451500), ]}
+{(14, 1, 1); [(-116.587183775328256, -29.339494325922178, 787.299999999999955), ]}
+{(14, 1, 2); [(35.150216672546378, 52.714056356926307, 120.799999999999997), ]}
+{(14, 1, 3); [(8.302900345920429, -48.479828042241522, 256.300000000000011), ]}
+{(14, 1, 4); [(-145.880403486020413, 78.411604422157509, -589.100000000000023), ]}
+{(14, 1, 5); [(-68.582021592287958, -55.175318276001867, 726.200000000000045), ]}
+{(14, 1, 6); [(118.927628999217660, 18.732775893467039, 151.699999999999989), ]}
+{(14, 1, 7); [(115.334108065899485, 88.999630466034446, 624.100000000000023), ]}
+{(14); [(88.897075386144110, 32.870126294369001), ]}
+{(15, 0, 1); [(-124.913415557445830, 17.817284375950933, -137.000000000000000), ]}
+{(15, 0, 2); [(-146.864263375333536, -62.492281108997147, 708.000000000000000), ]}
+{(15, 0, 3); [(-39.267910031467096, -9.620616147069011, 600.000000000000000), ]}
+{(15, 0, 4); [(-144.820257983099737, 64.838603772210433, 910.000000000000000), ]}
+{(15, 0, 5); [(-164.868873394778291, 77.065657465639489, -611.000000000000000), ]}
+{(15, 0, 6); [(112.172857518170289, -1.407572730255838, 101.000000000000000), ]}
+{(15, 0, 7); [(171.861535899958028, 36.145261162701601, 944.000000000000000), ]}
+{(15); [(46.904312427053810, 34.963862600094707), ]}
+{(0, 15, 1); [(-5.000000000000000, -41.000000000000000, 361.708448353905908), (176.000000000000000, -14.000000000000000, -107.564622060807466), ]}
+{(0, 15, 2); [(79.000000000000000, -22.000000000000000, 117.695341434458300), (-121.000000000000000, 65.000000000000000, -628.961479383289088), ]}
+{(0, 15, 3); [(46.000000000000000, -19.000000000000000, -123.623715095231844), (-30.000000000000000, 84.000000000000000, 980.677685274976625), ]}
+{(0, 15, 4); [(69.000000000000000, -12.000000000000000, 430.163254796638057), (84.000000000000000, -13.000000000000000, 679.003308436807629), ]}
+{(0, 15, 5); [(-115.000000000000000, 42.000000000000000, 519.359752710566909), (44.000000000000000, 49.000000000000000, 90.796498009738059), ]}
+{(0, 15, 6); [(105.000000000000000, -85.000000000000000, 16.140331121891030), (-108.000000000000000, 23.000000000000000, -448.870417901860094), ]}
+{(0, 15, 7); [(28.000000000000000, -85.000000000000000, 235.411676264766868), (-156.000000000000000, 3.000000000000000, -424.259027395042324), ]}
+{(0); [(132.000000000000000, -67.000000000000000), (38.000000000000000, 62.000000000000000), ]}
+{(1, 14, 1); [(-69.500000000000000, 20.300000000000001, 467.225670906984419), (-71.500000000000000, 25.399999999999999, 983.755462977823527), ]}
+{(1, 14, 2); [(-81.099999999999994, 57.100000000000001, 886.094239602465336), (118.200000000000003, 41.600000000000001, -705.783532627241016), ]}
+{(1, 14, 3); [(-65.000000000000000, -40.700000000000003, -112.080135125796446), (-53.799999999999997, -43.899999999999999, -154.360805343933521), ]}
+{(1, 14, 4); [(40.000000000000000, 71.599999999999994, -213.685311617196163), (-110.200000000000003, 7.700000000000000, -467.374994852750092), ]}
+{(1, 14, 5); [(3.200000000000000, 13.300000000000001, 675.195570535907564), (168.199999999999989, 68.500000000000000, -470.658622832800177), ]}
+{(1, 14, 6); [(129.599999999999994, -82.000000000000000, -848.764052731434731), (-102.500000000000000, 0.300000000000000, -373.610514054078806), ]}
+{(1, 14, 7); [(-19.699999999999999, 29.699999999999999, -512.300814618991467), (-45.799999999999997, 89.400000000000006, 22.731626716685081), ]}
+{(1); [(149.699999999999989, -69.599999999999994), (29.100000000000001, -45.000000000000000), ]}
+{(2, 13, 1); [(-103.819999999999993, 9.859999999999999, -603.138584904996719), (-124.200000000000003, 62.420000000000002, 274.871067222638203), ]}
+{(2, 13, 2); [(143.039999999999992, -75.840000000000003, 717.413592862660039), (-70.010000000000005, 3.410000000000000, 616.398249487439216), ]}
+{(2, 13, 3); [(-61.600000000000001, 67.390000000000001, 758.787262266232688), (35.750000000000000, 69.950000000000003, 83.411681304012404), ]}
+{(2, 13, 4); [(41.619999999999997, -55.670000000000002, 314.423563957637214), (-165.189999999999998, 72.579999999999998, -119.721413860354602), ]}
+{(2, 13, 5); [(-118.930000000000007, 69.129999999999995, 265.366117504635383), (0.730000000000000, -32.060000000000002, 667.241240638668728), ]}
+{(2, 13, 6); [(-99.230000000000004, 14.199999999999999, 203.195078741524213), (-176.430000000000007, 79.030000000000001, -154.062085678639789), ]}
+{(2, 13, 7); [(88.230000000000004, 72.040000000000006, 821.728559501759150), (37.689999999999998, -73.219999999999999, -347.645370065438897), ]}
+{(2); [(-66.280000000000001, -17.660000000000000), (52.020000000000003, 13.580000000000000), ]}
+{(3, 12, 1); [(124.436000000000007, -81.691999999999993, 976.922106395031051), (146.854999999999990, 46.256999999999998, -642.932785872019963), ]}
+{(3, 12, 2); [(-174.854000000000013, 73.644999999999996, -916.594161748391002), (-139.497000000000014, 23.314000000000000, 655.470405937409055), ]}
+{(3, 12, 3); [(71.254999999999995, -73.733999999999995, -769.885117253900034), (68.209999999999994, -31.422999999999998, -375.388784214021996), ]}
+{(3, 12, 4); [(-6.776000000000000, -50.539000000000001, -834.860701015707036), (-41.729999999999997, -68.436000000000007, -983.572709529895974), ]}
+{(3, 12, 5); [(51.220999999999997, -50.935000000000002, -401.088703661064983), (61.972999999999999, -31.677000000000000, -267.935824724195015), ]}
+{(3, 12, 6); [(98.576999999999998, -77.417000000000002, -260.218528743023001), (72.456000000000003, 50.591999999999999, -575.994655497068038), ]}
+{(3, 12, 7); [(-179.492999999999995, -16.853000000000002, -599.587980511548039), (-134.229000000000013, -14.346000000000000, -892.926313462668986), ]}
+{(3); [(165.473000000000013, 7.243000000000000), (18.113000000000000, 35.866000000000000), ]}
+{(4, 11, 1); [(-87.671400000000006, 12.858700000000001, -712.533747708729948), (172.154100000000000, -38.863500000000002, -264.682021094509992), ]}
+{(4, 11, 2); [(-129.383999999999986, 58.277000000000001, -291.863359028300010), (-169.315599999999989, 40.673499999999997, 398.562329870690007), ]}
+{(4, 11, 3); [(166.685699999999997, 64.337100000000007, 175.201704576959997), (-50.591700000000003, 24.444800000000001, 536.689308441489970), ]}
+{(4, 11, 4); [(151.356200000000001, 86.418300000000002, 558.059403676009993), (122.263900000000007, -27.195499999999999, 818.860656393689965), ]}
+{(4, 11, 5); [(60.622799999999998, -50.801400000000001, 778.957509113490005), (82.897400000000005, -44.751899999999999, -940.753864567029950), ]}
+{(4, 11, 6); [(-62.667700000000004, 88.487399999999994, 231.787305534399991), (138.048300000000012, -74.972200000000001, 144.396211112140008), ]}
+{(4, 11, 7); [(37.904400000000003, -5.807300000000000, -817.703847733559996), (-10.408799999999999, 46.988500000000002, 134.633188873910001), ]}
+{(4); [(-144.411300000000011, 62.683700000000002), (-18.898599999999998, 6.684900000000000), ]}
+{(5, 10, 1); [(-72.284649999999999, -43.142670000000003, 643.120880325899975), (63.594560000000001, -0.892160000000000, -42.832984224000000), ]}
+{(5, 10, 2); [(-95.700590000000005, 53.578009999999999, 188.728215120399994), (-4.862450000000000, -32.400109999999998, -257.594550122200019), ]}
+{(5, 10, 3); [(-16.132690000000000, 11.849720000000000, 492.240797792199999), (164.715360000000004, 86.422569999999993, 331.196353159900013), ]}
+{(5, 10, 4); [(127.251379999999997, -33.886180000000003, -685.433826579199945), (155.042689999999993, -56.327050000000000, 473.747114781400001), ]}
+{(5, 10, 5); [(-45.580500000000001, -41.394979999999997, 374.279795723400014), (-102.532790000000006, -55.783569999999997, -779.885864589499988), ]}
+{(5, 10, 6); [(-85.376609999999999, 85.449709999999996, 797.101019441700032), (-158.111490000000003, 16.250389999999999, -683.673245703699990), ]}
+{(5, 10, 7); [(157.908729999999991, 64.218500000000006, -405.599320725700011), (150.226270000000000, 62.333440000000003, -662.788375223899948), ]}
+{(5); [(95.694090000000003, -5.656000000000000), (39.173549999999999, -68.113069999999993), ]}
+{(6, 9, 1); [(-147.371212000000014, -65.049169000000006, 764.500844039999947), (-38.258935000000001, -76.712637999999998, -635.131326682000008), ]}
+{(6, 9, 2); [(129.412317999999999, -68.617121999999995, -437.125494457999991), (-105.316654999999997, 80.068516000000002, 839.973604076000015), ]}
+{(6, 9, 3); [(117.001904999999994, 4.357320000000000, 604.595359988000041), (-50.091005000000003, -9.487428000000000, 393.505968483000004), ]}
+{(6, 9, 4); [(172.858654000000001, -46.982396999999999, -258.658795752000003), (-58.968618999999997, 86.742090000000005, -180.715148883000012), ]}
+{(6, 9, 5); [(-104.102922000000007, 74.910601000000000, -682.158035246000054), (-56.638961999999999, 68.357586999999995, 449.473777800999983), ]}
+{(6, 9, 6); [(167.420674999999989, 11.951025000000000, -528.985294826999962), (-68.018859000000006, 3.467421000000000, -179.206823619999994), ]}
+{(6, 9, 7); [(145.332322000000005, 59.913395999999999, 978.339917105000040), (-141.030431999999990, 89.245014999999995, 993.450596647999987), ]}
+{(6); [(106.225813000000002, -15.354350999999999), (162.440475999999990, -64.563202000000004), ]}
+{(7, 8, 1); [(128.651322499999992, -49.864493299999999, 119.050213560000003), (-29.753112300000002, 35.322063999999997, -665.423344219999990), ]}
+{(7, 8, 2); [(97.547068800000005, -85.426051799999996, -940.055633289999946), (-75.442530399999995, -13.587594400000000, 885.333428730000037), ]}
+{(7, 8, 3); [(-19.005702500000002, 64.577576800000003, 577.154229669999950), (37.039072400000002, 27.000987899999998, -517.013614999999959), ]}
+{(7, 8, 4); [(172.902740499999993, 2.989476000000000, 74.013731129999996), (-23.460602000000002, 25.541405600000001, 134.082122349999992), ]}
+{(7, 8, 5); [(-92.133890300000004, 38.370960400000001, 719.964168070000028), (-118.982805400000004, -24.778047500000000, -905.949539410000057), ]}
+{(7, 8, 6); [(18.878961799999999, 42.660064100000000, -333.742181159999973), (-133.305168199999997, -20.854327699999999, 879.367146159999947), ]}
+{(7, 8, 7); [(-15.188042400000000, -0.756051200000000, -688.297359799999981), (-80.548968000000002, 86.949077500000001, 745.863082350000013), ]}
+{(7); [(-91.794220100000004, 41.681522500000000), (-139.096931200000000, 78.328906900000007), ]}
+{(8, 7, 1); [(-89.139280420000006, -20.414106980000000, -713.981716699999993), (161.607705820000007, -62.950260960000001, -472.053403300000014), ]}
+{(8, 7, 2); [(-72.391130219999994, 75.844741540000001, 593.547143799999958), (53.992365200000002, -52.668221230000000, 71.938582600000004), ]}
+{(8, 7, 3); [(-26.448574189999999, -48.938803450000002, 170.612429399999996), (93.072003789999997, 55.484355309999998, 667.976624300000026), ]}
+{(8, 7, 4); [(114.626329310000003, 66.435589559999997, -860.515886199999954), (-153.329184940000005, -88.829935899999995, -13.796511300000001), ]}
+{(8, 7, 5); [(56.123883690000000, -62.660666020000001, 476.085172399999976), (-106.094184679999998, -6.997272370000000, 90.583369599999997), ]}
+{(8, 7, 6); [(133.447773149999989, -40.709803209999997, -241.707502299999987), (-118.205646750000000, -71.518740649999998, -51.963188600000002), ]}
+{(8, 7, 7); [(1.245825070000000, -59.507198610000003, -104.830665699999997), (172.637697300000013, 82.099867020000005, 938.328041399999961), ]}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/test/round_half_even/encoded.txt
^
|
@@ -0,0 +1,3072 @@
+Bw8BhGkCg-impzk4v21M
+Bg9BsJ8C_jj0kqlo3liU
+Bw9B2GYgw6tphnqwz5gB
+Bg-BvFgD_ng1gy-43mmoB
+Bw-B2FxC_nl961_v8wypB
+Bg_B5G0Egg7kozm467gL
+Bw_B3KjF_3v5xx2n-hg0B
+BA3E0E
+Bx4BmW23B0nyxx1yqg1T
+Bh5B1nDuxBgx6sk7n3hylF
+Bx5BmZhK_79jur_78otE
+Bh6B-Ey3Bwqhnv1ks8usD
+Bx6BroD0zBg32q6lw4tj_C
+Bh7BhEwsBnpiu3lol4ta
+Bx7BykCtMwshz3j-hh-zB
+BBoX2jB
+By0Bp0Tx9Djtx3lwoit9N
+Bi1Bw-d1nN5w51qssz3oB
+By1B00YwrDs0-831--76L
+Bi2BmyXi7Huywkp6thq4N
+By2BvjUpnE7-t27ty-wuG
+Bi3B05T-rOu9804_290nO
+By3BmhPxnM31ss-tq40mR
+BC7sV87D
+BzwB807J0o9Bk5j-q02piK
+BjxB55rDpmrEjvrswxihhmB
+BzxBym5G3qlBqj8_zirj0f
+BjyBjqP8x0D3krtu0_pnxB
+BzyBq2-Bi3ax34sn-ki1H
+BjzBjg-DonkClzk4y21x2F
+BzzBht2EkyzD_-xvi9mvp1B
+BD75-Jj37C
+B0sBgvjP1yqgBjovx68uqoB
+BktBlku1BxrsBhw4utoog0D
+B0tBu0zV5g_tBw014t2_nyE
+BkuBq6o5BzmrZjhmosq1kpF
+B0uB20phDw89uB8l1k8h4xK
+BkvBt_0Jskue_l1zog637E
+B0vBv9xD__p1Br-5hyuu6hE
+BE5r8tBunzW
+B1oBt7iwBqzx_Psovwh6r-B
+BlpBw86-d55m-Pxl3zhhovE
+B1pBq1iqBx-ziDyw6zhgn1D
+BlqBzp0wdpwh3Bqxuunn_6B
+B1qBlvtL3unwMuvlhpmsyH
+BlrBlir3Xn3kzOjum_g0v3O
+B1rB_qwlbw3vnPpy6nvmp2O
+BF4lj8W_-0-J
+B2kBtv-7xB-h5srD6-w_lzzG
+BmlB4h8mhCpj32jDiutgk3uB
+B2lBwiurxJiktkqFr87oihyZ
+BmmB5mpyxJ3mzsd_r6gz10P
+B2mB755-8H_sns1Cz9yhlowf
+BmnBny9qtE2p75oDxnk5quqc
+B2nB062pD35gsrCo0vuw1hd
+BGpl41zB9npq1D
+B3gBz5h3g0Bz06on1Brvz85kG
+BnhB71rkn7Bznh7qvBui97_2oE
+B3hBtp8rwTs8l3oM0v3txqnE
+BniBrt84pkB3s3q6F26s32wnC
+B3iBxpvg2Us8u84fqv2qspzF
+BnjBpjxi1qBrl2iwtB4jo_6rzD
+B3jB9nhsgGuqh0omBp6i1jsiD
+BHqnithEmylmqxB
+B4coy3lpiDxlp-_iM-vi1q4E
+Bodrniz-yHghq6k_B597mw8O
+B4dy05pgoGp55wgyJkg4wxU
+Boes4k55yYz1vithI12i6g_J
+B4e06hu2rO9wzysiGp2mzmpL
+Bofuly1s0Un_wihqOyp1-7jJ
+B4f9z802-M0gx7qyMo8kvv4M
+BIq6ogm7Dgpo_moC
+B5Y8t6kg1iKrjupqigDuhntklB
+BpZt_k4448Gv-pv1w8Djx9k4Y
+B5Zv7tvxgxGv16vtwB0yg7nyB
+Bpals1kn-5D5q8t3hZm8qozjB
+B5aq866tltI765-n8pCx_5hsX
+Bpb1ynq1miE5m9v477Egyg8nrB
+B5bzsg-vvnGgu-wqnZ93r52Y
+BJ8phlg3-Co2r8i6M
+B6Ung3ym2zV7uu3t88WtnkynD
+BqVwk71-lsrC97zo-hjRui0r8C
+B6Vn7r4_k7kD45g0_zihBsgntuD
+BqWx4l2nvq1C9or5jzre9sq8hC
+B6Wj986zkn0Cm9sw4w8Ys05ivB
+BqX_pxuwyv2Bz0lwrzgtB1v6jgF
+B6X-9ooxg2Nwsjgm7rc6y73sF
+BKpx08o31zBu5n85tpzB
+B7Quj8tm_v7fkk-smh8_H81pqF
+BrRxs7q54gNvl86pgvxGonvoD
+B7R12k_vl5rFi1vjyvpvC5nszO
+BrSjz-0nmz-J1mmqyo5zJ5n6mF
+B7Slk2sk-7uR34j9npygQm57iL
+BrT4_-m_w78B539kitv3K5si-R
+B7T1l4puqkwJl8l-5tskImjp3Q
+BLy_xjnkqvG6z2oyso4F
+B8Mx-129y_uOp5zjjx8t0D0izZ
+BsNl37o_ss39Cg241uloqyB7py3B
+B8Nirmi16zsrD58ilx26xmB7m6M
+BsO5j5vgqgvtG9krt6gh78B2mjT
+B8Oh-z3pxwrjE64utgzv6lCmnztB
+BsPo9mivzqg0Bgy2n0i7n_C1zyiB
+B8Prq3v06601Jo6yh6stvlEgz-P
+BMxug56v3-1Bxr7mizkklB
+B9Izh692wim6qC7j7sj66mjlBvsrC
+BtJrw_wtzhvn0Bk3l_8rxpuL8r_C
+B9J1g7pujv9tvCzg_xpy9tgcglwB
+BtKgt08qj7mgiD8g05x9p10gBiixB
+B9Kji449q12j5Byg8lqontve9vuB
+BtL1hi5-j2u8vBrwsplyvp2L-yiF
+B9LzwssuhwkhmC4_89tmwv6oB3kvB
+BNvw5_io4q-Eml7lw04s9H
+B-Ez5u3tn3i32Uz17_21q64mFisP
+BuF82gr7hm55nGul0nskm00rJwrC
+B-F2ykqy2npmvBvpkx903tyzImgF
+BuGzrnq-y2vn9Zu0-j5uz_29NlwL
+B-G33z-v_8_6lM1z97z8zq05J8lO
+BuHs29whk95gkVg5s9otjvvqD6-C
+B-H4_0zl27kzvUqr1g9_g-85PimM
+BO2ok8_zipq5Po-s5kkqh76F
+Bf_r8t_x3lw89Gsl78iquu50fxI
+BvB_p0-14nxo8kIvhyy2ow5ogvDosB
+B_Bvlx9vkm9j4lCnl09-_x57iRwlB
+BvC_15zrhvwiohIgw2sy5u30lzD84B
+B_C_r47mpv327kJgkp8zh1z18oElmB
+BvDgrw-590nponG79s0ywwrgwCqG
+B_Dgw967lgqmpxJgyxq9rj7zmgCg7B
+BPgvh40gqumqzCo_pkoi18uj-B
+Bw8BJxCgw2xs4263wiUqL2B_ipn3o43izha
+Bg9B-ErBgsot95wymixGvMuF_7u7-th7wqupB
+Bw9B8ClB_1-iiopnmz7G3EuGguvhh2uxo0p9B
+Bg-BqEXg4rxy97s-j8XeBgokyj7ut9g6N
+Bw-BlH0Cgg6q-is8ly6c-JO_q0pnwzggp5X
+Bg_ByGpFstrviv9iv1cpN4Gr9lypgg05g6Z
+Bw_B4BpFg6u237grzliNvLwF_58_ro0g-5zkB
+BAoIlE7FiI
+Bx4BtrB2Mws89t-q77_yCnBmDw4rqnljnk47C
+Bh5B1yB2jBgwk882pz7s9Ey8D1Jvwm2-hl8446I
+Bx5BzoBtZ3jt4hgooj9TgH_B387v9w85qwH
+Bh6BgZ4sB_zxwo9mk1-lB79C9nB_jw5n5p8hitB
+Bx6BgCqIwu2oytvrh-3DknDwiBv31tgwn1txrG
+Bh7BgxCnzB_q04jygp142EhxEuzBwipn1sz99s0C
+Bx7BpMySv4nnr3m_ig7CpQqlBoqmm9k26ph_C
+BBy9CvrBrrCsP
+By0B7oU09B925khz7g72Kr_DwoK67l6nm88izP
+Bi1Bg-b_5Ow6uizv1153MxzpBqvP_ox5ys1ut5B
+By1B_gMmlNurp5okqoqvNugTgQ1r069vqg9_L
+Bi2BkkI97Kozrssozq3yFxsoByhZ70366r0h52H
+By2BpnXiwNktwl2jt_62E8rXt4T6y32yvjiukH
+Bi3BlsT44C0smq8ojjwzDviPm1Mvqlm5nhvirG
+By3BunRoiOw34i9k_kjzO77J7rc5qji64m524U
+BCn-MruDsjXojG
+BzwBohzH3x_Eu58_jnrgx3Bm5rB685H1i7ju7-vi8C
+BjxBrw1K66vEt6kot15oj0B6hlC1piDwq57jumyr5C
+BzxBulrErgwE3wk694mt4rBp-Fu0yCswkv512ytW
+BjyBvnN12iD1pv1wnpzuvBzokCx-iB5o9ju2lwuI
+BzyBqhkDtvjDxgiy29ty5WggV0zlBsyhzhywmyH
+BjzBixgGxm3E9m_g_42q5OxgzByg6H5vu077ys-R
+BzzBpy-Kp9gB3zk8y0z0iiBgt4C28Ehl5pknxy1Q
+BDimjK2kO_5_I-83B
+B0sBzqw1B2k7Hxrv-i4vzhE-2y-Ermyf8qi7p86uxC
+BktB_g_uCknyjB7mm8l57i1Bn9rYl63K2ijs555y9D
+B0tByy3lD2yonBgmtlx757fr2zkE1krYq5t2gqk4hC
+BkuB0ls8Cu730Bivgio1qwlD1m4RzgrlCwt_ozgiuvB
+B0uBohglB7mgfq3igykk2tE0hzN-k2Dn_33xmh64J
+BkvBp_nmB0og2Bgmghg4llqBwnw6Dny4jDjrpuw718P
+B0vBoqkXxtxD3uoz3m130E3zvdslngB2smvizqntF
+BEhxk4CqpomButzsCn3liB
+B1oBhjm5N1pqnI27lq9hr2Li9q9Z2h8hI1_g1r8ovM
+BlpB1wjoSyugnKoy_g5q7tDs6tqRnz4sQz0kljt5jI
+B1pBp9uiD4sqoCk8hks2w-Iq85viBqglnOlntg_139C
+BlqBk51oYzs6uG_rh3sm_uM2_zpFt_-oEs-461t3iV
+B1qBjum2Iz-08Hknkykw75G5vz7K1o63Cx_k-qg6_U
+BlrB5jjpQ2sxpQi_1snl_vO_g-7N3vrmN7ju2ny99a
+B1rByx5je01-nMx9kjh8isHrv8uBzlwLr1o9zw21E
+BFioioS_1wiBrl_4K10m9L
+B2kB3s6i5Ihlpi8Dwgv05_vsBq91jwG5m8nWjunwygvxC
+BmlB8t262Hj6h8iEzr722muZ5g32_Ns0hz7Is6gnh5qqC
+B2lBirnl_Gws-pIovok2kmjB7qx2-J3wgtah5_h9lpM
+BmmB8xu2pK5vyz5Cvugwo5hPx0zl6Nu08h_Hqp125lxE
+B2mBzg-xmGy4l8uE7yom5z2nBwh_w6Cr7-vMu7wsw67hC
+BmnBmwxq_Ji7t5W1-js_p5e76iihOnx5lQuy0vtwrU
+B2nBkmsm1Ior6oyDiz2pzp-4BjommiRmqo-3Bu_1q1kc
+BGqpwzqG9-kpduoinrDlhv79C
+B3gBykx61sCp87i3d466gzlW3zsqt-Cq-354yBj4zu6jyE
+BnhBgmgyk6Bry9r9yBh8nsljvFvjvwjnD872m6qB0l1qlg0K
+B3hBhklwqLw5g3vmBuv7tjwrDqwg_shBh492sWllx-35rG
+BniB60u7hnDwm0g5By7-_k5Nhx1qh1DgszkuNk1rkhmL
+B3iBthiq92Bo6477WuyxoqjmE97ojgQ9hjv0lB3_2tm7uJ
+BnjBk35ioLis01tZn4zool-Bnp6126C7uju7lB4v3n2-hH
+B3jBvuh2hJ_zutO3i2pymgEvyk1-mBu5-6o0Bur1sokrI
+BHx73622Bynsg7Ytipnmcon5_6V
+B4cz2_-pzQzo6115D9s7jypNg4kmy2uBryikx9H8rqtmwE
+Bod7zswvvN0iynikO80tg5hLsu03pxXph88_9X3mz882J
+B4d1kp109Exh4q2jJsgyl2lDs823soWomsktuT6tgvuoJ
+Boem-ynnrV4i1y_rM78mh9gQhs1uk9xBj-xxu9cq5v814P
+B4eihg5wuKzqryv1L4wqz47Ipvw08meqys-4rK3i074lH
+Bofmmykt7Yhu940yH90xmiwEryyi_7uB_y6q03Fi03ijxD
+B4f2m9ztHp3jj2iLh-xvv-Buh_sy9fmg-shsa-vx14tT
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/test/round_half_up/decoded.txt
^
|
@@ -0,0 +1,3072 @@
+{(0, 15, 1); [(-97.000000000000000, 34.000000000000000, 228.390420353746407), ]}
+{(0, 15, 2); [(150.000000000000000, 46.000000000000000, -361.514615703930417), ]}
+{(0, 15, 3); [(107.000000000000000, 12.000000000000000, 590.877724345333036), ]}
+{(0, 15, 4); [(-88.000000000000000, 48.000000000000000, -724.072266325115038), ]}
+{(0, 15, 5); [(91.000000000000000, -41.000000000000000, -749.020580897311334), ]}
+{(0, 15, 6); [(-109.000000000000000, 74.000000000000000, 198.648082139788812), ]}
+{(0, 15, 7); [(-172.000000000000000, -82.000000000000000, -936.782939718311809), ]}
+{(0); [(-76.000000000000000, 74.000000000000000), ]}
+{(1, 14, 1); [(35.500000000000000, 89.099999999999994, 110.656668458282184), ]}
+{(1, 14, 2); [(-165.900000000000006, 79.099999999999994, 932.043507695096537), ]}
+{(1, 14, 3); [(40.299999999999997, -16.100000000000001, -795.325547749692760), ]}
+{(1, 14, 4); [(7.900000000000000, 88.900000000000006, 610.604874031274676), ]}
+{(1, 14, 5); [(-167.000000000000000, 82.599999999999994, 535.405899632264777), ]}
+{(1, 14, 6); [(-6.500000000000000, 71.200000000000003, -148.786816375532993), ]}
+{(1, 14, 7); [(109.700000000000003, -19.899999999999999, 292.387963103321056), ]}
+{(1); [(37.200000000000003, 57.100000000000001), ]}
+{(2, 13, 1); [(-100.530000000000001, -20.090000000000000, -783.570854149396951), ]}
+{(2, 13, 2); [(153.360000000000014, -67.790000000000006, -71.666489238810897), ]}
+{(2, 13, 3); [(126.180000000000007, 17.199999999999999, 666.522159882170172), ]}
+{(2, 13, 4); [(120.670000000000002, 40.170000000000002, 774.608401787319053), ]}
+{(2, 13, 5); [(-102.959999999999994, -21.649999999999999, -363.331171055102288), ]}
+{(2, 13, 6); [(101.379999999999995, 73.590000000000003, 801.595032687253479), ]}
+{(2, 13, 7); [(76.989999999999995, -62.649999999999999, -968.711536031164428), ]}
+{(2); [(-109.579999999999998, 19.820000000000000), ]}
+{(3, 12, 1); [(161.614000000000004, 31.370000000000001, 177.188143335314010), ]}
+{(3, 12, 2); [(-55.197000000000003, -71.269000000000005, -669.071372916466999), ]}
+{(3, 12, 3); [(111.209000000000003, -19.116000000000000, 556.410372880436967), ]}
+{(3, 12, 4); [(-7.842000000000000, 59.677999999999997, -866.037011797580021), ]}
+{(3, 12, 5); [(32.100999999999999, 13.680999999999999, -134.727188820344992), ]}
+{(3, 12, 6); [(-64.513999999999996, 34.932000000000002, -100.359269124402999), ]}
+{(3, 12, 7); [(-77.009000000000000, 59.170000000000002, -937.595069785072042), ]}
+{(3); [(-163.229999999999990, -46.962000000000003), ]}
+{(4, 11, 1); [(24.753599999999999, -52.970700000000001, -221.700311200019996), ]}
+{(4, 11, 2); [(-87.558700000000002, -2.271300000000000, -637.761106536970033), ]}
+{(4, 11, 3); [(35.411900000000003, -75.316500000000005, 804.016272289999961), ]}
+{(4, 11, 4); [(93.840500000000006, -41.533799999999999, -929.889005107379944), ]}
+{(4, 11, 5); [(159.418700000000001, 76.896799999999999, 58.025323505579998), ]}
+{(4, 11, 6); [(-15.819900000000001, 49.875799999999998, -856.212513040320005), ]}
+{(4, 11, 7); [(-5.832800000000000, -87.347200000000001, -713.729371309819953), ]}
+{(4); [(-75.180499999999995, 37.029499999999999), ]}
+{(5, 10, 1); [(-7.878950000000000, 83.812370000000001, 107.149447130200002), ]}
+{(5, 10, 2); [(157.096399999999988, -83.593249999999998, -246.103388527300012), ]}
+{(5, 10, 3); [(6.894930000000000, -16.158490000000000, 201.380364007299988), ]}
+{(5, 10, 4); [(-154.768900000000002, -9.018929999999999, 101.319675829299996), ]}
+{(5, 10, 5); [(-1.871230000000000, -65.574200000000005, 416.407619455100019), ]}
+{(5, 10, 6); [(-124.411230000000003, -76.537480000000002, -810.010750486600045), ]}
+{(5, 10, 7); [(-142.460640000000012, 79.870639999999995, -807.947901059700030), ]}
+{(5); [(119.947159999999997, -52.208480000000002), ]}
+{(6, 9, 1); [(-26.148087000000000, 56.308255000000003, 113.601667565000000), ]}
+{(6, 9, 2); [(34.191388000000003, -52.276789000000001, 25.084041953000000), ]}
+{(6, 9, 3); [(160.095271999999994, 89.201217000000000, -439.178377157999989), ]}
+{(6, 9, 4); [(-160.207469000000003, -15.410795999999999, -268.797752511999988), ]}
+{(6, 9, 5); [(-132.625310000000013, -44.764879999999998, -541.302744537999956), ]}
+{(6, 9, 6); [(-74.103588000000002, 54.949531000000000, -486.645581945000004), ]}
+{(6, 9, 7); [(1.732010000000000, -39.518619999999999, 499.114024771999993), ]}
+{(6); [(-27.095124999999999, -61.510271000000003), ]}
+{(7, 8, 1); [(-87.279298600000004, -89.300717800000001, -33.019102619999998), ]}
+{(7, 8, 2); [(-99.359727800000002, -79.421503400000006, 734.002529669999944), ]}
+{(7, 8, 3); [(-32.735042300000003, 20.590074200000000, 726.544831939999995), ]}
+{(7, 8, 4); [(-60.910613400000003, -9.769338800000000, 383.981879470000024), ]}
+{(7, 8, 5); [(-34.708648900000000, 53.314298200000003, 962.573549970000045), ]}
+{(7, 8, 6); [(-71.569464499999995, -76.340744599999994, 619.388478039999995), ]}
+{(7, 8, 7); [(-10.086054300000001, 64.205687100000006, -528.165943409999954), ]}
+{(7); [(6.784728500000000, 82.742761900000005), ]}
+{(8, 7, 1); [(16.489797480000000, -64.927545210000005, 255.572505500000005), ]}
+{(8, 7, 2); [(-40.761273500000001, 10.594928800000000, -799.445602900000040), ]}
+{(8, 7, 3); [(33.556037850000003, -51.341034450000002, 34.473165000000002), ]}
+{(8, 7, 4); [(132.004110139999995, -43.186010500000002, -535.235927500000003), ]}
+{(8, 7, 5); [(77.125067939999994, -32.613762710000003, -606.003542899999957), ]}
+{(8, 7, 6); [(110.796073829999997, -76.845306760000000, 489.682805700000017), ]}
+{(8, 7, 7); [(-69.576440950000006, 67.501347940000002, 685.321670799999993), ]}
+{(8); [(20.667478129999999, 12.116174239999999), ]}
+{(9, 6, 1); [(173.224834270000002, -51.578559542000001, 623.070742999999993), ]}
+{(9, 6, 2); [(-118.527232502999993, -66.851689448000002, -415.316754000000003), ]}
+{(9, 6, 3); [(-112.215186360000004, -0.812381528000000, 842.973481999999990), ]}
+{(9, 6, 4); [(-65.468443331000003, -13.450836141000000, 597.300674999999956), ]}
+{(9, 6, 5); [(144.509416901000009, -39.665513390000001, -392.197113000000002), ]}
+{(9, 6, 6); [(-69.905059627000000, -83.680819821000000, 725.549344000000019), ]}
+{(9, 6, 7); [(-107.097325769999998, 13.544733920000001, -414.603135000000009), ]}
+{(9); [(50.851824286000003, 6.880171876000000), ]}
+{(10, 5, 1); [(-37.135035136399999, -39.346646961399998, -542.987430000000018), ]}
+{(10, 5, 2); [(129.503261242399986, -29.370103596700002, 484.249990000000025), ]}
+{(10, 5, 3); [(-173.256619410000013, 56.834477302000003, 578.882619999999974), ]}
+{(10, 5, 4); [(-146.591328141699989, -52.162241089500000, -345.427990000000023), ]}
+{(10, 5, 5); [(-144.694461896200011, 42.763053307500002, 246.874300000000005), ]}
+{(10, 5, 6); [(-93.607661635200003, -77.341891258600000, -839.487949999999955), ]}
+{(10, 5, 7); [(23.515850799900001, 48.739804948000000, 905.684930000000008), ]}
+{(10); [(-88.783815707700001, 88.123684034299998), ]}
+{(11, 4, 1); [(175.148632289830005, 43.959191624340001, 279.023799999999994), ]}
+{(11, 4, 2); [(-2.237542376410000, -35.986508821359998, 171.173200000000008), ]}
+{(11, 4, 3); [(-29.512716639790000, 13.623026563370001, -765.759699999999953), ]}
+{(11, 4, 4); [(-54.735036244980002, -52.877854342189998, -273.318100000000015), ]}
+{(11, 4, 5); [(-96.013681408669996, -88.059118406520000, 581.416299999999978), ]}
+{(11, 4, 6); [(10.455724682200000, -59.009674269409999, -940.564499999999953), ]}
+{(11, 4, 7); [(-52.250029876109998, -44.734401443229999, 877.009900000000016), ]}
+{(11); [(35.616724674490001, 31.656018035810000), ]}
+{(12, 3, 1); [(-7.954060127209000, -64.010331940756998, 419.370000000000005), ]}
+{(12, 3, 2); [(-51.529087858547001, 27.663975936351999, -910.494000000000028), ]}
+{(12, 3, 3); [(59.040678317233002, -21.197115442636999, -210.030000000000001), ]}
+{(12, 3, 4); [(-112.957807915581000, -33.449756022351004, 312.939000000000021), ]}
+{(12, 3, 5); [(-72.215870433248995, 38.388199808396998, 747.123000000000047), ]}
+{(12, 3, 6); [(28.592997699028000, 52.361601084703999, -566.586999999999989), ]}
+{(12, 3, 7); [(-170.232549469861993, 73.382415590820003, 261.423999999999978), ]}
+{(12); [(-29.665067942120999, -20.412152002233000), ]}
+{(13, 2, 1); [(-131.621985186306603, -65.267762693484599, -386.000000000000000), ]}
+{(13, 2, 2); [(-91.890052577664605, 20.137457325144201, 488.300000000000011), ]}
+{(13, 2, 3); [(-139.743585019239504, -49.282042380237797, 246.560000000000002), ]}
+{(13, 2, 4); [(172.415186312622495, 57.431117466215802, 251.210000000000008), ]}
+{(13, 2, 5); [(-100.479328676662604, 53.623915449344899, -238.069999999999993), ]}
+{(13, 2, 6); [(-84.247830267599497, -20.577165104563800, 832.470000000000027), ]}
+{(13, 2, 7); [(-123.208011265460200, 71.824748887910005, -241.400000000000006), ]}
+{(13); [(-8.704623797530401, 13.930760827451500), ]}
+{(14, 1, 1); [(-116.587183775328256, -29.339494325922178, 787.299999999999955), ]}
+{(14, 1, 2); [(35.150216672546392, 52.714056356926307, 120.799999999999997), ]}
+{(14, 1, 3); [(8.302900345920429, -48.479828042241522, 256.300000000000011), ]}
+{(14, 1, 4); [(-145.880403486020413, 78.411604422157509, -589.100000000000023), ]}
+{(14, 1, 5); [(-68.582021592287958, -55.175318276001867, 726.200000000000045), ]}
+{(14, 1, 6); [(118.927628999217660, 18.732775893467039, 151.699999999999989), ]}
+{(14, 1, 7); [(115.334108065899485, 88.999630466034446, 624.100000000000023), ]}
+{(14); [(88.897075386144110, 32.870126294369001), ]}
+{(15, 0, 1); [(-124.913415557445830, 17.817284375950933, -137.000000000000000), ]}
+{(15, 0, 2); [(-146.864263375333536, -62.492281108997147, 708.000000000000000), ]}
+{(15, 0, 3); [(-39.267910031467096, -9.620616147069011, 600.000000000000000), ]}
+{(15, 0, 4); [(-144.820257983099737, 64.838603772210433, 910.000000000000000), ]}
+{(15, 0, 5); [(-164.868873394778291, 77.065657465639489, -611.000000000000000), ]}
+{(15, 0, 6); [(112.172857518170289, -1.407572730255838, 101.000000000000000), ]}
+{(15, 0, 7); [(171.861535899958028, 36.145261162701601, 944.000000000000000), ]}
+{(15); [(46.904312427053810, 34.963862600094707), ]}
+{(0, 15, 1); [(-5.000000000000000, -41.000000000000000, 361.708448353905908), (176.000000000000000, -14.000000000000000, -107.564622060807466), ]}
+{(0, 15, 2); [(79.000000000000000, -22.000000000000000, 117.695341434458300), (-121.000000000000000, 65.000000000000000, -628.961479383289088), ]}
+{(0, 15, 3); [(46.000000000000000, -19.000000000000000, -123.623715095231844), (-30.000000000000000, 84.000000000000000, 980.677685274976625), ]}
+{(0, 15, 4); [(69.000000000000000, -12.000000000000000, 430.163254796638057), (84.000000000000000, -13.000000000000000, 679.003308436807629), ]}
+{(0, 15, 5); [(-115.000000000000000, 42.000000000000000, 519.359752710566909), (44.000000000000000, 49.000000000000000, 90.796498009738059), ]}
+{(0, 15, 6); [(105.000000000000000, -85.000000000000000, 16.140331121891030), (-108.000000000000000, 23.000000000000000, -448.870417901860094), ]}
+{(0, 15, 7); [(28.000000000000000, -85.000000000000000, 235.411676264766868), (-156.000000000000000, 3.000000000000000, -424.259027395042324), ]}
+{(0); [(132.000000000000000, -67.000000000000000), (38.000000000000000, 62.000000000000000), ]}
+{(1, 14, 1); [(-69.500000000000000, 20.300000000000001, 467.225670906984419), (-71.500000000000000, 25.399999999999999, 983.755462977823527), ]}
+{(1, 14, 2); [(-81.099999999999994, 57.100000000000001, 886.094239602465336), (118.200000000000003, 41.600000000000001, -705.783532627241016), ]}
+{(1, 14, 3); [(-65.000000000000000, -40.700000000000003, -112.080135125796446), (-53.799999999999997, -43.899999999999999, -154.360805343933521), ]}
+{(1, 14, 4); [(40.000000000000000, 71.599999999999994, -213.685311617196163), (-110.200000000000003, 7.700000000000000, -467.374994852750092), ]}
+{(1, 14, 5); [(3.200000000000000, 13.300000000000001, 675.195570535907564), (168.199999999999989, 68.500000000000000, -470.658622832800177), ]}
+{(1, 14, 6); [(129.599999999999994, -82.000000000000000, -848.764052731434731), (-102.500000000000000, 0.300000000000000, -373.610514054078806), ]}
+{(1, 14, 7); [(-19.699999999999999, 29.699999999999999, -512.300814618991467), (-45.799999999999997, 89.400000000000006, 22.731626716685081), ]}
+{(1); [(149.699999999999989, -69.599999999999994), (29.100000000000001, -45.000000000000000), ]}
+{(2, 13, 1); [(-103.819999999999993, 9.859999999999999, -603.138584904996719), (-124.200000000000003, 62.420000000000002, 274.871067222638203), ]}
+{(2, 13, 2); [(143.039999999999992, -75.840000000000003, 717.413592862660039), (-70.010000000000005, 3.410000000000000, 616.398249487439216), ]}
+{(2, 13, 3); [(-61.600000000000001, 67.390000000000001, 758.787262266232688), (35.750000000000000, 69.950000000000003, 83.411681304012504), ]}
+{(2, 13, 4); [(41.619999999999997, -55.670000000000002, 314.423563957637327), (-165.189999999999998, 72.579999999999998, -119.721413860354701), ]}
+{(2, 13, 5); [(-118.930000000000007, 69.129999999999995, 265.366117504635383), (0.730000000000000, -32.060000000000002, 667.241240638668728), ]}
+{(2, 13, 6); [(-99.230000000000004, 14.199999999999999, 203.195078741524213), (-176.430000000000007, 79.030000000000001, -154.062085678639903), ]}
+{(2, 13, 7); [(88.230000000000004, 72.040000000000006, 821.728559501759150), (37.689999999999998, -73.219999999999999, -347.645370065438897), ]}
+{(2); [(-66.280000000000001, -17.660000000000000), (52.020000000000003, 13.580000000000000), ]}
+{(3, 12, 1); [(124.436000000000007, -81.691999999999993, 976.922106395031051), (146.854999999999990, 46.256999999999998, -642.932785872019963), ]}
+{(3, 12, 2); [(-174.854000000000013, 73.644999999999996, -916.594161748391002), (-139.497000000000014, 23.314000000000000, 655.470405937409055), ]}
+{(3, 12, 3); [(71.254999999999995, -73.733999999999995, -769.885117253900034), (68.209999999999994, -31.422999999999998, -375.388784214021996), ]}
+{(3, 12, 4); [(-6.776000000000000, -50.539000000000001, -834.860701015707036), (-41.729999999999997, -68.436000000000007, -983.572709529895974), ]}
+{(3, 12, 5); [(51.220999999999997, -50.935000000000002, -401.088703661064983), (61.972999999999999, -31.677000000000000, -267.935824724195015), ]}
+{(3, 12, 6); [(98.576999999999998, -77.417000000000002, -260.218528743023001), (72.456000000000003, 50.591999999999999, -575.994655497068038), ]}
+{(3, 12, 7); [(-179.492999999999995, -16.853000000000002, -599.587980511548039), (-134.229000000000013, -14.346000000000000, -892.926313462668986), ]}
+{(3); [(165.473000000000013, 7.243000000000000), (18.113000000000000, 35.866000000000000), ]}
+{(4, 11, 1); [(-87.671400000000006, 12.858700000000001, -712.533747708729948), (172.154100000000000, -38.863500000000002, -264.682021094509992), ]}
+{(4, 11, 2); [(-129.383999999999986, 58.277000000000001, -291.863359028300010), (-169.315599999999989, 40.673499999999997, 398.562329870690007), ]}
+{(4, 11, 3); [(166.685699999999997, 64.337100000000007, 175.201704576959997), (-50.591700000000003, 24.444800000000001, 536.689308441489970), ]}
+{(4, 11, 4); [(151.356200000000001, 86.418300000000002, 558.059403676009993), (122.263900000000007, -27.195499999999999, 818.860656393689965), ]}
+{(4, 11, 5); [(60.622799999999998, -50.801400000000001, 778.957509113490005), (82.897400000000005, -44.751899999999999, -940.753864567029950), ]}
+{(4, 11, 6); [(-62.667700000000004, 88.487399999999994, 231.787305534399991), (138.048300000000012, -74.972200000000001, 144.396211112140008), ]}
+{(4, 11, 7); [(37.904400000000003, -5.807300000000000, -817.703847733559996), (-10.408799999999999, 46.988500000000002, 134.633188873910001), ]}
+{(4); [(-144.411300000000011, 62.683700000000002), (-18.898599999999998, 6.684900000000000), ]}
+{(5, 10, 1); [(-72.284649999999999, -43.142670000000003, 643.120880325899975), (63.594560000000001, -0.892160000000000, -42.832984224000000), ]}
+{(5, 10, 2); [(-95.700590000000005, 53.578009999999999, 188.728215120399994), (-4.862450000000000, -32.400109999999998, -257.594550122200019), ]}
+{(5, 10, 3); [(-16.132690000000000, 11.849720000000000, 492.240797792199999), (164.715360000000004, 86.422569999999993, 331.196353159900013), ]}
+{(5, 10, 4); [(127.251379999999997, -33.886180000000003, -685.433826579199945), (155.042689999999993, -56.327050000000000, 473.747114781400001), ]}
+{(5, 10, 5); [(-45.580500000000001, -41.394979999999997, 374.279795723400014), (-102.532790000000006, -55.783569999999997, -779.885864589499988), ]}
+{(5, 10, 6); [(-85.376609999999999, 85.449709999999996, 797.101019441700032), (-158.111490000000003, 16.250389999999999, -683.673245703699990), ]}
+{(5, 10, 7); [(157.908729999999991, 64.218500000000006, -405.599320725700011), (150.226270000000000, 62.333440000000003, -662.788375223899948), ]}
+{(5); [(95.694090000000003, -5.656000000000000), (39.173549999999999, -68.113069999999993), ]}
+{(6, 9, 1); [(-147.371212000000014, -65.049169000000006, 764.500844039999947), (-38.258935000000001, -76.712637999999998, -635.131326682000008), ]}
+{(6, 9, 2); [(129.412317999999999, -68.617121999999995, -437.125494457999991), (-105.316654999999997, 80.068516000000002, 839.973604076000015), ]}
+{(6, 9, 3); [(117.001904999999994, 4.357320000000000, 604.595359988000041), (-50.091005000000003, -9.487428000000000, 393.505968483000004), ]}
+{(6, 9, 4); [(172.858654000000001, -46.982396999999999, -258.658795752000003), (-58.968618999999997, 86.742090000000005, -180.715148883000012), ]}
+{(6, 9, 5); [(-104.102922000000007, 74.910601000000000, -682.158035246000054), (-56.638961999999999, 68.357586999999995, 449.473777800999983), ]}
+{(6, 9, 6); [(167.420674999999989, 11.951025000000000, -528.985294826999962), (-68.018859000000006, 3.467421000000000, -179.206823619999994), ]}
+{(6, 9, 7); [(145.332322000000005, 59.913395999999999, 978.339917105000040), (-141.030431999999990, 89.245014999999995, 993.450596647999987), ]}
+{(6); [(106.225813000000002, -15.354350999999999), (162.440475999999990, -64.563202000000004), ]}
+{(7, 8, 1); [(128.651322499999992, -49.864493299999999, 119.050213560000003), (-29.753112300000002, 35.322063999999997, -665.423344219999990), ]}
+{(7, 8, 2); [(97.547068800000005, -85.426051799999996, -940.055633289999946), (-75.442530399999995, -13.587594400000000, 885.333428730000037), ]}
+{(7, 8, 3); [(-19.005702500000002, 64.577576800000003, 577.154229669999950), (37.039072400000002, 27.000987899999998, -517.013614999999959), ]}
+{(7, 8, 4); [(172.902740499999993, 2.989476000000000, 74.013731129999996), (-23.460602000000002, 25.541405600000001, 134.082122349999992), ]}
+{(7, 8, 5); [(-92.133890300000004, 38.370960400000001, 719.964168070000028), (-118.982805400000004, -24.778047500000000, -905.949539410000057), ]}
+{(7, 8, 6); [(18.878961799999999, 42.660064100000000, -333.742181159999973), (-133.305168199999997, -20.854327699999999, 879.367146159999947), ]}
+{(7, 8, 7); [(-15.188042400000000, -0.756051200000000, -688.297359799999981), (-80.548968000000002, 86.949077500000001, 745.863082350000013), ]}
+{(7); [(-91.794220100000004, 41.681522500000000), (-139.096931200000000, 78.328906900000007), ]}
+{(8, 7, 1); [(-89.139280420000006, -20.414106980000000, -713.981716699999993), (161.607705820000007, -62.950260960000001, -472.053403300000014), ]}
+{(8, 7, 2); [(-72.391130219999994, 75.844741540000001, 593.547143799999958), (53.992365200000002, -52.668221230000000, 71.938582600000004), ]}
+{(8, 7, 3); [(-26.448574189999999, -48.938803450000002, 170.612429399999996), (93.072003789999997, 55.484355309999998, 667.976624300000026), ]}
+{(8, 7, 4); [(114.626329310000003, 66.435589559999997, -860.515886199999954), (-153.329184940000005, -88.829935899999995, -13.796511300000001), ]}
+{(8, 7, 5); [(56.123883690000000, -62.660666020000001, 476.085172399999976), (-106.094184679999998, -6.997272370000000, 90.583369599999997), ]}
+{(8, 7, 6); [(133.447773149999989, -40.709803209999997, -241.707502299999987), (-118.205646750000000, -71.518740649999998, -51.963188600000002), ]}
+{(8, 7, 7); [(1.245825070000000, -59.507198610000003, -104.830665699999997), (172.637697300000013, 82.099867020000005, 938.328041399999961), ]}
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/thirdparty/flexible-polyline/test/round_half_up/encoded.txt
^
|
@@ -0,0 +1,3072 @@
+Bw8BhGkCg-impzk4v21M
+Bg9BsJ8C_jj0kqlo3liU
+Bw9B2GYgw6tphnqwz5gB
+Bg-BvFgD_ng1gy-43mmoB
+Bw-B2FxC_nl961_v8wypB
+Bg_B5G0Egg7kozm467gL
+Bw_B3KjF_3v5xx2n-hg0B
+BA3E0E
+Bx4BmW23B0nyxx1yqg1T
+Bh5B1nDuxBgx6sk7n3hylF
+Bx5BmZhK_79jur_78otE
+Bh6B-Ey3Bwqhnv1ks8usD
+Bx6BroD0zBg32q6lw4tj_C
+Bh7BhEwsBnpiu3lol4ta
+Bx7BykCtMwshz3j-hh-zB
+BBoX2jB
+By0Bp0Tx9Djtx3lwoit9N
+Bi1Bw-d1nN5w51qssz3oB
+By1B00YwrDs0-831--76L
+Bi2BmyXi7Huywkp6thq4N
+By2BvjUpnE9-t27ty-wuG
+Bi3B05T-rOu9804_290nO
+By3BmhPxnM31ss-tq40mR
+BC7sV87D
+BzwB807J0o9Bk5j-q02piK
+BjxB55rDpmrElvrswxihhmB
+BzxBym5G3qlBqj8_zirj0f
+BjyBjqP8x0D3krtu0_pnxB
+BzyBq2-Bi3ax34sn-ki1H
+BjzBjg-DonkClzk4y21x2F
+BzzBht2EkyzD_-xvi9mvp1B
+BD75-Jj37C
+B0sBgvjP1yqgBjovx68uqoB
+BktBlku1BxrsBhw4utoog0D
+B0tBu0zV5g_tBw014t2_nyE
+BkuBq6o5BzmrZjhmosq1kpF
+B0uB20phDw89uB8l1k8h4xK
+BkvBt_0Jskue_l1zog637E
+B0vBv9xD__p1Br-5hyuu6hE
+BE5r8tBunzW
+B1oBt7iwBqzx_Psovwh6r-B
+BlpBw86-d55m-Pxl3zhhovE
+B1pBq1iqBx-ziDyw6zhgn1D
+BlqBzp0wdpwh3Bqxuunn_6B
+B1qBlvtL3unwMuvlhpmsyH
+BlrBlir3Xn3kzOjum_g0v3O
+B1rB_qwlbw3vnPpy6nvmp2O
+BF4lj8W_-0-J
+B2kBtv-7xB-h5srD6-w_lzzG
+BmlB4h8mhCpj32jDiutgk3uB
+B2lBwiurxJiktkqFr87oihyZ
+BmmB5mpyxJ3mzsd_r6gz10P
+B2mB755-8H_sns1Cz9yhlowf
+BmnBny9qtE2p75oDxnk5quqc
+B2nB062pD35gsrCo0vuw1hd
+BGpl41zB9npq1D
+B3gBz5h3g0Bz06on1Brvz85kG
+BnhB71rkn7Bznh7qvBui97_2oE
+B3hBtp8rwTs8l3oM0v3txqnE
+BniBrt84pkB3s3q6F26s32wnC
+B3iBxpvg2Us8u84fqv2qspzF
+BnjBpjxi1qBrl2iwtB4jo_6rzD
+B3jB9nhsgGuqh0omBp6i1jsiD
+BHqnithEmylmqxB
+B4coy3lpiDxlp-_iM-vi1q4E
+Bodrniz-yHghq6k_B597mw8O
+B4dy05pgoGp55wgyJkg4wxU
+Boes4k55yYz1vithI12i6g_J
+B4e06hu2rO9wzysiGp2mzmpL
+Bofuly1s0Un_wihqOyp1-7jJ
+B4f9z802-M0gx7qyMo8kvv4M
+BIq6ogm7Dgpo_moC
+B5Y8t6kg1iKrjupqigDuhntklB
+BpZt_k4448Gv-pv1w8Djx9k4Y
+B5Zv7tvxgxGv16vtwB0yg7nyB
+Bpals1kn-5D5q8t3hZm8qozjB
+B5aq866tltI765-n8pCx_5hsX
+Bpb1ynq1miE5m9v477Egyg8nrB
+B5bzsg-vvnGgu-wqnZ93r52Y
+BJ8phlg3-Co2r8i6M
+B6Ung3ym2zV7uu3t88WtnkynD
+BqVwk71-lsrC97zo-hjRui0r8C
+B6Vn7r4_k7kD45g0_zihBsgntuD
+BqWx4l2nvq1C9or5jzre9sq8hC
+B6Wj986zkn0Cm9sw4w8Ys05ivB
+BqX_pxuwyv2Bz0lwrzgtB1v6jgF
+B6X-9ooxg2Nwsjgm7rc6y73sF
+BKpx08o31zBu5n85tpzB
+B7Quj8tm_v7fkk-smh8_H81pqF
+BrRxs7q54gNvl86pgvxGonvoD
+B7R12k_vl5rFi1vjyvpvC5nszO
+BrSjz-0nmz-J1mmqyo5zJ5n6mF
+B7Slk2sk-7uR34j9npygQm57iL
+BrT4_-m_w78B539kitv3K5si-R
+B7T1l4puqkwJl8l-5tskImjp3Q
+BLy_xjnkqvG6z2oyso4F
+B8Mx-129y_uOp5zjjx8t0D0izZ
+BsNl37o_ss39Cg241uloqyB7py3B
+B8Nirmi16zsrD58ilx26xmB7m6M
+BsO5j5vgqgvtG9krt6gh78B2mjT
+B8Oh-z3pxwrjE64utgzv6lCmnztB
+BsPo9mivzqg0Bgy2n0i7n_C1zyiB
+B8Prq3v06601Jo6yh6stvlEgz-P
+BMxug56v3-1Bxr7mizkklB
+B9Izh692wim6qC7j7sj66mjlBvsrC
+BtJrw_wtzhvn0Bk3l_8rxpuL8r_C
+B9J1g7pujv9tvCzg_xpy9tgcglwB
+BtKit08qj7mgiD8g05x9p10gBiixB
+B9Kji449q12j5Byg8lqontve9vuB
+BtL1hi5-j2u8vBrwsplyvp2L-yiF
+B9LzwssuhwkhmC4_89tmwv6oB3kvB
+BNvw5_io4q-Eml7lw04s9H
+B-Ez5u3tn3i32Uz17_21q64mFisP
+BuF-2gr7hm55nGul0nskm00rJwrC
+B-F2ykqy2npmvBvpkx903tyzImgF
+BuGzrnq-y2vn9Zu0-j5uz_29NlwL
+B-G33z-v_8_6lM1z97z8zq05J8lO
+BuHs29whk95gkVg5s9otjvvqD6-C
+B-H4_0zl27kzvUqr1g9_g-85PimM
+BO2ok8_zipq5Po-s5kkqh76F
+Bf_r8t_x3lw89Gsl78iquu50fxI
+BvB_p0-14nxo8kIvhyy2ow5ogvDosB
+B_Bvlx9vkm9j4lCnl09-_x57iRwlB
+BvC_15zrhvwiohIgw2sy5u30lzD84B
+B_C_r47mpv327kJgkp8zh1z18oElmB
+BvDgrw-590nponG79s0ywwrgwCqG
+B_Dgw967lgqmpxJgyxq9rj7zmgCg7B
+BPgvh40gqumqzCo_pkoi18uj-B
+Bw8BJxCgw2xs4263wiUqL2B_ipn3o43izha
+Bg9B-ErBgsot95wymixGvMuF_7u7-th7wqupB
+Bw9B8ClB_1-iiopnmz7G3EuGguvhh2uxo0p9B
+Bg-BqEXg4rxy97s-j8XeBgokyj7ut9g6N
+Bw-BlH0Cgg6q-is8ly6c-JO_q0pnwzggp5X
+Bg_ByGpFstrviv9iv1cpN4Gr9lypgg05g6Z
+Bw_B4BpFg6u237grzliNvLwF_58_ro0g-5zkB
+BAoIlE7FiI
+Bx4BtrB2Mws89t-q77_yCnBmDw4rqnljnk47C
+Bh5B1yB2jBgwk882pz7s9Ey8D1Jvwm2-hl8446I
+Bx5BzoBtZ3jt4hgooj9TgH_B387v9w85qwH
+Bh6BgZ4sB_zxwo9mk1-lB79C9nB_jw5n5p8hitB
+Bx6BgCqIwu2oytvrh-3DknDwiBv31tgwn1txrG
+Bh7BgxCnzB_q04jygp142EhxEuzBwipn1sz99s0C
+Bx7BpMySv4nnr3m_ig7CpQqlBoqmm9k26ph_C
+BBy9CvrBrrCsP
+By0B7oU09B925khz7g72Kr_DwoK67l6nm88izP
+Bi1Bg-b_5Ow6uizv1153MxzpBqvP_ox5ys1ut5B
+By1B_gMmlNurp5okqoqvNugTgQzr069vqg9_L
+Bi2BkkI97Kqzrssozq3yFxsoByhZ_0366r0h52H
+By2BpnXiwNktwl2jt_62E8rXt4T6y32yvjiukH
+Bi3BlsT44C0smq8ojjwzDviPm1Mxqlm5nhvirG
+By3BunRoiOw34i9k_kjzO77J7rc5qji64m524U
+BCn-MruDsjXojG
+BzwBohzH3x_Eu58_jnrgx3Bm5rB685H1i7ju7-vi8C
+BjxBrw1K66vEt6kot15oj0B6hlC1piDwq57jumyr5C
+BzxBulrErgwE3wk694mt4rBp-Fu0yCswkv512ytW
+BjyBvnN12iD1pv1wnpzuvBzokCx-iB5o9ju2lwuI
+BzyBqhkDtvjDxgiy29ty5WggV0zlBsyhzhywmyH
+BjzBixgGxm3E9m_g_42q5OxgzByg6H5vu077ys-R
+BzzBpy-Kp9gB3zk8y0z0iiBgt4C28Ehl5pknxy1Q
+BDimjK2kO_5_I-83B
+B0sBzqw1B2k7Hxrv-i4vzhE-2y-Ermyf8qi7p86uxC
+BktB_g_uCknyjB7mm8l57i1Bn9rYl63K2ijs555y9D
+B0tByy3lD2yonBgmtlx757fr2zkE1krYq5t2gqk4hC
+BkuB0ls8Cu730Bivgio1qwlD1m4RzgrlCwt_ozgiuvB
+B0uBohglB7mgfq3igykk2tE0hzN-k2Dn_33xmh64J
+BkvBp_nmB0og2Bgmghg4llqBwnw6Dny4jDjrpuw718P
+B0vBoqkXxtxD3uoz3m130E3zvdslngB2smvizqntF
+BEhxk4CqpomButzsCn3liB
+B1oBhjm5N1pqnI27lq9hr2Li9q9Z2h8hI1_g1r8ovM
+BlpB1wjoSyugnKoy_g5q7tDs6tqRnz4sQz0kljt5jI
+B1pBp9uiD4sqoCk8hks2w-Iq85viBqglnOlntg_139C
+BlqBk51oYzs6uG_rh3sm_uM2_zpFt_-oEs-461t3iV
+B1qBjum2Iz-08Hknkykw75G5vz7K1o63Cx_k-qg6_U
+BlrB5jjpQ2sxpQi_1snl_vO_g-7N3vrmN7ju2ny99a
+B1rByx5je01-nMx9kjh8isHrv8uBzlwLr1o9zw21E
+BFioioS_1wiBrl_4K10m9L
+B2kB3s6i5Ihlpi8Dwgv05_vsBq91jwG5m8nWjunwygvxC
+BmlB8t262Hj6h8iEzr722muZ5g32_Ns0hz7Is6gnh5qqC
+B2lBirnl_Gws-pIovok2kmjB7qx2-J3wgtah5_h9lpM
+BmmB8xu2pK5vyz5Cvugwo5hPx0zl6Nu08h_Hqp125lxE
+B2mBzg-xmGy4l8uE7yom5z2nBwh_w6Cr7-vMu7wsw67hC
+BmnBmwxq_Ji7t5W1-js_p5e76iihOnx5lQuy0vtwrU
+B2nBkmsm1Ior6oyDiz2pzp-4BjommiRmqo-3Bu_1q1kc
+BGqpwzqG9-kpduoinrDlhv79C
+B3gBykx61sCp87i3d466gzlW3zsqt-Cq-354yBj4zu6jyE
+BnhBgmgyk6Bry9r9yBh8nsljvFvjvwjnD872m6qB0l1qlg0K
+B3hBhklwqLw5g3vmBuv7tjwrDqwg_shBh492sWllx-35rG
+BniB60u7hnDwm0g5By7-_k5Nhx1qh1DgszkuNk1rkhmL
+B3iBthiq92Bo6477WuyxoqjmE97ojgQ9hjv0lB3_2tm7uJ
+BnjBk35ioLis01tZn4zool-Bnp6126C7uju7lB4v3n2-hH
+B3jBvuh2hJ_zutO3i2pymgEvyk1-mBu5-6o0Bur1sokrI
+BHx73622Bynsg7Ytipnmcon5_6V
+B4cz2_-pzQzo6115D9s7jypNg4kmy2uBryikx9H8rqtmwE
+Bod7zswvvN0iynikO80tg5hLsu03pxXph88_9X3mz882J
+B4d1kp109Exh4q2jJsgyl2lDs823soWomsktuT6tgvuoJ
+Boem-ynnrV4i1y_rM78mh9gQhs1uk9xBj-xxu9cq5v814P
+B4eihg5wuKzqryv1L4wqz47Ipvw08meqys-4rK3i074lH
+Bofmmykt7Yhu940yH90xmiwEryyi_7uB_y6q03Fi03ijxD
+B4f2m9ztHp3jj2iLh-xvv-Buh_sy9fmg-shsa-vx14tT
|
[-]
[+]
|
Added |
_service:tar_git:harbour-pure-maps-2.9.0.tar.xz/tools/generate-router-here-lang.py
^
|
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+
+# To run this code:
+#
+# 1. get router-here-lang.csv by copying list from
+# https://developer.here.com/documentation/routing-api/dev_guide/topics/languages.html
+# into LibreOffice Calc and saving it into CSV
+#
+# 2. run this script from main directory python tools/generate-router-here-lang.py
+
+import csv
+import glob
+import langcodes
+import polib
+from addict import Dict
+
+def check_translations(lcode, name):
+ for pofile in glob.glob("po/*.po"):
+ tgt = pofile.split('/')[1].split('.')[0]
+ po = polib.pofile(pofile)
+ for entry in po.untranslated_entries():
+ if entry.msgid == name:
+ entry.msgstr = lcode.display_name(tgt)
+ print(entry.msgid, entry.msgstr)
+ po.save(pofile)
+
+# get list of all supported languages
+Langs = []
+with open('tools/router-here-lang.csv', newline='') as csvfile:
+ reader = csv.DictReader(csvfile)
+ for row in reader:
+ d = Dict(
+ lang=row['language'].strip(),
+ code=row['code'].split(',')[-1].strip()
+ )
+ Langs.append(d)
+
+# for l in Langs:
+# lcode = langcodes.get(l.code)
+# print(l.code, lcode.display_name(), lcode.autonym())
+
+# #Langs = ["en_GB", "en_US", "fr_CA", "fr_FR", "de_DE", "ru_RU", "es_MX", "es_ES"]
+#Langs.sort()
+
+ltxt = '[\n'
+for L in Langs:
+ lng = L.code
+ lcode = langcodes.get(lng)
+ autonym = lcode.autonym()
+ name = lcode.display_name()
+ #ui = '"%1 / {auto}".arg(app.tr("{name}"))'.format(name=name, auto=autonym)
+ ui = 'app.tr("{name}")'.format(name=name, auto=autonym)
+
+ # fill all translations
+ check_translations(lcode, name)
+
+ if autonym == lng:
+ print("Skipping since we don't know much about it: " + lng)
+ continue
+
+ ltxt += ' { "key": "%s", "name": %s },\n' % (lng, ui)
+ print(lng, '/', autonym, '/', name, '/', L.lang)
+
+ltxt = ltxt[:-2] + "\n]"
+
+print()
+print(ltxt)
|
[-]
[+]
|
Changed |
apikeys.py
^
|
@@ -1,22 +1,25 @@
Keys = {
# https://developer.foursquare.com
- "<FOURSQUARE_CLIENT>": "VPHEZ1S5LTHEXFI4NUTYQOOONQ4MVP0USSXOFNQC2LWFVCRD",
- "<FOURSQUARE_SECRET>": "WEVXECMIGNCHHQLUIUOIWM50IVBHR5QNMTMRGATKTBWAKPXP",
+ "FOURSQUARE_CLIENT": "VPHEZ1S5LTHEXFI4NUTYQOOONQ4MVP0USSXOFNQC2LWFVCRD",
+ "FOURSQUARE_SECRET": "WEVXECMIGNCHHQLUIUOIWM50IVBHR5QNMTMRGATKTBWAKPXP",
# mapbox.com
- "<MAPBOX_KEY>": "pk.eyJ1IjoicmluaWd1cyIsImEiOiJja2I4NmhsMmMwMThmMnlvYm90YmgxcHR2In0.RVmh6Ye8o3V_xiRBwm82JA",
+ "MAPBOX_KEY": "",
+ # maptiler.com
+ "MAPTILER_KEY": "5hIL7WhSDkHVhW0fN47o",
+
# http://open.mapquestapi.com
- "<MAPQUEST_KEY>": "m9SpZBHmxPEmZyobkOhMhdhGfkhui4bK",
+ "MAPQUEST_KEY": "m9SpZBHmxPEmZyobkOhMhdhGfkhui4bK",
- # https://geocoder.opencagedata.com/api [old key]
- "<OPENCAGE_KEY>": "0039dc979e2c48a09149d49c24937074",
+ # https://geocoder.opencagedata.com/api
+ "OPENCAGE_KEY": "0039dc979e2c48a09149d49c24937074",
# https://docs.stadiamaps.com/
- "<STADIAMAPS_KEY>": "f0782c85-8dd3-4855-b068-743464d5c175",
+ "STADIAMAPS_KEY": "f0782c85-8dd3-4855-b068-743464d5c175",
# here.com
- "<HERE_APP_ID>": "xt1AJYwdLQvzCZzKblGY",
- "<HERE_APP_CODE>": "JZ8ShcgKmK_sJtR4CQauhA",
+ "HERE_APIKEY": ""
}
+
|