diff --git a/.github/ISSUE_TEMPLATE/1-support-request.md b/.github/ISSUE_TEMPLATE/1-support-request.md new file mode 100644 index 0000000000..6db5e39f86 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-support-request.md @@ -0,0 +1,16 @@ +--- +name: "❓ Support request" +about: Questions and requests for support +--- + +🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑 + +Please do not file questions or support requests on the GitHub issues tracker. + +In case you aren't sure whether to open an issue or not, please send your request to support@osmand.net. + +You can get your questions answered using the [Google group](https://groups.google.com/forum/#!forum/osmand) or chat in real-time via our Telegram instances: [English](https://t.me/OsmAndMaps), [German](https://t.me/deosmand), [French](https://t.me/frosmand), [Ukrainian](https://t.me/uaosmand), [Italian](https://t.me/itosmand), [Russian](https://t.me/ruosmand). + +Thank you! + +🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑 diff --git a/.github/ISSUE_TEMPLATE/2-faq-report.md b/.github/ISSUE_TEMPLATE/2-faq-report.md new file mode 100644 index 0000000000..531d263d7f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-faq-report.md @@ -0,0 +1,12 @@ +--- +name: "📚 Outdated FAQ" +about: Report an issue in FAQ +--- + +🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑 + +Please do not file FAQ issues on the GitHub issues tracker. + +Instead use the [Google group](https://groups.google.com/forum/#!forum/osmand) to fix wrong or outdated FAQ. + +🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑 diff --git a/.github/ISSUE_TEMPLATE/3-bug-report.md b/.github/ISSUE_TEMPLATE/3-bug-report.md new file mode 100644 index 0000000000..0fd8c3e5ff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-bug-report.md @@ -0,0 +1,18 @@ +--- +name: "\U0001F41E Bug report" +about: Report a bug in OsmAnd +--- + +### Description + + +### How to reproduce? + + +### Your Environment +OsmAnd Version: +Android/iOS version: +Device model: + +**Maps used (online or offline):** +If you have an issue related to offline maps, tell us the exact name of the map file where the issue occurs and its edition date. diff --git a/.github/ISSUE_TEMPLATE/4-routing-report.md b/.github/ISSUE_TEMPLATE/4-routing-report.md new file mode 100644 index 0000000000..216cd4b402 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4-routing-report.md @@ -0,0 +1,72 @@ +--- +name: "\U0001F6A9 Routing report" +about: Report a routing issue in OsmAnd +--- + + + +# 🐞 routing report + +### Routing engine + + + +- [ ] OsmAnd's in-app offline routing +- [ ] Any online routing provider (YOURS, OpenRouteService, OSRM, etc.) + +### Routing Profile + + + +### Start and end points + + + +### Actual and expected routes + + + +### Is this a regression? + + + Yes, the previous version in which this bug was not present was: .... + +## 🌍 Your Environment + +**OsmAnd Version:** + +

+
+
+
+
+ +**Device and Android/iOS version:** + +**Maps used (online or offline):** + + + +- [ ] Offline maps offered within the OsmAnd app for download. + +- [ ] Online (tile / raster) maps + +**Anything else relevant?** diff --git a/.github/ISSUE_TEMPLATE/5-feature-request.md b/.github/ISSUE_TEMPLATE/5-feature-request.md new file mode 100644 index 0000000000..9c46069f8c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/5-feature-request.md @@ -0,0 +1,34 @@ +--- +name: "\U0001F680 Feature request" +about: Suggest a feature for OsmAnd +--- + + + +# 🚀 feature request + +### Description + + + +### Describe the solution you'd like + + If you have a solution in mind, please describe it. + +### Describe alternatives you've considered + + Have you considered any alternative solutions or workarounds? diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml new file mode 100644 index 0000000000..405a2b3065 --- /dev/null +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -0,0 +1,10 @@ +name: "Validate Gradle Wrapper" +on: [push, pull_request] + +jobs: + validation: + name: "Validation" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: gradle/wrapper-validation-action@v1 diff --git a/.gitignore b/.gitignore index 5798e73f27..33e746a3d6 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,10 @@ OsmAndCore_*.aar .project out/ +# Huawei +agconnect-services.json +OsmAndHms.jks + # Android Studio /.idea *.iml diff --git a/AUTHORS.md b/AUTHORS.md index c418f81d10..59f4e936c4 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,7 +1,7 @@ -### Credits to all major contributors/developers: -Major contributors /developers listed here https://github.com/osmandapp/osmandapp.github.io/blob/master/website/help/about.html#L8 +### Credits to all major contributors / developers: +Major contributors / developers listed here https://github.com/osmandapp/osmandapp.github.io/blob/master/website/help/about.html#L8 ### Other Pull requests -Copyright © All authors of translations and pull requests could be found in commits history: +Copyright © All authors of translations and pull requests can be found in the commit history: - Translations are under special “contributor” name ‘weblate’ - - Pull requests have two committers, first is original contributor and second is project maintainer + - Pull requests have two committers: first is original contributor, and second is project maintainer diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index 8f5f620041..0000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,26 +0,0 @@ -Before entering an issue, please read the information below. - -```GitHub is a main development tool for developers. There are hundreds requests a month and there are only few developers. So by opening an issue, please know that your issue will be sent out to all developers and acknowledge that it could be closed without explanation or with a brief message. Comments on the closed issues are also sent to all developers, so you will definitely will be heard. However, there is no guarantee that a developer will pick up the issue to work on it.``` - -In case you are not sure to open issue or not, please send your request to support support@osmand.net. For **general questions** about OsmAnd, please use the [Google group](https://groups.google.com/forum/#!forum/osmand). - -Please be sure to have read our [FAQ](http://osmand.net/help-online) before creating an issue here. (Also, tell us in Google Groups when the FAQ is wrong or outdated.) - -The best way to get help about an OsmAnd issue is to create a valid and detailed issue content. -Please give us the following information so that we can try to **reproduce** your issue: - -What version of OsmAnd are you using, on what device and Android/iOS version? - -Do you use the offline maps offered within the OsmAnd app for download, or online (tile / raster) maps? - -If you have an issue related to offline maps, tell us the exact name of the map file where the issue occurs, and its edition date. - -__*In case of wrong routing:*__ - -Tell us whether you have used OsmAnd's in-app offline routing, or any online routing provider like YOURS, OpenRouteService or OSRM. - -What routing profile is chosen in OsmAnd app? (car, bike, pedestrian, fastest or shortest) - -Please specify as exactly as possible the start and end point of your route by telling us city name and street name so that we can find it via in-app address search easily. Also, a permalink from openstreetmap.org can be helpful. - -Tell us your expected routing, and how OsmAnd routes, or add screenshots here. diff --git a/LICENSE b/LICENSE index d63b1a7204..5f96ead1b4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,11 +1,11 @@ OsmAnd – OSM Automated Navigation Directions – navigation software based on OpenStreetMap. - Copyright © 2010–2018 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714, BTW 854627704B01). + Copyright © 2010–2020 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714, BTW 854627704B01). - The code in this repository is covered by *GPLv3* (for code) and the artwork is covered by [ CC-BY-NC-ND 4.0 ](https://creativecommons.org/licenses/by-nc-nd/4.0/) (for artwork), except some 3rd party libs and resources. - ATTENTION: please be aware that some artwork has proprietary license. + The code in this repository is covered by *GPLv3* (for code) and the artwork is covered by [CC-BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) (for artwork), except for some third-party libraries and resources. + ATTENTION: Please be aware that some artwork uses a proprietary license. - Main AUTHORS (more detailed list in AUTHORS): + Main AUTHORS (more detailed list in AUTHORS.md): Victor Shcherb – all parts of the project, originator Alexey Pelykh – rendering and core parts Hardy Mueller – main parts of the project, mostly rendering, UI interaction design @@ -30,33 +30,33 @@ * Source code in main repositories is covered by GPLv3 (license exceptions below): - https://github.com/osmandapp/Osmand/tree/master/OsmAnd - https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java - - https://github.com/osmandapp/Osmand-core/tree/legacy_core - - https://github.com/osmandapp/Osmand-core/ + - https://github.com/osmandapp/OsmAnd-core/tree/legacy_core + - https://github.com/osmandapp/OsmAnd-core - https://github.com/osmandapp/OsmAnd-misc - https://github.com/osmandapp/OsmAnd-tools - https://github.com/osmandapp/OsmAnd-resources - * UI Design and UX work, such as layout, icons is covered by CC-BY-NC-ND + * UI Design and UX work, such as layout and icons, are covered by [CC-BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) - https://github.com/osmandapp/Osmand/tree/master/OsmAnd/res and others Restriction to UI/UX CC-BY-NC-ND: - * Publishing applications using the OsmAnd UI/UX code to Google Play, Amazon Market or Apple Store must be done with written permission* + * Publishing applications using the OsmAnd UI/UX code to Google Play, Amazon Market, or Apple Store must be done with written permission.* * Map icons are taken from sjjb and some are drawn and distributed under Public Domain (except icons8) - https://github.com/osmandapp/OsmAnd-resources/tree/master/icons/svg - some icons are from http://osm-icons.org/wiki/Icons (CC-0 by Markus59, CC BY-SA 2.0) - * Integration with Qt library in (https://github.com/osmandapp/Osmand-core/) - dynamic linking - - LGPL (http://www.qt.io/qt-licensing-terms/) + * Integration with Qt library in (https://github.com/osmandapp/OsmAnd-core) - dynamic linking + - LGPL (https://www.qt.io/terms-conditions/) - * Map icons and their derived primitives are covered by proprietary license: + * Map icons and their derived primitives are covered by a proprietary license: - © icons8.com (https://github.com/osmandapp/OsmAnd-resources/tree/master/icons/svg/icons8) - * Generated voice files from TTS files are covered by proprietary license: + * Generated voice files from TTS files are covered by a proprietary license: - Voice files (https://github.com/osmandapp/OsmAnd-resources/tree/master/voice) * Fonts (https://github.com/osmandapp/OsmAnd-resources/tree/master/rendering_styles/fonts) - - Google Fonts (Apache License 2) + - Google Fonts (Apache License 2.0) * Map icons (Mapnik): - Open-SVG-Map-Icons - Public Domain @@ -65,49 +65,27 @@ - SherlockBar - Apache License - https://github.com/osmandapp/Osmand/tree/master/SherlockBar (https://github.com/JakeWharton/ActionBarSherlock/blob/master/LICENSE.txt) * Patched libraries: - - Protobuf - New BSD License (patches - https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/protobuf-src, https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/protobuf) - - Expat - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/expat) - - Freetype - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/freetype) - - Giflib - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/giflib) + - Protobuf - New BSD License (patches - https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/src/main/java/com/google/protobuf, https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/protobuf) - Jpeg - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/jpeg) - - Libpng - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/libpng) - Skia - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/skia) - - ZLib - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/zlib) + - android-openmap-framework - (https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/src/main/java/com/jwetherell/openmap/common) + - mapbox-vector-tile - (https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/src/main/java/com/wdtinc/mapbox_vector_tile) * 3rd party libraries present in the libs folder (https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/libs): - - bzip2-20090327.jar Bzip2 - Apache License - - commons-logging-1.1.1.jar - Apache License - gnu-trove-osmand.jar GNU trove - LGPL - - icu4j-49_1.jar - ICU license (http://source.icu-project.org/repos/icu/icu/trunk/license.html) - - json-20090211.jar - BSD alike (http://www.json.org/license.html) - - junidecode-0.1.jar - BSD-4-Clause-UC (http://sourceforge.net/projects/junidecode/) - - kxml2-2.3.0.jar - BSD license (http://www.kxml.org/) - - tuprolog.jar - LGPL (http://apice.unibo.it/xwiki/bin/view/Tuprolog/) - - OpenMap framework - Apache License (https://code.google.com/p/android-openmap-framework/) + - icu4j-49_1_patched.jar - ICU license (https://home.unicode.org/basic-info/projects/#/icu/icu/trunk/license.html) * Pull-requests and translations: - - All pull requests are accepted under MIT License (most honorable contributors are mentioned in AUTHORS list) - - * Libraries not used in final product (https://github.com/osmandapp/OsmAnd-tools/tree/master/OsmAndMapCreator/libi) - - Ant libraries - (tools) https://github.com/osmandapp/Osmand/tree/master/OsmAnd/ant-lib - - jleveldb-v01.jar - - jsch-20120101.jar - - junit-4.10.jar - - mysql-connector-java-5.1.18-bin.jar - - sqlite-jdbc-3.7.6.3-20110609.081603-3.jar - - h2-latest.jar + - All pull requests are accepted under MIT License (most honorable contributors are mentioned in AUTHORS list). * Special tools for new rendering (GPLv3) - - https://github.com/osmandapp/OsmAnd-tools/tree/master/obf-inspector - - https://github.com/osmandapp/OsmAnd-tools/tree/master/obf-verifier - - https://github.com/osmandapp/OsmAnd-tools/tree/master/route-tester + - https://github.com/osmandapp/OsmAnd-tools - * OSM data 2014 - - Extracts - https://github.com/osmandapp/OsmAnd-misc/blob/master/osm-planet/osm-data/ + * OSM data + - Extracts - https://github.com/osmandapp/OsmAnd-misc/tree/master/osm-planet/osm-data * Data files - - Country boundaries - https://github.com/osmandapp/OsmAnd-misc/tree/master/osm-planet/geo-polygons © by Geofabrik - data free to use - - Country boundaries - https://github.com/osmandapp/OsmAnd-misc/tree/master/osm-planet/gislab-polygons © by http://be.gis-lab.info - data free to use + - Country boundaries - https://github.com/osmandapp/OsmAnd-misc/tree/master/osm-planet/polygons © by Geofabrik - data free to use * Subway icons - Moscow: Art Lebedev Studio (http://www.artlebedev.ru/everything/metro/logo/) [Public domain], undefined @@ -119,7 +97,7 @@ - Kazan: «Kazan-metro-Logo» (Россиянин) - own work. Under Public domain Commons license from the site - https://commons.wikimedia.org/wiki/File:Kazan-metro-Logo.svg#/media/File:Kazan-metro-Logo.svg - Tbilisi: «Metro Tbilisi logo» (Carnby) - own work. Under CC BY-SA 3.0 license from site - https://commons.wikimedia.org/wiki/File:Metro_Tbilisi_logo.svg#/media/File:Metro_Tbilisi_logo.svg - Minsk: «Minsk metro logo» (Skip405) - own work. Under Public domain Commons license from the site - https://commons.wikimedia.org/wiki/File:Minsk_metro_logo.svg#/media/File:Minsk_metro_logo.svg - - Nizhny Novgorod: «NNMetro» (AlexTref871) - own work. This vector image includes elements borrowed from another image:  Coat of arms of Nizhny Novgorod Region.svg.. Under Public domain Commons licensefrom the site - https://commons.wikimedia.org/wiki/File:NNMetro.svg#/media/File:NNMetro.svg + - Nizhny Novgorod: «NNMetro» (AlexTref871) - own work. This vector image includes elements borrowed from another image: Coat of arms of Nizhny Novgorod Region.svg.. Under Public domain Commons licensefrom the site - https://commons.wikimedia.org/wiki/File:NNMetro.svg#/media/File:NNMetro.svg - Novosibirsk: «Logo-Nsk-Metro» (AlexTref871) - own work. Under Public domain Commons license from the site - https://commons.wikimedia.org/wiki/File:Logo-Nsk-Metro.svg#/media/File:Logo-Nsk-Metro.svg - Yekaterinburg: «Ekt-metro-logo-01» (AlexTref871) - own work. Under CC BY-SA 4.0 license from site - https://commons.wikimedia.org/wiki/File:Ekt-metro-logo-01.svg#/media/File:Ekt-metro-logo-01.svg - New York: «MTA New York City Subway logo» (Metropolitan Transportation Authority) - http://mta.info/. Under Public domain Commons license from the site - https://commons.wikimedia.org/wiki/File:MTA_New_York_City_Subway_logo.svg#/media/File:MTA_New_York_City_Subway_logo.svg @@ -152,7 +130,7 @@ - Los Angeles: "Lametro" by Los Angeles County Metropolitan Transportation Authority. Original uploader was Cheeselouise at en.wikipedia - Metro materials at http://www.metro.net/riding_metro/pocket_guide_cambodian_printers.pdf. Licensed under Public Domain via Commons - https://commons.wikimedia.org/wiki/File:Lametro.svg#/media/File:Lametro.svg * Depth maps - - The GEBCO_2014 Grid, version 20150318, www.gebco.net + - The GEBCO_2020 Grid, www.gebco.net - U.S. Bureau of Ocean Energy Management (24 may 2017,12m per pixel) - South_Padre_Island_DEM_4133: Grothe, P.G., L.A. Taylor, B.W. Eakins, K.S. Carignan, D.Z. Friday, and M. Love, 2012. Digital Elevation Models of South Padre Island, Texas: Procedures, Data Sources and Analysis, NOAA National Geophysical Data Center technical report, Boulder, CO, 15 pp. - Corpus_Christi_DEM_1035: Taylor, L.A., B.W. Eakins, K.S. Carignan, R.R. Warnken, T. Sazonova, and D.C. Schoolcraft, 2008. Digital Elevation Model of Corpus Christi, Texas: Procedures, Data Sources and Analysis, NOAA Technical Memorandum NESDIS NGDC-11, National Geophysical Data Center, Boulder, CO, 19 pp. diff --git a/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlCallback.aidl b/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlCallback.aidl index 1d7f954815..0598f31854 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlCallback.aidl +++ b/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlCallback.aidl @@ -51,4 +51,9 @@ interface IOsmAndAidlCallback { * Callback for {@link IOsmAndAidlInterface} registerForVoiceRouterMessages() method. */ void onVoiceRouterNotify(in OnVoiceNavigationParams params); + + /** + * Callback for {@link IOsmAndAidlInterface} registerForKeyEvents() method. + */ + void onKeyEvent(in KeyEvent params); } \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl b/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl index 45bf3907f7..72a3035b60 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl +++ b/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl @@ -20,6 +20,8 @@ import net.osmand.aidlapi.mapmarker.UpdateMapMarkerParams; import net.osmand.aidlapi.calculateroute.CalculateRouteParams; +import net.osmand.aidlapi.profile.ExportProfileParams; + import net.osmand.aidlapi.gpx.ImportGpxParams; import net.osmand.aidlapi.gpx.ShowGpxParams; import net.osmand.aidlapi.gpx.StartGpxRecordingParams; @@ -74,6 +76,7 @@ import net.osmand.aidlapi.customization.OsmandSettingsParams; import net.osmand.aidlapi.customization.OsmandSettingsInfoParams; import net.osmand.aidlapi.customization.CustomizationInfoParams; import net.osmand.aidlapi.customization.ProfileSettingsParams; +import net.osmand.aidlapi.customization.MapMarginsParams; import net.osmand.aidlapi.gpx.AGpxFile; import net.osmand.aidlapi.gpx.AGpxFileDetails; @@ -96,6 +99,14 @@ import net.osmand.aidlapi.mapmarker.RemoveMapMarkersParams; import net.osmand.aidlapi.quickaction.QuickActionParams; import net.osmand.aidlapi.quickaction.QuickActionInfoParams; +import net.osmand.aidlapi.lock.SetLockStateParams; + +import net.osmand.aidlapi.events.AKeyEventsParams; + +import net.osmand.aidlapi.info.AppInfoParams; + +import net.osmand.aidlapi.profile.ExportProfileParams; + // NOTE: Add new methods at the end of file!!! interface IOsmAndAidlInterface { @@ -841,4 +852,25 @@ interface IOsmAndAidlInterface { boolean executeQuickAction(in QuickActionParams params); boolean getQuickActionsInfo(out List quickActions); + + /** + * Toggle Lock/Unlock screen. + */ + boolean setLockState(in SetLockStateParams params); + + /** + * Method to register for key events. + * + * @params subscribeToUpdates (boolean) - boolean flag to subscribe or unsubscribe from key events + * @params callbackId (long) - id of callback, needed to unsubscribe key events + * @params callback (IOsmAndAidlCallback) - callback to notify user on key event + * @params keyEventList (List) - list of requested key events + */ + long registerForKeyEvents(in AKeyEventsParams params, IOsmAndAidlCallback callback); + + AppInfoParams getAppInfo(); + + boolean setMapMargins(in MapMarginsParams params); + + boolean exportProfile(in ExportProfileParams params); } \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index 2e1543321a..af48552bc4 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -4,6 +4,8 @@ public interface OsmAndCustomizationConstants { // Navigation Drawer: String DRAWER_ITEM_ID_SCHEME = "drawer.action."; + String DRAWER_SWITCH_PROFILE_ID = DRAWER_ITEM_ID_SCHEME + "switch_profile"; + String DRAWER_CONFIGURE_PROFILE_ID = DRAWER_ITEM_ID_SCHEME + "configure_profile"; String DRAWER_DASHBOARD_ID = DRAWER_ITEM_ID_SCHEME + "dashboard"; String DRAWER_MAP_MARKERS_ID = DRAWER_ITEM_ID_SCHEME + "map_markers"; String DRAWER_MY_PLACES_ID = DRAWER_ITEM_ID_SCHEME + "my_places"; diff --git a/OsmAnd-api/src/net/osmand/aidlapi/copyfile/CopyFileParams.java b/OsmAnd-api/src/net/osmand/aidlapi/copyfile/CopyFileParams.java index 1118a17f5c..ad122f60c6 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/copyfile/CopyFileParams.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/copyfile/CopyFileParams.java @@ -9,12 +9,21 @@ import net.osmand.aidlapi.AidlParams; public class CopyFileParams extends AidlParams { + public static final String DESTINATION_DIR_KEY = "destinationDir"; + public static final String FILE_NAME_KEY = "fileName"; + public static final String FILE_PART_DATA_KEY = "filePartData"; + public static final String START_TIME_KEY = "startTime"; + public static final String DONE_KEY = "done"; + private String destinationDir; private String fileName; private byte[] filePartData; private long startTime; private boolean done; - public CopyFileParams(@NonNull String fileName, @NonNull byte[] filePartData, long startTime, boolean done) { + public CopyFileParams(@NonNull String destinationDir, @NonNull String fileName, @NonNull byte[] filePartData, + long startTime, boolean done) { + + this.destinationDir = destinationDir; this.fileName = fileName; this.filePartData = filePartData; this.startTime = startTime; @@ -37,6 +46,10 @@ public class CopyFileParams extends AidlParams { } }; + public String getDestinationDir() { + return destinationDir; + } + public String getFileName() { return fileName; } @@ -55,23 +68,26 @@ public class CopyFileParams extends AidlParams { @Override public void writeToBundle(Bundle bundle) { - bundle.putString("fileName", fileName); - bundle.putByteArray("filePartData", filePartData); - bundle.putLong("startTime", startTime); - bundle.putBoolean("done", done); + bundle.putString(DESTINATION_DIR_KEY, destinationDir); + bundle.putString(FILE_NAME_KEY, fileName); + bundle.putByteArray(FILE_PART_DATA_KEY, filePartData); + bundle.putLong(START_TIME_KEY, startTime); + bundle.putBoolean(DONE_KEY, done); } @Override protected void readFromBundle(Bundle bundle) { - fileName = bundle.getString("fileName"); - filePartData = bundle.getByteArray("filePartData"); - startTime = bundle.getLong("startTime"); - done = bundle.getBoolean("done"); + destinationDir = bundle.getString(DESTINATION_DIR_KEY); + fileName = bundle.getString(FILE_NAME_KEY); + filePartData = bundle.getByteArray(FILE_PART_DATA_KEY); + startTime = bundle.getLong(START_TIME_KEY); + done = bundle.getBoolean(DONE_KEY); } @Override public String toString() { return "CopyFileParams {" + + " destinationDir=" + destinationDir + " fileName=" + fileName + ", filePartData size=" + filePartData.length + ", startTime=" + startTime + diff --git a/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.aidl b/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.aidl new file mode 100644 index 0000000000..6cba21877e --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidlapi.customization; + +parcelable MapMarginsParams; \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java b/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java new file mode 100644 index 0000000000..8b810a81b4 --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java @@ -0,0 +1,77 @@ +package net.osmand.aidlapi.customization; + +import android.os.Bundle; +import android.os.Parcel; + +import net.osmand.aidlapi.AidlParams; + +public class MapMarginsParams extends AidlParams { + + private String appModeKey; + private int leftMargin; + private int topMargin; + private int rightMargin; + private int bottomMargin; + + public MapMarginsParams(String appModeKey, int leftMargin, int topMargin, int rightMargin, int bottomMargin) { + this.appModeKey = appModeKey; + this.leftMargin = leftMargin; + this.topMargin = topMargin; + this.rightMargin = rightMargin; + this.bottomMargin = bottomMargin; + } + + public MapMarginsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public MapMarginsParams createFromParcel(Parcel in) { + return new MapMarginsParams(in); + } + + @Override + public MapMarginsParams[] newArray(int size) { + return new MapMarginsParams[size]; + } + }; + + public String getAppModeKey() { + return appModeKey; + } + + public int getLeftMargin() { + return leftMargin; + } + + public int getTopMargin() { + return topMargin; + } + + public int getRightMargin() { + return rightMargin; + } + + public int getBottomMargin() { + return bottomMargin; + } + + @Override + public void writeToBundle(Bundle bundle) { + bundle.putString("appModeKey", appModeKey); + bundle.putInt("leftMargin", leftMargin); + bundle.putInt("topMargin", topMargin); + bundle.putInt("rightMargin", rightMargin); + bundle.putInt("bottomMargin", bottomMargin); + } + + @Override + protected void readFromBundle(Bundle bundle) { + appModeKey = bundle.getString("appModeKey"); + leftMargin = bundle.getInt("leftMargin"); + topMargin = bundle.getInt("topMargin"); + rightMargin = bundle.getInt("rightMargin"); + bottomMargin = bundle.getInt("bottomMargin"); + } +} \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/customization/ProfileSettingsParams.java b/OsmAnd-api/src/net/osmand/aidlapi/customization/ProfileSettingsParams.java index 36959ef776..00c68851e7 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/customization/ProfileSettingsParams.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/customization/ProfileSettingsParams.java @@ -5,15 +5,31 @@ import android.os.Bundle; import android.os.Parcel; import net.osmand.aidlapi.AidlParams; +import net.osmand.aidlapi.profile.AExportSettingsType; + +import java.util.ArrayList; + +import static net.osmand.aidlapi.profile.ExportProfileParams.SETTINGS_TYPE_KEY; public class ProfileSettingsParams extends AidlParams { + public static final String VERSION_KEY = "version"; + public static final String REPLACE_KEY = "replace"; + public static final String LATEST_CHANGES_KEY = "latestChanges"; + public static final String PROFILE_SETTINGS_URI_KEY = "profileSettingsUri"; private Uri profileSettingsUri; private String latestChanges; private int version; + private ArrayList settingsTypeKeyList = new ArrayList<>(); + boolean replace; - public ProfileSettingsParams(Uri profileSettingsUri, String latestChanges, int version) { + public ProfileSettingsParams(Uri profileSettingsUri, ArrayList settingsTypeList, boolean replace, + String latestChanges, int version) { this.profileSettingsUri = profileSettingsUri; + for (AExportSettingsType settingsType : settingsTypeList) { + settingsTypeKeyList.add(settingsType.name()); + } + this.replace = replace; this.latestChanges = latestChanges; this.version = version; } @@ -46,17 +62,29 @@ public class ProfileSettingsParams extends AidlParams { return profileSettingsUri; } + public ArrayList getSettingsTypeKeys() { + return settingsTypeKeyList; + } + + public boolean isReplace() { + return replace; + } + @Override public void writeToBundle(Bundle bundle) { - bundle.putInt("version", version); - bundle.putString("latestChanges", latestChanges); - bundle.putParcelable("profileSettingsUri", profileSettingsUri); + bundle.putInt(VERSION_KEY, version); + bundle.putString(LATEST_CHANGES_KEY, latestChanges); + bundle.putParcelable(PROFILE_SETTINGS_URI_KEY, profileSettingsUri); + bundle.putStringArrayList(SETTINGS_TYPE_KEY, settingsTypeKeyList); + bundle.putBoolean(REPLACE_KEY, replace); } @Override protected void readFromBundle(Bundle bundle) { - version = bundle.getInt("version"); - latestChanges = bundle.getString("latestChanges"); - profileSettingsUri = bundle.getParcelable("profileSettingsUri"); + version = bundle.getInt(VERSION_KEY); + latestChanges = bundle.getString(LATEST_CHANGES_KEY); + profileSettingsUri = bundle.getParcelable(PROFILE_SETTINGS_URI_KEY); + settingsTypeKeyList = bundle.getStringArrayList(SETTINGS_TYPE_KEY); + replace = bundle.getBoolean(REPLACE_KEY); } } \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/events/AKeyEventsParams.aidl b/OsmAnd-api/src/net/osmand/aidlapi/events/AKeyEventsParams.aidl new file mode 100644 index 0000000000..972b2cb218 --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/events/AKeyEventsParams.aidl @@ -0,0 +1,2 @@ +package net.osmand.aidlapi.events; +parcelable AKeyEventsParams; \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/events/AKeyEventsParams.java b/OsmAnd-api/src/net/osmand/aidlapi/events/AKeyEventsParams.java new file mode 100644 index 0000000000..83c4d4368e --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/events/AKeyEventsParams.java @@ -0,0 +1,73 @@ +package net.osmand.aidlapi.events; + +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; + +import net.osmand.aidlapi.AidlParams; + +import java.util.ArrayList; + +public class AKeyEventsParams extends AidlParams { + + private long callbackId = -1L; + private boolean subscribeToUpdates = true; + private ArrayList keyEventList; + + public AKeyEventsParams() { + } + + protected AKeyEventsParams(Parcel in) { + readFromParcel(in); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public AKeyEventsParams createFromParcel(Parcel in) { + return new AKeyEventsParams(in); + } + + @Override + public AKeyEventsParams[] newArray(int size) { + return new AKeyEventsParams[size]; + } + }; + + public long getCallbackId() { + return callbackId; + } + + public void setCallbackId(long callbackId) { + this.callbackId = callbackId; + } + + public void setSubscribeToUpdates(boolean subscribeToUpdates) { + this.subscribeToUpdates = subscribeToUpdates; + } + + public boolean isSubscribeToUpdates() { + return subscribeToUpdates; + } + + public void setKeyEventList(ArrayList keyEventList) { + this.keyEventList = keyEventList; + } + + public ArrayList getKeyEventList() { + return keyEventList; + } + + @Override + protected void readFromBundle(Bundle bundle) { + callbackId = bundle.getLong("callbackId"); + subscribeToUpdates = bundle.getBoolean("subscribeToUpdates"); + keyEventList = bundle.getIntegerArrayList("keyEventList"); + } + + @Override + public void writeToBundle(Bundle bundle) { + bundle.putLong("callbackId", callbackId); + bundle.putBoolean("subscribeToUpdates", subscribeToUpdates); + bundle.putIntegerArrayList("keyEventList", keyEventList); + } +} \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/favorite/AFavorite.java b/OsmAnd-api/src/net/osmand/aidlapi/favorite/AFavorite.java index 1e645d2fae..39daf1d2a2 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/favorite/AFavorite.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/favorite/AFavorite.java @@ -11,16 +11,18 @@ public class AFavorite extends AidlParams { private double lon; private String name; private String description; + private String address; private String category; private String color; private boolean visible; - public AFavorite(double lat, double lon, String name, String description, + public AFavorite(double lat, double lon, String name, String description, String address, String category, String color, boolean visible) { this.lat = lat; this.lon = lon; this.name = name; this.description = description; + this.address = address; this.category = category; this.color = color; this.visible = visible; @@ -58,6 +60,8 @@ public class AFavorite extends AidlParams { return description; } + public String getAddress() { return address; } + public String getCategory() { return category; } @@ -76,6 +80,7 @@ public class AFavorite extends AidlParams { bundle.putDouble("lon", lon); bundle.putString("name", name); bundle.putString("description", description); + bundle.putString("address", address); bundle.putString("category", category); bundle.putString("color", color); bundle.putBoolean("visible", visible); @@ -87,6 +92,7 @@ public class AFavorite extends AidlParams { lon = bundle.getDouble("lon"); name = bundle.getString("name"); description = bundle.getString("description"); + address = bundle.getString("address"); category = bundle.getString("category"); color = bundle.getString("color"); visible = bundle.getBoolean("visible"); diff --git a/OsmAnd-api/src/net/osmand/aidlapi/info/AppInfoParams.aidl b/OsmAnd-api/src/net/osmand/aidlapi/info/AppInfoParams.aidl new file mode 100644 index 0000000000..0030d5376c --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/info/AppInfoParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidlapi.info; + +parcelable AppInfoParams; \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/info/AppInfoParams.java b/OsmAnd-api/src/net/osmand/aidlapi/info/AppInfoParams.java new file mode 100644 index 0000000000..8b6b2c236a --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/info/AppInfoParams.java @@ -0,0 +1,95 @@ +package net.osmand.aidlapi.info; + +import android.os.Bundle; +import android.os.Parcel; + +import net.osmand.aidlapi.AidlParams; +import net.osmand.aidlapi.map.ALatLon; + +public class AppInfoParams extends AidlParams { + + private ALatLon lastKnownLocation; + private ALatLon mapLocation; + + private Bundle turnInfo; + private int leftTime; + private int leftDistance; + private long arrivalTime; + private boolean mapVisible; + + public AppInfoParams(ALatLon lastKnownLocation, ALatLon mapLocation, Bundle turnInfo, int leftTime, int leftDistance, long arrivalTime, boolean mapVisible) { + this.lastKnownLocation = lastKnownLocation; + this.mapLocation = mapLocation; + this.leftTime = leftTime; + this.leftDistance = leftDistance; + this.arrivalTime = arrivalTime; + this.turnInfo = turnInfo; + this.mapVisible = mapVisible; + } + + public AppInfoParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public AppInfoParams createFromParcel(Parcel in) { + return new AppInfoParams(in); + } + + @Override + public AppInfoParams[] newArray(int size) { + return new AppInfoParams[size]; + } + }; + + public ALatLon getLastKnownLocation() { + return lastKnownLocation; + } + + public ALatLon getMapLocation() { + return mapLocation; + } + + public int getLeftTime() { + return leftTime; + } + + public long getArrivalTime() { + return arrivalTime; + } + + public int getLeftDistance() { + return leftDistance; + } + + public boolean isMapVisible() { + return mapVisible; + } + + public Bundle getTurnInfo() { + return turnInfo; + } + + @Override + public void writeToBundle(Bundle bundle) { + bundle.putParcelable("lastKnownLocation", lastKnownLocation); + bundle.putParcelable("mapLocation", mapLocation); + bundle.putInt("leftTime", leftTime); + bundle.putLong("arrivalTime", arrivalTime); + bundle.putInt("leftDistance", leftDistance); + bundle.putBundle("turnInfo", turnInfo); + bundle.putBoolean("mapVisible", mapVisible); + } + + @Override + protected void readFromBundle(Bundle bundle) { + lastKnownLocation = bundle.getParcelable("lastKnownLocation"); + mapLocation = bundle.getParcelable("mapLocation"); + leftTime = bundle.getInt("leftTime"); + arrivalTime = bundle.getLong("arrivalTime"); + leftDistance = bundle.getInt("leftDistance"); + turnInfo = bundle.getBundle("turnInfo"); + mapVisible = bundle.getBoolean("mapVisible"); + } +} \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/lock/SetLockStateParams.aidl b/OsmAnd-api/src/net/osmand/aidlapi/lock/SetLockStateParams.aidl new file mode 100644 index 0000000000..332f768344 --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/lock/SetLockStateParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidlapi.lock; + +parcelable SetLockStateParams; \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/lock/SetLockStateParams.java b/OsmAnd-api/src/net/osmand/aidlapi/lock/SetLockStateParams.java new file mode 100644 index 0000000000..0b71c750df --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/lock/SetLockStateParams.java @@ -0,0 +1,45 @@ +package net.osmand.aidlapi.lock; + +import android.os.Bundle; +import android.os.Parcel; + +import net.osmand.aidlapi.AidlParams; + +public class SetLockStateParams extends AidlParams { + + private boolean lock; + + public SetLockStateParams(boolean lock) { + this.lock = lock; + } + + public SetLockStateParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public SetLockStateParams createFromParcel(Parcel in) { + return new SetLockStateParams(in); + } + + @Override + public SetLockStateParams[] newArray(int size) { + return new SetLockStateParams[size]; + } + }; + + public boolean getLockState() { + return lock; + } + + @Override + public void writeToBundle(Bundle bundle) { + bundle.putBoolean("lock", this.lock); + } + + @Override + protected void readFromBundle(Bundle bundle) { + lock = bundle.getBoolean("lock"); + } +} \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/map/SetMapLocationParams.java b/OsmAnd-api/src/net/osmand/aidlapi/map/SetMapLocationParams.java index 9da5ee83f0..d441682da5 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/map/SetMapLocationParams.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/map/SetMapLocationParams.java @@ -10,12 +10,14 @@ public class SetMapLocationParams extends AidlParams { private double latitude; private double longitude; private int zoom; + private float rotation; private boolean animated; - public SetMapLocationParams(double latitude, double longitude, int zoom, boolean animated) { + public SetMapLocationParams(double latitude, double longitude, int zoom, float rotation, boolean animated) { this.latitude = latitude; this.longitude = longitude; this.zoom = zoom; + this.rotation = rotation; this.animated = animated; } @@ -47,6 +49,10 @@ public class SetMapLocationParams extends AidlParams { return zoom; } + public float getRotation() { + return rotation; + } + public boolean isAnimated() { return animated; } @@ -56,6 +62,7 @@ public class SetMapLocationParams extends AidlParams { bundle.putDouble("latitude", latitude); bundle.putDouble("longitude", longitude); bundle.putInt("zoom", zoom); + bundle.putFloat("rotation", rotation); bundle.putBoolean("animated", animated); } @@ -64,6 +71,7 @@ public class SetMapLocationParams extends AidlParams { latitude = bundle.getDouble("latitude"); longitude = bundle.getDouble("longitude"); zoom = bundle.getInt("zoom"); + rotation = bundle.getFloat("rotation"); animated = bundle.getBoolean("animated"); } } \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/profile/AExportSettingsType.aidl b/OsmAnd-api/src/net/osmand/aidlapi/profile/AExportSettingsType.aidl new file mode 100644 index 0000000000..99c59bba2a --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/profile/AExportSettingsType.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidlapi.profile; + +parcelable AExportSettingsType; \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/profile/AExportSettingsType.java b/OsmAnd-api/src/net/osmand/aidlapi/profile/AExportSettingsType.java new file mode 100644 index 0000000000..23c0189615 --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/profile/AExportSettingsType.java @@ -0,0 +1,11 @@ +package net.osmand.aidlapi.profile; + +public enum AExportSettingsType { + PROFILE, + QUICK_ACTIONS, + POI_TYPES, + MAP_SOURCES, + CUSTOM_RENDER_STYLE, + CUSTOM_ROUTING, + AVOID_ROADS; +} diff --git a/OsmAnd-api/src/net/osmand/aidlapi/profile/ExportProfileParams.aidl b/OsmAnd-api/src/net/osmand/aidlapi/profile/ExportProfileParams.aidl new file mode 100644 index 0000000000..0dfefce6be --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/profile/ExportProfileParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidlapi.profile; + +parcelable ExportProfileParams; \ No newline at end of file diff --git a/OsmAnd-api/src/net/osmand/aidlapi/profile/ExportProfileParams.java b/OsmAnd-api/src/net/osmand/aidlapi/profile/ExportProfileParams.java new file mode 100644 index 0000000000..931f52eeb8 --- /dev/null +++ b/OsmAnd-api/src/net/osmand/aidlapi/profile/ExportProfileParams.java @@ -0,0 +1,61 @@ +package net.osmand.aidlapi.profile; + +import android.os.Bundle; +import android.os.Parcel; + +import net.osmand.aidlapi.AidlParams; + +import java.util.ArrayList; +import java.util.List; + +public class ExportProfileParams extends AidlParams { + + public static final String PROFILE_KEY = "profile"; + public static final String SETTINGS_TYPE_KEY = "settings_type"; + private String profile; + private ArrayList settingsTypeKeyList = new ArrayList<>(); + + public ExportProfileParams(String profile, ArrayList settingsTypeList) { + + this.profile = profile; + for (AExportSettingsType settingsType : settingsTypeList) { + settingsTypeKeyList.add(settingsType.name()); + } + } + + public ExportProfileParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public ExportProfileParams createFromParcel(Parcel in) { + return new ExportProfileParams(in); + } + + @Override + public ExportProfileParams[] newArray(int size) { + return new ExportProfileParams[size]; + } + }; + + public String getProfile() { + return profile; + } + + public List getSettingsTypeKeys() { + return settingsTypeKeyList; + } + + @Override + public void writeToBundle(Bundle bundle) { + bundle.putString(PROFILE_KEY, profile); + bundle.putStringArrayList(SETTINGS_TYPE_KEY, settingsTypeKeyList); + } + + @Override + protected void readFromBundle(Bundle bundle) { + profile = bundle.getString(PROFILE_KEY); + settingsTypeKeyList = bundle.getStringArrayList(SETTINGS_TYPE_KEY); + } +} \ No newline at end of file diff --git a/OsmAnd-java/build.gradle b/OsmAnd-java/build.gradle index ce0fc99dd1..4385f9d0b0 100644 --- a/OsmAnd-java/build.gradle +++ b/OsmAnd-java/build.gradle @@ -43,6 +43,7 @@ task collectTestResources(type: Copy) { into "src/test/resources/" from("../../resources/test-resources") { include "*" + include "/search/*" } from("../../resources/poi") { include "poi_types.xml" diff --git a/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java b/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java index 693be4bd82..8048595615 100644 --- a/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java +++ b/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java @@ -17,19 +17,34 @@ public class CollatorStringMatcher implements StringMatcher { private final String part; public static enum StringMatcherMode { + // tests only first word as base starts with part CHECK_ONLY_STARTS_WITH, + // tests all words (split by space) and one of word should start with a given part CHECK_STARTS_FROM_SPACE, + // tests all words except first (split by space) and one of word should start with a given part CHECK_STARTS_FROM_SPACE_NOT_BEGINNING, + // tests all words (split by space) and one of word should be equal to part CHECK_EQUALS_FROM_SPACE, + // simple collator contains in any part of the base CHECK_CONTAINS, - CHECK_ONLY_STARTS_WITH_TRIM, + // simple collator equals CHECK_EQUALS, } public CollatorStringMatcher(String part, StringMatcherMode mode) { this.collator = OsmAndCollator.primaryCollator(); - this.part = part.toLowerCase(Locale.getDefault()); + part = simplifyStringAndAlignChars(part); + if (part.length() > 0 && part.charAt(part.length() - 1) == '.') { + part = part.substring(0, part.length() - 1); + if (mode == StringMatcherMode.CHECK_EQUALS_FROM_SPACE) { + mode = StringMatcherMode.CHECK_STARTS_FROM_SPACE; + } else if (mode == StringMatcherMode.CHECK_EQUALS) { + mode = StringMatcherMode.CHECK_ONLY_STARTS_WITH; + } + } + this.part = part; this.mode = mode; + } public Collator getCollator() { @@ -42,22 +57,20 @@ public class CollatorStringMatcher implements StringMatcher { } - public static boolean cmatches(Collator collator, String base, String part, StringMatcherMode mode){ + public static boolean cmatches(Collator collator, String fullName, String part, StringMatcherMode mode){ switch (mode) { case CHECK_CONTAINS: - return ccontains(collator, base, part); + return ccontains(collator, fullName, part); case CHECK_EQUALS_FROM_SPACE: - return cstartsWith(collator, base, part, true, true, true, false); + return cstartsWith(collator, fullName, part, true, true, true); case CHECK_STARTS_FROM_SPACE: - return cstartsWith(collator, base, part, true, true, false, false); + return cstartsWith(collator, fullName, part, true, true, false); case CHECK_STARTS_FROM_SPACE_NOT_BEGINNING: - return cstartsWith(collator, base, part, false, true, false, false); + return cstartsWith(collator, fullName, part, false, true, false); case CHECK_ONLY_STARTS_WITH: - return cstartsWith(collator, base, part, true, false, false, false); - case CHECK_ONLY_STARTS_WITH_TRIM: - return cstartsWith(collator, base, part, true, false, false, true); + return cstartsWith(collator, fullName, part, true, false, false); case CHECK_EQUALS: - return cstartsWith(collator, base, part, false, false, true, false); + return cstartsWith(collator, fullName, part, false, false, true); } return false; } @@ -116,25 +129,19 @@ public class CollatorStringMatcher implements StringMatcher { * Special check try to find as well in the middle of name * * @param collator - * @param searchInParam + * @param fullText * @param theStart - * @param trim - trim theStart to searchInParam length if searchInParam non empty * @return true if searchIn starts with token */ - public static boolean cstartsWith(Collator collator, String searchInParam, String theStart, - boolean checkBeginning, boolean checkSpaces, boolean equals, boolean trim) { - String searchIn = searchInParam.toLowerCase(Locale.getDefault()); - if (trim && searchIn.length() > 0) { - searchIn += " "; - } + public static boolean cstartsWith(Collator collator, String fullTextP, String theStart, + boolean checkBeginning, boolean checkSpaces, boolean equals) { + String searchIn = simplifyStringAndAlignChars(fullTextP); int searchInLength = searchIn.length(); - if (trim && searchInLength > 0 && theStart.length() > searchInLength) { - theStart = theStart.substring(0, searchInLength); - } int startLength = theStart.length(); if (startLength == 0) { return true; } + // this is not correct because of Auhofstrasse != Auhofstraße if (startLength > searchInLength) { return false; } @@ -156,7 +163,8 @@ public class CollatorStringMatcher implements StringMatcher { if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) { if (collator.equals(searchIn.substring(i, i + startLength), theStart)) { if(equals) { - if(i + startLength == searchInLength || isSpace(searchIn.charAt(i + startLength))) { + if(i + startLength == searchInLength || + isSpace(searchIn.charAt(i + startLength))) { return true; } } else { @@ -172,7 +180,17 @@ public class CollatorStringMatcher implements StringMatcher { return false; } + private static String simplifyStringAndAlignChars(String fullText) { + int i; + fullText = fullText.toLowerCase(Locale.getDefault()); + while( (i = fullText.indexOf('ß') ) != -1 ) { + fullText = fullText.substring(0, i) + "ss" + fullText.substring(i+1); + } + return fullText; + } + private static boolean isSpace(char c){ return !Character.isLetter(c) && !Character.isDigit(c); } + } diff --git a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java index f3cb0f8b84..23afd7dd2a 100644 --- a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java @@ -1,6 +1,10 @@ package net.osmand; + +import net.osmand.binary.StringBundle; +import net.osmand.binary.StringBundleWriter; +import net.osmand.binary.StringBundleXmlWriter; import net.osmand.data.QuadRect; import net.osmand.util.Algorithms; @@ -12,7 +16,6 @@ import org.xmlpull.v1.XmlSerializer; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -42,10 +45,14 @@ import java.util.Stack; import java.util.TimeZone; public class GPXUtilities { + public final static Log log = PlatformUtil.getLog(GPXUtilities.class); + private static final String ICON_NAME_EXTENSION = "icon"; private static final String DEFAULT_ICON_NAME = "special_star"; private static final String BACKGROUND_TYPE_EXTENSION = "background"; + private static final String PROFILE_TYPE_EXTENSION = "profile"; + private static final String TRKPT_INDEX_EXTENSION = "trkpt_idx"; private final static String GPX_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; //$NON-NLS-1$ private final static String GPX_TIME_FORMAT_MILLIS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; //$NON-NLS-1$ @@ -115,6 +122,20 @@ public class GPXUtilities { return extensions; } + public Map getExtensionsToWrite() { + if (extensions == null) { + extensions = new LinkedHashMap<>(); + } + return extensions; + } + + public void copyExtensions(GPXExtensions e) { + Map extensionsToRead = e.getExtensionsToRead(); + if (!extensionsToRead.isEmpty()) { + getExtensionsToWrite().putAll(extensionsToRead); + } + } + public GPXExtensionsWriter getExtensionsWriter() { return extensionsWriter; } @@ -148,14 +169,7 @@ public class GPXUtilities { getExtensionsToWrite().remove("color"); } - public Map getExtensionsToWrite() { - if (extensions == null) { - extensions = new LinkedHashMap<>(); - } - return extensions; - } - - private int parseColor(String colorString, int defColor) { + protected int parseColor(String colorString, int defColor) { if (!Algorithms.isEmpty(colorString)) { if (colorString.charAt(0) == '#') { long color = Long.parseLong(colorString.substring(1), 16); @@ -302,6 +316,30 @@ public class GPXUtilities { getExtensionsToWrite().put(BACKGROUND_TYPE_EXTENSION, backType); } + public String getProfileType() { + return getExtensionsToRead().get(PROFILE_TYPE_EXTENSION); + } + + public void setProfileType(String profileType) { + getExtensionsToWrite().put(PROFILE_TYPE_EXTENSION, profileType); + } + + public void removeProfileType() { + getExtensionsToWrite().remove(PROFILE_TYPE_EXTENSION); + } + + public int getTrkPtIndex() { + try { + return Integer.parseInt(getExtensionsToRead().get(TRKPT_INDEX_EXTENSION)); + } catch (NumberFormatException e) { + return -1; + } + } + + public void setTrkPtIndex(int index) { + getExtensionsToWrite().put(TRKPT_INDEX_EXTENSION, String.valueOf(index)); + } + @Override public int hashCode() { final int prime = 31; @@ -412,6 +450,65 @@ public class GPXUtilities { public double maxlon; } + public static class RouteSegment { + public String id; + public String length; + public String segmentTime; + public String speed; + public String turnType; + public String turnAngle; + public String types; + public String pointTypes; + public String names; + + public static RouteSegment fromStringBundle(StringBundle bundle) { + RouteSegment s = new RouteSegment(); + s.id = bundle.getString("id", null); + s.length = bundle.getString("length", null); + s.segmentTime = bundle.getString("segmentTime", null); + s.speed = bundle.getString("speed", null); + s.turnType = bundle.getString("turnType", null); + s.turnAngle = bundle.getString("turnAngle", null); + s.types = bundle.getString("types", null); + s.pointTypes = bundle.getString("pointTypes", null); + s.names = bundle.getString("names", null); + return s; + } + + public StringBundle toStringBundle() { + StringBundle bundle = new StringBundle(); + bundle.putString("id", id); + bundle.putString("length", length); + bundle.putString("segmentTime", segmentTime); + bundle.putString("speed", speed); + bundle.putString("turnType", turnType); + bundle.putString("turnAngle", turnAngle); + bundle.putString("types", types); + bundle.putString("pointTypes", pointTypes); + bundle.putString("names", names); + return bundle; + } + } + + public static class RouteType { + public String tag; + public String value; + + public static RouteType fromStringBundle(StringBundle bundle) { + RouteType t = new RouteType(); + t.tag = bundle.getString("t", null); + t.value = bundle.getString("v", null); + return t; + } + + public StringBundle toStringBundle() { + StringBundle bundle = new StringBundle(); + bundle.putString("t", tag); + bundle.putString("v", value); + return bundle; + } + } + public static class GPXTrackAnalysis { public float totalDistance = 0; public float totalDistanceWithoutGaps = 0; @@ -932,7 +1029,6 @@ public class GPXUtilities { sp = new SplitSegment(segment, k - 1, cf); currentMetricEnd += metricLimit; - prev = sp.get(0); } total += currentSegment; } @@ -957,6 +1053,24 @@ public class GPXUtilities { return ls; } + public static QuadRect calculateBounds(List pts) { + QuadRect trackBounds = new QuadRect(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, + Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); + updateBounds(trackBounds, pts, 0); + + return trackBounds; + } + + public static void updateBounds(QuadRect trackBounds, List pts, int startIndex) { + for (int i = startIndex; i < pts.size(); i++) { + WptPt pt = pts.get(i); + trackBounds.right = Math.max(trackBounds.right, pt.lon); + trackBounds.left = Math.min(trackBounds.left, pt.lon); + trackBounds.top = Math.max(trackBounds.top, pt.lat); + trackBounds.bottom = Math.min(trackBounds.bottom, pt.lat); + } + } + public static class GPXFile extends GPXExtensions { public String author; public Metadata metadata; @@ -964,6 +1078,9 @@ public class GPXUtilities { private List points = new ArrayList<>(); public List routes = new ArrayList<>(); + public List routeSegments = new ArrayList<>(); + public List routeTypes = new ArrayList<>(); + public Exception error = null; public String path = ""; public boolean showCurrentTrack; @@ -990,6 +1107,10 @@ public class GPXUtilities { } } + public boolean hasRoute() { + return !routeSegments.isEmpty() && !routeTypes.isEmpty(); + } + public List getPoints() { return Collections.unmodifiableList(points); } @@ -1197,6 +1318,17 @@ public class GPXUtilities { return pt; } + public TrkSegment getNonEmptyTrkSegment() { + for (GPXUtilities.Track t : tracks) { + for (TrkSegment s : t.segments) { + if (s.points.size() > 0) { + return s; + } + } + } + return null; + } + public void addTrkSegment(List points) { removeGeneralTrackIfExists(); @@ -1493,6 +1625,97 @@ public class GPXUtilities { } return new QuadRect(left, top, right, bottom); } + + public int getGradientScaleColor(String gradientScaleType, int defColor) { + String clrValue = null; + if (extensions != null) { + clrValue = extensions.get(gradientScaleType); + } + return parseColor(clrValue, defColor); + } + + public void setGradientScaleColor(String gradientScaleType, int gradientScaleColor) { + getExtensionsToWrite().put(gradientScaleType, Algorithms.colorToString(gradientScaleColor)); + } + + public String getGradientScaleType() { + if (extensions != null) { + return extensions.get("gradient_scale_type"); + } + return null; + } + + public void setGradientScaleType(String gradientScaleType) { + getExtensionsToWrite().put("gradient_scale_type", gradientScaleType); + } + + public void removeGradientScaleType() { + getExtensionsToWrite().remove("gradient_scale_type"); + } + + public String getSplitType() { + if (extensions != null) { + return extensions.get("split_type"); + } + return null; + } + + public void setSplitType(String gpxSplitType) { + getExtensionsToWrite().put("split_type", gpxSplitType); + } + + public double getSplitInterval() { + if (extensions != null) { + String splitIntervalStr = extensions.get("split_interval"); + if (!Algorithms.isEmpty(splitIntervalStr)) { + try { + return Double.parseDouble(splitIntervalStr); + } catch (NumberFormatException e) { + log.error("Error reading split_interval", e); + } + } + } + return 0; + } + + public void setSplitInterval(double splitInterval) { + getExtensionsToWrite().put("split_interval", String.valueOf(splitInterval)); + } + + public String getWidth(String defWidth) { + String widthValue = null; + if (extensions != null) { + widthValue = extensions.get("width"); + } + return widthValue != null ? widthValue : defWidth; + } + + public void setWidth(String width) { + getExtensionsToWrite().put("width", width); + } + + public boolean isShowArrows() { + String showArrows = null; + if (extensions != null) { + showArrows = extensions.get("show_arrows"); + } + return Boolean.parseBoolean(showArrows); + } + + public void setShowArrows(boolean showArrows) { + getExtensionsToWrite().put("show_arrows", String.valueOf(showArrows)); + } + + public boolean isShowStartFinish() { + if (extensions != null && extensions.containsKey("show_start_finish")) { + return Boolean.parseBoolean(extensions.get("show_start_finish")); + } + return true; + } + + public void setShowStartFinish(boolean showStartFinish) { + getExtensionsToWrite().put("show_start_finish", String.valueOf(showStartFinish)); + } } public static String asString(GPXFile file) { @@ -1611,6 +1834,7 @@ public class GPXUtilities { serializer.endTag(null, "wpt"); //$NON-NLS-1$ } + assignRouteExtensionWriter(file); writeExtensions(serializer, file); serializer.endTag(null, "gpx"); //$NON-NLS-1$ @@ -1623,6 +1847,29 @@ public class GPXUtilities { return null; } + private static void assignRouteExtensionWriter(final GPXFile gpxFile) { + if (gpxFile.hasRoute() && gpxFile.getExtensionsWriter() == null) { + gpxFile.setExtensionsWriter(new GPXExtensionsWriter() { + @Override + public void writeExtensions(XmlSerializer serializer) { + StringBundle bundle = new StringBundle(); + List segmentsBundle = new ArrayList<>(); + for (RouteSegment segment : gpxFile.routeSegments) { + segmentsBundle.add(segment.toStringBundle()); + } + bundle.putBundleList("route", "segment", segmentsBundle); + List typesBundle = new ArrayList<>(); + for (RouteType routeType : gpxFile.routeTypes) { + typesBundle.add(routeType.toStringBundle()); + } + bundle.putBundleList("types", "type", typesBundle); + StringBundleWriter bundleWriter = new StringBundleXmlWriter(bundle, serializer); + bundleWriter.writeBundle(); + } + }); + } + } + private static String getFilename(String path) { if(path != null) { int i = path.lastIndexOf('/'); @@ -1840,23 +2087,7 @@ public class GPXUtilities { } public static GPXFile loadGPXFile(InputStream f) { - return loadGPXFile(f, null, null); - } - - public static GPXFile loadGPXFile(InputStream f, GPXFile gpxFile, GPXExtensionsReader extensionsReader) { - boolean readExtensionsOnly = false; - if (gpxFile == null) { - gpxFile = new GPXFile(null); - } else { - if (f == null) { - try { - f = new FileInputStream(new File(gpxFile.path)); - } catch (FileNotFoundException e) { - return gpxFile; - } - } - readExtensionsOnly = extensionsReader != null; - } + GPXFile gpxFile = new GPXFile(null); SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US); format.setTimeZone(TimeZone.getTimeZone("UTC")); SimpleDateFormat formatMillis = new SimpleDateFormat(GPX_TIME_FORMAT_MILLIS, Locale.US); @@ -1870,6 +2101,10 @@ public class GPXUtilities { Stack parserState = new Stack<>(); boolean extensionReadMode = false; boolean routePointExtension = false; + List routeSegments = gpxFile.routeSegments; + List routeTypes = gpxFile.routeTypes; + boolean routeExtension = false; + boolean typesExtension = false; parserState.push(gpxFile); int tok; while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { @@ -1878,37 +2113,50 @@ public class GPXUtilities { String tag = parser.getName(); if (extensionReadMode && parse != null && !routePointExtension) { String tagName = tag.toLowerCase(); - boolean extensionsRead = false; - if (extensionsReader != null) { - extensionsRead = extensionsReader.readExtensions(gpxFile, parser); + if (routeExtension) { + if (tagName.equals("segment")) { + RouteSegment segment = parseRouteSegmentAttributes(parser); + routeSegments.add(segment); + } + } else if (typesExtension) { + if (tagName.equals("type")) { + RouteType type = parseRouteTypeAttributes(parser); + routeTypes.add(type); + } } - if (!readExtensionsOnly && !extensionsRead) { - switch (tagName) { - case "routepointextension": - routePointExtension = true; - if (parse instanceof WptPt) { - parse.getExtensionsToWrite().put("offset", routeTrackSegment.points.size() + ""); - } - break; + switch (tagName) { + case "routepointextension": + routePointExtension = true; + if (parse instanceof WptPt) { + parse.getExtensionsToWrite().put("offset", routeTrackSegment.points.size() + ""); + } + break; - default: - Map values = readTextMap(parser, tag); - if (values.size() > 0) { - for (Entry entry : values.entrySet()) { - String t = entry.getKey().toLowerCase(); - String value = entry.getValue(); - parse.getExtensionsToWrite().put(t, value); - if (tag.equals("speed") && parse instanceof WptPt) { - try { - ((WptPt) parse).speed = Float.parseFloat(value); - } catch (NumberFormatException e) { - log.debug(e.getMessage(), e); - } + case "route": + routeExtension = true; + break; + + case "types": + typesExtension = true; + break; + + default: + Map values = readTextMap(parser, tag); + if (values.size() > 0) { + for (Entry entry : values.entrySet()) { + String t = entry.getKey().toLowerCase(); + String value = entry.getValue(); + parse.getExtensionsToWrite().put(t, value); + if (tag.equals("speed") && parse instanceof WptPt) { + try { + ((WptPt) parse).speed = Float.parseFloat(value); + } catch (NumberFormatException e) { + log.debug(e.getMessage(), e); } } } - break; - } + } + break; } } else if (parse != null && tag.equals("extensions")) { extensionReadMode = true; @@ -1918,7 +2166,7 @@ public class GPXUtilities { routeTrackSegment.points.add(wptPt); parserState.push(wptPt); } - } else if (!readExtensionsOnly) { + } else { if (parse instanceof GPXFile) { if (tag.equals("gpx")) { ((GPXFile) parse).author = parser.getAttributeValue("", "creator"); @@ -2114,7 +2362,12 @@ public class GPXUtilities { if (parse != null && tag.equals("extensions")) { extensionReadMode = false; } - if (readExtensionsOnly) { + if (extensionReadMode && tag.equals("route")) { + routeExtension = false; + continue; + } + if (extensionReadMode && tag.equals("types")) { + typesExtension = false; continue; } @@ -2194,6 +2447,27 @@ public class GPXUtilities { return wpt; } + private static RouteSegment parseRouteSegmentAttributes(XmlPullParser parser) { + RouteSegment segment = new RouteSegment(); + segment.id = parser.getAttributeValue("", "id"); + segment.length = parser.getAttributeValue("", "length"); + segment.segmentTime = parser.getAttributeValue("", "segmentTime"); + segment.speed = parser.getAttributeValue("", "speed"); + segment.turnType = parser.getAttributeValue("", "turnType"); + segment.turnAngle = parser.getAttributeValue("", "turnAngle"); + segment.types = parser.getAttributeValue("", "types"); + segment.pointTypes = parser.getAttributeValue("", "pointTypes"); + segment.names = parser.getAttributeValue("", "names"); + return segment; + } + + private static RouteType parseRouteTypeAttributes(XmlPullParser parser) { + RouteType type = new RouteType(); + type.tag = parser.getAttributeValue("", "t"); + type.value = parser.getAttributeValue("", "v"); + return type; + } + private static Bounds parseBoundsAttributes(XmlPullParser parser) { Bounds bounds = new Bounds(); try { diff --git a/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java b/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java index 14401c4a04..93569dfddd 100644 --- a/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java +++ b/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java @@ -28,9 +28,6 @@ public class IndexConstants { public static final String EXTRA_EXT = ".extra"; public static final String EXTRA_ZIP_EXT = ".extra.zip"; - public static final String TOUR_INDEX_EXT = ".tour"; //$NON-NLS-1$ - public static final String TOUR_INDEX_EXT_ZIP = ".tour.zip"; //$NON-NLS-1$ - public static final String GEN_LOG_EXT = ".gen.log"; //$NON-NLS-1$ public static final String VOICE_INDEX_EXT_ZIP = ".voice.zip"; //$NON-NLS-1$ @@ -48,6 +45,9 @@ public class IndexConstants { public static final String GPX_FILE_EXT = ".gpx"; //$NON-NLS-1$ + public static final String WPT_CHART_FILE_EXT = ".wpt.chart"; + public static final String SQLITE_CHART_FILE_EXT = ".3d.chart"; + public final static String POI_TABLE = "poi"; //$NON-NLS-1$ public static final String INDEX_DOWNLOAD_DOMAIN = "download.osmand.net"; diff --git a/OsmAnd-java/src/main/java/net/osmand/LocationsHolder.java b/OsmAnd-java/src/main/java/net/osmand/LocationsHolder.java new file mode 100644 index 0000000000..5cecf9b8e6 --- /dev/null +++ b/OsmAnd-java/src/main/java/net/osmand/LocationsHolder.java @@ -0,0 +1,159 @@ +package net.osmand; + +import net.osmand.GPXUtilities.WptPt; +import net.osmand.data.LatLon; +import net.osmand.util.Algorithms; + +import java.util.ArrayList; +import java.util.List; + +public class LocationsHolder { + + private static final int LOCATION_TYPE_UNKNOWN = -1; + private static final int LOCATION_TYPE_LATLON = 0; + private static final int LOCATION_TYPE_LOCATION = 1; + private static final int LOCATION_TYPE_WPTPT = 2; + + private List latLonList; + private List locationList; + private List wptPtList; + private int locationType; + private int size; + + @SuppressWarnings("unchecked") + public LocationsHolder(List locations) { + this.locationType = resolveLocationType(locations); + switch (locationType) { + case LOCATION_TYPE_LATLON: + latLonList = new ArrayList<>((List) locations); + size = locations.size(); + break; + case LOCATION_TYPE_LOCATION: + locationList = new ArrayList<>((List) locations); + size = locations.size(); + break; + case LOCATION_TYPE_WPTPT: + wptPtList = new ArrayList<>((List) locations); + size = locations.size(); + break; + } + } + + private int resolveLocationType(List locations) { + if (!Algorithms.isEmpty(locations)) { + Object locationObj = locations.get(0); + if (locationObj instanceof LatLon) { + return LOCATION_TYPE_LATLON; + } else if (locationObj instanceof WptPt) { + return LOCATION_TYPE_WPTPT; + } else if (locationObj instanceof Location) { + return LOCATION_TYPE_LOCATION; + } else { + throw new IllegalArgumentException("Unsupported location type: " + locationObj.getClass().getSimpleName()); + } + } + return LOCATION_TYPE_UNKNOWN; + } + + public double getLatitude(int index) { + switch (locationType) { + case LOCATION_TYPE_LATLON: + return latLonList.get(index).getLatitude(); + case LOCATION_TYPE_LOCATION: + return locationList.get(index).getLatitude(); + case LOCATION_TYPE_WPTPT: + return wptPtList.get(index).getLatitude(); + default: + return 0; + } + } + + public double getLongitude(int index) { + switch (locationType) { + case LOCATION_TYPE_LATLON: + return latLonList.get(index).getLongitude(); + case LOCATION_TYPE_LOCATION: + return locationList.get(index).getLongitude(); + case LOCATION_TYPE_WPTPT: + return wptPtList.get(index).getLongitude(); + default: + return 0; + } + } + + public int getSize() { + return size; + } + + @SuppressWarnings("unchecked") + private List getList(int locationType) { + List res = new ArrayList<>(); + if (size > 0) { + for (int i = 0; i < size; i++) { + switch (locationType) { + case LOCATION_TYPE_LATLON: + res.add((T) getLatLon(i)); + break; + case LOCATION_TYPE_LOCATION: + res.add((T) getLocation(i)); + break; + case LOCATION_TYPE_WPTPT: + res.add((T) getWptPt(i)); + break; + } + } + } + return res; + } + + public List getLatLonList() { + if (this.locationType == LOCATION_TYPE_LATLON) { + return latLonList; + } else { + return getList(LOCATION_TYPE_LATLON); + } + } + + public List getWptPtList() { + if (this.locationType == LOCATION_TYPE_WPTPT) { + return wptPtList; + } else { + return getList(LOCATION_TYPE_WPTPT); + } + } + + public List getLocationsList() { + if (this.locationType == LOCATION_TYPE_LOCATION) { + return locationList; + } else { + return getList(LOCATION_TYPE_LOCATION); + } + } + + public LatLon getLatLon(int index) { + if (this.locationType == LOCATION_TYPE_LATLON) { + return latLonList.get(index); + } else { + return new LatLon(getLatitude(index), getLongitude(index)); + } + } + + public WptPt getWptPt(int index) { + if (this.locationType == LOCATION_TYPE_WPTPT) { + return wptPtList.get(index); + } else { + WptPt wptPt = new WptPt(); + wptPt.lat = getLatitude(index); + wptPt.lon = getLongitude(index); + return wptPt; + } + } + + public Location getLocation(int index) { + if (this.locationType == LOCATION_TYPE_LOCATION) { + return locationList.get(index); + } else { + return new Location("", getLatitude(index), getLongitude(index)); + } + } +} diff --git a/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java b/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java index 8893c01286..0189d38378 100644 --- a/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java +++ b/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java @@ -26,10 +26,9 @@ import net.osmand.data.QuadRect; import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRulesStorage; import net.osmand.router.NativeTransportRoutingResult; -import net.osmand.router.PrecalculatedRouteDirection; import net.osmand.router.RouteCalculationProgress; import net.osmand.router.RouteSegmentResult; -import net.osmand.router.RoutingConfiguration; +import net.osmand.router.RoutingContext; import net.osmand.router.TransportRoutingConfiguration; import net.osmand.util.Algorithms; @@ -135,12 +134,10 @@ public class NativeLibrary { return nativeTransportRouting(new int[] { sx31, sy31, ex31, ey31 }, cfg, progress); } - public RouteSegmentResult[] runNativeRouting(int sx31, int sy31, int ex31, int ey31, RoutingConfiguration config, - RouteRegion[] regions, RouteCalculationProgress progress, PrecalculatedRouteDirection precalculatedRouteDirection, - boolean basemap, boolean publicTransport, boolean startTransportStop, boolean targetTransportStop) { + public RouteSegmentResult[] runNativeRouting(RoutingContext c, RouteRegion[] regions, boolean basemap) { // config.router.printRules(System.out); - return nativeRouting(new int[] { sx31, sy31, ex31, ey31 }, config, config.initialDirection == null ? -360 : config.initialDirection.floatValue(), - regions, progress, precalculatedRouteDirection, basemap, publicTransport, startTransportStop, targetTransportStop); + return nativeRouting(c, c.config.initialDirection == null ? -360 : c.config.initialDirection.floatValue(), + regions, basemap); } @@ -156,16 +153,15 @@ public class NativeLibrary { protected static native NativeRouteSearchResult loadRoutingData(RouteRegion reg, String regName, int regfp, RouteSubregion subreg, boolean loadObjects); + public static native void deleteNativeRoutingContext(long handle); + protected static native void deleteRenderingContextHandle(long handle); protected static native void deleteRouteSearchResult(long searchResultHandle); protected static native RouteDataObject[] getRouteDataObjects(RouteRegion reg, long rs, int x31, int y31); - protected static native RouteSegmentResult[] nativeRouting(int[] coordinates, RoutingConfiguration r, - float initDirection, RouteRegion[] regions, RouteCalculationProgress progress, - PrecalculatedRouteDirection precalculatedRouteDirection, boolean basemap, - boolean publicTransport, boolean startTransportStop, boolean targetTransportStop); + protected static native RouteSegmentResult[] nativeRouting(RoutingContext c, float initDirection, RouteRegion[] regions, boolean basemap); protected static native NativeTransportRoutingResult[] nativeTransportRouting(int[] coordinates, TransportRoutingConfiguration cfg, RouteCalculationProgress progress); @@ -354,6 +350,7 @@ public class NativeLibrary { FileInputStream fis = new FileInputStream(f); Algorithms.streamCopy(fis, ous); fis.close(); + System.out.println("FONT " + name); initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"), name.toLowerCase().contains("italic")); } catch (IOException e) { diff --git a/OsmAnd-java/src/main/java/net/osmand/OsmAndCollator.java b/OsmAnd-java/src/main/java/net/osmand/OsmAndCollator.java index bf8338f73a..21d0a5d231 100644 --- a/OsmAnd-java/src/main/java/net/osmand/OsmAndCollator.java +++ b/OsmAnd-java/src/main/java/net/osmand/OsmAndCollator.java @@ -38,4 +38,5 @@ public class OsmAndCollator { } }; } + } diff --git a/OsmAnd-java/src/main/java/net/osmand/Reshaper.java b/OsmAnd-java/src/main/java/net/osmand/Reshaper.java index 6efd414062..8a55a6f77f 100644 --- a/OsmAnd-java/src/main/java/net/osmand/Reshaper.java +++ b/OsmAnd-java/src/main/java/net/osmand/Reshaper.java @@ -1,6 +1,7 @@ package net.osmand; import java.io.UnsupportedEncodingException; +import java.util.Arrays; import org.apache.commons.logging.Log; @@ -19,61 +20,67 @@ public class Reshaper { return ""; } } + public static String reshape(String s) { -// if(true) { -// return s; -// } try { - ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK); + ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | + ArabicShaping.LENGTH_GROW_SHRINK); + //printSplit("B", s); try { s = as.shape(s); } catch (ArabicShapingException e) { LOG.error(e.getMessage(), e); } + //printSplit("A", s); Bidi line = new Bidi(s.length(), s.length()); - line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null); + line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null); +// line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null); +// s = line.writeReordered(Bidi.DO_MIRRORING); +// s = reordered; byte direction = line.getDirection(); if (direction != Bidi.MIXED) { // unidirectional - if(line.isLeftToRight()) { - return s; - } else { + if (line.isLeftToRight()) { + return s; + } else { char[] chs = new char[s.length()]; for(int i = 0; i< chs.length ; i++) { - chs[i] = s.charAt(chs.length - i - 1); +// chs[i] = s.charAt(chs.length - i - 1); + chs[i] = mirror(s.charAt(chs.length - i - 1)); } return new String(chs); } } else { - // // mixed-directional + // mixed-directional +// System.out.println(s); +// printSplit("Split", s); int count = line.countRuns(); - // if (styleRunCount <= 1) { - // int style = styleRuns[0].style; - // // iterate over directional runs - // for (i = 0; i < count; ++i) { - // run = line.getVisualRun(i); - // renderRun(text, run.getStart(), run.getLimit(), - // run.getDirection(), style); - // } - // } StringBuilder res = new StringBuilder(); // iterate over both directional and style runs for (int i = 0; i < count; ++i) { + StringBuilder runs = new StringBuilder(); BidiRun run = line.getVisualRun(i); - - int st = run.getStart(); - int e = run.getLimit(); - int j = run.getDirection() == Bidi.LTR ? st : e - 1; - int l = run.getDirection() == Bidi.LTR ? e : st - 1; - boolean plus = run.getDirection() == Bidi.LTR; - while (j != l) { - res.append(s.charAt(j)); - if (plus) { - j++; - } else { - j--; + boolean ltr = run.getDirection() == Bidi.LTR; + int start = run.getStart(); + int limit = run.getLimit(); + int begin = ltr ? start : limit - 1; + int end = ltr ? limit : start - 1; + int ind = begin; + while (ind != end) { + char ch = s.charAt(ind); + if (!ltr) { + ch = mirror(ch); } + res.append(ch); + runs.append(ch); + if (ltr) { + ind++; + } else { + ind--; + } + } + printSplit(run.getDirection() + " " + run.getEmbeddingLevel(), runs.toString()); } return res.toString(); } @@ -83,24 +90,77 @@ public class Reshaper { } } - public static void main(String[] args) { -// char[] c = new char[] {'א', 'ד','ם', ' ', '1', '2'} ; -// String reshape = "אדם"; - char[] c = new char[] {'א', 'ד','ם'} ; - String reshape = reshape(new String(c)); - for(int i=0; i < reshape.length(); i++) { - System.out.println(reshape.charAt(i)); + private static char mirror(char ch) { + switch (ch) { + case '(': ch = ')'; break; + case ')': ch = '('; break; + case '[': ch = ']'; break; + case ']': ch = '['; break; } + return ch; + } + public static void main(String[] args) { test2(); + test3(); + test4(); + test5(); + } + + public static void test3() { + String s = "מרכז מסחרי/השלום (40050)"; + String reshape = reshape(s); + String expected = "(40050) םולשה/ירחסמ זכרמ"; + check(s, reshape, expected); + } + + public static void test5() { + String s = "מרכז מסחרי/השלום (מרז)"; + String reshape = reshape(s); + String expected = "(זרמ) םולשה/ירחסמ זכרמ"; + check(s, reshape, expected); + } + + public static void check(String source, String reshape, String expected) { + printSplit("Source ", source); + printSplit("Expected", expected); + printSplit("Reshaped", reshape); + System.out.println(reshape); + if (!reshape.equals(expected)) { + throw new IllegalArgumentException(String.format("Bug: expected '%s', reshaped '%s'", expected, reshape)); + } + } + + static void printSplit(String p, String source) { + printSplit(p, source, true); + printSplit(p, source, false); + } + static void printSplit(String p, String source, boolean f) { + System.out.print(p); + System.out.print(": \u2066"); + for (int i = 0; i < source.length(); i++) { + if (f) { + System.out.print(source.charAt(i)); + System.out.print(" \u200e"); + } else { + System.out.print(String.format("%04x ", (int) source.charAt(i))); + } + } +// System.out.println(Arrays.toString(source.toCharArray())); + System.out.println(); + System.out.flush(); } - private static void test2() { + public static void test2() { String s = "گچ پژ نمکی باللغة العربي"; String reshape = reshape(s); - - if (!reshape.equals("ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ")) { - throw new IllegalArgumentException("BUG!!!"); - } + String expected1 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ"; + String expected2 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ یکﻤﻧ ژپ چگ"; + check(s, reshape, expected1); + } + + public static void test4() { + String s = "Abc (123)"; + check(s, reshape(s), s); } -} +} \ No newline at end of file diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapAddressReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapAddressReaderAdapter.java index 2060c8c23a..18f7b2549e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapAddressReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapAddressReaderAdapter.java @@ -221,7 +221,7 @@ public class BinaryMapAddressReaderAdapter { int fp = codedIS.getTotalBytesRead(); int length = codedIS.readRawVarint32(); int oldLimit = codedIS.pushLimit(length); - City c = readCityHeader(new DefaultCityMatcher(matcher), fp, additionalTagsTable); + City c = readCityHeader(resultMatcher, new DefaultCityMatcher(matcher), fp, additionalTagsTable); if (c != null) { if (resultMatcher == null || resultMatcher.publish(c)) { cities.add(c); @@ -256,6 +256,7 @@ public class BinaryMapAddressReaderAdapter { int oldLimit = codedIS.pushLimit(length); readStreet(s, null, false, x >> 7, y >> 7, city.isPostcode() ? city.getName() : null, attributeTagsTable); + publishRawData(resultMatcher, s); if (resultMatcher == null || resultMatcher.publish(s)) { city.registerStreet(s); } @@ -303,7 +304,7 @@ public class BinaryMapAddressReaderAdapter { } } - protected City readCityHeader(CityMatcher matcher, int filePointer, List additionalTagsTable) throws IOException { + protected City readCityHeader(SearchRequest resultMatcher, CityMatcher matcher, int filePointer, List additionalTagsTable) throws IOException { int x = 0; int y = 0; City c = null; @@ -313,6 +314,7 @@ public class BinaryMapAddressReaderAdapter { int tag = WireFormat.getTagFieldNumber(t); switch (tag) { case 0: + publishRawData(resultMatcher, c); return (matcher == null || matcher.matches(c)) ? c : null; case OsmandOdb.CityIndex.CITY_TYPE_FIELD_NUMBER: int type = codedIS.readUInt32(); @@ -445,6 +447,7 @@ public class BinaryMapAddressReaderAdapter { if (loadBuildingsAndIntersected) { int oldLimit = codedIS.pushLimit(length); Building b = readBuilding(offset, x, y, additionalTagsTable); + publishRawData(buildingsMatcher, b); if (postcodeFilter == null || postcodeFilter.equalsIgnoreCase(b.getPostcode())) { if (buildingsMatcher == null || buildingsMatcher.publish(b)) { s.addBuilding(b); @@ -688,7 +691,7 @@ public class BinaryMapAddressReaderAdapter { codedIS.seek(contOffset); int len = codedIS.readRawVarint32(); int old = codedIS.pushLimit(len); - obj = readCityHeader(null, contOffset, reg.attributeTagsTable); + obj = readCityHeader(req, null, contOffset, reg.attributeTagsTable); codedIS.popLimit(old); } if (obj != null) { @@ -701,6 +704,7 @@ public class BinaryMapAddressReaderAdapter { readStreet(s, null, false, MapUtils.get31TileNumberX(l.getLongitude()) >> 7, MapUtils.get31TileNumberY(l.getLatitude()) >> 7, obj.isPostcode() ? obj.getName() : null, reg.attributeTagsTable); + publishRawData(req, s); boolean matches = stringMatcher.matches(s.getName()); if (!matches) { for (String n : s.getAllNames()) { @@ -727,7 +731,8 @@ public class BinaryMapAddressReaderAdapter { codedIS.seek(offset); int len = codedIS.readRawVarint32(); int old = codedIS.pushLimit(len); - City obj = readCityHeader(cityPostcodeMatcher, list.get(j), reg.attributeTagsTable); + City obj = readCityHeader(req, cityPostcodeMatcher, list.get(j), reg.attributeTagsTable); + publishRawData(req, obj); if (obj != null && !published.contains(offset)) { req.publish(obj); published.add(offset); @@ -805,4 +810,9 @@ public class BinaryMapAddressReaderAdapter { } } + private void publishRawData(SearchRequest resultMatcher, T obj) { + if (resultMatcher != null && obj != null) { + resultMatcher.collectRawData(obj); + } + } } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java index e2b5432c6e..f9015ec48d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java @@ -496,7 +496,7 @@ public class BinaryMapIndexReader { } } Iterator> it = groupPoints.entrySet().iterator(); - if (it.hasNext()) { + while (it.hasNext()) { Entry e = it.next(); TransportIndex ind = e.getKey(); TIntArrayList pointers = e.getValue(); @@ -696,6 +696,7 @@ public class BinaryMapIndexReader { private void readMapIndex(MapIndex index, boolean onlyInitEncodingRules) throws IOException { int defaultId = 1; int oldLimit; + int encodingRulesSize = 0; while (true) { int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -712,10 +713,14 @@ public class BinaryMapIndexReader { break; case OsmandOdb.OsmAndMapIndex.RULES_FIELD_NUMBER : if (onlyInitEncodingRules) { + if(encodingRulesSize == 0) { + encodingRulesSize = codedIS.getTotalBytesRead(); + } int len = codedIS.readInt32(); oldLimit = codedIS.pushLimit(len); readMapEncodingRule(index, defaultId++); codedIS.popLimit(oldLimit); + index.encodingRulesSizeBytes = (codedIS.getTotalBytesRead() - encodingRulesSize); } else { skipUnknownField(t); } @@ -1457,8 +1462,14 @@ public class BinaryMapIndexReader { public static SearchRequest buildAddressByNameRequest(ResultMatcher resultMatcher, String nameRequest, StringMatcherMode matcherMode) { + return buildAddressByNameRequest(resultMatcher, null, nameRequest, matcherMode); + } + + public static SearchRequest buildAddressByNameRequest(ResultMatcher resultMatcher, ResultMatcher rawDataCollector, String nameRequest, + StringMatcherMode matcherMode) { SearchRequest request = new SearchRequest(); request.resultMatcher = resultMatcher; + request.rawDataCollector = rawDataCollector; request.nameQuery = nameRequest.trim(); request.matcherMode = matcherMode; return request; @@ -1542,6 +1553,10 @@ public class BinaryMapIndexReader { public static SearchRequest buildSearchPoiRequest(int x, int y, String nameFilter, int sleft, int sright, int stop, int sbottom, ResultMatcher resultMatcher) { + return buildSearchPoiRequest(x, y, nameFilter, sleft, sright, stop, sbottom, resultMatcher, null); + } + + public static SearchRequest buildSearchPoiRequest(int x, int y, String nameFilter, int sleft, int sright, int stop, int sbottom, ResultMatcher resultMatcher, ResultMatcher rawDataCollector) { SearchRequest request = new SearchRequest(); request.x = x; request.y = y; @@ -1550,6 +1565,7 @@ public class BinaryMapIndexReader { request.top = stop; request.bottom = sbottom; request.resultMatcher = resultMatcher; + request.rawDataCollector = rawDataCollector; request.nameQuery = nameFilter.trim(); return request; } @@ -1634,6 +1650,7 @@ public class BinaryMapIndexReader { private boolean ocean = false; private ResultMatcher resultMatcher; + private ResultMatcher rawDataCollector; // 31 zoom tiles // common variables @@ -1711,6 +1728,12 @@ public class BinaryMapIndexReader { return false; } + public void collectRawData(T obj) { + if (rawDataCollector != null) { + rawDataCollector.publish(obj); + } + } + protected void publishOceanTile(boolean ocean) { if (ocean) { this.ocean = true; @@ -1811,10 +1834,13 @@ public class BinaryMapIndexReader { public int onewayReverseAttribute = -1; public TIntHashSet positiveLayers = new TIntHashSet(2); public TIntHashSet negativeLayers = new TIntHashSet(2); + public int encodingRulesSizeBytes; // to speed up comparision private MapIndex referenceMapIndex; + + public Integer getRule(String t, String v) { Map m = encodingRules.get(t); if (m != null) { @@ -2637,18 +2663,20 @@ public class BinaryMapIndexReader { } } + public TLongObjectHashMap getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException { if (incompleteTransportRoutes == null) { incompleteTransportRoutes = new TLongObjectHashMap<>(); for (TransportIndex ti : transportIndexes) { if (ti.incompleteRoutesLength > 0) { - transportAdapter.readIncompleteRoutesList(incompleteTransportRoutes, ti.incompleteRoutesLength, - ti.incompleteRoutesOffset); + codedIS.seek(ti.incompleteRoutesOffset); + int oldLimit = codedIS.pushLimit(ti.incompleteRoutesLength); + transportAdapter.readIncompleteRoutesList(incompleteTransportRoutes, ti.filePointer); + codedIS.popLimit(oldLimit); } } } return incompleteTransportRoutes; } - } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java index aa51de0c4b..857eb4f4d3 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java @@ -26,7 +26,6 @@ import net.osmand.data.Amenity.AmenityRoutePoint; import net.osmand.data.LatLon; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiCategory; -import net.osmand.osm.PoiType; import net.osmand.util.MapUtils; import org.apache.commons.logging.Log; @@ -591,6 +590,7 @@ public class BinaryMapPoiReaderAdapter { } } if (matches) { + req.collectRawData(am); req.publish(am); } } @@ -637,6 +637,7 @@ public class BinaryMapPoiReaderAdapter { int yp = (int) MapUtils.getTileNumberY(zSkip, am.getLocation().getLatitude()); long valSkip = (((long) xp) << zSkip) | yp; if (!toSkip.contains(valSkip)) { + req.collectRawData(am); boolean publish = req.publish(am); if (publish) { read = true; @@ -647,6 +648,7 @@ public class BinaryMapPoiReaderAdapter { return read; } } else { + req.collectRawData(am); if (req.publish(am)) { read = true; } @@ -770,7 +772,8 @@ public class BinaryMapPoiReaderAdapter { } } subtype = poiTypes.replaceDeprecatedSubtype(type, subtype); - if (req.poiTypeFilter == null || req.poiTypeFilter.accept(type, subtype)) { + boolean isForbidden = poiTypes.isTypeForbidden(subtype); + if (!isForbidden && (req.poiTypeFilter == null || req.poiTypeFilter.accept(type, subtype))) { if (amenityType == null) { amenityType = type; am.setSubType(subtype); diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java index 048eb706fb..8431df7244 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java @@ -1,9 +1,25 @@ package net.osmand.binary; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + import com.google.protobuf.CodedInputStream; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.WireFormat; +import gnu.trove.iterator.TLongObjectIterator; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.list.array.TLongArrayList; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TLongObjectHashMap; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; @@ -18,23 +34,6 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import net.osmand.util.OpeningHoursParser; -import org.apache.commons.logging.Log; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import gnu.trove.iterator.TLongObjectIterator; -import gnu.trove.list.array.TIntArrayList; -import gnu.trove.list.array.TLongArrayList; -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.map.hash.TLongObjectHashMap; - public class BinaryMapRouteReaderAdapter { protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class); private static final int SHIFT_COORDINATES = 4; @@ -172,7 +171,7 @@ public class BinaryMapRouteReaderAdapter { } return tag; } - + public int onewayDirection(){ if(type == ONEWAY){ return intValue; @@ -293,10 +292,19 @@ public class BinaryMapRouteReaderAdapter { public static class RouteRegion extends BinaryIndexPart { public int regionsRead; public List routeEncodingRules = new ArrayList(); + public int routeEncodingRulesBytes = 0; public Map decodingRules = null; List subregions = new ArrayList(); List basesubregions = new ArrayList(); + public int directionForward = -1; + public int directionBackward = -1; + public int directionTrafficSignalsForward = -1; + public int directionTrafficSignalsBackward = -1; + public int trafficSignals = -1; + public int stopSign = -1; + public int giveWaySign = -1; + int nameTypeRule = -1; int refTypeRule = -1; int destinationTypeRule = -1; @@ -353,9 +361,28 @@ public class BinaryMapRouteReaderAdapter { destinationTypeRule = id; } else if (tags.equals("destination:ref") || tags.equals("destination:ref:forward") || tags.equals("destination:ref:backward")) { destinationRefTypeRule = id; + } else if (tags.equals("highway") && val.equals("traffic_signals")){ + trafficSignals = id; + } else if (tags.equals("highway") && val.equals("stop")){ + stopSign = id; + } else if (tags.equals("highway") && val.equals("give_way")){ + giveWaySign = id; + } else if (tags.equals("traffic_signals:direction") && val != null){ + if (val.equals("forward")) { + directionTrafficSignalsForward = id; + } else if (val.equals("backward")) { + directionTrafficSignalsBackward = id; + } + } else if (tags.equals("direction") && val != null) { + if (val.equals("forward")) { + directionForward = id; + } else if (val.equals("backward")) { + directionBackward = id; + } } } + public void completeRouteEncodingRules() { for(int i = 0; i < routeEncodingRules.size(); i++) { RouteTypeRule rtr = routeEncodingRules.get(i); @@ -588,6 +615,7 @@ public class BinaryMapRouteReaderAdapter { protected void readRouteIndex(RouteRegion region) throws IOException { int routeEncodingRule = 1; + int routeEncodingRulesSize = 0; while(true){ int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -600,10 +628,13 @@ public class BinaryMapRouteReaderAdapter { break; case OsmandOdb.OsmAndRoutingIndex.RULES_FIELD_NUMBER: { int len = codedIS.readInt32(); + if(routeEncodingRulesSize == 0) { + routeEncodingRulesSize = codedIS.getTotalBytesRead(); + } int oldLimit = codedIS.pushLimit(len); readRouteEncodingRule(region, routeEncodingRule++); - codedIS.skipRawBytes(codedIS.getBytesUntilLimit()); codedIS.popLimit(oldLimit); + region.routeEncodingRulesBytes = codedIS.getTotalBytesRead() - routeEncodingRulesSize; } break; case OsmandOdb.OsmAndRoutingIndex.ROOTBOXES_FIELD_NUMBER : case OsmandOdb.OsmAndRoutingIndex.BASEMAPBOXES_FIELD_NUMBER :{ diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java index 049fc161eb..1e733e50f6 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapTransportReaderAdapter.java @@ -11,6 +11,7 @@ import com.google.protobuf.WireFormat; import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.map.hash.TLongObjectHashMap; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; +import net.osmand.data.IncompleteTransportRoute; import net.osmand.data.TransportSchedule; import net.osmand.data.TransportStop; import net.osmand.data.TransportStopExit; @@ -71,7 +72,6 @@ public class BinaryMapTransportReaderAdapter { return bottom; } - IndexStringTable stringTable = null; } @@ -251,9 +251,7 @@ public class BinaryMapTransportReaderAdapter { return ((char) i)+""; } - public void readIncompleteRoutesList(TLongObjectHashMap incompleteRoutes, - int length, int offset) throws IOException { - codedIS.seek(offset); + public void readIncompleteRoutesList(TLongObjectHashMap incompleteRoutes, int transportIndexStart) throws IOException { boolean end = false; while (!end) { int t = codedIS.readTag(); @@ -265,7 +263,7 @@ public class BinaryMapTransportReaderAdapter { case OsmandOdb.IncompleteTransportRoutes.ROUTES_FIELD_NUMBER: int l = codedIS.readRawVarint32(); int olds = codedIS.pushLimit(l); - net.osmand.data.IncompleteTransportRoute ir = readIncompleteRoute(); + net.osmand.data.IncompleteTransportRoute ir = readIncompleteRoute(transportIndexStart); net.osmand.data.IncompleteTransportRoute itr = incompleteRoutes.get(ir.getRouteId()); if(itr != null) { itr.setNextLinkedRoute(ir); @@ -283,7 +281,7 @@ public class BinaryMapTransportReaderAdapter { } - public net.osmand.data.IncompleteTransportRoute readIncompleteRoute() throws IOException { + public net.osmand.data.IncompleteTransportRoute readIncompleteRoute(int transportIndexStart) throws IOException { net.osmand.data.IncompleteTransportRoute dataObject = new net.osmand.data.IncompleteTransportRoute(); boolean end = false; while(!end){ @@ -297,7 +295,12 @@ public class BinaryMapTransportReaderAdapter { dataObject.setRouteId(codedIS.readUInt64()); break; case OsmandOdb.IncompleteTransportRoute.ROUTEREF_FIELD_NUMBER : - dataObject.setRouteOffset(codedIS.readRawVarint32()); + int delta = codedIS.readRawVarint32(); + if (delta > transportIndexStart) { + dataObject.setRouteOffset(delta); + } else { + dataObject.setRouteOffset(transportIndexStart + delta); + } break; case OsmandOdb.IncompleteTransportRoute.OPERATOR_FIELD_NUMBER : skipUnknownField(t); @@ -320,7 +323,6 @@ public class BinaryMapTransportReaderAdapter { break; } } - return dataObject; } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java b/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java index 55d7461573..5c4c24ee68 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/CommonWords.java @@ -13,10 +13,6 @@ public class CommonWords { frequentlyUsedWordsDictionary.put(string, frequentlyUsedWordsDictionary.size()); } public static int getCommon(String name) { -// if(true) { -// // not ready for old versions yet -// return -1; -// } Integer i = commonWordsDictionary.get(name); return i == null ? -1 : i.intValue(); } @@ -28,7 +24,15 @@ public class CommonWords { public static int getCommonSearch(String name) { Integer i = commonWordsDictionary.get(name); - return i == null ? getFrequentlyUsed(name) : i.intValue() + frequentlyUsedWordsDictionary.size(); + // higher means better for search + if (i == null) { + int fq = getFrequentlyUsed(name); + if (fq != -1) { + return commonWordsDictionary.size() + fq; + } + return -1; + } + return i.intValue(); } public static int getCommonGeocoding(String name) { @@ -839,6 +843,7 @@ public class CommonWords { addCommon("van"); addCommon("road"); addCommon("street"); + addCommon("sector"); addCommon("drive"); addCommon("avenue"); addCommon("rue"); diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java b/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java index 1699d749d9..a372f12aa1 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java @@ -4,6 +4,7 @@ import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; +import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; import net.osmand.data.Building; import net.osmand.data.City; import net.osmand.data.LatLon; @@ -23,9 +24,11 @@ import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import gnu.trove.set.hash.TLongHashSet; @@ -40,7 +43,7 @@ public class GeocodingUtilities { public static final float STOP_SEARCHING_STREET_WITH_MULTIPLIER_RADIUS = 250; public static final float STOP_SEARCHING_STREET_WITHOUT_MULTIPLIER_RADIUS = 400; - public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 15000; + public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 45000; public static final float DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME = 1000; public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f; @@ -142,15 +145,12 @@ public class GeocodingUtilities { RoutePlannerFrontEnd rp = new RoutePlannerFrontEnd(); List lst = new ArrayList(); List listR = new ArrayList(); - rp.findRouteSegment(lat, lon, ctx, listR); + // we allow duplications to search in both files for boundary regions + rp.findRouteSegment(lat, lon, ctx, listR, false, true); double distSquare = 0; - TLongHashSet set = new TLongHashSet(); - Set streetNames = new HashSet(); + Map> streetNames = new HashMap<>(); for (RouteSegmentPoint p : listR) { RouteDataObject road = p.getRoad(); - if (!set.add(road.getId())) { - continue; - } // System.out.println(road.toString() + " " + Math.sqrt(p.distSquare)); String name = Algorithms.isEmpty(road.getName()) ? road.getRef("", false, true) : road.getName(); if (allowEmptyNames || !Algorithms.isEmpty(name)) { @@ -164,7 +164,13 @@ public class GeocodingUtilities { sr.connectionPoint = new LatLon(MapUtils.get31LatitudeY(p.preciseY), MapUtils.get31LongitudeX(p.preciseX)); sr.regionFP = road.region.getFilePointer(); sr.regionLen = road.region.getLength(); - if (streetNames.add(sr.streetName)) { + List plst = streetNames.get(sr.streetName); + if (plst == null) { + plst = new ArrayList(); + streetNames.put(sr.streetName, plst); + } + if (!plst.contains(road.region)) { + plst.add(road.region); lst.add(sr); } } @@ -308,6 +314,50 @@ public class GeocodingUtilities { return res; } + public void filterDuplicateRegionResults(final List res) { + Collections.sort(res, DISTANCE_COMPARATOR); + // filter duplicate city results (when building is in both regions on boundary) + for (int i = 0; i < res.size() - 1;) { + int cmp = cmpResult(res.get(i), res.get(i + 1)); + if (cmp > 0) { + res.remove(i); + } else if (cmp < 0) { + res.remove(i + 1); + } else { + // nothing to delete + i++; + } + } + } + + private int cmpResult(GeocodingResult gr1, GeocodingResult gr2) { + boolean eqStreet = Algorithms.stringsEqual(gr1.streetName, gr2.streetName); + if (eqStreet) { + boolean sameObj = false; + if (gr1.city != null && gr2.city != null) { + if (gr1.building != null && gr2.building != null) { + if (Algorithms.stringsEqual(gr1.building.getName(), gr2.building.getName())) { + // same building + sameObj = true; + } + } else if (gr1.building == null && gr2.building == null) { + // same street + sameObj = true; + } + } + if (sameObj) { + double cityDist1 = MapUtils.getDistance(gr1.searchPoint, gr1.city.getLocation()); + double cityDist2 = MapUtils.getDistance(gr2.searchPoint, gr2.city.getLocation()); + if (cityDist1 < cityDist2) { + return -1; + } else { + return 1; + } + } + } + return 0; + } + private List loadStreetBuildings(final GeocodingResult road, BinaryMapIndexReader reader, GeocodingResult street) throws IOException { final List streetBuildings = new ArrayList(); diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java b/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java index 807561e66d..bfe638d394 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java @@ -1,12 +1,15 @@ package net.osmand.binary; import net.osmand.Location; +import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import net.osmand.util.TransliterationHelper; +import org.apache.commons.logging.Log; + import java.text.MessageFormat; import java.util.Arrays; @@ -34,7 +37,7 @@ public class RouteDataObject { public int[] nameIds; // mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2 public float[] heightDistanceArray = null; - + private static final Log LOG = PlatformUtil.getLog(RouteDataObject.class); public RouteDataObject(RouteRegion region) { this.region = region; } @@ -56,6 +59,7 @@ public class RouteDataObject { this.pointsY = copy.pointsY; this.types = copy.types; this.names = copy.names; + this.nameIds = copy.nameIds; this.restrictions = copy.restrictions; this.restrictionsVia = copy.restrictionsVia; this.pointTypes = copy.pointTypes; @@ -426,12 +430,19 @@ public class RouteDataObject { int[] opointsX = pointsX; int[] opointsY = pointsY; int[][] opointTypes = pointTypes; + String[][] opointNames = pointNames; + int[][] opointNameTypes = pointNameTypes; pointsX = new int[pointsX.length + 1]; pointsY = new int[pointsY.length + 1]; boolean insTypes = this.pointTypes != null && this.pointTypes.length > pos; + boolean insNames = this.pointNames != null && this.pointNames.length > pos; if (insTypes) { pointTypes = new int[opointTypes.length + 1][]; } + if (insNames) { + pointNames = new String[opointNames.length + 1][]; + pointNameTypes = new int[opointNameTypes.length +1][]; + } int i = 0; for (; i < pos; i++) { pointsX[i] = opointsX[i]; @@ -439,18 +450,32 @@ public class RouteDataObject { if (insTypes) { pointTypes[i] = opointTypes[i]; } + if (insNames) { + pointNames[i] = opointNames[i]; + pointNameTypes[i] = opointNameTypes[i]; + } } pointsX[i] = x31; pointsY[i] = y31; if (insTypes) { pointTypes[i] = null; } + if (insNames) { + pointNames[i] = null; + pointNameTypes[i] = null; + } for (i = i + 1; i < pointsX.length; i++) { pointsX[i] = opointsX[i - 1]; pointsY[i] = opointsY[i - 1]; if (insTypes && i < pointTypes.length) { pointTypes[i] = opointTypes[i - 1]; } + if (insNames && i < pointNames.length) { + pointNames[i] = opointNames[i - 1]; + } + if (insNames && i < pointNameTypes.length) { + pointNameTypes[i] = opointNameTypes[i - 1]; + } } } @@ -1054,6 +1079,4 @@ public class RouteDataObject { } restrictionsVia[k] = viaWay; } - - } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/StringBundle.java b/OsmAnd-java/src/main/java/net/osmand/binary/StringBundle.java index dd66cfc969..ad54015c07 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/StringBundle.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/StringBundle.java @@ -21,7 +21,7 @@ public class StringBundle { private static final DecimalFormat FIVE_DIGITS_FORMATTER = new DecimalFormat("#.#####"); private static final DecimalFormat SIX_DIGITS_FORMATTER = new DecimalFormat("#.######"); - private Map map = new LinkedHashMap<>(); + private Map> map = new LinkedHashMap<>(); public enum ItemType { STRING, @@ -32,7 +32,7 @@ public class StringBundle { public StringBundle() { } - protected StringBundle(Map map) { + protected StringBundle(Map> map) { this.map = map; } @@ -156,16 +156,16 @@ public class StringBundle { } } - public static class StringListItem extends Item> { + public static class StringListItem extends Item>> { - private StringListItem(String name, List list) { + private StringListItem(String name, List> list) { super(name, ItemType.LIST, list); } } - public static class StringMapItem extends Item> { + public static class StringMapItem extends Item>> { - private StringMapItem(String name, Map map) { + private StringMapItem(String name, Map> map) { super(name, ItemType.MAP, map); } } @@ -177,11 +177,11 @@ public class StringBundle { } } - public Map getMap() { + public Map> getMap() { return Collections.unmodifiableMap(map); } - public Item getItem(String key) { + public Item getItem(String key) { return map.get(key); } @@ -190,7 +190,7 @@ public class StringBundle { } public int getInt(String key, int defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).asInt(defaultValue) : defaultValue; } @@ -199,7 +199,7 @@ public class StringBundle { } public long getLong(String key, long defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).asLong(defaultValue) : defaultValue; } @@ -212,7 +212,7 @@ public class StringBundle { } public float getFloat(String key, float defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).asFloat(defaultValue) : defaultValue; } @@ -221,7 +221,7 @@ public class StringBundle { } public boolean getBoolean(String key, boolean defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).asBoolean(defaultValue) : defaultValue; } @@ -232,35 +232,13 @@ public class StringBundle { } public String getString(String key, String defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).getValue() : defaultValue; } - public void putObject(String key, StringExternalizable object) { - if (object != null) { - StringBundle bundle = newInstance(); - object.writeToBundle(bundle); - map.put(key, new StringBundleItem(key, bundle)); - } - } - - public void putList(String key, String itemName, List list) { - if (list != null) { - List itemList = new ArrayList<>(); - for (StringExternalizable ex : list) { - if (ex != null) { - StringBundle bundle = newInstance(); - ex.writeToBundle(bundle); - itemList.add(new StringBundleItem(itemName, bundle)); - } - } - map.put(key, new StringListItem(key, itemList)); - } - } - public void putBundleList(String key, String itemName, List list) { if (list != null) { - List itemList = new ArrayList<>(); + List> itemList = new ArrayList<>(); for (StringBundle bundle : list) { itemList.add(new StringBundleItem(itemName, bundle)); } @@ -279,7 +257,7 @@ public class StringBundle { } public int[] getIntArray(String key, int[] defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).asIntArray(defaultValue) : defaultValue; } @@ -290,7 +268,7 @@ public class StringBundle { } public int[][] getIntIntArray(String key, int[][] defaultValue) { - Item item = map.get(key); + Item item = map.get(key); return item instanceof StringItem ? ((StringItem) item).asIntIntArray(defaultValue) : defaultValue; } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleWriter.java b/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleWriter.java index 36edaf268c..2f607aef3a 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleWriter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleWriter.java @@ -16,10 +16,10 @@ public abstract class StringBundleWriter { return bundle; } - protected abstract void writeItem(String name, Item item); + protected abstract void writeItem(String name, Item item); public void writeBundle() { - for (Entry entry : bundle.getMap().entrySet()) { + for (Entry> entry : bundle.getMap().entrySet()) { writeItem(entry.getKey(), entry.getValue()); } } diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleXmlWriter.java b/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleXmlWriter.java index a676f20c88..f1c8dc1054 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleXmlWriter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/StringBundleXmlWriter.java @@ -25,7 +25,7 @@ public class StringBundleXmlWriter extends StringBundleWriter { } @Override - protected void writeItem(String name, Item item) { + protected void writeItem(String name, Item item) { if (serializer != null) { try { writeItemImpl(name, item); @@ -47,7 +47,7 @@ public class StringBundleXmlWriter extends StringBundleWriter { } } - private void writeItemImpl(String name, Item item) throws IOException { + private void writeItemImpl(String name, Item item) throws IOException { if (serializer != null && item != null) { switch (item.getType()) { case STRING: { @@ -58,13 +58,13 @@ public class StringBundleXmlWriter extends StringBundleWriter { case LIST: { StringListItem listItem = (StringListItem) item; serializer.startTag(null, name); - List list = listItem.getValue(); - for (Item i : list) { + List> list = listItem.getValue(); + for (Item i : list) { if (i.getType() == StringBundle.ItemType.STRING) { writeItemImpl(i.getName(), i); } } - for (Item i : list) { + for (Item i : list) { if (i.getType() != StringBundle.ItemType.STRING) { writeItemImpl(i.getName(), i); } @@ -75,14 +75,14 @@ public class StringBundleXmlWriter extends StringBundleWriter { case MAP: { StringMapItem mapItem = (StringMapItem) item; serializer.startTag(null, name); - for (Entry entry : mapItem.getValue().entrySet()) { - Item i = entry.getValue(); + for (Entry> entry : mapItem.getValue().entrySet()) { + Item i = entry.getValue(); if (i.getType() == StringBundle.ItemType.STRING) { writeItemImpl(entry.getKey(), i); } } - for (Entry entry : mapItem.getValue().entrySet()) { - Item i = entry.getValue(); + for (Entry> entry : mapItem.getValue().entrySet()) { + Item i = entry.getValue(); if (i.getType() != StringBundle.ItemType.STRING) { writeItemImpl(entry.getKey(), i); } diff --git a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java index db84ec2297..a5c68f1938 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java @@ -38,6 +38,8 @@ public class Amenity extends MapObject { public static final String COLLECTION_TIMES = "collection_times"; public static final String CONTENT = "content"; public static final String CUISINE = "cuisine"; + public static final String WIKIDATA = "wikidata"; + public static final String WIKIMEDIA_COMMONS = "wikimedia_commons"; public static final String DISH = "dish"; public static final String REF = "ref"; public static final String OSM_DELETE_VALUE = "delete"; @@ -93,33 +95,6 @@ public class Amenity extends MapObject { return str; } - public String unzipContent(String str) { - if (str != null) { - if (str.startsWith(" gz ")) { - try { - int ind = 4; - byte[] bytes = new byte[str.length() - ind]; - for (int i = ind; i < str.length(); i++) { - char ch = str.charAt(i); - bytes[i - ind] = (byte) ((int) ch - 128 - 32); - - } - GZIPInputStream gzn = new GZIPInputStream(new ByteArrayInputStream(bytes)); - BufferedReader br = new BufferedReader(new InputStreamReader(gzn, "UTF-8")); - StringBuilder bld = new StringBuilder(); - String s; - while ((s = br.readLine()) != null) { - bld.append(s); - } - br.close(); - str = bld.toString(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return str; - } public Map getAdditionalInfo() { if (additionalInfo == null) { diff --git a/OsmAnd-java/src/main/java/net/osmand/data/City.java b/OsmAnd-java/src/main/java/net/osmand/data/City.java index 933218343a..f8faef5f67 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/City.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/City.java @@ -161,8 +161,12 @@ public class City extends MapObject { public JSONObject toJSON(boolean includingBuildings) { JSONObject json = super.toJSON(); - json.put("type", type.name()); - json.put("postcode", postcode); + if (type != null) { + json.put("type", type.name()); + } + if (postcode != null) { + json.put("postcode", postcode); + } JSONArray listOfStreetsArr = new JSONArray(); for (Street s : listOfStreets) { listOfStreetsArr.put(s.toJSON(includingBuildings)); diff --git a/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java b/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java index 84be533a5f..9518f1237d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/IncompleteTransportRoute.java @@ -13,7 +13,11 @@ public class IncompleteTransportRoute { } public void setNextLinkedRoute(IncompleteTransportRoute nextLinkedRoute) { - this.nextLinkedRoute = nextLinkedRoute; + if (this.nextLinkedRoute == null) { + this.nextLinkedRoute = nextLinkedRoute; + } else { + this.nextLinkedRoute.setNextLinkedRoute(nextLinkedRoute); + } } public long getRouteId() { diff --git a/OsmAnd-java/src/main/java/net/osmand/data/MapObject.java b/OsmAnd-java/src/main/java/net/osmand/data/MapObject.java index b4d3f1118e..cb121cedfc 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/MapObject.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/MapObject.java @@ -8,6 +8,10 @@ import net.osmand.util.TransliterationHelper; import org.json.JSONObject; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -18,6 +22,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.zip.GZIPInputStream; public abstract class MapObject implements Comparable { @@ -55,7 +60,7 @@ public abstract class MapObject implements Comparable { public String getName() { if (name != null) { - return name; + return unzipContent(name); } return ""; //$NON-NLS-1$ } @@ -73,7 +78,7 @@ public abstract class MapObject implements Comparable { if (names == null) { names = new HashMap(); } - names.put(lang, name); + names.put(lang, unzipContent(name)); } } @@ -95,19 +100,25 @@ public abstract class MapObject implements Comparable { } Map mp = new HashMap(); if (names != null) { - mp.putAll(names); + Iterator> it = mp.entrySet().iterator(); + while(it.hasNext()) { + Entry e = it.next(); + mp.put(e.getKey(), unzipContent(e.getValue())); + } } - mp.put("en", enName); + mp.put("en", unzipContent(enName)); return mp; } public List getAllNames() { List l = new ArrayList(); if (!Algorithms.isEmpty(enName)) { - l.add(enName); + l.add(unzipContent(enName)); } if (names != null) { - l.addAll(names.values()); + for(String nm : names.values()) { + l.add(unzipContent(nm)); + } } return l; } @@ -179,7 +190,7 @@ public abstract class MapObject implements Comparable { if (names != null) { String nm = names.get(lang); if (!Algorithms.isEmpty(nm)) { - return nm; + return unzipContent(nm); } if (transliterate) { return TransliterationHelper.transliterate(getName()); @@ -192,7 +203,7 @@ public abstract class MapObject implements Comparable { public String getEnName(boolean transliterate) { if (!Algorithms.isEmpty(enName)) { - return this.enName; + return unzipContent(this.enName); } else if (!Algorithms.isEmpty(getName()) && transliterate) { return TransliterationHelper.transliterate(getName()); } @@ -322,12 +333,12 @@ public abstract class MapObject implements Comparable { public JSONObject toJSON() { JSONObject json = new JSONObject(); - json.put("name", name); - json.put("enName", enName); + json.put("name", unzipContent(name)); + json.put("enName", unzipContent(enName)); if (names != null && names.size() > 0) { JSONObject namesObj = new JSONObject(); for (Entry e : names.entrySet()) { - namesObj.put(e.getKey(), e.getValue()); + namesObj.put(e.getKey(), unzipContent(e.getValue())); } json.put("names", namesObj); } @@ -339,6 +350,31 @@ public abstract class MapObject implements Comparable { return json; } + + public String unzipContent(String str) { + if (str != null && str.startsWith(" gz ")) { + try { + int ind = 4; + byte[] bytes = new byte[str.length() - ind]; + for (int i = ind; i < str.length(); i++) { + char ch = str.charAt(i); + bytes[i - ind] = (byte) ((int) ch - 128 - 32); + } + GZIPInputStream gzn = new GZIPInputStream(new ByteArrayInputStream(bytes)); + BufferedReader br = new BufferedReader(new InputStreamReader(gzn, "UTF-8")); + StringBuilder bld = new StringBuilder(); + String s; + while ((s = br.readLine()) != null) { + bld.append(s); + } + br.close(); + str = bld.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return str; + } protected static void parseJSON(JSONObject json, MapObject o) { if (json.has("name")) { diff --git a/OsmAnd-java/src/main/java/net/osmand/data/TransportStop.java b/OsmAnd-java/src/main/java/net/osmand/data/TransportStop.java index b7c3687b31..6f5b17ca75 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/TransportStop.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/TransportStop.java @@ -22,8 +22,6 @@ public class TransportStop extends MapObject { public int y31; private List exits; private List routes = null; - private LinkedHashMap referencesToRoutesMap; - private TransportStopAggregated transportStopAggregated; public TransportStop() {} @@ -35,19 +33,6 @@ public class TransportStop extends MapObject { public boolean isMissingStop() { return MISSING_STOP_NAME.equals(getName()); } - - public LinkedHashMap getReferencesToRoutesMap() { - return referencesToRoutesMap; - } - - public void putReferencesToRoutes(String repositoryFileName, int[] referencesToRoutes) { - LinkedHashMap referencesToRoutesMap = this.referencesToRoutesMap; - if (referencesToRoutesMap == null) { - referencesToRoutesMap = new LinkedHashMap<>(); - this.referencesToRoutesMap = referencesToRoutesMap; - } - referencesToRoutesMap.put(repositoryFileName, referencesToRoutes); - } public void setRoutes(List routes) { this.routes = routes; @@ -115,10 +100,6 @@ public class TransportStop extends MapObject { return !isDeleted() && referencesToRoutes != null && referencesToRoutes.length > 0; } - public boolean hasReferencesToRoutesMap() { - return !isDeleted() && referencesToRoutesMap != null && !referencesToRoutesMap.isEmpty(); - } - public Amenity getAmenity() { if (transportStopAggregated != null) { return transportStopAggregated.getAmenity(); diff --git a/OsmAnd-java/src/main/java/net/osmand/map/ITileSource.java b/OsmAnd-java/src/main/java/net/osmand/map/ITileSource.java index 38ba3493e1..7c643bbf5b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/ITileSource.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/ITileSource.java @@ -32,6 +32,8 @@ public interface ITileSource { public String getReferer(); + public String getUserAgent(); + public void deleteTiles(String path); public int getAvgSize(); diff --git a/OsmAnd-java/src/main/java/net/osmand/map/MapTileDownloader.java b/OsmAnd-java/src/main/java/net/osmand/map/MapTileDownloader.java index b3d057630e..c6e99519b4 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/MapTileDownloader.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/MapTileDownloader.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.WeakReference; -import java.net.URL; import java.net.URLConnection; import java.net.UnknownHostException; import java.util.ArrayList; @@ -91,6 +90,7 @@ public class MapTileDownloader { public final int yTile; public String url; public String referer = null; + public String userAgent = null; public boolean error; public DownloadRequest(String url, File fileToSave, int xTile, int yTile, int zoom) { @@ -267,7 +267,7 @@ public class MapTileDownloader { request.setError(false); try { URLConnection connection = NetworkUtils.getHttpURLConnection(request.url); - connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$ + connection.setRequestProperty("User-Agent", Algorithms.isEmpty(request.userAgent) ? USER_AGENT : request.userAgent); //$NON-NLS-1$ if (request.referer != null) connection.setRequestProperty("Referer", request.referer); //$NON-NLS-1$ connection.setConnectTimeout(CONNECTION_TIMEOUT); diff --git a/OsmAnd-java/src/main/java/net/osmand/map/TileSourceManager.java b/OsmAnd-java/src/main/java/net/osmand/map/TileSourceManager.java index e093fc6d0c..9885aa2fbf 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/TileSourceManager.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/TileSourceManager.java @@ -68,6 +68,7 @@ public class TileSourceManager { private String[] randomsArray; private String rule; private String referer; + private String userAgent; private boolean hidden; // if hidden in configure map settings, for example mapillary sources private boolean isRuleAcceptable = true; @@ -261,6 +262,14 @@ public class TileSourceManager { this.referer = referer; } + public String getUserAgent() { + return userAgent; + } + + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + @Override public int getTileSize() { return tileSize; @@ -484,6 +493,9 @@ public class TileSourceManager { if (!Algorithms.isEmpty(tm.getReferer())) { properties.put("referer", tm.getReferer()); } + if (!Algorithms.isEmpty(tm.getUserAgent())) { + properties.put("user_agent", tm.getUserAgent()); + } properties.put("ext", tm.getTileFormat()); properties.put("min_zoom", tm.getMinimumZoomSupported() + ""); @@ -708,6 +720,12 @@ public class TileSourceManager { } String randoms = attributes.get("randoms"); TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize); + if (attributes.get("referer") != null) { + templ.setReferer(attributes.get("referer")); + } + if (attributes.get("user_agent") != null) { + templ.setUserAgent(attributes.get("user_agent")); + } if(expirationTime >= 0) { templ.setExpirationTimeMinutes(expirationTime); } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/AbstractPoiType.java b/OsmAnd-java/src/main/java/net/osmand/osm/AbstractPoiType.java index 5a8d801d25..19cb42f350 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/AbstractPoiType.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/AbstractPoiType.java @@ -67,7 +67,6 @@ public abstract class AbstractPoiType { return this instanceof PoiType && this.isAdditional(); } - public String getTranslation() { if(translation == null) { translation = registry.getTranslation(this); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java b/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java index 00f254c816..f535af8610 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -29,16 +30,19 @@ import java.util.TreeSet; public class MapPoiTypes { + private static final String OTHER_MAP_CATEGORY = "Other"; private static MapPoiTypes DEFAULT_INSTANCE = null; private static final Log log = PlatformUtil.getLog(MapRenderingTypes.class); private String resourceName; private List categories = new ArrayList(); + private Set forbiddenTypes = new HashSet<>(); private PoiCategory otherCategory; private PoiCategory otherMapCategory; public static final String WIKI_LANG = "wiki_lang"; public static final String WIKI_PLACE = "wiki_place"; public static final String OSM_WIKI_CATEGORY = "osmwiki"; + public static final String SPEED_CAMERA = "speed_camera"; private PoiTranslator poiTranslator = null; private boolean init; @@ -96,7 +100,7 @@ public class MapPoiTypes { public PoiCategory getOtherMapCategory() { if (otherMapCategory == null) { - otherMapCategory = getPoiCategoryByName("Other", true); + otherMapCategory = getPoiCategoryByName(OTHER_MAP_CATEGORY, true); } return otherMapCategory; } @@ -111,7 +115,8 @@ public class MapPoiTypes { public List getTopVisibleFilters() { List lf = new ArrayList(); - for (PoiCategory pc : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory pc = categories.get(i); if (pc.isTopVisible()) { lf.add(pc); } @@ -131,7 +136,8 @@ public class MapPoiTypes { } public PoiCategory getOsmwiki() { - for (PoiCategory category : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory category = categories.get(i); if (category.isWiki()) { return category; } @@ -167,7 +173,8 @@ public class MapPoiTypes { } public PoiType getPoiTypeByKey(String name) { - for (PoiCategory pc : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory pc = categories.get(i); PoiType pt = pc.getPoiTypeByKeyName(name); if (pt != null && !pt.isReference()) { return pt; @@ -184,7 +191,8 @@ public class MapPoiTypes { } public AbstractPoiType getAnyPoiTypeByKey(String name) { - for (PoiCategory pc : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory pc = categories.get(i); if (pc.getKeyName().equals(name)) { return pc; } @@ -232,7 +240,8 @@ public class MapPoiTypes { public List getAllTypesTranslatedNames(StringMatcher matcher) { List tm = new ArrayList(); - for (PoiCategory pc : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory pc = categories.get(i); if (pc == otherMapCategory) { continue; } @@ -295,15 +304,21 @@ public class MapPoiTypes { } if (create) { PoiCategory lastCategory = new PoiCategory(this, name, categories.size()); - if (!lastCategory.getKeyName().equals("Other")) { + if (!lastCategory.getKeyName().equals(OTHER_MAP_CATEGORY)) { lastCategory.setTopVisible(true); } - categories.add(lastCategory); + addCategory(lastCategory); return lastCategory; } return otherCategory; } + private void addCategory(PoiCategory category) { + List copy = new ArrayList<>(categories); + copy.add(category); + categories = copy; + } + public PoiTranslator getPoiTranslator() { return poiTranslator; } @@ -348,7 +363,12 @@ public class MapPoiTypes { final Map allTypes = new LinkedHashMap(); final Map> categoryPoiAdditionalMap = new LinkedHashMap>(); final Map> abstractTypeAdditionalCategories = new LinkedHashMap>(); - this.categories.clear(); + final Map poiTypesByTag = new LinkedHashMap(); + final Map deprecatedTags = new LinkedHashMap(); + final Map poiAdditionalCategoryIconNames = new LinkedHashMap(); + final List textPoiAdditionals = new ArrayList(); + + List categoriesList = new ArrayList<>(); try { XmlPullParser parser = PlatformUtil.newXMLPullParser(); int tok; @@ -360,11 +380,13 @@ public class MapPoiTypes { PoiType lastType = null; Set lastTypePoiAdditionalsCategories = new TreeSet(); String lastPoiAdditionalCategory = null; + PoiCategory localOtherMapCategory = new PoiCategory(this, OTHER_MAP_CATEGORY, categoriesList.size()); + categoriesList.add(localOtherMapCategory); while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { if (tok == XmlPullParser.START_TAG) { String name = parser.getName(); if (name.equals("poi_category")) { - lastCategory = new PoiCategory(this, parser.getAttributeValue("", "name"), categories.size()); + lastCategory = new PoiCategory(this, parser.getAttributeValue("", "name"), categoriesList.size()); lastCategory.setTopVisible(Boolean.parseBoolean(parser.getAttributeValue("", "top"))); lastCategory.setNotEditableOsm("true".equals(parser.getAttributeValue("", "no_edit"))); lastCategory.setDefaultTag(parser.getAttributeValue("", "default_tag")); @@ -375,7 +397,7 @@ public class MapPoiTypes { lastCategory.addExcludedPoiAdditionalCategories(parser.getAttributeValue("", "excluded_poi_additional_category").split(",")); lastCategoryPoiAdditionalsCategories.removeAll(lastCategory.getExcludedPoiAdditionalCategories()); } - categories.add(lastCategory); + categoriesList.add(lastCategory); } else if (name.equals("poi_filter")) { PoiFilter tp = new PoiFilter(this, lastCategory, parser.getAttributeValue("", "name")); tp.setTopVisible(Boolean.parseBoolean(parser.getAttributeValue("", "top"))); @@ -399,14 +421,17 @@ public class MapPoiTypes { lastCategory.addPoiType(tp); } else if (name.equals("poi_additional")) { if (lastCategory == null) { - lastCategory = getOtherMapCategory(); + lastCategory = localOtherMapCategory; } - PoiType baseType = parsePoiAdditional(parser, lastCategory, lastFilter, lastType, null, null, lastPoiAdditionalCategory); + PoiType baseType = parsePoiAdditional(parser, lastCategory, lastFilter, lastType, null, null, + lastPoiAdditionalCategory, textPoiAdditionals); if ("true".equals(parser.getAttributeValue("", "lang"))) { for (String lng : MapRenderingTypes.langs) { - parsePoiAdditional(parser, lastCategory, lastFilter, lastType, lng, baseType, lastPoiAdditionalCategory); + parsePoiAdditional(parser, lastCategory, lastFilter, lastType, lng, baseType, + lastPoiAdditionalCategory, textPoiAdditionals); } - parsePoiAdditional(parser, lastCategory, lastFilter, lastType, "en", baseType, lastPoiAdditionalCategory); + parsePoiAdditional(parser, lastCategory, lastFilter, lastType, "en", baseType, + lastPoiAdditionalCategory, textPoiAdditionals); } if (lastPoiAdditionalCategory != null) { List categoryAdditionals = categoryPoiAdditionalMap.get(lastPoiAdditionalCategory); @@ -428,7 +453,7 @@ public class MapPoiTypes { } else if (name.equals("poi_type")) { if (lastCategory == null) { - lastCategory = getOtherMapCategory(); + lastCategory = localOtherMapCategory; } if(!Algorithms.isEmpty(parser.getAttributeValue("", "deprecated_of"))){ String vl = parser.getAttributeValue("", "name"); @@ -477,6 +502,7 @@ public class MapPoiTypes { } } } + is.close(); } catch (IOException e) { log.error("Unexpected error", e); //$NON-NLS-1$ @@ -504,17 +530,25 @@ public class MapPoiTypes { List poiAdditionals = categoryPoiAdditionalMap.get(category); if (poiAdditionals != null) { for (PoiType poiType : poiAdditionals) { - buildPoiAdditionalReference(poiType, entry.getKey()); + buildPoiAdditionalReference(poiType, entry.getKey(), textPoiAdditionals); } } } } - findDefaultOtherCategory(); + this.categories = categoriesList; + this.poiTypesByTag = poiTypesByTag; + this.deprecatedTags = deprecatedTags; + this.poiAdditionalCategoryIconNames = poiAdditionalCategoryIconNames; + this.textPoiAdditionals = textPoiAdditionals; + otherCategory = getPoiCategoryByName("user_defined_other"); + if (otherCategory == null) { + throw new IllegalArgumentException("No poi category other"); + } init = true; log.info("Time to init poi types " + (System.currentTimeMillis() - time)); //$NON-NLS-1$ } - private PoiType buildPoiAdditionalReference(PoiType poiAdditional, AbstractPoiType parent) { + private PoiType buildPoiAdditionalReference(PoiType poiAdditional, AbstractPoiType parent, List textPoiAdditionals) { PoiCategory lastCategory = null; PoiFilter lastFilter = null; PoiType lastType = null; @@ -565,7 +599,8 @@ public class MapPoiTypes { } private PoiType parsePoiAdditional(XmlPullParser parser, PoiCategory lastCategory, PoiFilter lastFilter, - PoiType lastType, String lang, PoiType langBaseType, String poiAdditionalCategory) { + PoiType lastType, String lang, PoiType langBaseType, + String poiAdditionalCategory, List textPoiAdditionals) { String oname = parser.getAttributeValue("", "name"); if (lang != null) { oname += ":" + lang; @@ -647,13 +682,6 @@ public class MapPoiTypes { return tp; } - private void findDefaultOtherCategory() { - PoiCategory pc = getPoiCategoryByName("user_defined_other"); - if (pc == null) { - throw new IllegalArgumentException("No poi category other"); - } - otherCategory = pc; - } public List getCategories(boolean includeMapCategory) { ArrayList lst = new ArrayList(categories); @@ -699,7 +727,8 @@ public class MapPoiTypes { public AbstractPoiType getAnyPoiAdditionalTypeByKey(String name) { PoiType add = null; - for (PoiCategory pc : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory pc = categories.get(i); add = getPoiAdditionalByKey(pc, name); if (add != null) { return add; @@ -805,7 +834,8 @@ public class MapPoiTypes { if (!poiTypesByTag.isEmpty()) { return; } - for (PoiCategory poic : categories) { + for (int i = 0; i < categories.size(); i++) { + PoiCategory poic = categories.get(i); for (PoiType p : poic.getPoiTypes()) { initPoiType(p); for (PoiType pts : p.getPoiAdditionals()) { @@ -918,4 +948,12 @@ public class MapPoiTypes { return pat.isText(); } } + + public void setForbiddenTypes(Set forbiddenTypes) { + this.forbiddenTypes = forbiddenTypes; + } + + public boolean isTypeForbidden(String typeName) { + return forbiddenTypes.contains(typeName); + } } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java b/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java index 22121c301d..34e5048930 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java @@ -4,6 +4,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -153,6 +154,34 @@ public abstract class MapRenderingTypes { return a; } + protected MapRulType checkOrCreateTextRule(String targetTag, MapRulType ref) { + MapRulType mt = types.get(constructRuleKey(targetTag, null)); + if (mt == null) { + MapRulType ct = MapRulType.createText(targetTag, ref); + mt = registerRuleType(ct); + } + return mt; + } + + protected MapRulType checkOrMainRule(String tag, String value, int minzoom) { + MapRulType mt = types.get(constructRuleKey(tag, value)); + if (mt == null) { + mt = registerRuleType(MapRulType.createMainEntity(tag, value)); + mt.minzoom = minzoom; + mt.maxzoom = 21; + } + return mt; + } + + protected MapRulType checkOrCreateAdditional(String tag, String value, MapRulType ref) { + MapRulType mt = types.get(constructRuleKey(tag, value)); + if (mt == null) { + MapRulType ct = MapRulType.createAdditional(tag, value, ref); + mt = registerRuleType(ct); + } + return mt; + } + protected MapRulType getRuleType(String tag, String val, boolean poi, boolean map) { Map types = getEncodingRuleTypes(); tag = lc(tag); @@ -171,7 +200,6 @@ public abstract class MapRenderingTypes { rType.map = parent.map; rType.poi = parent.poi; rType.onlyPoint = parent.onlyPoint; - rType.namePrefix = parent.namePrefix; rType = registerRuleType(rType); } return rType; @@ -265,37 +293,112 @@ public abstract class MapRenderingTypes { rtype.onlyPoint = Boolean.parseBoolean(parser.getAttributeValue("", "point")); //$NON-NLS-1$ rtype.relation = Boolean.parseBoolean(parser.getAttributeValue("", "relation")); //$NON-NLS-1$ rtype.relationGroup = Boolean.parseBoolean(parser.getAttributeValue("", "relationGroup")); //$NON-NLS-1$ - if (rtype.isMain()) { - rtype.namePrefix = parser.getAttributeValue("", "namePrefix"); //$NON-NLS-1$ - if (rtype.namePrefix == null) { - rtype.namePrefix = ""; + if (rtype.isMain()) { + if (rtype.relationGroup) { + MapRulType mrt = MapRulType.createMainEntity(tag + "_" + value, null); + mrt.order = rtype.order; + mrt.category = rtype.category; + mrt.poi = rtype.poi; + mrt.map = rtype.map; + registerMapRule(parser, mrt); } - - String v = parser.getAttributeValue("", "nameTags"); - if (v != null) { - String[] names = v.split(","); - rtype.names = new MapRulType[names.length * (langs.length + 1)]; - int j = 0; - for (int i = 0; i < names.length; i++) { - String tagName = names[i]; - if (rtype.namePrefix.length() > 0) { - tagName = rtype.namePrefix + tagName; + + String groupSort = parser.getAttributeValue("", "relationGroupSort"); + if (groupSort != null) { + rtype.relationSortTags = new LinkedHashMap>(); + String[] ls = groupSort.split(";"); + for(String l : ls) { + int sp = l.indexOf('='); + String key = l; + String[] values = new String[0]; + if(sp >= 0) { + key = l.substring(0, sp); + values = l.substring(sp +1).split(","); } - MapRulType mt = MapRulType.createText(tagName); - mt = registerRuleType(mt); - rtype.names[j++] = mt; - for(String lng : langs) { - mt = MapRulType.createText(tagName + ":" + lng); - mt = registerRuleType(mt); - rtype.names[j++] = mt; + rtype.relationSortTags.put(key, Arrays.asList(values)); + } + } + + String additionalTags = parser.getAttributeValue("", "additionalTags"); + String additionalPrefix = parser.getAttributeValue("", "additionalPrefix"); + if (additionalTags != null) { + rtype.additionalTags = new LinkedHashMap(); + for(String tg : additionalTags.split(",")) { + String targetTag = tg; + if(!Algorithms.isEmpty(additionalPrefix)) { + targetTag = additionalPrefix + tg; + } + rtype.additionalTags.put(tg, targetTag); + } + } + rtype.relationGroupPrefix = parser.getAttributeValue("", "relationGroupPrefix"); //$NON-NLS-1$ + String relationGroupAdditionalTags = parser.getAttributeValue("", "relationGroupAdditionalTags"); + if (relationGroupAdditionalTags != null) { + rtype.relationGroupAdditionalTags = new LinkedHashMap(); + for(String tg : relationGroupAdditionalTags.split(",")) { + rtype.relationGroupAdditionalTags.put(tg, tg); + } + } + + String nmts = parser.getAttributeValue("", "nameTags"); + if (nmts != null) { + if (rtype.relation || rtype.relationGroup) { + String namePrefix = parser.getAttributeValue("", "namePrefix"); //$NON-NLS-1$ + if (namePrefix == null) { + namePrefix = ""; + } + rtype.relationNames = new LinkedHashMap(); + putNameTags(nmts, rtype.relationNames, namePrefix); + } else { + String[] nameSplit = nmts.split(","); + for (String nameTag : nameSplit) { + checkOrCreateTextRule(nameTag, null); } } } + String rnmts = parser.getAttributeValue("", "relationGroupNameTags"); + if (rnmts != null) { + rtype.relationGroupNameTags = new LinkedHashMap(); + putNameTags(rnmts, rtype.relationGroupNameTags, ""); + } } return rtype; } + private void putNameTags(String namesList, Map names, String namePrefix) { + if (namesList != null) { + String[] nameSplit = namesList.split(","); + for (int i = 0; i < nameSplit.length; i++) { + String tagName = nameSplit[i]; + String tagTargetName = tagName; + if (namePrefix.length() > 0) { + tagTargetName = namePrefix + tagName; + } + names.put(tagName, tagTargetName); + for (String lng : langs) { + names.put(tagName + ":" + lng, tagTargetName + ":" + lng); + } + } + } + } + + protected void registerMapRule(XmlPullParser parser, MapRulType rtype) { + String val = parser.getAttributeValue("", "minzoom"); //$NON-NLS-1$ + if (rtype.isMain()) { + rtype.minzoom = 15; + } + if (val != null) { + rtype.minzoom = Integer.parseInt(val); + } + val = parser.getAttributeValue("", "maxzoom"); //$NON-NLS-1$ + rtype.maxzoom = 31; + if (val != null) { + rtype.maxzoom = Integer.parseInt(val); + } + registerRuleType(rtype); + } + protected MapRulType registerRuleType(MapRulType rt) { String tag = rt.tagValuePattern.tag; String val = rt.tagValuePattern.value; @@ -422,7 +525,14 @@ public abstract class MapRenderingTypes { } public static class MapRulType { - protected MapRulType[] names; + // relation part + protected Map relationNames; + protected Map additionalTags; + protected Map> relationSortTags; + protected String relationGroupPrefix; + protected Map relationGroupNameTags; + protected Map relationGroupAdditionalTags; + protected TagValuePattern tagValuePattern; protected boolean additional; protected boolean additionalText; @@ -440,7 +550,6 @@ public abstract class MapRenderingTypes { protected int minzoom; protected int maxzoom; protected boolean onlyPoint; - protected String namePrefix =""; // inner id @@ -452,6 +561,16 @@ public abstract class MapRenderingTypes { private MapRulType(){ } + + private void copyMetadata(MapRulType ref) { + minzoom = ref.minzoom; + maxzoom = ref.maxzoom; + order = ref.order; + category = ref.category; + onlyPoint = ref.onlyPoint; + } + + public boolean isPOI(){ return poi; } @@ -471,24 +590,37 @@ public abstract class MapRenderingTypes { return rt; } - public static MapRulType createText(String tag) { + public static MapRulType createText(String tag, MapRulType ref) { MapRulType rt = new MapRulType(); - rt.additionalText = true; rt.minzoom = 2; rt.maxzoom = 31; - rt.tagValuePattern = new TagValuePattern(tag, null); + if (ref != null) { + rt.copyMetadata(ref); + } + rt.additionalText = true; + rt.tagValuePattern = new TagValuePattern(tag, null); return rt; } - public static MapRulType createAdditional(String tag, String value) { + public static MapRulType createAdditional(String tag, String value, MapRulType ref) { MapRulType rt = new MapRulType(); - rt.additional = true; rt.minzoom = 2; rt.maxzoom = 31; + if (ref != null) { + rt.copyMetadata(ref); + } + rt.additional = true; rt.tagValuePattern = new TagValuePattern(tag, value); return rt; } + public static MapRulType createText(String tag) { + return createText(tag, null); + } + + public static MapRulType createAdditional(String tag, String value) { + return createAdditional(tag, value, null); + } public String getTag() { return tagValuePattern.tag; @@ -549,14 +681,6 @@ public abstract class MapRenderingTypes { return onlyPoint; } - public boolean isRelation() { - return relation; - } - - public boolean isRelationGroup() { - return relationGroup; - } - public int getFreq() { return freq; diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java b/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java index 4bbf2e2e4b..a3f6f4eedf 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/PoiFilter.java @@ -7,38 +7,62 @@ import java.util.List; import java.util.Map; public class PoiFilter extends AbstractPoiType { - - private PoiCategory pc; + + private PoiCategory pc; private List poiTypes = new ArrayList(); private Map map = new LinkedHashMap(); - public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName){ + public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName) { super(keyName, registry); this.pc = pc; } - + public PoiCategory getPoiCategory() { return pc; } - + public PoiType getPoiTypeByKeyName(String kn) { return map.get(kn); } - + + + public void addExtraPoiTypes(Map poiTypesToAdd) { + List npoiTypes = null; + Map nmap = null; + for (PoiType poiType : poiTypesToAdd.values()) { + String keyName = poiType.getKeyName(); + if (!map.containsKey(keyName) && !registry.isTypeForbidden(keyName)) { + if (npoiTypes == null) { + npoiTypes = new ArrayList(this.poiTypes); + nmap = new LinkedHashMap<>(map); + } + npoiTypes.add(poiType); + nmap.put(keyName, poiType); + } + } + if (npoiTypes != null) { + poiTypes = npoiTypes; + map = nmap; + } + } + public void addPoiType(PoiType type) { + if (registry.isTypeForbidden(type.keyName)) { + return; + } if (!map.containsKey(type.getKeyName())) { poiTypes.add(type); map.put(type.getKeyName(), type); } else { PoiType prev = map.get(type.getKeyName()); - if(prev.isReference()) { + if (prev.isReference()) { poiTypes.remove(prev); poiTypes.add(type); map.put(type.getKeyName(), type); } } } - + public Map> putTypes(Map> acceptedTypes) { if (!acceptedTypes.containsKey(pc)) { acceptedTypes.put(pc, new LinkedHashSet()); @@ -65,9 +89,10 @@ public class PoiFilter extends AbstractPoiType { } } } - + public List getPoiTypes() { return poiTypes; } + } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java b/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java index 20a917964b..5651cf0e03 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/PoiType.java @@ -26,8 +26,8 @@ public class PoiType extends AbstractPoiType { private int order = 90; - public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String name) { - super(name, poiTypes); + public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String keyName) { + super(keyName, poiTypes); this.category = category; this.filter = filter; } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java index 13ae80af64..6005f85035 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java @@ -301,8 +301,11 @@ public abstract class Entity implements Serializable { String values = getTag(OSMTagKey.IS_IN); if (values == null) { String city = getTag(OSMTagKey.ADDR_CITY); + String place = getTag(OSMTagKey.ADDR_PLACE); if(!Algorithms.isEmpty(city)) { return Collections.singleton(city.trim()); + } else if(!Algorithms.isEmpty(place)) { + return Collections.singleton(place.trim()); } return Collections.emptySet(); } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OSMSettings.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OSMSettings.java index 87b9c755a1..7e54548644 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OSMSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OSMSettings.java @@ -34,9 +34,11 @@ public class OSMSettings { // address PLACE("place"), //$NON-NLS-1$ ADDR_HOUSE_NUMBER("addr:housenumber"), //$NON-NLS-1$ + ADDR2_HOUSE_NUMBER("addr2:housenumber"), //$NON-NLS-1$ ADDR_HOUSE_NAME("addr:housename"), //$NON-NLS-1$ ADDR_STREET("addr:street"), //$NON-NLS-1$ ADDR_STREET2("addr:street2"), //$NON-NLS-1$ + ADDR2_STREET("addr2:street"), //$NON-NLS-1$ ADDR_CITY("addr:city"), //$NON-NLS-1$ ADDR_PLACE("addr:place"), //$NON-NLS-1$ ADDR_POSTCODE("addr:postcode"), //$NON-NLS-1$ diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java index 5be470ac4d..5e19d09658 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java @@ -87,6 +87,11 @@ public class OsmMapUtils { } public static LatLon getComplexPolyCenter(Collection outer, List> inner) { + if (outer.size() > 3 && outer.size() <= 5 && inner == null) { + List sub = new ArrayList<>(outer); + return getWeightCenterForNodes(sub.subList(0, sub.size()-1)); + } + final List> rings = new ArrayList<>(); List outerRing = new ArrayList<>(); @@ -551,6 +556,9 @@ public class OsmMapUtils { // take centroid as the first best guess Cell bestCell = getCentroidCell(rings); + if(bestCell == null) { + return new LatLon(minX, minY); + } // special case for rectangular polygons Cell bboxCell = new Cell(minX + width / 2, minY + height / 2, 0, rings); @@ -601,10 +609,13 @@ public class OsmMapUtils { area += f * 3; } - if (area == 0) { - LatLon p = points.get(0); - return new Cell(p.getLatitude(), p.getLongitude(), 0, rings); - } + if (area == 0) { + if (points.size() == 0) { + return null; + } + LatLon p = points.get(0); + return new Cell(p.getLatitude(), p.getLongitude(), 0, rings); + } return new Cell(x / area, y / area, 0, rings); } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java b/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java index 0a3da9bee2..0def1af562 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java @@ -1,93 +1,104 @@ package net.osmand.osm.io; + /** * @source http://www.javaworld.com/javaworld/javatips/jw-javatip47.html -- 24.11.2008, (mb) */ public class Base64 { - /******************************************************************************************************************* - * BASE 64 encoding of a String or an array of bytes. See also RFC 1421. - * - * @author Unknown - * @author David W. Croft - * @version 1998-06-08 - ******************************************************************************************************************/ + /******************************************************************************************************************* + * BASE 64 encoding of a String or an array of bytes. See also RFC 1421. + * + * @author Unknown + * @author David W. Croft + * @version 1998-06-08 + ******************************************************************************************************************/ - ////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////// - public static final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7 - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8 to 15 - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23 - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31 - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39 - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47 - 'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55 - '4', '5', '6', '7', '8', '9', '+', '/' }; // 56 to 63 + ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////// + public static final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7 + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8 to 15 + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23 + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31 + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39 + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47 + 'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55 + '4', '5', '6', '7', '8', '9', '+', '/' }; // 56 to 63 - ////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////// - public static String encode(final String s) - ////////////////////////////////////////////////////////////////////// - { - return encode(s.getBytes()); - } + public static int indexOf(char c) { + for (int i = 0; i < alphabet.length; i++) { + if (alphabet[i] == c) { + return i; + } + } + return -1; + } - public static String encode(final byte[] octetString) - ////////////////////////////////////////////////////////////////////// - { - int bits24; - int bits6; - final char[] out = new char[((octetString.length - 1) / 3 + 1) * 4]; + public static String encode(final String s) + ////////////////////////////////////////////////////////////////////// + { + return encode(s.getBytes()); + } - int outIndex = 0; - int i = 0; + public static String encode(final byte[] octetString) + ////////////////////////////////////////////////////////////////////// + { + int bits24; + int bits6; - while ((i + 3) <= octetString.length) { - // store the octets - bits24 = (octetString[i++] & 0xFF) << 16; - bits24 |= (octetString[i++] & 0xFF) << 8; - bits24 |= (octetString[i++] & 0xFF); + final char[] out = new char[((octetString.length - 1) / 3 + 1) * 4]; - bits6 = (bits24 & 0x00FC0000) >> 18; - out[outIndex++] = alphabet[bits6]; - bits6 = (bits24 & 0x0003F000) >> 12; - out[outIndex++] = alphabet[bits6]; - bits6 = (bits24 & 0x00000FC0) >> 6; - out[outIndex++] = alphabet[bits6]; - bits6 = (bits24 & 0x0000003F); - out[outIndex++] = alphabet[bits6]; - } + int outIndex = 0; + int i = 0; - if (octetString.length - i == 2) { - // store the octets - bits24 = (octetString[i] & 0xFF) << 16; - bits24 |= (octetString[i + 1] & 0xFF) << 8; + while ((i + 3) <= octetString.length) { + // store the octets + bits24 = (octetString[i++] & 0xFF) << 16; + bits24 |= (octetString[i++] & 0xFF) << 8; + bits24 |= (octetString[i++] & 0xFF); - bits6 = (bits24 & 0x00FC0000) >> 18; - out[outIndex++] = alphabet[bits6]; - bits6 = (bits24 & 0x0003F000) >> 12; - out[outIndex++] = alphabet[bits6]; - bits6 = (bits24 & 0x00000FC0) >> 6; - out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x00FC0000) >> 18; + out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x0003F000) >> 12; + out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x00000FC0) >> 6; + out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x0000003F); + out[outIndex++] = alphabet[bits6]; + } - // padding - out[outIndex++] = '='; - } else if (octetString.length - i == 1) { - // store the octets - bits24 = (octetString[i] & 0xFF) << 16; + if (octetString.length - i == 2) { + // store the octets + bits24 = (octetString[i] & 0xFF) << 16; + bits24 |= (octetString[i + 1] & 0xFF) << 8; - bits6 = (bits24 & 0x00FC0000) >> 18; - out[outIndex++] = alphabet[bits6]; - bits6 = (bits24 & 0x0003F000) >> 12; - out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x00FC0000) >> 18; + out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x0003F000) >> 12; + out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x00000FC0) >> 6; + out[outIndex++] = alphabet[bits6]; - // padding - out[outIndex++] = '='; - out[outIndex++] = '='; - } + // padding + out[outIndex++] = '='; + } else if (octetString.length - i == 1) { + // store the octets + bits24 = (octetString[i] & 0xFF) << 16; - return new String(out); - } + bits6 = (bits24 & 0x00FC0000) >> 18; + out[outIndex++] = alphabet[bits6]; + bits6 = (bits24 & 0x0003F000) >> 12; + out[outIndex++] = alphabet[bits6]; + + // padding + out[outIndex++] = '='; + out[outIndex++] = '='; + } + + return new String(out); + } } \ No newline at end of file diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java index 7b785c4e5e..7a43f1f624 100644 --- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java +++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java @@ -8,6 +8,9 @@ import java.util.Map; public class RenderingRuleStorageProperties { public static final String UI_CATEGORY_HIDDEN = "ui_hidden"; + public static final String UI_CATEGORY_DETAILS = "details"; + public static final String UI_CATEGORY_HIDE = "hide"; + public static final String UI_CATEGORY_ROUTES = "routes"; public static final String A_ENGINE_V1 = "engine_v1"; public static final String A_APP_MODE= "appMode"; public static final String A_BASE_APP_MODE = "baseAppMode"; diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java index 96e1280d76..d4d97d547c 100644 --- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java +++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -18,6 +17,7 @@ import java.util.Map.Entry; import java.util.Stack; import net.osmand.PlatformUtil; +import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; import org.xmlpull.v1.XmlPullParser; @@ -26,7 +26,7 @@ import org.xmlpull.v1.XmlPullParserException; public class RenderingRulesStorage { private final static Log log = PlatformUtil.getLog(RenderingRulesStorage.class); - static boolean STORE_ATTTRIBUTES = false; + static boolean STORE_ATTRIBUTES = false; // keep sync ! // keep sync ! not change values @@ -40,6 +40,10 @@ public class RenderingRulesStorage { private final static int SHIFT_TAG_VAL = 16; + + private final static String SEQ_ATTR_KEY = "seq"; + private final static String SEQ_PLACEHOLDER = "#SEQ"; + // C++ List dictionary = new ArrayList(); Map dictionaryMap = new LinkedHashMap(); @@ -183,31 +187,86 @@ public class RenderingRulesStorage { } } + private class XmlTreeSequence { + XmlTreeSequence parent; + String seqOrder; + Map attrsMap = new LinkedHashMap(); + String name; + List children = new ArrayList(); + + private void process(RenderingRulesHandler handler, int el) throws XmlPullParserException, IOException { + Map seqAttrsMap = new HashMap(attrsMap); + if (attrsMap.containsKey(SEQ_ATTR_KEY)) { + attrsMap.remove(SEQ_ATTR_KEY); + } + + for (Entry attr: attrsMap.entrySet()) { + if (attr.getValue().contains(SEQ_PLACEHOLDER)) { + seqAttrsMap.put(attr.getKey(), attr.getValue().replace(SEQ_PLACEHOLDER, el+"")); + } else { + seqAttrsMap.put(attr.getKey(), attr.getValue()); + } + } + handler.startElement(seqAttrsMap, name); + for(XmlTreeSequence s : children) { + s.process(handler, el); + } + handler.endElement(name); + } + } + private class RenderingRulesHandler { private final XmlPullParser parser; private int state; - Stack stack = new Stack(); - - Map attrsMap = new LinkedHashMap(); private final RenderingRulesStorageResolver resolver; private RenderingRulesStorage dependsStorage; - - public RenderingRulesHandler(XmlPullParser parser, RenderingRulesStorageResolver resolver){ this.parser = parser; this.resolver = resolver; } public void parse(InputStream is) throws XmlPullParserException, IOException { + XmlPullParser parser = this.parser; + Map attrsMap = new LinkedHashMap(); parser.setInput(is, "UTF-8"); int tok; + XmlTreeSequence currentSeqElement = null; while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { if (tok == XmlPullParser.START_TAG) { - startElement(parser.getName()); + attrsMap.clear(); + parseAttributes(parser, attrsMap); + String name = parser.getName(); + if (!Algorithms.isEmpty(parser.getAttributeValue("", SEQ_ATTR_KEY)) || currentSeqElement != null) { + XmlTreeSequence seq = new XmlTreeSequence(); + seq.name = name; + seq.attrsMap = new HashMap(attrsMap); + seq.parent = currentSeqElement; + if (currentSeqElement == null) { + seq.seqOrder = parser.getAttributeValue("", SEQ_ATTR_KEY); + } else { + currentSeqElement.children.add(seq); + seq.seqOrder = currentSeqElement.seqOrder; + } + currentSeqElement = seq; + } else { + startElement(attrsMap, name); + } } else if (tok == XmlPullParser.END_TAG) { - endElement(parser.getName()); + if(currentSeqElement == null) { + endElement(parser.getName()); + } else { + XmlTreeSequence process = currentSeqElement; + currentSeqElement = currentSeqElement.parent; + if (currentSeqElement == null) { + // Here we process sequence element + int seqEnd = Integer.parseInt(process.seqOrder.substring(process.seqOrder.indexOf(':') + 1, process.seqOrder.length())); + for(int i = 1; i < seqEnd; i++) { + process.process(this, i); + } + } + } } } @@ -226,16 +285,14 @@ public class RenderingRulesStorage { return true; } - public void startElement(String name) throws XmlPullParserException, IOException { + public void startElement(Map attrsMap, String name) throws XmlPullParserException, IOException { boolean stateChanged = false; final boolean isCase = isCase(name); final boolean isSwitch = isSwitch(name); if(isCase || isSwitch){ //$NON-NLS-1$ - attrsMap.clear(); boolean top = stack.size() == 0 || isTopCase(); - parseAttributes(attrsMap); RenderingRule renderingRule = new RenderingRule(attrsMap, isSwitch, RenderingRulesStorage.this); - if(top || STORE_ATTTRIBUTES){ + if(top || STORE_ATTRIBUTES){ renderingRule.storeAttributes(attrsMap); } if (stack.size() > 0 && stack.peek() instanceof RenderingRule) { @@ -244,10 +301,8 @@ public class RenderingRulesStorage { } stack.push(renderingRule); } else if(isApply(name)){ //$NON-NLS-1$ - attrsMap.clear(); - parseAttributes(attrsMap); RenderingRule renderingRule = new RenderingRule(attrsMap, false, RenderingRulesStorage.this); - if(STORE_ATTTRIBUTES) { + if(STORE_ATTRIBUTES) { renderingRule.storeAttributes(attrsMap); } if (stack.size() > 0 && stack.peek() instanceof RenderingRule) { @@ -272,14 +327,14 @@ public class RenderingRulesStorage { state = POLYGON_RULES; stateChanged = true; } else if("renderingAttribute".equals(name)){ //$NON-NLS-1$ - String attr = parser.getAttributeValue("", "name"); + String attr = attrsMap.get("name"); RenderingRule root = new RenderingRule(new HashMap(), false, RenderingRulesStorage.this); renderingAttributes.put(attr, root); stack.push(root); } else if("renderingProperty".equals(name)){ //$NON-NLS-1$ - String attr = parser.getAttributeValue("", "attr"); + String attr = attrsMap.get("attr"); RenderingRuleProperty prop; - String type = parser.getAttributeValue("", "type"); + String type = attrsMap.get("type"); if("boolean".equalsIgnoreCase(type)){ prop = RenderingRuleProperty.createInputBooleanProperty(attr); } else if("string".equalsIgnoreCase(type)){ @@ -287,20 +342,20 @@ public class RenderingRulesStorage { } else { prop = RenderingRuleProperty.createInputIntProperty(attr); } - prop.setDescription(parser.getAttributeValue("", "description")); - prop.setDefaultValueDescription(parser.getAttributeValue("", "defaultValueDescription")); - prop.setCategory(parser.getAttributeValue("", "category")); - prop.setName(parser.getAttributeValue("", "name")); - if(parser.getAttributeValue("", "possibleValues") != null){ - prop.setPossibleValues(parser.getAttributeValue("", "possibleValues").split(",")); + prop.setDescription(attrsMap.get("description")); + prop.setDefaultValueDescription(attrsMap.get("defaultValueDescription")); + prop.setCategory(attrsMap.get("category")); + prop.setName(attrsMap.get("name")); + if (attrsMap.get("possibleValues") != null) { + prop.setPossibleValues(attrsMap.get("possibleValues").split(",")); } PROPS.registerRule(prop); } else if("renderingConstant".equals(name)){ //$NON-NLS-1$ - if(!renderingConstants.containsKey(parser.getAttributeValue("", "name"))){ - renderingConstants.put(parser.getAttributeValue("", "name"), parser.getAttributeValue("", "value")); + if(!renderingConstants.containsKey(attrsMap.get("name"))){ + renderingConstants.put(attrsMap.get("name"), attrsMap.get("value")); } } else if("renderingStyle".equals(name)){ //$NON-NLS-1$ - String depends = parser.getAttributeValue("", "depends"); + String depends = attrsMap.get("depends"); if(depends != null && depends.length()> 0){ this.dependsStorage = resolver.resolve(depends, resolver); } @@ -311,7 +366,7 @@ public class RenderingRulesStorage { PROPS = new RenderingRuleStorageProperties(dependsStorage.PROPS); } - internalRenderingName = parser.getAttributeValue("", "name"); + internalRenderingName = attrsMap.get("name"); } else if("renderer".equals(name)){ //$NON-NLS-1$ throw new XmlPullParserException("Rendering style is deprecated and no longer supported."); @@ -337,7 +392,7 @@ public class RenderingRulesStorage { return "group".equals(name) || "switch".equals(name); } - private Map parseAttributes(Map m) { + private Map parseAttributes(XmlPullParser parser, Map m) { for (int i = 0; i < parser.getAttributeCount(); i++) { String name = parser.getAttributeName(i); String vl = parser.getAttributeValue(i); @@ -396,7 +451,7 @@ public class RenderingRulesStorage { vl = ns.remove("value"); // reset rendering rule attributes renderingRule.init(ns); - if(STORE_ATTTRIBUTES) { + if(STORE_ATTRIBUTES) { renderingRule.storeAttributes(ns); } @@ -469,7 +524,7 @@ public class RenderingRulesStorage { public static void main(String[] args) throws XmlPullParserException, IOException { - STORE_ATTTRIBUTES = true; + STORE_ATTRIBUTES = true; // InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml"); final String loc = "/Users/victorshcherb/osmand/repos/resources/rendering_styles/"; String defaultFile = loc + "UniRS.render.xml"; diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStoragePrinter.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStoragePrinter.java index 5948bcb5e1..86d0c2cb73 100644 --- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStoragePrinter.java +++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStoragePrinter.java @@ -21,7 +21,7 @@ import org.xmlpull.v1.XmlPullParserException; public class RenderingRulesStoragePrinter { public static void main(String[] args) throws XmlPullParserException, IOException { - RenderingRulesStorage.STORE_ATTTRIBUTES = true; + RenderingRulesStorage.STORE_ATTRIBUTES = true; // InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml"); String defaultFile = "/Users/victorshcherb/osmand/repos/resources/rendering_styles/default.render.xml"; if(args.length > 0) { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java index de2da50d79..6b8926b413 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java @@ -11,6 +11,7 @@ import java.util.PriorityQueue; import net.osmand.PlatformUtil; import net.osmand.binary.RouteDataObject; +import net.osmand.data.LatLon; import net.osmand.osm.MapRenderingTypes; import net.osmand.util.MapUtils; @@ -64,13 +65,10 @@ public class BinaryRoutePlanner { * Calculate route between start.segmentEnd and end.segmentStart (using A* algorithm) * return list of segments */ - @SuppressWarnings("unused") FinalRouteSegment searchRouteInternal(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end, RouteSegment recalculationEnd ) throws InterruptedException, IOException { // measure time - ctx.timeToLoad = 0; ctx.memoryOverhead = 1000; - ctx.visitedSegments = 0; // Initializing priority queue to visit way segments Comparator nonHeuristicSegmentsComparator = new NonHeuristicSegmentsComparator(); @@ -121,7 +119,9 @@ public class BinaryRoutePlanner { if (ctx.memoryOverhead > ctx.config.memoryLimitation * 0.95) { throw new IllegalStateException("There is not enough memory " + ctx.config.memoryLimitation / (1 << 20) + " Mb"); } - ctx.visitedSegments ++; + if (ctx.calculationProgress != null) { + ctx.calculationProgress.visitedSegments++; + } if (forwardSearch) { boolean doNotAddIntersections = onlyBackward; processRouteSegment(ctx, false, graphDirectSegments, visitedDirectSegments, @@ -138,7 +138,7 @@ public class BinaryRoutePlanner { checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments, "Route is not found from selected start point."); if (ctx.planRouteIn2Directions()) { - forwardSearch = (nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) < 0); + forwardSearch = nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) <= 0; // if (graphDirectSegments.size() * 2 > graphReverseSegments.size()) { // forwardSearch = false; // } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) { @@ -165,8 +165,14 @@ public class BinaryRoutePlanner { throw new InterruptedException("Route calculation interrupted"); } } - ctx.visitedSegments = visitedDirectSegments.size() + visitedOppositeSegments.size(); - printDebugMemoryInformation(ctx, graphDirectSegments, graphReverseSegments, visitedDirectSegments, visitedOppositeSegments); + if (ctx.calculationProgress != null) { + ctx.calculationProgress.visitedDirectSegments += visitedDirectSegments.size(); + ctx.calculationProgress.visitedOppositeSegments += visitedOppositeSegments.size(); + ctx.calculationProgress.directQueueSize += graphDirectSegments.size(); // Math.max(ctx.directQueueSize, + // graphDirectSegments.size()); + ctx.calculationProgress.oppositeQueueSize += graphReverseSegments.size(); + ctx.calculationProgress.visitedOppositeSegments += visitedOppositeSegments.size(); + } return finalSegment; } @@ -367,23 +373,21 @@ public class BinaryRoutePlanner { log.warn(logMsg); } - public void printDebugMemoryInformation(RoutingContext ctx, PriorityQueue graphDirectSegments, PriorityQueue graphReverseSegments, - TLongObjectHashMap visitedDirectSegments,TLongObjectHashMap visitedOppositeSegments) { - printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to calc dev: %.2f, to calc rules: %.2f ", - (System.nanoTime() - ctx.timeToCalculate) / 1e6, ctx.timeToLoad / 1e6, - ctx.timeToLoadHeaders / 1e6, ctx.timeNanoToCalcDeviation / 1e6, GeneralRouter.TIMER / 1e6)); - GeneralRouter.TIMER = 0; - int maxLoadedTiles = Math.max(ctx.maxLoadedTiles, ctx.getCurrentlyLoadedTiles()); - printInfo("Current loaded tiles : " + ctx.getCurrentlyLoadedTiles() + ", maximum loaded tiles " + maxLoadedTiles); - printInfo("Loaded tiles " + ctx.loadedTiles + " (distinct " + ctx.distinctLoadedTiles + "), unloaded tiles " + ctx.unloadedTiles + - ", loaded more than once same tiles " - + ctx.loadedPrevUnloadedTiles); - printInfo("Visited segments " + ctx.visitedSegments + ", relaxed roads " + ctx.relaxedSegments); - if (graphDirectSegments != null && graphReverseSegments != null) { - printInfo("Priority queues sizes : " + graphDirectSegments.size() + "/" + graphReverseSegments.size()); - } - if (visitedDirectSegments != null && visitedOppositeSegments != null) { - printInfo("Visited interval sizes: " + visitedDirectSegments.size() + "/" + visitedOppositeSegments.size()); + public static void printDebugMemoryInformation(RoutingContext ctx) { + if (ctx.calculationProgress != null) { + RouteCalculationProgress p = ctx.calculationProgress; + printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to find start/end: %.2f, extra: %.2f ", + p.timeToCalculate / 1e6, p.timeToLoad / 1e6, p.timeToLoadHeaders / 1e6, + p.timeToFindInitialSegments / 1e6, p.timeNanoToCalcDeviation / 1e6)); + // GeneralRouter.TIMER = 0; + int maxLoadedTiles = Math.max(p.maxLoadedTiles, ctx.getCurrentlyLoadedTiles()); + printInfo("Current loaded tiles : " + ctx.getCurrentlyLoadedTiles() + ", maximum loaded tiles " + + maxLoadedTiles); + printInfo("Loaded tiles " + p.loadedTiles + " (distinct " + p.distinctLoadedTiles + "), unloaded tiles " + + p.unloadedTiles + ", loaded more than once same tiles " + p.loadedPrevUnloadedTiles); + printInfo("Visited segments: " + ctx.getVisitedSegments() + ", relaxed roads " + p.relaxedSegments); + printInfo("Priority queues sizes : " + p.directQueueSize + "/" + p.oppositeQueueSize); + printInfo("Visited interval sizes: " + p.visitedDirectSegments + "/" + p.visitedOppositeSegments); } } @@ -441,7 +445,8 @@ public class BinaryRoutePlanner { segmentDist += squareRootDist(x, y, prevx, prevy); // 2.1 calculate possible obstacle plus time - double obstacle = ctx.getRouter().defineRoutingObstacle(road, segmentPoint); + + double obstacle = ctx.getRouter().defineRoutingObstacle(road, segmentPoint, (dir && !reverseWaySearch)); if (obstacle < 0) { directionAllowed = false; continue; @@ -798,41 +803,40 @@ public class BinaryRoutePlanner { " distToEnd=" + distanceToEnd + " segmentPoint=" + segmentPoint + " -- ", next, true); } - if (!visitedSegments.containsKey(calculateRoutePointId(next, next.isPositive()))) { - if (next.getParentRoute() == null - || ctx.roadPriorityComparator(next.distanceFromStart, next.distanceToEnd, - distFromStart, distanceToEnd) > 0) { - next.distanceFromStart = distFromStart; - next.distanceToEnd = distanceToEnd; - if (TRACE_ROUTING) { - printRoad(" "+segmentPoint+">>" , next, null); - } - // put additional information to recover whole route after - next.setParentRoute(segment); - next.setParentSegmentEnd(segmentPoint); - graphSegments.add(next); - } - } else { + RouteSegment visIt = visitedSegments.get(calculateRoutePointId(next, next.isPositive())); + boolean toAdd = true; + if (visIt != null) { // the segment was already visited! We need to follow better route if it exists - // that is very exceptional situation and almost exception, it can happen + // that is very exceptional situation and almost exception, it can happen // 1. when we underestimate distnceToEnd - wrong h() - // 2. because we process not small segments but the whole road, it could be that + // 2. because we process not small segments but the whole road, it could be that // deviation from the road is faster than following the whole road itself! - if (distFromStart < next.distanceFromStart) { + if (TRACE_ROUTING) { + printRoad(">?", visitedSegments.get(calculateRoutePointId(next, next.isPositive())), + next.isPositive()); + } + if (distFromStart < visIt.distanceFromStart && next.getParentRoute() == null) { + toAdd = true; if (ctx.config.heuristicCoefficient <= 1) { System.err.println("! Alert distance from start " + distFromStart + " < " - + next.distanceFromStart + " id=" + next.road.id); - } - // A: we can't change parent route just here, because we need to update visitedSegments - // presumably we can do visitedSegments.put(calculateRoutePointId(next), next); -// next.distanceFromStart = distFromStart; -// next.setParentRoute(segment); -// next.setParentSegmentEnd(segmentPoint); - if (ctx.visitor != null) { - // ctx.visitor.visitSegment(next, false); + + visIt.distanceFromStart + " id=" + next.road.id); } + } else { + toAdd = false; } } + if (toAdd && (next.getParentRoute() == null || ctx.roadPriorityComparator(next.distanceFromStart, + next.distanceToEnd, distFromStart, distanceToEnd) > 0)) { + next.distanceFromStart = distFromStart; + next.distanceToEnd = distanceToEnd; + if (TRACE_ROUTING) { + printRoad(" " + segmentPoint + ">>", next, null); + } + // put additional information to recover whole route after + next.setParentRoute(segment); + next.setParentSegmentEnd(segmentPoint); + graphSegments.add(next); + } } } @@ -851,15 +855,36 @@ public class BinaryRoutePlanner { } public static class RouteSegmentPoint extends RouteSegment { + public RouteSegmentPoint(RouteDataObject road, int segmentStart, double distSquare) { super(road, segmentStart); this.distSquare = distSquare; + this.preciseX = road.getPoint31XTile(segmentStart); + this.preciseY = road.getPoint31YTile(segmentStart); + } + + public RouteSegmentPoint(RouteSegmentPoint pnt) { + super(pnt.road, pnt.segStart); + this.distSquare = pnt.distSquare; + this.preciseX = pnt.preciseX; + this.preciseY = pnt.preciseY; } public double distSquare; public int preciseX; public int preciseY; public List others; + + public LatLon getPreciseLatLon() { + return new LatLon(MapUtils.get31LatitudeY(preciseY), MapUtils.get31LongitudeX(preciseX)); + + } + + @Override + public String toString() { + return String.format("%d (%s): %s", segStart, getPreciseLatLon(), road); + } + } public static class RouteSegment { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java b/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java index b3f2660646..537e3a5f74 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import gnu.trove.list.array.TIntArrayList; import gnu.trove.set.hash.TLongHashSet; public class GeneralRouter implements VehicleRouter { @@ -40,13 +41,14 @@ public class GeneralRouter implements VehicleRouter { public static final String VEHICLE_HEIGHT = "height"; public static final String VEHICLE_WEIGHT = "weight"; public static final String VEHICLE_WIDTH = "width"; - + public static final String VEHICLE_LENGTH = "length"; + private static boolean USE_CACHE = true; public static long TIMER = 0; private final RouteAttributeContext[] objectAttributes; public final Map attributes; - private final Map parameters; + private final Map parameters; private final Map universalRules; private final List universalRulesById; private final Map tagRuleMask; @@ -70,6 +72,8 @@ public class GeneralRouter implements VehicleRouter { private float defaultSpeed = 1f; // speed in m/s private float maxSpeed = 10f; + // speed in m/s (used for shortest route) + private float maxVehicleSpeed; private TLongHashSet impassableRoads; private GeneralRouterProfile profile; @@ -147,6 +151,7 @@ public class GeneralRouter implements VehicleRouter { if (params.containsKey(MAX_SPEED)) { maxSpeed = parseSilentFloat(params.get(MAX_SPEED), maxSpeed); } + maxVehicleSpeed = maxSpeed; if (shortestRoute) { maxSpeed = Math.min(CAR_SHORTEST_DEFAULT_SPEED, maxSpeed); } @@ -353,33 +358,71 @@ public class GeneralRouter implements VehicleRouter { } @Override - public float defineObstacle(RouteDataObject road, int point) { + public float defineObstacle(RouteDataObject road, int point, boolean dir) { int[] pointTypes = road.getPointTypes(point); if(pointTypes != null) { - Float obst = getCache(RouteDataObjectAttribute.OBSTACLES, road.region, pointTypes); + Float obst = getCache(RouteDataObjectAttribute.OBSTACLES, road.region, pointTypes, dir); if(obst == null) { - obst = getObjContext(RouteDataObjectAttribute.OBSTACLES).evaluateFloat(road.region, pointTypes, 0); - putCache(RouteDataObjectAttribute.OBSTACLES, road.region, pointTypes, obst); + int[] filteredPointTypes = filterDirectionTags(road, pointTypes, dir); + obst = getObjContext(RouteDataObjectAttribute.OBSTACLES).evaluateFloat(road.region, filteredPointTypes, 0); + putCache(RouteDataObjectAttribute.OBSTACLES, road.region, pointTypes, obst, dir); } return obst; } return 0; } + TIntArrayList filteredRules = new TIntArrayList(); + @Override - public float defineRoutingObstacle(RouteDataObject road, int point) { + public float defineRoutingObstacle(RouteDataObject road, int point, boolean dir) { int[] pointTypes = road.getPointTypes(point); - if(pointTypes != null){ - Float obst = getCache(RouteDataObjectAttribute.ROUTING_OBSTACLES, road.region, pointTypes); - if(obst == null) { - obst = getObjContext(RouteDataObjectAttribute.ROUTING_OBSTACLES).evaluateFloat(road.region, pointTypes, 0); - putCache(RouteDataObjectAttribute.ROUTING_OBSTACLES, road.region, pointTypes, obst); + if(pointTypes != null) { + Float obst = getCache(RouteDataObjectAttribute.ROUTING_OBSTACLES, road.region, pointTypes, dir); + if(obst == null) { + int[] filteredPointTypes = filterDirectionTags(road, pointTypes, dir); + obst = getObjContext(RouteDataObjectAttribute.ROUTING_OBSTACLES).evaluateFloat(road.region, filteredPointTypes, 0); + putCache(RouteDataObjectAttribute.ROUTING_OBSTACLES, road.region, pointTypes, obst, dir); } return obst; } return 0; } + private int[] filterDirectionTags(RouteDataObject road, int[] pointTypes, boolean dir) { + int wayOppositeDirection = dir ? -1 : 1; + int direction = 0; + int tdirection = 0; + for (int i = 0; i < pointTypes.length; i++) { + if (pointTypes[i] == road.region.directionBackward) { + direction = -1; + } else if(pointTypes[i] == road.region.directionForward) { + direction = 1; + } else if (pointTypes[i] == road.region.directionTrafficSignalsBackward) { + tdirection = -1; + } else if(pointTypes[i] == road.region.directionTrafficSignalsForward) { + tdirection = 1; + } + } + if (direction != 0 || tdirection != 0) { + TIntArrayList filteredRules = new TIntArrayList(); + for (int i = 0; i < pointTypes.length; i++) { + boolean skip = false; + if ((pointTypes[i] == road.region.stopSign || pointTypes[i] == road.region.giveWaySign) + && direction == wayOppositeDirection) { + skip = true; + } else if (pointTypes[i] == road.region.trafficSignals && tdirection == wayOppositeDirection) { + skip = true; + } + if (!skip) { + filteredRules.add(pointTypes[i]); + } + } + return filteredRules.toArray(); + } + return pointTypes; + } + @Override public double defineHeightObstacle(RouteDataObject road, short startIndex, short endIndex) { if(!heightObstacles) { @@ -449,10 +492,15 @@ public class GeneralRouter implements VehicleRouter { @Override public float defineVehicleSpeed(RouteDataObject road) { + // don't use cache cause max/min is different for routing speed + if (maxVehicleSpeed != maxSpeed) { + float spd = getObjContext(RouteDataObjectAttribute.ROAD_SPEED).evaluateFloat(road, defaultSpeed); + return Math.max(Math.min(spd, maxVehicleSpeed), minSpeed); + } Float sp = getCache(RouteDataObjectAttribute.ROAD_SPEED, road); if (sp == null) { float spd = getObjContext(RouteDataObjectAttribute.ROAD_SPEED).evaluateFloat(road, defaultSpeed); - sp = Math.max(Math.min(spd, maxSpeed), minSpeed); + sp = Math.max(Math.min(spd, maxVehicleSpeed), minSpeed); putCache(RouteDataObjectAttribute.ROAD_SPEED, road, sp); } return sp; @@ -463,16 +511,21 @@ public class GeneralRouter implements VehicleRouter { Float sp = getCache(RouteDataObjectAttribute.ROAD_PRIORITIES, road); if(sp == null) { sp = getObjContext(RouteDataObjectAttribute.ROAD_PRIORITIES).evaluateFloat(road, 1f); - putCache(RouteDataObjectAttribute.ROAD_PRIORITIES, road, sp); + putCache(RouteDataObjectAttribute.ROAD_PRIORITIES, road, sp, false); } return sp; } private void putCache(RouteDataObjectAttribute attr, RouteDataObject road, Float val) { - putCache(attr, road.region, road.types, val); + putCache(attr, road.region, road.types, val, false); } - private void putCache(RouteDataObjectAttribute attr, RouteRegion reg, int[] types, Float val) { + private void putCache(RouteDataObjectAttribute attr, RouteDataObject road, Float val, boolean extra) { + putCache(attr, road.region, road.types, val, extra); + } + + private void putCache(RouteDataObjectAttribute attr, RouteRegion reg, int[] types, Float val, boolean extra) { +// TIMER -= System.nanoTime(); Map> ch = evalCache[attr.ordinal()]; if (USE_CACHE) { Map rM = ch.get(reg); @@ -480,40 +533,56 @@ public class GeneralRouter implements VehicleRouter { rM = new HashMap(); ch.put(reg, rM); } - rM.put(new IntHolder(types), val); + rM.put(new IntHolder(types, extra), val); } - TIMER += System.nanoTime(); +// TIMER += System.nanoTime(); } class IntHolder { - private final int[] array; - IntHolder(int[] ts) { array = ts; } - @Override public int hashCode() { return Arrays.hashCode(array); } - @Override public boolean equals(Object other) { - if (array == other) { return true; } - if (! (other instanceof IntHolder) ) { - return false; - } - //noinspection unchecked - return Arrays.equals(array, ((IntHolder) other).array); - } + private final int[] array; + private final boolean extra; + + IntHolder(int[] ts, boolean extra) { + array = ts; + this.extra = extra; + } + + @Override + public int hashCode() { + return Arrays.hashCode(array) + (extra ? 1 : 0); + } + + @Override + public boolean equals(Object other) { + if (array == other) { + return true; + } + if (!(other instanceof IntHolder)) { + return false; + } + if (((IntHolder) other).extra != this.extra) { + return false; + } + // noinspection unchecked + return Arrays.equals(array, ((IntHolder) other).array); + } } private Float getCache(RouteDataObjectAttribute attr, RouteDataObject road) { - return getCache(attr, road.region, road.types); + return getCache(attr, road.region, road.types, false); } - private Float getCache(RouteDataObjectAttribute attr, RouteRegion reg, int[] types) { + private Float getCache(RouteDataObjectAttribute attr, RouteRegion reg, int[] types, boolean extra) { Map> ch = evalCache[attr.ordinal()]; - TIMER -= System.nanoTime(); +// TIMER -= System.nanoTime(); if (USE_CACHE) { Map rM = ch.get(reg); if (rM == null) { return null; } - Float vl = rM.get(new IntHolder(types)); + Float vl = rM.get(new IntHolder(types, extra)); if(vl != null) { - TIMER += System.nanoTime(); +// TIMER += System.nanoTime(); return vl; } } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java index b34c2fd5bb..2e6db09022 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java @@ -12,12 +12,29 @@ public class RouteCalculationProgress { public float totalEstimatedDistance = 0; public float routingCalculatedTime = 0; - public int loadedTiles = 0; + + public int relaxedSegments = 0; public int visitedSegments = 0; + public int visitedDirectSegments = 0; + public int visitedOppositeSegments = 0; + public int directQueueSize = 0; + public int oppositeQueueSize = 0; public int totalIterations = 1; public int iteration = -1; + public long timeNanoToCalcDeviation = 0; + public long timeToLoad = 0; + public long timeToLoadHeaders = 0; + public long timeToFindInitialSegments = 0; + public long timeToCalculate = 0; + + public int distinctLoadedTiles = 0; + public int maxLoadedTiles = 0; + public int loadedPrevUnloadedTiles = 0; + public int unloadedTiles = 0; + public int loadedTiles = 0; + public boolean isCancelled; public boolean requestPrivateAccessRouting; @@ -32,14 +49,16 @@ public class RouteCalculationProgress { pr = Math.min(p * p / (all * all), 1); } float progress = INITIAL_PROGRESS; - if (totalIterations > 1) { + if (totalIterations <= 1) { + progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS); + } else if (totalIterations <= 2) { if (iteration < 1) { progress = pr * FIRST_ITERATION + INITIAL_PROGRESS; } else { progress = (INITIAL_PROGRESS + FIRST_ITERATION) + pr * (1 - FIRST_ITERATION - INITIAL_PROGRESS); } } else { - progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS); + progress = (float) ((iteration + Math.min(pr, 0.7)) / totalIterations); } return Math.min(progress * 100f, 99); } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteExporter.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteExporter.java index 2146bfe0f8..7ae47d4098 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteExporter.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteExporter.java @@ -1,7 +1,8 @@ package net.osmand.router; -import net.osmand.GPXUtilities.GPXExtensionsWriter; import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.RouteSegment; +import net.osmand.GPXUtilities.RouteType; import net.osmand.GPXUtilities.Track; import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.WptPt; @@ -9,12 +10,8 @@ import net.osmand.Location; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import net.osmand.binary.RouteDataBundle; import net.osmand.binary.StringBundle; -import net.osmand.binary.StringBundleWriter; -import net.osmand.binary.StringBundleXmlWriter; import net.osmand.util.Algorithms; -import org.xmlpull.v1.XmlSerializer; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,8 +34,7 @@ public class RouteExporter { public GPXFile exportRoute() { RouteDataResources resources = new RouteDataResources(locations); - final RouteDataBundle bundle = new RouteDataBundle(resources); - + List routeItems = new ArrayList<>(); if (!Algorithms.isEmpty(route)) { for (RouteSegmentResult sr : route) { sr.collectTypes(resources); @@ -47,15 +43,12 @@ public class RouteExporter { sr.collectNames(resources); } - List routeItems = new ArrayList<>(); for (RouteSegmentResult sr : route) { RouteDataBundle itemBundle = new RouteDataBundle(resources); sr.writeToBundle(itemBundle); routeItems.add(itemBundle); } - bundle.putBundleList("route", "segment", routeItems); } - List typeList = new ArrayList<>(); Map rules = resources.getRules(); for (RouteTypeRule rule : rules.keySet()) { @@ -63,7 +56,6 @@ public class RouteExporter { rule.writeToBundle(typeBundle); typeList.add(typeBundle); } - bundle.putBundleList("types", "type", typeList); GPXFile gpx = new GPXFile(OSMAND_ROUTER_V2); Track track = new Track(); @@ -75,7 +67,6 @@ public class RouteExporter { if (locations == null || locations.isEmpty()) { return gpx; } - for (int i = 0; i < locations.size(); i++) { Location loc = locations.get(i); WptPt pt = new WptPt(); @@ -92,21 +83,22 @@ public class RouteExporter { } trkSegment.points.add(pt); } - if (points != null) { for (WptPt pt : points) { gpx.addPoint(pt); } } - GPXExtensionsWriter extensionsWriter = new GPXExtensionsWriter() { - @Override - public void writeExtensions(XmlSerializer serializer) { - StringBundleWriter bundleWriter = new StringBundleXmlWriter(bundle, serializer); - bundleWriter.writeBundle(); - } - }; - gpx.setExtensionsWriter(extensionsWriter); + List routeSegments = new ArrayList<>(); + for (StringBundle item : routeItems) { + routeSegments.add(RouteSegment.fromStringBundle(item)); + } + gpx.routeSegments = routeSegments; + List routeTypes = new ArrayList<>(); + for (StringBundle item : typeList) { + routeTypes.add(RouteType.fromStringBundle(item)); + } + gpx.routeTypes = routeTypes; return gpx; } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteImporter.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteImporter.java index db6e14a31f..e2be849dcb 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteImporter.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteImporter.java @@ -1,8 +1,9 @@ package net.osmand.router; import net.osmand.GPXUtilities; -import net.osmand.GPXUtilities.GPXExtensionsReader; import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.RouteSegment; +import net.osmand.GPXUtilities.RouteType; import net.osmand.GPXUtilities.WptPt; import net.osmand.Location; import net.osmand.PlatformUtil; @@ -10,11 +11,8 @@ import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; import net.osmand.binary.RouteDataBundle; import net.osmand.binary.RouteDataObject; import net.osmand.binary.StringBundle; -import net.osmand.binary.StringBundleReader; -import net.osmand.binary.StringBundleXmlReader; import org.apache.commons.logging.Log; -import org.xmlpull.v1.XmlPullParser; import java.io.File; import java.io.FileInputStream; @@ -31,6 +29,10 @@ public class RouteImporter { private File file; private GPXFile gpxFile; + private List route = new ArrayList<>(); + private RouteRegion region = new RouteRegion(); + private RouteDataResources resources = new RouteDataResources(); + public RouteImporter(File file) { this.file = file; } @@ -40,90 +42,14 @@ public class RouteImporter { } public List importRoute() { - - final List route = new ArrayList<>(); - final RouteRegion region = new RouteRegion(); - final RouteDataResources resources = new RouteDataResources(); - - GPXExtensionsReader extensionsReader = new GPXExtensionsReader() { - @Override - public boolean readExtensions(GPXFile res, XmlPullParser parser) throws Exception { - if (!resources.hasLocations()) { - List locations = resources.getLocations(); - double lastElevation = HEIGHT_UNDEFINED; - if (res.tracks.size() > 0 && res.tracks.get(0).segments.size() > 0 && res.tracks.get(0).segments.get(0).points.size() > 0) { - for (WptPt point : res.tracks.get(0).segments.get(0).points) { - Location loc = new Location("", point.getLatitude(), point.getLongitude()); - if (!Double.isNaN(point.ele)) { - loc.setAltitude(point.ele); - lastElevation = point.ele; - } else if (lastElevation != HEIGHT_UNDEFINED) { - loc.setAltitude(lastElevation); - } - locations.add(loc); - } - } - } - String tag = parser.getName(); - if ("route".equals(tag)) { - int tok; - while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { - if (tok == XmlPullParser.START_TAG) { - tag = parser.getName(); - if ("segment".equals(tag)) { - StringBundleReader bundleReader = new StringBundleXmlReader(parser); - RouteDataObject object = new RouteDataObject(region); - RouteSegmentResult segment = new RouteSegmentResult(object); - bundleReader.readBundle(); - segment.readFromBundle(new RouteDataBundle(resources, bundleReader.getBundle())); - route.add(segment); - } - } else if (tok == XmlPullParser.END_TAG) { - tag = parser.getName(); - if ("route".equals(tag)) { - return true; - } - } - } - } else if ("types".equals(tag)) { - int tok; - int i = 0; - while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { - if (tok == XmlPullParser.START_TAG) { - tag = parser.getName(); - if ("type".equals(tag)) { - StringBundleReader bundleReader = new StringBundleXmlReader(parser); - bundleReader.readBundle(); - StringBundle bundle = bundleReader.getBundle(); - String t = bundle.getString("t", null); - String v = bundle.getString("v", null); - region.initRouteEncodingRule(i++, t, v); - } - } else if (tok == XmlPullParser.END_TAG) { - tag = parser.getName(); - if ("types".equals(tag)) { - return true; - } - } - } - } - return false; - } - }; - if (gpxFile != null) { - GPXUtilities.loadGPXFile(null, gpxFile, extensionsReader); - for (RouteSegmentResult segment : route) { - segment.fillNames(resources); - } + parseRoute(); } else if (file != null) { FileInputStream fis = null; try { fis = new FileInputStream(file); - GPXFile gpxFile = GPXUtilities.loadGPXFile(fis, null, extensionsReader); - for (RouteSegmentResult segment : route) { - segment.fillNames(resources); - } + gpxFile = GPXUtilities.loadGPXFile(fis); + parseRoute(); gpxFile.path = file.getAbsolutePath(); gpxFile.modifiedTime = file.lastModified(); } catch (IOException e) { @@ -139,7 +65,51 @@ public class RouteImporter { } } } - return route; } + + private void parseRoute() { + collectLocations(); + collectSegments(); + collectTypes(); + for (RouteSegmentResult segment : route) { + segment.fillNames(resources); + } + } + + private void collectLocations() { + List locations = resources.getLocations(); + double lastElevation = HEIGHT_UNDEFINED; + if (gpxFile.tracks.size() > 0 && gpxFile.tracks.get(0).segments.size() > 0 && gpxFile.tracks.get(0).segments.get(0).points.size() > 0) { + for (WptPt point : gpxFile.tracks.get(0).segments.get(0).points) { + Location loc = new Location("", point.getLatitude(), point.getLongitude()); + if (!Double.isNaN(point.ele)) { + loc.setAltitude(point.ele); + lastElevation = point.ele; + } else if (lastElevation != HEIGHT_UNDEFINED) { + loc.setAltitude(lastElevation); + } + locations.add(loc); + } + } + } + + private void collectSegments() { + for (RouteSegment segment : gpxFile.routeSegments) { + RouteDataObject object = new RouteDataObject(region); + RouteSegmentResult segmentResult = new RouteSegmentResult(object); + segmentResult.readFromBundle(new RouteDataBundle(resources, segment.toStringBundle())); + route.add(segmentResult); + } + } + + private void collectTypes() { + int i = 0; + for (RouteType routeType : gpxFile.routeTypes) { + StringBundle bundle = routeType.toStringBundle(); + String t = bundle.getString("t", null); + String v = bundle.getString("v", null); + region.initRouteEncodingRule(i++, t, v); + } + } } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java index 66d5d009ad..bff7db3a6d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java @@ -1,16 +1,10 @@ package net.osmand.router; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; - +import net.osmand.LocationsHolder; import net.osmand.NativeLibrary; import net.osmand.PlatformUtil; +import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapRouteReaderAdapter; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; @@ -23,6 +17,16 @@ import net.osmand.util.MapUtils; import org.apache.commons.logging.Log; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; + +import gnu.trove.list.array.TIntArrayList; + public class RoutePlannerFrontEnd { protected static final Log log = PlatformUtil.getLog(RoutePlannerFrontEnd.class); @@ -39,6 +43,77 @@ public class RoutePlannerFrontEnd { NORMAL, COMPLEX } + + public static class GpxRouteApproximation { + // ! MAIN parameter to approximate (35m good for custom recorded tracks) + public double MINIMUM_POINT_APPROXIMATION = 50; // 35 m good for small deviations + // This parameter could speed up or slow down evaluation (better to make bigger for long routes and smaller for short) + public double MAXIMUM_STEP_APPROXIMATION = 3000; + // don't search subsegments shorter than specified distance (also used to step back for car turns) + public double MINIMUM_STEP_APPROXIMATION = 100; + // Parameter to smoother the track itself (could be 0 if it's not recorded track) + public double SMOOTHEN_POINTS_NO_ROUTE = 5; + + public final RoutingContext ctx; + public int routeCalculations = 0; + public int routePointsSearched = 0; + public int routeDistCalculations = 0; + public List finalPoints = new ArrayList(); + public List result = new ArrayList(); + public int routeDistance; + public int routeGapDistance; + public int routeDistanceUnmatched; + + + public GpxRouteApproximation(RoutingContext ctx) { + this.ctx = ctx; + } + + public GpxRouteApproximation(GpxRouteApproximation gctx) { + this.ctx = gctx.ctx; + this.routeDistance = gctx.routeDistance; + } + + @Override + public String toString() { + return String.format(">> GPX approximation (%d of %d m route calcs, %d route points searched) for %d m: %d m umatched", + routeCalculations, routeDistCalculations, routePointsSearched, routeDistance, routeDistanceUnmatched); + } + + public double distFromLastPoint(LatLon startPoint) { + if (result.size() > 0) { + return MapUtils.getDistance(getLastPoint(), startPoint); + } + return 0; + } + + public LatLon getLastPoint() { + if (result.size() > 0) { + return result.get(result.size() - 1).getEndPoint(); + } + return null; + } + } + + public static class GpxPoint { + public int ind; + public LatLon loc; + public double cumDist; + public RouteSegmentPoint pnt; + public List routeToTarget; + public List stepBackRoute; + public int targetInd = -1; + public boolean straightLine = false; + + public GpxPoint() { + } + + public GpxPoint(GpxPoint point) { + this.ind = point.ind; + this.loc = point.loc; + this.cumDist = point.cumDist; + } + } public RoutingContext buildRoutingContext(RoutingConfiguration config, NativeLibrary nativeLibrary, BinaryMapIndexReader[] map, RouteCalculationMode rm) { return new RoutingContext(config, nativeLibrary, map, rm); @@ -61,15 +136,21 @@ public class RoutePlannerFrontEnd { } public RouteSegmentPoint findRouteSegment(double lat, double lon, RoutingContext ctx, List list, boolean transportStop) throws IOException { + return findRouteSegment(lat, lon, ctx, list, false, false); + } + + public RouteSegmentPoint findRouteSegment(double lat, double lon, RoutingContext ctx, List list, boolean transportStop, + boolean allowDuplications) throws IOException { + long now = System.nanoTime(); int px = MapUtils.get31TileNumberX(lon); int py = MapUtils.get31TileNumberY(lat); ArrayList dataObjects = new ArrayList(); - ctx.loadTileData(px, py, 17, dataObjects); + ctx.loadTileData(px, py, 17, dataObjects, allowDuplications); if (dataObjects.isEmpty()) { - ctx.loadTileData(px, py, 15, dataObjects); + ctx.loadTileData(px, py, 15, dataObjects, allowDuplications); } if (dataObjects.isEmpty()) { - ctx.loadTileData(px, py, 14, dataObjects); + ctx.loadTileData(px, py, 14, dataObjects, allowDuplications); } if (list == null) { list = new ArrayList(); @@ -91,7 +172,7 @@ public class RoutePlannerFrontEnd { } if (road != null) { if(!transportStop) { - float prio = ctx.getRouter().defineSpeedPriority(road.road); + float prio = Math.max(ctx.getRouter().defineSpeedPriority(road.road), 0.3f); if (prio > 0) { road.distSquare = (road.distSquare + GPS_POSSIBLE_ERROR * GPS_POSSIBLE_ERROR) / (prio * prio); @@ -111,6 +192,9 @@ public class RoutePlannerFrontEnd { return Double.compare(o1.distSquare, o2.distSquare); } }); + if (ctx.calculationProgress != null) { + ctx.calculationProgress.timeToFindInitialSegments += (System.nanoTime() - now); + } if (list.size() > 0) { RouteSegmentPoint ps = null; if (ctx.publicTransport) { @@ -138,7 +222,6 @@ public class RoutePlannerFrontEnd { return null; } - public List searchRoute(final RoutingContext ctx, LatLon start, LatLon end, List intermediates) throws IOException, InterruptedException { return searchRoute(ctx, start, end, intermediates, null); } @@ -147,6 +230,419 @@ public class RoutePlannerFrontEnd { useSmartRouteRecalculation = use; } + public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List gpxPoints, ResultMatcher resultMatcher) throws IOException, InterruptedException { + long timeToCalculate = System.nanoTime(); + gctx.ctx.keepNativeRoutingContext = true; + if (gctx.ctx.calculationProgress == null) { + gctx.ctx.calculationProgress = new RouteCalculationProgress(); + } + GpxPoint start = null; + GpxPoint prev = null; + if (gpxPoints.size() > 0) { + gctx.ctx.calculationProgress.totalIterations = (int) (gpxPoints.get(gpxPoints.size() - 1).cumDist / gctx.MAXIMUM_STEP_APPROXIMATION + 1); + start = gpxPoints.get(0); + } + while (start != null && !gctx.ctx.calculationProgress.isCancelled) { + if (Thread.currentThread().isInterrupted()) { + return null; + } + double routeDist = gctx.MAXIMUM_STEP_APPROXIMATION; + GpxPoint next = findNextGpxPointWithin(gctx, gpxPoints, start, routeDist); + boolean routeFound = false; + if (next != null && initRoutingPoint(start, gctx, gctx.MINIMUM_POINT_APPROXIMATION)) { + gctx.ctx.calculationProgress.totalEstimatedDistance = 0; + gctx.ctx.calculationProgress.iteration = (int) (next.cumDist / gctx.MAXIMUM_STEP_APPROXIMATION); + while (routeDist >= gctx.MINIMUM_STEP_APPROXIMATION && !routeFound) { + routeFound = initRoutingPoint(next, gctx, gctx.MINIMUM_POINT_APPROXIMATION); + if (routeFound) { + routeFound = findGpxRouteSegment(gctx, gpxPoints, start, next, prev != null); + if (routeFound) { + // route is found - cut the end of the route and move to next iteration +// start.stepBackRoute = new ArrayList(); +// boolean stepBack = true; + boolean stepBack = stepBackAndFindPrevPointInRoute(gctx, gpxPoints, start, next); + if (!stepBack) { + // not supported case (workaround increase MAXIMUM_STEP_APPROXIMATION) + log.info("Consider to increase MAXIMUM_STEP_APPROXIMATION to: " + routeDist * 2); + start.routeToTarget = null; + routeFound = false; + break; + } + } + } + if (!routeFound) { + // route is not found move next point closer to start point (distance / 2) + routeDist = routeDist / 2; + if (routeDist < gctx.MINIMUM_STEP_APPROXIMATION && routeDist > gctx.MINIMUM_STEP_APPROXIMATION / 2 + 1) { + routeDist = gctx.MINIMUM_STEP_APPROXIMATION; + } + next = findNextGpxPointWithin(gctx, gpxPoints, start, routeDist); + if (next != null) { + routeDist = Math.min(next.cumDist - start.cumDist, routeDist); + } + } + } + } + // route is not found skip segment and keep it as straight line on display + if (!routeFound) { + // route is not found, move start point by + next = findNextGpxPointWithin(gctx, gpxPoints, start, gctx.MINIMUM_STEP_APPROXIMATION); + if (prev != null) { + prev.routeToTarget.addAll(prev.stepBackRoute); + makeSegmentPointPrecise(prev.routeToTarget.get(prev.routeToTarget.size() - 1), start.loc, false); + if (next != null) { + log.warn("NOT found route from: " + start.pnt.getRoad() + " at " + start.pnt.getSegmentStart()); + } + } + prev = null; + } else { + prev = start; + } + start = next; + } + if (gctx.ctx.calculationProgress != null) { + gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate; + } + gctx.ctx.deleteNativeRoutingContext(); + BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx); + calculateGpxRoute(gctx, gpxPoints); + if (!gctx.result.isEmpty() && !gctx.ctx.calculationProgress.isCancelled) { + new RouteResultPreparation().printResults(gctx.ctx, gpxPoints.get(0).loc, gpxPoints.get(gpxPoints.size() - 1).loc, gctx.result); + System.out.println(gctx); + } + if (resultMatcher != null) { + resultMatcher.publish(gctx.ctx.calculationProgress.isCancelled ? null : gctx); + } + return gctx; + } + + private boolean stepBackAndFindPrevPointInRoute(GpxRouteApproximation gctx, + List gpxPoints, GpxPoint start, GpxPoint next) throws IOException { + // step back to find to be sure + // 1) route point is behind GpxPoint - MINIMUM_POINT_APPROXIMATION (end route point could slightly ahead) + // 2) we don't miss correct turn i.e. points could be attached to muliple routes + // 3) to make sure that we perfectly connect to RoadDataObject points + double STEP_BACK_DIST = Math.max(gctx.MINIMUM_POINT_APPROXIMATION, gctx.MINIMUM_STEP_APPROXIMATION); + double d = 0; + int segmendInd = start.routeToTarget.size() - 1; + boolean search = true; + start.stepBackRoute = new ArrayList(); + mainLoop: for (; segmendInd >= 0 && search; segmendInd--) { + RouteSegmentResult rr = start.routeToTarget.get(segmendInd); + boolean minus = rr.getStartPointIndex() < rr.getEndPointIndex(); + int nextInd; + for (int j = rr.getEndPointIndex(); j != rr.getStartPointIndex(); j = nextInd) { + nextInd = minus ? j - 1 : j + 1; + d += MapUtils.getDistance(rr.getPoint(j), rr.getPoint(nextInd)); + if (d > STEP_BACK_DIST) { + if (nextInd == rr.getStartPointIndex()) { + segmendInd--; + } else { + start.stepBackRoute.add(new RouteSegmentResult(rr.getObject(), nextInd, rr.getEndPointIndex())); + rr.setEndPointIndex(nextInd); + } + search = false; + break mainLoop; + } + } + } + if (segmendInd == -1) { + // here all route segments - 1 is longer than needed distance to step back + return false; + } + + while (start.routeToTarget.size() > segmendInd + 1) { + RouteSegmentResult removed = start.routeToTarget.remove(segmendInd + 1); + start.stepBackRoute.add(removed); + } + RouteSegmentResult res = start.routeToTarget.get(segmendInd); + next.pnt = new RouteSegmentPoint(res.getObject(), res.getEndPointIndex(), 0); + return true; + } + + private void calculateGpxRoute(GpxRouteApproximation gctx, List gpxPoints) { + RouteRegion reg = new RouteRegion(); + reg.initRouteEncodingRule(0, "highway", RouteResultPreparation.UNMATCHED_HIGHWAY_TYPE); + List lastStraightLine = null; + GpxPoint straightPointStart = null; + for (int i = 0; i < gpxPoints.size() && !gctx.ctx.calculationProgress.isCancelled; ) { + GpxPoint pnt = gpxPoints.get(i); + if (pnt.routeToTarget != null && !pnt.routeToTarget.isEmpty()) { + LatLon startPoint = pnt.routeToTarget.get(0).getStartPoint(); + if (lastStraightLine != null) { + lastStraightLine.add(startPoint); + addStraightLine(gctx, lastStraightLine, straightPointStart, reg); + lastStraightLine = null; + } + if (gctx.distFromLastPoint(startPoint) > 1) { + gctx.routeGapDistance += gctx.distFromLastPoint(startPoint); + System.out.println(String.format("????? gap of route point = %f, gap of actual gpxPoint = %f, %s ", + gctx.distFromLastPoint(startPoint), gctx.distFromLastPoint(pnt.loc), pnt.loc)); + } + gctx.finalPoints.add(pnt); + gctx.result.addAll(pnt.routeToTarget); + i = pnt.targetInd; + } else { + // add straight line from i -> i+1 + if (lastStraightLine == null) { + lastStraightLine = new ArrayList(); + straightPointStart = pnt; + // make smooth connection + if (gctx.distFromLastPoint(pnt.loc) > 1) { + lastStraightLine.add(gctx.getLastPoint()); + } + } + lastStraightLine.add(pnt.loc); + i++; + } + } + if (lastStraightLine != null) { + addStraightLine(gctx, lastStraightLine, straightPointStart, reg); + lastStraightLine = null; + } + // clean turns to recaculate them + cleanupResultAndAddTurns(gctx); + } + + public static RouteSegmentResult generateStraightLineSegment(float averageSpeed, List points) { + RouteRegion reg = new RouteRegion(); + reg.initRouteEncodingRule(0, "highway", RouteResultPreparation.UNMATCHED_HIGHWAY_TYPE); + RouteDataObject rdo = new RouteDataObject(reg); + int size = points.size(); + TIntArrayList x = new TIntArrayList(size); + TIntArrayList y = new TIntArrayList(size); + double distance = 0; + double distOnRoadToPass = 0; + LatLon prev = null; + for (int i = 0; i < size; i++) { + LatLon l = points.get(i); + if (l != null) { + x.add(MapUtils.get31TileNumberX(l.getLongitude())); + y.add(MapUtils.get31TileNumberY(l.getLatitude())); + if (prev != null) { + double d = MapUtils.getDistance(l, prev); + distance += d; + distOnRoadToPass += d / averageSpeed; + } + } + prev = l; + } + rdo.pointsX = x.toArray(); + rdo.pointsY = y.toArray(); + rdo.types = new int[] { 0 } ; + rdo.id = -1; + RouteSegmentResult segment = new RouteSegmentResult(rdo, 0, rdo.getPointsLength() - 1); + segment.setSegmentTime((float) distOnRoadToPass); + segment.setSegmentSpeed(averageSpeed); + segment.setDistance((float) distance); + segment.setTurnType(TurnType.straight()); + return segment; + } + + public List generateGpxPoints(GpxRouteApproximation gctx, LocationsHolder locationsHolder) { + List gpxPoints = new ArrayList<>(locationsHolder.getSize()); + GpxPoint prev = null; + for(int i = 0; i < locationsHolder.getSize(); i++) { + GpxPoint p = new GpxPoint(); + p.ind = i; + p.loc = locationsHolder.getLatLon(i); + if (prev != null) { + p.cumDist = MapUtils.getDistance(p.loc, prev.loc) + prev.cumDist; + } + gpxPoints.add(p); + gctx.routeDistance = (int) p.cumDist; + prev = p; + } + return gpxPoints; + } + + private void cleanupResultAndAddTurns(GpxRouteApproximation gctx) { + // cleanup double joints + int LOOK_AHEAD = 4; + for(int i = 0; i < gctx.result.size() && !gctx.ctx.calculationProgress.isCancelled; i++) { + RouteSegmentResult s = gctx.result.get(i); + for(int j = i + 2; j <= i + LOOK_AHEAD && j < gctx.result.size(); j++) { + RouteSegmentResult e = gctx.result.get(j); + if (e.getStartPoint().equals(s.getEndPoint())) { + while ((--j) != i) { + gctx.result.remove(j); + } + break; + } + } + } + RouteResultPreparation preparation = new RouteResultPreparation(); + for (RouteSegmentResult r : gctx.result) { + r.setTurnType(null); + r.setDescription(""); + } + if (!gctx.ctx.calculationProgress.isCancelled) { + preparation.prepareTurnResults(gctx.ctx, gctx.result); + } + } + + private void addStraightLine(GpxRouteApproximation gctx, List lastStraightLine, GpxPoint strPnt, RouteRegion reg) { + RouteDataObject rdo = new RouteDataObject(reg); + if(gctx.SMOOTHEN_POINTS_NO_ROUTE > 0) { + simplifyDouglasPeucker(lastStraightLine, gctx.SMOOTHEN_POINTS_NO_ROUTE, 0, lastStraightLine.size() - 1); + } + int s = lastStraightLine.size(); + TIntArrayList x = new TIntArrayList(s); + TIntArrayList y = new TIntArrayList(s); + for (int i = 0; i < s; i++) { + if(lastStraightLine.get(i) != null) { + LatLon l = lastStraightLine.get(i); + int t = x.size() - 1; + x.add(MapUtils.get31TileNumberX(l.getLongitude())); + y.add(MapUtils.get31TileNumberY(l.getLatitude())); + if (t >= 0) { + double dist = MapUtils.squareRootDist31(x.get(t), y.get(t), x.get(t + 1), y.get(t + 1)); + gctx.routeDistanceUnmatched += dist; + } + } + } + rdo.pointsX = x.toArray(); + rdo.pointsY = y.toArray(); + rdo.types = new int[] { 0 } ; + rdo.id = -1; + strPnt.routeToTarget = new ArrayList<>(); + strPnt.straightLine = true; + strPnt.routeToTarget.add(new RouteSegmentResult(rdo, 0, rdo.getPointsLength() - 1)); + RouteResultPreparation preparation = new RouteResultPreparation(); + try { + preparation.prepareResult(gctx.ctx, strPnt.routeToTarget, false); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + // VIEW: comment to see road without straight connections + gctx.finalPoints.add(strPnt); + gctx.result.addAll(strPnt.routeToTarget); + } + + + private void simplifyDouglasPeucker(List l, double eps, int start, int end) { + double dmax = -1; + int index = -1; + LatLon s = l.get(start); + LatLon e = l.get(end); + for (int i = start + 1; i <= end - 1; i++) { + LatLon ip = l.get(i); + double dist = MapUtils.getOrthogonalDistance(ip.getLatitude(), ip.getLongitude(), s.getLatitude(), s.getLongitude(), + e.getLatitude(), e.getLongitude()); + if (dist > dmax) { + dmax = dist; + index = i; + } + } + if (dmax >= eps) { + simplifyDouglasPeucker(l, eps, start, index); + simplifyDouglasPeucker(l, eps, index, end); + } else { + for(int i = start + 1; i < end; i++ ) { + l.set(i, null); + } + } + } + + private boolean initRoutingPoint(GpxPoint start, GpxRouteApproximation gctx, double distThreshold) throws IOException { + if (start != null && start.pnt == null) { + gctx.routePointsSearched++; + RouteSegmentPoint rsp = findRouteSegment(start.loc.getLatitude(), start.loc.getLongitude(), gctx.ctx, null, false); + if (rsp != null) { + if (MapUtils.getDistance(rsp.getPreciseLatLon(), start.loc) < distThreshold) { + start.pnt = rsp; + } + } + } + if (start != null && start.pnt != null) { + return true; + } + return false; + } + + private GpxPoint findNextGpxPointWithin(GpxRouteApproximation gctx, List gpxPoints, + GpxPoint start, double dist) { + // returns first point with that has slightly more than dist or last point + int plus = dist > 0 ? 1 : -1; + int targetInd = start.ind + plus; + GpxPoint target = null; + while (targetInd < gpxPoints.size() && targetInd >= 0) { + target = gpxPoints.get(targetInd); + if (Math.abs(target.cumDist - start.cumDist) > Math.abs(dist)) { + break; + } + targetInd = targetInd + plus; + } + return target; + } + + private boolean findGpxRouteSegment(GpxRouteApproximation gctx, List gpxPoints, + GpxPoint start, GpxPoint target, boolean prevRouteCalculated) throws IOException, InterruptedException { + List res = null; + boolean routeIsCorrect = false; + if (start.pnt != null && target.pnt != null) { + start.pnt = new RouteSegmentPoint(start.pnt); + target.pnt = new RouteSegmentPoint(target.pnt); + gctx.routeDistCalculations += (target.cumDist - start.cumDist); + gctx.routeCalculations++; + res = searchRouteInternalPrepare(gctx.ctx, start.pnt, target.pnt, null); + //BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx); + routeIsCorrect = res != null && !res.isEmpty(); + for (int k = start.ind + 1; routeIsCorrect && k < target.ind; k++) { + GpxPoint ipoint = gpxPoints.get(k); + if (!pointCloseEnough(gctx, ipoint, res)) { + routeIsCorrect = false; + } + } + if (routeIsCorrect) { + // correct start point though don't change end point + if (!prevRouteCalculated) { + // make first position precise + makeSegmentPointPrecise(res.get(0), start.loc, true); + } else { + if(res.get(0).getObject().getId() == start.pnt.getRoad().getId()) { + // start point could shift to +-1 due to direction + res.get(0).setStartPointIndex(start.pnt.getSegmentStart()); + } else { + // for native routing this is possible when point lies on intersection of 2 lines + // solution here could be to pass to native routing id of the route + // though it should not create any issue + System.out.println("??? not found " + start.pnt.getRoad().getId() + " instead " + + res.get(0).getObject().getId()); + } + } + start.routeToTarget = res; + start.targetInd = target.ind; + } + } + return routeIsCorrect; + } + + private boolean pointCloseEnough(GpxRouteApproximation gctx, GpxPoint ipoint, List res) { + int px = MapUtils.get31TileNumberX(ipoint.loc.getLongitude()); + int py = MapUtils.get31TileNumberY(ipoint.loc.getLatitude()); + double SQR = gctx.MINIMUM_POINT_APPROXIMATION; + SQR = SQR * SQR; + for (RouteSegmentResult sr : res) { + int start = sr.getStartPointIndex(); + int end = sr.getEndPointIndex(); + if (sr.getStartPointIndex() > sr.getEndPointIndex()) { + start = sr.getEndPointIndex(); + end = sr.getStartPointIndex(); + } + for (int i = start; i < end; i++) { + RouteDataObject r = sr.getObject(); + QuadPoint pp = MapUtils.getProjectionPoint31(px, py, r.getPoint31XTile(i), r.getPoint31YTile(i), + r.getPoint31XTile(i + 1), r.getPoint31YTile(i + 1)); + double currentsDist = squareDist((int) pp.x, (int) pp.y, px, py); + if (currentsDist <= SQR) { + return true; + } + } + } + return false; + } private boolean needRequestPrivateAccessRouting(RoutingContext ctx, List points) throws IOException { boolean res = false; @@ -174,7 +670,7 @@ public class RoutePlannerFrontEnd { public List searchRoute(final RoutingContext ctx, LatLon start, LatLon end, List intermediates, PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException { - ctx.timeToCalculate = System.nanoTime(); + long timeToCalculate = System.nanoTime(); if (ctx.calculationProgress == null) { ctx.calculationProgress = new RouteCalculationProgress(); } @@ -206,6 +702,7 @@ public class RoutePlannerFrontEnd { } routeDirection = PrecalculatedRouteDirection.build(ls, ctx.config.DEVIATION_RADIUS, ctx.getRouter().getMaxSpeed()); } + List res ; if (intermediatesEmpty && ctx.nativeLib != null) { ctx.startX = MapUtils.get31TileNumberX(start.getLongitude()); ctx.startY = MapUtils.get31TileNumberY(start.getLatitude()); @@ -219,32 +716,32 @@ public class RoutePlannerFrontEnd { ctx.precalculatedRouteDirection = routeDirection.adopt(ctx); } ctx.calculationProgress.nextIteration(); - List res = runNativeRouting(ctx, recalculationEnd); - if (res != null) { - new RouteResultPreparation().printResults(ctx, start, end, res); - } + res = runNativeRouting(ctx, recalculationEnd); makeStartEndPointsPrecise(res, start, end, intermediates); - return res; - } - int indexNotFound = 0; - List points = new ArrayList(); - if (!addSegment(start, ctx, indexNotFound++, points, ctx.startTransportStop)) { - return null; - } - if (intermediates != null) { - for (LatLon l : intermediates) { - if (!addSegment(l, ctx, indexNotFound++, points, false)) { - return null; + } else { + int indexNotFound = 0; + List points = new ArrayList(); + if (!addSegment(start, ctx, indexNotFound++, points, ctx.startTransportStop)) { + return null; + } + if (intermediates != null) { + for (LatLon l : intermediates) { + if (!addSegment(l, ctx, indexNotFound++, points, false)) { + System.out.println(points.get(points.size() - 1).getRoad().toString()); + return null; + } } } + if (!addSegment(end, ctx, indexNotFound++, points, ctx.targetTransportStop)) { + return null; + } + ctx.calculationProgress.nextIteration(); + res = searchRouteImpl(ctx, points, routeDirection); } - if (!addSegment(end, ctx, indexNotFound++, points, ctx.targetTransportStop)) { - return null; + if (ctx.calculationProgress != null) { + ctx.calculationProgress.timeToCalculate = (System.nanoTime() - timeToCalculate); } - ctx.calculationProgress.nextIteration(); - List res = searchRoute(ctx, points, routeDirection); - // make start and end more precise - makeStartEndPointsPrecise(res, start, end, intermediates); + BinaryRoutePlanner.printDebugMemoryInformation(ctx); if (res != null) { new RouteResultPreparation().printResults(ctx, start, end, res); } @@ -253,35 +750,8 @@ public class RoutePlannerFrontEnd { protected void makeStartEndPointsPrecise(List res, LatLon start, LatLon end, List intermediates) { if (res.size() > 0) { - updateResult(res.get(0), start, true); - updateResult(res.get(res.size() - 1), end, false); - if (intermediates != null) { - int k = 1; - for (int i = 0; i < intermediates.size(); i++) { - LatLon ll = intermediates.get(i); - int px = MapUtils.get31TileNumberX(ll.getLongitude()); - int py = MapUtils.get31TileNumberY(ll.getLatitude()); - for (; k < res.size(); k++) { - double currentsDist = projectDistance(res, k, px, py); - if (currentsDist < 500 * 500) { - for (int k1 = k + 1; k1 < res.size(); k1++) { - double c2 = projectDistance(res, k1, px, py); - if (c2 < currentsDist) { - k = k1; - currentsDist = c2; - } else if (k1 - k > 15) { - break; - } - } - updateResult(res.get(k), ll, false); - if (k < res.size() - 1) { - updateResult(res.get(k + 1), ll, true); - } - break; - } - } - } - } + makeSegmentPointPrecise(res.get(0), start, true); + makeSegmentPointPrecise(res.get(res.size() - 1), end, false); } } @@ -295,12 +765,13 @@ public class RoutePlannerFrontEnd { return currentsDist; } - private void updateResult(RouteSegmentResult routeSegmentResult, LatLon point, boolean st) { + private void makeSegmentPointPrecise(RouteSegmentResult routeSegmentResult, LatLon point, boolean st) { int px = MapUtils.get31TileNumberX(point.getLongitude()); int py = MapUtils.get31TileNumberY(point.getLatitude()); int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex(); - RouteDataObject r = routeSegmentResult.getObject(); + RouteDataObject r = new RouteDataObject(routeSegmentResult.getObject()); + routeSegmentResult.setObject(r); QuadPoint before = null; QuadPoint after = null; if (pind > 0) { @@ -364,7 +835,7 @@ public class RoutePlannerFrontEnd { ctx.calculationProgress.segmentNotFound = indexNotFound; return false; } else { - log.info("Route segment found " + f.getRoad().id + " " + f.getRoad().getName()); + log.info("Route segment found " + f.road); res.add(f); return true; } @@ -383,6 +854,14 @@ public class RoutePlannerFrontEnd { ctx.precalculatedRouteDirection = routeDirection.adopt(ctx); } if (ctx.nativeLib != null) { + ctx.startX = start.preciseX; + ctx.startY = start.preciseY; + ctx.startRoadId = start.road.id; + ctx.startSegmentInd = start.segStart; + ctx.targetX = end.preciseX; + ctx.targetY = end.preciseY; + ctx.targetRoadId = end.road.id; + ctx.targetSegmentInd = end.segStart; return runNativeRouting(ctx, recalculationEnd); } else { refreshProgressDistance(ctx); @@ -446,11 +925,9 @@ public class RoutePlannerFrontEnd { ctx.checkOldRoutingFiles(ctx.startX, ctx.startY); ctx.checkOldRoutingFiles(ctx.targetX, ctx.targetY); - long time = System.currentTimeMillis(); - RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx.startX, ctx.startY, ctx.targetX, ctx.targetY, - ctx.config, regions, ctx.calculationProgress, ctx.precalculatedRouteDirection, ctx.calculationMode == RouteCalculationMode.BASE, - ctx.publicTransport, ctx.startTransportStop, ctx.targetTransportStop); - log.info("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds"); + // long time = System.currentTimeMillis(); + RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx, regions, ctx.calculationMode == RouteCalculationMode.BASE); + // log.info("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds"); ArrayList result = new ArrayList(Arrays.asList(res)); if (recalculationEnd != null) { log.info("Native routing use precalculated route"); @@ -461,20 +938,23 @@ public class RoutePlannerFrontEnd { current = pr; } } - ctx.routingTime = ctx.calculationProgress.routingCalculatedTime; - ctx.visitedSegments = ctx.calculationProgress.visitedSegments; - ctx.loadedTiles = ctx.calculationProgress.loadedTiles; + ctx.routingTime += ctx.calculationProgress.routingCalculatedTime; return new RouteResultPreparation().prepareResult(ctx, result, recalculationEnd != null); } - private List searchRoute(final RoutingContext ctx, List points, PrecalculatedRouteDirection routeDirection) + private List searchRouteImpl(final RoutingContext ctx, List points, PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException { if (points.size() <= 2) { + // simple case 2 points only if (!useSmartRouteRecalculation) { ctx.previouslyCalculatedRoute = null; } - return searchRoute(ctx, points.get(0), points.get(1), routeDirection); + pringGC(ctx, true); + List res = searchRouteInternalPrepare(ctx, points.get(0), points.get(1), routeDirection); + pringGC(ctx, false); + makeStartEndPointsPrecise(res, points.get(0).getPreciseLatLon(), points.get(1).getPreciseLatLon(), null); + return res; } ArrayList firstPartRecalculatedRoute = null; @@ -516,19 +996,10 @@ public class RoutePlannerFrontEnd { local.visitor = ctx.visitor; local.calculationProgress = ctx.calculationProgress; List res = searchRouteInternalPrepare(local, points.get(i), points.get(i + 1), routeDirection); - + makeStartEndPointsPrecise(res, points.get(i).getPreciseLatLon(), points.get(i + 1).getPreciseLatLon(), null); results.addAll(res); - ctx.distinctLoadedTiles += local.distinctLoadedTiles; - ctx.loadedTiles += local.loadedTiles; - ctx.visitedSegments += local.visitedSegments; - ctx.loadedPrevUnloadedTiles += local.loadedPrevUnloadedTiles; - ctx.timeToCalculate += local.timeToCalculate; - ctx.timeToLoad += local.timeToLoad; - ctx.timeToLoadHeaders += local.timeToLoadHeaders; - ctx.relaxedSegments += local.relaxedSegments; ctx.routingTime += local.routingTime; - - local.unloadAllData(ctx); +// local.unloadAllData(ctx); if (restPartRecalculatedRoute != null) { results.addAll(restPartRecalculatedRoute); break; @@ -539,28 +1010,24 @@ public class RoutePlannerFrontEnd { } - @SuppressWarnings("static-access") - private List searchRoute(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end, - PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException { - if (ctx.SHOW_GC_SIZE) { - long h1 = ctx.runGCUsedMemory(); + private void pringGC(final RoutingContext ctx, boolean before) { + if (RoutingContext.SHOW_GC_SIZE && before) { + long h1 = RoutingContext.runGCUsedMemory(); float mb = (1 << 20); log.warn("Used before routing " + h1 / mb + " actual"); - } - List result = searchRouteInternalPrepare(ctx, start, end, routeDirection); - if (RoutingContext.SHOW_GC_SIZE) { + } else if (RoutingContext.SHOW_GC_SIZE && !before) { int sz = ctx.global.size; log.warn("Subregion size " + ctx.subregionTiles.size() + " " + " tiles " + ctx.indexedSubregions.size()); - ctx.runGCUsedMemory(); - long h1 = ctx.runGCUsedMemory(); + RoutingContext.runGCUsedMemory(); + long h1 = RoutingContext.runGCUsedMemory(); ctx.unloadAllData(); - ctx.runGCUsedMemory(); - long h2 = ctx.runGCUsedMemory(); + RoutingContext.runGCUsedMemory(); + long h2 = RoutingContext.runGCUsedMemory(); float mb = (1 << 20); log.warn("Unload context : estimated " + sz / mb + " ?= " + (h1 - h2) / mb + " actual"); } - return result; } + } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 8849f122ec..d7ebbaba8f 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -1,5 +1,26 @@ package net.osmand.router; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.set.hash.TIntHashSet; import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; @@ -18,33 +39,16 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapAlgorithms; import net.osmand.util.MapUtils; -import org.apache.commons.logging.Log; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import gnu.trove.iterator.TIntIterator; -import gnu.trove.list.array.TIntArrayList; -import gnu.trove.set.hash.TIntHashSet; - public class RouteResultPreparation { public static boolean PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = false; public static String PRINT_TO_GPX_FILE = null; private static final float TURN_DEGREE_MIN = 45; + private static final float UNMATCHED_TURN_DEGREE_MINIMUM = 45; + private static final float SPLIT_TURN_DEGREE_NOT_STRAIGHT = 100; public static final int SHIFT_ID = 6; private Log log = PlatformUtil.getLog(RouteResultPreparation.class); + public static final String UNMATCHED_HIGHWAY_TYPE = "unmatched"; /** * Helper method to prepare final result */ @@ -174,6 +178,11 @@ public class RouteResultPreparation { splitRoadsAndAttachRoadSegments(ctx, result, recalculation); calculateTimeSpeed(ctx, result); + prepareTurnResults(ctx, result); + return result; + } + + public void prepareTurnResults(RoutingContext ctx, List result) { for (int i = 0; i < result.size(); i ++) { TurnType turnType = getTurnInfo(result, i, ctx.leftSideNavigation); result.get(i).setTurnType(turnType); @@ -183,7 +192,6 @@ public class RouteResultPreparation { ignorePrecedingStraightsOnSameIntersection(ctx.leftSideNavigation, result); justifyUTurns(ctx.leftSideNavigation, result); addTurnInfoDescriptions(result); - return result; } protected void ignorePrecedingStraightsOnSameIntersection(boolean leftside, List result) { @@ -217,7 +225,7 @@ public class RouteResultPreparation { private void justifyUTurns(boolean leftSide, List result) { int next; - for (int i = 0; i < result.size() - 1; i = next) { + for (int i = 1; i < result.size() - 1; i = next) { next = i + 1; TurnType t = result.get(i).getTurnType(); // justify turn @@ -269,7 +277,7 @@ public class RouteResultPreparation { double d = measuredDist(road.getPoint31XTile(j), road.getPoint31YTile(j), road.getPoint31XTile(next), road.getPoint31YTile(next)); distance += d; - double obstacle = ctx.getRouter().defineObstacle(road, j); + double obstacle = ctx.getRouter().defineObstacle(road, j, plus); if (obstacle < 0) { obstacle = 0; } @@ -282,11 +290,12 @@ public class RouteResultPreparation { float height = heightDistanceArray[heightIndex]; if (prevHeight != -99999.0f) { float heightDiff = height - prevHeight; - if (heightDiff > 0) { //ascent only - distOnRoadToPass += heightDiff * 6.0f; //Naismith's rule: add 1 hour per every 600m of ascent + if (heightDiff > 0) { // ascent only + distOnRoadToPass += heightDiff * 6.0f; // Naismith's rule: add 1 hour per every 600m of + // ascent } } - prevHeight = height; + prevHeight = height; } } } @@ -307,6 +316,7 @@ public class RouteResultPreparation { RouteSegmentResult rr = result.get(i); boolean plus = rr.getStartPointIndex() < rr.getEndPointIndex(); int next; + boolean unmatched = UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway()); for (int j = rr.getStartPointIndex(); j != rr.getEndPointIndex(); j = next) { next = plus ? j + 1 : j - 1; if (j == rr.getStartPointIndex()) { @@ -317,27 +327,33 @@ public class RouteResultPreparation { } List attachedRoutes = rr.getAttachedRoutes(next); boolean tryToSplit = next != rr.getEndPointIndex() && !rr.getObject().roundabout() && attachedRoutes != null; - if(rr.getDistance(next, plus ) == 0) { + if (rr.getDistance(next, plus) == 0) { // same point will be processed next step tryToSplit = false; } if (tryToSplit) { + float distBearing = unmatched ? RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED : RouteSegmentResult.DIST_BEARING_DETECT; // avoid small zigzags - float before = rr.getBearing(next, !plus); - float after = rr.getBearing(next, plus); - if(rr.getDistance(next, plus ) < 5) { - after = before + 180; - } else if(rr.getDistance(next, !plus ) < 5) { - before = after - 180; + float before = rr.getBearingEnd(next, distBearing); + float after = rr.getBearingBegin(next, distBearing); + if (rr.getDistance(next, plus) < distBearing) { + after = before; + } else if (rr.getDistance(next, !plus) < distBearing) { + before = after; } - boolean straight = Math.abs(MapUtils.degreesDiff(before + 180, after)) < TURN_DEGREE_MIN; + double contAngle = Math.abs(MapUtils.degreesDiff(before, after)); + boolean straight = contAngle < TURN_DEGREE_MIN; boolean isSplit = false; + + if (unmatched && Math.abs(contAngle) >= UNMATCHED_TURN_DEGREE_MINIMUM) { + isSplit = true; + } // split if needed for (RouteSegmentResult rs : attachedRoutes) { - double diff = MapUtils.degreesDiff(before + 180, rs.getBearingBegin()); + double diff = MapUtils.degreesDiff(before, rs.getBearingBegin()); if (Math.abs(diff) <= TURN_DEGREE_MIN) { isSplit = true; - } else if (!straight && Math.abs(diff) < 100) { + } else if (!straight && Math.abs(diff) < SPLIT_TURN_DEGREE_NOT_STRAIGHT) { isSplit = true; } } @@ -358,7 +374,7 @@ public class RouteResultPreparation { private void checkAndInitRouteRegion(RoutingContext ctx, RouteDataObject road) throws IOException { BinaryMapIndexReader reader = ctx.reverseMap.get(road.region); - if(reader != null) { + if (reader != null) { reader.initRouteRegion(road.region); } } @@ -378,8 +394,8 @@ public class RouteResultPreparation { private List convertFinalSegmentToResults(RoutingContext ctx, FinalRouteSegment finalSegment) { List result = new ArrayList(); if (finalSegment != null) { - ctx.routingTime = finalSegment.distanceFromStart; - println("Routing calculated time distance " + finalSegment.distanceFromStart); + ctx.routingTime += finalSegment.distanceFromStart; + // println("Routing calculated time distance " + finalSegment.distanceFromStart); // Get results from opposite direction roads RouteSegment segment = finalSegment.reverseWaySearch ? finalSegment : finalSegment.opposite.getParentRoute(); @@ -395,7 +411,6 @@ public class RouteResultPreparation { } // reverse it just to attach good direction roads Collections.reverse(result); - segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment; int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart(); parentRoutingTime = -1; @@ -481,8 +496,9 @@ public class RouteResultPreparation { String msg = String.format("", - ctx.config.routerName, startLat, startLon, endLat, endLon, ctx.routingTime, ctx.loadedTiles, - ctx.visitedSegments, completeDistance, completeTime); + ctx.config.routerName, startLat, startLon, endLat, endLon, ctx.routingTime, + ctx.getLoadedTiles(), + ctx.getVisitedSegments(), completeDistance, completeTime); // String msg = MessageFormat.format("", // startLat + "", startLon + "", endLat + "", endLon + "", ctx.config.routerName, @@ -622,7 +638,7 @@ public class RouteResultPreparation { // calculateStatistics(result); } - private void calculateStatistics(List result) { + protected void calculateStatistics(List result) { InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml"); final Map renderingConstants = new LinkedHashMap(); try { @@ -799,13 +815,22 @@ public class RouteResultPreparation { } if (dist < mergeDistance) { mergeTurnLanes(leftside, currentSegment, nextSegment); - inferCommonActiveLane(currentSegment.getTurnType(), nextSegment.getTurnType()); + TurnType turnType = currentSegment.getTurnType(); + Integer[] possibleTurn = getPossibleTurnsFromActiveLanes(turnType.getLanes(), true); + if (possibleTurn.length == 1) { + TurnType tt = TurnType.valueOf(possibleTurn[0], currentSegment.getTurnType().isLeftSide()); + tt.setLanes(turnType.getLanes()); + tt.setSkipToSpeak(turnType.isSkipToSpeak()); + currentSegment.setTurnType(tt); + turnType = tt; + } + inferCommonActiveLane(turnType, nextSegment.getTurnType()); merged = true; } } if (!merged) { TurnType tt = currentSegment.getTurnType(); - inferActiveTurnLanesFromTurn(tt, TurnType.C); + inferActiveTurnLanesFromTurn(tt, tt.getValue()); } nextSegment = currentSegment; dist = 0; @@ -983,11 +1008,9 @@ public class RouteResultPreparation { if(turnSet.size() == 1) { singleTurn = turnSet.iterator().next(); } else if(currentTurn.goAhead() && turnSet.contains(nextTurn.getValue())) { - if(currentTurn.isPossibleLeftTurn() && - TurnType.isLeftTurn(nextTurn.getValue())) { - singleTurn = nextTurn.getValue(); - } else if(currentTurn.isPossibleLeftTurn() && - TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) { + if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getValue())) { + singleTurn = nextTurn.getValue(); + } else if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) { singleTurn = nextTurn.getActiveCommonLaneTurn(); } else if(currentTurn.isPossibleRightTurn() && TurnType.isRightTurn(nextTurn.getValue())) { @@ -1049,18 +1072,17 @@ public class RouteResultPreparation { } TurnType t = null; if (prev != null) { - boolean noAttachedRoads = rr.getAttachedRoutes(rr.getStartPointIndex()).size() == 0; // add description about turn - double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin()); - if(noAttachedRoads){ - // TODO VICTOR : look at the comment inside direction route - // ? avoid small zigzags is covered at (search for "zigzags") -// double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() < -// rr.getEndPointIndex(), 25); -// mpi = MapUtils.degreesDiff(prev.getBearingEnd(), begin); + // avoid small zigzags is covered at (search for "zigzags") + float bearingDist = RouteSegmentResult.DIST_BEARING_DETECT; + // could be || noAttachedRoads, boolean noAttachedRoads = rr.getAttachedRoutes(rr.getStartPointIndex()).size() == 0; + if (UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway())) { + bearingDist = RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED; } + double mpi = MapUtils.degreesDiff(prev.getBearingEnd(prev.getEndPointIndex(), bearingDist), + rr.getBearingBegin(rr.getStartPointIndex(), bearingDist)); if (mpi >= TURN_DEGREE_MIN) { - if (mpi < 45) { + if (mpi < TURN_DEGREE_MIN) { // Slight turn detection here causes many false positives where drivers would expect a "normal" TL. Best use limit-angle=TURN_DEGREE_MIN, this reduces TSL to the turn-lanes cases. t = TurnType.valueOf(TurnType.TSLL, leftSide); } else if (mpi < 120) { @@ -1073,7 +1095,7 @@ public class RouteResultPreparation { int[] lanes = getTurnLanesInfo(prev, t.getValue()); t.setLanes(lanes); } else if (mpi < -TURN_DEGREE_MIN) { - if (mpi > -45) { + if (mpi > -TURN_DEGREE_MIN) { t = TurnType.valueOf(TurnType.TSLR, leftSide); } else if (mpi > -120) { t = TurnType.valueOf(TurnType.TR, leftSide); @@ -1262,23 +1284,12 @@ public class RouteResultPreparation { } } - t.setPossibleLeftTurn(possiblyLeftTurn); - t.setPossibleRightTurn(possiblyRightTurn); if (rs.keepLeft || rs.keepRight) { String[] splitLaneOptions = turnLanes.split("\\|", -1); int activeBeginIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.leftLanes, true, rs.leftLanesInfo, rs.roadsOnLeft, rs.addRoadsOnLeft); - - if(!rs.keepLeft && activeBeginIndex != -1 && - splitLaneOptions.length > 0 && !splitLaneOptions[splitLaneOptions.length - 1].contains(";")) { - activeBeginIndex = Math.max(activeBeginIndex, 1); - } int activeEndIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.rightLanes, false, rs.rightLanesInfo, rs.roadsOnRight, rs.addRoadsOnRight); - if(!rs.keepRight && activeEndIndex != -1 && - splitLaneOptions.length > 0 && !splitLaneOptions[0].contains(";") ) { - activeEndIndex = Math.min(activeEndIndex, rawLanes.length - 1); - } if (activeBeginIndex == -1 || activeEndIndex == -1 || activeBeginIndex > activeEndIndex) { // something went wrong return createSimpleKeepLeftRightTurn(leftSide, prevSegm, currentSegm, rs); @@ -1288,36 +1299,65 @@ public class RouteResultPreparation { rawLanes[k] |= 1; } } - int tp = inferSlightTurnFromLanes(rawLanes, rs); + int tp = inferSlightTurnFromActiveLanes(rawLanes, rs.keepLeft, rs.keepRight); + // Checking to see that there is only one unique turn + if (tp != 0) { + // add extra lanes with same turn + for(int i = 0; i < rawLanes.length; i++) { + if(TurnType.getSecondaryTurn(rawLanes[i]) == tp) { + TurnType.setSecondaryToPrimary(rawLanes, i); + rawLanes[i] |= 1; + } else if(TurnType.getPrimaryTurn(rawLanes[i]) == tp) { + rawLanes[i] |= 1; + } + } + } if (tp != t.getValue() && tp != 0) { t = TurnType.valueOf(tp, leftSide); + } else { + if (rs.keepRight && TurnType.getSecondaryTurn(rawLanes[activeEndIndex]) == 0) { + t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeEndIndex]), leftSide); + } else if (rs.keepLeft && TurnType.getSecondaryTurn(rawLanes[activeBeginIndex]) == 0) { + t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeBeginIndex]), leftSide); + } } } else { + // case for go straight and identify correct turn:lane to go straight + Integer[] possibleTurns = getPossibleTurns(rawLanes, false, false); + int tp = TurnType.C; + if (possibleTurns.length == 1) { + tp = possibleTurns[0]; + } else if (possibleTurns.length == 3) { + if ((!possiblyLeftTurn || !possiblyRightTurn) && TurnType.isSlightTurn(possibleTurns[1])) { + tp = possibleTurns[1]; + t = TurnType.valueOf(tp, leftSide); + } + } for (int k = 0; k < rawLanes.length; k++) { int turn = TurnType.getPrimaryTurn(rawLanes[k]); int sturn = TurnType.getSecondaryTurn(rawLanes[k]); int tturn = TurnType.getTertiaryTurn(rawLanes[k]); - + boolean active = false; + // some turns go through many segments (to turn right or left) // so on one first segment the lane could be available and may be only 1 possible // all undesired lanes will be disabled through the 2nd pass - if((TurnType.isRightTurn(sturn) && possiblyRightTurn) || - (TurnType.isLeftTurn(sturn) && possiblyLeftTurn)) { - // we can't predict here whether it will be a left turn or straight on, + if ((TurnType.isRightTurn(sturn) && possiblyRightTurn) + || (TurnType.isLeftTurn(sturn) && possiblyLeftTurn)) { + // we can't predict here whether it will be a left turn or straight on, // it could be done during 2nd pass - TurnType.setPrimaryTurn(rawLanes, k, sturn); - TurnType.setSecondaryTurn(rawLanes, k, turn); + TurnType.setSecondaryToPrimary(rawLanes, k); active = true; - } else if((TurnType.isRightTurn(tturn) && possiblyRightTurn) || - (TurnType.isLeftTurn(tturn) && possiblyLeftTurn)) { - TurnType.setPrimaryTurn(rawLanes, k, tturn); - TurnType.setTertiaryTurn(rawLanes, k, turn); + } else if ((TurnType.isRightTurn(tturn) && possiblyRightTurn) + || (TurnType.isLeftTurn(tturn) && possiblyLeftTurn)) { + TurnType.setTertiaryToPrimary(rawLanes, k); active = true; - } else if((TurnType.isRightTurn(turn) && possiblyRightTurn) || - (TurnType.isLeftTurn(turn) && possiblyLeftTurn)) { + } else if ((TurnType.isRightTurn(turn) && possiblyRightTurn) + || (TurnType.isLeftTurn(turn) && possiblyLeftTurn)) { active = true; - } else if (turn == TurnType.C) { + // } else if (turn == TurnType.C) { + } else if (turn == tp) { active = true; } if (active) { @@ -1327,6 +1367,8 @@ public class RouteResultPreparation { } t.setSkipToSpeak(!rs.speak); t.setLanes(rawLanes); + t.setPossibleLeftTurn(possiblyLeftTurn); + t.setPossibleRightTurn(possiblyRightTurn); return t; } @@ -1435,32 +1477,39 @@ public class RouteResultPreparation { protected TurnType createSimpleKeepLeftRightTurn(boolean leftSide, RouteSegmentResult prevSegm, RouteSegmentResult currentSegm, RoadSplitStructure rs) { + double devation = Math.abs(MapUtils.degreesDiff(prevSegm.getBearingEnd(), currentSegm.getBearingBegin())); + boolean makeSlightTurn = devation > 5 && (!isMotorway(prevSegm) || !isMotorway(currentSegm)); + TurnType t = null; + int laneType = TurnType.C; + if (rs.keepLeft && rs.keepRight) { + t = TurnType.valueOf(TurnType.C, leftSide); + } else if (rs.keepLeft) { + t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLL : TurnType.KL, leftSide); + if (makeSlightTurn) { + laneType = TurnType.TSLL; + } + } else if (rs.keepRight) { + t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLR : TurnType.KR, leftSide); + if (makeSlightTurn) { + laneType = TurnType.TSLR; + } + } else { + return null; + } int current = countLanesMinOne(currentSegm); int ls = current + rs.leftLanes + rs.rightLanes; int[] lanes = new int[ls]; for (int it = 0; it < ls; it++) { if (it < rs.leftLanes || it >= rs.leftLanes + current) { - lanes[it] = 0; + lanes[it] = TurnType.C << 1; } else { - lanes[it] = 1; + lanes[it] = (laneType << 1) + 1; } } // sometimes links are if ((current <= rs.leftLanes + rs.rightLanes) && (rs.leftLanes > 1 || rs.rightLanes > 1)) { rs.speak = true; } - double devation = Math.abs(MapUtils.degreesDiff(prevSegm.getBearingEnd(), currentSegm.getBearingBegin())); - boolean makeSlightTurn = devation > 5 && (!isMotorway(prevSegm) || !isMotorway(currentSegm)); - TurnType t = null; - if (rs.keepLeft && rs.keepRight) { - t = TurnType.valueOf(TurnType.C, leftSide); - } else if (rs.keepLeft) { - t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLL : TurnType.KL, leftSide); - } else if (rs.keepRight) { - t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLR : TurnType.KR, leftSide); - } else { - return t; - } t.setSkipToSpeak(!rs.speak); t.setLanes(lanes); return t; @@ -1569,10 +1618,8 @@ public class RouteResultPreparation { int[] lanes = new int[splitLaneOptions.length]; for (int i = 0; i < splitLaneOptions.length; i++) { String[] laneOptions = splitLaneOptions[i].split(";"); - boolean isTertiaryTurn = false; for (int j = 0; j < laneOptions.length; j++) { int turn = TurnType.convertType(laneOptions[j]); - final int primary = TurnType.getPrimaryTurn(lanes[i]); if (primary == 0) { TurnType.setPrimaryTurnAndReset(lanes, i, turn); @@ -1582,12 +1629,12 @@ public class RouteResultPreparation { (TurnType.isLeftTurn(calcTurnType) && TurnType.isLeftTurn(turn)) ) { TurnType.setPrimaryTurnShiftOthers(lanes, i, turn); - } else if (!isTertiaryTurn) { - TurnType.setSecondaryTurnShiftOthers(lanes, i, turn); - isTertiaryTurn = true; - } else { + } else if (TurnType.getSecondaryTurn(lanes[i]) == 0) { + TurnType.setSecondaryTurn(lanes, i, turn); + } else if (TurnType.getTertiaryTurn(lanes[i]) == 0) { TurnType.setTertiaryTurn(lanes, i, turn); - break; + } else { + // ignore } } } @@ -1595,96 +1642,90 @@ public class RouteResultPreparation { return lanes; } - private int inferSlightTurnFromLanes(int[] oLanes, RoadSplitStructure rs) { - TIntHashSet possibleTurns = new TIntHashSet(); - for (int i = 0; i < oLanes.length; i++) { - if ((oLanes[i] & 1) == 0) { - continue; - } - if (possibleTurns.isEmpty()) { - // Nothing is in the list to compare to, so add the first elements - possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i])); - if (TurnType.getSecondaryTurn(oLanes[i]) != 0) { - possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i])); - } - if (TurnType.getTertiaryTurn(oLanes[i]) != 0) { - possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i])); - } - } else { - TIntArrayList laneTurns = new TIntArrayList(); - laneTurns.add(TurnType.getPrimaryTurn(oLanes[i])); - if (TurnType.getSecondaryTurn(oLanes[i]) != 0) { - laneTurns.add(TurnType.getSecondaryTurn(oLanes[i])); - } - if (TurnType.getTertiaryTurn(oLanes[i]) != 0) { - laneTurns.add(TurnType.getTertiaryTurn(oLanes[i])); - } - possibleTurns.retainAll(laneTurns); - if (possibleTurns.isEmpty()) { - // No common turns, so can't determine anything. - return 0; - } - } + + private int inferSlightTurnFromActiveLanes(int[] oLanes, boolean mostLeft, boolean mostRight) { + Integer[] possibleTurns = getPossibleTurns(oLanes, false, true); + if (possibleTurns.length == 0) { + // No common turns, so can't determine anything. + return 0; } - - // Remove all turns from lanes not selected...because those aren't it - for (int i = 0; i < oLanes.length; i++) { - if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) { - possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i])); - if (TurnType.getSecondaryTurn(oLanes[i]) != 0) { - possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i])); - } - if (TurnType.getTertiaryTurn(oLanes[i]) != 0) { - possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i])); - } - } - } - // remove all non-slight turns // TEST don't pass -// if(possibleTurns.size() > 1) { -// TIntIterator it = possibleTurns.iterator(); -// while(it.hasNext()) { -// int nxt = it.next(); -// if(!TurnType.isSlightTurn(nxt)) { -// it.remove(); -// } -// } -// } int infer = 0; - if (possibleTurns.size() == 1) { - infer = possibleTurns.iterator().next(); - } else if (possibleTurns.size() > 1) { - if (rs.keepLeft && rs.keepRight && possibleTurns.contains(TurnType.C)) { - infer = TurnType.C; - } else if (rs.keepLeft || rs.keepRight) { - TIntIterator it = possibleTurns.iterator(); - infer = it.next(); - while(it.hasNext()) { - int next = it.next(); - int orderInfer = TurnType.orderFromLeftToRight(infer); - int orderNext = TurnType.orderFromLeftToRight(next) ; - if(rs.keepLeft && orderNext < orderInfer) { - infer = next; - } else if(rs.keepRight && orderNext > orderInfer) { - infer = next; + if (possibleTurns.length == 1) { + infer = possibleTurns[0]; + } else { + if (mostLeft && !mostRight) { + infer = possibleTurns[0]; + } else if(mostRight && !mostLeft) { + infer = possibleTurns[possibleTurns.length - 1]; + } else { + infer = possibleTurns[1]; +// infer = TurnType.C; + } + } + return infer; + } + + private Integer[] getPossibleTurnsFromActiveLanes(int[] oLanes, boolean onlyPrimary) { + return getPossibleTurns(oLanes, onlyPrimary, true); + } + + private Integer[] getPossibleTurns(int[] oLanes, boolean onlyPrimary, boolean uniqueFromActive) { + Set possibleTurns = new LinkedHashSet<>(); + Set upossibleTurns = new LinkedHashSet<>(); + for (int i = 0; i < oLanes.length; i++) { + // Nothing is in the list to compare to, so add the first elements + upossibleTurns.clear(); + upossibleTurns.add(TurnType.getPrimaryTurn(oLanes[i])); + if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) { + upossibleTurns.add(TurnType.getSecondaryTurn(oLanes[i])); + } + if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) { + upossibleTurns.add(TurnType.getTertiaryTurn(oLanes[i])); + } + if (!uniqueFromActive) { + possibleTurns.addAll(upossibleTurns); +// if (!possibleTurns.isEmpty()) { +// possibleTurns.retainAll(upossibleTurns); +// if(possibleTurns.isEmpty()) { +// break; +// } +// } else { +// possibleTurns.addAll(upossibleTurns); +// } + } else if ((oLanes[i] & 1) == 1) { + if (!possibleTurns.isEmpty()) { + possibleTurns.retainAll(upossibleTurns); + if(possibleTurns.isEmpty()) { + break; + } + } else { + possibleTurns.addAll(upossibleTurns); + } + } + } + // Remove all turns from lanes not selected...because those aren't it + if (uniqueFromActive) { + for (int i = 0; i < oLanes.length; i++) { + if ((oLanes[i] & 1) == 0) { + possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i])); + if (TurnType.getSecondaryTurn(oLanes[i]) != 0) { + possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i])); + } + if (TurnType.getTertiaryTurn(oLanes[i]) != 0) { + possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i])); } } } } + Integer[] array = possibleTurns.toArray(new Integer[possibleTurns.size()]); + Arrays.sort(array, new Comparator() { - // Checking to see that there is only one unique turn - if (infer != 0) { - for(int i = 0; i < oLanes.length; i++) { - if(TurnType.getSecondaryTurn(oLanes[i]) == infer) { - int pt = TurnType.getPrimaryTurn(oLanes[i]); - int en = oLanes[i] & 1; - TurnType.setPrimaryTurnAndReset(oLanes, i, infer); - oLanes[i] |= en; - TurnType.setSecondaryTurn(oLanes, i, pt); - } - + @Override + public int compare(Integer o1, Integer o2) { + return Integer.compare(TurnType.orderFromLeftToRight(o1), TurnType.orderFromLeftToRight(o2)); } - } - return infer; + }); + return array; } private boolean isMotorway(RouteSegmentResult s){ @@ -1721,7 +1762,7 @@ public class RouteResultPreparation { } } Iterator it; - if(rr.getPreAttachedRoutes(pointInd) != null) { + if (rr.getPreAttachedRoutes(pointInd) != null) { final RouteSegmentResult[] list = rr.getPreAttachedRoutes(pointInd); it = new Iterator() { int i = 0; @@ -1740,7 +1781,7 @@ public class RouteResultPreparation { public void remove() { } }; - } else if (recalculation) { + } else if (recalculation || ctx.nativeLib == null) { RouteSegment rt = ctx.loadRouteSegment(road.getPoint31XTile(pointInd), road.getPoint31YTile(pointInd), ctx.config.memoryLimitation); it = rt == null ? null : rt.getIterator(); } else { @@ -1753,7 +1794,7 @@ public class RouteResultPreparation { if (routeSegment.road.getId() != road.getId() && routeSegment.road.getId() != previousRoadId) { RouteDataObject addRoad = routeSegment.road; checkAndInitRouteRegion(ctx, addRoad); - // TODO restrictions can be considered as well + // Future: restrictions can be considered as well int oneWay = ctx.getRouter().isOneWay(addRoad); if (oneWay >= 0 && routeSegment.getSegmentStart() < addRoad.getPointsLength() - 1) { long pointL = getPoint(addRoad, routeSegment.getSegmentStart() + 1); diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java index cd8f0466f5..e31f8ef03b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java @@ -21,7 +21,12 @@ import gnu.trove.map.hash.TIntObjectHashMap; public class RouteSegmentResult implements StringExternalizable { - private final RouteDataObject object; + // this should be bigger (50-80m) but tests need to be fixed first + public static final float DIST_BEARING_DETECT = 5; + + public static final float DIST_BEARING_DETECT_UNMATCHED = 50; + + private RouteDataObject object; private int startPointIndex; private int endPointIndex; private List[] attachedRoutes; @@ -266,7 +271,7 @@ public class RouteSegmentResult implements StringExternalizable bundle.putString("turnLanes", TurnType.lanesToString(turnLanes)); } } - bundle.putLong("id", object.id); + bundle.putLong("id", object.id >> 6); // OsmAnd ID to OSM ID bundle.putArray("types", convertTypes(object.types, rules)); int start = Math.min(startPointIndex, endPointIndex); @@ -322,19 +327,21 @@ public class RouteSegmentResult implements StringExternalizable Location prevLocation = null; for (int i = 0; i < length; i++) { Location location = resources.getLocation(index); - double dist = 0; - if (prevLocation != null) { - dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude()); - distance += dist; - } - prevLocation = location; - object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude()); - object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude()); - if (location.hasAltitude() && object.heightDistanceArray.length > 0) { - object.heightDistanceArray[i * 2] = (float) dist; - object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude(); - } else { - object.heightDistanceArray = new float[0]; + if (location != null) { + double dist = 0; + if (prevLocation != null) { + dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude()); + distance += dist; + } + prevLocation = location; + object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude()); + object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude()); + if (location.hasAltitude() && object.heightDistanceArray.length > 0) { + object.heightDistanceArray[i * 2] = (float) dist; + object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude(); + } else { + object.heightDistanceArray = new float[0]; + } } if (plus) { index++; @@ -403,7 +410,7 @@ public class RouteSegmentResult implements StringExternalizable } public void copyPreattachedRoutes(RouteSegmentResult toCopy, int shift) { - if(toCopy.preAttachedRoutes != null) { + if (toCopy.preAttachedRoutes != null) { int l = toCopy.preAttachedRoutes.length - shift; preAttachedRoutes = new RouteSegmentResult[l][]; System.arraycopy(toCopy.preAttachedRoutes, shift, preAttachedRoutes, 0, l); @@ -412,7 +419,7 @@ public class RouteSegmentResult implements StringExternalizable public RouteSegmentResult[] getPreAttachedRoutes(int routeInd) { int st = Math.abs(routeInd - startPointIndex); - if(preAttachedRoutes != null && st < preAttachedRoutes.length) { + if (preAttachedRoutes != null && st < preAttachedRoutes.length) { return preAttachedRoutes[st]; } return null; @@ -421,7 +428,7 @@ public class RouteSegmentResult implements StringExternalizable public List getAttachedRoutes(int routeInd) { int st = Math.abs(routeInd - startPointIndex); List list = attachedRoutes[st]; - if(list == null) { + if (list == null) { return Collections.emptyList(); } return list; @@ -444,19 +451,32 @@ public class RouteSegmentResult implements StringExternalizable } public float getBearingBegin() { - return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex) / Math.PI * 180); + return getBearingBegin(startPointIndex, DIST_BEARING_DETECT); } - public float getBearing(int point, boolean plus) { - return (float) (object.directionRoute(point, plus) / Math.PI * 180); - } - - public float getDistance(int point, boolean plus) { - return (float) (plus? object.distance(point, endPointIndex): object.distance(startPointIndex, point)); + public float getBearingBegin(int point, float dist) { + return getBearing(point, true, dist); } public float getBearingEnd() { - return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex) - Math.PI) / Math.PI * 180); + return getBearingEnd(endPointIndex, DIST_BEARING_DETECT); + } + + public float getBearingEnd(int point, float dist) { + return getBearing(point, false, dist); + } + + public float getBearing(int point, boolean begin, float dist) { + if (begin) { + return (float) (object.directionRoute(point, startPointIndex < endPointIndex, dist) / Math.PI * 180); + } else { + double dr = object.directionRoute(point, startPointIndex > endPointIndex, dist); + return (float) (MapUtils.alignAngleDifference(dr - Math.PI) / Math.PI * 180); + } + } + + public float getDistance(int point, boolean plus) { + return (float) (plus ? object.distance(point, endPointIndex) : object.distance(startPointIndex, point)); } public void setSegmentTime(float segmentTime) { @@ -495,7 +515,7 @@ public class RouteSegmentResult implements StringExternalizable return endPointIndex - startPointIndex > 0; } - + private LatLon convertPoint(RouteDataObject o, int ind){ return new LatLon(MapUtils.get31LatitudeY(o.getPoint31YTile(ind)), MapUtils.get31LongitudeX(o.getPoint31XTile(ind))); } @@ -533,10 +553,16 @@ public class RouteSegmentResult implements StringExternalizable public void setDescription(String description) { this.description = description; } + + public void setObject(RouteDataObject r) { + this.object = r; + } @Override public String toString() { return object.toString() + ": " + startPointIndex + "-" + endPointIndex; } + + } \ No newline at end of file diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java index 77e08443db..3bfbaec0da 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java @@ -36,12 +36,10 @@ import net.osmand.router.RoutePlannerFrontEnd.RouteCalculationMode; public class RoutingContext { - public static final boolean SHOW_GC_SIZE = false; + public static boolean SHOW_GC_SIZE = false; private final static Log log = PlatformUtil.getLog(RoutingContext.class); - - // Final context variables public final RoutingConfiguration config; @@ -50,23 +48,31 @@ public class RoutingContext { public final Map> map = new LinkedHashMap>(); public final Map reverseMap = new LinkedHashMap(); + // 0. Reference to native routingcontext for multiple routes + public long nativeRoutingContext; + public boolean keepNativeRoutingContext; + // 1. Initial variables public int startX; public int startY; + public long startRoadId; + public int startSegmentInd; public boolean startTransportStop; public int targetX; public int targetY; + public long targetRoadId; + public int targetSegmentInd; public boolean targetTransportStop; + public boolean publicTransport; - // deprecated - public long firstRoadId; - public int firstRoadDirection; + public RouteCalculationProgress calculationProgress; public boolean leftSideNavigation; public List previouslyCalculatedRoute; public PrecalculatedRouteDirection precalculatedRouteDirection; + // 2. Routing memory cache (big objects) TLongObjectHashMap> indexedSubregions = new TLongObjectHashMap>(); @@ -82,27 +88,15 @@ public class RoutingContext { public TileStatistics global = new TileStatistics(); // updated by route planner in bytes public int memoryOverhead = 0; - - - long timeNanoToCalcDeviation = 0; - long timeToLoad = 0; - long timeToLoadHeaders = 0; - long timeToFindInitialSegments = 0; - public long timeToCalculate = 0; - - int distinctLoadedTiles = 0; - int maxLoadedTiles = 0; - int loadedPrevUnloadedTiles = 0; - int unloadedTiles = 0; public float routingTime = 0; - public int loadedTiles = 0; - public int visitedSegments = 0; - public int relaxedSegments = 0; + // callback of processing segments RouteSegmentVisitor visitor = null; // old planner public FinalRouteSegment finalRouteSegment; + + RoutingContext(RoutingContext cp) { this.config = cp.config; @@ -201,12 +195,16 @@ public class RoutingContext { public void initStartAndTargetPoints(RouteSegment start, RouteSegment end) { initTargetPoint(end); startX = start.road.getPoint31XTile(start.getSegmentStart()); - startY = start.road.getPoint31YTile(start.getSegmentStart()); + startY = start.road.getPoint31YTile(start.getSegmentStart()); + startRoadId = start.road.getId(); + startSegmentInd = start.getSegmentStart(); } public void initTargetPoint(RouteSegment end) { targetX = end.road.getPoint31XTile(end.getSegmentStart()); targetY = end.road.getPoint31YTile(end.getSegmentStart()); + targetRoadId = end.road.getId(); + targetSegmentInd = end.getSegmentStart(); } public void unloadAllData() { @@ -218,7 +216,9 @@ public class RoutingContext { if (tl.isLoaded()) { if(except == null || except.searchSubregionTile(tl.subregion) < 0){ tl.unload(); - unloadedTiles ++; + if(calculationProgress != null) { + calculationProgress.unloadedTiles ++; + } global.size -= tl.tileStatistics.size; } } @@ -252,18 +252,6 @@ public class RoutingContext { return ind; } - public void newRoutingPoints() { - int middleX = startX / 2 + targetX / 2; - int middleY = startY / 2 + targetY; - List dataObjects = new ArrayList(); - loadTileData(middleX, middleY, 17, dataObjects); - - - System.out.println("Size of data objects " + dataObjects.size()); - } - - - public RouteSegment loadRouteSegment(int x31, int y31, long memoryLimit) { long tileId = getRoutingTile(x31, y31, memoryLimit); @@ -301,7 +289,8 @@ public class RoutingContext { if(excludeNotAllowed != null && !excludeNotAllowed.contains(ro.getId())) { ts.add(ro); } - } else if(excludeNotAllowed != null && ro.getId() > 0){ + } + if(excludeNotAllowed != null && ro.getId() > 0){ excludeNotAllowed.add(ro.getId()); if(ts.excludedIds == null ){ ts.excludedIds = new TLongHashSet(); @@ -314,27 +303,37 @@ public class RoutingContext { } catch (IOException e) { throw new RuntimeException("Loading data exception", e); } - - timeToLoad += (System.nanoTime() - now); + if (calculationProgress != null) { + calculationProgress.timeToLoad += (System.nanoTime() - now); + } } else { long now = System.nanoTime(); NativeRouteSearchResult ns = nativeLib.loadRouteRegion(ts.subregion, loadObjectsInMemory); // System.out.println(ts.subregion.shiftToData + " " + Arrays.toString(ns.objects)); ts.setLoadedNative(ns, this); - timeToLoad += (System.nanoTime() - now); + if (calculationProgress != null) { + calculationProgress.timeToLoad += (System.nanoTime() - now); + } } - loadedTiles++; + if (calculationProgress != null) { + calculationProgress.loadedTiles++; + } + if (wasUnloaded) { if(ucount == 1) { - loadedPrevUnloadedTiles++; + if(calculationProgress != null) { + calculationProgress.loadedPrevUnloadedTiles++; + } } } else { if(global != null) { global.allRoutes += ts.tileStatistics.allRoutes; global.coordinates += ts.tileStatistics.coordinates; } - distinctLoadedTiles++; + if (calculationProgress != null) { + calculationProgress.distinctLoadedTiles++; + } } global.size += ts.tileStatistics.size; } @@ -408,7 +407,9 @@ public class RoutingContext { } collection.add(found); } - timeToLoadHeaders += (System.nanoTime() - now); + if (calculationProgress != null) { + calculationProgress.timeToLoadHeaders += (System.nanoTime() - now); + } } } catch (IOException e) { throw new RuntimeException("Loading data exception", e); @@ -418,6 +419,10 @@ public class RoutingContext { } public void loadTileData(int x31, int y31, int zoomAround, final List toFillIn) { + loadTileData(x31, y31, zoomAround, toFillIn, false); + } + + public void loadTileData(int x31, int y31, int zoomAround, final List toFillIn, boolean allowDuplications) { int t = config.ZOOM_TO_LOAD_TILES - zoomAround; int coordinatesShift = (1 << (31 - config.ZOOM_TO_LOAD_TILES)); if(t <= 0) { @@ -428,7 +433,6 @@ public class RoutingContext { } TLongHashSet ts = new TLongHashSet(); - long now = System.nanoTime(); for(int i = -t; i <= t; i++) { for(int j = -t; j <= t; j++) { ts.add(getRoutingTile(x31 +i*coordinatesShift, y31 + j*coordinatesShift, 0)); @@ -436,10 +440,12 @@ public class RoutingContext { } TLongIterator it = ts.iterator(); TLongObjectHashMap excludeDuplications = new TLongObjectHashMap(); - while(it.hasNext()){ + while (it.hasNext()) { getAllObjects(it.next(), toFillIn, excludeDuplications); + if (allowDuplications) { + excludeDuplications.clear(); + } } - timeToFindInitialSegments += (System.nanoTime() - now); } @SuppressWarnings("unused") @@ -467,15 +473,14 @@ public class RoutingContext { long h2 = runGCUsedMemory(); float mb = (1 << 20); log.warn("Unload tiles : estimated " + (sz1 - sz2) / mb + " ?= " + (h1 - h2) / mb + " actual"); - log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb + " max " - + maxMemory() / mb); + log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb ); } else { float mb = (1 << 20); int sz2 = getCurrentEstimatedSize(); log.warn("Unload tiles : occupied before " + sz1 / mb + " Mb - now " + sz2 / mb + "MB " + memoryLimit / mb + " limit MB " + config.memoryLimitation / mb); long us2 = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()); - log.warn("Used memory before " + us1 / mb + "after " + us1 / mb + " of max " + maxMemory() / mb); + log.warn("Used memory before " + us1 / mb + "after " + us1 / mb ); } } if (!indexedSubregions.containsKey(tileId)) { @@ -507,12 +512,6 @@ public class RoutingContext { return tileId; } - private long maxMemory() { - // AVIAN FIXME -// return Runtime.getRuntime().maxMemory(); - return 0; - } - public boolean checkIfMemoryLimitCritical(long memoryLimit) { @@ -529,7 +528,9 @@ public class RoutingContext { loaded++; } } - maxLoadedTiles = Math.max(maxLoadedTiles, getCurrentlyLoadedTiles()); + if(calculationProgress != null) { + calculationProgress.maxLoadedTiles = Math.max(calculationProgress.maxLoadedTiles, getCurrentlyLoadedTiles()); + } Collections.sort(list, new Comparator() { private int pow(int base, int pw) { int r = 1; @@ -551,7 +552,9 @@ public class RoutingContext { i++; // System.out.println("Unload " + unload); unload.unload(); - unloadedTiles ++; + if(calculationProgress != null) { + calculationProgress.unloadedTiles ++; + } global.size -= unload.tileStatistics.size; // tile could be cleaned from routing tiles and deleted from whole list @@ -802,7 +805,31 @@ public class RoutingContext { return map.keySet().toArray(new BinaryMapIndexReader[map.size()]); } - + public int getVisitedSegments() { + if(calculationProgress != null) { + return calculationProgress.visitedSegments; + } + return 0; + } + public int getLoadedTiles() { + if (calculationProgress != null) { + return calculationProgress.loadedTiles; + } + return 0; + } + + public synchronized void deleteNativeRoutingContext() { + if (nativeRoutingContext != 0) { + NativeLibrary.deleteNativeRoutingContext(nativeRoutingContext); + } + nativeRoutingContext = 0; + } + + @Override + protected void finalize() throws Throwable { + deleteNativeRoutingContext(); + super.finalize(); + } } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java b/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java index 78222819d9..95e2e0d15c 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java @@ -236,13 +236,13 @@ public class TestRouting { throw new IllegalArgumentException(MessageFormat.format("Complete routing time (expected) {0} != {1} (original) : {2}", routing_time, calcRoutingTime, testDescription)); } - if (visitedSegments > 0 && !isInOrLess(visitedSegments, ctx.visitedSegments, percent)) { + if (visitedSegments > 0 && !isInOrLess(visitedSegments, ctx.getVisitedSegments(), percent)) { throw new IllegalArgumentException(MessageFormat.format("Visited segments (expected) {0} != {1} (original) : {2}", visitedSegments, - ctx.visitedSegments, testDescription)); + ctx.getVisitedSegments(), testDescription)); } - if (loadedTiles > 0 && !isInOrLess(loadedTiles, ctx.loadedTiles, percent)) { + if (loadedTiles > 0 && !isInOrLess(loadedTiles, ctx.getLoadedTiles(), percent)) { throw new IllegalArgumentException(MessageFormat.format("Loaded tiles (expected) {0} != {1} (original) : {2}", loadedTiles, - ctx.loadedTiles, testDescription)); + ctx.getLoadedTiles(), testDescription)); } if(TEST_BOTH_DIRECTION){ diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutePlanner.java b/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutePlanner.java index c7fcf5163e..79fd6501ac 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutePlanner.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutePlanner.java @@ -2,26 +2,16 @@ package net.osmand.router; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; -import java.util.Map; +import java.util.Locale; import java.util.PriorityQueue; -import gnu.trove.iterator.TIntIterator; import gnu.trove.list.array.TIntArrayList; -import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.map.hash.TLongObjectHashMap; -import net.osmand.NativeLibrary; -import net.osmand.binary.BinaryMapIndexReader; -import net.osmand.binary.BinaryMapIndexReader.SearchRequest; -import net.osmand.data.IncompleteTransportRoute; + import net.osmand.data.LatLon; import net.osmand.data.QuadRect; import net.osmand.data.TransportRoute; @@ -35,7 +25,7 @@ import net.osmand.util.MapUtils; public class TransportRoutePlanner { private static final boolean MEASURE_TIME = false; - private static final int MISSING_STOP_SEARCH_RADIUS = 15000; + private static final int MIN_DIST_STOP_TO_GEOMETRY = 150; public static final long GEOMETRY_WAY_ID = -1; public static final long STOPS_WAY_ID = -2; @@ -220,11 +210,10 @@ public class TransportRoutePlanner { } } - private List prepareResults(TransportRoutingContext ctx, List results) { Collections.sort(results, new SegmentsComparator(ctx)); List lst = new ArrayList(); - System.out.println(String.format("Calculated %.1f seconds, found %d results, visited %d routes / %d stops, loaded %d tiles (%d ms read, %d ms total), loaded ways %d (%d wrong)", + System.out.println(String.format(Locale.US, "Calculated %.1f seconds, found %d results, visited %d routes / %d stops, loaded %d tiles (%d ms read, %d ms total), loaded ways %d (%d wrong)", (System.currentTimeMillis() - ctx.startCalcTime) / 1000.0, results.size(), ctx.visitedRoutesCount, ctx.visitedStops, ctx.quadTree.size(), ctx.readTime / (1000 * 1000), ctx.loadTime / (1000 * 1000), @@ -310,7 +299,6 @@ public class TransportRoutePlanner { } } - public static class TransportRouteResultSegment { private static final boolean DISPLAY_FULL_SEGMENT_ROUTE = false; @@ -440,7 +428,7 @@ public class TransportRoutePlanner { Node ln = startInd.way.getLastNode(); Node fn = endInd.way.getFirstNode(); // HERE we need to check other ways for continuation - if (ln != null && fn != null && MapUtils.getDistance(ln.getLatLon(), fn.getLatLon()) < MISSING_STOP_SEARCH_RADIUS) { + if (ln != null && fn != null && MapUtils.getDistance(ln.getLatLon(), fn.getLatLon()) < TransportStopsRouteReader.MISSING_STOP_SEARCH_RADIUS) { validContinuation = true; } else { validContinuation = false; @@ -482,157 +470,13 @@ public class TransportRoutePlanner { return route.getForwardStops().get(i); } } - - public static class TransportRouteResult { - - List segments = new ArrayList(4); - double finishWalkDist; - double routeTime; - private final TransportRoutingConfiguration cfg; - - public TransportRouteResult(TransportRoutingContext ctx) { - cfg = ctx.cfg; - } - public TransportRouteResult(TransportRoutingConfiguration cfg) { - this.cfg = cfg; - } - - public List getSegments() { - return segments; - } - - public void setFinishWalkDist(double finishWalkDist) { - this.finishWalkDist = finishWalkDist; - } - - public void setRouteTime(double routeTime) { - this.routeTime = routeTime; - } - - public void addSegment(TransportRouteResultSegment seg) { - segments.add(seg); - } - - public double getWalkDist() { - double d = finishWalkDist; - for (TransportRouteResultSegment s : segments) { - d += s.walkDist; - } - return d; - } - - public double getFinishWalkDist() { - return finishWalkDist; - } - - public double getWalkSpeed() { - return cfg.walkSpeed; - } - - public double getRouteTime() { - return routeTime; - } - - public int getStops() { - int stops = 0; - for(TransportRouteResultSegment s : segments) { - stops += (s.end - s.start); - } - return stops; - } - - public boolean isRouteStop(TransportStop stop) { - for(TransportRouteResultSegment s : segments) { - if (s.getTravelStops().contains(stop)) { - return true; - } - } - return false; - } - - public TransportRouteResultSegment getRouteStopSegment(TransportStop stop) { - for(TransportRouteResultSegment s : segments) { - if (s.getTravelStops().contains(stop)) { - return s; - } - } - return null; - } - - public double getTravelDist() { - double d = 0; - for (TransportRouteResultSegment s : segments) { - d += s.getTravelDist(); - } - return d; - } - - public double getTravelTime() { - double t = 0; - for (TransportRouteResultSegment s : segments) { - if (cfg.useSchedule) { - TransportSchedule sts = s.route.getSchedule(); - for (int k = s.start; k < s.end; k++) { - t += sts.getAvgStopIntervals()[k] * 10; - } - } else { - t += cfg.getBoardingTime(); - t += s.getTravelTime(); - } - } - return t; - } - - public double getWalkTime() { - return getWalkDist() / cfg.walkSpeed; - } - - public double getChangeTime() { - return cfg.getChangeTime(); - } - - public double getBoardingTime() { - return cfg.getBoardingTime(); - } - - public int getChanges() { - return segments.size() - 1; - } - - @Override - public String toString() { - StringBuilder bld = new StringBuilder(); - bld.append(String.format("Route %d stops, %d changes, %.2f min: %.2f m (%.1f min) to walk, %.2f m (%.1f min) to travel\n", - getStops(), getChanges(), routeTime / 60, getWalkDist(), getWalkTime() / 60.0, - getTravelDist(), getTravelTime() / 60.0)); - for(int i = 0; i < segments.size(); i++) { - TransportRouteResultSegment s = segments.get(i); - String time = ""; - String arriveTime = ""; - if(s.depTime != -1) { - time = String.format("at %s", formatTransporTime(s.depTime)); - } - int aTime = s.getArrivalTime(); - if(aTime != -1) { - arriveTime = String.format("and arrive at %s", formatTransporTime(aTime)); - } - bld.append(String.format(" %d. %s [%d]: walk %.1f m to '%s' and travel %s to '%s' by %s %d stops %s\n", - i + 1, s.route.getRef(), s.route.getId() / 2, s.walkDist, s.getStart().getName(), - time, s.getEnd().getName(),s.route.getName(), (s.end - s.start), arriveTime)); - } - bld.append(String.format(" F. Walk %.1f m to reach your destination", finishWalkDist)); - return bld.toString(); - } - } - - public static String formatTransporTime(int i) { + public static String formatTransportTime(int i) { int h = i / 60 / 6; int mh = i - h * 60 * 6; int m = mh / 6; int s = (mh - m * 6) * 10; - String tm = String.format("%02d:%02d:%02d ", h, m, s); - return tm; + return String.format(Locale.US, "%02d:%02d:%02d ", h, m, s); } public static class TransportRouteSegment { @@ -649,13 +493,9 @@ public class TransportRoutePlanner { double parentTravelDist; // travel distance for parent route (inaccurate) // walk distance to start route location (or finish in case last segment) double walkDist = 0; - // main field accumulated all time spent from beginning of journey double distFromStart = 0; - - - public TransportRouteSegment(TransportRoute road, int stopIndex) { this.road = road; this.segStart = (short) stopIndex; @@ -673,8 +513,7 @@ public class TransportRoutePlanner { this.segStart = c.segStart; this.departureTime = c.departureTime; } - - + public boolean wasVisited(TransportRouteSegment rrs) { if (rrs.road.getId().longValue() == road.getId().longValue() && rrs.departureTime == departureTime) { @@ -686,22 +525,18 @@ public class TransportRoutePlanner { return false; } - public TransportStop getStop(int i) { return road.getForwardStops().get(i); } - public LatLon getLocation() { return road.getForwardStops().get(segStart).getLocation(); } - public int getLength() { return road.getForwardStops().size(); } - public long getId() { long l = road.getId(); @@ -723,7 +558,6 @@ public class TransportRoutePlanner { return l ; } - public int getDepth() { if(parentRoute != null) { return parentRoute.getDepth() + 1; @@ -734,529 +568,13 @@ public class TransportRoutePlanner { @Override public String toString() { return String.format("Route: %s, stop: %s %s", road.getName(), road.getForwardStops().get(segStart).getName(), - departureTime == -1 ? "" : formatTransporTime(departureTime) ); - } - - } - - public static class TransportRoutingContext { - - public NativeLibrary library; - public RouteCalculationProgress calculationProgress; - public TLongObjectHashMap visitedSegments = new TLongObjectHashMap(); - public TransportRoutingConfiguration cfg; - public TLongObjectHashMap combinedRoutesCache = new TLongObjectHashMap(); - public Map> missingStopsCache = new HashMap>(); - - public TLongObjectHashMap> quadTree; - // Here we don't limit files by bbox, so it could be an issue while searching for multiple unused files - // Incomplete routes usually don't need more files than around Max-BBOX of start/end, - // so here an improvement could be introduced - public final Map> routeMap = - new LinkedHashMap>(); - - public int finishTimeSeconds; - - // stats - public long startCalcTime; - public int visitedRoutesCount; - public int visitedStops; - public int wrongLoadedWays; - public int loadedWays; - public long loadTime; - public long readTime; - - - - private final int walkRadiusIn31; - private final int walkChangeRadiusIn31; - - - - public TransportRoutingContext(TransportRoutingConfiguration cfg, NativeLibrary library, BinaryMapIndexReader... readers) { - this.cfg = cfg; - walkRadiusIn31 = (int) (cfg.walkRadius / MapUtils.getTileDistanceWidth(31)); - walkChangeRadiusIn31 = (int) (cfg.walkChangeRadius / MapUtils.getTileDistanceWidth(31)); - quadTree = new TLongObjectHashMap>(); - this.library = library; - for (BinaryMapIndexReader r : readers) { - routeMap.put(r, new TIntObjectHashMap()); - } - } - - public List getTransportStops(LatLon loc) throws IOException { - int y = MapUtils.get31TileNumberY(loc.getLatitude()); - int x = MapUtils.get31TileNumberX(loc.getLongitude()); - return getTransportStops(x, y, false, new ArrayList()); - } - - public List getTransportStops(int x, int y, boolean change, List res) throws IOException { - return loadNativeTransportStops(x, y, change, res); - } - - private List loadNativeTransportStops(int sx, int sy, boolean change, List res) throws IOException { - long nanoTime = System.nanoTime(); - int d = change ? walkChangeRadiusIn31 : walkRadiusIn31; - int lx = (sx - d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); - int rx = (sx + d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); - int ty = (sy - d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); - int by = (sy + d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); - for(int x = lx; x <= rx; x++) { - for(int y = ty; y <= by; y++) { - long tileId = (((long)x) << (cfg.ZOOM_TO_LOAD_TILES + 1)) + y; - List list = quadTree.get(tileId); - if(list == null) { - list = loadTile(x, y); - quadTree.put(tileId, list); - } - for(TransportRouteSegment r : list) { - TransportStop st = r.getStop(r.segStart); - if (Math.abs(st.x31 - sx) > walkRadiusIn31 || Math.abs(st.y31 - sy) > walkRadiusIn31) { - wrongLoadedWays++; - } else { - loadedWays++; - res.add(r); - } - } - } - } - loadTime += System.nanoTime() - nanoTime; - return res; - } - - - private List loadTile(int x, int y) throws IOException { - long nanoTime = System.nanoTime(); - List lst = new ArrayList(); - int pz = (31 - cfg.ZOOM_TO_LOAD_TILES); - SearchRequest sr = BinaryMapIndexReader.buildSearchTransportRequest(x << pz, (x + 1) << pz, - y << pz, (y + 1) << pz, -1, null); - - // could be global ? - TLongObjectHashMap loadedTransportStops = new TLongObjectHashMap(); - TIntObjectHashMap localFileRoutes = new TIntObjectHashMap<>(); //reference, route - for (BinaryMapIndexReader r : routeMap.keySet()) { - sr.clearSearchResults(); - List stops = r.searchTransportIndex(sr); - - localFileRoutes.clear(); - mergeTransportStops(r, loadedTransportStops, stops, localFileRoutes, routeMap.get(r)); - - for (TransportStop stop : stops) { - // skip missing stops - if (stop.isMissingStop()) { - continue; - } - long stopId = stop.getId(); - TransportStop multifileStop = loadedTransportStops.get(stopId); - int[] rrs = stop.getReferencesToRoutes(); - // clear up so it won't be used as it is multi file stop - stop.setReferencesToRoutes(null); - if (rrs != null && !multifileStop.isDeleted()) { - for (int rr : rrs) { - TransportRoute route = localFileRoutes.get(rr); - if (route == null) { - System.err.println( - String.format("Something went wrong by loading combined route %d for stop %s", - rr, stop)); - } else { - TransportRoute combinedRoute = getCombinedRoute(route); - if (multifileStop == stop || (!multifileStop.hasRoute(combinedRoute.getId()) && - !multifileStop.isRouteDeleted(combinedRoute.getId()))) { - // duplicates won't be added - multifileStop.addRouteId(combinedRoute.getId()); - multifileStop.addRoute(combinedRoute); - } - } - } - } - } - } - // There should go stops with complete routes: - loadTransportSegments(loadedTransportStops.valueCollection(), lst); - - readTime += System.nanoTime() - nanoTime; - return lst; - } - - - public static List mergeTransportStops(BinaryMapIndexReader reader, - TLongObjectHashMap loadedTransportStops, - List stops, - TIntObjectHashMap localFileRoutes, - TIntObjectHashMap loadedRoutes - ) throws IOException { - TIntArrayList routesToLoad = new TIntArrayList(); - TIntArrayList localRoutesToLoad = new TIntArrayList(); - Iterator it = stops.iterator(); - while (it.hasNext()) { - TransportStop stop = it.next(); - long stopId = stop.getId(); - localRoutesToLoad.clear(); - TransportStop multifileStop = loadedTransportStops.get(stopId); - long[] routesIds = stop.getRoutesIds(); - long[] delRIds = stop.getDeletedRoutesIds(); - if (multifileStop == null) { - loadedTransportStops.put(stopId, stop); - multifileStop = stop; - if(!stop.isDeleted()) { - localRoutesToLoad.addAll(stop.getReferencesToRoutes()); - } - } else if (multifileStop.isDeleted()){ - // stop has nothing to load, so not needed - it.remove(); - } else { - if (delRIds != null) { - for (long deletedRouteId : delRIds) { - multifileStop.addDeletedRouteId(deletedRouteId); - } - } - if (routesIds != null && routesIds.length > 0) { - int[] refs = stop.getReferencesToRoutes(); - for (int i = 0; i < routesIds.length; i++) { - long routeId = routesIds[i]; - if (!multifileStop.hasRoute(routeId) && !multifileStop.isRouteDeleted(routeId)) { - localRoutesToLoad.add(refs[i]); - } - } - } else { - if (stop.hasReferencesToRoutes()) { - // old format - localRoutesToLoad.addAll(stop.getReferencesToRoutes()); - } else { - // stop has noting to load, so not needed - it.remove(); - } - } - } - routesToLoad.addAll(localRoutesToLoad); - multifileStop.putReferencesToRoutes(reader.getFile().getName(), localRoutesToLoad.toArray()); //add valid stop and references to routes - } - - // load/combine routes - if (routesToLoad.size() > 0) { - routesToLoad.sort(); - TIntArrayList referencesToLoad = new TIntArrayList(); - TIntIterator itr = routesToLoad.iterator(); - int p = routesToLoad.get(0) + 1; // different - while (itr.hasNext()) { - int nxt = itr.next(); - if (p != nxt) { - if (localFileRoutes != null && loadedRoutes != null && loadedRoutes.contains(nxt)) { //check if - localFileRoutes.put(nxt, loadedRoutes.get(nxt)); - } else { - referencesToLoad.add(nxt); - } - } - } - if (localFileRoutes != null && loadedRoutes != null) { - reader.loadTransportRoutes(referencesToLoad.toArray(), localFileRoutes); - loadedRoutes.putAll(localFileRoutes); - } - } - - return stops; - } - - private TransportRoute getCombinedRoute(TransportRoute route) throws IOException { - if (!route.isIncomplete()) { - return route; - } - TransportRoute c = combinedRoutesCache.get(route.getId()); - if (c == null) { - c = combineRoute(route); - combinedRoutesCache.put(route.getId(), c); - } - return c; - } - - private TransportRoute combineRoute(TransportRoute route) throws IOException { - // 1. Get all available route parts; - List incompleteRoutes = findIncompleteRouteParts(route); - if (incompleteRoutes == null) { - return route; - } - // here could be multiple overlays between same points - // It's better to remove them especially identical segments - List allWays = getAllWays(incompleteRoutes); - - - // 2. Get array of segments (each array size > 1): - LinkedList> stopSegments = parseRoutePartsToSegments(incompleteRoutes); - - // 3. Merge segments and remove excess missingStops (when they are closer then MISSING_STOP_SEARCH_RADIUS): - // + Check for missingStops. If they present in the middle/there more then one segment - we have a hole in the map data - List> mergedSegments = combineSegmentsOfSameRoute(stopSegments); - - // 4. Now we need to properly sort segments, proper sorting is minimizing distance between stops - // So it is salesman problem, we have this solution at TspAnt, but if we know last or first segment we can solve it straightforward - List firstSegment = null; - List lastSegment = null; - for(List l : mergedSegments) { - if(!l.get(0).isMissingStop()) { - firstSegment = l; - } - if(!l.get(l.size() - 1).isMissingStop()) { - lastSegment = l; - } - } - List> sortedSegments = new ArrayList>(); - if(firstSegment != null) { - sortedSegments.add(firstSegment); - mergedSegments.remove(firstSegment); - while(!mergedSegments.isEmpty()) { - List last = sortedSegments.get(sortedSegments.size() - 1); - List add = findAndDeleteMinDistance(last.get(last.size() - 1).getLocation(), mergedSegments, true); - sortedSegments.add(add); - } - - } else if(lastSegment != null) { - sortedSegments.add(lastSegment); - mergedSegments.remove(lastSegment); - while(!mergedSegments.isEmpty()) { - List first = sortedSegments.get(0); - List add = findAndDeleteMinDistance(first.get(0).getLocation(), mergedSegments, false); - sortedSegments.add(0, add); - } - } else { - sortedSegments = mergedSegments; - } - List finalList = new ArrayList(); - for(List s : sortedSegments) { - finalList.addAll(s); - } - // 5. Create combined TransportRoute and return it - return new TransportRoute(route, finalList, allWays); - } - - private List findAndDeleteMinDistance(LatLon location, List> mergedSegments, - boolean attachToBegin) { - int ind = attachToBegin ? 0 : mergedSegments.get(0).size() - 1; - double minDist = MapUtils.getDistance(mergedSegments.get(0).get(ind).getLocation(), location); - int minInd = 0; - for(int i = 1; i < mergedSegments.size(); i++) { - ind = attachToBegin ? 0 : mergedSegments.get(i).size() - 1; - double dist = MapUtils.getDistance(mergedSegments.get(i).get(ind).getLocation(), location); - if(dist < minDist) { - minInd = i; - } - } - return mergedSegments.remove(minInd); - } - - private List getAllWays(List parts) { - List w = new ArrayList(); - for (TransportRoute t : parts) { - w.addAll(t.getForwardWays()); - } - return w; - } - - - - private List> combineSegmentsOfSameRoute(LinkedList> segments) { - List> resultSegments = new ArrayList>(); - while (!segments.isEmpty()) { - List firstSegment = segments.poll(); - boolean merged = true; - while (merged) { - merged = false; - Iterator> it = segments.iterator(); - while (it.hasNext()) { - List segmentToMerge = it.next(); - merged = tryToMerge(firstSegment, segmentToMerge); - - if (merged) { - it.remove(); - break; - } - } - } - resultSegments.add(firstSegment); - } - return resultSegments; - } - - private boolean tryToMerge(List firstSegment, List segmentToMerge) { - if(firstSegment.size() < 2 || segmentToMerge.size() < 2) { - return false; - } - // 1st we check that segments overlap by stop - int commonStopFirst = 0; - int commonStopSecond = 0; - boolean found = false; - for(;commonStopFirst < firstSegment.size(); commonStopFirst++) { - for(commonStopSecond = 0; commonStopSecond < segmentToMerge.size() && !found; commonStopSecond++) { - long lid1 = firstSegment.get(commonStopFirst).getId(); - long lid2 = segmentToMerge.get(commonStopSecond).getId(); - if(lid1 > 0 && lid2 == lid1) { - found = true; - break; - } - } - if(found) { - // important to increment break inside loop - break; - } - } - if(found && commonStopFirst < firstSegment.size()) { - // we've found common stop so we can merge based on stops - // merge last part first - int leftPartFirst = firstSegment.size() - commonStopFirst; - int leftPartSecond = segmentToMerge.size() - commonStopSecond; - if(leftPartFirst < leftPartSecond || (leftPartFirst == leftPartSecond && - firstSegment.get(firstSegment.size() - 1).isMissingStop())) { - while(firstSegment.size() > commonStopFirst) { - firstSegment.remove(firstSegment.size() - 1); - } - for(int i = commonStopSecond; i < segmentToMerge.size(); i++) { - firstSegment.add(segmentToMerge.get(i)); - } - } - // merge first part - if(commonStopFirst < commonStopSecond || (commonStopFirst == commonStopSecond && - firstSegment.get(0).isMissingStop())) { - for(int i = 0; i < commonStopFirst; i++) { - firstSegment.remove(0); - } - for(int i = commonStopSecond; i >= 0; i--) { - firstSegment.add(0, segmentToMerge.get(i)); - } - } - return true; - - } - // no common stops, so try to connect to the end or beginning - // beginning - boolean merged = false; - if (MapUtils.getDistance(firstSegment.get(0).getLocation(), - segmentToMerge.get(segmentToMerge.size() - 1).getLocation()) < MISSING_STOP_SEARCH_RADIUS) { - firstSegment.remove(0); - for(int i = segmentToMerge.size() - 2; i >= 0; i--) { - firstSegment.add(0, segmentToMerge.get(i)); - } - merged = true; - } else if(MapUtils.getDistance(firstSegment.get(firstSegment.size() - 1).getLocation(), - segmentToMerge.get(0).getLocation()) < MISSING_STOP_SEARCH_RADIUS) { - firstSegment.remove(firstSegment.size() - 1); - for(int i = 1; i < segmentToMerge.size(); i++) { - firstSegment.add(segmentToMerge.get(i)); - } - merged = true; - } - return merged; - } - - - - private LinkedList> parseRoutePartsToSegments(List routeParts) { - LinkedList> segs = new LinkedList>(); - // here we assume that missing stops come in pairs - // we don't add segments with 1 stop cause they are irrelevant further - for (TransportRoute part : routeParts) { - List newSeg = new ArrayList(); - for (TransportStop s : part.getForwardStops()) { - newSeg.add(s); - if (s.isMissingStop()) { - if (newSeg.size() > 1) { - segs.add(newSeg); - newSeg = new ArrayList(); - } - } - } - if (newSeg.size() > 1) { - segs.add(newSeg); - } - } - return segs; - } - - private List findIncompleteRouteParts(TransportRoute baseRoute) throws IOException { - List allRoutes = null; - for (BinaryMapIndexReader bmir : routeMap.keySet()) { - // here we could limit routeMap indexes by only certain bbox around start / end (check comment on field) - IncompleteTransportRoute ptr = bmir.getIncompleteTransportRoutes().get(baseRoute.getId()); - if (ptr != null) { - TIntArrayList lst = new TIntArrayList(); - while(ptr != null) { - lst.add(ptr.getRouteOffset()); - ptr = ptr.getNextLinkedRoute(); - } - if(lst.size() > 0) { - if(allRoutes == null) { - allRoutes = new ArrayList(); - } - allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection()); - } - } - } - return allRoutes; - } - - private void loadTransportSegments(Collection stops, List lst) throws IOException { - for(TransportStop s : stops) { - if (s.isDeleted() || s.getRoutes() == null) { - continue; - } - for (TransportRoute route : s.getRoutes()) { - int stopIndex = -1; - double dist = TransportRoute.SAME_STOP; - for (int k = 0; k < route.getForwardStops().size(); k++) { - TransportStop st = route.getForwardStops().get(k); - if(st.getId().longValue() == s.getId().longValue() ) { - stopIndex = k; - break; - } - double d = MapUtils.getDistance(st.getLocation(), s.getLocation()); - if (d < dist) { - stopIndex = k; - dist = d; - } - } - if (stopIndex != -1) { - if (cfg.useSchedule) { - loadScheduleRouteSegment(lst, route, stopIndex); - } else { - TransportRouteSegment segment = new TransportRouteSegment(route, stopIndex); - lst.add(segment); - } - } else { - // MapUtils.getDistance(s.getLocation(), route.getForwardStops().get(158).getLocation()); - System.err.println(String.format("Routing error: missing stop '%s' in route '%s' id: %d", - s.toString(), route.getRef(), route.getId() / 2)); - } - } - } - } - - private void loadScheduleRouteSegment(List lst, TransportRoute route, int stopIndex) { - if(route.getSchedule() != null) { - TIntArrayList ti = route.getSchedule().tripIntervals; - int cnt = ti.size(); - int t = 0; - // improve by using exact data - int stopTravelTime = 0; - TIntArrayList avgStopIntervals = route.getSchedule().avgStopIntervals; - for (int i = 0; i < stopIndex; i++) { - if (avgStopIntervals.size() > i) { - stopTravelTime += avgStopIntervals.getQuick(i); - } - } - for(int i = 0; i < cnt; i++) { - t += ti.getQuick(i); - int startTime = t + stopTravelTime; - if(startTime >= cfg.scheduleTimeOfDay && startTime <= cfg.scheduleTimeOfDay + cfg.scheduleMaxTime ) { - TransportRouteSegment segment = new TransportRouteSegment(route, stopIndex, startTime); - lst.add(segment); - } - } - } + departureTime == -1 ? "" : formatTransportTime(departureTime) ); } } public static List convertToTransportRoutingResult(NativeTransportRoutingResult[] res, - TransportRoutingConfiguration cfg) { - //cache for converted TransportRoutes: + TransportRoutingConfiguration cfg) { + // cache for converted TransportRoutes: TLongObjectHashMap convertedRoutesCache = new TLongObjectHashMap<>(); TLongObjectHashMap convertedStopsCache = new TLongObjectHashMap<>(); @@ -1290,8 +608,8 @@ public class TransportRoutePlanner { } private static TransportRoute convertTransportRoute(NativeTransportRoute nr, - TLongObjectHashMap convertedRoutesCache, - TLongObjectHashMap convertedStopsCache) { + TLongObjectHashMap convertedRoutesCache, + TLongObjectHashMap convertedStopsCache) { TransportRoute r = new TransportRoute(); r.setId(nr.id); r.setLocation(nr.routeLat, nr.routeLon); @@ -1310,10 +628,10 @@ public class TransportRoutePlanner { r.setDist(nr.dist); r.setColor(nr.color); - if (nr.intervals != null && nr.intervals.length > 0 && nr.avgStopIntervals !=null + if (nr.intervals != null && nr.intervals.length > 0 && nr.avgStopIntervals != null && nr.avgStopIntervals.length > 0 && nr.avgWaitIntervals != null && nr.avgWaitIntervals.length > 0) { - r.setSchedule(new TransportSchedule(new TIntArrayList(nr.intervals), - new TIntArrayList(nr.avgStopIntervals), new TIntArrayList(nr.avgWaitIntervals))); + r.setSchedule(new TransportSchedule(new TIntArrayList(nr.intervals), new TIntArrayList(nr.avgStopIntervals), + new TIntArrayList(nr.avgWaitIntervals))); } for (int i = 0; i < nr.waysIds.length; i++) { @@ -1331,7 +649,7 @@ public class TransportRoutePlanner { } private static List convertTransportStops(NativeTransportStop[] nstops, - TLongObjectHashMap convertedStopsCache) { + TLongObjectHashMap convertedStopsCache) { List stops = new ArrayList<>(); for (NativeTransportStop ns : nstops) { if (convertedStopsCache != null && convertedStopsCache.get(ns.id) != null) { @@ -1358,16 +676,11 @@ public class TransportRoutePlanner { if (ns.pTStopExit_refs != null && ns.pTStopExit_refs.length > 0) { for (int i = 0; i < ns.pTStopExit_refs.length; i++) { - s.addExit(new TransportStopExit(ns.pTStopExit_x31s[i], - ns.pTStopExit_y31s[i], ns.pTStopExit_refs[i])); + s.addExit( + new TransportStopExit(ns.pTStopExit_x31s[i], ns.pTStopExit_y31s[i], ns.pTStopExit_refs[i])); } } - if (ns.referenceToRoutesKeys != null && ns.referenceToRoutesKeys.length > 0) { - for (int i = 0; i < ns.referenceToRoutesKeys.length; i++) { - s.putReferencesToRoutes(ns.referenceToRoutesKeys[i], ns.referenceToRoutesVals[i]); - } - } if (convertedStopsCache == null) { convertedStopsCache = new TLongObjectHashMap<>(); } @@ -1378,4 +691,7 @@ public class TransportRoutePlanner { } return stops; } + + + } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TransportRouteResult.java b/OsmAnd-java/src/main/java/net/osmand/router/TransportRouteResult.java new file mode 100644 index 0000000000..9b45637970 --- /dev/null +++ b/OsmAnd-java/src/main/java/net/osmand/router/TransportRouteResult.java @@ -0,0 +1,151 @@ +package net.osmand.router; + +import net.osmand.data.TransportSchedule; +import net.osmand.data.TransportStop; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class TransportRouteResult { + + List segments = new ArrayList(4); + double finishWalkDist; + double routeTime; + private final TransportRoutingConfiguration cfg; + + public TransportRouteResult(TransportRoutingContext ctx) { + cfg = ctx.cfg; + } + + public TransportRouteResult(TransportRoutingConfiguration cfg) { + this.cfg = cfg; + } + + public List getSegments() { + return segments; + } + + public void setFinishWalkDist(double finishWalkDist) { + this.finishWalkDist = finishWalkDist; + } + + public void setRouteTime(double routeTime) { + this.routeTime = routeTime; + } + + public void addSegment(TransportRoutePlanner.TransportRouteResultSegment seg) { + segments.add(seg); + } + + public double getWalkDist() { + double d = finishWalkDist; + for (TransportRoutePlanner.TransportRouteResultSegment s : segments) { + d += s.walkDist; + } + return d; + } + + public double getFinishWalkDist() { + return finishWalkDist; + } + + public double getWalkSpeed() { + return cfg.walkSpeed; + } + + public double getRouteTime() { + return routeTime; + } + + public int getStops() { + int stops = 0; + for(TransportRoutePlanner.TransportRouteResultSegment s : segments) { + stops += (s.end - s.start); + } + return stops; + } + + public boolean isRouteStop(TransportStop stop) { + for(TransportRoutePlanner.TransportRouteResultSegment s : segments) { + if (s.getTravelStops().contains(stop)) { + return true; + } + } + return false; + } + + public TransportRoutePlanner.TransportRouteResultSegment getRouteStopSegment(TransportStop stop) { + for(TransportRoutePlanner.TransportRouteResultSegment s : segments) { + if (s.getTravelStops().contains(stop)) { + return s; + } + } + return null; + } + + public double getTravelDist() { + double d = 0; + for (TransportRoutePlanner.TransportRouteResultSegment s : segments) { + d += s.getTravelDist(); + } + return d; + } + + public double getTravelTime() { + double t = 0; + for (TransportRoutePlanner.TransportRouteResultSegment s : segments) { + if (cfg.useSchedule) { + TransportSchedule sts = s.route.getSchedule(); + for (int k = s.start; k < s.end; k++) { + t += sts.getAvgStopIntervals()[k] * 10; + } + } else { + t += cfg.getBoardingTime(); + t += s.getTravelTime(); + } + } + return t; + } + + public double getWalkTime() { + return getWalkDist() / cfg.walkSpeed; + } + + public double getChangeTime() { + return cfg.getChangeTime(); + } + + public double getBoardingTime() { + return cfg.getBoardingTime(); + } + + public int getChanges() { + return segments.size() - 1; + } + + @Override + public String toString() { + StringBuilder bld = new StringBuilder(); + bld.append(String.format(Locale.US, "Route %d stops, %d changes, %.2f min: %.2f m (%.1f min) to walk, %.2f m (%.1f min) to travel\n", + getStops(), getChanges(), routeTime / 60, getWalkDist(), getWalkTime() / 60.0, + getTravelDist(), getTravelTime() / 60.0)); + for(int i = 0; i < segments.size(); i++) { + TransportRoutePlanner.TransportRouteResultSegment s = segments.get(i); + String time = ""; + String arriveTime = ""; + if(s.depTime != -1) { + time = String.format("at %s", TransportRoutePlanner.formatTransportTime(s.depTime)); + } + int aTime = s.getArrivalTime(); + if(aTime != -1) { + arriveTime = String.format("and arrive at %s", TransportRoutePlanner.formatTransportTime(aTime)); + } + bld.append(String.format(Locale.US, " %d. %s [%d]: walk %.1f m to '%s' and travel %s to '%s' by %s %d stops %s\n", + i + 1, s.route.getRef(), s.route.getId() / 2, s.walkDist, s.getStart().getName(), + time, s.getEnd().getName(),s.route.getName(), (s.end - s.start), arriveTime)); + } + bld.append(String.format(" F. Walk %.1f m to reach your destination", finishWalkDist)); + return bld.toString(); + } +} diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutingContext.java b/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutingContext.java new file mode 100644 index 0000000000..94039af146 --- /dev/null +++ b/OsmAnd-java/src/main/java/net/osmand/router/TransportRoutingContext.java @@ -0,0 +1,171 @@ +package net.osmand.router; + +import net.osmand.NativeLibrary; +import net.osmand.binary.BinaryMapIndexReader; +import net.osmand.data.LatLon; +import net.osmand.data.TransportRoute; +import net.osmand.data.TransportStop; +import net.osmand.router.TransportRoutePlanner.TransportRouteSegment; +import net.osmand.util.MapUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.hash.TLongObjectHashMap; + +public class TransportRoutingContext { + + public NativeLibrary library; + public RouteCalculationProgress calculationProgress; + public TLongObjectHashMap visitedSegments = new TLongObjectHashMap(); + public TransportRoutingConfiguration cfg; + public TLongObjectHashMap combinedRoutesCache = new TLongObjectHashMap(); + public Map> missingStopsCache = new HashMap>(); + + public TLongObjectHashMap> quadTree; + // Here we don't limit files by bbox, so it could be an issue while searching for multiple unused files + // Incomplete routes usually don't need more files than around Max-BBOX of start/end, + // so here an improvement could be introduced + final TransportStopsRouteReader transportStopsReader; + public int finishTimeSeconds; + + // stats + public long startCalcTime; + public int visitedRoutesCount; + public int visitedStops; + public int wrongLoadedWays; + public int loadedWays; + public long loadTime; + public long readTime; + + private final int walkRadiusIn31; + private final int walkChangeRadiusIn31; + + public TransportRoutingContext(TransportRoutingConfiguration cfg, NativeLibrary library, BinaryMapIndexReader... readers) { + this.cfg = cfg; + walkRadiusIn31 = (int) (cfg.walkRadius / MapUtils.getTileDistanceWidth(31)); + walkChangeRadiusIn31 = (int) (cfg.walkChangeRadius / MapUtils.getTileDistanceWidth(31)); + quadTree = new TLongObjectHashMap>(); + this.library = library; + transportStopsReader = new TransportStopsRouteReader(Arrays.asList(readers)); + } + + public List getTransportStops(LatLon loc) throws IOException { + int y = MapUtils.get31TileNumberY(loc.getLatitude()); + int x = MapUtils.get31TileNumberX(loc.getLongitude()); + return getTransportStops(x, y, false, new ArrayList()); + } + + public List getTransportStops(int x, int y, boolean change, List res) throws IOException { + return loadNativeTransportStops(x, y, change, res); + } + + private List loadNativeTransportStops(int sx, int sy, boolean change, List res) throws IOException { + long nanoTime = System.nanoTime(); + int d = change ? walkChangeRadiusIn31 : walkRadiusIn31; + int lx = (sx - d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); + int rx = (sx + d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); + int ty = (sy - d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); + int by = (sy + d ) >> (31 - cfg.ZOOM_TO_LOAD_TILES); + for(int x = lx; x <= rx; x++) { + for(int y = ty; y <= by; y++) { + long tileId = (((long)x) << (cfg.ZOOM_TO_LOAD_TILES + 1)) + y; + List list = quadTree.get(tileId); + if(list == null) { + list = loadTile(x, y); + quadTree.put(tileId, list); + } + for(TransportRouteSegment r : list) { + TransportStop st = r.getStop(r.segStart); + if (Math.abs(st.x31 - sx) > walkRadiusIn31 || Math.abs(st.y31 - sy) > walkRadiusIn31) { + wrongLoadedWays++; + } else { + loadedWays++; + res.add(r); + } + } + } + } + loadTime += System.nanoTime() - nanoTime; + return res; + } + + + private List loadTile(int x, int y) throws IOException { + long nanoTime = System.nanoTime(); + List lst = new ArrayList(); + int pz = (31 - cfg.ZOOM_TO_LOAD_TILES); + BinaryMapIndexReader.SearchRequest sr = BinaryMapIndexReader.buildSearchTransportRequest(x << pz, (x + 1) << pz, + y << pz, (y + 1) << pz, -1, null); + Collection stops = transportStopsReader.readMergedTransportStops(sr); + loadTransportSegments(stops, lst); + readTime += System.nanoTime() - nanoTime; + return lst; + } + + private void loadTransportSegments(Collection stops, List lst) throws IOException { + for(TransportStop s : stops) { + if (s.isDeleted() || s.getRoutes() == null) { + continue; + } + for (TransportRoute route : s.getRoutes()) { + int stopIndex = -1; + double dist = TransportRoute.SAME_STOP; + for (int k = 0; k < route.getForwardStops().size(); k++) { + TransportStop st = route.getForwardStops().get(k); + if(st.getId().longValue() == s.getId().longValue() ) { + stopIndex = k; + break; + } + double d = MapUtils.getDistance(st.getLocation(), s.getLocation()); + if (d < dist) { + stopIndex = k; + dist = d; + } + } + if (stopIndex != -1) { + if (cfg != null && cfg.useSchedule) { + loadScheduleRouteSegment(lst, route, stopIndex); + } else { + TransportRouteSegment segment = new TransportRouteSegment(route, stopIndex); + lst.add(segment); + } + } else { + System.err.println(String.format(Locale.US, "Routing error: missing stop '%s' in route '%s' id: %d", + s.toString(), route.getRef(), route.getId() / 2)); + } + } + } + } + + private void loadScheduleRouteSegment(List lst, TransportRoute route, int stopIndex) { + if(route.getSchedule() != null) { + TIntArrayList ti = route.getSchedule().tripIntervals; + int cnt = ti.size(); + int t = 0; + // improve by using exact data + int stopTravelTime = 0; + TIntArrayList avgStopIntervals = route.getSchedule().avgStopIntervals; + for (int i = 0; i < stopIndex; i++) { + if (avgStopIntervals.size() > i) { + stopTravelTime += avgStopIntervals.getQuick(i); + } + } + for(int i = 0; i < cnt; i++) { + t += ti.getQuick(i); + int startTime = t + stopTravelTime; + if(startTime >= cfg.scheduleTimeOfDay && startTime <= cfg.scheduleTimeOfDay + cfg.scheduleMaxTime ) { + TransportRouteSegment segment = new TransportRouteSegment(route, stopIndex, startTime); + lst.add(segment); + } + } + } + } +} diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java b/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java new file mode 100644 index 0000000000..7428196332 --- /dev/null +++ b/OsmAnd-java/src/main/java/net/osmand/router/TransportStopsRouteReader.java @@ -0,0 +1,409 @@ +package net.osmand.router; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TLongObjectHashMap; +import net.osmand.binary.BinaryMapIndexReader; +import net.osmand.binary.BinaryMapIndexReader.SearchRequest; +import net.osmand.binary.BinaryMapTransportReaderAdapter.TransportIndex; +import net.osmand.data.IncompleteTransportRoute; +import net.osmand.data.LatLon; +import net.osmand.data.TransportRoute; +import net.osmand.data.TransportStop; +import net.osmand.osm.edit.Way; +import net.osmand.util.MapUtils; + +public class TransportStopsRouteReader { + public static final int MISSING_STOP_SEARCH_RADIUS = 50000; + TLongObjectHashMap combinedRoutesCache = new TLongObjectHashMap(); + Map> routesFilesCache = new LinkedHashMap>(); + + + public TransportStopsRouteReader(Collection fls) { + for(BinaryMapIndexReader r : fls) { + routesFilesCache.put(r, new TIntObjectHashMap()); + } + } + + public Collection readMergedTransportStops(SearchRequest sr) throws IOException { + TLongObjectHashMap loadedTransportStops = new TLongObjectHashMap(); + + for (BinaryMapIndexReader r : routesFilesCache.keySet()) { + sr.clearSearchResults(); + List stops = r.searchTransportIndex(sr); + TIntObjectHashMap routesToLoad = mergeTransportStops(r, loadedTransportStops, stops); + loadRoutes(r, routesToLoad); + for (TransportStop stop : stops) { + // skip missing stops + if (stop.isMissingStop()) { + continue; + } + long stopId = stop.getId(); + TransportStop multifileStop = loadedTransportStops.get(stopId); + int[] rrs = stop.getReferencesToRoutes(); + // clear up so it won't be used because there is multi file stop + stop.setReferencesToRoutes(null); + if (rrs != null && !multifileStop.isDeleted()) { + for (int rr : rrs) { + TransportRoute route = routesToLoad.get(rr); + if (route == null) { + if (routesToLoad.containsKey(rr)) { + System.err.println(String.format( + "Something went wrong by loading combined route %d for stop %s", rr, stop)); + } + } else { + TransportRoute combinedRoute = getCombinedRoute(route); + if (multifileStop == stop || (!multifileStop.hasRoute(combinedRoute.getId()) + && !multifileStop.isRouteDeleted(combinedRoute.getId()))) { + // duplicates won't be added + multifileStop.addRouteId(combinedRoute.getId()); + multifileStop.addRoute(combinedRoute); + } + } + } + } + } + } + // There should go stops with complete routes: + return loadedTransportStops.valueCollection(); + + } + + + public TIntObjectHashMap mergeTransportStops(BinaryMapIndexReader reader, + TLongObjectHashMap loadedTransportStops, List stops) throws IOException { + Iterator it = stops.iterator(); + TIntObjectHashMap routesToLoad = routesFilesCache.get(reader); + + while (it.hasNext()) { + TransportStop stop = it.next(); + long stopId = stop.getId(); + TransportStop multifileStop = loadedTransportStops.get(stopId); + long[] routesIds = stop.getRoutesIds(); + long[] delRIds = stop.getDeletedRoutesIds(); + if (multifileStop == null) { + loadedTransportStops.put(stopId, stop); + multifileStop = stop; + if (!stop.isDeleted()) { + putAll(routesToLoad, stop.getReferencesToRoutes()); + } + } else if (multifileStop.isDeleted()) { + // stop has nothing to load, so not needed + it.remove(); + } else { + if (delRIds != null) { + for (long deletedRouteId : delRIds) { + multifileStop.addDeletedRouteId(deletedRouteId); + } + } + if (routesIds != null && routesIds.length > 0) { + int[] refs = stop.getReferencesToRoutes(); + for (int i = 0; i < routesIds.length; i++) { + long routeId = routesIds[i]; + if (!multifileStop.hasRoute(routeId) && !multifileStop.isRouteDeleted(routeId)) { + if(!routesToLoad.containsKey(refs[i])) { + routesToLoad.put(refs[i], null); + } + } + } + } else { + if (stop.hasReferencesToRoutes()) { + // old format + putAll(routesToLoad, stop.getReferencesToRoutes()); + } else { + // stop has noting to load, so not needed + it.remove(); + } + } + } + } + + return routesToLoad; + } + + private void putAll(TIntObjectHashMap routesToLoad, int[] referencesToRoutes) { + for(int k = 0 ; k < referencesToRoutes.length; k++) { + if(!routesToLoad.containsKey(referencesToRoutes[k])) { + routesToLoad.put(referencesToRoutes[k], null); + } + } + } + + public void loadRoutes(BinaryMapIndexReader reader, TIntObjectHashMap localFileRoutes) throws IOException { + // load/combine routes + if (localFileRoutes.size() > 0) { + TIntArrayList routesToLoad = new TIntArrayList(localFileRoutes.size()); + TIntObjectIterator it = localFileRoutes.iterator(); + while(it.hasNext()) { + it.advance(); + if(it.value() == null) { + routesToLoad.add(it.key()); + } + } + routesToLoad.sort(); + reader.loadTransportRoutes(routesToLoad.toArray(), localFileRoutes); + } + } + + private TransportRoute getCombinedRoute(TransportRoute route) throws IOException { + if (!route.isIncomplete()) { + return route; + } + TransportRoute c = combinedRoutesCache.get(route.getId()); + if (c == null) { + c = combineRoute(route); + combinedRoutesCache.put(route.getId(), c); + } + return c; + } + + private TransportRoute combineRoute(TransportRoute route) throws IOException { + // 1. Get all available route parts; + List incompleteRoutes = findIncompleteRouteParts(route); + if (incompleteRoutes == null) { + return route; + } + // here could be multiple overlays between same points + // It's better to remove them especially identical segments + List allWays = getAllWays(incompleteRoutes); + + // 2. Get array of segments (each array size > 1): + LinkedList> stopSegments = parseRoutePartsToSegments(incompleteRoutes); + + // 3. Merge segments and remove excess missingStops (when they are closer then MISSING_STOP_SEARCH_RADIUS): + // + Check for missingStops. If they present in the middle/there more then one segment - we have a hole in the + // map data + List> mergedSegments = combineSegmentsOfSameRoute(stopSegments); + + // 4. Now we need to properly sort segments, proper sorting is minimizing distance between stops + // So it is salesman problem, we have this solution at TspAnt, but if we know last or first segment we can solve + // it straightforward + List firstSegment = null; + List lastSegment = null; + for (List l : mergedSegments) { + if (!l.get(0).isMissingStop()) { + firstSegment = l; + } + if (!l.get(l.size() - 1).isMissingStop()) { + lastSegment = l; + } + } + List> sortedSegments = new ArrayList>(); + if (firstSegment != null) { + sortedSegments.add(firstSegment); + mergedSegments.remove(firstSegment); + while (!mergedSegments.isEmpty()) { + List last = sortedSegments.get(sortedSegments.size() - 1); + List add = findAndDeleteMinDistance(last.get(last.size() - 1).getLocation(), + mergedSegments, true); + sortedSegments.add(add); + } + + } else if (lastSegment != null) { + sortedSegments.add(lastSegment); + mergedSegments.remove(lastSegment); + while (!mergedSegments.isEmpty()) { + List first = sortedSegments.get(0); + List add = findAndDeleteMinDistance(first.get(0).getLocation(), mergedSegments, false); + sortedSegments.add(0, add); + } + } else { + sortedSegments = mergedSegments; + } + List finalList = new ArrayList(); + for (List s : sortedSegments) { + finalList.addAll(s); + } + // 5. Create combined TransportRoute and return it + return new TransportRoute(route, finalList, allWays); + } + + private List findAndDeleteMinDistance(LatLon location, List> mergedSegments, + boolean attachToBegin) { + int ind = attachToBegin ? 0 : mergedSegments.get(0).size() - 1; + double minDist = MapUtils.getDistance(mergedSegments.get(0).get(ind).getLocation(), location); + int minInd = 0; + for (int i = 1; i < mergedSegments.size(); i++) { + ind = attachToBegin ? 0 : mergedSegments.get(i).size() - 1; + double dist = MapUtils.getDistance(mergedSegments.get(i).get(ind).getLocation(), location); + if (dist < minDist) { + minInd = i; + } + } + return mergedSegments.remove(minInd); + } + + private List getAllWays(List parts) { + List w = new ArrayList(); + for (TransportRoute t : parts) { + w.addAll(t.getForwardWays()); + } + return w; + } + + private List> combineSegmentsOfSameRoute(LinkedList> segments) { + LinkedList> tempResultSegments = mergeSegments(segments, new LinkedList>(), false); + return mergeSegments(tempResultSegments, new ArrayList>(), true); + } + + + private >> T mergeSegments(LinkedList> segments, T resultSegments, + boolean mergeMissingSegs) { + while (!segments.isEmpty()) { + List firstSegment = segments.poll(); + boolean merged = true; + while (merged) { + merged = false; + Iterator> it = segments.iterator(); + while (it.hasNext()) { + List segmentToMerge = it.next(); + if (mergeMissingSegs) { + merged = tryToMergeMissingStops(firstSegment, segmentToMerge); + } else { + merged = tryToMerge(firstSegment, segmentToMerge); + } + + if (merged) { + it.remove(); + break; + } + } + } + resultSegments.add(firstSegment); + } + return resultSegments; + } + + private boolean tryToMerge(List firstSegment, List segmentToMerge) { + if (firstSegment.size() < 2 || segmentToMerge.size() < 2) { + return false; + } + // 1st we check that segments overlap by stop + int commonStopFirst = 0; + int commonStopSecond = 0; + boolean found = false; + for (; commonStopFirst < firstSegment.size(); commonStopFirst++) { + for (commonStopSecond = 0; commonStopSecond < segmentToMerge.size() && !found; commonStopSecond++) { + long lid1 = firstSegment.get(commonStopFirst).getId(); + long lid2 = segmentToMerge.get(commonStopSecond).getId(); + if (lid1 > 0 && lid2 == lid1) { + found = true; + break; + } + } + if (found) { + // important to increment break inside loop + break; + } + } + if (found && commonStopFirst < firstSegment.size()) { + // we've found common stop so we can merge based on stops + // merge last part first + int leftPartFirst = firstSegment.size() - commonStopFirst; + int leftPartSecond = segmentToMerge.size() - commonStopSecond; + if (leftPartFirst < leftPartSecond + || (leftPartFirst == leftPartSecond && firstSegment.get(firstSegment.size() - 1).isMissingStop())) { + while (firstSegment.size() > commonStopFirst) { + firstSegment.remove(firstSegment.size() - 1); + } + for (int i = commonStopSecond; i < segmentToMerge.size(); i++) { + firstSegment.add(segmentToMerge.get(i)); + } + } + // merge first part + if (commonStopFirst < commonStopSecond + || (commonStopFirst == commonStopSecond && firstSegment.get(0).isMissingStop())) { + for (int i = 0; i <= commonStopFirst; i++) { + firstSegment.remove(0); + } + for (int i = commonStopSecond; i >= 0; i--) { + firstSegment.add(0, segmentToMerge.get(i)); + } + } + return true; + + } + + return false; + } + + private boolean tryToMergeMissingStops(List firstSegment, List segmentToMerge) { + // no common stops, so try to connect to the end or beginning + // beginning + boolean merged = false; + if (MapUtils.getDistance(firstSegment.get(0).getLocation(), + segmentToMerge.get(segmentToMerge.size() - 1).getLocation()) < MISSING_STOP_SEARCH_RADIUS + && firstSegment.get(0).isMissingStop() && segmentToMerge.get(segmentToMerge.size() - 1).isMissingStop()) { + firstSegment.remove(0); + for (int i = segmentToMerge.size() - 2; i >= 0; i--) { + firstSegment.add(0, segmentToMerge.get(i)); + } + merged = true; + } else if (MapUtils.getDistance(firstSegment.get(firstSegment.size() - 1).getLocation(), + segmentToMerge.get(0).getLocation()) < MISSING_STOP_SEARCH_RADIUS + && segmentToMerge.get(0).isMissingStop() && firstSegment.get(firstSegment.size() - 1).isMissingStop()) { + firstSegment.remove(firstSegment.size() - 1); + for (int i = 1; i < segmentToMerge.size(); i++) { + firstSegment.add(segmentToMerge.get(i)); + } + merged = true; + } + return merged; + } + + private LinkedList> parseRoutePartsToSegments(List routeParts) { + LinkedList> segs = new LinkedList>(); + // here we assume that missing stops come in pairs + // we don't add segments with 1 stop cause they are irrelevant further + for (TransportRoute part : routeParts) { + List newSeg = new ArrayList(); + for (TransportStop s : part.getForwardStops()) { + newSeg.add(s); + if (s.isMissingStop()) { + if (newSeg.size() > 1) { + segs.add(newSeg); + newSeg = new ArrayList(); + } + } + } + if (newSeg.size() > 1) { + segs.add(newSeg); + } + } + return segs; + } + + private List findIncompleteRouteParts(TransportRoute baseRoute) throws IOException { + List allRoutes = null; + for (BinaryMapIndexReader bmir : routesFilesCache.keySet()) { + // here we could limit routeMap indexes by only certain bbox around start / end (check comment on field) + IncompleteTransportRoute ptr = bmir.getIncompleteTransportRoutes().get(baseRoute.getId()); + if (ptr != null) { + TIntArrayList lst = new TIntArrayList(); + while (ptr != null) { + lst.add(ptr.getRouteOffset()); + ptr = ptr.getNextLinkedRoute(); + } + if (lst.size() > 0) { + if (allRoutes == null) { + allRoutes = new ArrayList(); + } + allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection()); + } + } + } + return allRoutes; + } +} diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java b/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java index 9689e7d40e..7b67669cf3 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java @@ -210,16 +210,25 @@ public class TurnType { public static void setPrimaryTurnShiftOthers(int[] lanes, int lane, int turnType) { int pt = getPrimaryTurn(lanes[lane]); int st = getSecondaryTurn(lanes[lane]); - //int tt = getTertiaryTurn(lanes[lane]); + //int tt = getTertiaryTurn(lanes[lane]); is lost here setPrimaryTurnAndReset(lanes, lane, turnType); setSecondaryTurn(lanes, lane, pt); setTertiaryTurn(lanes, lane, st); } - public static void setSecondaryTurnShiftOthers(int[] lanes, int lane, int turnType) { + public static void setSecondaryToPrimary(int[] lanes, int lane) { int st = getSecondaryTurn(lanes[lane]); - //int tt = getTertiaryTurn(lanes[lane]); - setSecondaryTurn(lanes, lane, turnType); + int pt = getPrimaryTurn(lanes[lane]); + setPrimaryTurn(lanes, lane, st); + setSecondaryTurn(lanes, lane, pt); + } + + public static void setTertiaryToPrimary(int[] lanes, int lane) { + int st = getSecondaryTurn(lanes[lane]); + int pt = getPrimaryTurn(lanes[lane]); + int tt = getTertiaryTurn(lanes[lane]); + setPrimaryTurn(lanes, lane, tt); + setSecondaryTurn(lanes, lane, pt); setTertiaryTurn(lanes, lane, st); } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/VehicleRouter.java b/OsmAnd-java/src/main/java/net/osmand/router/VehicleRouter.java index 6797de0848..e8757b1486 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/VehicleRouter.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/VehicleRouter.java @@ -30,7 +30,7 @@ public interface VehicleRouter { /** * return delay in seconds (0 no obstacles) */ - public float defineObstacle(RouteDataObject road, int point); + public float defineObstacle(RouteDataObject road, int point, boolean dir); /** * return delay in seconds for height obstacles @@ -40,7 +40,7 @@ public interface VehicleRouter { /** * return delay in seconds (0 no obstacles) */ - public float defineRoutingObstacle(RouteDataObject road, int point); + public float defineRoutingObstacle(RouteDataObject road, int point, boolean dir); /** * return routing speed in m/s for vehicle for specified road diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index 89e422ec60..becacd2775 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -1,7 +1,6 @@ package net.osmand.search; import net.osmand.Collator; -import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapIndexReader; @@ -10,11 +9,13 @@ import net.osmand.data.City; import net.osmand.data.LatLon; import net.osmand.data.MapObject; import net.osmand.data.Street; +import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.search.core.CustomSearchPoiFilter; import net.osmand.search.core.ObjectType; import net.osmand.search.core.SearchCoreAPI; import net.osmand.search.core.SearchCoreFactory; +import net.osmand.search.core.SearchCoreFactory.SearchAmenityByTypeAPI; import net.osmand.search.core.SearchCoreFactory.SearchAmenityTypesAPI; import net.osmand.search.core.SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI; import net.osmand.search.core.SearchCoreFactory.SearchStreetByCityAPI; @@ -72,7 +73,7 @@ public class SearchUICore { taskQueue = new LinkedBlockingQueue(); searchSettings = new SearchSettings(new ArrayList()); searchSettings = searchSettings.setLang(locale, transliterate); - phrase = new SearchPhrase(searchSettings, OsmAndCollator.primaryCollator()); + phrase = SearchPhrase.emptyPhrase(searchSettings); currentSearchResult = new SearchResultCollection(phrase); singleThreadedExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, taskQueue); } @@ -325,7 +326,7 @@ public class SearchUICore { apis.add(new SearchCoreFactory.SearchLocationAndUrlAPI()); SearchAmenityTypesAPI searchAmenityTypesAPI = new SearchAmenityTypesAPI(poiTypes); apis.add(searchAmenityTypesAPI); - apis.add(new SearchCoreFactory.SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI)); + apis.add(new SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI)); apis.add(new SearchCoreFactory.SearchAmenityByNameAPI()); SearchBuildingAndIntersectionsByStreetAPI streetsApi = new SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI(); @@ -351,10 +352,10 @@ public class SearchUICore { } } - public void setFilterOrders(List filterOrders) { + public void setActivePoiFiltersByOrder(List filterOrders) { for (SearchCoreAPI capi : apis) { if (capi instanceof SearchAmenityTypesAPI) { - ((SearchAmenityTypesAPI) capi).setFilterOrders(filterOrders); + ((SearchAmenityTypesAPI) capi).setActivePoiFiltersByOrder(filterOrders); } } } @@ -404,7 +405,7 @@ public class SearchUICore { } private boolean filterOneResult(SearchResult object, SearchPhrase phrase) { - NameStringMatcher nameStringMatcher = phrase.getNameStringMatcher(); + NameStringMatcher nameStringMatcher = phrase.getFirstUnknownNameStringMatcher(); return nameStringMatcher.matches(object.localeName) || nameStringMatcher.matches(object.otherNames); } @@ -515,7 +516,7 @@ public class SearchUICore { } currentSearchResult = collection; if (phrase.getSettings().isExportObjects()) { - //rm.createTestJSON(collection); + rm.createTestJSON(collection); } rm.searchFinished(phrase); if (onResultsComplete != null) { @@ -573,6 +574,24 @@ public class SearchUICore { return radius; } + public AbstractPoiType getUnselectedPoiType() { + for (SearchCoreAPI capi : apis) { + if (capi instanceof SearchAmenityByTypeAPI) { + return ((SearchAmenityByTypeAPI) capi).getUnselectedPoiType(); + } + } + return null; + } + + public String getCustomNameFilter() { + for (SearchCoreAPI capi : apis) { + if (capi instanceof SearchAmenityByTypeAPI) { + return ((SearchAmenityByTypeAPI) capi).getNameFilter(); + } + } + return null; + } + void searchInternal(final SearchPhrase phrase, SearchResultMatcher matcher) { preparePhrase(phrase); ArrayList lst = new ArrayList<>(apis); @@ -651,6 +670,10 @@ public class SearchUICore { this.parentSearchResult = parentSearchResult; return prev; } + + public SearchResult getParentSearchResult() { + return parentSearchResult; + } public List getRequestResults() { return requestResults; @@ -710,16 +733,16 @@ public class SearchUICore { @Override public boolean publish(SearchResult object) { - if (phrase != null && object.otherNames != null && !phrase.getNameStringMatcher().matches(object.localeName)) { + if (phrase != null && object.otherNames != null && !phrase.getFirstUnknownNameStringMatcher().matches(object.localeName)) { for (String s : object.otherNames) { - if (phrase.getNameStringMatcher().matches(s)) { + if (phrase.getFirstUnknownNameStringMatcher().matches(s)) { object.alternateName = s; break; } } if (Algorithms.isEmpty(object.alternateName) && object.object instanceof Amenity) { for (String value : ((Amenity) object.object).getAdditionalInfo().values()) { - if (phrase.getNameStringMatcher().matches(value)) { + if (phrase.getFirstUnknownNameStringMatcher().matches(value)) { object.alternateName = value; break; } @@ -730,9 +753,9 @@ public class SearchUICore { object.localeName = object.alternateName; object.alternateName = null; } + object.parentSearchResult = parentSearchResult; if (matcher == null || matcher.publish(object)) { count++; - object.parentSearchResult = parentSearchResult; if (totalLimit == -1 || count < totalLimit) { requestResults.add(object); } @@ -740,6 +763,7 @@ public class SearchUICore { } return false; } + @Override public boolean isCancelled() { boolean cancelled = request != requestNumber.get(); @@ -754,14 +778,28 @@ public class SearchUICore { return exportedCities; } - public void exportObject(MapObject object) { + public void exportObject(SearchPhrase phrase, MapObject object) { + double maxDistance = phrase.getSettings().getExportSettings().getMaxDistance(); + if (maxDistance > 0) { + double distance = MapUtils.getDistance(phrase.getSettings().getOriginalLocation(), object.getLocation()); + if (distance > maxDistance) { + return; + } + } if (exportedObjects == null) { exportedObjects = new ArrayList<>(); } exportedObjects.add(object); } - public void exportCity(City city) { + public void exportCity(SearchPhrase phrase, City city) { + double maxDistance = phrase.getSettings().getExportSettings().getMaxDistance(); + if (maxDistance > 0) { + double distance = MapUtils.getDistance(phrase.getSettings().getOriginalLocation(), city.getLocation()); + if (distance > maxDistance) { + return; + } + } if (exportedCities == null) { exportedCities = new ArrayList<>(); } @@ -781,22 +819,23 @@ public class SearchUICore { cities = new HashSet<>(); } Set streets = new HashSet<>(); - - for (MapObject obj : exportedObjects) { - if (obj instanceof Amenity) { - amenities.add((Amenity) obj); - } else if (obj instanceof Street) { - Street street = (Street) obj; - streets.add(street); - if (street.getCity() != null) { - final City city = street.getCity(); + if (exportedObjects != null) { + for (MapObject obj : exportedObjects) { + if (obj instanceof Amenity) { + amenities.add((Amenity) obj); + } else if (obj instanceof Street) { + Street street = (Street) obj; + streets.add(street); + if (street.getCity() != null) { + final City city = street.getCity(); + cities.add(city); + streetCities.add(city); + } + } else if (obj instanceof City) { + City city = (City) obj; cities.add(city); - streetCities.add(city); + matchedCities.add(city); } - } else if (obj instanceof City) { - City city = (City) obj; - cities.add(city); - matchedCities.add(city); } } for (City city : cities) { @@ -810,7 +849,7 @@ public class SearchUICore { SearchExportSettings exportSettings = phrase.getSettings().getExportSettings(); json.put("settings", phrase.getSettings().toJSON()); - json.put("phrase", phrase.getRawUnknownSearchPhrase()); + json.put("phrase", phrase.getFullSearchPhrase()); if (searchResult.searchResults != null && searchResult.searchResults.size() > 0) { JSONArray resultsArr = new JSONArray(); for (SearchResult r : searchResult.searchResults) { @@ -829,7 +868,7 @@ public class SearchUICore { JSONArray citiesArr = new JSONArray(); for (City city : cities) { final JSONObject cityObj = city.toJSON(exportSettings.isExportBuildings()); - if (exportedCities.contains(city)) { + if (exportedCities != null && exportedCities.contains(city)) { if (!exportSettings.isExportEmptyCities()) { continue; } @@ -848,15 +887,134 @@ public class SearchUICore { return json; } } + + private enum ResultCompareStep { + TOP_VISIBLE, + FOUND_WORD_COUNT, // more is better (top) + UNKNOWN_PHRASE_MATCH_WEIGHT, // more is better (top) + COMPARE_AMENITY_TYPE_ADDITIONAL, + SEARCH_DISTANCE_IF_NOT_BY_NAME, + COMPARE_FIRST_NUMBER_IN_NAME, + COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT, // makes sense only for inner subqueries + COMPARE_BY_NAME, + COMPARE_BY_DISTANCE, + AMENITY_LAST_AND_SORT_BY_SUBTYPE + ; + + // -1 - means 1st is less (higher) than 2nd + public int compare(SearchResult o1, SearchResult o2, SearchResultComparator c) { + switch(this) { + case TOP_VISIBLE: + boolean topVisible1 = ObjectType.isTopVisible(o1.objectType); + boolean topVisible2 = ObjectType.isTopVisible(o2.objectType); + if (topVisible1 != topVisible2) { + // -1 - means 1st is less than 2nd + return topVisible1 ? -1 : 1; + } + break; + case FOUND_WORD_COUNT: + if (o1.getFoundWordCount() != o2.getFoundWordCount()) { + return -Algorithms.compare(o1.getFoundWordCount(), o2.getFoundWordCount()); + } + break; + case UNKNOWN_PHRASE_MATCH_WEIGHT: + // here we check how much each sub search result matches the phrase + // also we sort it by type house -> street/poi -> city/postcode/village/other + if (o1.getUnknownPhraseMatchWeight() != o2.getUnknownPhraseMatchWeight()) { + return -Double.compare(o1.getUnknownPhraseMatchWeight(), o2.getUnknownPhraseMatchWeight()); + } + break; + case SEARCH_DISTANCE_IF_NOT_BY_NAME: + if (!c.sortByName) { + double s1 = o1.getSearchDistance(c.loc); + double s2 = o2.getSearchDistance(c.loc); + if (s1 != s2) { + return Double.compare(s1, s2); + } + } + break; + case COMPARE_FIRST_NUMBER_IN_NAME: { + String localeName1 = o1.localeName == null ? "" : o1.localeName; + String localeName2 = o2.localeName == null ? "" : o2.localeName; + int st1 = Algorithms.extractFirstIntegerNumber(localeName1); + int st2 = Algorithms.extractFirstIntegerNumber(localeName2); + if (st1 != st2) { + return Algorithms.compare(st1, st2); + } + break; + } + case COMPARE_AMENITY_TYPE_ADDITIONAL: { + if(o1.object instanceof AbstractPoiType && o2.object instanceof AbstractPoiType ) { + boolean additional1 = ((AbstractPoiType) o1.object).isAdditional(); + boolean additional2 = ((AbstractPoiType) o2.object).isAdditional(); + if (additional1 != additional2) { + // -1 - means 1st is less than 2nd + return additional1 ? 1 : -1; + } + } + break; + } + case COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT: + double ps1 = o1.parentSearchResult == null ? 0 : o1.parentSearchResult.getSearchDistance(c.loc); + double ps2 = o2.parentSearchResult == null ? 0 : o2.parentSearchResult.getSearchDistance(c.loc); + if (ps1 != ps2) { + return Double.compare(ps1, ps2); + } + break; + case COMPARE_BY_NAME: { + String localeName1 = o1.localeName == null ? "" : o1.localeName; + String localeName2 = o2.localeName == null ? "" : o2.localeName; + int cmp = c.collator.compare(localeName1, localeName2); + if (cmp != 0) { + return cmp; + } + break; + } + case COMPARE_BY_DISTANCE: + double s1 = o1.getSearchDistance(c.loc, 1); + double s2 = o2.getSearchDistance(c.loc, 1); + if (s1 != s2) { + return Double.compare(s1, s2); + } + break; + case AMENITY_LAST_AND_SORT_BY_SUBTYPE: { + boolean am1 = o1.object instanceof Amenity; + boolean am2 = o2.object instanceof Amenity; + if (am1 != am2) { + // amenity second + return am1 ? 1 : -1; + } else if (am1 && am2) { + // here 2 points are amenity + Amenity a1 = (Amenity) o1.object; + Amenity a2 = (Amenity) o2.object; + String type1 = a1.getType().getKeyName(); + String type2 = a2.getType().getKeyName(); + int cmp = c.collator.compare(type1, type2); + if (cmp != 0) { + return cmp; + } + + String subType1 = a1.getSubType() == null ? "" : a1.getSubType(); + String subType2 = a2.getSubType() == null ? "" : a2.getSubType(); + cmp = c.collator.compare(subType1, subType2); + if (cmp != 0) { + return cmp; + } + } + break; + } + } + return 0; + } + } public static class SearchResultComparator implements Comparator { - private SearchPhrase sp; private Collator collator; private LatLon loc; private boolean sortByName; + public SearchResultComparator(SearchPhrase sp) { - this.sp = sp; this.collator = sp.getCollator(); loc = sp.getLastTokenLocation(); sortByName = sp.isSortByName(); @@ -865,66 +1023,10 @@ public class SearchUICore { @Override public int compare(SearchResult o1, SearchResult o2) { - boolean topVisible1 = ObjectType.isTopVisible(o1.objectType); - boolean topVisible2 = ObjectType.isTopVisible(o2.objectType); - if (topVisible1 != topVisible2) { - // -1 - means 1st is less than 2nd - return topVisible1 ? -1 : 1; - } - if (o1.getUnknownPhraseMatchWeight() != o2.getUnknownPhraseMatchWeight()) { - return -Double.compare(o1.getUnknownPhraseMatchWeight(), o2.getUnknownPhraseMatchWeight()); - } - if (o1.getFoundWordCount() != o2.getFoundWordCount()) { - return -Algorithms.compare(o1.getFoundWordCount(), o2.getFoundWordCount()); - } - if (!sortByName) { - double s1 = o1.getSearchDistance(loc); - double s2 = o2.getSearchDistance(loc); - if (s1 != s2) { - return Double.compare(s1, s2); - } - } - String localeName1 = o1.localeName == null ? "" : o1.localeName; - String localeName2 = o2.localeName == null ? "" : o2.localeName; - int st1 = Algorithms.extractFirstIntegerNumber(localeName1); - int st2 = Algorithms.extractFirstIntegerNumber(localeName2); - if (st1 != st2) { - return Algorithms.compare(st1, st2); - } - double s1 = o1.getSearchDistance(loc, 1); - double s2 = o2.getSearchDistance(loc, 1); - double ps1 = o1.parentSearchResult == null ? 0 : o1.parentSearchResult.getSearchDistance(loc); - double ps2 = o2.parentSearchResult == null ? 0 : o2.parentSearchResult.getSearchDistance(loc); - if (ps1 != ps2) { - return Double.compare(ps1, ps2); - } - int cmp = collator.compare(localeName1, localeName2); - if (cmp != 0) { - return cmp; - } - if (s1 != s2) { - return Double.compare(s1, s2); - } - boolean am1 = o1.object instanceof Amenity; - boolean am2 = o2.object instanceof Amenity; - if (am1 != am2) { - return Boolean.compare(am1, am2); - } else if (am1 && am2) { - // here 2 points are amenity - Amenity a1 = (Amenity) o1.object; - Amenity a2 = (Amenity) o2.object; - String type1 = a1.getType().getKeyName(); - String type2 = a2.getType().getKeyName(); - cmp = collator.compare(type1, type2); - if (cmp != 0) { - return cmp; - } - - String subType1 = a1.getSubType() == null ? "" : a1.getSubType(); - String subType2 = a2.getSubType() == null ? "" : a2.getSubType(); - cmp = collator.compare(subType1, subType2); - if (cmp != 0) { - return cmp; + for(ResultCompareStep step : ResultCompareStep.values()) { + int r = step.compare(o1, o2, this); + if(r != 0) { + return r; } } return 0; diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java b/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java index 64ed8710cd..c14d5cff07 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java @@ -45,27 +45,24 @@ public enum ObjectType { return null; } - public static double getTypeWeight(ObjectType t) { + public static int getTypeWeight(ObjectType t) { if (t == null) { - return 1.0; + return 1; } switch (t) { - case CITY: - return 1.0; - case VILLAGE: - return 1.0; - case POSTCODE: - return 1.0; - case STREET: - return 2.0; case HOUSE: - return 3.0; case STREET_INTERSECTION: - return 3.0; + return 4; + case STREET: + return 3; + case CITY: + case VILLAGE: + case POSTCODE: + return 2; case POI: - return 2.0; + return 1; default: - return 1.0; + return 1; } } } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java index ed9924d69f..e5c791a780 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java @@ -1,6 +1,7 @@ package net.osmand.search.core; +import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapAddressReaderAdapter; @@ -20,7 +21,6 @@ import net.osmand.data.Street; import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiCategory; -import net.osmand.osm.PoiFilter; import net.osmand.osm.PoiType; import net.osmand.search.SearchUICore.SearchResultMatcher; import net.osmand.search.core.SearchPhrase.NameStringMatcher; @@ -33,8 +33,10 @@ import net.osmand.util.LocationParser.ParsedOpenLocationCode; import net.osmand.util.MapUtils; import java.io.IOException; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -48,8 +50,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeSet; -import gnu.trove.list.array.TIntArrayList; - public class SearchCoreFactory { @@ -134,34 +134,86 @@ public class SearchCoreFactory { public int getMinimalSearchRadius(SearchPhrase phrase) { return 0; } - + @Override public int getNextSearchRadius(SearchPhrase phrase) { return 0; } - protected void subSearchApiOrPublish(SearchPhrase phrase, - SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api) + protected void subSearchApiOrPublish(SearchPhrase phrase, SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api) throws IOException { - phrase.countUnknownWordsMatch(res); -// int cnt = resultMatcher.getCount(); - List ws = phrase.getUnknownSearchWords(res.otherWordsMatch); - if(!res.firstUnknownWordMatches) { - ws.add(phrase.getUnknownSearchWord()); + subSearchApiOrPublish(phrase, resultMatcher, res, api, true); + } + + protected void subSearchApiOrPublish(SearchPhrase phrase, SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api, + boolean publish) + throws IOException { + phrase.countUnknownWordsMatchMainResult(res); + boolean firstUnknownWordMatches = res.firstUnknownWordMatches; + List leftUnknownSearchWords = new ArrayList(phrase.getUnknownSearchWords()); + if (res.otherWordsMatch != null) { + leftUnknownSearchWords.removeAll(res.otherWordsMatch); + } + SearchResult newParentSearchResult = null; + if (res.parentSearchResult == null && resultMatcher.getParentSearchResult() == null && + res.objectType == ObjectType.STREET && res.object instanceof Street && ((Street) res.object).getCity() != null) { + City ct = ((Street) res.object).getCity(); + SearchResult cityResult = new SearchResult(phrase); + cityResult.object = ct; + cityResult.objectType = ObjectType.CITY; + cityResult.localeName = ct.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); + cityResult.otherNames = ct.getAllNames(true); + cityResult.location = ct.getLocation(); + cityResult.localeRelatedObjectName = res.file.getRegionName(); + cityResult.file = res.file; + phrase.countUnknownWordsMatchMainResult(cityResult); + boolean match = false; + if (firstUnknownWordMatches) { + cityResult.firstUnknownWordMatches = false; // don't count same name twice + } else if (cityResult.firstUnknownWordMatches) { + firstUnknownWordMatches = true; + match = true; + } + if (cityResult.otherWordsMatch != null) { + Iterator iterator = cityResult.otherWordsMatch.iterator(); + while (iterator.hasNext()) { + String n = iterator.next(); + boolean wasPresent = leftUnknownSearchWords.remove(n); + if (!wasPresent) { + iterator.remove(); // don't count same name twice + } else { + match = true; + } + } + } + // include parent search result even if it is empty + if (match) { + newParentSearchResult = cityResult; + } + } + if (!firstUnknownWordMatches) { + leftUnknownSearchWords.add(0, phrase.getFirstUnknownSearchWord()); } // publish result to set parentSearchResult before search - resultMatcher.publish(res); - if (!ws.isEmpty() && api != null && api.isSearchAvailable(phrase)) { - SearchPhrase nphrase = phrase.selectWord(res, ws, - phrase.isLastUnknownSearchWordComplete()); - SearchResult prev = resultMatcher.setParentSearchResult(res); - res.parentSearchResult = prev; + if (publish) { + if (newParentSearchResult != null) { + SearchResult prev = resultMatcher.setParentSearchResult(newParentSearchResult); + resultMatcher.publish(res); + resultMatcher.setParentSearchResult(prev); + } else { + resultMatcher.publish(res); + } + } + if (!leftUnknownSearchWords.isEmpty() && api != null && api.isSearchAvailable(phrase)) { + SearchPhrase nphrase = phrase.selectWord(res, leftUnknownSearchWords, + phrase.isLastUnknownSearchWordComplete() || + !leftUnknownSearchWords.contains(phrase.getLastUnknownSearchWord())); + SearchResult prev = resultMatcher.setParentSearchResult(publish ? res : + resultMatcher.getParentSearchResult()); api.search(nphrase, resultMatcher); resultMatcher.setParentSearchResult(prev); } -// if (resultMatcher.getCount() == cnt) { -// resultMatcher.publish(res); -// } + } @Override @@ -170,8 +222,6 @@ public class SearchCoreFactory { } } - - public static class SearchRegionByNameAPI extends SearchBaseAPI { public SearchRegionByNameAPI() { @@ -190,9 +240,9 @@ public class SearchCoreFactory { sr.objectType = ObjectType.REGION; sr.location = bmir.getRegionCenter(); sr.preferredZoom = 6; - if (phrase.getUnknownSearchWordLength() <= 1 && phrase.isNoSelectedType()) { + if (phrase.getFullSearchPhrase().length() <= 1 && phrase.isNoSelectedType()) { resultMatcher.publish(sr); - } else if (phrase.getNameStringMatcher().matches(sr.localeName)) { + } else if (phrase.getFirstUnknownNameStringMatcher().matches(sr.localeName)) { resultMatcher.publish(sr); } } @@ -214,19 +264,6 @@ public class SearchCoreFactory { } } - private static String stripBraces(String localeName) { - int i = localeName.indexOf('('); - String retName = localeName; - if (i > -1) { - retName = localeName.substring(0, i); - int j = localeName.indexOf(')', i); - if (j > -1) { - retName = retName.trim() + ' ' + localeName.substring(j); - } - } - return retName; - } - public static class SearchAddressByNameAPI extends SearchBaseAPI { private static final int DEFAULT_ADDRESS_BBOX_RADIUS = 100 * 1000; @@ -271,7 +308,7 @@ public class SearchCoreFactory { public int getMinimalSearchRadius(SearchPhrase phrase) { return phrase.getRadiusSearch(DEFAULT_ADDRESS_BBOX_RADIUS); } - + @Override public int getNextSearchRadius(SearchPhrase phrase) { return phrase.getNextRadiusSearch(DEFAULT_ADDRESS_BBOX_RADIUS); @@ -314,16 +351,13 @@ public class SearchCoreFactory { if (phrase.isNoSelectedType() && bbox != null && (phrase.isUnknownSearchWordPresent() || phrase.isEmptyQueryAllowed()) && phrase.isSearchTypeAllowed(ObjectType.CITY)) { - String word = phrase.getUnknownWordToSearch(); - NameStringMatcher nm = phrase.getNameStringMatcher(word, phrase.isUnknownSearchWordComplete()); - NameStringMatcher wordEqualsMatcher = phrase.getNameStringMatcher(word, true); - boolean firstUnknownWordMatches = word.equals(phrase.getUnknownSearchWord()); + NameStringMatcher nm = phrase.getMainUnknownNameStringMatcher(); resArray.clear(); resArray = townCitiesQR.queryInBox(bbox, resArray); int limit = 0; for (City c : resArray) { if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportCity(c); + resultMatcher.exportCity(phrase, c); } SearchResult res = new SearchResult(phrase); res.object = c; @@ -339,8 +373,6 @@ public class SearchCoreFactory { if (phrase.isEmptyQueryAllowed() && phrase.isEmpty()) { resultMatcher.publish(res); } else if (nm.matches(res.localeName) || nm.matches(res.otherNames)) { - res.firstUnknownWordMatches = firstUnknownWordMatches; - res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName); subSearchApiOrPublish(phrase, resultMatcher, res, cityApi); } if (limit++ > LIMIT * phrase.getRadiusLevel()) { @@ -352,7 +384,8 @@ public class SearchCoreFactory { private void searchByName(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException { - if (phrase.getRadiusLevel() > 1 || phrase.getUnknownSearchWordLength() > 3 || phrase.getUnknownSearchWords().size() > 0 || phrase.isSearchTypeAllowed(ObjectType.POSTCODE, true)) { + if (phrase.getRadiusLevel() > 1 || phrase.getUnknownWordToSearch().length() > 3 || + phrase.hasMoreThanOneUnknownSearchWord()|| phrase.isSearchTypeAllowed(ObjectType.POSTCODE, true)) { final boolean locSpecified = phrase.getLastTokenLocation() != null; LatLon loc = phrase.getLastTokenLocation(); final List immediateResults = new ArrayList<>(); @@ -368,9 +401,6 @@ public class SearchCoreFactory { int limit = 0; @Override public boolean publish(MapObject object) { - if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportObject(object); - } if (isCancelled()) { return false; } @@ -395,7 +425,8 @@ public class SearchCoreFactory { if (object.getName().startsWith("<")) { return false; } - if (!phrase.getNameStringMatcher().matches(stripBraces(sr.localeName))) { + + if (!phrase.getUnknownWordToSearchBuildingNameMatcher().matches(stripBraces(sr.localeName))) { sr.priorityDistance = 5; } sr.objectType = ObjectType.STREET; @@ -462,18 +493,32 @@ public class SearchCoreFactory { resultMatcher.isCancelled(); } }; + + ResultMatcher rawDataCollector = null; + if (phrase.getSettings().isExportObjects()) { + rawDataCollector = new ResultMatcher() { + @Override + public boolean publish(MapObject object) { + resultMatcher.exportObject(phrase, object); + return true; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + } + Iterator offlineIterator = phrase.getRadiusOfflineIndexes(DEFAULT_ADDRESS_BBOX_RADIUS * 5, SearchPhraseDataType.ADDRESS); - String wordToSearch = phrase.getUnknownWordToSearch(); - NameStringMatcher wordEqualsMatcher = phrase.getNameStringMatcher(wordToSearch, true); - boolean firstUnknownWordMatches = wordToSearch.equals(phrase.getUnknownSearchWord()); while (offlineIterator.hasNext() && wordToSearch.length() > 0) { BinaryMapIndexReader r = offlineIterator.next(); currentFile[0] = r; immediateResults.clear(); - SearchRequest req = BinaryMapIndexReader.buildAddressByNameRequest(rm, wordToSearch.toLowerCase(), - phrase.isUnknownSearchWordComplete() ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE + SearchRequest req = BinaryMapIndexReader.buildAddressByNameRequest(rm, rawDataCollector, wordToSearch.toLowerCase(), + phrase.isMainUnknownSearchWordComplete() ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE : StringMatcherMode.CHECK_STARTS_FROM_SPACE); if (locSpecified) { req.setBBoxRadius(loc.getLatitude(), loc.getLongitude(), @@ -481,13 +526,7 @@ public class SearchCoreFactory { } r.searchAddressDataByName(req); for (SearchResult res : immediateResults) { - res.firstUnknownWordMatches = firstUnknownWordMatches; - res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName); if (res.objectType == ObjectType.STREET) { - City ct = ((Street) res.object).getCity(); - phrase.countUnknownWordsMatch(res, - ct.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()), - ct.getAllNames(true)); subSearchApiOrPublish(phrase, resultMatcher, res, streetsApi); } else { subSearchApiOrPublish(phrase, resultMatcher, res, cityApi); @@ -514,35 +553,44 @@ public class SearchCoreFactory { if (!phrase.isUnknownSearchWordPresent()) { return false; } - boolean hasUnselectedType = phrase.isNoSelectedType() && phrase.isUnknownSearchWordPresent() - && phrase.isUnknownSearchWordComplete() && phrase.hasUnknownSearchWordPoiTypes(); + if (!phrase.isNoSelectedType()) { + // don't search by name when type is selected or poi type is part of name + return false; + } + // Take into account POI [bar] - 'Hospital 512' + // BEFORE: it was searching exact match of whole phrase.getUnknownSearchPhrase() [ Check feedback ] + final BinaryMapIndexReader[] currentFile = new BinaryMapIndexReader[1]; Iterator offlineIterator = phrase.getRadiusOfflineIndexes(BBOX_RADIUS, SearchPhraseDataType.POI); - String unknownSearchPhrase = phrase.getUnknownSearchPhrase().trim(); - String searchWord = hasUnselectedType ? unknownSearchPhrase : phrase.getUnknownWordToSearch(); - final NameStringMatcher nm = phrase.getNameStringMatcher(searchWord, phrase.isUnknownSearchWordComplete()); - final NameStringMatcher phraseMatcher; - if (!Algorithms.isEmpty(unknownSearchPhrase)) { - phraseMatcher = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_EQUALS); - } else { - phraseMatcher = null; - } + String searchWord = phrase.getUnknownWordToSearch(); + final NameStringMatcher nm = phrase.getMainUnknownNameStringMatcher(); QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS_INSIDE); final Set ids = new HashSet(); - SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest( - (int)bbox.centerX(), (int)bbox.centerY(), - searchWord, - (int)bbox.left, (int)bbox.right, - (int)bbox.top, (int)bbox.bottom, - new ResultMatcher() { + + ResultMatcher rawDataCollector = null; + if (phrase.getSettings().isExportObjects()) { + rawDataCollector = new ResultMatcher() { + @Override + public boolean publish(Amenity object) { + resultMatcher.exportObject(phrase, object); + return true; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + } + SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest((int) bbox.centerX(), + (int) bbox.centerY(), searchWord, (int) bbox.left, (int) bbox.right, (int) bbox.top, + (int) bbox.bottom, new ResultMatcher() { int limit = 0; + @Override public boolean publish(Amenity object) { - if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportObject(object); - } - if (limit ++ > LIMIT) { + if (limit++ > LIMIT) { return false; } String poiID = object.getType().getKeyName() + "_" + object.getId(); @@ -551,19 +599,17 @@ public class SearchCoreFactory { } SearchResult sr = new SearchResult(phrase); sr.otherNames = object.getAllNames(true); - sr.localeName = object.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); - if (phrase.isUnknownSearchWordComplete()) { - if(!nm.matches(sr.localeName) && !nm.matches(sr.otherNames) && - !nm.matches(object.getAdditionalInfo().values())) { - return false; - } + sr.localeName = object.getName(phrase.getSettings().getLang(), + phrase.getSettings().isTransliterate()); + if (!nm.matches(sr.localeName) && !nm.matches(sr.otherNames) + && !nm.matches(object.getAdditionalInfo().values())) { + return false; } sr.object = object; sr.preferredZoom = 17; sr.file = currentFile[0]; sr.location = object.getLocation(); - if (object.getSubType().equals("city") || - object.getSubType().equals("country")) { + if (object.getSubType().equals("city") || object.getSubType().equals("country")) { sr.priorityDistance = SEARCH_AMENITY_BY_NAME_CITY_PRIORITY_DISTANCE; sr.preferredZoom = object.getSubType().equals("country") ? 7 : 13; } else if (object.getSubType().equals("town")) { @@ -572,10 +618,7 @@ public class SearchCoreFactory { sr.priorityDistance = 1; } sr.priority = SEARCH_AMENITY_BY_NAME_PRIORITY; - if (phraseMatcher != null) { - sr.unknownPhraseMatches = phraseMatcher.matches(sr.localeName); - } - phrase.countUnknownWordsMatch(sr); + phrase.countUnknownWordsMatchMainResult(sr); sr.objectType = ObjectType.POI; resultMatcher.publish(sr); ids.add(poiID); @@ -584,9 +627,9 @@ public class SearchCoreFactory { @Override public boolean isCancelled() { - return resultMatcher.isCancelled() && (limit < LIMIT) ; + return resultMatcher.isCancelled() && (limit < LIMIT); } - }); + }, rawDataCollector); while (offlineIterator.hasNext()) { BinaryMapIndexReader r = offlineIterator.next(); @@ -629,6 +672,11 @@ public class SearchCoreFactory { } } + protected static class PoiTypeResult { + public AbstractPoiType pt; + public Set foundWords = new LinkedHashSet(); + } + public static class SearchAmenityTypesAPI extends SearchBaseAPI { public final static String STD_POI_FILTER_PREFIX = "std_"; @@ -637,9 +685,8 @@ public class SearchCoreFactory { private List topVisibleFilters; private List categories; private List customPoiFilters = new ArrayList<>(); - private TIntArrayList customPoiFiltersPriorites = new TIntArrayList(); + private Map activePoiFilters = new HashMap<>(); private MapPoiTypes types; - private List filterOrders = new ArrayList<>(); public SearchAmenityTypesAPI(MapPoiTypes types) { super(ObjectType.POI_TYPE); @@ -648,126 +695,207 @@ public class SearchCoreFactory { public void clearCustomFilters() { this.customPoiFilters.clear(); - this.customPoiFiltersPriorites.clear(); + this.activePoiFilters.clear(); } public void addCustomFilter(CustomSearchPoiFilter poiFilter, int priority) { this.customPoiFilters.add(poiFilter); - this.customPoiFiltersPriorites.add(priority); + if (priority > 0) { + this.activePoiFilters.put(poiFilter.getFilterId(), priority); + } } - public void setFilterOrders(List filterOrders) { - this.filterOrders = filterOrders; + public void setActivePoiFiltersByOrder(List filterOrder) { + for (int i = 0; i < filterOrder.size(); i++) { + this.activePoiFilters.put(filterOrder.get(i), i); + } + } + + public Map getPoiTypeResults(NameStringMatcher nm, NameStringMatcher nmAdditional) { + Map results = new LinkedHashMap<>(); + for (AbstractPoiType pf : topVisibleFilters) { + PoiTypeResult res = checkPoiType(nm, pf); + if(res != null) { + results.put(res.pt.getKeyName(), res); + } + } + if (nmAdditional != null) { + addAditonals(nmAdditional, results, types.getOtherMapCategory()); + } + for (PoiCategory c : categories) { + PoiTypeResult res = checkPoiType(nm, c); + if(res != null) { + results.put(res.pt.getKeyName(), res); + } + if (nmAdditional != null) { + addAditonals(nmAdditional, results, c); + } + } + Iterator> it = translatedNames.entrySet().iterator(); + while (it.hasNext()) { + Entry e = it.next(); + PoiType pt = e.getValue(); + if (pt.getCategory() != types.getOtherMapCategory() && !pt.isReference()) { + PoiTypeResult res = checkPoiType(nm, pt); + if(res != null) { + results.put(res.pt.getKeyName(), res); + } + if (nmAdditional != null) { + addAditonals(nmAdditional, results, pt); + } + } + } + return results; + } + + private void addAditonals(NameStringMatcher nm, Map results, AbstractPoiType pt) { + List additionals = pt.getPoiAdditionals(); + if (additionals != null) { + for (PoiType a : additionals) { + PoiTypeResult existingResult = results.get(a.getKeyName()); + if (existingResult != null) { + PoiAdditionalCustomFilter f ; + if (existingResult.pt instanceof PoiAdditionalCustomFilter) { + f = (PoiAdditionalCustomFilter) existingResult.pt; + } else { + f = new PoiAdditionalCustomFilter(types, (PoiType) existingResult.pt); + } + f.additionalPoiTypes.add(a); + existingResult.pt = f; + } else { + String enTranslation = a.getEnTranslation().toLowerCase(); + if (!"no".equals(enTranslation) // && !"yes".equals(enTranslation) + ) { + PoiTypeResult ptr = checkPoiType(nm, a); + if (ptr != null) { + results.put(a.getKeyName(), ptr); + } + } + } + } + } + } + + private PoiTypeResult checkPoiType(NameStringMatcher nm, AbstractPoiType pf) { + PoiTypeResult res = null; + if (nm.matches(pf.getTranslation())) { + res = addIfMatch(nm, pf.getTranslation(), pf, res); + } + if (nm.matches(pf.getEnTranslation())) { + res = addIfMatch(nm, pf.getEnTranslation(), pf, res); + } + if (nm.matches(pf.getKeyName())) { + res = addIfMatch(nm, pf.getKeyName().replace('_', ' '), pf, res); + } + + if (nm.matches(pf.getSynonyms())) { + String[] synonyms = pf.getSynonyms().split(";"); + for (String synonym : synonyms) { + res = addIfMatch(nm, synonym, pf, res); + } + } + return res; + } + + private PoiTypeResult addIfMatch(NameStringMatcher nm, String s, AbstractPoiType pf, PoiTypeResult res) { + if (nm.matches(s)) { + if (res == null) { + res = new PoiTypeResult(); + res.pt = pf; + } + res.foundWords.add(s); + + } + return res; + } + + private void initPoiTypes() { + if (translatedNames.isEmpty()) { + translatedNames = types.getAllTranslatedNames(false); + topVisibleFilters = types.getTopVisibleFilters(); + topVisibleFilters.remove(types.getOsmwiki()); + categories = types.getCategories(false); + } } @Override public boolean search(SearchPhrase phrase, SearchResultMatcher resultMatcher) throws IOException { - if (translatedNames.isEmpty()) { - translatedNames = types.getAllTranslatedNames(false); - topVisibleFilters = types.getTopVisibleFilters(); - categories = types.getCategories(false); - } - List results = new ArrayList(); - List searchWordTypes = new ArrayList(); - NameStringMatcher nm; - String unknownSearchPhrase = phrase.getUnknownSearchPhrase(); boolean showTopFiltersOnly = !phrase.isUnknownSearchWordPresent(); - if (phrase.getUnknownSearchWord().length() < unknownSearchPhrase.length()) { - nm = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_ONLY_STARTS_WITH_TRIM); - } else { - nm = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_STARTS_FROM_SPACE); - } - for (AbstractPoiType pf : topVisibleFilters) { - if (showTopFiltersOnly - || nm.matches(pf.getTranslation()) - || nm.matches(pf.getEnTranslation()) - || nm.matches(pf.getSynonyms())) { - results.add(pf); - searchWordTypes.add(pf); - } - } - if (!showTopFiltersOnly) { - for (PoiCategory c : categories) { - if (!results.contains(c) - && (nm.matches(c.getTranslation()) - || nm.matches(c.getEnTranslation()) - || nm.matches(c.getSynonyms()))) { - results.add(c); - searchWordTypes.add(c); - } - } - Iterator> it = translatedNames.entrySet().iterator(); - while (it.hasNext()) { - Entry e = it.next(); - PoiType pt = e.getValue(); - if (pt.getCategory() != types.getOtherMapCategory()) { - if (!results.contains(pt) - && (nm.matches(pt.getEnTranslation()) - || nm.matches(pt.getTranslation()) - || nm.matches(pt.getSynonyms()))) { - results.add(pt); - searchWordTypes.add(pt); - } - List additionals = pt.getPoiAdditionals(); - if (additionals != null) { - for (PoiType a : additionals) { - if (!results.contains(a)) { - String enTranslation = a.getEnTranslation().toLowerCase(); - if (!"yes".equals(enTranslation) && !"no".equals(enTranslation) - && (nm.matches(enTranslation) || nm.matches(a.getTranslation()) || nm.matches(a.getSynonyms()))) { - results.add(a); - } - } - } - } - } - } - } - phrase.setUnknownSearchWordPoiTypes(searchWordTypes); + NameStringMatcher nm = phrase.getFirstUnknownNameStringMatcher(); - if (resultMatcher != null) { - String word = phrase.getUnknownSearchWord(); - NameStringMatcher startMatch = new NameStringMatcher(word, StringMatcherMode.CHECK_ONLY_STARTS_WITH); - for (AbstractPoiType pt : results) { + initPoiTypes(); + if (showTopFiltersOnly) { + for (AbstractPoiType pt : topVisibleFilters) { SearchResult res = new SearchResult(phrase); res.localeName = pt.getTranslation(); res.object = pt; - res.priorityDistance = 0; - res.objectType = ObjectType.POI_TYPE; - res.firstUnknownWordMatches = startMatch.matches(res.localeName); - if (showTopFiltersOnly) { - String stdFilterId = getStandardFilterId(pt); - if (filterOrders.contains(stdFilterId)) { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.indexOf(stdFilterId); - resultMatcher.publish(res); + addPoiTypeResult(phrase, resultMatcher, showTopFiltersOnly, getStandardFilterId(pt), res); + } + + } else { + boolean includeAdditional = !phrase.hasMoreThanOneUnknownSearchWord(); + NameStringMatcher nmAdditional = includeAdditional ? + new NameStringMatcher(phrase.getFirstUnknownSearchWord(), StringMatcherMode.CHECK_EQUALS_FROM_SPACE) : null; + Map poiTypes = getPoiTypeResults(nm, nmAdditional); + for (PoiTypeResult ptr : poiTypes.values()) { + boolean match = !phrase.isFirstUnknownSearchWordComplete(); + if (!match) { + for (String foundName : ptr.foundWords) { + CollatorStringMatcher csm = new CollatorStringMatcher(foundName, StringMatcherMode.CHECK_ONLY_STARTS_WITH); + match = csm.matches(phrase.getUnknownSearchPhrase()); + if (match) { + break; + } } - } else { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY; - resultMatcher.publish(res); + } + if (match) { + SearchResult res = new SearchResult(phrase); + res.localeName = ptr.pt.getTranslation(); + res.object = ptr.pt; + addPoiTypeResult(phrase, resultMatcher, showTopFiltersOnly, getStandardFilterId(ptr.pt), + res); } } - for (int i = 0; i < customPoiFilters.size(); i++) { - CustomSearchPoiFilter csf = customPoiFilters.get(i); - if (!phrase.isUnknownSearchWordPresent() || nm.matches(csf.getName())) { - SearchResult res = new SearchResult(phrase); - res.localeName = csf.getName(); - res.object = csf; - res.objectType = ObjectType.POI_TYPE; - if (showTopFiltersOnly) { - if (filterOrders.contains(csf.getFilterId())) { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.indexOf(csf.getFilterId()); - resultMatcher.publish(res); - } - } else { - res.priority = SEARCH_AMENITY_TYPE_PRIORITY + customPoiFiltersPriorites.get(i); - resultMatcher.publish(res); - } - } + } + for (int i = 0; i < customPoiFilters.size(); i++) { + CustomSearchPoiFilter csf = customPoiFilters.get(i); + if (showTopFiltersOnly || nm.matches(csf.getName())) { + SearchResult res = new SearchResult(phrase); + res.localeName = csf.getName(); + res.object = csf; + addPoiTypeResult(phrase, resultMatcher, showTopFiltersOnly, csf.getFilterId(), res); } } return true; } + private void addPoiTypeResult(SearchPhrase phrase, SearchResultMatcher resultMatcher, boolean showTopFiltersOnly, + String stdFilterId, SearchResult res) { + res.priorityDistance = 0; + res.objectType = ObjectType.POI_TYPE; + res.firstUnknownWordMatches = true; + if (showTopFiltersOnly) { + if (activePoiFilters.containsKey(stdFilterId)) { + res.priority = getPoiTypePriority(stdFilterId); + resultMatcher.publish(res); + } + } else { + phrase.countUnknownWordsMatchMainResult(res); + res.priority = SEARCH_AMENITY_TYPE_PRIORITY; + resultMatcher.publish(res); + } + } + + private int getPoiTypePriority(String stdFilterId) { + Integer i = activePoiFilters.get(stdFilterId); + if ( i == null) { + return SEARCH_AMENITY_TYPE_PRIORITY; + } + return SEARCH_AMENITY_TYPE_PRIORITY + i.intValue(); + } + + + public String getStandardFilterId(AbstractPoiType poi) { return STD_POI_FILTER_PREFIX + poi.getKeyName(); } @@ -795,9 +923,11 @@ public class SearchCoreFactory { public static class SearchAmenityByTypeAPI extends SearchBaseAPI { private static final int BBOX_RADIUS = 10000; + private static final int BBOX_RADIUS_NEAREST = 1000; private SearchAmenityTypesAPI searchAmenityTypesAPI; - private MapPoiTypes types; + private AbstractPoiType unselectedPoiType; + private String nameFilter; public SearchAmenityByTypeAPI(MapPoiTypes types, SearchAmenityTypesAPI searchAmenityTypesAPI) { super(ObjectType.POI); @@ -805,6 +935,14 @@ public class SearchCoreFactory { this.searchAmenityTypesAPI = searchAmenityTypesAPI; } + public AbstractPoiType getUnselectedPoiType() { + return unselectedPoiType; + } + + public String getNameFilter() { + return nameFilter; + } + @Override public boolean isSearchMoreAvailable(SearchPhrase phrase) { return getSearchPriority(phrase) != -1 && super.isSearchMoreAvailable(phrase); @@ -820,110 +958,116 @@ public class SearchCoreFactory { return phrase.getNextRadiusSearch(BBOX_RADIUS); } - private Map> acceptedTypes = new LinkedHashMap>(); - private Map poiAdditionals = new HashMap(); - public void updateTypesToAccept(AbstractPoiType pt) { - pt.putTypes(acceptedTypes); - if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) { - fillPoiAdditionals(((PoiType) pt).getParentType()); - } else { - fillPoiAdditionals(pt); - } - } - - private void fillPoiAdditionals(AbstractPoiType pt) { - for (PoiType add : pt.getPoiAdditionals()) { - poiAdditionals.put(add.getKeyName().replace('_', ':').replace(' ', ':'), add); - poiAdditionals.put(add.getTranslation().replace(' ', ':').toLowerCase(), add); - } - if (pt instanceof PoiFilter && !(pt instanceof PoiCategory)) { - for (PoiType ps : ((PoiFilter) pt).getPoiTypes()) { - fillPoiAdditionals(ps); - } - } - } - @Override public boolean search(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException { + unselectedPoiType = null; + SearchPoiTypeFilter poiTypeFilter = null; + String nameFilter = null; + int countExtraWords = 0; + Set poiAdditionals = new LinkedHashSet<>(); if (phrase.isLastWord(ObjectType.POI_TYPE)) { Object obj = phrase.getLastSelectedWord().getResult().object; - SearchPoiTypeFilter ptf; if (obj instanceof AbstractPoiType) { - ptf = getPoiTypeFilter((AbstractPoiType) obj); + poiTypeFilter = getPoiTypeFilter((AbstractPoiType) obj, poiAdditionals); } else if (obj instanceof SearchPoiTypeFilter) { - ptf = (SearchPoiTypeFilter) obj; + poiTypeFilter = (SearchPoiTypeFilter) obj; } else { throw new UnsupportedOperationException(); } - searchPoi(phrase, resultMatcher, obj, null, ptf); - } else if (searchAmenityTypesAPI != null) { - if (phrase.getUnknownSearchWordPoiTypes() == null) { - searchAmenityTypesAPI.search(phrase, null); - } - AbstractPoiType poiType = phrase.getUnknownSearchWordPoiType(); - if (poiType != null) { - SearchPoiTypeFilter ptf = getPoiTypeFilter(poiType); - String customName = phrase.getPoiNameFilter(poiType); - if (customName != null) { - phrase.setUnknownSearchWordPoiType(poiType); - searchPoi(phrase, resultMatcher, null, customName.length() == 0 ? null : customName, ptf); + nameFilter = phrase.getUnknownSearchPhrase(); + } else if (searchAmenityTypesAPI != null && phrase.isFirstUnknownSearchWordComplete()) { + NameStringMatcher nm = phrase.getFirstUnknownNameStringMatcher(); + NameStringMatcher nmAdditional = new NameStringMatcher(phrase.getFirstUnknownSearchWord(), + StringMatcherMode.CHECK_EQUALS_FROM_SPACE) ; + searchAmenityTypesAPI.initPoiTypes(); + Map poiTypeResults = searchAmenityTypesAPI.getPoiTypeResults(nm, nmAdditional); + // find first full match only + for (PoiTypeResult poiTypeResult : poiTypeResults.values()) { + for (String foundName : poiTypeResult.foundWords) { + CollatorStringMatcher csm = new CollatorStringMatcher(foundName, StringMatcherMode.CHECK_ONLY_STARTS_WITH); + // matches only completely + int mwords = phrase.countWords(foundName) ; + if (csm.matches(phrase.getUnknownSearchPhrase()) && countExtraWords < mwords) { + countExtraWords = phrase.countWords(foundName); + List otherSearchWords = phrase.getUnknownSearchWords(); + nameFilter = null; + if (countExtraWords - 1 < otherSearchWords.size()) { + nameFilter = ""; + for(int k = countExtraWords - 1; k < otherSearchWords.size(); k++) { + if(nameFilter.length() > 0) { + nameFilter += SearchPhrase.DELIMITER; + } + nameFilter += otherSearchWords.get(k); + } + } + poiTypeFilter = getPoiTypeFilter(poiTypeResult.pt, poiAdditionals); + unselectedPoiType = poiTypeResult.pt; + } } } } + this.nameFilter = nameFilter; + if (poiTypeFilter != null) { + int radius = BBOX_RADIUS; + if (phrase.getRadiusLevel() == 1 && poiTypeFilter instanceof CustomSearchPoiFilter) { + String name = ((CustomSearchPoiFilter) poiTypeFilter).getFilterId(); + if ("std_null".equals(name)) { + radius = BBOX_RADIUS_NEAREST; + } + } + QuadRect bbox = phrase.getRadiusBBoxToSearch(radius); + List offlineIndexes = phrase.getOfflineIndexes(); + Set searchedPois = new TreeSet<>(); + for (BinaryMapIndexReader r : offlineIndexes) { + ResultMatcher rm = getResultMatcher(phrase, poiTypeFilter, resultMatcher, nameFilter, r, + searchedPois, poiAdditionals, countExtraWords); + if (poiTypeFilter instanceof CustomSearchPoiFilter) { + rm = ((CustomSearchPoiFilter) poiTypeFilter).wrapResultMatcher(rm); + } + SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest((int) bbox.left, + (int) bbox.right, (int) bbox.top, (int) bbox.bottom, -1, poiTypeFilter, rm); + r.searchPoi(req); + resultMatcher.apiSearchRegionFinished(this, r, phrase); + } + } return true; } - private void searchPoi(SearchPhrase phrase, SearchResultMatcher resultMatcher, Object obj, String customName, SearchPoiTypeFilter ptf) throws IOException { - QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS); - List oo = phrase.getOfflineIndexes(); - Set searchedPois = new TreeSet<>(); - for (BinaryMapIndexReader o : oo) { - ResultMatcher rm = getResultMatcher(phrase, resultMatcher, customName, o, searchedPois); - if (obj instanceof CustomSearchPoiFilter) { - rm = ((CustomSearchPoiFilter) obj).wrapResultMatcher(rm); - } - SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest( - (int) bbox.left, (int) bbox.right, - (int) bbox.top, (int) bbox.bottom, -1, ptf, - rm); - o.searchPoi(req); - resultMatcher.apiSearchRegionFinished(this, o, phrase); - } - } - private ResultMatcher getResultMatcher(final SearchPhrase phrase, final SearchResultMatcher resultMatcher, - final String customName, final BinaryMapIndexReader selected, - final Set searchedPois) { - String unknownSearchPhrase = phrase.getUnknownSearchPhrase().trim(); - final NameStringMatcher phraseMatcher; - if (!Algorithms.isEmpty(unknownSearchPhrase)) { - phraseMatcher = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_EQUALS); - } else { - phraseMatcher = null; - } - final NameStringMatcher ns; - final boolean hasCustomName = !Algorithms.isEmpty(customName); - if (hasCustomName) { - ns = phrase.getNameStringMatcher(customName, phrase.isLastUnknownSearchWordComplete()); - } else { - ns = phrase.getNameStringMatcher(); - } + private ResultMatcher getResultMatcher(final SearchPhrase phrase, final SearchPoiTypeFilter poiTypeFilter, + final SearchResultMatcher resultMatcher, final String nameFilter, + final BinaryMapIndexReader selected, final Set searchedPois, + final Collection poiAdditionals, final int countExtraWords) { + + + final NameStringMatcher ns = nameFilter == null ? null : new NameStringMatcher(nameFilter, StringMatcherMode.CHECK_STARTS_FROM_SPACE); return new ResultMatcher() { @Override public boolean publish(Amenity object) { if (phrase.getSettings().isExportObjects()) { - resultMatcher.exportObject(object); + resultMatcher.exportObject(phrase, object); } SearchResult res = new SearchResult(phrase); String poiID = object.getType().getKeyName() + "_" + object.getId(); - if(!searchedPois.add(poiID)) { + if (!searchedPois.add(poiID)) { return false; } - if(object.isClosed()) { + if (object.isClosed()) { return false; } + if (!poiAdditionals.isEmpty()) { + boolean found = false; + for (String add : poiAdditionals) { + if(object.getAdditionalInfo().containsKey(add)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } res.localeName = object.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.otherNames = object.getAllNames(true); if (Algorithms.isEmpty(res.localeName)) { @@ -934,14 +1078,20 @@ public class SearchCoreFactory { res.localeName = object.getSubType(); } } - if (phrase.isUnknownSearchWordPresent() - && !(ns.matches(res.localeName) || ns.matches(res.otherNames))) { - String ref = object.getTagContent(Amenity.REF, null); - if(ref == null || !ns.matches(ref)) { - return false; + if (ns != null) { + if (ns.matches(res.localeName) || ns.matches(res.otherNames)) { + phrase.countUnknownWordsMatchMainResult(res, countExtraWords); } else { - res.localeName += " " + ref; + String ref = object.getTagContent(Amenity.REF, null); + if (ref == null || !ns.matches(ref)) { + return false; + } else { + phrase.countUnknownWordsMatch(res, ref, null, countExtraWords); + res.localeName += " " + ref; + } } + } else { + phrase.countUnknownWordsMatch(res, "", null, countExtraWords); } res.object = object; @@ -950,16 +1100,6 @@ public class SearchCoreFactory { res.location = object.getLocation(); res.priority = SEARCH_AMENITY_BY_TYPE_PRIORITY; res.priorityDistance = 1; - if (phraseMatcher != null) { - boolean unknownPhraseMatches = phraseMatcher.matches(res.localeName); - AbstractPoiType unknownSearchWordPoiType = phrase.getUnknownSearchWordPoiType(); - if (unknownPhraseMatches && unknownSearchWordPoiType != null) { - unknownPhraseMatches = !phraseMatcher.matches(unknownSearchWordPoiType.getTranslation()) - && !phraseMatcher.matches(unknownSearchWordPoiType.getEnTranslation()) - && !phraseMatcher.matches(unknownSearchWordPoiType.getSynonyms()); - } - res.unknownPhraseMatches = unknownPhraseMatches; - } res.objectType = ObjectType.POI; resultMatcher.publish(res); return false; @@ -972,11 +1112,14 @@ public class SearchCoreFactory { }; } - private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt) { - - acceptedTypes.clear(); + private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt, Set poiAdditionals ) { + final Map> acceptedTypes = new LinkedHashMap>(); + pt.putTypes(acceptedTypes); poiAdditionals.clear(); - updateTypesToAccept(pt); + if (pt.isAdditional()) { + poiAdditionals.add(pt.getKeyName()); + } return new SearchPoiTypeFilter() { @Override @@ -1049,34 +1192,20 @@ public class SearchCoreFactory { sw.getResult().file.preloadStreets(c, null); } int limit = 0; - String wordToSearch = phrase.getUnknownWordToSearch(); - boolean firstUnknownWordMatches = wordToSearch.equals(phrase.getUnknownSearchWord()); - NameStringMatcher nm = phrase.getNameStringMatcher(wordToSearch, phrase.isUnknownSearchWordComplete()); - String unknownSearchPhrase = phrase.getUnknownSearchPhrase().trim(); - NameStringMatcher phraseMatcher = null; - if (!Algorithms.isEmpty(unknownSearchPhrase)) { - phraseMatcher = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_EQUALS); - } + NameStringMatcher nm = phrase.getMainUnknownNameStringMatcher(); for (Street object : c.getStreets()) { - SearchResult res = new SearchResult(phrase); - + res.localeName = object.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.otherNames = object.getAllNames(true); + boolean pub = true; if (object.getName().startsWith("<")) { // streets related to city - continue; - } - if (phrase.isUnknownSearchWordPresent() + pub = false; + } else if (phrase.isUnknownSearchWordPresent() && !(nm.matches(res.localeName) || nm.matches(res.otherNames))) { continue; } - res.firstUnknownWordMatches = firstUnknownWordMatches || - phrase.getNameStringMatcher().matches(res.localeName) || - phrase.getNameStringMatcher().matches(res.otherNames); - if (phraseMatcher != null) { - res.unknownPhraseMatches = phraseMatcher.matches(res.localeName); - } res.localeRelatedObjectName = c.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.object = object; res.preferredZoom = 17; @@ -1085,7 +1214,7 @@ public class SearchCoreFactory { res.priority = SEARCH_STREET_BY_CITY_PRIORITY; //res.priorityDistance = 1; res.objectType = ObjectType.STREET; - subSearchApiOrPublish(phrase, resultMatcher, res, streetsAPI); + subSearchApiOrPublish(phrase, resultMatcher, res, streetsAPI, pub); if (limit++ > LIMIT) { break; } @@ -1106,11 +1235,6 @@ public class SearchCoreFactory { } - public static boolean isLastWordCityGroup(SearchPhrase p ) { - return p.isLastWord(ObjectType.CITY) || p.isLastWord(ObjectType.POSTCODE) || - p.isLastWord(ObjectType.VILLAGE); - } - public static class SearchBuildingAndIntersectionsByStreetAPI extends SearchBaseAPI { Street cacheBuilding; @@ -1151,7 +1275,7 @@ public class SearchCoreFactory { if (s != null) { BinaryMapIndexReader file = phrase.getLastSelectedWord().getResult().file; - + if (cacheBuilding != s) { cacheBuilding = s; SearchRequest sr = BinaryMapIndexReader @@ -1183,7 +1307,7 @@ public class SearchCoreFactory { }); } String lw = phrase.getUnknownWordToSearchBuilding(); - NameStringMatcher buildingMatch = phrase.getNameStringMatcher(lw, phrase.isLastUnknownSearchWordComplete()); + NameStringMatcher buildingMatch = phrase.getUnknownWordToSearchBuildingNameMatcher(); NameStringMatcher startMatch = new NameStringMatcher(lw, StringMatcherMode.CHECK_ONLY_STARTS_WITH); for (Building b : s.getBuildings()) { SearchResult res = new SearchResult(phrase); @@ -1199,6 +1323,7 @@ public class SearchCoreFactory { res.priority = priority; res.priorityDistance = 0; res.firstUnknownWordMatches = startMatch.matches(res.localeName); + // phrase.countUnknownWordsMatchMainResult(res); // same as above res.relatedObject = s; res.localeRelatedObjectName = s.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.objectType = ObjectType.HOUSE; @@ -1209,12 +1334,13 @@ public class SearchCoreFactory { res.location = b.getLocation(); } res.preferredZoom = 17; + resultMatcher.publish(res); } String streetIntersection = phrase.getUnknownWordToSearch(); - NameStringMatcher streetMatch = phrase.getNameStringMatcher(streetIntersection, phrase.isLastUnknownSearchWordComplete()); - if (Algorithms.isEmpty(streetIntersection) || - (!Character.isDigit(streetIntersection.charAt(0)) && + NameStringMatcher streetMatch = phrase.getMainUnknownNameStringMatcher(); + if (Algorithms.isEmpty(streetIntersection) || + (!Character.isDigit(streetIntersection.charAt(0)) && CommonWords.getCommonSearch(streetIntersection) == -1) ) { for (Street street : s.getIntersectedStreets()) { SearchResult res = new SearchResult(phrase); @@ -1233,6 +1359,7 @@ public class SearchCoreFactory { res.objectType = ObjectType.STREET_INTERSECTION; res.location = street.getLocation(); res.preferredZoom = 16; + phrase.countUnknownWordsMatchMainResult(res); resultMatcher.publish(res); } } @@ -1252,6 +1379,36 @@ public class SearchCoreFactory { } } + protected static class PoiAdditionalCustomFilter extends AbstractPoiType { + + protected List additionalPoiTypes = new ArrayList(); + + public PoiAdditionalCustomFilter(MapPoiTypes registry, PoiType pt) { + super(pt.getKeyName(), registry); + additionalPoiTypes.add(pt); + } + + @Override + public boolean isAdditional() { + return true; + } + + public Map> putTypes(Map> acceptedTypes) { + for (PoiType p : additionalPoiTypes) { + if (p.getParentType() == registry.getOtherMapCategory()) { + for (PoiCategory c : registry.getCategories(false)) { + c.putTypes(acceptedTypes); + } + } else { + p.getParentType().putTypes(acceptedTypes); + } + + } + return acceptedTypes; + } + + } + public static class SearchLocationAndUrlAPI extends SearchBaseAPI { private static final int OLC_RECALC_DISTANCE_THRESHOLD = 100000; // 100 km @@ -1259,6 +1416,7 @@ public class SearchCoreFactory { private LatLon olcPhraseLocation; private ParsedOpenLocationCode cachedParsedCode; private final List citySubTypes = Arrays.asList("city", "town", "village"); + private final DecimalFormat latLonFormatter = new DecimalFormat("#.0####"); public SearchLocationAndUrlAPI() { super(ObjectType.LOCATION, ObjectType.PARTIAL_LOCATION); @@ -1350,7 +1508,7 @@ public class SearchCoreFactory { sp.priority = SEARCH_LOCATION_PRIORITY; sp.object = sp.location = ll; - sp.localeName = ((float) sp.location.getLatitude()) + ", "; + sp.localeName = formatLatLon(sp.location.getLatitude()) + ", "; sp.objectType = ObjectType.PARTIAL_LOCATION; resultMatcher.publish(sp); } @@ -1362,7 +1520,7 @@ public class SearchCoreFactory { SearchResult sp = new SearchResult(phrase); sp.priority = SEARCH_LOCATION_PRIORITY; sp.object = sp.location = l; - sp.localeName = ((float) sp.location.getLatitude()) + ", " + ((float) sp.location.getLongitude()); + sp.localeName = formatLatLon(sp.location.getLatitude()) + ", " + formatLatLon(sp.location.getLongitude()); sp.objectType = ObjectType.LOCATION; sp.wordsSpan = lw; resultMatcher.publish(sp); @@ -1377,7 +1535,7 @@ public class SearchCoreFactory { sp.object = pnt; sp.wordsSpan = text; sp.location = new LatLon(pnt.getLatitude(), pnt.getLongitude()); - sp.localeName = ((float)pnt.getLatitude()) +", " + ((float) pnt.getLongitude()); + sp.localeName = formatLatLon(pnt.getLatitude()) +", " + formatLatLon(pnt.getLongitude()); if (pnt.getZoom() > 0) { sp.preferredZoom = pnt.getZoom(); } @@ -1407,5 +1565,27 @@ public class SearchCoreFactory { } return cachedParsedCode == null ? SEARCH_LOCATION_PRIORITY : SEARCH_MAX_PRIORITY; } + + private String formatLatLon(double latLon) { + return latLonFormatter.format(latLon); + } + } + + private static String stripBraces(String localeName) { + int i = localeName.indexOf('('); + String retName = localeName; + if (i > -1) { + retName = localeName.substring(0, i); + int j = localeName.indexOf(')', i); + if (j > -1) { + retName = retName.trim() + ' ' + localeName.substring(j); + } + } + return retName; + } + + public static boolean isLastWordCityGroup(SearchPhrase p ) { + return p.isLastWord(ObjectType.CITY) || p.isLastWord(ObjectType.POSTCODE) || + p.isLastWord(ObjectType.VILLAGE); } } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java index 2519d12edc..4cf725de73 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java @@ -3,30 +3,29 @@ package net.osmand.search.core; public class SearchExportSettings { private boolean exportEmptyCities; private boolean exportBuildings; + private double maxDistance; public SearchExportSettings() { exportEmptyCities = true; exportBuildings = true; + maxDistance = -1; } - public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings) { + public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings, double maxDistance) { this.exportEmptyCities = exportEmptyCities; this.exportBuildings = exportBuildings; + this.maxDistance = maxDistance; } public boolean isExportEmptyCities() { return exportEmptyCities; } - public void setExportEmptyCities(boolean exportEmptyCities) { - this.exportEmptyCities = exportEmptyCities; - } - public boolean isExportBuildings() { return exportBuildings; } - public void setExportBuildings(boolean exportBuildings) { - this.exportBuildings = exportBuildings; + public double getMaxDistance() { + return maxDistance; } } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java index 7a8e506647..2a3fc59521 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchPhrase.java @@ -1,7 +1,7 @@ package net.osmand.search.core; import net.osmand.Collator; -import net.osmand.CollatorStringMatcher; +import net.osmand.CollatorStringMatcher;import net.osmand.OsmAndCollator; import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.StringMatcher; import net.osmand.binary.BinaryMapIndexReader; @@ -9,7 +9,6 @@ import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.binary.CommonWords; import net.osmand.data.LatLon; import net.osmand.data.QuadRect; -import net.osmand.osm.AbstractPoiType; import net.osmand.util.Algorithms; import net.osmand.util.LocationParser; import net.osmand.util.MapUtils; @@ -27,31 +26,41 @@ import java.util.Set; import java.util.TreeSet; import java.util.regex.Pattern; -//immutable object +// Immutable object ! public class SearchPhrase { - - private List words = new ArrayList<>(); - private List unknownWords = new ArrayList<>(); - private List unknownWordsMatcher = new ArrayList<>(); - private String unknownSearchWordTrim; - private String rawUnknownSearchPhrase = ""; - private String unknownSearchPhrase = ""; - private AbstractPoiType unknownSearchWordPoiType; - private List unknownSearchWordPoiTypes = null; - - private NameStringMatcher sm; - private SearchSettings settings; - private List indexes; - - private QuadRect cache1kmRect; - private boolean lastUnknownSearchWordComplete; - private static final String DELIMITER = " "; + public static final String DELIMITER = " "; private static final String ALLDELIMITERS = "\\s|,"; private static final Pattern reg = Pattern.compile(ALLDELIMITERS); - private Collator clt; private static Comparator commonWordsComparator; - private static Set conjunctions = new TreeSet<>(); + + private final Collator clt; + private final SearchSettings settings; + private List indexes; + + // Object consists of 2 part [known + unknown] + private String fullTextSearchPhrase = ""; + private String unknownSearchPhrase = ""; + + // words to be used for words span + private List words = new ArrayList<>(); + + // Words of 2 parts + private String firstUnknownSearchWord = ""; + private List otherUnknownWords = new ArrayList<>(); + private boolean lastUnknownSearchWordComplete; + + // Main unknown word used for search + private String mainUnknownWordToSearch = null; + private boolean mainUnknownSearchWordComplete; + + // Name Searchers + private NameStringMatcher firstUnknownNameStringMatcher; + private NameStringMatcher mainUnknownNameStringMatcher; + private List unknownWordsMatcher = new ArrayList<>(); + + private QuadRect cache1kmRect; + static { // the conjunctions.add("the"); @@ -121,7 +130,12 @@ public class SearchPhrase { int i1 = CommonWords.getCommonSearch(o1.toLowerCase()); int i2 = CommonWords.getCommonSearch(o2.toLowerCase()); if (i1 != i2) { - return icompare(i1, i2); + if(i1 == -1) { + return -1; + } else if(i2 == -1) { + return 1; + } + return -icompare(i1, i2); } // compare length without numbers to not include house numbers return -icompare(lengthWithoutNumbers(o1), lengthWithoutNumbers(o2)); @@ -135,7 +149,7 @@ public class SearchPhrase { } - public SearchPhrase(SearchSettings settings, Collator clt) { + private SearchPhrase(SearchSettings settings, Collator clt) { this.settings = settings; this.clt = clt; } @@ -144,97 +158,181 @@ public class SearchPhrase { return clt; } + public SearchPhrase generateNewPhrase(String text, SearchSettings settings) { - SearchPhrase sp = new SearchPhrase(settings, this.clt); - String restText = text; + String textToSearch = Algorithms.normalizeSearchText(text); List leftWords = this.words; String thisTxt = getText(true); + List foundWords = new ArrayList<>(); if (text.startsWith(thisTxt)) { // string is longer - restText = text.substring(getText(false).length()); - sp.words = new ArrayList<>(this.words); + textToSearch = text.substring(getText(false).length()); + foundWords.addAll(this.words); leftWords = leftWords.subList(leftWords.size(), leftWords.size()); } - for(SearchWord w : leftWords) { - if(restText.startsWith(w.getWord() + DELIMITER)) { - sp.words.add(w); - restText = restText.substring(w.getWord().length() + DELIMITER.length()); + for (SearchWord w : leftWords) { + if (textToSearch.startsWith(w.getWord() + DELIMITER)) { + foundWords.add(w); + textToSearch = textToSearch.substring(w.getWord().length() + DELIMITER.length()); } else { break; } } - sp.rawUnknownSearchPhrase = text; - sp.unknownSearchPhrase = restText; - sp.unknownWords.clear(); - sp.unknownWordsMatcher.clear(); - - if (!reg.matcher(restText).find()) { - sp.unknownSearchWordTrim = sp.unknownSearchPhrase.trim(); + SearchPhrase sp = createNewSearchPhrase(settings, text, foundWords, textToSearch); + return sp; + } + + + + public static SearchPhrase emptyPhrase() { + return emptyPhrase(null); + } + + public static SearchPhrase emptyPhrase(SearchSettings settings) { + return emptyPhrase(settings, OsmAndCollator.primaryCollator()); + } + + public static SearchPhrase emptyPhrase(SearchSettings settings, Collator clt) { + return new SearchPhrase(settings, clt); + } + + // init search phrase + private SearchPhrase createNewSearchPhrase(SearchSettings settings, String fullText, List foundWords, + String textToSearch) { + SearchPhrase sp = new SearchPhrase(settings, this.clt); + sp.words = foundWords; + sp.fullTextSearchPhrase = fullText; + sp.unknownSearchPhrase = textToSearch; + sp.lastUnknownSearchWordComplete = isTextComplete(fullText) ; + if (!reg.matcher(textToSearch).find()) { + sp.firstUnknownSearchWord = sp.unknownSearchPhrase.trim(); } else { - sp.unknownSearchWordTrim = ""; - String[] ws = restText.split(ALLDELIMITERS); + sp.firstUnknownSearchWord = ""; + String[] ws = textToSearch.split(ALLDELIMITERS); boolean first = true; for (int i = 0; i < ws.length ; i++) { String wd = ws[i].trim(); - if (wd.length() > 0 && !conjunctions.contains(wd.toLowerCase())) { + boolean conjunction = conjunctions.contains(wd.toLowerCase()); + boolean lastAndIncomplete = i == ws.length - 1 && !sp.lastUnknownSearchWordComplete; + if (wd.length() > 0 && (!conjunction || lastAndIncomplete)) { if (first) { - sp.unknownSearchWordTrim = wd; + sp.firstUnknownSearchWord = wd; first = false; } else { - sp.unknownWords.add(wd); + sp.otherUnknownWords.add(wd); } } } } - sp.lastUnknownSearchWordComplete = false; - if (text.length() > 0 ) { - char ch = text.charAt(text.length() - 1); - sp.lastUnknownSearchWordComplete = ch == ' ' || ch == ',' || ch == '\r' || ch == '\n' - || ch == ';'; - } return sp; } + public int countWords(String w) { + int cnt = 0; + if (!Algorithms.isEmpty(w)) { + String[] ws = w.split(ALLDELIMITERS); + for (int i = 0; i < ws.length; i++) { + String wd = ws[i].trim(); + if (wd.length() > 0) { + cnt++; + } + } + } + return cnt; + } + + public SearchPhrase selectWord(SearchResult res, List unknownWords, boolean lastComplete) { + SearchPhrase sp = new SearchPhrase(this.settings, this.clt); + addResult(res, sp); + SearchResult prnt = res.parentSearchResult; + while (prnt != null) { + addResult(prnt, sp); + prnt = prnt.parentSearchResult; + } + sp.words.addAll(0, this.words); + if (unknownWords != null) { + sp.lastUnknownSearchWordComplete = lastComplete; + StringBuilder genUnknownSearchPhrase = new StringBuilder(); + for (int i = 0; i < unknownWords.size(); i++) { + if (i == 0) { + sp.firstUnknownSearchWord = unknownWords.get(0); + } else { + sp.otherUnknownWords.add(unknownWords.get(i)); + } + genUnknownSearchPhrase.append(unknownWords.get(i)).append(" "); + } + sp.fullTextSearchPhrase = fullTextSearchPhrase; + sp.unknownSearchPhrase = genUnknownSearchPhrase.toString().trim(); + } + return sp; + } + + + private void calcMainUnknownWordToSearch() { + if (mainUnknownWordToSearch != null) { + return; + } + List unknownSearchWords = otherUnknownWords; + mainUnknownWordToSearch = firstUnknownSearchWord; + mainUnknownSearchWordComplete = lastUnknownSearchWordComplete; + if (unknownSearchWords.size() > 0) { + mainUnknownSearchWordComplete = true; + List searchWords = new ArrayList<>(unknownSearchWords); + searchWords.add(0, getFirstUnknownSearchWord()); + Collections.sort(searchWords, commonWordsComparator); + for (String s : searchWords) { + if (s.length() > 0 && !Character.isDigit(s.charAt(0)) && !LocationParser.isValidOLC(s)) { + mainUnknownWordToSearch = s.trim(); + if (mainUnknownWordToSearch.endsWith(".")) { + mainUnknownWordToSearch = mainUnknownWordToSearch.substring(0, + mainUnknownWordToSearch.length() - 1); + mainUnknownSearchWordComplete = false; + } + int unknownInd = unknownSearchWords.indexOf(s); + if (!lastUnknownSearchWordComplete && unknownSearchWords.size() - 1 == unknownInd) { + mainUnknownSearchWordComplete = false; + } + break; + } + } + } + } public List getWords() { return words; } - public boolean isUnknownSearchWordComplete() { - return lastUnknownSearchWordComplete || unknownWords.size() > 0 || unknownSearchWordPoiType != null; + public boolean isMainUnknownSearchWordComplete() { + // return lastUnknownSearchWordComplete || otherUnknownWords.size() > 0 || unknownSearchWordPoiType != null; + return mainUnknownSearchWordComplete; } + public boolean isLastUnknownSearchWordComplete() { return lastUnknownSearchWordComplete; } - + + public boolean hasMoreThanOneUnknownSearchWord() { + return otherUnknownWords.size() > 0; + } public List getUnknownSearchWords() { - return unknownWords; - } - - public List getUnknownSearchWords(Collection exclude) { - if(exclude == null || unknownWords.size() == 0 || exclude.size() == 0) { - return unknownWords; - } - List l = new ArrayList<>(); - for(String uw : unknownWords) { - if(exclude == null || !exclude.contains(uw)) { - l.add(uw); - } - } - return l; + return otherUnknownWords; } - public String getUnknownSearchWord() { - return unknownSearchWordTrim; + public String getFirstUnknownSearchWord() { + return firstUnknownSearchWord; + } + + public boolean isFirstUnknownSearchWordComplete() { + return hasMoreThanOneUnknownSearchWord() || isLastUnknownSearchWordComplete(); } - public String getRawUnknownSearchPhrase() { - return rawUnknownSearchPhrase; + public String getFullSearchPhrase() { + return fullTextSearchPhrase; } public String getUnknownSearchPhrase() { @@ -242,66 +340,9 @@ public class SearchPhrase { } public boolean isUnknownSearchWordPresent() { - return unknownSearchWordTrim.length() > 0; + return firstUnknownSearchWord.length() > 0; } - public int getUnknownSearchWordLength() { - return unknownSearchWordTrim.length() ; - } - - public AbstractPoiType getUnknownSearchWordPoiType() { - return unknownSearchWordPoiType; - } - - public void setUnknownSearchWordPoiType(AbstractPoiType unknownSearchWordPoiType) { - this.unknownSearchWordPoiType = unknownSearchWordPoiType; - } - - public boolean hasUnknownSearchWordPoiType() { - return unknownSearchWordPoiType != null; - } - - public String getPoiNameFilter() { - return getPoiNameFilter(unknownSearchWordPoiType); - } - - public boolean hasUnknownSearchWordPoiTypes() { - return unknownSearchWordPoiTypes != null && unknownSearchWordPoiTypes.size() > 0; - } - - public List getUnknownSearchWordPoiTypes() { - return unknownSearchWordPoiTypes; - } - - public void setUnknownSearchWordPoiTypes(List unknownSearchWordPoiTypes) { - this.unknownSearchWordPoiTypes = unknownSearchWordPoiTypes; - for (AbstractPoiType pt : unknownSearchWordPoiTypes) { - if (getPoiNameFilter(pt) != null) { - setUnknownSearchWordPoiType(pt); - break; - } - } - } - - public String getPoiNameFilter(AbstractPoiType pt) { - String nameFilter = null; - if (pt != null) { - NameStringMatcher nm = getNameStringMatcher(getUnknownSearchWord(), true); - String unknownSearchPhrase = getUnknownSearchPhrase(); - String enTranslation = pt.getEnTranslation(); - String translation = pt.getTranslation(); - String synonyms = pt.getSynonyms(); - if (unknownSearchPhrase.length() >= enTranslation.length() && nm.matches(enTranslation)) { - nameFilter = unknownSearchPhrase.substring(enTranslation.length()).trim(); - } else if (unknownSearchPhrase.length() >= translation.length() && nm.matches(translation)) { - nameFilter = unknownSearchPhrase.substring(translation.length()).trim(); - } else if (unknownSearchPhrase.length() >= synonyms.length() && nm.matches(synonyms)) { - nameFilter = unknownSearchPhrase.substring(synonyms.length()).trim(); - } - } - return nameFilter; - } - public QuadRect getRadiusBBoxToSearch(int radius) { int radiusInMeters = getRadiusSearch(radius); QuadRect cache1kmRect = get1km31Rect(); @@ -454,27 +495,6 @@ public class SearchPhrase { return selectWord(res, null, false); } - public SearchPhrase selectWord(SearchResult res, List unknownWords, boolean lastComplete) { - SearchPhrase sp = new SearchPhrase(this.settings, this.clt); - addResult(res, sp); - SearchResult prnt = res.parentSearchResult; - while(prnt != null) { - addResult(prnt, sp); - prnt = prnt.parentSearchResult; - } - sp.words.addAll(0, this.words); - if(unknownWords != null) { - sp.lastUnknownSearchWordComplete = lastComplete; - for (int i = 0; i < unknownWords.size(); i++) { - if (i == 0) { - sp.unknownSearchWordTrim = unknownWords.get(0); - } else { - sp.unknownWords.add(unknownWords.get(i)); - } - } - } - return sp; - } private void addResult(SearchResult res, SearchPhrase sp) { SearchWord sw = new SearchWord(res.wordsSpan != null ? res.wordsSpan : res.localeName.trim(), res); @@ -504,16 +524,32 @@ public class SearchPhrase { return null; } - public NameStringMatcher getNameStringMatcher() { - if(sm != null) { - return sm; + public NameStringMatcher getMainUnknownNameStringMatcher() { + calcMainUnknownWordToSearch(); + if (mainUnknownNameStringMatcher == null) { + mainUnknownNameStringMatcher = getNameStringMatcher(mainUnknownWordToSearch, mainUnknownSearchWordComplete); } - sm = getNameStringMatcher(unknownSearchWordTrim, lastUnknownSearchWordComplete); - return sm; + return mainUnknownNameStringMatcher; + } + + public NameStringMatcher getFirstUnknownNameStringMatcher() { + if (firstUnknownNameStringMatcher == null) { + firstUnknownNameStringMatcher = getNameStringMatcher(firstUnknownSearchWord, isFirstUnknownSearchWordComplete()); + } + return firstUnknownNameStringMatcher; + } + + public NameStringMatcher getUnknownNameStringMatcher(int i) { + while (unknownWordsMatcher.size() <= i) { + int ind = unknownWordsMatcher.size(); + boolean completeMatch = ind < otherUnknownWords.size() - 1 || isLastUnknownSearchWordComplete(); + unknownWordsMatcher.add(getNameStringMatcher(otherUnknownWords.get(ind), completeMatch)); + } + return unknownWordsMatcher.get(i); } - public NameStringMatcher getNameStringMatcher(String word, boolean complete) { + private NameStringMatcher getNameStringMatcher(String word, boolean complete) { return new NameStringMatcher(word, (complete ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE : @@ -535,12 +571,12 @@ public class SearchPhrase { } } - public String getText(boolean includeLastWord) { + public String getText(boolean includeUnknownPart) { StringBuilder sb = new StringBuilder(); for(SearchWord s : words) { - sb.append(s.getWord()).append(DELIMITER.trim() + " "); + sb.append(s.getWord()).append(DELIMITER); } - if(includeLastWord) { + if(includeUnknownPart) { sb.append(unknownSearchPhrase); } return sb.toString(); @@ -549,11 +585,11 @@ public class SearchPhrase { public String getTextWithoutLastWord() { StringBuilder sb = new StringBuilder(); List words = new ArrayList<>(this.words); - if(Algorithms.isEmpty(unknownSearchWordTrim) && words.size() > 0) { + if (Algorithms.isEmpty(unknownSearchPhrase.trim()) && words.size() > 0) { words.remove(words.size() - 1); } for(SearchWord s : words) { - sb.append(s.getWord()).append(DELIMITER.trim() + " "); + sb.append(s.getWord()).append(DELIMITER); } return sb.toString(); } @@ -696,8 +732,8 @@ public class SearchPhrase { private CollatorStringMatcher sm; - public NameStringMatcher(String lastWordTrim, StringMatcherMode mode) { - sm = new CollatorStringMatcher(lastWordTrim, mode); + public NameStringMatcher(String namePart, StringMatcherMode mode) { + sm = new CollatorStringMatcher(namePart, mode); } public boolean matches(Collection map) { @@ -719,34 +755,60 @@ public class SearchPhrase { } - public void countUnknownWordsMatch(SearchResult sr) { - countUnknownWordsMatch(sr, sr.localeName, sr.otherNames); + public int countUnknownWordsMatchMainResult(SearchResult sr) { + return countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, 0); } - public void countUnknownWordsMatch(SearchResult sr, String localeName, Collection otherNames) { - if(unknownWords.size() > 0) { - for(int i = 0; i < unknownWords.size(); i++) { - if(unknownWordsMatcher.size() == i) { - unknownWordsMatcher.add(new NameStringMatcher(unknownWords.get(i), - i < unknownWords.size() - 1 || isLastUnknownSearchWordComplete() ? StringMatcherMode.CHECK_EQUALS_FROM_SPACE : - StringMatcherMode.CHECK_STARTS_FROM_SPACE)); + public int countUnknownWordsMatchMainResult(SearchResult sr, int amountMatchingWords) { + return countUnknownWordsMatch(sr, sr.localeName, sr.otherNames, amountMatchingWords); + } + + + public int countUnknownWordsMatch(SearchResult sr, String localeName, Collection otherNames, int amountMatchingWords) { + int r = 0; + if (otherUnknownWords.size() > 0) { + for (int i = 0; i < otherUnknownWords.size(); i++) { + boolean match = false; + if (i < amountMatchingWords - 1) { + match = true; + } else { + NameStringMatcher ms = getUnknownNameStringMatcher(i); + if (ms.matches(localeName) || ms.matches(otherNames)) { + match = true; + } } - NameStringMatcher ms = unknownWordsMatcher.get(i); - if(ms.matches(localeName) || ms.matches(otherNames)) { - if(sr.otherWordsMatch == null) { + if (match) { + if (sr.otherWordsMatch == null) { sr.otherWordsMatch = new TreeSet<>(); } - sr.otherWordsMatch.add(unknownWords.get(i)); + sr.otherWordsMatch.add(otherUnknownWords.get(i)); + r++; } } } - if(!sr.firstUnknownWordMatches) { - sr.firstUnknownWordMatches = localeName.equals(getUnknownSearchWord()) || - getNameStringMatcher().matches(localeName) || - getNameStringMatcher().matches(otherNames); + if (amountMatchingWords > 0) { + sr.firstUnknownWordMatches = true; + r++; + } else { + boolean match = localeName.equals(getFirstUnknownSearchWord()) + || getFirstUnknownNameStringMatcher().matches(localeName) + || getFirstUnknownNameStringMatcher().matches(otherNames); + if(match) { + r++; + } + sr.firstUnknownWordMatches = match || sr.firstUnknownWordMatches; } - + return r; } + + public String getLastUnknownSearchWord() { + if(otherUnknownWords.size() > 0) { + return otherUnknownWords.get(otherUnknownWords.size() - 1); + } + return firstUnknownSearchWord; + } + + public int getRadiusSearch(int meters, int radiusLevel) { int res = meters; for(int k = 0; k < radiusLevel; k++) { @@ -767,17 +829,38 @@ public class SearchPhrase { return (x < y) ? -1 : ((x == y) ? 0 : 1); } - public String getUnknownWordToSearchBuilding() { - List unknownSearchWords = getUnknownSearchWords(); - if(unknownSearchWords.size() > 0 && Algorithms.extractFirstIntegerNumber(getUnknownSearchWord()) == 0) { - for(String wrd : unknownSearchWords) { - if(Algorithms.extractFirstIntegerNumber(wrd) != 0) { - return wrd; + private int getUnknownWordToSearchBuildingInd() { + if (otherUnknownWords.size() > 0 && Algorithms.extractFirstIntegerNumber(getFirstUnknownSearchWord()) == 0) { + int ind = 0; + for (String wrd : otherUnknownWords) { + ind++; + if (Algorithms.extractFirstIntegerNumber(wrd) != 0) { + return ind; } } - } - return getUnknownSearchWord(); + } + return 0; } + + public NameStringMatcher getUnknownWordToSearchBuildingNameMatcher() { + int ind = getUnknownWordToSearchBuildingInd(); + if(ind > 0) { + return getUnknownNameStringMatcher(ind - 1); + } else { + return getFirstUnknownNameStringMatcher(); + } + } + + public String getUnknownWordToSearchBuilding() { + int ind = getUnknownWordToSearchBuildingInd(); + if(ind > 0) { + return otherUnknownWords.get(ind - 1); + } else { + return firstUnknownSearchWord; + } + } + + private static int lengthWithoutNumbers(String s) { int len = 0; @@ -792,20 +875,23 @@ public class SearchPhrase { } public String getUnknownWordToSearch() { - List unknownSearchWords = getUnknownSearchWords(); - String wordToSearch = getUnknownSearchWord(); - if (unknownSearchWords.size() > 0) { - List searchWords = new ArrayList<>(unknownSearchWords); - searchWords.add(0, getUnknownSearchWord()); - Collections.sort(searchWords, commonWordsComparator); - for (String s : searchWords) { - if (s.length() > 0 && !Character.isDigit(s.charAt(0)) && !LocationParser.isValidOLC(s)) { - return s; - } - } + calcMainUnknownWordToSearch(); + return mainUnknownWordToSearch; + } + + private boolean isTextComplete(String fullText) { + boolean lastUnknownSearchWordComplete = false; + if (fullText.length() > 0 ) { + char ch = fullText.charAt(fullText.length() - 1); + lastUnknownSearchWordComplete = ch == ' ' || ch == ',' || ch == '\r' || ch == '\n' + || ch == ';'; } - return wordToSearch; + return lastUnknownSearchWordComplete; } + + + + } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java index 93f0acfafd..79d11a3fe0 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchResult.java @@ -16,40 +16,69 @@ import java.util.Collection; public class SearchResult { // search phrase that makes search result valid public SearchPhrase requiredSearchPhrase; + + // internal package fields (used for sorting) + public SearchResult parentSearchResult; + String wordsSpan ; + boolean firstUnknownWordMatches; + Collection otherWordsMatch = null; + public Object object; public ObjectType objectType; public BinaryMapIndexReader file; - + public double priority; public double priorityDistance; - public String wordsSpan ; - public SearchResult parentSearchResult; - public Collection otherWordsMatch = null; - public boolean firstUnknownWordMatches = true; - public boolean unknownPhraseMatches = false; + + public LatLon location; + public int preferredZoom = 15; + + public String localeName; + public String alternateName; + public Collection otherNames; + + public String localeRelatedObjectName; + public Object relatedObject; + public double distRelatedObjectName; public SearchResult(SearchPhrase sp) { this.requiredSearchPhrase = sp; } + private static final double MAX_TYPE_WEIGHT = 10; + // maximum corresponds to the top entry public double getUnknownPhraseMatchWeight() { - return getUnknownPhraseMatchWeight(false); + // if result is a complete match in the search we prioritize it higher + return getSumPhraseMatchWeight() / Math.pow(MAX_TYPE_WEIGHT, getDepth() - 1); } - - private double getUnknownPhraseMatchWeight(boolean isHouse) { - double res = 0; - isHouse = isHouse || objectType == ObjectType.HOUSE; - if (unknownPhraseMatches) { - res = isHouse ? ObjectType.getTypeWeight(ObjectType.HOUSE) : ObjectType.getTypeWeight(objectType); - } - if (res == 0 && parentSearchResult != null) { - return parentSearchResult.getUnknownPhraseMatchWeight(isHouse); + + public double getSumPhraseMatchWeight() { + // if result is a complete match in the search we prioritize it higher + boolean match = requiredSearchPhrase.countWords(localeName) <= getSelfWordCount(); + double res = ObjectType.getTypeWeight(match ? objectType : null); + if (parentSearchResult != null) { + res = res + parentSearchResult.getSumPhraseMatchWeight() / MAX_TYPE_WEIGHT; } return res; } + public int getDepth() { + if (parentSearchResult != null) { + return 1 + parentSearchResult.getDepth(); + } + return 1; + } + public int getFoundWordCount() { + int inc = getSelfWordCount(); + if (parentSearchResult != null) { + inc += parentSearchResult.getFoundWordCount(); + } + return inc; + } + + private int getSelfWordCount() { int inc = 0; if (firstUnknownWordMatches) { inc = 1; @@ -57,9 +86,6 @@ public class SearchResult { if (otherWordsMatch != null) { inc += otherWordsMatch.size(); } - if (parentSearchResult != null) { - inc += parentSearchResult.getFoundWordCount(); - } return inc; } @@ -79,16 +105,6 @@ public class SearchResult { return priority - 1 / (1 + pd * distance); } - public LatLon location; - public int preferredZoom = 15; - public String localeName; - public String alternateName; - - public Collection otherNames; - - public String localeRelatedObjectName; - public Object relatedObject; - public double distRelatedObjectName; @Override public String toString() { diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java index 3779bb801a..c9d6b99542 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java @@ -23,8 +23,7 @@ public class SearchSettings { private ObjectType[] searchTypes; private boolean emptyQueryAllowed; private boolean sortByName; - private SearchExportSettings exportSettings; - //private SearchExportSettings exportSettings = new SearchExportSettings(false, false); + private SearchExportSettings exportSettings; // = new SearchExportSettings(true, true, -1); public SearchSettings(SearchSettings s) { if(s != null) { diff --git a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java index cd35c0a8ee..ea2869aaa3 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java @@ -26,6 +26,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; @@ -41,11 +42,34 @@ public class Algorithms { private static final int BUFFER_SIZE = 1024; private static final Log log = PlatformUtil.getLog(Algorithms.class); - public static boolean isEmpty(Collection c) { + public static boolean isEmpty(Collection c) { return c == null || c.size() == 0; } + + private static char[] CHARS_TO_NORMALIZE_KEY = new char['’']; + private static char[] CHARS_TO_NORMALIZE_VALUE = new char['\'']; - public static boolean isEmpty(Map map) { + public static String normalizeSearchText(String s) { + boolean norm = false; + for (int i = 0; i < s.length() && !norm; i++) { + char ch = s.charAt(i); + for (int j = 0; j < CHARS_TO_NORMALIZE_KEY.length; j++) { + if (ch == CHARS_TO_NORMALIZE_KEY[j]) { + norm = true; + break; + } + } + } + if (!norm) { + return s; + } + for (int k = 0; k < CHARS_TO_NORMALIZE_KEY.length; k++) { + s = s.replace(CHARS_TO_NORMALIZE_KEY[k], CHARS_TO_NORMALIZE_VALUE[k]); + } + return s; + } + + public static boolean isEmpty(Map map) { return map == null || map.size() == 0; } @@ -90,10 +114,12 @@ public class Algorithms { return def; } - public static String getFileNameWithoutExtension(File f) { - String name = f.getName(); - int i = name.indexOf('.'); + return getFileNameWithoutExtension(f.getName()); + } + + public static String getFileNameWithoutExtension(String name) { + int i = name.lastIndexOf('.'); if (i >= 0) { name = name.substring(0, i); } @@ -114,6 +140,26 @@ public class Algorithms { return name; } + public static List collectDirs(File parentDir, List dirs) { + return collectDirs(parentDir, dirs, null); + } + + public static List collectDirs(File parentDir, List dirs, File exclDir) { + File[] listFiles = parentDir.listFiles(); + if (listFiles != null) { + Arrays.sort(listFiles); + for (File f : listFiles) { + if (f.isDirectory()) { + if (!f.equals(exclDir)) { + dirs.add(f); + } + Algorithms.collectDirs(f, dirs); + } + } + } + return dirs; + } + public static File[] getSortedFilesVersions(File dir) { File[] listFiles = dir.listFiles(); if (listFiles != null) { @@ -250,6 +296,32 @@ public class Algorithms { return test == 0x504b0304; } + /** + * Checks, whether the child directory is a subdirectory of the parent + * directory. + * + * @param parent the parent directory. + * @param child the suspected child directory. + * @return true if the child is a subdirectory of the parent directory. + */ + public static boolean isSubDirectory(File parent, File child) { + try { + parent = parent.getCanonicalFile(); + child = child.getCanonicalFile(); + + File dir = child; + while (dir != null) { + if (parent.equals(dir)) { + return true; + } + dir = dir.getParentFile(); + } + } catch (IOException e) { + return false; + } + return false; + } + private static int readInt(InputStream in) throws IOException { int ch1 = in.read(); int ch2 = in.read(); @@ -292,10 +364,8 @@ public class Algorithms { * exception. Supported formats are: * #RRGGBB * #AARRGGBB - * 'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', - * 'yellow', 'lightgray', 'darkgray' */ - public static int parseColor(String colorString) { + public static int parseColor(String colorString) throws IllegalArgumentException { if (colorString.charAt(0) == '#') { // Use a long to avoid rollovers on #ffXXXXXX if (colorString.length() == 4) { @@ -456,6 +526,10 @@ public class Algorithms { } public static StringBuilder readFromInputStream(InputStream i) throws IOException { + return readFromInputStream(i, true); + } + + public static StringBuilder readFromInputStream(InputStream i, boolean autoclose) throws IOException { StringBuilder responseBody = new StringBuilder(); responseBody.setLength(0); if (i != null) { @@ -470,6 +544,9 @@ public class Algorithms { } responseBody.append(s); } + if (autoclose) { + i.close(); + } } return responseBody; } @@ -679,13 +756,9 @@ public class Algorithms { } public static String formatMinutesDuration(int minutes) { - if (minutes < 60) { - return String.valueOf(minutes); - } else { - int min = minutes % 60; - int hours = minutes / 60; - return String.format(Locale.UK, "%02d:%02d", hours, min); - } + int min = minutes % 60; + int hours = minutes / 60; + return String.format(Locale.UK, "%02d:%02d", hours, min); } public static > T parseEnumValue(T[] cl, String val, T defaultValue) { diff --git a/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java b/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java index d560d36332..1383f4ae4a 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java @@ -3,6 +3,8 @@ package net.osmand.util; import java.net.URI; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.Arrays; +import java.util.Base64; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Locale; @@ -11,9 +13,12 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.osmand.data.LatLon; +import net.osmand.util.GeoPointParserUtil.GeoParsedPoint; + public class GeoPointParserUtil { - + private static String getQueryParameter(final String param, URI uri) { final String query = uri.getQuery(); String value = null; @@ -69,6 +74,31 @@ public class GeoPointParserUtil { } return map; } + + private static int kMaxPointBytes = 10; + private static int kMaxCoordBits = kMaxPointBytes * 3; + public static LatLon decodeMapsMeLatLonToInt(String s) { + // 44TvlEGXf- + int lat = 0, lon = 0; + int shift = kMaxCoordBits - 3; + for (int i = 0; i < s.length(); ++i, shift -= 3) { + int a = net.osmand.osm.io.Base64.indexOf(s.charAt(i)); + if (a < 0) + return null; + + int lat1 = (((a >> 5) & 1) << 2 | ((a >> 3) & 1) << 1 | ((a >> 1) & 1)); + int lon1 = (((a >> 4) & 1) << 2 | ((a >> 2) & 1) << 1 | (a & 1)); + lat |= lat1 << shift; + lon |= lon1 << shift; + } + double middleOfSquare = 1 << (3 * (kMaxPointBytes - s.length()) - 1); + lat += middleOfSquare; + lon += middleOfSquare; + + double dlat = ((double) lat) / ((1 << kMaxCoordBits) - 1) * 180 - 90; + double dlon = ((double) lon) / ((1 << kMaxCoordBits) - 1 + 1) * 360.0 - 180; + return new LatLon(dlat, dlon); + } /** * Parses geo and map intents: @@ -103,7 +133,7 @@ public class GeoPointParserUtil { if(uri.getSchemeSpecificPart() == null) { return null; } else if(!uri.getSchemeSpecificPart().contains("=")) { - params = getQueryParameters("q="+uri.getSchemeSpecificPart()); + params = getQueryParameters("q="+uri.getSchemeSpecificPart()); } else { params = getQueryParameters(uri.getSchemeSpecificPart()); } @@ -181,7 +211,7 @@ public class GeoPointParserUtil { } } else if (host.startsWith("map.baidu.")) { // .com and .cn both work /* Baidu Map uses a custom format for lat/lon., it is basically standard lat/lon - * multiplied by 100,000, then rounded to an integer */ + * multiplied by 100,000, then rounded to an integer */ String zm = params.get("l"); String[] vls = silentSplit(params.get("c"), ","); if (vls != null && vls.length >= 2) { @@ -190,6 +220,31 @@ public class GeoPointParserUtil { int zoom = parseZoom(zm); return new GeoParsedPoint(lat, lon, zoom); } + } else if (host.equals("ge0.me")) { + // http:///44TvlEGXf-/Kyiv + if (path.startsWith("/")) { + path = path.substring(1); + } + String[] pms = path.split("/"); + String label = ""; + if (pms.length > 1) { + label = pms[1]; + } + String qry = pms[0]; + if (qry.length() < 10) { + return null; + } + int indZoom = net.osmand.osm.io.Base64.indexOf(qry.charAt(0)); + int zoom = 15; + if (indZoom >= 0) { + zoom = indZoom / 4 + 4; + } + LatLon l = decodeMapsMeLatLonToInt(qry.substring(1).replace('-', '/')); + if (l == null) { + return null; + } + return new GeoParsedPoint(l.getLatitude(), l.getLongitude(), zoom, label); + } else if (simpleDomains.contains(host)) { if (uri.getQuery() == null && params.size() == 0) { // DOUBLE check this may be wrong test of openstreetmap.de (looks very weird url and server doesn't respond) @@ -219,9 +274,8 @@ public class GeoPointParserUtil { String latString = null; String lonString = null; String z = String.valueOf(GeoParsedPoint.NO_ZOOM); - + if (params.containsKey("q")) { - System.out.println("q=" + params.get("q")); Matcher matcher = commaSeparatedPairPattern.matcher(params.get("q")); if (matcher.matches()) { latString = matcher.group(1); @@ -252,7 +306,6 @@ public class GeoPointParserUtil { } final String postf = "\\s\\((\\p{L}|\\p{M}|\\p{Z}|\\p{S}|\\p{N}|\\p{P}|\\p{C})*\\)$"; opath = opath.replaceAll(postf, ""); - System.out.println("opath=" + opath); return parseGoogleMapsPath(opath, params); } if (fragment != null) { @@ -262,13 +315,32 @@ public class GeoPointParserUtil { return new GeoParsedPoint(m.group(1)); } } - + String DATA_PREFIX = "/data="; String[] pathPrefixes = new String[]{"/@", "/ll=", - "loc:", "/"}; + "loc:", DATA_PREFIX, "/"}; for (String pref : pathPrefixes) { if (path.contains(pref)) { path = path.substring(path.lastIndexOf(pref) + pref.length()); - return parseGoogleMapsPath(path, params); + if (path.contains("/")) { + path = path.substring(0, path.indexOf('/')); + } + if (pref.equals(DATA_PREFIX)) { + String[] vls = path.split("!"); + String lat = null; + String lon = null; + for (String v : vls) { + if (v.startsWith("3d")) { + lat = v.substring(2); + } else if (v.startsWith("4d")) { + lon = v.substring(2); + } + } + if (lat != null && lon != null) { + return new GeoParsedPoint(Double.valueOf(lat), Double.valueOf(lon)); + } + } else { + return parseGoogleMapsPath(path, params); + } } } } else if (host.endsWith(".amap.com")) { @@ -279,7 +351,7 @@ public class GeoPointParserUtil { Pattern p; Matcher matcher; final String[] patterns = { - /* though this looks like Query String, it is also used as part of the Fragment */ + /* though this looks like Query String, it is also used as part of the Fragment */ ".*q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*&radius=(\\d+).*", ".*q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*", ".*p=(?:[A-Z0-9]+),([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*",}; @@ -297,7 +369,7 @@ public class GeoPointParserUtil { } } } - } else if (host.equals("here.com") || host.endsWith(".here.com")) { // www.here.com, share.here.com, here.com + } else if (host.equals("here.com") || host.endsWith(".here.com")) { // www.here.com, share.here.com, here.com String z = String.valueOf(GeoParsedPoint.NO_ZOOM); String label = null; if (params.containsKey("msg")) { @@ -474,7 +546,7 @@ public class GeoPointParserUtil { } if ("z".equals(paramName) && paramValue != null) { - zoom = Integer.parseInt(paramValue); + zoom = (int) Float.parseFloat(paramValue); } else if ("q".equals(paramName) && paramValue != null) { searchRequest = URLDecoder.decode(paramValue); } @@ -569,7 +641,7 @@ public class GeoPointParserUtil { private static int parseZoom(String zoom) { try { if (zoom != null) { - return Integer.valueOf(zoom); + return (int) Float.parseFloat(zoom); } } catch (NumberFormatException e) { } @@ -579,7 +651,7 @@ public class GeoPointParserUtil { private static double parseSilentDouble(String zoom) { return parseSilentDouble(zoom, 0); } - + private static double parseSilentDouble(String zoom, double vl) { try { if (zoom != null) { @@ -754,9 +826,9 @@ public class GeoPointParserUtil { @Override public String toString() { - return isGeoPoint() ? - String.format("GeoParsedPoint [lat=%.5f, lon=%.5f, zoom=%d, label=%s]", lat, lon, zoom, label) : - String.format("GeoParsedPoint [query=%s]",query); + return isGeoPoint() ? + String.format("GeoParsedPoint [lat=%.5f, lon=%.5f, zoom=%d, label=%s]", lat, lon, zoom, label) : + String.format("GeoParsedPoint [query=%s]",query); } } } diff --git a/OsmAnd-java/src/main/java/net/osmand/util/OpeningHoursParser.java b/OsmAnd-java/src/main/java/net/osmand/util/OpeningHoursParser.java index 780713b3c3..01fee5cd9e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/OpeningHoursParser.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/OpeningHoursParser.java @@ -886,6 +886,12 @@ public class OpeningHoursParser { return new TIntArrayList(endTimes); } + public void setDays(boolean[] days) { + if (this.days.length == days.length) { + this.days = days; + } + } + /** * Check if the weekday of time "cal" is part of this rule * diff --git a/OsmAnd-java/src/test/java/net/osmand/ReShaperTest.java b/OsmAnd-java/src/test/java/net/osmand/ReShaperTest.java new file mode 100644 index 0000000000..c915789762 --- /dev/null +++ b/OsmAnd-java/src/test/java/net/osmand/ReShaperTest.java @@ -0,0 +1,56 @@ +package net.osmand; + +import java.text.Normalizer; + +import org.junit.Test; + +import com.ibm.icu.text.ArabicShaping; +import com.ibm.icu.text.ArabicShapingException; +import com.ibm.icu.text.Bidi; + +import net.osmand.Reshaper; + +public class ReShaperTest { + + + // + +// Source : ⁦ه ‎ە ‎ی ‎ب ‎ە ‎ +// Expected: ⁦ه ‎ە ‎ی ‎ب ‎ە ‎ +// Reshaped: ⁦ە ‎ﺐ ‎ﯾ ‎ە ‎ﻩ + @Test + public void testArabName() throws ArabicShapingException { + // https://www.compart.com/en/unicode/U+FCD8 +// String source = "\uFEEB\u06d5"; +// System.out.println(new ArabicShaping(0).shape(s)); +// System.out.println("\uFEEB\u06d5"); + String source = "هەیبە"; + String expected = "ەﺐﯾەﻩ"; + String res = Reshaper.reshape(source); + Reshaper.check(source, res, expected); + } + + + @Test + public void test2() throws ArabicShapingException { + Reshaper.test2(); + } + + @Test + public void test3() throws ArabicShapingException { + Reshaper.test3(); + } + + @Test + public void test4() throws ArabicShapingException { + Reshaper.test4(); + } + + @Test + public void test5() throws ArabicShapingException { + Reshaper.test5(); + } + + + +} diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java index 31f4b3b4fa..d745a73327 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java @@ -38,15 +38,13 @@ public class RouteResultPreparationTest { private static RoutePlannerFrontEnd fe; private static RoutingContext ctx; - private String testName; private LatLon startPoint; private LatLon endPoint; private Map expectedResults; - private Log log = PlatformUtil.getLog(RouteResultPreparationTest.class); + protected Log log = PlatformUtil.getLog(RouteResultPreparationTest.class); public RouteResultPreparationTest(String testName, LatLon startPoint, LatLon endPoint, Map expectedResults) { - this.testName = testName; this.startPoint = startPoint; this.endPoint = endPoint; this.expectedResults = expectedResults; diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java index b4f343da62..06e6ef8fda 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java @@ -15,6 +15,7 @@ import java.util.TreeSet; import net.osmand.binary.BinaryMapIndexReader; +import net.osmand.data.LatLon; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -29,42 +30,52 @@ public class RouteTestingTest { private TestEntry te; - public RouteTestingTest(String name, TestEntry te) { - this.te = te; - } + public RouteTestingTest(String name, TestEntry te) { + this.te = te; + } - @BeforeClass - public static void setUp() throws Exception { - RouteResultPreparation.PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = true; - } + @BeforeClass + public static void setUp() throws Exception { + RouteResultPreparation.PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = true; + } - @Parameterized.Parameters(name = "{index}: {0}") - public static Iterable data() throws IOException { - String fileName = "/test_routing.json"; - Reader reader = new InputStreamReader(RouteTestingTest.class.getResourceAsStream(fileName)); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - TestEntry[] testEntries = gson.fromJson(reader, TestEntry[].class); - ArrayList arrayList = new ArrayList<>(); - for(TestEntry te : testEntries) { - if(te.isIgnore()) { - continue; - } - arrayList.add(new Object[] {te.getTestName(), te}); - } - reader.close(); - return arrayList; + @Parameterized.Parameters(name = "{index}: {0}") + public static Iterable data() throws IOException { + String fileName = "/test_routing.json"; + Reader reader = new InputStreamReader(RouteTestingTest.class.getResourceAsStream(fileName)); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + TestEntry[] testEntries = gson.fromJson(reader, TestEntry[].class); + ArrayList arrayList = new ArrayList<>(); + for (TestEntry te : testEntries) { + if (te.isIgnore()) { + continue; + } + arrayList.add(new Object[]{te.getTestName(), te}); + } + reader.close(); + return arrayList; - } + } - @Test + @Test public void testRouting() throws Exception { String fl = "src/test/resources/Routing_test.obf"; RandomAccessFile raf = new RandomAccessFile(fl, "r"); RoutePlannerFrontEnd fe = new RoutePlannerFrontEnd(); - BinaryMapIndexReader[] binaryMapIndexReaders = { new BinaryMapIndexReader(raf, new File(fl)) }; + BinaryMapIndexReader[] binaryMapIndexReaders;// = { new BinaryMapIndexReader(raf, new File(fl)) }; RoutingConfiguration.Builder builder = RoutingConfiguration.getDefault(); Map params = te.getParams(); + if (params.containsKey("map")) { + String fl1 = "src/test/resources/" + params.get("map"); + RandomAccessFile raf1 = new RandomAccessFile(fl1, "r"); + binaryMapIndexReaders = new BinaryMapIndexReader[]{ + new BinaryMapIndexReader(raf1, new File(fl1)), + new BinaryMapIndexReader(raf, new File(fl)) + }; + } else { + binaryMapIndexReaders = new BinaryMapIndexReader[]{new BinaryMapIndexReader(raf, new File(fl))}; + } RoutingConfiguration config = builder.build(params.containsKey("vehicle") ? params.get("vehicle") : "car", RoutingConfiguration.DEFAULT_MEMORY_LIMIT * 3, params); RoutingContext ctx = fe.buildRoutingContext(config, null, binaryMapIndexReaders, @@ -102,6 +113,4 @@ public class RouteTestingTest { } - - } diff --git a/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java b/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java index 3190115507..874a82aeb0 100644 --- a/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/search/LocationSearchTest.java @@ -17,7 +17,7 @@ public class LocationSearchTest { private void search(String string, LatLon latLon) throws IOException { SearchResultMatcher srm = new SearchUICore.SearchResultMatcher(null, null, 0, null, 100); new SearchCoreFactory.SearchLocationAndUrlAPI(). - search(new SearchPhrase(null, OsmAndCollator.primaryCollator()).generateNewPhrase(string, null), srm); + search(SearchPhrase.emptyPhrase().generateNewPhrase(string, null), srm); Assert.assertEquals(1, srm.getRequestResults().size()); Assert.assertEquals(latLon, srm.getRequestResults().get(0).location); } diff --git a/OsmAnd-java/src/test/java/net/osmand/search/SearchCoreUITest.java b/OsmAnd-java/src/test/java/net/osmand/search/SearchCoreUITest.java deleted file mode 100644 index 80d92b7bf1..0000000000 --- a/OsmAnd-java/src/test/java/net/osmand/search/SearchCoreUITest.java +++ /dev/null @@ -1,430 +0,0 @@ -package net.osmand.search; - -import net.osmand.OsmAndCollator; -import net.osmand.ResultMatcher; -import net.osmand.binary.BinaryMapIndexReader; -import net.osmand.data.Amenity; -import net.osmand.data.Building; -import net.osmand.data.City; -import net.osmand.data.LatLon; -import net.osmand.data.MapObject; -import net.osmand.data.Street; -import net.osmand.osm.AbstractPoiType; -import net.osmand.osm.MapPoiTypes; -import net.osmand.search.SearchUICore.SearchResultCollection; -import net.osmand.search.SearchUICore.SearchResultMatcher; -import net.osmand.search.core.SearchPhrase; -import net.osmand.search.core.SearchResult; -import net.osmand.search.core.SearchSettings; -import net.osmand.util.Algorithms; -import net.osmand.util.MapUtils; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Assert; -import org.junit.Test; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -public class SearchCoreUITest { - - private static final String SEARCH_RESOURCES_PATH = "src/test/resources/search/"; - private static Map enPhrases = new HashMap<>(); - private static Map phrases = new HashMap<>(); - - static { - MapPoiTypes.setDefault(new MapPoiTypes("src/test/resources/poi_types.xml")); - MapPoiTypes poiTypes = MapPoiTypes.getDefault(); - - try { - enPhrases = Algorithms.parseStringsXml(new File("src/test/resources/phrases/en/phrases.xml")); - //phrases = Algorithms.parseStringsXml(new File("src/test/resources/phrases/ru/phrases.xml")); - phrases = enPhrases; - } catch (IOException e) { - e.printStackTrace(); - } catch (XmlPullParserException e) { - e.printStackTrace(); - } - - poiTypes.setPoiTranslator(new MapPoiTypes.PoiTranslator() { - - @Override - public String getTranslation(AbstractPoiType type) { - AbstractPoiType baseLangType = type.getBaseLangType(); - if (baseLangType != null) { - return getTranslation(baseLangType) + " (" + type.getLang().toLowerCase() + ")"; - } - return getTranslation(type.getIconKeyName()); - } - - @Override - public String getTranslation(String keyName) { - String val = phrases.get("poi_" + keyName); - if (val != null) { - int ind = val.indexOf(';'); - if (ind > 0) { - return val.substring(0, ind); - } - } - return val; - } - - @Override - public String getSynonyms(AbstractPoiType type) { - AbstractPoiType baseLangType = type.getBaseLangType(); - if (baseLangType != null) { - return getSynonyms(baseLangType); - } - return getSynonyms(type.getIconKeyName()); - } - - - @Override - public String getSynonyms(String keyName) { - String val = phrases.get("poi_" + keyName); - if (val != null) { - int ind = val.indexOf(';'); - if (ind > 0) { - return val.substring(ind + 1); - } - return ""; - } - return null; - } - - @Override - public String getEnTranslation(AbstractPoiType type) { - AbstractPoiType baseLangType = type.getBaseLangType(); - if (baseLangType != null) { - return getEnTranslation(baseLangType) + " (" + type.getLang().toLowerCase() + ")"; - } - return getEnTranslation(type.getIconKeyName()); - } - - @Override - public String getEnTranslation(String keyName) { - if (enPhrases.isEmpty()) { - return Algorithms.capitalizeFirstLetter(keyName.replace('_', ' ')); - } - String val = enPhrases.get("poi_" + keyName); - if (val != null) { - int ind = val.indexOf(';'); - if (ind > 0) { - return val.substring(0, ind); - } - } - return val; - } - }); - } - - @Test - public void testDuplicates() throws IOException { - SearchSettings ss = new SearchSettings((SearchSettings)null); - ss = ss.setOriginalLocation(new LatLon(0, 0)); - SearchPhrase phrase = new SearchPhrase(ss, OsmAndCollator.primaryCollator()); - SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); - List rs = new ArrayList<>(); - SearchResult a1 = searchResult(rs, phrase, "a", 100); - SearchResult b2 = searchResult(rs, phrase, "b", 200); - SearchResult b1 = searchResult(rs, phrase, "b", 100); - /*SearchResult a3 = */ searchResult(rs, phrase, "a", 100); - cll.addSearchResults(rs, true, true); - Assert.assertEquals(3, cll.getCurrentSearchResults().size()); - Assert.assertSame(a1, cll.getCurrentSearchResults().get(0)); - Assert.assertSame(b1, cll.getCurrentSearchResults().get(1)); - Assert.assertSame(b2, cll.getCurrentSearchResults().get(2)); - } - - @Test - public void testNoResort() throws IOException { - SearchSettings ss = new SearchSettings((SearchSettings)null); - ss = ss.setOriginalLocation(new LatLon(0, 0)); - SearchPhrase phrase = new SearchPhrase(ss, OsmAndCollator.primaryCollator()); - SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); - List rs = new ArrayList<>(); - SearchResult a1 = searchResult(rs, phrase, "a", 100); - cll.addSearchResults(rs, false, true); - rs.clear(); - - SearchResult b2 = searchResult(rs, phrase, "b", 200); - cll.addSearchResults(rs, false, true); - rs.clear(); - - SearchResult b1 = searchResult(rs, phrase, "b", 100); - cll.addSearchResults(rs, false, true); - rs.clear(); - - /*SearchResult a3 = */ searchResult(rs, phrase, "a", 100); - cll.addSearchResults(rs, false, true); - rs.clear(); - - Assert.assertEquals(3, cll.getCurrentSearchResults().size()); - Assert.assertSame(a1, cll.getCurrentSearchResults().get(0)); - Assert.assertSame(b2, cll.getCurrentSearchResults().get(1)); - Assert.assertSame(b1, cll.getCurrentSearchResults().get(2)); - - - - } - - - @Test - public void testNoResortDuplicate() throws IOException { - SearchSettings ss = new SearchSettings((SearchSettings)null); - ss = ss.setOriginalLocation(new LatLon(0, 0)); - SearchPhrase phrase = new SearchPhrase(ss, OsmAndCollator.primaryCollator()); - SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); - List rs = new ArrayList<>(); - SearchResult a1 = searchResult(rs, phrase, "a", 100); - SearchResult b2 = searchResult(rs, phrase, "b", 200); - SearchResult b1 = searchResult(rs, phrase, "b", 100); - cll.addSearchResults(rs, false, true); - rs.clear(); - /*SearchResult a3 = */ searchResult(rs, phrase, "a", 100); - cll.addSearchResults(rs, false, true); - rs.clear(); - - Assert.assertEquals(3, cll.getCurrentSearchResults().size()); - Assert.assertSame(a1, cll.getCurrentSearchResults().get(0)); - Assert.assertSame(b1, cll.getCurrentSearchResults().get(1)); - Assert.assertSame(b2, cll.getCurrentSearchResults().get(2)); - - - } - - private SearchResult searchResult(List rs, SearchPhrase phrase, String text, int dist) { - SearchResult res = new SearchResult(phrase); - res.localeName = text; - double d1 = MapUtils.getDistance(0, 0, 0, 1); - res.location = new LatLon(0, dist / d1); - rs.add(res); - return res; - } - - @Test - public void testSearchJsons() throws IOException { - final File[] files = new File(SEARCH_RESOURCES_PATH).listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String filename) { - return filename.endsWith(".json"); - } - }); - if (files != null) { - for (File f : files) { - testSearchImpl(f); - } - } - } - - private void testSearchImpl(File jsonFile) throws IOException, JSONException { - String sourceJsonText = Algorithms.getFileAsString(jsonFile); - Assert.assertNotNull(sourceJsonText); - Assert.assertTrue(sourceJsonText.length() > 0); - - BinaryMapIndexReaderTest reader = new BinaryMapIndexReaderTest(); - JSONObject sourceJson = new JSONObject(sourceJsonText); - String phraseText = sourceJson.getString("phrase"); - JSONObject settingsJson = sourceJson.getJSONObject("settings"); - if (sourceJson.has("amenities")) { - JSONArray amenitiesArr = sourceJson.getJSONArray("amenities"); - List amenities = new ArrayList<>(); - for (int i = 0; i < amenitiesArr.length(); i++) { - JSONObject amenityObj = amenitiesArr.getJSONObject(i); - amenities.add(Amenity.parseJSON(amenityObj)); - } - reader.amenities = amenities; - } - if (sourceJson.has("cities")) { - JSONArray citiesArr = sourceJson.getJSONArray("cities"); - List cities = new ArrayList<>(); - List initCities = new ArrayList<>(); - List matchedCities = new ArrayList<>(); - List streetCities = new ArrayList<>(); - for (int i = 0; i < citiesArr.length(); i++) { - JSONObject cityObj = citiesArr.getJSONObject(i); - final City city = City.parseJSON(cityObj); - cities.add(city); - if (cityObj.has("init")) { - initCities.add(city); - } - if (cityObj.has("matchCity")) { - matchedCities.add(city); - } - if (cityObj.has("matchStreet")) { - streetCities.add(city); - } - } - reader.cities = cities; - reader.initCities = initCities; - reader.matchedCities = matchedCities; - reader.streetCities = streetCities; - } - List results = new ArrayList<>(); - if (sourceJson.has("results")) { - JSONArray resultsArr = sourceJson.getJSONArray("results"); - for (int i = 0; i < resultsArr.length(); i++) { - results.add(resultsArr.getString(i)); - } - } - - SearchSettings s = SearchSettings.parseJSON(settingsJson); - s.setOfflineIndexes(Collections.singletonList(reader)); - - SearchPhrase phrase = new SearchPhrase(s, OsmAndCollator.primaryCollator()); - phrase = phrase.generateNewPhrase(phraseText, s); - - final SearchUICore core = new SearchUICore(MapPoiTypes.getDefault(), "en", false); - core.init(); - - ResultMatcher rm = new ResultMatcher() { - @Override - public boolean publish(SearchResult object) { - return true; - } - - @Override - public boolean isCancelled() { - return false; - } - }; - SearchResultMatcher matcher = new SearchResultMatcher(rm, phrase, 1, new AtomicInteger(1), -1); - core.searchInternal(phrase, matcher); - - SearchResultCollection collection = new SearchResultCollection(phrase); - collection.addSearchResults(matcher.getRequestResults(), true, true); - List searchResults = collection.getCurrentSearchResults(); - int i = 0; - for (SearchResult result : searchResults) { - String expected = results.get(i++); - String present = result.toString(); - //System.out.println(present); - Assert.assertEquals(expected, present); - if (i >= results.size()) { - break; - } - } - } - - private static class BinaryMapIndexReaderTest extends BinaryMapIndexReader { - - List amenities = Collections.emptyList(); - List cities = Collections.emptyList(); - List initCities = Collections.emptyList(); - List matchedCities = Collections.emptyList(); - List streetCities = Collections.emptyList(); - - BinaryMapIndexReaderTest() throws IOException { - super(null, null, false); - } - - @Override - public List searchPoiByName(SearchRequest req) throws IOException { - for (Amenity amenity : amenities) { - req.publish(amenity); - } - return req.getSearchResults(); - } - - @Override - public List searchPoi(SearchRequest req) throws IOException { - for (Amenity amenity : amenities) { - req.publish(amenity); - } - return req.getSearchResults(); - } - - @Override - public List getCities(SearchRequest resultMatcher, int cityType) throws IOException { - for (City city : initCities) { - if (resultMatcher != null) { - resultMatcher.publish(city); - } - } - return initCities; - } - - @Override - public int preloadStreets(City c, SearchRequest resultMatcher) throws IOException { - return 0; - } - - @Override - public void preloadBuildings(Street s, SearchRequest resultMatcher) throws IOException { - // cities must be filled with streets and buildings - } - - @Override - public List searchAddressDataByName(SearchRequest req) throws IOException { - for (City city : streetCities) { - for (Street street : city.getStreets()) { - req.publish(street); - } - } - for (City city : matchedCities) { - req.publish(city); - } - return req.getSearchResults(); - } - - @Override - public String getRegionName() { - return "Test region"; - } - - @Override - public boolean containsPoiData(int left31x, int top31y, int right31x, int bottom31y) { - return true; - } - - @Override - public boolean containsMapData() { - return true; - } - - @Override - public boolean containsPoiData() { - return true; - } - - @Override - public boolean containsRouteData() { - return true; - } - - @Override - public boolean containsRouteData(int left31x, int top31y, int right31x, int bottom31y, int zoom) { - return true; - } - - @Override - public boolean containsAddressData(int left31x, int top31y, int right31x, int bottom31y) { - return true; - } - - @Override - public boolean containsMapData(int tile31x, int tile31y, int zoom) { - return true; - } - - @Override - public boolean containsMapData(int left31x, int top31y, int right31x, int bottom31y, int zoom) { - return true; - } - - @Override - public boolean containsAddressData() { - return true; - } - } -} diff --git a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java new file mode 100644 index 0000000000..0c0b99b5ac --- /dev/null +++ b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreGenericTest.java @@ -0,0 +1,110 @@ +package net.osmand.search; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import net.osmand.data.LatLon; +import net.osmand.search.SearchUICore.SearchResultCollection; +import net.osmand.search.core.SearchPhrase; +import net.osmand.search.core.SearchResult; +import net.osmand.search.core.SearchSettings; +import net.osmand.util.MapUtils; + +public class SearchUICoreGenericTest { + + + @BeforeClass + public static void setUp() { + SearchUICoreTest.defaultSetup(); + } + + + @Test + public void testDuplicates() throws IOException { + SearchSettings ss = new SearchSettings((SearchSettings)null); + ss = ss.setOriginalLocation(new LatLon(0, 0)); + SearchPhrase phrase = SearchPhrase.emptyPhrase(ss); + SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); + List rs = new ArrayList<>(); + SearchResult a1 = searchResult(rs, phrase, "a", 100); + SearchResult b2 = searchResult(rs, phrase, "b", 200); + SearchResult b1 = searchResult(rs, phrase, "b", 100); + /*SearchResult a3 = */ searchResult(rs, phrase, "a", 100); + cll.addSearchResults(rs, true, true); + Assert.assertEquals(3, cll.getCurrentSearchResults().size()); + Assert.assertSame(a1, cll.getCurrentSearchResults().get(0)); + Assert.assertSame(b1, cll.getCurrentSearchResults().get(1)); + Assert.assertSame(b2, cll.getCurrentSearchResults().get(2)); + } + + @Test + public void testNoResort() throws IOException { + SearchSettings ss = new SearchSettings((SearchSettings)null); + ss = ss.setOriginalLocation(new LatLon(0, 0)); + SearchPhrase phrase = SearchPhrase.emptyPhrase(ss); + SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); + List rs = new ArrayList<>(); + SearchResult a1 = searchResult(rs, phrase, "a", 100); + cll.addSearchResults(rs, false, true); + rs.clear(); + + SearchResult b2 = searchResult(rs, phrase, "b", 200); + cll.addSearchResults(rs, false, true); + rs.clear(); + + SearchResult b1 = searchResult(rs, phrase, "b", 100); + cll.addSearchResults(rs, false, true); + rs.clear(); + + /*SearchResult a3 = */ searchResult(rs, phrase, "a", 100); + cll.addSearchResults(rs, false, true); + rs.clear(); + + Assert.assertEquals(3, cll.getCurrentSearchResults().size()); + Assert.assertSame(a1, cll.getCurrentSearchResults().get(0)); + Assert.assertSame(b2, cll.getCurrentSearchResults().get(1)); + Assert.assertSame(b1, cll.getCurrentSearchResults().get(2)); + + + + } + + + @Test + public void testNoResortDuplicate() throws IOException { + SearchSettings ss = new SearchSettings((SearchSettings)null); + ss = ss.setOriginalLocation(new LatLon(0, 0)); + SearchPhrase phrase = SearchPhrase.emptyPhrase(ss); + SearchResultCollection cll = new SearchUICore.SearchResultCollection(phrase); + List rs = new ArrayList<>(); + SearchResult a1 = searchResult(rs, phrase, "a", 100); + SearchResult b2 = searchResult(rs, phrase, "b", 200); + SearchResult b1 = searchResult(rs, phrase, "b", 100); + cll.addSearchResults(rs, false, true); + rs.clear(); + /*SearchResult a3 = */ searchResult(rs, phrase, "a", 100); + cll.addSearchResults(rs, false, true); + rs.clear(); + + Assert.assertEquals(3, cll.getCurrentSearchResults().size()); + Assert.assertSame(a1, cll.getCurrentSearchResults().get(0)); + Assert.assertSame(b1, cll.getCurrentSearchResults().get(1)); + Assert.assertSame(b2, cll.getCurrentSearchResults().get(2)); + } + + private SearchResult searchResult(List rs, SearchPhrase phrase, String text, int dist) { + SearchResult res = new SearchResult(phrase); + res.localeName = text; + double d1 = MapUtils.getDistance(0, 0, 0, 1); + res.location = new LatLon(0, dist / d1); + rs.add(res); + return res; + } + + +} diff --git a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java new file mode 100644 index 0000000000..f3ed25ca0b --- /dev/null +++ b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java @@ -0,0 +1,316 @@ +package net.osmand.search; + +import net.osmand.ResultMatcher; +import net.osmand.binary.BinaryMapIndexReader; +import net.osmand.osm.AbstractPoiType; +import net.osmand.osm.MapPoiTypes; +import net.osmand.search.SearchUICore.SearchResultCollection; +import net.osmand.search.SearchUICore.SearchResultMatcher; +import net.osmand.search.core.SearchPhrase; +import net.osmand.search.core.SearchResult; +import net.osmand.search.core.SearchSettings; +import net.osmand.util.Algorithms; +import net.osmand.util.MapUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.zip.GZIPInputStream; + +@RunWith(Parameterized.class) +public class SearchUICoreTest { + + private static final String SEARCH_RESOURCES_PATH = "src/test/resources/search/"; + private static boolean TEST_EXTRA_RESULTS = true; + + private File testFile; + + public SearchUICoreTest(String name, File file) { + this.testFile = file; + } + + + @BeforeClass + public static void setUp() { + defaultSetup(); + } + + + static void defaultSetup() { + MapPoiTypes.setDefault(new MapPoiTypes("src/test/resources/poi_types.xml")); + MapPoiTypes poiTypes = MapPoiTypes.getDefault(); + Map enPhrases = new HashMap<>(); + Map phrases = new HashMap<>(); + try { + enPhrases = Algorithms.parseStringsXml(new File("src/test/resources/phrases/en/phrases.xml")); + //phrases = Algorithms.parseStringsXml(new File("src/test/resources/phrases/ru/phrases.xml")); + phrases = enPhrases; + } catch (IOException e) { + e.printStackTrace(); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } + + poiTypes.setPoiTranslator(new TestSearchTranslator(phrases, enPhrases)); + } + + + @Parameterized.Parameters(name = "{index}: {0}") + public static Iterable data() throws IOException { + final File[] files = new File(SEARCH_RESOURCES_PATH).listFiles(); + ArrayList arrayList = new ArrayList<>(); + if (files != null) { + for (File file : files) { + String fileName = file.getName(); + if(fileName.endsWith(".json")) { + String name = fileName.substring(0, fileName.length() - ".json".length()); + arrayList.add(new Object[] {name, file}); + } + } + } + return arrayList; + } + + @Test + public void testSearch() throws IOException, JSONException { + File jsonFile = testFile; + File obfFile = new File(testFile.getParentFile(), testFile.getName().replace(".json", ".obf")); + File obfZipFile = new File(testFile.getParentFile(), testFile.getName().replace(".json", ".obf.gz")); + String sourceJsonText = Algorithms.getFileAsString(jsonFile); + Assert.assertNotNull(sourceJsonText); + Assert.assertTrue(sourceJsonText.length() > 0); + + JSONObject sourceJson = new JSONObject(sourceJsonText); + JSONArray phrasesJson = sourceJson.optJSONArray("phrases"); + String singlePhrase = sourceJson.optString("phrase", null); + List phrases = new ArrayList<>(); + if (singlePhrase != null) { + phrases.add(singlePhrase); + } + if (phrasesJson != null) { + for (int i = 0; i < phrasesJson.length(); i++) { + String phrase = phrasesJson.optString(i); + if (phrase != null) { + phrases.add(phrase); + } + } + } + JSONObject settingsJson = sourceJson.getJSONObject("settings"); + BinaryMapIndexReader reader = null; + boolean useData = settingsJson.optBoolean("useData", true); + if (useData) { + boolean obfZipFileExists = obfZipFile.exists(); + if (!obfZipFileExists) { + System.out.println(String.format("Could not find obf file: %s", obfZipFile.getPath())); + return; + } + //Assert.assertTrue(obfZipFileExists); + + GZIPInputStream gzin = new GZIPInputStream(new FileInputStream(obfZipFile)); + FileOutputStream fous = new FileOutputStream(obfFile); + Algorithms.streamCopy(gzin, fous); + fous.close(); + gzin.close(); + + reader = new BinaryMapIndexReader(new RandomAccessFile(obfFile.getPath(), "r"), obfFile); + } + List> results = new ArrayList<>(); + for (int i = 0; i < phrases.size(); i++) { + results.add(new ArrayList()); + } + if (sourceJson.has("results")) { + parseResults(sourceJson, "results", results); + } + if (TEST_EXTRA_RESULTS && sourceJson.has("extra-results")) { + parseResults(sourceJson, "extra-results", results); + } + + Assert.assertEquals(phrases.size(), results.size()); + if (phrases.size() != results.size()) { + return; + } + + SearchSettings s = SearchSettings.parseJSON(settingsJson); + if (reader != null) { + s.setOfflineIndexes(Collections.singletonList(reader)); + } + + final SearchUICore core = new SearchUICore(MapPoiTypes.getDefault(), "en", false); + core.init(); + + ResultMatcher rm = new ResultMatcher() { + @Override + public boolean publish(SearchResult object) { + return true; + } + + @Override + public boolean isCancelled() { + return false; + } + }; + + boolean simpleTest = true; + SearchPhrase emptyPhrase = SearchPhrase.emptyPhrase(s); + for (int k = 0; k < phrases.size(); k++) { + String text = phrases.get(k); + List result = results.get(k); + SearchPhrase phrase = emptyPhrase.generateNewPhrase(text, s); + SearchResultMatcher matcher = new SearchResultMatcher(rm, phrase, 1, new AtomicInteger(1), -1); + core.searchInternal(phrase, matcher); + + SearchResultCollection collection = new SearchResultCollection(phrase); + collection.addSearchResults(matcher.getRequestResults(), true, true); + List searchResults = collection.getCurrentSearchResults(); + for(int i = 0; i < result.size(); i++) { + String expected = result.get(i); + SearchResult res = i >= searchResults.size() ? null : searchResults.get(i); + if (simpleTest && expected.indexOf('[') != -1) { + expected = expected.substring(0, expected.indexOf('[')).trim(); + } +// String present = result.toString(); + String present = res == null ? ("#MISSING " + (i+1)) : formatResult(simpleTest, res, phrase); + if (!Algorithms.stringsEqual(expected, present)) { + System.out.println(String.format("Phrase: %s", phrase)); + System.out.println(String.format("Mismatch for '%s' != '%s'. Result: ", expected, present)); + for (SearchResult r : searchResults) { + System.out.println(String.format("\t\"%s\",", formatResult(false, r, phrase))); + } + } + Assert.assertEquals(expected, present); + } + } + + obfFile.delete(); + } + + private void parseResults(JSONObject sourceJson, String tag, List> results) { + List result = results.get(0); + JSONArray resultsArr = sourceJson.getJSONArray(tag); + boolean hasInnerArray = resultsArr.length() > 0 && resultsArr.optJSONArray(0) != null; + for (int i = 0; i < resultsArr.length(); i++) { + if (hasInnerArray) { + JSONArray innerArray = resultsArr.optJSONArray(i); + if (innerArray != null && results.size() > i) { + result = results.get(i); + for (int k = 0; k < innerArray.length(); k++) { + result.add(innerArray.getString(k)); + } + } + } else { + result.add(resultsArr.getString(i)); + } + } + } + + private String formatResult(boolean simpleTest, SearchResult r, SearchPhrase phrase) { + if (simpleTest) { + return r.toString().trim(); + } + double dist = 0; + if(r.location != null) { + dist = MapUtils.getDistance(r.location, phrase.getLastTokenLocation()); + } + return String.format("%s [[%d, %s, %.3f, %.2f km]]", r.toString(), + r.getFoundWordCount(), r.objectType.toString(), + r.getUnknownPhraseMatchWeight(), + dist / 1000 + ); + } + + static class TestSearchTranslator implements MapPoiTypes.PoiTranslator { + + private Map enPhrases; + private Map phrases; + public TestSearchTranslator(Map phrases, Map enPhrases) { + this.phrases = phrases; + this.enPhrases = enPhrases; + } + + @Override + public String getTranslation(AbstractPoiType type) { + AbstractPoiType baseLangType = type.getBaseLangType(); + if (baseLangType != null) { + return getTranslation(baseLangType) + " (" + type.getLang().toLowerCase() + ")"; + } + return getTranslation(type.getIconKeyName()); + } + + @Override + public String getTranslation(String keyName) { + String val = phrases.get("poi_" + keyName); + if (val != null) { + int ind = val.indexOf(';'); + if (ind > 0) { + return val.substring(0, ind); + } + } + return val; + } + + @Override + public String getSynonyms(AbstractPoiType type) { + AbstractPoiType baseLangType = type.getBaseLangType(); + if (baseLangType != null) { + return getSynonyms(baseLangType); + } + return getSynonyms(type.getIconKeyName()); + } + + + @Override + public String getSynonyms(String keyName) { + String val = phrases.get("poi_" + keyName); + if (val != null) { + int ind = val.indexOf(';'); + if (ind > 0) { + return val.substring(ind + 1); + } + return ""; + } + return null; + } + + @Override + public String getEnTranslation(AbstractPoiType type) { + AbstractPoiType baseLangType = type.getBaseLangType(); + if (baseLangType != null) { + return getEnTranslation(baseLangType) + " (" + type.getLang().toLowerCase() + ")"; + } + return getEnTranslation(type.getIconKeyName()); + } + + @Override + public String getEnTranslation(String keyName) { + if (enPhrases.isEmpty()) { + return Algorithms.capitalizeFirstLetter(keyName.replace('_', ' ')); + } + String val = enPhrases.get("poi_" + keyName); + if (val != null) { + int ind = val.indexOf(';'); + if (ind > 0) { + return val.substring(0, ind); + } + } + return val; + } + }; +} diff --git a/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java b/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java index 206617ab8f..2131bebcfd 100644 --- a/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java @@ -32,6 +32,24 @@ public class GeoPointParserUtilTest { System.out.println(actual); assertGeoPoint(actual, new GeoParsedPoint(46.853582, 9.529903)); } + + @Test + public void testGoogleMapsData() { + // https://www.google.com/maps?daddr=Bahnhofplatz+3,+7000+Chur@46.853582,9.529903 + GeoParsedPoint actual = GeoPointParserUtil.parse( + "https://www.google.co.in/maps/place/10%C2%B007'16.8%22N+76%C2%B020'54.2%22E/@10.1213253,76.3478427,247m/data=!3m2!1e3!4b1!4m6!3m5!1s0x0:0x0!7e2!8m2!3d10.1213237!4d76.348392?shorturl=1"); + assertGeoPoint(actual, new GeoParsedPoint(10.1213253, 76.3478427)); + actual = GeoPointParserUtil.parse( + "https://www.google.co.in/maps/place/data=!3m2!1e3!4b1!4m6!3m5!1s0x0:0x0!7e2!8m2!3d10.1213237!4d76.348392?shorturl=1"); + assertGeoPoint(actual, new GeoParsedPoint(10.1213237, 76.348392)); + } + + @Test + public void testMapsMeParser() { + GeoParsedPoint actual = GeoPointParserUtil.parse( + "http://ge0.me/44TvlEGXf-/Kyiv"); + assertGeoPoint(actual, new GeoParsedPoint(50.45003, 30.52414, 18, "Kyiv")); + } @Test public void testGeoPoint() { @@ -438,21 +456,21 @@ public class GeoPointParserUtilTest { actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint("paris")); - // TODO this URL does not work, where is it used? + // LEGACY this URL does not work, where is it used? // http://maps.google.com/maps/q=loc:34,-106&z=11 url = "http://maps.google.com/maps/q=loc:" + ilat + "," + ilon + "&z=" + z; System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(ilat, ilon, z)); - // TODO this URL does not work, where is it used? + // LEGACY this URL does not work, where is it used? // http://maps.google.com/maps/q=loc:34.99393,-106.61568&z=11 url = "http://maps.google.com/maps/q=loc:" + dlat + "," + dlon + "&z=" + z; System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); - // TODO this URL does not work, where is it used? + // LEGACY this URL does not work, where is it used? // whatsapp // http://maps.google.com/maps/q=loc:34,-106 (You) z = GeoParsedPoint.NO_ZOOM; @@ -461,7 +479,7 @@ public class GeoPointParserUtilTest { actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(ilat, ilon, z)); - // TODO this URL does not work, where is it used? + // LEGACY this URL does not work, where is it used? // whatsapp // http://maps.google.com/maps/q=loc:34.99393,-106.61568 (You) z = GeoParsedPoint.NO_ZOOM; @@ -705,7 +723,7 @@ public class GeoPointParserUtilTest { actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); - /* URLs straight from various services, instead of generated here */ + /* URLs straight from various services, instead of generated here */ String urls[] = { "https://openstreetmap.org/go/0LQ127-?m", diff --git a/OsmAnd-java/src/test/resources/.gitignore b/OsmAnd-java/src/test/resources/.gitignore index 079e13cfb2..842b6c97f5 100644 --- a/OsmAnd-java/src/test/resources/.gitignore +++ b/OsmAnd-java/src/test/resources/.gitignore @@ -1,5 +1,7 @@ /*.json /osm_live/*.json +/search/* *.obf *.osm -phrases.xml \ No newline at end of file +phrases.xml +*.obf.gz diff --git a/OsmAnd-java/src/test/resources/search/double_parking.json b/OsmAnd-java/src/test/resources/search/double_parking.json deleted file mode 100644 index 46abccb8d1..0000000000 --- a/OsmAnd-java/src/test/resources/search/double_parking.json +++ /dev/null @@ -1,700 +0,0 @@ -{ - "settings": { - "lat": "55.28666", - "lon": "52.00556", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "parking", - "results": [ - "Parking (Personal transport)", - "Parking entrance (Personal transport)", - "Parking fee (Charging station / Transportation)", - "Parking fee: no (Charging station / Transportation)", - "Parking fee: yes (Charging station / Transportation)", - "Parking lot (Fire hydrant / Emergency infrastructure)", - "Parking space (Personal transport)", - "Parking tickets (Vending machine / Store)", - "Parking tickets (Vending machine / Store)", - "Parking time limit (Parking / Personal transport)", - "Bicycle parking (Bicycle transport)", - "Motorcycle parking (Personal transport)", - "Parking", - "Parking", - "Parking", - "Parking" - ], - "amenities": [ - { - "lat": "55.29801", - "lon": "51.99100", - "id": 881010149, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.29481", - "lon": "51.98964", - "id": 803545283, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "parking_surface": "surface" - } - }, - { - "name": "Заинская ГРЭС", - "lat": "55.28492", - "lon": "52.02125", - "id": 481494555, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_yes": "yes", - "parking_surface": "surface" - } - }, - { - "lat": "55.29105", - "lon": "51.99531", - "id": 540237721, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28683", - "lon": "52.01479", - "id": 888343263, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_unpaved": "unpaved", - "access_permissive": "permissive", - "supervised_yes": "yes" - } - }, - { - "lat": "55.30317", - "lon": "52.00192", - "id": 1161722765, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "parking_surface": "surface", - "operator": "cахарный завод" - } - }, - { - "name": "для техосмотра", - "lat": "55.30439", - "lon": "52.01634", - "id": 484385195, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28615", - "lon": "52.00702", - "id": 1040771455, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28582", - "lon": "52.00758", - "id": 535925577, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.30950", - "lon": "51.96954", - "id": 1228158833, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "parking_surface": "surface" - } - }, - { - "lat": "55.29345", - "lon": "51.99385", - "id": 535897911, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.30957", - "lon": "52.00374", - "id": 897019441, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28602", - "lon": "52.00908", - "id": 268235957, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28777", - "lon": "51.99608", - "id": 4410403520512, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_unpaved": "unpaved", - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes", - "capacity": "70" - } - }, - { - "lat": "55.34092", - "lon": "52.05172", - "id": 2136388576, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no" - } - }, - { - "lat": "55.28271", - "lon": "52.00248", - "id": 536030271, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28391", - "lon": "52.00273", - "id": 536035007, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "name": "Служебная", - "lat": "55.28615", - "lon": "52.02350", - "id": 481491939, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_asphalt": "asphalt", - "fee_no": "no", - "access_permissive": "permissive", - "supervised_yes": "yes", - "parking_surface": "surface" - } - }, - { - "lat": "55.30969", - "lon": "51.96917", - "id": 1228158821, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.31022", - "lon": "51.97104", - "id": 1228158819, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "parking_surface": "surface" - } - }, - { - "lat": "55.29275", - "lon": "51.99355", - "id": 892959215, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "name": "для посетителей", - "lat": "55.28688", - "lon": "52.00578", - "id": 11390213698, - "subType": "parking", - "type": "transportation" - }, - { - "lat": "55.30838", - "lon": "51.96767", - "id": 1164434353, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "parking_surface": "surface" - } - }, - { - "name": "Южная", - "lat": "55.27739", - "lon": "52.00544", - "id": 641567205, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_unpaved": "unpaved", - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes" - } - }, - { - "lat": "55.28045", - "lon": "51.99550", - "id": 478137507, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes" - } - }, - { - "name": "Автостоянка №1", - "lat": "55.29028", - "lon": "51.99934", - "id": 502948005, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_gravel": "gravel", - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes" - } - }, - { - "lat": "55.27839", - "lon": "52.00301", - "id": 1168315587, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "parking_surface": "surface", - "operator": "Заинская ЦРБ" - } - }, - { - "lat": "55.30468", - "lon": "52.01335", - "id": 897014805, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.32509", - "lon": "51.99930", - "id": 1172111487, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "name": "Штрафстоянка (Эвакуатор)", - "lat": "55.30439", - "lon": "52.01346", - "id": 5153530824, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes", - "phone": "+7 (85558) 7-77-01" - } - }, - { - "name": "Три тополя", - "lat": "55.29666", - "lon": "51.99048", - "id": 642175341, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_unpaved": "unpaved", - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes" - } - }, - { - "lat": "55.29077", - "lon": "52.00812", - "id": 1168356553, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_asphalt": "asphalt", - "supervised_yes": "yes", - "parking_surface": "surface", - "fee_yes": "yes" - } - }, - { - "lat": "55.29429", - "lon": "51.99190", - "id": 893048919, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.29959", - "lon": "52.00516", - "id": 1022216961, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28355", - "lon": "51.99881", - "id": 943827057, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "parking_surface": "surface" - } - }, - { - "lat": "55.28651", - "lon": "52.00479", - "id": 905757839, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28928", - "lon": "52.00977", - "id": 190467181, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_gravel": "gravel", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28674", - "lon": "52.00282", - "id": 1168411743, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "name": "для клиентов", - "lat": "55.29116", - "lon": "51.99394", - "id": 821840897, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "surface_asphalt": "asphalt", - "parking_surface": "surface", - "access_customers": "customers" - } - }, - { - "lat": "55.29068", - "lon": "51.99490", - "id": 540238031, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.28982", - "lon": "51.98911", - "id": 190489189, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.29341", - "lon": "51.99072", - "id": 806562897, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no" - } - }, - { - "lat": "55.28042", - "lon": "52.00155", - "id": 1159734951, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.30493", - "lon": "52.01007", - "id": 1172110357, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.30500", - "lon": "52.01108", - "id": 1172110359, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface", - "capacity": "13" - } - }, - { - "lat": "55.29816", - "lon": "51.99222", - "id": 1160388645, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.29015", - "lon": "51.99366", - "id": 503278061, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.30624", - "lon": "52.00475", - "id": 691494051, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface", - "operator": "ЗЗМК - Тимер" - } - }, - { - "name": "для регистрации в ГИБДД", - "lat": "55.30438", - "lon": "52.01483", - "id": 484385289, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - }, - { - "lat": "55.29258", - "lon": "51.99188", - "id": 892959265, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no" - } - }, - { - "lat": "55.28050", - "lon": "52.00200", - "id": 1159662915, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface", - "capacity": "10" - } - }, - { - "lat": "55.29845", - "lon": "51.99057", - "id": 881010015, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "fee_no": "no", - "surface_asphalt": "asphalt", - "supervised_no": "no", - "parking_surface": "surface" - } - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/free_street_portland.json b/OsmAnd-java/src/test/resources/search/free_street_portland.json deleted file mode 100644 index 3f73bf1a3e..0000000000 --- a/OsmAnd-java/src/test/resources/search/free_street_portland.json +++ /dev/null @@ -1,28349 +0,0 @@ -{ - "settings": { - "lat": "43.65646", - "lon": "-70.25760", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "48 Free Street Portland", - "results": [ - "48.0, ", - "48, Free Street (Downtown), Portland", - "48, Portland Street, North Berwick", - "48, Portland Avenue, Old Orchard Beach", - "Portland Street (Downtown), Portland", - "Portland Street Pier, South Portland", - "Portland Street, Yarmouth", - "Portland Street, North Berwick", - "Portland Street, Berwick", - "Portland Street, South Berwick", - "Portland Street, Fryeburg", - "Portland Square, Portland" - ], - "amenities": [ - { - "name": "Portland City Landfill", - "lat": "43.69905", - "lon": "-70.26770", - "id": 61619087, - "subType": "landfill", - "type": "man_made" - }, - { - "name": "WMEA-FM (Portland)", - "lat": "43.85926", - "lon": "-70.71146", - "id": 716454558, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "372" - } - }, - { - "name": "Portland Fire Department Peaks Island Fire Station", - "lat": "43.65846", - "lon": "-70.19845", - "id": 14335315034, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department Peaks Island Fire Station", - "lat": "43.65846", - "lon": "-70.19845", - "id": 14335315036, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "Portland", - "lat": "41.57290", - "lon": "-72.64070", - "id": -51185, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "9585" - } - }, - { - "name": "Portland Tower", - "lat": "43.64732", - "lon": "-70.30795", - "id": 773201895, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "height": "162'" - } - }, - { - "name": "Portland Tower", - "lat": "43.64732", - "lon": "-70.30795", - "id": 773201895, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "height": "162'" - } - }, - { - "name": "Courtyard by Marriott Portland Downtown/Waterfront", - "lat": "43.65309", - "lon": "-70.25650", - "id": 699728261, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "brand": "Courtyard by Marriott", - "official_name": "Courtyard by Marriott" - } - }, - { - "name": "Courtyard by Marriott Portland Downtown/Waterfront", - "lat": "43.65309", - "lon": "-70.25650", - "id": 699728261, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "brand": "Courtyard by Marriott", - "official_name": "Courtyard by Marriott" - } - }, - { - "name": "New Portland Lions Fair", - "lat": "44.91572", - "lon": "-70.02409", - "id": 605537251, - "subType": "park", - "type": "entertainment" - }, - { - "name": "Holiday Inn Portland By The Bay", - "lat": "43.65351", - "lon": "-70.26044", - "id": 623996171, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "website": "http://www.innbythebay.com/", - "phone": "+1-207-775-2311", - "operator": "Holiday Inn" - } - }, - { - "name": "Holiday Inn Portland By The Bay", - "lat": "43.65351", - "lon": "-70.26044", - "id": 623996171, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://www.innbythebay.com/", - "phone": "+1-207-775-2311", - "operator": "Holiday Inn" - } - }, - { - "name": "Portland Parks and Open Spaces", - "lat": "43.68618", - "lon": "-70.28330", - "id": 359107421, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland", - "lat": "27.87681", - "lon": "-97.32340", - "id": -70145, - "subType": "town", - "type": "administrative" - }, - { - "name": "Boys & Girls Club of Portland", - "lat": "43.65978", - "lon": "-70.25918", - "id": 443297839, - "subType": "social_facility", - "type": "healthcare", - "additionalInfo": { - "social_facility_for_child": "child", - "wheelchair_yes": "yes", - "website": "http://bgcmaine.org", - "phone": "+1-207-874-1070" - } - }, - { - "name": "Boys & Girls Club of Portland", - "lat": "43.65978", - "lon": "-70.25918", - "id": 443297839, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "social_facility_for_child": "child", - "wheelchair_yes": "yes", - "website": "http://bgcmaine.org", - "phone": "+1-207-874-1070" - } - }, - { - "name": "Portland Stage Company", - "lat": "43.65545", - "lon": "-70.26319", - "id": 699728229, - "subType": "theatre", - "type": "entertainment" - }, - { - "name": "Portland Stage Company", - "lat": "43.65545", - "lon": "-70.26319", - "id": 699728229, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland", - "names": { - "ru": "Портленд", - "uk": "Портленд" - }, - "lat": "43.66104", - "lon": "-70.25486", - "id": -46101, - "subType": "city", - "type": "administrative", - "additionalInfo": { - "population": "64249" - } - }, - { - "name": "Portland Yacht Club", - "lat": "43.73064", - "lon": "-70.20764", - "id": 873617415, - "subType": "dock", - "type": "man_made" - }, - { - "name": "South Portland", - "lat": "43.64148", - "lon": "-70.24090", - "id": -46107, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "23784" - } - }, - { - "name": "Portland Motor Sales", - "lat": "43.68071", - "lon": "-70.25763", - "id": 754123921, - "subType": "car_repair", - "type": "transportation", - "additionalInfo": { - "phone": "+1-207-879-0124" - } - }, - { - "name": "Portland Motor Sales", - "lat": "43.68071", - "lon": "-70.25763", - "id": 754123921, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1-207-879-0124" - } - }, - { - "name": "Courtyard by Marriott Portland Airport", - "lat": "43.62853", - "lon": "-70.34209", - "id": 1119670489, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "brand": "Courtyard by Marriott", - "official_name": "Courtyard by Marriott" - } - }, - { - "name": "Courtyard by Marriott Portland Airport", - "lat": "43.62853", - "lon": "-70.34209", - "id": 1119670489, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "brand": "Courtyard by Marriott", - "official_name": "Courtyard by Marriott" - } - }, - { - "name": "Portland Pier", - "lat": "43.65593", - "lon": "-70.25085", - "id": 61188045, - "subType": "pier", - "type": "man_made" - }, - { - "name": "Greater Portland Council of Governments", - "lat": "43.67942", - "lon": "-70.25785", - "id": 735589746, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "https://www.gpcog.org/", - "phone": "+1-207-774-9891", - "ele": "8" - } - }, - { - "name": "Portland Water Treatment Plant", - "lat": "43.67282", - "lon": "-70.25143", - "id": 642225130, - "subType": "wastewater_plant", - "type": "man_made" - }, - { - "name": "Portland Glass", - "lat": "43.88540", - "lon": "-70.46440", - "id": 1157998891, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland House", - "lat": "43.66488", - "lon": "-70.24148", - "id": 743975913, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1-207-774-3744" - } - }, - { - "name": "Boys & Girls Club of Greater Portland", - "lat": "43.64376", - "lon": "-70.23841", - "id": 1491918495, - "subType": "social_facility", - "type": "healthcare", - "additionalInfo": { - "social_facility_outreach": "outreach", - "brand": "Boys & Girls Club" - } - }, - { - "name": "Boys & Girls Club of Greater Portland", - "lat": "43.64376", - "lon": "-70.23841", - "id": 1491918495, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "social_facility_outreach": "outreach", - "brand": "Boys & Girls Club" - } - }, - { - "name": "Portland Arts and Technology High School", - "lat": "43.69734", - "lon": "-70.29396", - "id": 14341524588, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Fire Department Cushing Island Fire Station", - "lat": "43.64413", - "lon": "-70.19798", - "id": 14335838214, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Convention and Visitors Bureau and Information Center", - "lat": "43.65370", - "lon": "-70.25645", - "id": 735590814, - "subType": "information", - "type": "tourism", - "additionalInfo": { - "ele": "5" - } - }, - { - "name": "Portland", - "lat": "43.65302", - "lon": "-70.29081", - "id": 5405844016, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "network": "Amtrak", - "operator": "Amtrak", - "route_train_ref": "680-699" - } - }, - { - "name": "WCSH-TV (Portland)", - "lat": "43.85898", - "lon": "-70.71063", - "id": 716454588, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "364" - } - }, - { - "name": "New Portland", - "lat": "44.88423", - "lon": "-70.09674", - "id": 317678714, - "subType": "village", - "type": "administrative", - "additionalInfo": { - "ele": "159", - "population": "804" - } - }, - { - "name": "New Portland Fire Department", - "lat": "44.88370", - "lon": "-70.09775", - "id": 14351134448, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "AC Hotel Portland", - "lat": "43.66005", - "lon": "-70.24768", - "id": 1400018671, - "subType": "building", - "type": "man_made" - }, - { - "name": "Howard Johnson Hotel South Portland", - "lat": "43.62036", - "lon": "-70.30615", - "id": 4829357956, - "subType": "hotel", - "type": "tourism" - }, - { - "name": "Portland Road", - "lat": "43.45669", - "lon": "-70.49380", - "id": 203643965, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "ref": "US 1" - } - }, - { - "name": "Portland Fire Department Air Rescue Station", - "lat": "43.64783", - "lon": "-70.30827", - "id": 14344478296, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department Air Rescue Station", - "lat": "43.64785", - "lon": "-70.30827", - "id": 14344478298, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "Portland Country Club", - "lat": "43.70748", - "lon": "-70.22918", - "id": 707671175, - "subType": "golf_course", - "type": "sport", - "additionalInfo": { - "website": "http://www.portlandcountryclub.org/", - "phone": "+1-207-781-2340" - } - }, - { - "name": "Portland Friends Monthy Meeting", - "lat": "43.70036", - "lon": "-70.31784", - "id": 820219979, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "wheelchair_yes": "yes", - "religion_christian": "christian", - "website": "http://www.portlandfriendsmeeting.org", - "phone": "+1-207-200-6544", - "ele": "26" - } - }, - { - "name": "Portland Friends Monthy Meeting", - "lat": "43.70036", - "lon": "-70.31784", - "id": 820219979, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wheelchair_yes": "yes", - "religion_christian": "christian", - "website": "http://www.portlandfriendsmeeting.org", - "phone": "+1-207-200-6544", - "ele": "26" - } - }, - { - "name": "Portland Fire Department Allen Avenue Fire Station", - "lat": "43.70102", - "lon": "-70.28733", - "id": 14341526590, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Friends Meeting Cemetary", - "lat": "43.70063", - "lon": "-70.31756", - "id": 820219981, - "subType": "cemetery", - "type": "man_made", - "additionalInfo": { - "religion_christian": "christian", - "ele": "26" - } - }, - { - "name": "New Portland Hill", - "lat": "44.87839", - "lon": "-70.03952", - "id": 716444700, - "subType": "peak", - "type": "natural", - "additionalInfo": { - "ele": "337" - } - }, - { - "name": "Portland Pie Company", - "lat": "43.91652", - "lon": "-69.96617", - "id": 7938060692, - "subType": "restaurant", - "type": "sustenance", - "openingHours": "Su-We 11:00-22:00; Th-Sa 11:00-23:00", - "additionalInfo": { - "delivery_filter_yes": "yes", - "smoking_no": "no", - "takeaway_filter_yes": "yes", - "delivery_yes": "yes", - "cuisine_pizza": "pizza", - "takeaway_yes": "yes", - "opening_hours": "Su-We 11:00-22:00; Th-Sa 11:00-23:00", - "website": "http://www.portlandpie.com/hide/brunswick-2/", - "phone": "+1-207-844-2777", - "cuisine": "pizza;pub" - } - }, - { - "name": "First Baptist Church of South Portland", - "lat": "43.62427", - "lon": "-70.25169", - "id": 716463618, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "denomination_baptist": "baptist", - "ele": "25" - } - }, - { - "name": "Portland Hunt + Alpine Club", - "lat": "43.65814", - "lon": "-70.25435", - "id": 13489435772, - "subType": "bar", - "type": "sustenance" - }, - { - "name": "Evo Rock & Fitness Portland", - "lat": "43.68915", - "lon": "-70.29945", - "id": 1395145119, - "subType": "fitness_centre", - "type": "entertainment", - "additionalInfo": { - "brand": "Evo Rock & Fitness Portland" - } - }, - { - "name": "Evo Rock & Fitness Portland", - "lat": "43.68915", - "lon": "-70.29945", - "id": 1395145119, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "brand": "Evo Rock & Fitness Portland" - } - }, - { - "name": "Portland Post Office", - "lat": "43.65843", - "lon": "-70.25733", - "id": 716468740, - "subType": "post_office", - "type": "service", - "additionalInfo": { - "ele": "16" - } - }, - { - "name": "Portland Transportation Center", - "lat": "43.65399", - "lon": "-70.29132", - "id": 61531923, - "subType": "internet_access_wlan", - "type": "service", - "additionalInfo": { - "atm_yes": "yes", - "toilets_access_permissive": "permissive", - "toilets_yes": "yes", - "wheelchair_yes": "yes", - "internet_access_fee_no": "no", - "toilets_wheelchair_yes": "yes", - "alt_name": "Portland Amtrak Station" - } - }, - { - "name": "Portland Transportation Center", - "lat": "43.65399", - "lon": "-70.29132", - "id": 61531923, - "subType": "atm", - "type": "finance", - "additionalInfo": { - "atm_yes": "yes", - "toilets_access_permissive": "permissive", - "toilets_yes": "yes", - "wheelchair_yes": "yes", - "internet_access_fee_no": "no", - "toilets_wheelchair_yes": "yes", - "alt_name": "Portland Amtrak Station" - } - }, - { - "name": "Portland Transportation Center", - "lat": "43.65399", - "lon": "-70.29132", - "id": 61531923, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "atm_yes": "yes", - "toilets_access_permissive": "permissive", - "toilets_yes": "yes", - "wheelchair_yes": "yes", - "internet_access_fee_no": "no", - "toilets_wheelchair_yes": "yes", - "alt_name": "Portland Amtrak Station" - } - }, - { - "name": "Portland Fire Department Marine Division", - "lat": "43.65755", - "lon": "-70.24926", - "id": 14343948872, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "Mast of the USS Portland", - "lat": "43.66576", - "lon": "-70.24006", - "id": 10393794808, - "subType": "monument", - "type": "tourism", - "additionalInfo": { - "description": "https://en.wikipedia.org/wiki/USS_Portland_(CA-33)" - } - }, - { - "name": "Portland Transportation Center", - "lat": "43.65398", - "lon": "-70.29139", - "id": 12369959862, - "subType": "bus_station", - "type": "transportation", - "additionalInfo": { - "bus_yes": "yes" - } - }, - { - "name": "Portland Transportation Center", - "lat": "43.65398", - "lon": "-70.29139", - "id": 12369959862, - "subType": "public_transport_station", - "type": "transportation", - "additionalInfo": { - "bus_yes": "yes" - } - }, - { - "name": "Portland Fire Department Marine Division", - "lat": "43.65756", - "lon": "-70.24926", - "id": 14343948874, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Arts and Technology High School", - "lat": "43.69712", - "lon": "-70.29351", - "id": 716468728, - "subType": "school", - "type": "education", - "additionalInfo": { - "ele": "29" - } - }, - { - "name": "Portland Water District", - "lat": "43.66245", - "lon": "-70.28581", - "id": 2910343602, - "subType": "building", - "type": "man_made" - }, - { - "name": "Clarion Hotel Portland", - "lat": "43.65618", - "lon": "-70.29014", - "id": 721283633, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "phone": "+1-207-774-5611" - } - }, - { - "name": "Clarion Hotel Portland", - "lat": "43.65618", - "lon": "-70.29014", - "id": 721283633, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1-207-774-5611" - } - }, - { - "name": "Portland", - "names": { - "hi": "पोर्टलैंड", - "de": "Portland", - "fi": "Portland", - "be": "Портленд", - "ru": "Портленд", - "pt": "Portland", - "bg": "Портланд", - "lt": "Portlandas", - "lv": "Portlenda", - "hr": "Portland", - "bn": "পোর্টল্যান্ড", - "fr": "Portland", - "hu": "Portland", - "hy": "Պորտլենդ", - "fy": "Portland", - "uk": "Портленд", - "ka": "Portland", - "sk": "Portland", - "sl": "Portland", - "id": "Portland", - "ca": "Portland", - "sq": "Portland", - "mk": "Портланд", - "sv": "Portland", - "kn": "ಪೋರ್ಟ್‌ಲಾಂಡ್‌", - "ko": "포틀랜드", - "af": "Portland", - "mr": "पोर्टलंड", - "ms": "Portland", - "el": "Πόρτλαντ", - "ta": "போர்ட்லன்ட்", - "es": "Portland", - "zh": "波特蘭", - "et": "Portland", - "ar": "بورتلاند", - "te": "పోర్ట్ లాండ్", - "vi": "Portland", - "th": "พอร์ตแลนด์", - "ja": "ポートランド", - "tl": "Portland", - "az": "Portlend", - "fa": "پورتلند", - "da": "Portland", - "ro": "Portland", - "tr": "Portland", - "nl": "Portland" - }, - "lat": "45.52026", - "lon": "-122.67420", - "id": -71824, - "subType": "city", - "type": "administrative", - "additionalInfo": { - "population": "593820" - } - }, - { - "name": "Portland Fire Department Allen Avenue Fire Station", - "lat": "43.70103", - "lon": "-70.28733", - "id": 14341526592, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "WMGX-FM (Portland)", - "lat": "43.68802", - "lon": "-70.25690", - "id": 716454374, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "5" - } - }, - { - "name": "WPOR-FM (Portland)", - "lat": "43.76259", - "lon": "-70.32452", - "id": 716454370, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "128" - } - }, - { - "name": "WBLM-FM (Portland)", - "lat": "43.92453", - "lon": "-70.49062", - "id": 716454372, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "130" - } - }, - { - "name": "Portland Ice Arena", - "lat": "43.65645", - "lon": "-70.27626", - "id": 60391681, - "subType": "ice_rink", - "type": "sport", - "additionalInfo": { - "phone": "+1-207-774-8553", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Ice Arena (Maine)" - } - }, - { - "name": "Portland Ice Arena", - "lat": "43.65645", - "lon": "-70.27626", - "id": 60391681, - "subType": "sport_multi", - "type": "sport", - "additionalInfo": { - "phone": "+1-207-774-8553", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Ice Arena (Maine)" - } - }, - { - "name": "Portland Ice Arena", - "lat": "43.65645", - "lon": "-70.27626", - "id": 60391681, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1-207-774-8553", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Ice Arena (Maine)" - } - }, - { - "name": "New Portland Fire Department", - "lat": "44.90025", - "lon": "-70.02911", - "id": 14351113146, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Coast Guard Base South Portland", - "lat": "43.64547", - "lon": "-70.24748", - "id": 738145570, - "subType": "military_landuse", - "type": "military", - "additionalInfo": { - "ele": "2" - } - }, - { - "name": "Islamic Society of Portland", - "lat": "43.65811", - "lon": "-70.26482", - "id": 722663857, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_muslim": "muslim", - "website": "http://www.al-hudacenter.com/", - "phone": "+1-207-842-5953" - } - }, - { - "name": "Islamic Society of Portland", - "lat": "43.65811", - "lon": "-70.26482", - "id": 722663857, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_muslim": "muslim", - "website": "http://www.al-hudacenter.com/", - "phone": "+1-207-842-5953" - } - }, - { - "name": "Fairfield Inn Portland/ Maine Mall", - "lat": "43.62701", - "lon": "-70.34806", - "id": 8191759980, - "subType": "hotel", - "type": "tourism" - }, - { - "name": "First Parish Portland Unitarian Universalist Church", - "lat": "43.65857", - "lon": "-70.25828", - "id": 697495865, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "building_type_church": "church", - "religion_unitarian_universalist": "unitarian_universalist", - "website": "http://www.firstparishportland.org/", - "phone": "+1-207-773-5747", - "wikipedia": "http://en.wikipedia.org/wiki/First Parish Church (Portland, Maine)" - } - }, - { - "name": "First Parish Portland Unitarian Universalist Church", - "lat": "43.65857", - "lon": "-70.25828", - "id": 697495865, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "building_type_church": "church", - "religion_unitarian_universalist": "unitarian_universalist", - "website": "http://www.firstparishportland.org/", - "phone": "+1-207-773-5747", - "wikipedia": "http://en.wikipedia.org/wiki/First Parish Church (Portland, Maine)" - } - }, - { - "name": "Hilton Garden Inn Portland Downtown Waterfront", - "lat": "43.65803", - "lon": "-70.25012", - "id": 8191759978, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "brand": "Hilton Garden Inn" - } - }, - { - "name": "New England Rehabilitation Hospital of Portland", - "lat": "43.66613", - "lon": "-70.29147", - "id": 8815266210, - "subType": "social_facility", - "type": "healthcare", - "additionalInfo": { - "social_facility_group_home": "group_home", - "website": "http://www.nerhp.com/", - "phone": "+1-207-775-4000" - } - }, - { - "name": "Portland Fire Department Cliff Island Fire Station", - "lat": "43.69656", - "lon": "-70.10464", - "id": 14335269506, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Air Frieght", - "lat": "46.70058", - "lon": "-68.04432", - "id": 14317718934, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Fire Department Cliff Island Fire Station", - "lat": "43.69658", - "lon": "-70.10464", - "id": 14335269508, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department Great Diamond Island Fire Station", - "lat": "43.68365", - "lon": "-70.19347", - "id": 14335316612, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department Great Diamond Island Fire Station", - "lat": "43.68367", - "lon": "-70.19347", - "id": 14335316614, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "Portland Food Co-op", - "lat": "43.66103", - "lon": "-70.25272", - "id": 9878618642, - "subType": "supermarket", - "type": "shop", - "additionalInfo": { - "internet_access_type_wlan": "wlan" - } - }, - { - "name": "South Portland Transit Hub", - "lat": "43.63681", - "lon": "-70.25225", - "id": 10003671182, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_yes": "yes", - "bus_yes": "yes", - "bench_yes": "yes", - "network": "SMTT 24B", - "operator": "City of South Portland" - } - }, - { - "name": "Unity of Greater Portland Church", - "lat": "43.66953", - "lon": "-70.30229", - "id": 716469306, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "ele": "19" - } - }, - { - "name": "Portland Harbor", - "lat": "43.65760", - "lon": "-70.24062", - "id": 716446268, - "subType": "dock", - "type": "man_made", - "additionalInfo": { - "ele": "0" - } - }, - { - "name": "Portland Club", - "lat": "43.65198", - "lon": "-70.26589", - "id": 1520781365, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "ele": "37", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Club (Portland, Maine)" - } - }, - { - "name": "Portland", - "lat": "43.65395", - "lon": "-70.29130", - "id": 14061247182, - "subType": "public_transport_station", - "type": "transportation", - "additionalInfo": { - "network": "Amtrak" - } - }, - { - "name": "Portland", - "lat": "43.65395", - "lon": "-70.29130", - "id": 14061247182, - "subType": "railway_station", - "type": "transportation", - "additionalInfo": { - "network": "Amtrak" - } - }, - { - "name": "Portland High School", - "lat": "43.65915", - "lon": "-70.25862", - "id": 697495873, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Sheraton at Sable Oaks", - "lat": "43.63991", - "lon": "-70.34065", - "id": 811118219, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "smoking_no": "no", - "wheelchair_yes": "yes", - "internet_access_type_wlan": "wlan", - "website": "https://www.marriott.com/hotels/travel/pwmsi-portland-sheraton-at-sable-oaks/", - "phone": "+1-207-871-8000", - "fax": "+1 207-871-7971", - "email": "atyourservice@marriott-sabes.com" - } - }, - { - "name": "Portland Sheraton at Sable Oaks", - "lat": "43.63991", - "lon": "-70.34065", - "id": 811118219, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "smoking_no": "no", - "wheelchair_yes": "yes", - "internet_access_type_wlan": "wlan", - "website": "https://www.marriott.com/hotels/travel/pwmsi-portland-sheraton-at-sable-oaks/", - "phone": "+1-207-871-8000", - "fax": "+1 207-871-7971", - "email": "atyourservice@marriott-sabes.com" - } - }, - { - "name": "Holiday Inn Express & Suites South Portland", - "lat": "43.64024", - "lon": "-70.33735", - "id": 811118221, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "phone": "+1-207-775-3900", - "brand": "Holiday Inn Express & Suites" - } - }, - { - "name": "Holiday Inn Express & Suites South Portland", - "lat": "43.64024", - "lon": "-70.33735", - "id": 811118221, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1-207-775-3900", - "brand": "Holiday Inn Express & Suites" - } - }, - { - "name": "WPXT-TV (Portland)", - "lat": "43.85175", - "lon": "-70.32728", - "id": 716454446, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "146" - } - }, - { - "name": "Portland Fire Museum", - "lat": "43.65196", - "lon": "-70.26392", - "id": 1520781369, - "subType": "museum", - "type": "tourism", - "additionalInfo": { - "ele": "35", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Fire Museum" - } - }, - { - "name": "Portland Fire Museum", - "lat": "43.65196", - "lon": "-70.26392", - "id": 1520781369, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "ele": "35", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Fire Museum" - } - }, - { - "name": "Portland Road", - "lat": "43.40296", - "lon": "-70.52611", - "id": 840920259, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "ref": "US 1" - } - }, - { - "name": "WGME-TV (Portland)", - "lat": "43.92453", - "lon": "-70.49062", - "id": 716454444, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "130" - } - }, - { - "name": "Quirk Chevrolet of Portland", - "lat": "43.67338", - "lon": "-70.32050", - "id": 928994879, - "subType": "car", - "type": "shop", - "additionalInfo": { - "description": "Chevrolet", - "brand": "Chevrolet" - } - }, - { - "name": "Quirk Chevrolet of Portland", - "lat": "43.67338", - "lon": "-70.32050", - "id": 928994879, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "description": "Chevrolet", - "brand": "Chevrolet" - } - }, - { - "name": "Hyatt Place Portland - Old Port", - "lat": "43.65604", - "lon": "-70.25474", - "id": 679883631, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "brand": "Hyatt" - } - }, - { - "name": "Hyatt Place Portland - Old Port", - "lat": "43.65604", - "lon": "-70.25474", - "id": 679883631, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "brand": "Hyatt" - } - }, - { - "name": "South Portland Food Cupboard", - "lat": "43.62545", - "lon": "-70.28716", - "id": 12433337340, - "subType": "social_facility", - "type": "healthcare", - "additionalInfo": { - "social_facility_food_bank": "food_bank" - } - }, - { - "name": "Portland Head Light Building", - "lat": "43.62306", - "lon": "-70.20817", - "id": 1320712593, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "historic_yes": "yes" - } - }, - { - "name": "South Portland High School", - "lat": "43.62172", - "lon": "-70.26834", - "id": 4412997842944, - "subType": "school", - "type": "education", - "additionalInfo": { - "ele": "23" - } - }, - { - "name": "South Portland High School", - "lat": "43.62172", - "lon": "-70.26834", - "id": 4412997842944, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "ele": "23" - } - }, - { - "name": "Ri Ra Irish Pub & Restaurant - Portland", - "enName": "Rí Rá Irish Pub & Restaurant - Portland", - "lat": "43.65733", - "lon": "-70.25004", - "id": 1095588391, - "subType": "restaurant", - "type": "sustenance", - "openingHours": "Mo-Fr 10:00-1:00, sa-su 9:00-1:00", - "additionalInfo": { - "cuisine_irish": "irish", - "opening_hours": "Mo-Fr 10:00-1:00, sa-su 9:00-1:00", - "website": "https://rira.com/", - "phone": "+1-207-761-4446" - } - }, - { - "name": "Ri Ra Irish Pub & Restaurant - Portland", - "enName": "Rí Rá Irish Pub & Restaurant - Portland", - "lat": "43.65733", - "lon": "-70.25004", - "id": 1095588391, - "subType": "building", - "type": "man_made", - "openingHours": "Mo-Fr 10:00-1:00, sa-su 9:00-1:00", - "additionalInfo": { - "cuisine_irish": "irish", - "opening_hours": "Mo-Fr 10:00-1:00, sa-su 9:00-1:00", - "website": "https://rira.com/", - "phone": "+1-207-761-4446" - } - }, - { - "name": "South Portland Post Office", - "lat": "43.63761", - "lon": "-70.25216", - "id": 425506865, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Pie Co.", - "lat": "43.67695", - "lon": "-70.36711", - "id": 1118489991, - "subType": "restaurant", - "type": "sustenance", - "openingHours": "Mo-Th,Su 11:00-22:00; Fr-Sa 10:00-23:00", - "additionalInfo": { - "cuisine_pizza": "pizza", - "wheelchair_yes": "yes", - "opening_hours": "Mo-Th,Su 11:00-22:00; Fr-Sa 10:00-23:00", - "phone": "+1-207-591-6248" - } - }, - { - "name": "Portland Pie Co.", - "lat": "43.67695", - "lon": "-70.36711", - "id": 1118489991, - "subType": "building", - "type": "man_made", - "openingHours": "Mo-Th,Su 11:00-22:00; Fr-Sa 10:00-23:00", - "additionalInfo": { - "cuisine_pizza": "pizza", - "wheelchair_yes": "yes", - "opening_hours": "Mo-Th,Su 11:00-22:00; Fr-Sa 10:00-23:00", - "phone": "+1-207-591-6248" - } - }, - { - "name": "Portland Road", - "lat": "43.45666", - "lon": "-70.49369", - "id": 203643663, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "ref": "US 1" - } - }, - { - "name": "Portland Museum of Art", - "lat": "43.65390", - "lon": "-70.26259", - "id": 735591096, - "subType": "museum", - "type": "tourism", - "additionalInfo": { - "wheelchair_yes": "yes", - "toilets_wheelchair_yes": "yes", - "website": "https://www.portlandmuseum.org/", - "phone": "+1-207-775-6148", - "ele": "33", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Museum of Art" - } - }, - { - "name": "City of Portland Boat Ramp", - "lat": "43.68876", - "lon": "-70.11498", - "id": 14335269702, - "subType": "slipway", - "type": "transportation" - }, - { - "name": "North New Portland", - "lat": "44.92507", - "lon": "-70.02312", - "id": 317647834, - "subType": "hamlet", - "type": "administrative", - "additionalInfo": { - "ele": "126" - } - }, - { - "name": "Portland Fire Department Munjoy Hill Station", - "lat": "43.66561", - "lon": "-70.24789", - "id": 14343950282, - "subType": "ambulance_station", - "type": "emergency" - }, - { - "name": "Portland Regency Hotel & Spa", - "lat": "43.65701", - "lon": "-70.25268", - "id": 679883655, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "website": "http://www.theregency.com/", - "phone": "+1-800-727-3436" - } - }, - { - "name": "Portland Regency Hotel & Spa", - "lat": "43.65701", - "lon": "-70.25268", - "id": 679883655, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://www.theregency.com/", - "phone": "+1-800-727-3436" - } - }, - { - "name": "Portland International Marine Terminal", - "lat": "43.64778", - "lon": "-70.25834", - "id": 705681165, - "subType": "industrial", - "type": "man_made", - "additionalInfo": { - "cargo_container": "yes", - "industrial_port": "port" - } - }, - { - "name": "Portland Glass", - "lat": "43.64958", - "lon": "-70.35833", - "id": 1090113981, - "subType": "building", - "type": "man_made" - }, - { - "name": "Longfellow School-Portland", - "lat": "43.67302", - "lon": "-70.29576", - "id": 14341512152, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Housing Authority", - "lat": "43.66376", - "lon": "-70.27201", - "id": 1527959583, - "subType": "government", - "type": "administrative" - }, - { - "name": "Portland Housing Authority", - "lat": "43.66376", - "lon": "-70.27201", - "id": 1527959583, - "subType": "building", - "type": "man_made" - }, - { - "name": "East New Portland", - "lat": "44.90173", - "lon": "-70.02340", - "id": 317626788, - "subType": "hamlet", - "type": "administrative", - "additionalInfo": { - "ele": "122" - } - }, - { - "name": "WPOR-AM (Portland)", - "lat": "43.66340", - "lon": "-70.27083", - "id": 716454246, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "4" - } - }, - { - "name": "South Portland City Hall", - "lat": "43.63735", - "lon": "-70.25188", - "id": 425506891, - "subType": "building", - "type": "man_made" - }, - { - "name": "WYNZ-AM (Portland)", - "lat": "43.60537", - "lon": "-70.32117", - "id": 716454244, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "22" - } - }, - { - "name": "Portland Fire Department: Allen Avenue Station", - "lat": "43.70100", - "lon": "-70.28737", - "id": 825164277, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department: Allen Avenue Station", - "lat": "43.70100", - "lon": "-70.28737", - "id": 825164277, - "subType": "building", - "type": "man_made" - }, - { - "name": "Hampton Inn Portland - Airport", - "lat": "43.62963", - "lon": "-70.33464", - "id": 813038891, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "phone": "+1-207-773-4400", - "brand": "Hampton", - "alt_name": "Hampton Inn" - } - }, - { - "name": "Hampton Inn Portland - Airport", - "lat": "43.62963", - "lon": "-70.33464", - "id": 813038891, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1-207-773-4400", - "brand": "Hampton", - "alt_name": "Hampton Inn" - } - }, - { - "name": "Riverton Branch Portland Public Library", - "lat": "43.69925", - "lon": "-70.31784", - "id": 735589498, - "subType": "library", - "type": "education", - "additionalInfo": { - "ele": "23" - } - }, - { - "name": "Portland, Maine", - "lat": "43.65305", - "lon": "-70.29076", - "id": 524230747, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "network": "Amtrak" - } - }, - { - "name": "Peaks Island Branch Portland Public Library", - "lat": "43.65822", - "lon": "-70.19837", - "id": 735589504, - "subType": "library", - "type": "education", - "additionalInfo": { - "ele": "14" - } - }, - { - "name": "WWGT-FM (Portland)", - "lat": "43.75898", - "lon": "-70.32005", - "id": 716454366, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "151" - } - }, - { - "name": "Portland", - "lat": "36.58171", - "lon": "-86.51639", - "id": -77613, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "11480" - } - }, - { - "name": "Portland Fire Department Central Fire Station", - "lat": "43.65924", - "lon": "-70.25568", - "id": 796153881, - "subType": "fire_station", - "type": "emergency", - "additionalInfo": { - "website": "http://www.portlandmaine.gov/190/Fire", - "phone": "+1-207-874-8400" - } - }, - { - "name": "Portland Fire Department Central Fire Station", - "lat": "43.65924", - "lon": "-70.25568", - "id": 796153881, - "subType": "ambulance_station", - "type": "emergency", - "additionalInfo": { - "website": "http://www.portlandmaine.gov/190/Fire", - "phone": "+1-207-874-8400" - } - }, - { - "name": "Portland Fire Department Central Fire Station", - "lat": "43.65924", - "lon": "-70.25568", - "id": 796153881, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://www.portlandmaine.gov/190/Fire", - "phone": "+1-207-874-8400" - } - }, - { - "name": "Portland Police Department Headquarters", - "lat": "43.65932", - "lon": "-70.25229", - "id": 681940937, - "subType": "police", - "type": "emergency" - }, - { - "name": "Portland Police Department Headquarters", - "lat": "43.65932", - "lon": "-70.25229", - "id": 681940937, - "subType": "building", - "type": "man_made" - }, - { - "name": "South Portland Post Office", - "lat": "43.63760", - "lon": "-70.25205", - "id": 3881546724, - "subType": "post_office", - "type": "service", - "additionalInfo": { - "operator": "US Postal Service" - } - }, - { - "name": "South Portland Public Library", - "lat": "43.63542", - "lon": "-70.24834", - "id": 899531943, - "subType": "library", - "type": "education" - }, - { - "name": "South Portland Public Library", - "lat": "43.63542", - "lon": "-70.24834", - "id": 899531943, - "subType": "building", - "type": "man_made" - }, - { - "name": "South Portland Gardens", - "lat": "43.63898", - "lon": "-70.31533", - "id": 317712276, - "subType": "hamlet", - "type": "administrative", - "additionalInfo": { - "ele": "15" - } - }, - { - "name": "Portland Armory (Retired)", - "lat": "43.68488", - "lon": "-70.29475", - "id": 59978455, - "subType": "building", - "type": "man_made" - }, - { - "name": "Fiat/Alfa Romeo of Portland", - "lat": "43.67209", - "lon": "-70.32113", - "id": 928996889, - "subType": "car", - "type": "shop", - "additionalInfo": { - "brand": "Fiat" - } - }, - { - "name": "Fiat/Alfa Romeo of Portland", - "lat": "43.67209", - "lon": "-70.32113", - "id": 928996889, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "brand": "Fiat" - } - }, - { - "name": "Portland Glass", - "lat": "43.65451", - "lon": "-70.27407", - "id": 727325715, - "subType": "glaziery", - "type": "shop", - "additionalInfo": { - "website": "https://www.portlandglass.com/portland-me/", - "phone": "+1-207-774-9851" - } - }, - { - "name": "Portland Glass", - "lat": "43.65451", - "lon": "-70.27407", - "id": 727325715, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "https://www.portlandglass.com/portland-me/", - "phone": "+1-207-774-9851" - } - }, - { - "name": "Hampton Inn Portland Downtown/Waterfront", - "lat": "43.65926", - "lon": "-70.25087", - "id": 681940911, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "smoking_no": "no", - "phone": "+1-207-775-1454", - "brand": "Hampton", - "alt_name": "Hampton Inn" - } - }, - { - "name": "Hampton Inn Portland Downtown/Waterfront", - "lat": "43.65926", - "lon": "-70.25087", - "id": 681940911, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "smoking_no": "no", - "phone": "+1-207-775-1454", - "brand": "Hampton", - "alt_name": "Hampton Inn" - } - }, - { - "name": "Portland Exposition Building", - "lat": "43.65631", - "lon": "-70.27725", - "id": 60391639, - "subType": "sports_centre", - "type": "sport", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/Portland Exposition Building" - } - }, - { - "name": "Portland Exposition Building", - "lat": "43.65631", - "lon": "-70.27725", - "id": 60391639, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/Portland Exposition Building" - } - }, - { - "name": "Reiche Branch - Portland Public Library", - "lat": "43.65042", - "lon": "-70.26735", - "id": 680237534, - "subType": "library", - "type": "education" - }, - { - "name": "Residence Inn Portland Downtown/Waterfront", - "lat": "43.66107", - "lon": "-70.24830", - "id": 4416825749504, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "smoking_no": "no", - "phone": "+1-207-761-1660", - "brand": "Residence Inn", - "operator": "Residence Inn" - } - }, - { - "name": "Residence Inn Portland Downtown/Waterfront", - "lat": "43.66107", - "lon": "-70.24830", - "id": 4416825749504, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "smoking_no": "no", - "phone": "+1-207-761-1660", - "brand": "Residence Inn", - "operator": "Residence Inn" - } - }, - { - "name": "Portland Jewish Funeral Home", - "lat": "43.66804", - "lon": "-70.28375", - "id": 721282923, - "subType": "funeral_directors", - "type": "service", - "additionalInfo": { - "religion_jewish": "jewish", - "website": "https://www.portlandjewishfuneralhome.org/", - "phone": "+1-207-774-3733" - } - }, - { - "name": "Portland Jewish Funeral Home", - "lat": "43.66804", - "lon": "-70.28375", - "id": 721282923, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_jewish": "jewish", - "website": "https://www.portlandjewishfuneralhome.org/", - "phone": "+1-207-774-3733" - } - }, - { - "name": "Portland Station Cemetery", - "lat": "43.23839", - "lon": "-70.79944", - "id": 1488189861, - "subType": "cemetery", - "type": "man_made", - "additionalInfo": { - "ele": "43" - } - }, - { - "name": "Portland Boxing Club", - "lat": "43.68753", - "lon": "-70.28988", - "id": 828997621, - "subType": "sports_centre", - "type": "sport", - "additionalInfo": { - "website": "https://www.portlandboxingclub.org/", - "phone": "+1-207-761-0975" - } - }, - { - "name": "Portland Boxing Club", - "lat": "43.68753", - "lon": "-70.28988", - "id": 828997621, - "subType": "boxing", - "type": "sport", - "additionalInfo": { - "website": "https://www.portlandboxingclub.org/", - "phone": "+1-207-761-0975" - } - }, - { - "name": "Portland Boxing Club", - "lat": "43.68753", - "lon": "-70.28988", - "id": 828997621, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "https://www.portlandboxingclub.org/", - "phone": "+1-207-761-0975" - } - }, - { - "name": "Portland Observatory", - "lat": "43.66539", - "lon": "-70.24826", - "id": 668522631, - "subType": "attraction", - "type": "tourism", - "additionalInfo": { - "website": "http://portlandlandmarks.org/observatory/", - "phone": "+1-207-774-5561", - "ele": "68", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Observatory" - } - }, - { - "name": "Portland Observatory", - "lat": "43.66539", - "lon": "-70.24826", - "id": 668522631, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://portlandlandmarks.org/observatory/", - "phone": "+1-207-774-5561", - "ele": "68", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Observatory" - } - }, - { - "name": "Portland International Jetport", - "lat": "43.64615", - "lon": "-70.30568", - "id": 449038625, - "subType": "aerodrome", - "type": "transportation", - "additionalInfo": { - "icao": "KPWM", - "ele": "19", - "iata": "PWM", - "operator": "Portland, Maine" - } - }, - { - "name": "Miss Portland Diner", - "lat": "43.66348", - "lon": "-70.26325", - "id": 443297739, - "subType": "restaurant", - "type": "sustenance", - "additionalInfo": { - "smoking_no": "no" - } - }, - { - "name": "Miss Portland Diner", - "lat": "43.66348", - "lon": "-70.26325", - "id": 443297739, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "smoking_no": "no" - } - }, - { - "name": "Brown's Warf 2 Portland Fish Pier", - "lat": "43.65162", - "lon": "-70.25414", - "id": 61188099, - "subType": "pier", - "type": "man_made" - }, - { - "name": "Portland Head Light", - "lat": "43.62312", - "lon": "-70.20787", - "id": 659586747, - "subType": "lighthouse", - "type": "man_made", - "additionalInfo": { - "historic_yes": "yes", - "height": "24.384", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Head Light" - } - }, - { - "name": "Portland Head Light", - "lat": "43.62312", - "lon": "-70.20787", - "id": 659586747, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "historic_yes": "yes", - "height": "24.384", - "wikipedia": "http://en.wikipedia.org/wiki/Portland Head Light" - } - }, - { - "name": "Burbank Branch, Portland Public Library", - "lat": "43.67133", - "lon": "-70.29480", - "id": 1088458573, - "subType": "library", - "type": "education" - }, - { - "name": "Burbank Branch, Portland Public Library", - "lat": "43.67133", - "lon": "-70.29480", - "id": 1088458573, - "subType": "building", - "type": "man_made" - }, - { - "name": "Greater Portland School of Jukado", - "lat": "43.67659", - "lon": "-70.36449", - "id": 1396761773, - "subType": "dojo", - "type": "education", - "additionalInfo": { - "website": "http://jukadousa.com", - "phone": "+1 207-854-9408" - } - }, - { - "name": "Greater Portland School of Jukado", - "lat": "43.67659", - "lon": "-70.36449", - "id": 1396761773, - "subType": "fitness_centre", - "type": "entertainment", - "additionalInfo": { - "website": "http://jukadousa.com", - "phone": "+1 207-854-9408" - } - }, - { - "name": "Greater Portland School of Jukado", - "lat": "43.67659", - "lon": "-70.36449", - "id": 1396761773, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://jukadousa.com", - "phone": "+1 207-854-9408" - } - }, - { - "name": "Burbank Branch Portland Public Library", - "lat": "43.67143", - "lon": "-70.29486", - "id": 735589432, - "subType": "library", - "type": "education", - "additionalInfo": { - "ele": "26" - } - }, - { - "name": "Portland Fire Department - Stevens Avenue Station", - "lat": "43.66602", - "lon": "-70.29645", - "id": 1088705361, - "subType": "fire_station", - "type": "emergency", - "additionalInfo": { - "operator": "Portland Fire Department" - } - }, - { - "name": "Portland Fire Department - Stevens Avenue Station", - "lat": "43.66602", - "lon": "-70.29645", - "id": 1088705361, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "operator": "Portland Fire Department" - } - }, - { - "name": "Portland Discovery Land and Sea Tours", - "lat": "43.65575", - "lon": "-70.25242", - "id": 13128050634, - "subType": "attraction", - "type": "tourism", - "additionalInfo": { - "website": "https://www.portlanddiscovery.com/", - "phone": "+1-207-774-0808" - } - }, - { - "name": "Portland Pottery", - "lat": "43.66713", - "lon": "-70.25332", - "id": 780684031, - "subType": "craft_pottery", - "type": "service", - "additionalInfo": { - "website": "http://www.portlandpottery.com/", - "phone": "+1-207-772-4334" - } - }, - { - "name": "Portland Pottery", - "lat": "43.66713", - "lon": "-70.25332", - "id": 780684031, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://www.portlandpottery.com/", - "phone": "+1-207-772-4334" - } - }, - { - "name": "South Portland", - "lat": "43.64148", - "lon": "-70.24090", - "id": 317795144, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "ele": "7", - "population": "23784" - } - }, - { - "name": "Portland Public Library - Main Branch", - "lat": "43.65780", - "lon": "-70.25918", - "id": 680239370, - "subType": "library", - "type": "education", - "additionalInfo": { - "wheelchair_yes": "yes", - "toilets_wheelchair_yes": "yes" - } - }, - { - "name": "New Portland Town Office", - "lat": "44.90031", - "lon": "-70.02977", - "id": 14351134372, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland", - "names": { - "ru": "Портленд", - "uk": "Портленд" - }, - "lat": "43.66104", - "lon": "-70.25486", - "id": 317735220, - "subType": "city", - "type": "administrative", - "additionalInfo": { - "ele": "19", - "population": "66417" - } - }, - { - "name": "Portland Avenue", - "lat": "43.22723", - "lon": "-70.81150", - "id": 439444341, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "surface_asphalt": "asphalt", - "ref": "NH 4" - } - }, - { - "name": "Portland Harbor Hotel", - "lat": "43.65545", - "lon": "-70.25517", - "id": 736405027, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "smoking_no": "no", - "website": "https://www.portlandharborhotel.com/", - "phone": "+1-207-775-9090" - } - }, - { - "name": "Portland Harbor Hotel", - "lat": "43.65545", - "lon": "-70.25517", - "id": 736405027, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "smoking_no": "no", - "website": "https://www.portlandharborhotel.com/", - "phone": "+1-207-775-9090" - } - }, - { - "name": "Portland Fire Department - Bramhall Station", - "lat": "43.65336", - "lon": "-70.27222", - "id": 739897759, - "subType": "fire_station", - "type": "emergency", - "additionalInfo": { - "operator": "City of Portland" - } - }, - { - "name": "Portland Fire Department - Bramhall Station", - "lat": "43.65336", - "lon": "-70.27222", - "id": 739897759, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "operator": "City of Portland" - } - }, - { - "name": "Portland Pottery Cafe", - "lat": "43.66724", - "lon": "-70.25343", - "id": 780684033, - "subType": "restaurant", - "type": "sustenance", - "additionalInfo": { - "website": "http://www.portlandpottery.com/about/", - "phone": "+1-207-772-4334" - } - }, - { - "name": "Portland Pottery Cafe", - "lat": "43.66724", - "lon": "-70.25343", - "id": 780684033, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://www.portlandpottery.com/about/", - "phone": "+1-207-772-4334" - } - }, - { - "name": "Portland Fire Department Riverton Fire Station", - "lat": "43.69701", - "lon": "-70.30778", - "id": 912403883, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department Riverton Fire Station", - "lat": "43.69701", - "lon": "-70.30778", - "id": 912403883, - "subType": "building", - "type": "man_made" - }, - { - "name": "La Quinta Inn & Suites Portland", - "lat": "43.65536", - "lon": "-70.28197", - "id": 625016523, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "smoking_no": "no", - "phone": "+1-207-871-0611", - "official_name": "La Quinta Inn by Wyndham", - "operator": "Wyndham Hotels and Resorts", - "brand": "La Quinta" - } - }, - { - "name": "La Quinta Inn & Suites Portland", - "lat": "43.65536", - "lon": "-70.28197", - "id": 625016523, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "smoking_no": "no", - "phone": "+1-207-871-0611", - "official_name": "La Quinta Inn by Wyndham", - "operator": "Wyndham Hotels and Resorts", - "brand": "La Quinta" - } - }, - { - "name": "South Portland Golf Course", - "lat": "43.62878", - "lon": "-70.30761", - "id": 595653131, - "subType": "golf_course", - "type": "sport", - "additionalInfo": { - "website": "https://www.southportland.org/departments/parks-recreation-aquaticspool/golf-course/", - "phone": "+1-207-767-7652" - } - }, - { - "name": "Greater Portland YMCA", - "lat": "43.65656", - "lon": "-70.26546", - "id": 802950227, - "subType": "sports_centre", - "type": "sport", - "additionalInfo": { - "website": "http://www.ymcaofsouthernmaine.org/", - "phone": "+1-207-874-1111", - "brand": "YMCA" - } - }, - { - "name": "Greater Portland YMCA", - "lat": "43.65656", - "lon": "-70.26546", - "id": 802950227, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "http://www.ymcaofsouthernmaine.org/", - "phone": "+1-207-874-1111", - "brand": "YMCA" - } - }, - { - "name": "Portland Glass", - "lat": "43.45385", - "lon": "-70.78968", - "id": 1472723017, - "subType": "craft_window_construction", - "type": "service", - "openingHours": "Mo-Fr 08:00-17:00; Sa 08:00-12:00", - "additionalInfo": { - "opening_hours": "Mo-Fr 08:00-17:00; Sa 08:00-12:00", - "website": "https://www.portlandglass.com/springvale/?L=true", - "phone": "+1-207-405-0449" - } - }, - { - "name": "Portland Glass", - "lat": "43.45385", - "lon": "-70.78968", - "id": 1472723017, - "subType": "building", - "type": "man_made", - "openingHours": "Mo-Fr 08:00-17:00; Sa 08:00-12:00", - "additionalInfo": { - "opening_hours": "Mo-Fr 08:00-17:00; Sa 08:00-12:00", - "website": "https://www.portlandglass.com/springvale/?L=true", - "phone": "+1-207-405-0449" - } - }, - { - "name": "City of Portland Public Services", - "lat": "43.65831", - "lon": "-70.26424", - "id": 830776341, - "subType": "government", - "type": "administrative" - }, - { - "name": "City of Portland Public Services", - "lat": "43.65831", - "lon": "-70.26424", - "id": 830776341, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Performing Arts Center", - "lat": "43.65564", - "lon": "-70.26338", - "id": 735588940, - "subType": "arts_centre", - "type": "entertainment", - "additionalInfo": { - "ele": "31" - } - }, - { - "name": "Portland lobster co.", - "enName": "Portland Lobster Co.", - "lat": "43.65575", - "lon": "-70.25272", - "id": 10096570456, - "subType": "restaurant", - "type": "sustenance", - "additionalInfo": { - "cuisine_seafood": "seafood", - "website": "http://portlandlobstercompany.com" - } - }, - { - "name": "Homewood Suites by Hilton Portland", - "lat": "43.62714", - "lon": "-70.34368", - "id": 1119670507, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "brand": "Homewood Suites" - } - }, - { - "name": "Homewood Suites by Hilton Portland", - "lat": "43.62714", - "lon": "-70.34368", - "id": 1119670507, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "brand": "Homewood Suites" - } - }, - { - "name": "WGAN-AM (Portland)", - "lat": "43.68986", - "lon": "-70.31660", - "id": 716454238, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "22" - } - }, - { - "name": "WGAN-AM (Portland)", - "lat": "43.78123", - "lon": "-70.55650", - "id": 716454240, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "85" - } - }, - { - "name": "Portland Fire Department Little Diamond Island Fire Station", - "lat": "43.66547", - "lon": "-70.20972", - "id": 14335835542, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "WLOB-AM (Portland)", - "lat": "43.68952", - "lon": "-70.33432", - "id": 716454236, - "subType": "tower", - "type": "man_made", - "additionalInfo": { - "ele": "10" - } - }, - { - "name": "The Westin Portland Harborview", - "lat": "43.65479", - "lon": "-70.26383", - "id": 684297977, - "subType": "hotel", - "type": "tourism", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/The Westin Portland Harborview" - } - }, - { - "name": "The Westin Portland Harborview", - "lat": "43.65479", - "lon": "-70.26383", - "id": 684297977, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/The Westin Portland Harborview" - } - }, - { - "name": "Portland Society of Natural History", - "lat": "43.65926", - "lon": "-70.25922", - "id": 735588844, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "ele": "17" - } - }, - { - "name": "The Rock Church of Greater Portland", - "lat": "43.59910", - "lon": "-70.33739", - "id": 716464456, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "ele": "17" - } - }, - { - "name": "City of Portland Day Parking Lot", - "lat": "43.66100", - "lon": "-70.24628", - "id": 14343952642, - "subType": "parking", - "type": "transportation" - }, - { - "name": "Portland Ocean Gateway", - "lat": "43.65989", - "lon": "-70.24643", - "id": 1321193287, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/Ocean Gateway International Marine Passenger Terminal" - } - }, - { - "name": "Portland International Jetport", - "lat": "43.64757", - "lon": "-70.31168", - "id": 58389633, - "subType": "aeroway_terminal", - "type": "transportation" - }, - { - "name": "Portland Ocean Gateway", - "lat": "43.65910", - "lon": "-70.24538", - "id": 1321193285, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland", - "lat": "40.43450", - "lon": "-84.97775", - "id": -78279, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "6223" - } - }, - { - "name": "South Portland Civil War Memorial", - "lat": "43.63483", - "lon": "-70.23965", - "id": 1109372377, - "subType": "park", - "type": "entertainment" - }, - { - "name": "Animal Refuge League of Greater Portland", - "lat": "43.66578", - "lon": "-70.34750", - "id": 4412102324224, - "subType": "animal_shelter", - "type": "service" - }, - { - "name": "Animal Refuge League of Greater Portland", - "lat": "43.66578", - "lon": "-70.34750", - "id": 4412102324224, - "subType": "building", - "type": "man_made" - }, - { - "name": "Portland Fire Department Munjoy Hill Station", - "lat": "43.66562", - "lon": "-70.24789", - "id": 14343952636, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Fire Department Ocean Avenue Fire Station", - "lat": "43.68674", - "lon": "-70.26800", - "id": 14341515546, - "subType": "fire_station", - "type": "emergency" - }, - { - "name": "Portland Natural Gas Transmission System", - "lat": "44.25657", - "lon": "-70.72410", - "id": 500002335, - "subType": "industrial", - "type": "man_made" - }, - { - "name": "Portland City Hall", - "lat": "43.65943", - "lon": "-70.25714", - "id": 59974215, - "subType": "townhall", - "type": "administrative", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/Portland City Hall (Maine)" - } - }, - { - "name": "Portland City Hall", - "lat": "43.65943", - "lon": "-70.25714", - "id": 59974215, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wikipedia": "http://en.wikipedia.org/wiki/Portland City Hall (Maine)" - } - }, - { - "name": "Portland Pie Co.", - "lat": "43.65302", - "lon": "-70.25768", - "id": 11126357690, - "subType": "restaurant", - "type": "sustenance" - }, - { - "name": "Portland Street", - "lat": "44.54794", - "lon": "-70.54892", - "id": 85518533, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Angelos Acre City of Portland Parking Lot", - "lat": "43.64943", - "lon": "-70.25875", - "id": 14343951592, - "subType": "parking", - "type": "transportation" - }, - { - "name": "Greater Portland Christian School", - "lat": "43.62926", - "lon": "-70.28757", - "id": 716463914, - "subType": "school", - "type": "education", - "additionalInfo": { - "ele": "10" - } - }, - { - "name": "Greater Portland Church of Christ", - "lat": "43.61703", - "lon": "-70.27366", - "id": 716463916, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "ele": "35" - } - } - ], - "cities": [ - { - "name": "Sandy Creek", - "lat": "44.02174", - "lon": "-70.70784", - "id": 158903772, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "44.02799", - "lon": "-70.69492", - "id": 85643, - "buildings": [ - { - "name": "383", - "lat": "44.02799", - "lon": "-70.69492" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "East New Portland", - "lat": "44.90172", - "lon": "-70.02340", - "id": 158813394, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Katie Crotch Road", - "lat": "44.90329", - "lon": "-70.02340", - "id": 23764 - }, - { - "name": "New Portland Hill Road", - "lat": "44.89442", - "lon": "-70.00716", - "id": 68209 - }, - { - "name": "River Road", - "lat": "44.89957", - "lon": "-70.02381", - "id": 79217 - }, - { - "name": "School Street", - "lat": "44.90074", - "lon": "-70.02379", - "id": 23268 - }, - { - "name": "Snowmobile Kingfield New Portland Connector", - "lat": "44.91282", - "lon": "-70.02834", - "id": 80955 - }, - { - "name": "South Road", - "lat": "44.87771", - "lon": "-69.99825", - "id": 67600 - }, - { - "name": "Cobbs Road", - "lat": "44.90123", - "lon": "-70.02568", - "id": 23916 - }, - { - "name": "Gil Road", - "lat": "44.89884", - "lon": "-70.05527", - "id": 68870 - }, - { - "name": "Safford Road", - "lat": "44.89639", - "lon": "-70.02786", - "id": 68321 - }, - { - "name": "Samantha's Lane", - "lat": "44.90191", - "lon": "-70.02640", - "id": 67642 - }, - { - "name": "Yahn's Way", - "lat": "44.90735", - "lon": "-70.03664", - "id": 69782 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "North Berwick", - "lat": "43.30633", - "lon": "-70.73436", - "id": 158873824, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Street", - "lat": "43.30688", - "lon": "-70.72846", - "id": 16337, - "buildings": [ - { - "name": "19", - "lat": "43.30512", - "lon": "-70.73213", - "postcode": "03906" - }, - { - "name": "23", - "lat": "43.30521", - "lon": "-70.73174", - "postcode": "03906" - }, - { - "name": "26", - "lat": "43.30515", - "lon": "-70.73118", - "postcode": "03906" - }, - { - "name": "27", - "lat": "43.30537", - "lon": "-70.73144", - "postcode": "03906" - }, - { - "name": "30", - "lat": "43.30527", - "lon": "-70.73088", - "postcode": "03906" - }, - { - "name": "31", - "lat": "43.30555", - "lon": "-70.73118", - "postcode": "03906" - }, - { - "name": "33", - "lat": "43.30566", - "lon": "-70.73103", - "postcode": "03906" - }, - { - "name": "36", - "lat": "43.30557", - "lon": "-70.73054", - "postcode": "03906" - }, - { - "name": "37", - "lat": "43.30626", - "lon": "-70.73127", - "postcode": "03906" - }, - { - "name": "38", - "lat": "43.30569", - "lon": "-70.73037", - "postcode": "03906" - }, - { - "name": "41", - "lat": "43.30607", - "lon": "-70.73050", - "postcode": "03906" - }, - { - "name": "44", - "lat": "43.30593", - "lon": "-70.72994", - "postcode": "03906" - }, - { - "name": "48", - "lat": "43.30624", - "lon": "-70.72957", - "postcode": "03906" - }, - { - "name": "48", - "lat": "43.30604", - "lon": "-70.72977", - "postcode": "03906" - }, - { - "name": "52", - "lat": "43.30622", - "lon": "-70.72957", - "postcode": "03906" - }, - { - "name": "53", - "lat": "43.30661", - "lon": "-70.72977", - "postcode": "03906" - }, - { - "name": "55", - "lat": "43.30682", - "lon": "-70.72953", - "postcode": "03906" - }, - { - "name": "56", - "lat": "43.30651", - "lon": "-70.72925", - "postcode": "03906" - }, - { - "name": "60", - "lat": "43.30674", - "lon": "-70.72884", - "postcode": "03906" - }, - { - "name": "61", - "lat": "43.30711", - "lon": "-70.72910", - "postcode": "03906" - }, - { - "name": "63", - "lat": "43.30727", - "lon": "-70.72889", - "postcode": "03906" - }, - { - "name": "64", - "lat": "43.30688", - "lon": "-70.72846", - "postcode": "03906" - }, - { - "name": "69", - "lat": "43.30749", - "lon": "-70.72859", - "postcode": "03906" - }, - { - "name": "74", - "lat": "43.30743", - "lon": "-70.72794", - "postcode": "03906" - } - ], - "intersectedStreets": [ - { - "name": "Main Street", - "lat": "43.30396", - "lon": "-70.73307" - }, - { - "name": "Tom Rice Road", - "lat": "43.30515", - "lon": "-70.73142" - }, - { - "name": "Wells Street", - "names": { - "alt_name": "State Route 9" - }, - "lat": "43.30804", - "lon": "-70.72749" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Westbrook", - "lat": "43.67703", - "lon": "-70.37116", - "id": 158859102, - "type": "TOWN", - "listOfStreets": [ - { - "name": "New Portland Road", - "lat": "43.67774", - "lon": "-70.39936", - "id": 80504, - "intersectedStreets": [ - { - "name": "Rangeley Way", - "lat": "43.67794", - "lon": "-70.40408" - }, - { - "name": "Bartlett Road", - "lat": "43.67740", - "lon": "-70.38953" - }, - { - "name": "New Gorham Road", - "lat": "43.67725", - "lon": "-70.38477" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Embden", - "lat": "44.91811", - "lon": "-69.86672", - "id": 158864595, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "New Portland Road", - "lat": "44.87661", - "lon": "-69.95783", - "id": 67905 - }, - { - "name": "Snowmobile Embden New Portland Connector", - "lat": "44.90642", - "lon": "-69.99242", - "id": 79835 - } - ], - "matchStreet": 1 - }, - { - "name": "Hillside", - "lat": "43.90952", - "lon": "-70.03033", - "id": 158867670, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Old Portland Road", - "lat": "43.90732", - "lon": "-70.03645", - "id": 35546, - "intersectedStreets": [ - { - "name": "Patriot Drive", - "lat": "43.90732", - "lon": "-70.03645" - }, - { - "name": "Grant Road", - "lat": "43.90807", - "lon": "-70.03471" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Winslow", - "lat": "44.54742", - "lon": "-69.62174", - "id": 158843866, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Brownfield", - "lat": "43.93845", - "lon": "-70.90920", - "id": 158802376, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Lane", - "lat": "43.92210", - "lon": "-70.86546", - "id": 57631, - "intersectedStreets": [ - { - "name": "Brookside Acres Road", - "lat": "43.92014", - "lon": "-70.86452" - }, - { - "name": "Pequawket Trail", - "lat": "43.92382", - "lon": "-70.86576" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Sanford", - "lat": "43.43888", - "lon": "-70.77397", - "id": 158837189, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Houlton", - "lat": "46.12513", - "lon": "-67.84079", - "id": 1895709513, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Bangor", - "enName": "Bangor", - "names": { - "ru": "Бангор", - "uk": "Бангор", - "he": "בנגור" - }, - "lat": "44.80118", - "lon": "-68.77781", - "id": 158862401, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Fort Fairfield", - "lat": "46.76983", - "lon": "-67.83457", - "id": 158826319, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Kittery", - "lat": "43.08845", - "lon": "-70.73685", - "id": 158863554, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Saco", - "lat": "43.50092", - "lon": "-70.44283", - "id": 158808782, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Portland Avenue", - "lat": "43.54754", - "lon": "-70.38943", - "id": 23667, - "buildings": [ - { - "name": "220", - "lat": "43.54754", - "lon": "-70.38943", - "postcode": "04072" - } - ] - }, - { - "name": "Portland Road", - "lat": "43.52817", - "lon": "-70.42929", - "id": 373, - "buildings": [ - { - "name": "705", - "lat": "43.51964", - "lon": "-70.42627", - "postcode": "04072" - }, - { - "name": "729", - "lat": "43.52123", - "lon": "-70.42713", - "postcode": "04072" - }, - { - "name": "754", - "lat": "43.52587", - "lon": "-70.42831", - "postcode": "04072" - }, - { - "name": "774", - "lat": "43.52817", - "lon": "-70.42929", - "postcode": "04072" - }, - { - "name": "783", - "lat": "43.53012", - "lon": "-70.42509", - "postcode": "04072" - }, - { - "name": "784", - "lat": "43.52973", - "lon": "-70.42734", - "postcode": "04072" - }, - { - "name": "788", - "lat": "43.53015", - "lon": "-70.42681", - "postcode": "04072" - }, - { - "name": "814", - "lat": "43.53617", - "lon": "-70.42670", - "postcode": "04072" - }, - { - "name": "837", - "lat": "43.53558", - "lon": "-70.42178" - }, - { - "name": "857", - "lat": "43.53800", - "lon": "-70.41962", - "postcode": "04072" - }, - { - "name": "969", - "lat": "43.55049", - "lon": "-70.40659", - "postcode": "04074" - }, - { - "name": "980", - "lat": "43.55199", - "lon": "-70.40822", - "postcode": "04072" - } - ], - "intersectedStreets": [ - { - "name": "Main Street", - "lat": "43.52213", - "lon": "-70.42796" - }, - { - "name": "Mill Brook Road", - "lat": "43.53293", - "lon": "-70.42498" - }, - { - "name": "Spring Hill Road", - "lat": "43.53334", - "lon": "-70.42483" - }, - { - "name": "Pine Haven Street", - "lat": "43.54088", - "lon": "-70.41775" - }, - { - "name": "Willowhaven Street", - "lat": "43.54169", - "lon": "-70.41698" - }, - { - "name": "Cascade Road", - "lat": "43.54648", - "lon": "-70.41245" - }, - { - "name": "Flag Pond Road", - "lat": "43.54863", - "lon": "-70.41041" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Presque Isle", - "enName": "Presque Isle", - "names": { - "ru": "Преск-Айл", - "uk": "Преск-Айл" - }, - "lat": "46.68148", - "lon": "-68.01636", - "id": 158814029, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Gorham", - "lat": "43.67969", - "lon": "-70.44293", - "id": 158860614, - "type": "TOWN", - "listOfStreets": [ - { - "name": "New Portland Road", - "lat": "43.67863", - "lon": "-70.41663", - "id": 2339, - "buildings": [ - { - "name": "13", - "lat": "43.68083", - "lon": "-70.43730", - "postcode": "04038" - }, - { - "name": "17", - "lat": "43.68074", - "lon": "-70.43683", - "postcode": "04038" - }, - { - "name": "21", - "lat": "43.68060", - "lon": "-70.43650", - "postcode": "04038" - }, - { - "name": "23", - "lat": "43.68043", - "lon": "-70.43629", - "postcode": "04038" - }, - { - "name": "25", - "lat": "43.68068", - "lon": "-70.43620", - "postcode": "04038" - }, - { - "name": "29", - "lat": "43.68063", - "lon": "-70.43580", - "postcode": "04038" - }, - { - "name": "30", - "lat": "43.68111", - "lon": "-70.43577", - "postcode": "04038" - }, - { - "name": "31", - "lat": "43.68049", - "lon": "-70.43556", - "postcode": "04038" - }, - { - "name": "37", - "lat": "43.68052", - "lon": "-70.43494", - "postcode": "04038" - }, - { - "name": "42", - "lat": "43.68097", - "lon": "-70.43483", - "postcode": "04038" - }, - { - "name": "43", - "lat": "43.68046", - "lon": "-70.43438", - "postcode": "04038" - }, - { - "name": "49", - "lat": "43.68040", - "lon": "-70.43382", - "postcode": "04038" - }, - { - "name": "50", - "lat": "43.68144", - "lon": "-70.43410", - "postcode": "04038" - }, - { - "name": "52", - "lat": "43.68075", - "lon": "-70.43341", - "postcode": "04038" - }, - { - "name": "55", - "lat": "43.68033", - "lon": "-70.43335", - "postcode": "04038" - }, - { - "name": "59", - "lat": "43.68023", - "lon": "-70.43292", - "postcode": "04038" - }, - { - "name": "60", - "lat": "43.68068", - "lon": "-70.43292", - "postcode": "04038" - }, - { - "name": "63", - "lat": "43.68027", - "lon": "-70.43271", - "postcode": "04038" - }, - { - "name": "65", - "lat": "43.68021", - "lon": "-70.43245", - "postcode": "04038" - }, - { - "name": "67", - "lat": "43.68021", - "lon": "-70.43221", - "postcode": "04038" - }, - { - "name": "69", - "lat": "43.68018", - "lon": "-70.43198", - "postcode": "04038" - }, - { - "name": "73", - "lat": "43.68012", - "lon": "-70.43174", - "postcode": "04038" - }, - { - "name": "75", - "lat": "43.68010", - "lon": "-70.43144", - "postcode": "04038" - }, - { - "name": "79", - "lat": "43.68002", - "lon": "-70.43095", - "postcode": "04038" - }, - { - "name": "96", - "lat": "43.68024", - "lon": "-70.43024", - "postcode": "04038" - }, - { - "name": "140", - "lat": "43.68001", - "lon": "-70.42387", - "postcode": "04038" - }, - { - "name": "166", - "lat": "43.67917", - "lon": "-70.41994", - "postcode": "04038" - }, - { - "name": "177", - "lat": "43.67830", - "lon": "-70.41805", - "postcode": "04038" - }, - { - "name": "180", - "lat": "43.67926", - "lon": "-70.41826", - "postcode": "04038" - }, - { - "name": "185", - "lat": "43.67815", - "lon": "-70.41691", - "postcode": "04038" - }, - { - "name": "186", - "lat": "43.67863", - "lon": "-70.41663", - "postcode": "04038" - }, - { - "name": "190", - "lat": "43.67909", - "lon": "-70.41590", - "postcode": "04038" - }, - { - "name": "191", - "lat": "43.67808", - "lon": "-70.41593", - "postcode": "04038" - }, - { - "name": "197", - "lat": "43.67785", - "lon": "-70.41511", - "postcode": "04038" - }, - { - "name": "198", - "lat": "43.67858", - "lon": "-70.41524", - "postcode": "04038" - }, - { - "name": "201", - "lat": "43.67790", - "lon": "-70.41412", - "postcode": "04038" - }, - { - "name": "219", - "lat": "43.67780", - "lon": "-70.41116", - "postcode": "04038" - }, - { - "name": "239", - "lat": "43.67751", - "lon": "-70.40775", - "postcode": "04038" - } - ], - "intersectedStreets": [ - { - "name": "Main Street", - "lat": "43.68117", - "lon": "-70.43828" - }, - { - "name": "Mechanic Street", - "lat": "43.68113", - "lon": "-70.43796" - }, - { - "name": "Pinecone Lane", - "lat": "43.68077", - "lon": "-70.43513" - }, - { - "name": "Old Oak Lane", - "lat": "43.68071", - "lon": "-70.43477" - }, - { - "name": "Old Birch Lane", - "lat": "43.68058", - "lon": "-70.43367" - }, - { - "name": "Johnson Road", - "lat": "43.68050", - "lon": "-70.43286" - }, - { - "name": "Tink Drive", - "lat": "43.68013", - "lon": "-70.43000" - }, - { - "name": "Toppan Drive", - "lat": "43.68002", - "lon": "-70.42923" - }, - { - "name": "Elkins Road", - "lat": "43.67915", - "lon": "-70.42262" - }, - { - "name": "Veranda Drive", - "lat": "43.67875", - "lon": "-70.41947" - } - ] - }, - { - "name": "New Portland Road (Mosher Corner)", - "lat": "43.67771", - "lon": "-70.40058", - "id": 2509, - "buildings": [ - { - "name": "245", - "lat": "43.67788", - "lon": "-70.40651", - "postcode": "04038" - }, - { - "name": "252", - "lat": "43.67863", - "lon": "-70.40490", - "postcode": "04038" - }, - { - "name": "257", - "lat": "43.67773", - "lon": "-70.40445", - "postcode": "04038" - }, - { - "name": "267", - "lat": "43.67751", - "lon": "-70.40279", - "postcode": "04038" - }, - { - "name": "277", - "lat": "43.67771", - "lon": "-70.40058", - "postcode": "04038" - }, - { - "name": "286", - "lat": "43.67818", - "lon": "-70.39953", - "postcode": "04038" - }, - { - "name": "298", - "lat": "43.67815", - "lon": "-70.39754", - "postcode": "04038" - } - ] - }, - { - "name": "New Portland Road (Westbrook)", - "lat": "43.67762", - "lon": "-70.38904", - "id": 2510, - "buildings": [ - { - "name": "253", - "lat": "43.67753", - "lon": "-70.40492", - "postcode": "04038" - }, - { - "name": "259", - "lat": "43.67377", - "lon": "-70.40297", - "postcode": "04038" - }, - { - "name": "289", - "lat": "43.67737", - "lon": "-70.39855", - "postcode": "04038" - }, - { - "name": "291", - "lat": "43.67726", - "lon": "-70.39728", - "postcode": "04038" - }, - { - "name": "295", - "lat": "43.67687", - "lon": "-70.39700", - "postcode": "04038" - }, - { - "name": "297", - "lat": "43.67718", - "lon": "-70.39659", - "postcode": "04038" - }, - { - "name": "307", - "lat": "43.67734", - "lon": "-70.39511", - "postcode": "04038" - }, - { - "name": "309", - "lat": "43.67734", - "lon": "-70.39449", - "postcode": "04038" - }, - { - "name": "310", - "lat": "43.67790", - "lon": "-70.39507", - "postcode": "04038" - }, - { - "name": "313", - "lat": "43.67725", - "lon": "-70.39365", - "postcode": "04038" - }, - { - "name": "316", - "lat": "43.67779", - "lon": "-70.39378", - "postcode": "04038" - }, - { - "name": "317", - "lat": "43.67708", - "lon": "-70.39307", - "postcode": "04038" - }, - { - "name": "320", - "lat": "43.67794", - "lon": "-70.39288", - "postcode": "04038" - }, - { - "name": "321", - "lat": "43.67723", - "lon": "-70.39243", - "postcode": "04038" - }, - { - "name": "326", - "lat": "43.67788", - "lon": "-70.39226", - "postcode": "04038" - }, - { - "name": "342", - "lat": "43.67762", - "lon": "-70.38904", - "postcode": "04038" - }, - { - "name": "346", - "lat": "43.67756", - "lon": "-70.38829", - "postcode": "04038" - }, - { - "name": "348", - "lat": "43.67804", - "lon": "-70.38777", - "postcode": "04038" - }, - { - "name": "350", - "lat": "43.67787", - "lon": "-70.38715", - "postcode": "04038" - }, - { - "name": "352", - "lat": "43.67754", - "lon": "-70.38726", - "postcode": "04038" - }, - { - "name": "353", - "lat": "43.67712", - "lon": "-70.38623", - "postcode": "04038" - }, - { - "name": "355", - "lat": "43.67712", - "lon": "-70.38589", - "postcode": "04038" - }, - { - "name": "356", - "lat": "43.67748", - "lon": "-70.38631", - "postcode": "04038" - }, - { - "name": "358", - "lat": "43.67808", - "lon": "-70.38578", - "postcode": "04038" - }, - { - "name": "359", - "lat": "43.67641", - "lon": "-70.38556", - "postcode": "04038" - }, - { - "name": "360", - "lat": "43.67748", - "lon": "-70.38591", - "postcode": "04038" - }, - { - "name": "362", - "lat": "43.67754", - "lon": "-70.38531", - "postcode": "04038" - }, - { - "name": "364", - "lat": "43.67749", - "lon": "-70.38498", - "postcode": "04038" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Wells", - "lat": "43.32218", - "lon": "-70.58098", - "id": 158808778, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "South Portland Gardens", - "lat": "43.63897", - "lon": "-70.31533", - "id": 158856138, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Powers Road", - "lat": "43.64055", - "lon": "-70.31621", - "id": 34814 - }, - { - "name": "Cannon Road", - "lat": "43.63941", - "lon": "-70.31310", - "id": 33134 - }, - { - "name": "Colin Kelly Road", - "lat": "43.63775", - "lon": "-70.31389", - "id": 35886 - }, - { - "name": "Devereaux Circle", - "lat": "43.63819", - "lon": "-70.31454", - "id": 35632 - }, - { - "name": "Mac Arthur Circle East", - "lat": "43.63777", - "lon": "-70.31660", - "id": 41256 - }, - { - "name": "Wainwright Circle East", - "lat": "43.63797", - "lon": "-70.31563", - "id": 40640 - }, - { - "name": "Wermuth Road", - "lat": "43.63901", - "lon": "-70.31387", - "id": 36817 - } - ], - "matchCity": 1 - }, - { - "name": "East Millinocket", - "lat": "45.62755", - "lon": "-68.57448", - "id": 158856521, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Rumford", - "lat": "44.55427", - "lon": "-70.55145", - "id": 158809528, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Portland Street", - "lat": "44.54731", - "lon": "-70.54581", - "id": 57157 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Lewiston", - "lat": "44.10035", - "lon": "-70.21478", - "id": 158821172, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Milliken Mills", - "lat": "43.54453", - "lon": "-70.39227", - "id": 158842931, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Portland Avenue", - "lat": "43.54290", - "lon": "-70.39170", - "id": 23391, - "buildings": [ - { - "name": "199", - "lat": "43.54514", - "lon": "-70.39172", - "postcode": "04064" - }, - { - "name": "204", - "lat": "43.54292", - "lon": "-70.39170", - "postcode": "04064" - }, - { - "name": "205", - "lat": "43.54589", - "lon": "-70.39080", - "postcode": "04064" - }, - { - "name": "206", - "lat": "43.54359", - "lon": "-70.39219", - "postcode": "04064" - }, - { - "name": "212", - "lat": "43.54600", - "lon": "-70.39211", - "postcode": "04072" - } - ], - "intersectedStreets": [ - { - "name": "Milliken Mills Road", - "lat": "43.54474", - "lon": "-70.39237" - }, - { - "name": "Milliken Mill Road", - "lat": "43.55049", - "lon": "-70.38376" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Milton", - "lat": "43.46850", - "lon": "-70.96782", - "id": 368004, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Old Town", - "lat": "44.93467", - "lon": "-68.64533", - "id": 158842929, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Street (Great Works)", - "lat": "44.91743", - "lon": "-68.63651", - "id": 59909 - } - ], - "matchStreet": 1 - }, - { - "name": "Madawaska", - "lat": "47.35557", - "lon": "-68.32192", - "id": 158821309, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Farmington", - "lat": "44.67109", - "lon": "-70.15183", - "id": 158855357, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "New Portland", - "lat": "44.88422", - "lon": "-70.09673", - "id": 158839357, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Airport Road", - "lat": "44.91695", - "lon": "-70.04973", - "id": 23260 - }, - { - "name": "Back Road", - "lat": "44.98433", - "lon": "-70.03819", - "id": 4929 - }, - { - "name": "Bakers Way", - "lat": "44.95302", - "lon": "-70.05814", - "id": 23680 - }, - { - "name": "Black Hill Road", - "lat": "44.91768", - "lon": "-70.00501", - "id": 23919 - }, - { - "name": "Bog Road", - "lat": "44.94767", - "lon": "-70.08322", - "id": 23684 - }, - { - "name": "Bog Road", - "lat": "44.93357", - "lon": "-70.06142", - "id": 23685 - }, - { - "name": "Bog Road", - "lat": "44.92536", - "lon": "-70.05065", - "id": 23686 - }, - { - "name": "Bog Road", - "lat": "44.94205", - "lon": "-70.07340", - "id": 23689 - }, - { - "name": "Bourbon Street", - "lat": "44.85617", - "lon": "-70.12597", - "id": 23271 - }, - { - "name": "Butler Pond Road", - "lat": "44.96404", - "lon": "-70.10668", - "id": 4894 - }, - { - "name": "Cameron Drive", - "lat": "44.95338", - "lon": "-70.04926", - "id": 23696 - }, - { - "name": "Carrabassett Road", - "lat": "44.89405", - "lon": "-70.10408", - "id": 23261 - }, - { - "name": "Cedar", - "lat": "44.85827", - "lon": "-70.12784", - "id": 70179 - }, - { - "name": "Cedar Lane", - "lat": "44.85873", - "lon": "-70.12835", - "id": 23715 - }, - { - "name": "Cedar Street", - "lat": "44.85792", - "lon": "-70.13114", - "id": 69545 - }, - { - "name": "Chick Road", - "lat": "44.88925", - "lon": "-70.11466", - "id": 23290 - }, - { - "name": "Collins", - "lat": "44.85981", - "lon": "-70.12715", - "id": 71491 - }, - { - "name": "Collins Road", - "lat": "44.85780", - "lon": "-70.13202", - "id": 68583 - }, - { - "name": "Deer Farm Road", - "lat": "44.91732", - "lon": "-70.09097", - "id": 23734 - }, - { - "name": "Field Road", - "lat": "44.93476", - "lon": "-70.12923", - "id": 23270 - }, - { - "name": "Fourth Street", - "lat": "44.96167", - "lon": "-70.00503", - "id": 4909 - }, - { - "name": "Freeman Ridge Road", - "lat": "44.94123", - "lon": "-70.14835", - "id": 23272 - }, - { - "name": "George E Cole Road", - "lat": "44.94772", - "lon": "-70.03973", - "id": 23278 - }, - { - "name": "George E Cole Road", - "lat": "44.93967", - "lon": "-70.03514", - "id": 23743 - }, - { - "name": "Gilman Pond Road", - "lat": "44.94806", - "lon": "-70.05861", - "id": 23293 - }, - { - "name": "Gilman Pond Road", - "lat": "44.93072", - "lon": "-70.04844", - "id": 23748 - }, - { - "name": "Great Works Road", - "lat": "44.86849", - "lon": "-70.11582", - "id": 68492 - }, - { - "name": "Hancock Pond Road", - "lat": "44.96328", - "lon": "-69.99699", - "id": 4447 - }, - { - "name": "Hancock Pond Road", - "lat": "44.96550", - "lon": "-70.01473", - "id": 4912 - }, - { - "name": "Hancock Pond Road", - "lat": "44.94143", - "lon": "-70.00982", - "id": 23756 - }, - { - "name": "Heather Road", - "lat": "44.89043", - "lon": "-70.12380", - "id": 23265 - }, - { - "name": "Hemlock Road", - "lat": "44.95671", - "lon": "-70.03898", - "id": 4902 - }, - { - "name": "Katie Crotch Road", - "lat": "44.90191", - "lon": "-70.00327", - "id": 23762 - }, - { - "name": "Lemon Stream Road", - "lat": "44.87909", - "lon": "-70.11003", - "id": 23767 - }, - { - "name": "Long Falls Dam Road", - "lat": "44.94885", - "lon": "-70.04276", - "id": 23780 - }, - { - "name": "Long Falls Dam Road", - "lat": "44.94024", - "lon": "-70.04170", - "id": 23781 - }, - { - "name": "Meadow Brook Road", - "lat": "44.91325", - "lon": "-70.00499", - "id": 23286 - }, - { - "name": "Middle Road", - "lat": "44.92918", - "lon": "-70.12395", - "id": 23256 - }, - { - "name": "Millay Hill Road", - "lat": "44.92627", - "lon": "-70.07192", - "id": 23816 - }, - { - "name": "Millay Hill Road", - "lat": "44.92760", - "lon": "-70.09885", - "id": 23893 - }, - { - "name": "Millay Hill Road", - "lat": "44.93719", - "lon": "-70.07780", - "id": 23899 - }, - { - "name": "Mullen Road", - "lat": "44.94030", - "lon": "-70.01686", - "id": 23289 - }, - { - "name": "New Portland Hill Road", - "lat": "44.87579", - "lon": "-70.02385", - "id": 23828 - }, - { - "name": "New Portland Hill Road", - "lat": "44.87426", - "lon": "-70.03979", - "id": 23905 - }, - { - "name": "New Portland Hill Road", - "lat": "44.86840", - "lon": "-70.06132", - "id": 68210 - }, - { - "name": "North Shore Road", - "lat": "44.96270", - "lon": "-70.00454", - "id": 4935 - }, - { - "name": "Old County Road", - "lat": "44.89101", - "lon": "-70.11687", - "id": 23266 - }, - { - "name": "Paulin Drive", - "lat": "44.91423", - "lon": "-70.11938", - "id": 67909 - }, - { - "name": "Pine Road", - "lat": "44.86045", - "lon": "-70.12487", - "id": 23836 - }, - { - "name": "Poulin Drive", - "lat": "44.92876", - "lon": "-70.13292", - "id": 23838 - }, - { - "name": "Reed Road", - "lat": "44.94418", - "lon": "-70.06108", - "id": 23841 - }, - { - "name": "River Road", - "lat": "44.88493", - "lon": "-70.10095", - "id": 23264 - }, - { - "name": "Shore Road", - "lat": "44.94892", - "lon": "-70.05239", - "id": 23276 - }, - { - "name": "Snowmobile ITS 84", - "lat": "44.88192", - "lon": "-70.13835", - "id": 79936 - }, - { - "name": "Snowmobile Kingfield Trail", - "lat": "44.89741", - "lon": "-70.15605", - "id": 81005 - }, - { - "name": "Snowmobile Kingfield Trail", - "lat": "44.91774", - "lon": "-70.06773", - "id": 81006 - }, - { - "name": "Snowmobile Trail", - "lat": "44.89305", - "lon": "-70.18562", - "id": 79826 - }, - { - "name": "Spruce Road", - "lat": "44.86052", - "lon": "-70.12844", - "id": 23849 - }, - { - "name": "Stone Wall Drive", - "lat": "44.89233", - "lon": "-70.09649", - "id": 23852 - }, - { - "name": "Sucker Brook Road", - "lat": "44.98499", - "lon": "-70.06681", - "id": 4892 - }, - { - "name": "Tuttle Drive", - "lat": "44.89435", - "lon": "-70.12655", - "id": 67998 - }, - { - "name": "Twin Pine Road", - "lat": "44.89671", - "lon": "-70.06241", - "id": 68352 - }, - { - "name": "Woods Road", - "lat": "44.97043", - "lon": "-69.98960", - "id": 4926 - }, - { - "name": "Woods Road", - "lat": "44.98321", - "lon": "-69.99407", - "id": 4927 - }, - { - "name": "Bass Lane (East New Portland)", - "lat": "44.90697", - "lon": "-70.03694", - "id": 23683 - }, - { - "name": "Bog Road (North New Portland)", - "lat": "44.92370", - "lon": "-70.02883", - "id": 23274 - }, - { - "name": "Church Street (North New Portland)", - "lat": "44.92733", - "lon": "-70.02289", - "id": 23282 - }, - { - "name": "Earles Way (North New Portland)", - "lat": "44.91940", - "lon": "-70.02982", - "id": 23933 - }, - { - "name": "Earnhardt Drive (North New Portland)", - "lat": "44.92514", - "lon": "-70.01885", - "id": 23920 - }, - { - "name": "Fairgrounds Road (North New Portland)", - "lat": "44.91667", - "lon": "-70.02289", - "id": 80271 - }, - { - "name": "Hancock Pond Road (North New Portland)", - "lat": "44.92844", - "lon": "-70.02016", - "id": 23754 - }, - { - "name": "Hutchins Street (North New Portland)", - "lat": "44.92671", - "lon": "-70.02316", - "id": 23902 - }, - { - "name": "Long Falls Dam Road (Lexington)", - "lat": "44.99039", - "lon": "-70.05235", - "id": 4928 - }, - { - "name": "Long Falls Dam Road (North New Portland)", - "lat": "44.92551", - "lon": "-70.02312", - "id": 23778 - }, - { - "name": "Meadow Brook Road (North New Portland)", - "lat": "44.92410", - "lon": "-70.01902", - "id": 23296 - }, - { - "name": "Merrill Road (North New Portland)", - "lat": "44.93499", - "lon": "-70.01304", - "id": 23269 - }, - { - "name": "New Portland Hill Road (East New Portland)", - "lat": "44.89867", - "lon": "-70.02366", - "id": 23817 - }, - { - "name": "Pooduck Road (North New Portland)", - "lat": "44.91899", - "lon": "-70.02160", - "id": 23837 - }, - { - "name": "School Street (East New Portland)", - "lat": "44.90074", - "lon": "-70.02379", - "id": 23267 - }, - { - "name": "School Street (North New Portland)", - "lat": "44.92335", - "lon": "-70.02707", - "id": 23279 - }, - { - "name": "Tower Road (East New Portland)", - "lat": "44.90949", - "lon": "-70.00958", - "id": 23968 - }, - { - "name": "Atwood Hill Road", - "lat": "44.87736", - "lon": "-70.09732", - "id": 23288 - }, - { - "name": "Beans Field Road", - "lat": "44.98769", - "lon": "-70.05784", - "id": 4901 - }, - { - "name": "Bennett Hill Road", - "lat": "44.88072", - "lon": "-70.08945", - "id": 23275 - }, - { - "name": "Cobbs Road", - "lat": "44.90123", - "lon": "-70.02568", - "id": 23915 - }, - { - "name": "Colegrove Road", - "lat": "44.87196", - "lon": "-70.11726", - "id": 23263 - }, - { - "name": "Collins Drive", - "lat": "44.85622", - "lon": "-70.13086", - "id": 23729 - }, - { - "name": "Emery Place", - "lat": "44.87194", - "lon": "-70.05469", - "id": 68839 - }, - { - "name": "Fenwicks Drive", - "lat": "44.92580", - "lon": "-70.14507", - "id": 23736 - }, - { - "name": "Gammon Pond", - "lat": "44.85709", - "lon": "-70.13241", - "id": 67704 - }, - { - "name": "Gammon Pond Road", - "lat": "44.86016", - "lon": "-70.12120", - "id": 23737 - }, - { - "name": "Gils Road", - "lat": "44.90057", - "lon": "-70.04115", - "id": 23911 - }, - { - "name": "Herbert Lovejoy Place", - "lat": "44.93096", - "lon": "-70.08305", - "id": 23894 - }, - { - "name": "Honors Lane", - "lat": "44.89841", - "lon": "-70.05458", - "id": 23760 - }, - { - "name": "Middlegate Lane", - "lat": "44.94061", - "lon": "-70.13644", - "id": 23892 - }, - { - "name": "Old Kingfield Road", - "lat": "44.88938", - "lon": "-70.10078", - "id": 23287 - }, - { - "name": "Old Millay Hill Road", - "lat": "44.93034", - "lon": "-70.07657", - "id": 68514 - }, - { - "name": "Safford Road", - "lat": "44.89811", - "lon": "-70.02634", - "id": 23847 - }, - { - "name": "Samanthas Lane", - "lat": "44.90154", - "lon": "-70.02647", - "id": 23917 - }, - { - "name": "Snowmobile Wire Bridge Trail", - "lat": "44.89619", - "lon": "-70.08440", - "id": 79828 - }, - { - "name": "Tannery Bridge Road", - "lat": "44.88532", - "lon": "-70.09565", - "id": 23853 - }, - { - "name": "Taylors Pit Road", - "lat": "44.91808", - "lon": "-70.02907", - "id": 23854 - }, - { - "name": "The Pines Drive", - "lat": "44.92382", - "lon": "-70.03589", - "id": 23855 - }, - { - "name": "Trudell Road", - "lat": "44.92428", - "lon": "-70.02913", - "id": 23856 - }, - { - "name": "Tuttles Drive", - "lat": "44.89539", - "lon": "-70.12550", - "id": 23857 - }, - { - "name": "Wire Bridge Road", - "lat": "44.89045", - "lon": "-70.09505", - "id": 23257 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Fryeburg", - "lat": "44.01652", - "lon": "-70.98129", - "id": 158853672, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Street", - "lat": "43.98962", - "lon": "-70.93507", - "id": 57158, - "intersectedStreets": [ - { - "name": "Lyman Drive", - "lat": "43.98434", - "lon": "-70.93224" - }, - { - "name": "Fish and Game Road", - "lat": "43.98701", - "lon": "-70.93252" - }, - { - "name": "Cranberry Drive", - "lat": "43.98922", - "lon": "-70.93460" - }, - { - "name": "Rapputak Road", - "lat": "43.99061", - "lon": "-70.93602" - }, - { - "name": "Fire Ln 12", - "lat": "43.99686", - "lon": "-70.94085" - }, - { - "name": "Porter Road", - "lat": "44.01174", - "lon": "-70.96814" - }, - { - "name": "Moose Rock Road", - "lat": "44.01174", - "lon": "-70.96814" - }, - { - "name": "Fire Ln 4", - "lat": "44.01226", - "lon": "-70.97011" - }, - { - "name": "Pine Street", - "lat": "44.01467", - "lon": "-70.97569" - }, - { - "name": "Warren Street", - "lat": "44.01515", - "lon": "-70.97677" - }, - { - "name": "Main Street", - "lat": "44.01680", - "lon": "-70.98061" - }, - { - "name": "Wiley Drive", - "lat": "44.01126", - "lon": "-70.96518" - }, - { - "name": "Pierson Road", - "lat": "44.01131", - "lon": "-70.96541" - }, - { - "name": "Preble Drive", - "lat": "44.01135", - "lon": "-70.96567" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Auburn", - "lat": "44.09785", - "lon": "-70.23117", - "id": 158855461, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Old Portland Road (Danville)", - "lat": "44.02868", - "lon": "-70.26806", - "id": 29224, - "intersectedStreets": [ - { - "name": "Kittyhawk Avenue (Danville Corner)", - "lat": "44.03223", - "lon": "-70.26858" - }, - { - "name": "Washington Street (Danville Corner)", - "lat": "44.03223", - "lon": "-70.26858" - }, - { - "name": "Oakes Road", - "lat": "44.02998", - "lon": "-70.26808" - }, - { - "name": "Danville Junction Road", - "lat": "44.02532", - "lon": "-70.26813" - }, - { - "name": "Poland Spring Road", - "lat": "44.02479", - "lon": "-70.28010" - }, - { - "name": "Old Hotel Road", - "lat": "44.02184", - "lon": "-70.28546" - }, - { - "name": "Moose Brook Road (Danville)", - "lat": "44.02396", - "lon": "-70.27654" - }, - { - "name": "Turkey Lane (Danville)", - "lat": "44.02396", - "lon": "-70.27654" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Kennebunkport", - "lat": "43.36213", - "lon": "-70.47730", - "id": 158871214, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "43.40855", - "lon": "-70.52176", - "id": 8004, - "buildings": [ - { - "name": "1005", - "lat": "43.40299", - "lon": "-70.52564", - "postcode": "04046" - }, - { - "name": "1005", - "lat": "43.40293", - "lon": "-70.52560", - "postcode": "04046" - }, - { - "name": "1005", - "lat": "43.40305", - "lon": "-70.52568", - "postcode": "04046" - }, - { - "name": "1009", - "lat": "43.40305", - "lon": "-70.52512", - "postcode": "04046" - }, - { - "name": "1024", - "lat": "43.40385", - "lon": "-70.52547", - "postcode": "04046" - }, - { - "name": "1048", - "lat": "43.40452", - "lon": "-70.52517", - "postcode": "04046" - }, - { - "name": "1099", - "lat": "43.40556", - "lon": "-70.52360", - "postcode": "04046" - }, - { - "name": "1120", - "lat": "43.40679", - "lon": "-70.52392", - "postcode": "04046" - }, - { - "name": "1121", - "lat": "43.40659", - "lon": "-70.52296", - "postcode": "04046" - }, - { - "name": "1132", - "lat": "43.40714", - "lon": "-70.52392", - "postcode": "04046" - }, - { - "name": "1140", - "lat": "43.40717", - "lon": "-70.52386", - "postcode": "04046" - }, - { - "name": "1144", - "lat": "43.40757", - "lon": "-70.52349", - "postcode": "04046" - }, - { - "name": "1152", - "lat": "43.40781", - "lon": "-70.52332", - "postcode": "04046" - }, - { - "name": "1181", - "lat": "43.40855", - "lon": "-70.52176", - "postcode": "04046" - }, - { - "name": "1183", - "lat": "43.40907", - "lon": "-70.52208", - "postcode": "04046" - }, - { - "name": "1185", - "lat": "43.40912", - "lon": "-70.52203", - "postcode": "04046" - }, - { - "name": "1189", - "lat": "43.40916", - "lon": "-70.52201", - "postcode": "04046" - }, - { - "name": "1200", - "lat": "43.40941", - "lon": "-70.52268", - "postcode": "04046" - }, - { - "name": "1202", - "lat": "43.40955", - "lon": "-70.52225", - "postcode": "04046" - }, - { - "name": "1205", - "lat": "43.40923", - "lon": "-70.52165", - "postcode": "04046" - }, - { - "name": "1216", - "lat": "43.40980", - "lon": "-70.52240", - "postcode": "04046" - }, - { - "name": "1220", - "lat": "43.40986", - "lon": "-70.52236", - "postcode": "04046" - }, - { - "name": "1222", - "lat": "43.41000", - "lon": "-70.52225", - "postcode": "04046" - }, - { - "name": "1232", - "lat": "43.41011", - "lon": "-70.52218", - "postcode": "04046" - }, - { - "name": "1234", - "lat": "43.41014", - "lon": "-70.52218", - "postcode": "04046" - }, - { - "name": "1236", - "lat": "43.41022", - "lon": "-70.52216", - "postcode": "04046" - }, - { - "name": "1248", - "lat": "43.41088", - "lon": "-70.52178", - "postcode": "04046" - }, - { - "name": "1249", - "lat": "43.41077", - "lon": "-70.52096", - "postcode": "04046" - }, - { - "name": "1260", - "lat": "43.41130", - "lon": "-70.52156", - "postcode": "04046" - }, - { - "name": "1261", - "lat": "43.41106", - "lon": "-70.52083", - "postcode": "04046" - }, - { - "name": "1269", - "lat": "43.41138", - "lon": "-70.52060", - "postcode": "04046" - }, - { - "name": "1272", - "lat": "43.41161", - "lon": "-70.52152", - "postcode": "04046" - }, - { - "name": "1289", - "lat": "43.41206", - "lon": "-70.52027", - "postcode": "04046" - }, - { - "name": "1299", - "lat": "43.41223", - "lon": "-70.51927", - "postcode": "04046" - }, - { - "name": "1341", - "lat": "43.41357", - "lon": "-70.51916", - "postcode": "04046" - }, - { - "name": "1364", - "lat": "43.41467", - "lon": "-70.52000", - "postcode": "04046" - }, - { - "name": "1369", - "lat": "43.41465", - "lon": "-70.51916", - "postcode": "04046" - }, - { - "name": "1370", - "lat": "43.41521", - "lon": "-70.51972", - "postcode": "04046" - }, - { - "name": "1377", - "lat": "43.41453", - "lon": "-70.51817", - "postcode": "04046" - }, - { - "name": "1379", - "lat": "43.41504", - "lon": "-70.51899", - "postcode": "04046" - }, - { - "name": "1389", - "lat": "43.41535", - "lon": "-70.51867", - "postcode": "04046" - }, - { - "name": "1393", - "lat": "43.41521", - "lon": "-70.51811", - "postcode": "04046" - }, - { - "name": "1401", - "lat": "43.41582", - "lon": "-70.51860", - "postcode": "04046" - }, - { - "name": "1405", - "lat": "43.41587", - "lon": "-70.51860", - "postcode": "04046" - }, - { - "name": "1413", - "lat": "43.41593", - "lon": "-70.51836", - "postcode": "04046" - }, - { - "name": "1427", - "lat": "43.41632", - "lon": "-70.51813", - "postcode": "04046" - }, - { - "name": "1429", - "lat": "43.41638", - "lon": "-70.51806", - "postcode": "04046" - }, - { - "name": "1437", - "lat": "43.41668", - "lon": "-70.51783", - "postcode": "04046" - }, - { - "name": "1448", - "lat": "43.41738", - "lon": "-70.51903", - "postcode": "04046" - }, - { - "name": "1449", - "lat": "43.41705", - "lon": "-70.51772", - "postcode": "04046" - }, - { - "name": "1466", - "lat": "43.41777", - "lon": "-70.51811", - "postcode": "04046" - }, - { - "name": "1468", - "lat": "43.41784", - "lon": "-70.51806", - "postcode": "04046" - }, - { - "name": "1476", - "lat": "43.41813", - "lon": "-70.51796", - "postcode": "04046" - }, - { - "name": "1477", - "lat": "43.41797", - "lon": "-70.51733", - "postcode": "04046" - }, - { - "name": "1477", - "lat": "43.41753", - "lon": "-70.51324", - "postcode": "04046" - }, - { - "name": "1479", - "lat": "43.41808", - "lon": "-70.51727", - "postcode": "04046" - }, - { - "name": "1492", - "lat": "43.41889", - "lon": "-70.51761", - "postcode": "04046" - }, - { - "name": "1513", - "lat": "43.41923", - "lon": "-70.51652", - "postcode": "04046" - }, - { - "name": "1516", - "lat": "43.41929", - "lon": "-70.51746", - "postcode": "04046" - }, - { - "name": "1544", - "lat": "43.42049", - "lon": "-70.51744", - "postcode": "04046" - }, - { - "name": "1561", - "lat": "43.42056", - "lon": "-70.51549", - "postcode": "04046" - }, - { - "name": "1601", - "lat": "43.42201", - "lon": "-70.51519", - "postcode": "04046" - }, - { - "name": "1617", - "lat": "43.42268", - "lon": "-70.51485", - "postcode": "04046" - }, - { - "name": "1621", - "lat": "43.42299", - "lon": "-70.51487", - "postcode": "04046" - }, - { - "name": "1632", - "lat": "43.42342", - "lon": "-70.51613", - "postcode": "04046" - }, - { - "name": "1641", - "lat": "43.42316", - "lon": "-70.51478", - "postcode": "04046" - }, - { - "name": "1652", - "lat": "43.42385", - "lon": "-70.51508", - "postcode": "04046" - }, - { - "name": "1654", - "lat": "43.42414", - "lon": "-70.51508", - "postcode": "04046" - }, - { - "name": "1669", - "lat": "43.42388", - "lon": "-70.51379", - "postcode": "04046" - }, - { - "name": "1676", - "lat": "43.42447", - "lon": "-70.51478", - "postcode": "04046" - }, - { - "name": "1680", - "lat": "43.42459", - "lon": "-70.51465", - "postcode": "04046" - }, - { - "name": "1692", - "lat": "43.42491", - "lon": "-70.51412", - "postcode": "04046" - }, - { - "name": "1697", - "lat": "43.42472", - "lon": "-70.51341", - "postcode": "04046" - }, - { - "name": "1712", - "lat": "43.42551", - "lon": "-70.51388", - "postcode": "04046" - }, - { - "name": "1713", - "lat": "43.42523", - "lon": "-70.51291", - "postcode": "04046" - }, - { - "name": "1715", - "lat": "43.42558", - "lon": "-70.51279", - "postcode": "04046" - }, - { - "name": "1716", - "lat": "43.42565", - "lon": "-70.51369", - "postcode": "04046" - }, - { - "name": "1720", - "lat": "43.42603", - "lon": "-70.51382", - "postcode": "04046" - }, - { - "name": "1721", - "lat": "43.42497", - "lon": "-70.51171", - "postcode": "04046" - }, - { - "name": "1736", - "lat": "43.42601", - "lon": "-70.51296", - "postcode": "04046" - }, - { - "name": "1740", - "lat": "43.42642", - "lon": "-70.51304", - "postcode": "04046" - }, - { - "name": "1752", - "lat": "43.42660", - "lon": "-70.51264", - "postcode": "04046" - }, - { - "name": "1760", - "lat": "43.42726", - "lon": "-70.51334", - "postcode": "04046" - }, - { - "name": "1761", - "lat": "43.42665", - "lon": "-70.51206", - "postcode": "04046" - }, - { - "name": "1768", - "lat": "43.42713", - "lon": "-70.51251", - "postcode": "04046" - }, - { - "name": "1781", - "lat": "43.42674", - "lon": "-70.51199", - "postcode": "04046" - }, - { - "name": "1789", - "lat": "43.42681", - "lon": "-70.51193", - "postcode": "04046" - }, - { - "name": "1791", - "lat": "43.42738", - "lon": "-70.51103", - "postcode": "04046" - }, - { - "name": "1796", - "lat": "43.42816", - "lon": "-70.51169", - "postcode": "04046" - }, - { - "name": "1829", - "lat": "43.42852", - "lon": "-70.51008", - "postcode": "04046" - }, - { - "name": "1881", - "lat": "43.42861", - "lon": "-70.50706", - "postcode": "04046" - }, - { - "name": "1903", - "lat": "43.43033", - "lon": "-70.50837", - "postcode": "04046" - }, - { - "name": "1905", - "lat": "43.43066", - "lon": "-70.50858", - "postcode": "04046" - }, - { - "name": "1912", - "lat": "43.43128", - "lon": "-70.50867", - "postcode": "04046" - }, - { - "name": "1916", - "lat": "43.43139", - "lon": "-70.50927", - "postcode": "04046" - }, - { - "name": "1933", - "lat": "43.43167", - "lon": "-70.50766", - "postcode": "04046" - }, - { - "name": "2105", - "lat": "43.43667", - "lon": "-70.50354", - "postcode": "04046" - }, - { - "name": "2204", - "lat": "43.43963", - "lon": "-70.50390", - "postcode": "04046" - }, - { - "name": "2210", - "lat": "43.43997", - "lon": "-70.50371", - "postcode": "04046" - }, - { - "name": "2218", - "lat": "43.44042", - "lon": "-70.50354", - "postcode": "04046" - }, - { - "name": "2224", - "lat": "43.44078", - "lon": "-70.50337", - "postcode": "04046" - }, - { - "name": "2239", - "lat": "43.44049", - "lon": "-70.50219", - "postcode": "04046" - }, - { - "name": "2244", - "lat": "43.44176", - "lon": "-70.50244", - "postcode": "04046" - }, - { - "name": "2256", - "lat": "43.44190", - "lon": "-70.50277", - "postcode": "04046" - }, - { - "name": "2324", - "lat": "43.44427", - "lon": "-70.50234", - "postcode": "04046" - }, - { - "name": "2365", - "lat": "43.44536", - "lon": "-70.50058", - "postcode": "04046" - }, - { - "name": "2397", - "lat": "43.44622", - "lon": "-70.49993", - "postcode": "04046" - }, - { - "name": "2409", - "lat": "43.44666", - "lon": "-70.49953", - "postcode": "04046" - }, - { - "name": "2421", - "lat": "43.44684", - "lon": "-70.49901", - "postcode": "04046" - }, - { - "name": "2461", - "lat": "43.44818", - "lon": "-70.49856", - "postcode": "04046" - }, - { - "name": "2492", - "lat": "43.44937", - "lon": "-70.49886", - "postcode": "04046" - }, - { - "name": "2501", - "lat": "43.44960", - "lon": "-70.49770", - "postcode": "04046" - }, - { - "name": "2564", - "lat": "43.45177", - "lon": "-70.49734", - "postcode": "04046" - }, - { - "name": "2569", - "lat": "43.45155", - "lon": "-70.49650", - "postcode": "04046" - }, - { - "name": "2581", - "lat": "43.45197", - "lon": "-70.49637", - "postcode": "04046" - }, - { - "name": "2625", - "lat": "43.45326", - "lon": "-70.49566", - "postcode": "04046" - }, - { - "name": "2628", - "lat": "43.45359", - "lon": "-70.49609", - "postcode": "04046" - }, - { - "name": "2636", - "lat": "43.45385", - "lon": "-70.49603", - "postcode": "04046" - }, - { - "name": "2640", - "lat": "43.45398", - "lon": "-70.49586", - "postcode": "04046" - }, - { - "name": "2652", - "lat": "43.45441", - "lon": "-70.49558", - "postcode": "04046" - }, - { - "name": "2776", - "lat": "43.45818", - "lon": "-70.49350", - "postcode": "04046" - }, - { - "name": "2796", - "lat": "43.45878", - "lon": "-70.49298", - "postcode": "04046" - }, - { - "name": "2805", - "lat": "43.45910", - "lon": "-70.49217", - "postcode": "04046" - }, - { - "name": "2808", - "lat": "43.45934", - "lon": "-70.49352", - "postcode": "04046" - }, - { - "name": "2812", - "lat": "43.45948", - "lon": "-70.49343", - "postcode": "04046" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Lincoln", - "lat": "45.36224", - "lon": "-68.50472", - "id": 158802992, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Yarmouth", - "lat": "43.80064", - "lon": "-70.18672", - "id": 158803248, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Street", - "lat": "43.79261", - "lon": "-70.18865", - "id": 38293, - "buildings": [ - { - "name": "367", - "lat": "43.78911", - "lon": "-70.19375" - }, - { - "name": "387", - "lat": "43.78854", - "lon": "-70.19425" - }, - { - "name": "397", - "lat": "43.78831", - "lon": "-70.19461" - }, - { - "name": "405", - "lat": "43.78820", - "lon": "-70.19489" - }, - { - "name": "419", - "lat": "43.78767", - "lon": "-70.19517" - }, - { - "name": "515", - "lat": "43.78488", - "lon": "-70.19783" - } - ], - "intersectedStreets": [ - { - "name": "Bennett Road", - "lat": "43.79288", - "lon": "-70.18837" - }, - { - "name": "Beth Condon Memorial Pathway", - "lat": "43.79240", - "lon": "-70.18897" - }, - { - "name": "Rand Road", - "lat": "43.79545", - "lon": "-70.18584" - }, - { - "name": "Mayberry Lane", - "lat": "43.79658", - "lon": "-70.18500" - }, - { - "name": "High Street", - "lat": "43.79743", - "lon": "-70.18427" - }, - { - "name": "Storer Street", - "lat": "43.79836", - "lon": "-70.18330" - }, - { - "name": "Main Street", - "lat": "43.79896", - "lon": "-70.18272" - }, - { - "name": "West Elm Street", - "lat": "43.78440", - "lon": "-70.19789" - }, - { - "name": "Astilbe Lane", - "lat": "43.78440", - "lon": "-70.19789" - }, - { - "name": "Abby Lane", - "lat": "43.78733", - "lon": "-70.19517" - }, - { - "name": "Winding Way", - "lat": "43.78916", - "lon": "-70.19330" - }, - { - "name": "Woods Circle Road", - "lat": "43.79114", - "lon": "-70.19068" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "South Portland", - "lat": "43.64147", - "lon": "-70.24088", - "id": 158897572, - "type": "TOWN", - "listOfStreets": [ - { - "name": "2nd Street", - "lat": "43.64196", - "lon": "-70.24575", - "id": 36487 - }, - { - "name": "3rd Street", - "lat": "43.64114", - "lon": "-70.24409", - "id": 41301 - }, - { - "name": "A Street", - "lat": "43.64108", - "lon": "-70.25441", - "id": 33015 - }, - { - "name": "Beverly Street", - "lat": "43.63808", - "lon": "-70.23969", - "id": 38989 - }, - { - "name": "Broadway", - "lat": "43.64153", - "lon": "-70.24117", - "id": 79939 - }, - { - "name": "Casco Bay Bridge", - "lat": "43.64230", - "lon": "-70.25658", - "id": 77313 - }, - { - "name": "Country Club Drive", - "lat": "43.63999", - "lon": "-70.34329", - "id": 33260 - }, - { - "name": "Crescent Avenue", - "lat": "43.64313", - "lon": "-70.24055", - "id": 40514 - }, - { - "name": "Cummings Road", - "lat": "43.63887", - "lon": "-70.35209", - "id": 38010 - }, - { - "name": "Gorham Road", - "lat": "43.63679", - "lon": "-70.33394", - "id": 39131 - }, - { - "name": "Grand Street", - "lat": "43.64334", - "lon": "-70.23579", - "id": 32680 - }, - { - "name": "Greenbelt Walkway", - "lat": "43.63979", - "lon": "-70.24538", - "id": 78053 - }, - { - "name": "Harriet Street", - "lat": "43.64036", - "lon": "-70.24270", - "id": 39699 - }, - { - "name": "Maine Mall Road", - "lat": "43.63320", - "lon": "-70.33426", - "id": 1405 - }, - { - "name": "Maine Turnpike", - "lat": "43.64052", - "lon": "-70.33561", - "id": 77397 - }, - { - "name": "Maine Turnpike Approach Road", - "lat": "43.62975", - "lon": "-70.33773", - "id": 77736 - }, - { - "name": "Maple Street", - "lat": "43.64382", - "lon": "-70.24047", - "id": 32958 - }, - { - "name": "Margaret Street", - "lat": "43.63893", - "lon": "-70.24418", - "id": 36933 - }, - { - "name": "Marriner Street", - "lat": "43.64033", - "lon": "-70.24145", - "id": 32243 - }, - { - "name": "Ocean Street", - "lat": "43.64097", - "lon": "-70.25501", - "id": 1237 - }, - { - "name": "Philbrook Avenue", - "lat": "43.63225", - "lon": "-70.33900", - "id": 81721 - }, - { - "name": "Pine Street", - "lat": "43.64247", - "lon": "-70.24115", - "id": 37529 - }, - { - "name": "Roosevelt Street", - "lat": "43.64165", - "lon": "-70.24244", - "id": 34675 - }, - { - "name": "Running Hill Road", - "lat": "43.63561", - "lon": "-70.34432", - "id": 1077 - }, - { - "name": "Skyline Road", - "lat": "43.63752", - "lon": "-70.23890", - "id": 32901 - }, - { - "name": "Snowberry Drive", - "lat": "43.60091", - "lon": "-70.28263", - "id": 34511 - }, - { - "name": "Southborough Drive", - "lat": "43.62775", - "lon": "-70.33769", - "id": 78992 - }, - { - "name": "Spring Street", - "lat": "43.64299", - "lon": "-70.23587", - "id": 34042 - }, - { - "name": "Summit Street", - "lat": "43.64233", - "lon": "-70.23557", - "id": 34025 - }, - { - "name": "Summit Terrace", - "lat": "43.64204", - "lon": "-70.23742", - "id": 33650 - }, - { - "name": "Tamarack Drive", - "lat": "43.60411", - "lon": "-70.28375", - "id": 34796 - }, - { - "name": "Virginia Avenue", - "lat": "43.64250", - "lon": "-70.23918", - "id": 33020 - }, - { - "name": "Waterman Drive", - "lat": "43.64168", - "lon": "-70.25553", - "id": 79113 - }, - { - "name": "West Broadway", - "lat": "43.62376", - "lon": "-70.32988", - "id": 85457 - }, - { - "name": "Winding Way", - "lat": "43.60331", - "lon": "-70.28345", - "id": 39295 - }, - { - "name": "6th Street (Meeting House Hill)", - "lat": "43.63561", - "lon": "-70.24235", - "id": 37547 - }, - { - "name": "Acorn Lane (Broadview Park)", - "lat": "43.61301", - "lon": "-70.27124", - "id": 34612 - }, - { - "name": "Adams Street (Ferry Village)", - "lat": "43.64839", - "lon": "-70.23017", - "id": 32750 - }, - { - "name": "Alder Street (Willard Square)", - "lat": "43.64083", - "lon": "-70.23135", - "id": 32289 - }, - { - "name": "Alfred Street (Broadview Park)", - "lat": "43.61835", - "lon": "-70.27634", - "id": 37402 - }, - { - "name": "Allen Road (Stanwood Park)", - "lat": "43.62135", - "lon": "-70.27004", - "id": 32990 - }, - { - "name": "Alpine Street (Knightville)", - "lat": "43.63198", - "lon": "-70.26040", - "id": 34609 - }, - { - "name": "Alton Street (Cash Corner)", - "lat": "43.63320", - "lon": "-70.28793", - "id": 32270 - }, - { - "name": "Anchor Road (Knightville)", - "lat": "43.63344", - "lon": "-70.25360", - "id": 39972 - }, - { - "name": "Appletree Drive (Broadview Park)", - "lat": "43.60900", - "lon": "-70.28306", - "id": 35687 - }, - { - "name": "Arbutus Avenue (Knightville)", - "lat": "43.62960", - "lon": "-70.26092", - "id": 37681 - }, - { - "name": "Armory Street (Knightville)", - "lat": "43.63344", - "lon": "-70.25682", - "id": 33822 - }, - { - "name": "Aspen Avenue (Thornton Heights)", - "lat": "43.62262", - "lon": "-70.30460", - "id": 32593 - }, - { - "name": "Atlantic Avenue (Pleasantdale)", - "lat": "43.63536", - "lon": "-70.26920", - "id": 36615 - }, - { - "name": "B Street (Knightville)", - "lat": "43.64022", - "lon": "-70.25465", - "id": 34291 - }, - { - "name": "Bagley Avenue (Pleasantdale)", - "lat": "43.63269", - "lon": "-70.26349", - "id": 32722 - }, - { - "name": "Ballard Street (Knightville)", - "lat": "43.63777", - "lon": "-70.26973", - "id": 34259 - }, - { - "name": "Balsam Road (Crocketts Corner)", - "lat": "43.62607", - "lon": "-70.31520", - "id": 33491 - }, - { - "name": "Bangor Street (Sunset Park)", - "lat": "43.61734", - "lon": "-70.31025", - "id": 32731 - }, - { - "name": "Bay Road (Loveitts Field)", - "lat": "43.63813", - "lon": "-70.22397", - "id": 38905 - }, - { - "name": "Bayview Avenue (Willard Square)", - "lat": "43.63693", - "lon": "-70.23431", - "id": 33301 - }, - { - "name": "Beach Street (Willard Square)", - "lat": "43.64415", - "lon": "-70.22929", - "id": 34940 - }, - { - "name": "Bellevue Avenue (Willard Square)", - "lat": "43.63805", - "lon": "-70.23594", - "id": 41512 - }, - { - "name": "Bennett Street (Knightville)", - "lat": "43.63093", - "lon": "-70.26158", - "id": 35039 - }, - { - "name": "Berwick Street (Sunset Park)", - "lat": "43.61647", - "lon": "-70.31741", - "id": 34779 - }, - { - "name": "Birch Road (Loveitts Field)", - "lat": "43.63733", - "lon": "-70.22618", - "id": 34201 - }, - { - "name": "Blueberry Road (Willard Square)", - "lat": "43.63309", - "lon": "-70.23339", - "id": 81173 - }, - { - "name": "Bluff Road (Loveitts Field)", - "lat": "43.63760", - "lon": "-70.22409", - "id": 32406 - }, - { - "name": "Boothby Avenue (Meeting House Hill)", - "lat": "43.63069", - "lon": "-70.24772", - "id": 34667 - }, - { - "name": "Bowdoin Avenue (Cash Corner)", - "lat": "43.62679", - "lon": "-70.28257", - "id": 40170 - }, - { - "name": "Boyd Road (Loveitts Field)", - "lat": "43.63572", - "lon": "-70.22815", - "id": 34014 - }, - { - "name": "Breakwater Drive (Ferry Village)", - "lat": "43.64803", - "lon": "-70.23396", - "id": 34219 - }, - { - "name": "Briarwood Road (Crocketts Corner)", - "lat": "43.62568", - "lon": "-70.31538", - "id": 34554 - }, - { - "name": "Brigham Street (Cash Corner)", - "lat": "43.63118", - "lon": "-70.30087", - "id": 36624 - }, - { - "name": "Broadway Street (Knightville)", - "lat": "43.63440", - "lon": "-70.25220", - "id": 33656 - }, - { - "name": "Brookside Avenue (Willard Square)", - "lat": "43.63718", - "lon": "-70.22888", - "id": 37857 - }, - { - "name": "Bryant Street (Stanwood Park)", - "lat": "43.62349", - "lon": "-70.27480", - "id": 34828 - }, - { - "name": "Buchanan Street (Stanwood Park)", - "lat": "43.62070", - "lon": "-70.27240", - "id": 37674 - }, - { - "name": "Burnham Street (Stanwood Park)", - "lat": "43.62932", - "lon": "-70.27439", - "id": 33906 - }, - { - "name": "C Street (Knightville)", - "lat": "43.63923", - "lon": "-70.25538", - "id": 40882 - }, - { - "name": "Carlisle Road (Broadview Park)", - "lat": "43.60864", - "lon": "-70.27793", - "id": 82100 - }, - { - "name": "Carroll Street (Meeting House Hill)", - "lat": "43.63253", - "lon": "-70.24045", - "id": 34430 - }, - { - "name": "Carter Street (Pleasantdale)", - "lat": "43.63078", - "lon": "-70.26555", - "id": 37759 - }, - { - "name": "Cedar Street (Meeting House Hill)", - "lat": "43.63454", - "lon": "-70.23755", - "id": 34396 - }, - { - "name": "Central Avenue (Ligonia)", - "lat": "43.63932", - "lon": "-70.28836", - "id": 37701 - }, - { - "name": "Channel Road (Loveitts Field)", - "lat": "43.63592", - "lon": "-70.22512", - "id": 37785 - }, - { - "name": "Chapel Street (Pleasantdale)", - "lat": "43.63289", - "lon": "-70.26830", - "id": 32758 - }, - { - "name": "Chapman Street (Cash Corner)", - "lat": "43.63112", - "lon": "-70.28287", - "id": 39381 - }, - { - "name": "Charlotte Street (Willard Square)", - "lat": "43.63384", - "lon": "-70.23276", - "id": 38942 - }, - { - "name": "Chase Street (Meeting House Hill)", - "lat": "43.63667", - "lon": "-70.23832", - "id": 32022 - }, - { - "name": "Chestnut Street (Pleasantdale)", - "lat": "43.63393", - "lon": "-70.26948", - "id": 39901 - }, - { - "name": "Church Street (Cash Corner)", - "lat": "43.62955", - "lon": "-70.28300", - "id": 33840 - }, - { - "name": "Churchill Road (Knightville)", - "lat": "43.63351", - "lon": "-70.25302", - "id": 38657 - }, - { - "name": "Clark Road (Ligonia)", - "lat": "43.63370", - "lon": "-70.28106", - "id": 39938 - }, - { - "name": "Clarks Pond Parkway (Crocketts Corner)", - "lat": "43.63129", - "lon": "-70.32495", - "id": 1091 - }, - { - "name": "Cliff Avenue (Loveitts Field)", - "lat": "43.63323", - "lon": "-70.23006", - "id": 33195 - }, - { - "name": "Clifford Street (Knightville)", - "lat": "43.62116", - "lon": "-70.25175", - "id": 33811 - }, - { - "name": "Clinton Street (Willard Square)", - "lat": "43.63429", - "lon": "-70.23452", - "id": 34934 - }, - { - "name": "Cole Street (Pleasantdale)", - "lat": "43.63160", - "lon": "-70.27167", - "id": 38575 - }, - { - "name": "Colonial Avenue (Knightville)", - "lat": "43.63121", - "lon": "-70.25718", - "id": 34115 - }, - { - "name": "Colony Lane (Crocketts Corner)", - "lat": "43.62868", - "lon": "-70.31327", - "id": 40873 - }, - { - "name": "Columbus Avenue (Knightville)", - "lat": "43.63055", - "lon": "-70.25731", - "id": 33851 - }, - { - "name": "Commercial Street (Sunset Park)", - "lat": "43.61292", - "lon": "-70.30486", - "id": 34531 - }, - { - "name": "Concord Street (Sunset Park)", - "lat": "43.61911", - "lon": "-70.31636", - "id": 33331 - }, - { - "name": "Coolidge Avenue (Loveitts Field)", - "lat": "43.63625", - "lon": "-70.22877", - "id": 39985 - }, - { - "name": "Cooper Street (Knightville)", - "lat": "43.63205", - "lon": "-70.25388", - "id": 36680 - }, - { - "name": "Cormier Road (Meeting House Hill)", - "lat": "43.62744", - "lon": "-70.24512", - "id": 35906 - }, - { - "name": "Cornell Street (Thornton Heights)", - "lat": "43.62008", - "lon": "-70.30439", - "id": 36765 - }, - { - "name": "Cottage Road (Meeting House Hill)", - "lat": "43.63789", - "lon": "-70.25032", - "id": 79305 - }, - { - "name": "Cove Lane (Willard Square)", - "lat": "43.64311", - "lon": "-70.22909", - "id": 34067 - }, - { - "name": "Crescent Avenue (Loveitts Field)", - "lat": "43.63379", - "lon": "-70.22491", - "id": 40515 - }, - { - "name": "Crestview (Broadview Park)", - "lat": "43.61268", - "lon": "-70.27770", - "id": 34873 - }, - { - "name": "Cross Street (Cash Corner)", - "lat": "43.63126", - "lon": "-70.30044", - "id": 32332 - }, - { - "name": "Crossing Drive (South Portland Gardens)", - "lat": "43.63811", - "lon": "-70.32119", - "id": 76967 - }, - { - "name": "Cumberland Road (Broadview Park)", - "lat": "43.62306", - "lon": "-70.27538", - "id": 34678 - }, - { - "name": "Curtis Street (Cash Corner)", - "lat": "43.63272", - "lon": "-70.28437", - "id": 34069 - }, - { - "name": "Cushing Court (Ferry Village)", - "lat": "43.65038", - "lon": "-70.23283", - "id": 81245 - }, - { - "name": "D Street (Knightville)", - "lat": "43.63881", - "lon": "-70.25437", - "id": 36790 - }, - { - "name": "Danforth Road (Loveitts Field)", - "lat": "43.63496", - "lon": "-70.22530", - "id": 35125 - }, - { - "name": "Darling Avenue (South Portland Gardens)", - "lat": "43.64103", - "lon": "-70.33005", - "id": 33796 - }, - { - "name": "Dartmouth Street (Cash Corner)", - "lat": "43.62096", - "lon": "-70.29117", - "id": 36811 - }, - { - "name": "Davis Street (Willard Square)", - "lat": "43.63545", - "lon": "-70.23450", - "id": 32605 - }, - { - "name": "Dawson Street (Cash Corner)", - "lat": "43.63201", - "lon": "-70.30003", - "id": 33915 - }, - { - "name": "Day Street (Willard Square)", - "lat": "43.64027", - "lon": "-70.23180", - "id": 34710 - }, - { - "name": "Daytona Street (Cash Corner)", - "lat": "43.62975", - "lon": "-70.29048", - "id": 38052 - }, - { - "name": "Derby Road (Knightville)", - "lat": "43.63194", - "lon": "-70.25268", - "id": 40620 - }, - { - "name": "Dow Road (Stanwood Park)", - "lat": "43.62185", - "lon": "-70.26592", - "id": 35404 - }, - { - "name": "Drew Road (Loveitts Field)", - "lat": "43.63438", - "lon": "-70.22379", - "id": 32632 - }, - { - "name": "Duck Pond Road (Thornton Heights)", - "lat": "43.62002", - "lon": "-70.29139", - "id": 34405 - }, - { - "name": "Dyer Street (Ferry Village)", - "lat": "43.64800", - "lon": "-70.24190", - "id": 37277 - }, - { - "name": "Dyke Farm Road (Crocketts Corner)", - "lat": "43.62438", - "lon": "-70.31261", - "id": 40715 - }, - { - "name": "E Street (Knightville)", - "lat": "43.63777", - "lon": "-70.25761", - "id": 39563 - }, - { - "name": "Edgewood Road (Willard Square)", - "lat": "43.63342", - "lon": "-70.23197", - "id": 39862 - }, - { - "name": "Edwards Street (Meeting House Hill)", - "lat": "43.63267", - "lon": "-70.23819", - "id": 35161 - }, - { - "name": "Edwin Street (Broadview Park)", - "lat": "43.61636", - "lon": "-70.27428", - "id": 33469 - }, - { - "name": "Eliot Street (Sunset Park)", - "lat": "43.61643", - "lon": "-70.31576", - "id": 34849 - }, - { - "name": "Elm Street (Pleasantdale)", - "lat": "43.63406", - "lon": "-70.26913", - "id": 34657 - }, - { - "name": "Elmwood Avenue (Knightville)", - "lat": "43.63182", - "lon": "-70.26010", - "id": 32706 - }, - { - "name": "Emery Street (Meeting House Hill)", - "lat": "43.63575", - "lon": "-70.24699", - "id": 36948 - }, - { - "name": "Evans Street (Stanwood Park)", - "lat": "43.61929", - "lon": "-70.26941", - "id": 40209 - }, - { - "name": "Everett Avenue (Willard Square)", - "lat": "43.63876", - "lon": "-70.23409", - "id": 34743 - }, - { - "name": "Evergreen Road (Crocketts Corner)", - "lat": "43.63149", - "lon": "-70.30939", - "id": 40887 - }, - { - "name": "F Street (Meeting House Hill)", - "lat": "43.63819", - "lon": "-70.25186", - "id": 35458 - }, - { - "name": "Fairlawn Avenue (Meeting House Hill)", - "lat": "43.63463", - "lon": "-70.23645", - "id": 41106 - }, - { - "name": "Fellows Street (Crocketts Corner)", - "lat": "43.63278", - "lon": "-70.30308", - "id": 32339 - }, - { - "name": "Fern Lane (Willard Square)", - "lat": "43.64098", - "lon": "-70.23021", - "id": 36625 - }, - { - "name": "Fernwood Lane (Willard Square)", - "lat": "43.63238", - "lon": "-70.23293", - "id": 81174 - }, - { - "name": "Fessenden Avenue (Knightville)", - "lat": "43.62923", - "lon": "-70.24834", - "id": 38619 - }, - { - "name": "Florence Street (Meeting House Hill)", - "lat": "43.63078", - "lon": "-70.23821", - "id": 38305 - }, - { - "name": "Foden Road (South Portland Gardens)", - "lat": "43.63590", - "lon": "-70.32977", - "id": 33081 - }, - { - "name": "Forest Avenue (Pleasantdale)", - "lat": "43.63472", - "lon": "-70.26911", - "id": 39709 - }, - { - "name": "Fort Road (Ferry Village)", - "lat": "43.65017", - "lon": "-70.22781", - "id": 36993 - }, - { - "name": "Free Street (Ferry Village)", - "lat": "43.64677", - "lon": "-70.24139", - "id": 36420, - "intersectedStreets": [ - { - "name": "Mosher Street", - "lat": "43.64608", - "lon": "-70.24113" - }, - { - "name": "Dyer Street (Ferry Village)", - "lat": "43.64740", - "lon": "-70.24160" - }, - { - "name": "High Street (Ferry Village)", - "lat": "43.64740", - "lon": "-70.24160" - } - ] - }, - { - "name": "Front Street (Ferry Village)", - "lat": "43.64997", - "lon": "-70.24092", - "id": 41568 - }, - { - "name": "Garden Lane (Willard Square)", - "lat": "43.64061", - "lon": "-70.23047", - "id": 31914 - }, - { - "name": "Garfield Street (Stanwood Park)", - "lat": "43.62081", - "lon": "-70.27353", - "id": 32917 - }, - { - "name": "George Street (Broadview Park)", - "lat": "43.62342", - "lon": "-70.27679", - "id": 34279 - }, - { - "name": "Glendale Road (Knightville)", - "lat": "43.62483", - "lon": "-70.25426", - "id": 34863 - }, - { - "name": "Gould Road (Loveitts Field)", - "lat": "43.63927", - "lon": "-70.22500", - "id": 32799 - }, - { - "name": "Graffam Road (Loveitts Field)", - "lat": "43.63994", - "lon": "-70.22418", - "id": 32662 - }, - { - "name": "Grandview Avenue (Thornton Heights)", - "lat": "43.62068", - "lon": "-70.30031", - "id": 33173 - }, - { - "name": "Grant Street (Stanwood Park)", - "lat": "43.61936", - "lon": "-70.27089", - "id": 37821 - }, - { - "name": "Greeley Street (Knightville)", - "lat": "43.62275", - "lon": "-70.25150", - "id": 38369 - }, - { - "name": "Grove Avenue (Knightville)", - "lat": "43.62895", - "lon": "-70.26340", - "id": 37246 - }, - { - "name": "Hall Street (Crocketts Corner)", - "lat": "43.63176", - "lon": "-70.30420", - "id": 37921 - }, - { - "name": "Hamilton Street (Knightville)", - "lat": "43.62800", - "lon": "-70.26139", - "id": 39987 - }, - { - "name": "Hanson Street (Knightville)", - "lat": "43.63389", - "lon": "-70.25596", - "id": 37679 - }, - { - "name": "Harding Street (Ligonia)", - "lat": "43.63472", - "lon": "-70.28909", - "id": 41229 - }, - { - "name": "Haskell Avenue (Cash Corner)", - "lat": "43.63194", - "lon": "-70.29040", - "id": 33386 - }, - { - "name": "Haven Road (Meeting House Hill)", - "lat": "43.63611", - "lon": "-70.24489", - "id": 38631 - }, - { - "name": "Hayes Street (Cash Corner)", - "lat": "43.62382", - "lon": "-70.29231", - "id": 41315 - }, - { - "name": "Heather Road (Meeting House Hill)", - "lat": "43.62714", - "lon": "-70.24594", - "id": 41076 - }, - { - "name": "Hemco Road (Cash Corner)", - "lat": "43.62205", - "lon": "-70.28838", - "id": 35192 - }, - { - "name": "Henry Street (Loveitts Field)", - "lat": "43.63991", - "lon": "-70.22678", - "id": 41559 - }, - { - "name": "Higgins Lane (Stanwood Park)", - "lat": "43.62314", - "lon": "-70.26201", - "id": 38331 - }, - { - "name": "High Street (Ferry Village)", - "lat": "43.64651", - "lon": "-70.24426", - "id": 40285 - }, - { - "name": "Highland Avenue (Stanwood Park)", - "lat": "43.62286", - "lon": "-70.26561", - "id": 33603 - }, - { - "name": "Hill Street (Stanwood Park)", - "lat": "43.62854", - "lon": "-70.27325", - "id": 34935 - }, - { - "name": "Hillcrest Avenue (Broadview Park)", - "lat": "43.61602", - "lon": "-70.27426", - "id": 38938 - }, - { - "name": "Hillside Avenue (Meeting House Hill)", - "lat": "43.63320", - "lon": "-70.24124", - "id": 40151 - }, - { - "name": "Hobart Street (Crocketts Corner)", - "lat": "43.63218", - "lon": "-70.30630", - "id": 35073 - }, - { - "name": "Holden Street (Cash Corner)", - "lat": "43.62617", - "lon": "-70.29233", - "id": 35655 - }, - { - "name": "Homestead Avenue (Meeting House Hill)", - "lat": "43.63511", - "lon": "-70.23738", - "id": 40016 - }, - { - "name": "Hoyt Street (Pleasantdale)", - "lat": "43.63022", - "lon": "-70.26913", - "id": 33963 - }, - { - "name": "Hudson Road (Knightville)", - "lat": "43.63216", - "lon": "-70.25514", - "id": 40578 - }, - { - "name": "Hunnewell Road (Cash Corner)", - "lat": "43.62522", - "lon": "-70.28709", - "id": 1486 - }, - { - "name": "Huntress Avenue (Cash Corner)", - "lat": "43.63162", - "lon": "-70.28810", - "id": 34918 - }, - { - "name": "Hutchinson Street (Ligonia)", - "lat": "43.63357", - "lon": "-70.28467", - "id": 32447 - }, - { - "name": "Industry Road (Sunset Park)", - "lat": "43.60976", - "lon": "-70.30392", - "id": 35167 - }, - { - "name": "Jackson Street (Ligonia)", - "lat": "43.63606", - "lon": "-70.28787", - "id": 32465 - }, - { - "name": "Jefferson Street (Ferry Village)", - "lat": "43.64892", - "lon": "-70.23939", - "id": 33299 - }, - { - "name": "Jessica Lane (Broadview Park)", - "lat": "43.61062", - "lon": "-70.28375", - "id": 39410 - }, - { - "name": "Jetport Access Road (South Portland Gardens)", - "lat": "43.64736", - "lon": "-70.32207", - "id": 41139 - }, - { - "name": "Johnson Road (South Portland Gardens)", - "lat": "43.64766", - "lon": "-70.32853", - "id": 32525 - }, - { - "name": "Jordan Avenue (Meeting House Hill)", - "lat": "43.63233", - "lon": "-70.24725", - "id": 35502 - }, - { - "name": "Kaler Road (Knightville)", - "lat": "43.62480", - "lon": "-70.24727", - "id": 33409 - }, - { - "name": "Kelly Street (Knightville)", - "lat": "43.63039", - "lon": "-70.26403", - "id": 34427 - }, - { - "name": "Kent Road (Meeting House Hill)", - "lat": "43.63325", - "lon": "-70.24143", - "id": 33037 - }, - { - "name": "Lake Street (Cash Corner)", - "lat": "43.62840", - "lon": "-70.27847", - "id": 40997 - }, - { - "name": "Latham Street (Stanwood Park)", - "lat": "43.63064", - "lon": "-70.27340", - "id": 34906 - }, - { - "name": "Laurel Lane (Crocketts Corner)", - "lat": "43.62674", - "lon": "-70.31010", - "id": 35854 - }, - { - "name": "Lawn Avenue (Cash Corner)", - "lat": "43.63201", - "lon": "-70.28368", - "id": 36245 - }, - { - "name": "Ledge (Loveitts Field)", - "lat": "43.63657", - "lon": "-70.22407", - "id": 41352 - }, - { - "name": "Ledge Road (Loveitts Field)", - "lat": "43.63681", - "lon": "-70.22448", - "id": 35902 - }, - { - "name": "Leighton Road (Loveitts Field)", - "lat": "43.63491", - "lon": "-70.22373", - "id": 33129 - }, - { - "name": "Lemont Avenue (Stanwood Park)", - "lat": "43.62766", - "lon": "-70.27628", - "id": 33312 - }, - { - "name": "Liberty Lane (South Portland Gardens)", - "lat": "43.64039", - "lon": "-70.31244", - "id": 86000 - }, - { - "name": "Lincoln Street (Ligonia)", - "lat": "43.63721", - "lon": "-70.28842", - "id": 40089 - }, - { - "name": "Lombard Street (Stanwood Park)", - "lat": "43.62916", - "lon": "-70.27602", - "id": 36000 - }, - { - "name": "Lowell Street (Willard Square)", - "lat": "43.63948", - "lon": "-70.23375", - "id": 32167 - }, - { - "name": "Lydia Lane (South Portland Gardens)", - "lat": "43.63750", - "lon": "-70.30493", - "id": 76980 - }, - { - "name": "Madison Street (Ferry Village)", - "lat": "43.65112", - "lon": "-70.23364", - "id": 35060 - }, - { - "name": "Main St (Ligonia)", - "lat": "43.63513", - "lon": "-70.28791", - "id": 313 - }, - { - "name": "Main Street (Thornton Heights)", - "lat": "43.62158", - "lon": "-70.30411", - "id": 1414 - }, - { - "name": "Maplewood Avenue (Knightville)", - "lat": "43.62913", - "lon": "-70.25763", - "id": 32644 - }, - { - "name": "Marina Drive (Ferry Village)", - "lat": "43.64870", - "lon": "-70.23169", - "id": 37452 - }, - { - "name": "Market Street (Knightville)", - "lat": "43.63586", - "lon": "-70.25435", - "id": 32566 - }, - { - "name": "Marsh Road (Meeting House Hill)", - "lat": "43.62901", - "lon": "-70.24308", - "id": 34442 - }, - { - "name": "Massachusetts Avenue (Sunset Park)", - "lat": "43.61843", - "lon": "-70.31392", - "id": 39961 - }, - { - "name": "Mast Lane (Meeting House Hill)", - "lat": "43.63688", - "lon": "-70.24414", - "id": 33786 - }, - { - "name": "McKinley Street (Stanwood Park)", - "lat": "43.62169", - "lon": "-70.27358", - "id": 31911 - }, - { - "name": "Meadow Way (Crocketts Corner)", - "lat": "43.62517", - "lon": "-70.31220", - "id": 33333 - }, - { - "name": "Mechanic Street (Knightville)", - "lat": "43.63766", - "lon": "-70.26858", - "id": 33696 - }, - { - "name": "Memory Lane (Thornton Heights)", - "lat": "43.61897", - "lon": "-70.30437", - "id": 37917 - }, - { - "name": "Monroe Street (Ferry Village)", - "lat": "43.64921", - "lon": "-70.24055", - "id": 33067 - }, - { - "name": "Morse Street (Pleasantdale)", - "lat": "43.63207", - "lon": "-70.26396", - "id": 32279 - }, - { - "name": "Mount Vernon Street (Knightville)", - "lat": "43.63019", - "lon": "-70.25087", - "id": 39284 - }, - { - "name": "Mountain View Road (Stanwood Park)", - "lat": "43.62130", - "lon": "-70.26935", - "id": 39027 - }, - { - "name": "Myrtle Avenue (Willard Square)", - "lat": "43.64396", - "lon": "-70.22931", - "id": 37449 - }, - { - "name": "Myrtle Lane (Willard Square)", - "lat": "43.64345", - "lon": "-70.22875", - "id": 40678 - }, - { - "name": "Nelson Road (Stanwood Park)", - "lat": "43.62283", - "lon": "-70.26883", - "id": 35212 - }, - { - "name": "Norman Street (Knightville)", - "lat": "43.62377", - "lon": "-70.24735", - "id": 35769 - }, - { - "name": "Northeast Lane (Broadview Park)", - "lat": "43.61995", - "lon": "-70.27488", - "id": 36781 - }, - { - "name": "Noyes Street (Sunset Park)", - "lat": "43.61702", - "lon": "-70.30825", - "id": 37497 - }, - { - "name": "Oak Street (Ferry Village)", - "lat": "43.64508", - "lon": "-70.24448", - "id": 34211 - }, - { - "name": "Oakwood Drive (Crocketts Corner)", - "lat": "43.62794", - "lon": "-70.30484", - "id": 37504 - }, - { - "name": "Ocean View Avenue (Willard Square)", - "lat": "43.63772", - "lon": "-70.23381", - "id": 36319 - }, - { - "name": "Old Farm Lane (Meeting House Hill)", - "lat": "43.62906", - "lon": "-70.23510", - "id": 81408 - }, - { - "name": "Old Farm Road (Broadview Park)", - "lat": "43.60648", - "lon": "-70.28282", - "id": 37569 - }, - { - "name": "Orchard Street (Meeting House Hill)", - "lat": "43.63359", - "lon": "-70.23517", - "id": 38248 - }, - { - "name": "Orlando Street (Cash Corner)", - "lat": "43.62920", - "lon": "-70.28975", - "id": 36616 - }, - { - "name": "Palmer Street (Knightville)", - "lat": "43.63721", - "lon": "-70.26937", - "id": 33800 - }, - { - "name": "Pamela Drive (Broadview Park)", - "lat": "43.61756", - "lon": "-70.27499", - "id": 40849 - }, - { - "name": "Park Avenue (Cash Corner)", - "lat": "43.62641", - "lon": "-70.28282", - "id": 36772 - }, - { - "name": "Pearl Street (Pleasantdale)", - "lat": "43.63392", - "lon": "-70.26748", - "id": 38425 - }, - { - "name": "Pennsylvania Avenue (Sunset Park)", - "lat": "43.61692", - "lon": "-70.31301", - "id": 38600 - }, - { - "name": "Phillips Road (Willard Square)", - "lat": "43.63384", - "lon": "-70.23276", - "id": 32307 - }, - { - "name": "Pierce Street (Ferry Village)", - "lat": "43.64517", - "lon": "-70.24085", - "id": 36560 - }, - { - "name": "Pilgrim Road (Stanwood Park)", - "lat": "43.62104", - "lon": "-70.26205", - "id": 32726 - }, - { - "name": "Pitt Street (Meeting House Hill)", - "lat": "43.63193", - "lon": "-70.24341", - "id": 33097 - }, - { - "name": "Pleasant Avenue (Cash Corner)", - "lat": "43.62370", - "lon": "-70.29053", - "id": 41365 - }, - { - "name": "Plymouth Road (Knightville)", - "lat": "43.63193", - "lon": "-70.25364", - "id": 41186 - }, - { - "name": "Pond Road (Loveitts Field)", - "lat": "43.63800", - "lon": "-70.22577", - "id": 41409 - }, - { - "name": "Powers Road (South Portland Gardens)", - "lat": "43.64055", - "lon": "-70.31623", - "id": 34813 - }, - { - "name": "Preble Street (Ferry Village)", - "lat": "43.64844", - "lon": "-70.23770", - "id": 33824 - }, - { - "name": "Pride Road (Crocketts Corner)", - "lat": "43.63090", - "lon": "-70.30827", - "id": 38768 - }, - { - "name": "Providence Avenue (Meeting House Hill)", - "lat": "43.63137", - "lon": "-70.24570", - "id": 37182 - }, - { - "name": "Randall Street (Ferry Village)", - "lat": "43.64668", - "lon": "-70.24227", - "id": 38831 - }, - { - "name": "Red Oak Drive (South Portland Gardens)", - "lat": "43.63741", - "lon": "-70.30475", - "id": 76981 - }, - { - "name": "Reynolds Street (Pleasantdale)", - "lat": "43.63083", - "lon": "-70.27122", - "id": 34515 - }, - { - "name": "Rhode Island Avenue (Sunset Park)", - "lat": "43.61714", - "lon": "-70.31053", - "id": 36805 - }, - { - "name": "Richards Street (Knightville)", - "lat": "43.62008", - "lon": "-70.25411", - "id": 33523 - }, - { - "name": "Ridgeland Avenue (Cash Corner)", - "lat": "43.63277", - "lon": "-70.28568", - "id": 32607 - }, - { - "name": "Rigby Road (Cash Corner)", - "lat": "43.62662", - "lon": "-70.29508", - "id": 39867 - }, - { - "name": "Roberts Street (Broadview Park)", - "lat": "43.61696", - "lon": "-70.27370", - "id": 33558 - }, - { - "name": "Robinson Street (Pleasantdale)", - "lat": "43.63154", - "lon": "-70.26886", - "id": 39761 - }, - { - "name": "Rosedale Avenue (Cash Corner)", - "lat": "43.62461", - "lon": "-70.28411", - "id": 39215 - }, - { - "name": "Rosewood Drive (Meeting House Hill)", - "lat": "43.63022", - "lon": "-70.23394", - "id": 33882 - }, - { - "name": "Rumery Street (Cash Corner)", - "lat": "43.62522", - "lon": "-70.29353", - "id": 32273 - }, - { - "name": "Sawyer Street (Knightville)", - "lat": "43.62427", - "lon": "-70.25169", - "id": 61 - }, - { - "name": "Scarborough Connector (Crocketts Corner)", - "lat": "43.63047", - "lon": "-70.31589", - "id": 31956 - }, - { - "name": "School Street (Ferry Village)", - "lat": "43.64676", - "lon": "-70.23974", - "id": 37647 - }, - { - "name": "Schooner Road (Meeting House Hill)", - "lat": "43.62623", - "lon": "-70.24463", - "id": 34751 - }, - { - "name": "Scott Road (Cash Corner)", - "lat": "43.62736", - "lon": "-70.29986", - "id": 37389 - }, - { - "name": "Settler Road (Sunset Park)", - "lat": "43.62339", - "lon": "-70.31441", - "id": 41434 - }, - { - "name": "Slocum Drive (Ferry Village)", - "lat": "43.64836", - "lon": "-70.22963", - "id": 33053 - }, - { - "name": "Smith Street (Willard Square)", - "lat": "43.64213", - "lon": "-70.23246", - "id": 34072 - }, - { - "name": "Somerset Street (Meeting House Hill)", - "lat": "43.63081", - "lon": "-70.23982", - "id": 37959 - }, - { - "name": "Spear Avenue (Knightville)", - "lat": "43.62334", - "lon": "-70.24813", - "id": 40845 - }, - { - "name": "Stanley Road (Knightville)", - "lat": "43.62898", - "lon": "-70.25242", - "id": 36923 - }, - { - "name": "Sterling Street (Meeting House Hill)", - "lat": "43.63182", - "lon": "-70.23785", - "id": 40142 - }, - { - "name": "Stillman Street (Stanwood Park)", - "lat": "43.62249", - "lon": "-70.25911", - "id": 35751 - }, - { - "name": "Stone Road (Willard Square)", - "lat": "43.63348", - "lon": "-70.23083", - "id": 32540 - }, - { - "name": "Sunset Avenue (Thornton Heights)", - "lat": "43.62124", - "lon": "-70.29922", - "id": 36018 - }, - { - "name": "Sylvan Road (Knightville)", - "lat": "43.62137", - "lon": "-70.25613", - "id": 34132 - }, - { - "name": "Taylor Street (Meeting House Hill)", - "lat": "43.63710", - "lon": "-70.23967", - "id": 37012 - }, - { - "name": "Thomas Street (Knightville)", - "lat": "43.63682", - "lon": "-70.25227", - "id": 1223 - }, - { - "name": "Thompson Street (Willard Square)", - "lat": "43.64050", - "lon": "-70.23392", - "id": 40869 - }, - { - "name": "Thornton Avenue (Thornton Heights)", - "lat": "43.62022", - "lon": "-70.30336", - "id": 33552 - }, - { - "name": "Tremont Street (Thornton Heights)", - "lat": "43.62261", - "lon": "-70.29967", - "id": 39958 - }, - { - "name": "Union Street (Thornton Heights)", - "lat": "43.62331", - "lon": "-70.29945", - "id": 36739 - }, - { - "name": "Valley Street (Pleasantdale)", - "lat": "43.63002", - "lon": "-70.26735", - "id": 32691 - }, - { - "name": "Vermont Avenue (Sunset Park)", - "lat": "43.61921", - "lon": "-70.31477", - "id": 40885 - }, - { - "name": "Victory Avenue (Willard Square)", - "lat": "43.63480", - "lon": "-70.23060", - "id": 33846 - }, - { - "name": "Villa Road (Thornton Heights)", - "lat": "43.62450", - "lon": "-70.30896", - "id": 41519 - }, - { - "name": "Vista Drive (Broadview Park)", - "lat": "43.61226", - "lon": "-70.27656", - "id": 34198 - }, - { - "name": "Vivian Street (Meeting House Hill)", - "lat": "43.63210", - "lon": "-70.24167", - "id": 41072 - }, - { - "name": "Vocational Drive (Willard Square)", - "lat": "43.64676", - "lon": "-70.22794", - "id": 36763 - }, - { - "name": "Walker Street (Meeting House Hill)", - "lat": "43.63249", - "lon": "-70.24804", - "id": 40999 - }, - { - "name": "Wallace Avenue (Sunset Park)", - "lat": "43.61490", - "lon": "-70.30720", - "id": 38674 - }, - { - "name": "Walnut Street (Meeting House Hill)", - "lat": "43.63418", - "lon": "-70.24476", - "id": 38534 - }, - { - "name": "Warren Avenue (Loveitts Field)", - "lat": "43.63354", - "lon": "-70.22866", - "id": 40693 - }, - { - "name": "Washington Avenue (Stanwood Park)", - "lat": "43.62047", - "lon": "-70.27115", - "id": 39136 - }, - { - "name": "Wescott Road (Thornton Heights)", - "lat": "43.62733", - "lon": "-70.30426", - "id": 33922 - }, - { - "name": "Westbrook Street (Thornton Heights)", - "lat": "43.62061", - "lon": "-70.30645", - "id": 32553 - }, - { - "name": "Western Avenue (South Portland Gardens)", - "lat": "43.64654", - "lon": "-70.33052", - "id": 33304 - }, - { - "name": "Whispering Pines Drive (Stanwood Park)", - "lat": "43.61711", - "lon": "-70.26999", - "id": 41302 - }, - { - "name": "Willard Street (Willard Square)", - "lat": "43.64022", - "lon": "-70.22746", - "id": 35102 - }, - { - "name": "Willow Street (Willard Square)", - "lat": "43.64064", - "lon": "-70.22856", - "id": 40719 - }, - { - "name": "Wilson Street (Thornton Heights)", - "lat": "43.62213", - "lon": "-70.30042", - "id": 34548 - }, - { - "name": "Winterberry Street (Broadview Park)", - "lat": "43.61579", - "lon": "-70.27482", - "id": 33109 - }, - { - "name": "Woodbury Street (Loveitts Field)", - "lat": "43.63471", - "lon": "-70.22721", - "id": 39202 - }, - { - "name": "Woodland Road (Loveitts Field)", - "lat": "43.63053", - "lon": "-70.23158", - "id": 34126 - }, - { - "name": "", - "lat": "43.63799", - "lon": "-70.25624", - "id": 1222 - }, - { - "name": "Acton Street", - "lat": "43.62850", - "lon": "-70.29089", - "id": 40277 - }, - { - "name": "Adam Court", - "lat": "43.62127", - "lon": "-70.30776", - "id": 38585 - }, - { - "name": "Adelbert Street", - "lat": "43.62152", - "lon": "-70.25426", - "id": 34901 - }, - { - "name": "Albany Street", - "lat": "43.61638", - "lon": "-70.31312", - "id": 37019 - }, - { - "name": "Anchorage Place", - "lat": "43.64167", - "lon": "-70.25394", - "id": 35088 - }, - { - "name": "Angell Avenue", - "lat": "43.63653", - "lon": "-70.23030", - "id": 32160 - }, - { - "name": "Anthem", - "lat": "43.63432", - "lon": "-70.35293", - "id": 33432 - }, - { - "name": "Anthem Way", - "lat": "43.63486", - "lon": "-70.35125", - "id": 40107 - }, - { - "name": "Anthoine Street", - "lat": "43.63095", - "lon": "-70.25810", - "id": 38709 - }, - { - "name": "Applewood Circle", - "lat": "43.62424", - "lon": "-70.25366", - "id": 32454 - }, - { - "name": "Ardsley Avenue", - "lat": "43.62404", - "lon": "-70.30117", - "id": 34921 - }, - { - "name": "Arlington Road", - "lat": "43.63156", - "lon": "-70.23922", - "id": 37553 - }, - { - "name": "Ashbourne Court", - "lat": "43.61781", - "lon": "-70.26817", - "id": 38167 - }, - { - "name": "Ashley Road", - "lat": "43.62377", - "lon": "-70.30907", - "id": 32347 - }, - { - "name": "Augusta Street", - "lat": "43.61828", - "lon": "-70.31241", - "id": 35351 - }, - { - "name": "Baird Circle", - "lat": "43.62495", - "lon": "-70.31409", - "id": 34732 - }, - { - "name": "Baltimore Avenue", - "lat": "43.62901", - "lon": "-70.25978", - "id": 33135 - }, - { - "name": "Baltimore West", - "lat": "43.62874", - "lon": "-70.26250", - "id": 32344 - }, - { - "name": "Barberry Creek Road", - "lat": "43.63114", - "lon": "-70.27257", - "id": 34739 - }, - { - "name": "Barnstable Road", - "lat": "43.60524", - "lon": "-70.28139", - "id": 38958 - }, - { - "name": "Barstow Street", - "lat": "43.63873", - "lon": "-70.23974", - "id": 32954 - }, - { - "name": "Bayberry Way", - "lat": "43.62635", - "lon": "-70.26244", - "id": 35024 - }, - { - "name": "Beaufort Street", - "lat": "43.62874", - "lon": "-70.24688", - "id": 40270 - }, - { - "name": "Bellaire Road", - "lat": "43.62777", - "lon": "-70.24935", - "id": 39675 - }, - { - "name": "Benjamin W Pickett Street", - "lat": "43.64710", - "lon": "-70.23171", - "id": 34209 - }, - { - "name": "Billy Vachon Street", - "lat": "43.63549", - "lon": "-70.28948", - "id": 34671 - }, - { - "name": "Bishop Avenue", - "lat": "43.63252", - "lon": "-70.28984", - "id": 33420 - }, - { - "name": "Blue Star Memorial Highway", - "lat": "43.64033", - "lon": "-70.29194", - "id": 36758 - }, - { - "name": "Blueberry", - "lat": "43.59906", - "lon": "-70.28143", - "id": 32382 - }, - { - "name": "Bodge Street", - "lat": "43.63382", - "lon": "-70.28561", - "id": 37514 - }, - { - "name": "Bonnybank Terrace", - "lat": "43.62398", - "lon": "-70.27868", - "id": 34992 - }, - { - "name": "Bonnybriar Road", - "lat": "43.62450", - "lon": "-70.27928", - "id": 40238 - }, - { - "name": "Boston Street", - "lat": "43.61708", - "lon": "-70.31572", - "id": 40751 - }, - { - "name": "Bowers Street", - "lat": "43.63808", - "lon": "-70.23688", - "id": 33410 - }, - { - "name": "Boysenberry Drive", - "lat": "43.60198", - "lon": "-70.27993", - "id": 38907 - }, - { - "name": "Braeburn Avenue", - "lat": "43.62262", - "lon": "-70.30460", - "id": 37238 - }, - { - "name": "Brennan Street", - "lat": "43.62697", - "lon": "-70.28978", - "id": 36424 - }, - { - "name": "Brenton Street", - "lat": "43.63103", - "lon": "-70.25083", - "id": 32145 - }, - { - "name": "Brickhill Avenue", - "lat": "43.63741", - "lon": "-70.31233", - "id": 76978 - }, - { - "name": "Brindle Circle", - "lat": "43.60600", - "lon": "-70.28124", - "id": 39283 - }, - { - "name": "Buchanan Circle", - "lat": "43.62029", - "lon": "-70.27229", - "id": 32396 - }, - { - "name": "Bud Avenue", - "lat": "43.61487", - "lon": "-70.30950", - "id": 35949 - }, - { - "name": "Bulkley Road", - "lat": "43.63830", - "lon": "-70.31977", - "id": 36262 - }, - { - "name": "Burwell Avenue", - "lat": "43.62283", - "lon": "-70.30986", - "id": 41304 - }, - { - "name": "Buttonwood Street", - "lat": "43.63334", - "lon": "-70.26287", - "id": 41313 - }, - { - "name": "Calais Street", - "lat": "43.62649", - "lon": "-70.28900", - "id": 32730 - }, - { - "name": "Candlebrook Lane", - "lat": "43.61121", - "lon": "-70.27396", - "id": 38176 - }, - { - "name": "Cannon Road", - "lat": "43.63941", - "lon": "-70.31312", - "id": 33133 - }, - { - "name": "Carigan Avenue", - "lat": "43.62019", - "lon": "-70.30214", - "id": 33551 - }, - { - "name": "Carver Boulevard", - "lat": "43.63556", - "lon": "-70.28591", - "id": 33820 - }, - { - "name": "Cash Street", - "lat": "43.62662", - "lon": "-70.29010", - "id": 35074 - }, - { - "name": "Castle Street", - "lat": "43.63941", - "lon": "-70.24040", - "id": 40280 - }, - { - "name": "Chambers Avenue", - "lat": "43.62511", - "lon": "-70.28276", - "id": 34285 - }, - { - "name": "Checkerberry Circle", - "lat": "43.60241", - "lon": "-70.28068", - "id": 32357 - }, - { - "name": "Checkerberry Drive", - "lat": "43.60243", - "lon": "-70.28145", - "id": 36927 - }, - { - "name": "Christopher Toppi Drive", - "lat": "43.63087", - "lon": "-70.32900", - "id": 31988 - }, - { - "name": "City Service Road", - "lat": "43.60725", - "lon": "-70.28036", - "id": 82848 - }, - { - "name": "Clarks Pond Trail", - "lat": "43.62985", - "lon": "-70.32175", - "id": 77433 - }, - { - "name": "Clemons Street", - "lat": "43.63679", - "lon": "-70.24439", - "id": 34087 - }, - { - "name": "Cleveland Circle", - "lat": "43.61887", - "lon": "-70.27390", - "id": 34784 - }, - { - "name": "Cloyster Road", - "lat": "43.63710", - "lon": "-70.22358", - "id": 35608 - }, - { - "name": "Coach Road", - "lat": "43.62674", - "lon": "-70.31010", - "id": 35416 - }, - { - "name": "Cobb Street", - "lat": "43.63864", - "lon": "-70.24165", - "id": 32033 - }, - { - "name": "Colchester Drive", - "lat": "43.60944", - "lon": "-70.27864", - "id": 31935 - }, - { - "name": "Colin Kelly Road", - "lat": "43.63775", - "lon": "-70.31389", - "id": 35885 - }, - { - "name": "Cox Street", - "lat": "43.63395", - "lon": "-70.28960", - "id": 38394 - }, - { - "name": "Craggmere Avenue", - "lat": "43.63614", - "lon": "-70.23300", - "id": 32294 - }, - { - "name": "Crossmeadow Road", - "lat": "43.60238", - "lon": "-70.28559", - "id": 35579 - }, - { - "name": "Daniel P Tuell Street", - "lat": "43.62224", - "lon": "-70.30726", - "id": 38098 - }, - { - "name": "Deake Street", - "lat": "43.64094", - "lon": "-70.22517", - "id": 35396 - }, - { - "name": "Delaware Avenue", - "lat": "43.61935", - "lon": "-70.31460", - "id": 35113 - }, - { - "name": "Devereaux Circle", - "lat": "43.63819", - "lon": "-70.31456", - "id": 35631 - }, - { - "name": "Dimar Drive", - "lat": "43.61919", - "lon": "-70.26894", - "id": 37677 - }, - { - "name": "Donald B Dean Drive", - "lat": "43.63111", - "lon": "-70.32737", - "id": 40861 - }, - { - "name": "Dracut Avenue", - "lat": "43.62671", - "lon": "-70.28433", - "id": 35606 - }, - { - "name": "Dresser Street", - "lat": "43.61590", - "lon": "-70.27604", - "id": 40740 - }, - { - "name": "Dunscombe Street", - "lat": "43.62904", - "lon": "-70.27235", - "id": 39386 - }, - { - "name": "Edmund S Muskie Street", - "lat": "43.64836", - "lon": "-70.23886", - "id": 40979 - }, - { - "name": "Elderberry Drive", - "lat": "43.60083", - "lon": "-70.28574", - "id": 33735 - }, - { - "name": "Elizabeth Taylor Lane", - "lat": "43.62676", - "lon": "-70.27866", - "id": 40813 - }, - { - "name": "Elsmere Avenue", - "lat": "43.63659", - "lon": "-70.23163", - "id": 40762 - }, - { - "name": "Elsmere Circle", - "lat": "43.63578", - "lon": "-70.23274", - "id": 34243 - }, - { - "name": "Exton Avenue", - "lat": "43.62570", - "lon": "-70.29954", - "id": 37697 - }, - { - "name": "Fickett Street", - "lat": "43.61332", - "lon": "-70.27068", - "id": 36953 - }, - { - "name": "Fillmore Avenue", - "lat": "43.62388", - "lon": "-70.30866", - "id": 33255 - }, - { - "name": "Fishermans Lane", - "lat": "43.64143", - "lon": "-70.22718", - "id": 38679 - }, - { - "name": "Fore River Drive", - "lat": "43.63479", - "lon": "-70.30141", - "id": 41149 - }, - { - "name": "Franklin Fisherman Terrace Lane", - "lat": "43.64184", - "lon": "-70.22770", - "id": 36292 - }, - { - "name": "Franklin Terrace", - "lat": "43.64187", - "lon": "-70.22862", - "id": 36291 - }, - { - "name": "Frederick Road", - "lat": "43.63684", - "lon": "-70.22656", - "id": 41161 - }, - { - "name": "Froswick Avenue", - "lat": "43.62463", - "lon": "-70.30340", - "id": 38753 - }, - { - "name": "Gannett Drive", - "lat": "43.63729", - "lon": "-70.35711", - "id": 33584 - }, - { - "name": "Garfield Circle", - "lat": "43.62054", - "lon": "-70.27366", - "id": 38685 - }, - { - "name": "Gary L Maietta Way", - "lat": "43.60735", - "lon": "-70.29124", - "id": 35418 - }, - { - "name": "Gately Street", - "lat": "43.63517", - "lon": "-70.28842", - "id": 32322 - }, - { - "name": "Gerry Avenue", - "lat": "43.62085", - "lon": "-70.30076", - "id": 40906 - }, - { - "name": "Glen Way", - "lat": "43.63103", - "lon": "-70.30967", - "id": 32833 - }, - { - "name": "Gooseberry Circle", - "lat": "43.60080", - "lon": "-70.28321", - "id": 32120 - }, - { - "name": "Gooseberry Drive", - "lat": "43.60050", - "lon": "-70.28362", - "id": 40242 - }, - { - "name": "Goudy Street", - "lat": "43.63375", - "lon": "-70.23396", - "id": 33572 - }, - { - "name": "Granby Road", - "lat": "43.62601", - "lon": "-70.31035", - "id": 38120 - }, - { - "name": "Greenbriar Way", - "lat": "43.62570", - "lon": "-70.26188", - "id": 32311 - }, - { - "name": "Harbor Place", - "lat": "43.64162", - "lon": "-70.25489", - "id": 39451 - }, - { - "name": "Harborview Avenue", - "lat": "43.63123", - "lon": "-70.25924", - "id": 32388 - }, - { - "name": "Hardwood Court", - "lat": "43.62679", - "lon": "-70.26072", - "id": 38868 - }, - { - "name": "Hartford Court", - "lat": "43.64806", - "lon": "-70.24143", - "id": 39374 - }, - { - "name": "Henley Street", - "lat": "43.64524", - "lon": "-70.23768", - "id": 34322 - }, - { - "name": "Hereford Avenue", - "lat": "43.62564", - "lon": "-70.29943", - "id": 34807 - }, - { - "name": "Hinckley Drive", - "lat": "43.63648", - "lon": "-70.25117", - "id": 39376 - }, - { - "name": "Hinckley Park Entrance", - "lat": "43.62840", - "lon": "-70.25630", - "id": 40939 - }, - { - "name": "Jamestown Court", - "lat": "43.62862", - "lon": "-70.29711", - "id": 39857 - }, - { - "name": "Jennie Court", - "lat": "43.62478", - "lon": "-70.27411", - "id": 38182 - }, - { - "name": "Jet Port Plaza", - "lat": "43.64446", - "lon": "-70.32930", - "id": 33685 - }, - { - "name": "John Roberts Road", - "lat": "43.62997", - "lon": "-70.32919", - "id": 34587 - }, - { - "name": "Julia Street", - "lat": "43.62306", - "lon": "-70.26443", - "id": 34776 - }, - { - "name": "Juniper", - "lat": "43.61358", - "lon": "-70.27703", - "id": 34676 - }, - { - "name": "Kahill Court", - "lat": "43.62067", - "lon": "-70.27765", - "id": 33509 - }, - { - "name": "Karynel Drive", - "lat": "43.62163", - "lon": "-70.26439", - "id": 33045 - }, - { - "name": "Katana Drive", - "lat": "43.62705", - "lon": "-70.29257", - "id": 33372 - }, - { - "name": "Kenneth Road", - "lat": "43.62882", - "lon": "-70.29840", - "id": 34967 - }, - { - "name": "Keswick Road", - "lat": "43.62430", - "lon": "-70.30557", - "id": 37911 - }, - { - "name": "Kincaid Street", - "lat": "43.64431", - "lon": "-70.23918", - "id": 34566 - }, - { - "name": "Kingston Street", - "lat": "43.62618", - "lon": "-70.28606", - "id": 36489 - }, - { - "name": "Kirkland Avenue", - "lat": "43.62555", - "lon": "-70.30061", - "id": 41000 - }, - { - "name": "Kittridge Road", - "lat": "43.64170", - "lon": "-70.23484", - "id": 41166 - }, - { - "name": "Lahave Street", - "lat": "43.63710", - "lon": "-70.23257", - "id": 38136 - }, - { - "name": "Landry Circle", - "lat": "43.62143", - "lon": "-70.30877", - "id": 32910 - }, - { - "name": "Larchwood Road", - "lat": "43.62570", - "lon": "-70.25132", - "id": 33890 - }, - { - "name": "Lawrence Lano Street", - "lat": "43.63079", - "lon": "-70.24720", - "id": 40535 - }, - { - "name": "Ledgefield Circle", - "lat": "43.62036", - "lon": "-70.27755", - "id": 35303 - }, - { - "name": "Lee Avenue", - "lat": "43.62924", - "lon": "-70.28257", - "id": 36031 - }, - { - "name": "Linton Street", - "lat": "43.63255", - "lon": "-70.30548", - "id": 37630 - }, - { - "name": "Linwood Street", - "lat": "43.63107", - "lon": "-70.23650", - "id": 40140 - }, - { - "name": "Long Creek Drive", - "lat": "43.63555", - "lon": "-70.32271", - "id": 37280 - }, - { - "name": "Loveitt Street", - "lat": "43.63968", - "lon": "-70.22781", - "id": 32933 - }, - { - "name": "Loveitts Field Road", - "lat": "43.63708", - "lon": "-70.22538", - "id": 40020 - }, - { - "name": "Lubec Street", - "lat": "43.62592", - "lon": "-70.29076", - "id": 32370 - }, - { - "name": "Mac Arthur Circle East", - "lat": "43.63612", - "lon": "-70.31653", - "id": 41253 - }, - { - "name": "Mac Arthur Circle North", - "lat": "43.63847", - "lon": "-70.31851", - "id": 41326 - }, - { - "name": "Macarthur Circle West", - "lat": "43.63514", - "lon": "-70.31595", - "id": 37796 - }, - { - "name": "Maine Mall Rd", - "lat": "43.63606", - "lon": "-70.33574", - "id": 76961 - }, - { - "name": "Marcelle Avenue", - "lat": "43.62433", - "lon": "-70.30935", - "id": 36453 - }, - { - "name": "Mardale Avenue", - "lat": "43.62617", - "lon": "-70.29875", - "id": 40008 - }, - { - "name": "Marina", - "lat": "43.64763", - "lon": "-70.23257", - "id": 33428 - }, - { - "name": "Mayberry Street", - "lat": "43.62954", - "lon": "-70.25068", - "id": 41278 - }, - { - "name": "Mc Lean Street", - "lat": "43.62152", - "lon": "-70.30291", - "id": 38109 - }, - { - "name": "Mildred Street", - "lat": "43.63283", - "lon": "-70.26682", - "id": 40657 - }, - { - "name": "Minott Street", - "lat": "43.63003", - "lon": "-70.27396", - "id": 36700 - }, - { - "name": "Mosher Street", - "lat": "43.64604", - "lon": "-70.24124", - "id": 37633 - }, - { - "name": "Mussey Street", - "lat": "43.63974", - "lon": "-70.24349", - "id": 39836 - }, - { - "name": "New York Avenue", - "lat": "43.61772", - "lon": "-70.31565", - "id": 32383 - }, - { - "name": "North Branch Trail", - "lat": "43.63258", - "lon": "-70.32632", - "id": 77432 - }, - { - "name": "North Kelsey Street", - "lat": "43.63199", - "lon": "-70.27031", - "id": 36864 - }, - { - "name": "North Marriner Street", - "lat": "43.64504", - "lon": "-70.24341", - "id": 41428 - }, - { - "name": "North Richland Street", - "lat": "43.63558", - "lon": "-70.24639", - "id": 34702 - }, - { - "name": "Nutter Road", - "lat": "43.62495", - "lon": "-70.26680", - "id": 39544 - }, - { - "name": "O'Hare Road", - "lat": "43.63676", - "lon": "-70.31887", - "id": 40424 - }, - { - "name": "O'Neil Street", - "lat": "43.63443", - "lon": "-70.24392", - "id": 40084 - }, - { - "name": "Oakdale Avenue", - "lat": "43.62983", - "lon": "-70.25738", - "id": 34136 - }, - { - "name": "Ocean House Street", - "lat": "43.63435", - "lon": "-70.25227", - "id": 34975 - }, - { - "name": "Ocean Street Spur", - "lat": "43.64162", - "lon": "-70.25555", - "id": 35145 - }, - { - "name": "Olive Road", - "lat": "43.63389", - "lon": "-70.24139", - "id": 34688 - }, - { - "name": "Osborne Avenue", - "lat": "43.63034", - "lon": "-70.26132", - "id": 32622 - }, - { - "name": "Ottawa Road", - "lat": "43.63409", - "lon": "-70.22493", - "id": 36393 - }, - { - "name": "Paddock Place", - "lat": "43.62489", - "lon": "-70.31020", - "id": 33223 - }, - { - "name": "Parkside Terrace", - "lat": "43.63618", - "lon": "-70.24946", - "id": 39377 - }, - { - "name": "Parrott Street", - "lat": "43.62736", - "lon": "-70.24725", - "id": 40884 - }, - { - "name": "Peary Terrace", - "lat": "43.62887", - "lon": "-70.28714", - "id": 37097 - }, - { - "name": "Pepperbush", - "lat": "43.60176", - "lon": "-70.28649", - "id": 39039 - }, - { - "name": "Pepperbush Circle", - "lat": "43.60195", - "lon": "-70.28589", - "id": 37881 - }, - { - "name": "Pickett Street", - "lat": "43.64705", - "lon": "-70.22858", - "id": 40486 - }, - { - "name": "Pillsbury Street", - "lat": "43.63746", - "lon": "-70.23259", - "id": 32201 - }, - { - "name": "Pine Haven Terrace", - "lat": "43.61470", - "lon": "-70.31364", - "id": 35657 - }, - { - "name": "Pope Avenue", - "lat": "43.64086", - "lon": "-70.32171", - "id": 32009 - }, - { - "name": "Portland Street Pier", - "lat": "43.64974", - "lon": "-70.24242", - "id": 36456 - }, - { - "name": "Postal Service Road", - "lat": "43.62130", - "lon": "-70.32797", - "id": 32427 - }, - { - "name": "Presidenitial Cove", - "lat": "43.61936", - "lon": "-70.27246", - "id": 35866 - }, - { - "name": "Q Street", - "lat": "43.63777", - "lon": "-70.25390", - "id": 1448 - }, - { - "name": "Rainbow Avenue", - "lat": "43.62784", - "lon": "-70.28334", - "id": 36156 - }, - { - "name": "River Place Drive", - "lat": "43.64266", - "lon": "-70.24669", - "id": 81275 - }, - { - "name": "Robert Mills Road", - "lat": "43.62732", - "lon": "-70.28943", - "id": 33742 - }, - { - "name": "Rodger Road", - "lat": "43.63805", - "lon": "-70.24437", - "id": 41077 - }, - { - "name": "Rollins Way", - "lat": "43.63766", - "lon": "-70.31042", - "id": 76977 - }, - { - "name": "Romano Road", - "lat": "43.62391", - "lon": "-70.27737", - "id": 38019 - }, - { - "name": "Rosetti Avenue", - "lat": "43.62892", - "lon": "-70.29450", - "id": 34608 - }, - { - "name": "Rosewood", - "lat": "43.62836", - "lon": "-70.25729", - "id": 41374 - }, - { - "name": "Rothay Avenue", - "lat": "43.62680", - "lon": "-70.29832", - "id": 40102 - }, - { - "name": "Runway Road", - "lat": "43.61032", - "lon": "-70.30606", - "id": 34583 - }, - { - "name": "Sable Oaks Drive", - "lat": "43.64216", - "lon": "-70.34160", - "id": 32503 - }, - { - "name": "Sand Pebble Way", - "lat": "43.63990", - "lon": "-70.22886", - "id": 37353 - }, - { - "name": "Sandy Hill Road", - "lat": "43.62376", - "lon": "-70.31295", - "id": 34297 - }, - { - "name": "Sawyer Brook Circle", - "lat": "43.62971", - "lon": "-70.23991", - "id": 39576 - }, - { - "name": "Scamman Street", - "lat": "43.63101", - "lon": "-70.25523", - "id": 37048 - }, - { - "name": "Shaw Farm Road", - "lat": "43.62770", - "lon": "-70.23448", - "id": 81242 - }, - { - "name": "Shelby Lane", - "lat": "43.62859", - "lon": "-70.26051", - "id": 33749 - }, - { - "name": "Shipchannel Road", - "lat": "43.63528", - "lon": "-70.22461", - "id": 41496 - }, - { - "name": "Simmons Road", - "lat": "43.62601", - "lon": "-70.25287", - "id": 41460 - }, - { - "name": "Simonton Street", - "lat": "43.63868", - "lon": "-70.22731", - "id": 41384 - }, - { - "name": "Skillings Street", - "lat": "43.62527", - "lon": "-70.29252", - "id": 86009 - }, - { - "name": "Smokehouse Circle", - "lat": "43.60721", - "lon": "-70.28235", - "id": 36042 - }, - { - "name": "Sokokus Street", - "lat": "43.62819", - "lon": "-70.31359", - "id": 38076 - }, - { - "name": "Soule Street", - "lat": "43.63663", - "lon": "-70.24892", - "id": 40836 - }, - { - "name": "South Kelsey Street", - "lat": "43.62929", - "lon": "-70.26783", - "id": 39590 - }, - { - "name": "South Richland Street", - "lat": "43.63222", - "lon": "-70.24482", - "id": 37810 - }, - { - "name": "Southeast Road", - "lat": "43.62787", - "lon": "-70.28802", - "id": 33670 - }, - { - "name": "Southwell Avenue", - "lat": "43.62466", - "lon": "-70.30068", - "id": 40055 - }, - { - "name": "Spear", - "lat": "43.62287", - "lon": "-70.24905", - "id": 40097 - }, - { - "name": "Sprauge Street", - "lat": "43.63699", - "lon": "-70.24184", - "id": 33940 - }, - { - "name": "Spring Point Drive", - "lat": "43.64743", - "lon": "-70.22746", - "id": 33368 - }, - { - "name": "Springwood Road", - "lat": "43.62373", - "lon": "-70.31111", - "id": 32276 - }, - { - "name": "Stanford Street", - "lat": "43.64749", - "lon": "-70.23901", - "id": 35147 - }, - { - "name": "Sterling Avenue", - "lat": "43.63225", - "lon": "-70.23856", - "id": 38644 - }, - { - "name": "Strathmore Road", - "lat": "43.63390", - "lon": "-70.23999", - "id": 40653 - }, - { - "name": "Strout Street", - "lat": "43.62676", - "lon": "-70.28636", - "id": 35510 - }, - { - "name": "Summerglen Road", - "lat": "43.62615", - "lon": "-70.25197", - "id": 34969 - }, - { - "name": "Surfsite Road", - "lat": "43.64538", - "lon": "-70.23199", - "id": 34256 - }, - { - "name": "T-Ledge Drive", - "lat": "43.62603", - "lon": "-70.26167", - "id": 38742 - }, - { - "name": "Tanner Street", - "lat": "43.63207", - "lon": "-70.26298", - "id": 35438 - }, - { - "name": "Tewksbury Lane", - "lat": "43.63376", - "lon": "-70.28679", - "id": 38146 - }, - { - "name": "Thadeus Street", - "lat": "43.62545", - "lon": "-70.28716", - "id": 1485 - }, - { - "name": "The Hedges", - "lat": "43.62760", - "lon": "-70.30990", - "id": 41456 - }, - { - "name": "Thirlmere Avenue", - "lat": "43.62359", - "lon": "-70.30460", - "id": 32433 - }, - { - "name": "Todd Lane", - "lat": "43.64547", - "lon": "-70.23392", - "id": 33449 - }, - { - "name": "Townhouse Drive", - "lat": "43.63791", - "lon": "-70.31098", - "id": 76979 - }, - { - "name": "Veterans Memorial Bridge Pathway", - "lat": "43.63885", - "lon": "-70.29325", - "id": 78986 - }, - { - "name": "Vincent Street", - "lat": "43.63693", - "lon": "-70.23761", - "id": 34707 - }, - { - "name": "Wainwright Circle East", - "lat": "43.63797", - "lon": "-70.31565", - "id": 40639 - }, - { - "name": "Wainwright Circle West", - "lat": "43.63651", - "lon": "-70.31919", - "id": 40701 - }, - { - "name": "Webster Court", - "lat": "43.64971", - "lon": "-70.23854", - "id": 37447 - }, - { - "name": "Wermuth Road", - "lat": "43.63901", - "lon": "-70.31387", - "id": 36816 - }, - { - "name": "West Crestview Drive", - "lat": "43.60936", - "lon": "-70.28121", - "id": 34272 - }, - { - "name": "Westbrook St Dead End", - "lat": "43.62025", - "lon": "-70.30544", - "id": 40220 - }, - { - "name": "Westbrook Street;675 Westbrook St", - "lat": "43.63856", - "lon": "-70.30911", - "id": 82910 - }, - { - "name": "Whitehall Avenue", - "lat": "43.63036", - "lon": "-70.28467", - "id": 40007 - }, - { - "name": "Whitworth Drive", - "lat": "43.62427", - "lon": "-70.25504", - "id": 35876 - }, - { - "name": "Wild Rose Avenue", - "lat": "43.62792", - "lon": "-70.25233", - "id": 32018 - }, - { - "name": "Willard Haven Park", - "lat": "43.64078", - "lon": "-70.22622", - "id": 37061 - }, - { - "name": "Willard Haven Road", - "lat": "43.64078", - "lon": "-70.22622", - "id": 37028 - }, - { - "name": "Williston Road", - "lat": "43.62085", - "lon": "-70.26943", - "id": 34590 - }, - { - "name": "Wisterio Way", - "lat": "43.62573", - "lon": "-70.26302", - "id": 34273 - }, - { - "name": "Woodmoor Road", - "lat": "43.62275", - "lon": "-70.25150", - "id": 35274 - }, - { - "name": "Wright Express Drive", - "lat": "43.63558", - "lon": "-70.32499", - "id": 76968 - }, - { - "name": "Wylie Street", - "lat": "43.62760", - "lon": "-70.25944", - "id": 38751 - }, - { - "name": "Wythburn Street", - "lat": "43.62607", - "lon": "-70.30066", - "id": 39060 - } - ], - "init": 1, - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Old Orchard Beach", - "lat": "43.51768", - "lon": "-70.37773", - "id": 158809517, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Avenue", - "names": { - "alt_name": "State Route 98" - }, - "lat": "43.51786", - "lon": "-70.37732", - "id": 369, - "buildings": [ - { - "name": "1", - "lat": "43.51786", - "lon": "-70.37732", - "postcode": "04064" - }, - { - "name": "2", - "lat": "43.51750", - "lon": "-70.37799", - "postcode": "04064" - }, - { - "name": "4", - "lat": "43.51781", - "lon": "-70.37807", - "postcode": "04064" - }, - { - "name": "6", - "lat": "43.51814", - "lon": "-70.37790", - "postcode": "04064" - }, - { - "name": "14", - "lat": "43.51842", - "lon": "-70.37805", - "postcode": "04064" - }, - { - "name": "15", - "lat": "43.51868", - "lon": "-70.37760", - "postcode": "04064" - }, - { - "name": "17", - "lat": "43.51891", - "lon": "-70.37773", - "postcode": "04064" - }, - { - "name": "19", - "lat": "43.51908", - "lon": "-70.37780", - "postcode": "04064" - }, - { - "name": "20", - "lat": "43.51870", - "lon": "-70.37818", - "postcode": "04064" - }, - { - "name": "24", - "lat": "43.51896", - "lon": "-70.37827", - "postcode": "04064" - }, - { - "name": "25", - "lat": "43.51933", - "lon": "-70.37786", - "postcode": "04064" - }, - { - "name": "27", - "lat": "43.51954", - "lon": "-70.37801", - "postcode": "04064" - }, - { - "name": "28", - "lat": "43.51930", - "lon": "-70.37844", - "postcode": "04064" - }, - { - "name": "29", - "lat": "43.51971", - "lon": "-70.37810", - "postcode": "04064" - }, - { - "name": "31", - "lat": "43.52003", - "lon": "-70.37818", - "postcode": "04064" - }, - { - "name": "34", - "lat": "43.51963", - "lon": "-70.37880", - "postcode": "04064" - }, - { - "name": "35", - "lat": "43.52021", - "lon": "-70.37829", - "postcode": "04064" - }, - { - "name": "36", - "lat": "43.51983", - "lon": "-70.37859", - "postcode": "04064" - }, - { - "name": "39", - "lat": "43.52041", - "lon": "-70.37829", - "postcode": "04064" - }, - { - "name": "41", - "lat": "43.52049", - "lon": "-70.37831", - "postcode": "04064" - }, - { - "name": "47", - "lat": "43.52077", - "lon": "-70.37850", - "postcode": "04064" - }, - { - "name": "48", - "lat": "43.52061", - "lon": "-70.37904", - "postcode": "04064" - }, - { - "name": "51", - "lat": "43.52142", - "lon": "-70.37838", - "postcode": "04064" - }, - { - "name": "58", - "lat": "43.52129", - "lon": "-70.37925", - "postcode": "04064" - }, - { - "name": "63", - "lat": "43.52170", - "lon": "-70.37840", - "postcode": "04064" - }, - { - "name": "77", - "lat": "43.52193", - "lon": "-70.37822", - "postcode": "04064" - }, - { - "name": "81", - "lat": "43.52255", - "lon": "-70.37790", - "postcode": "04064" - }, - { - "name": "83", - "lat": "43.52290", - "lon": "-70.37747", - "postcode": "04064" - }, - { - "name": "86", - "lat": "43.52343", - "lon": "-70.37846", - "postcode": "04064" - }, - { - "name": "89", - "lat": "43.52329", - "lon": "-70.37732", - "postcode": "04064" - }, - { - "name": "91", - "lat": "43.52355", - "lon": "-70.37735", - "postcode": "04064" - }, - { - "name": "97", - "lat": "43.52380", - "lon": "-70.37707", - "postcode": "04064" - }, - { - "name": "99", - "lat": "43.52402", - "lon": "-70.37704", - "postcode": "04064" - }, - { - "name": "100", - "lat": "43.52391", - "lon": "-70.37784", - "postcode": "04064" - }, - { - "name": "101", - "lat": "43.52423", - "lon": "-70.37702", - "postcode": "04064" - }, - { - "name": "103", - "lat": "43.52442", - "lon": "-70.37689", - "postcode": "04064" - }, - { - "name": "105", - "lat": "43.52472", - "lon": "-70.37653", - "postcode": "04064" - }, - { - "name": "108", - "lat": "43.52431", - "lon": "-70.37765", - "postcode": "04064" - }, - { - "name": "110", - "lat": "43.52455", - "lon": "-70.37743", - "postcode": "04064" - }, - { - "name": "114", - "lat": "43.52515", - "lon": "-70.37805", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52500", - "lon": "-70.37711", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52523", - "lon": "-70.37700", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52573", - "lon": "-70.37681", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52585", - "lon": "-70.37730", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52551", - "lon": "-70.37745", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52539", - "lon": "-70.37745", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52517", - "lon": "-70.37700", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52571", - "lon": "-70.37737", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52518", - "lon": "-70.37750", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52559", - "lon": "-70.37685", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52593", - "lon": "-70.37726", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52504", - "lon": "-70.37707", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52526", - "lon": "-70.37747", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52511", - "lon": "-70.37702", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52564", - "lon": "-70.37743", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52581", - "lon": "-70.37732", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52532", - "lon": "-70.37747", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52568", - "lon": "-70.37683", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52579", - "lon": "-70.37677", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52543", - "lon": "-70.37747", - "postcode": "04064" - }, - { - "name": "116", - "lat": "43.52574", - "lon": "-70.37735", - "postcode": "04064" - }, - { - "name": "117", - "lat": "43.52508", - "lon": "-70.37651", - "postcode": "04064" - }, - { - "name": "121", - "lat": "43.52546", - "lon": "-70.37623", - "postcode": "04064" - }, - { - "name": "123", - "lat": "43.52567", - "lon": "-70.37625", - "postcode": "04064" - }, - { - "name": "124", - "lat": "43.52794", - "lon": "-70.37848", - "postcode": "04064" - }, - { - "name": "125", - "lat": "43.52679", - "lon": "-70.37552", - "postcode": "04064" - }, - { - "name": "128", - "lat": "43.52858", - "lon": "-70.37838", - "postcode": "04064" - }, - { - "name": "129", - "lat": "43.52808", - "lon": "-70.37634", - "postcode": "04064" - }, - { - "name": "130", - "lat": "43.52895", - "lon": "-70.37876", - "postcode": "04064" - }, - { - "name": "132", - "lat": "43.52942", - "lon": "-70.37908", - "postcode": "04064" - }, - { - "name": "133", - "lat": "43.52924", - "lon": "-70.37762", - "postcode": "04064" - }, - { - "name": "134", - "lat": "43.52999", - "lon": "-70.37964", - "postcode": "04064" - }, - { - "name": "135", - "lat": "43.53074", - "lon": "-70.37799", - "postcode": "04064" - }, - { - "name": "136", - "lat": "43.53019", - "lon": "-70.38052", - "postcode": "04064" - }, - { - "name": "137", - "lat": "43.53086", - "lon": "-70.37938", - "postcode": "04064" - }, - { - "name": "138", - "lat": "43.53026", - "lon": "-70.37990", - "postcode": "04064" - }, - { - "name": "139", - "lat": "43.53290", - "lon": "-70.37715", - "postcode": "04064" - }, - { - "name": "142", - "lat": "43.53099", - "lon": "-70.38056", - "postcode": "04064" - }, - { - "name": "143", - "lat": "43.53250", - "lon": "-70.38071", - "postcode": "04064" - }, - { - "name": "144", - "lat": "43.53128", - "lon": "-70.38056", - "postcode": "04064" - }, - { - "name": "145", - "lat": "43.53307", - "lon": "-70.38110", - "postcode": "04064" - }, - { - "name": "146", - "lat": "43.53144", - "lon": "-70.38059", - "postcode": "04064" - }, - { - "name": "147", - "lat": "43.53346", - "lon": "-70.38121", - "postcode": "04064" - }, - { - "name": "148", - "lat": "43.53176", - "lon": "-70.38106", - "postcode": "04064" - }, - { - "name": "149", - "lat": "43.53404", - "lon": "-70.38155", - "postcode": "04064" - }, - { - "name": "150", - "lat": "43.53215", - "lon": "-70.38114", - "postcode": "04064" - }, - { - "name": "151", - "lat": "43.53453", - "lon": "-70.38194", - "postcode": "04064" - }, - { - "name": "153", - "lat": "43.53486", - "lon": "-70.38232", - "postcode": "04064" - }, - { - "name": "154", - "lat": "43.53301", - "lon": "-70.38172", - "postcode": "04064" - }, - { - "name": "155", - "lat": "43.53558", - "lon": "-70.38213", - "postcode": "04064" - }, - { - "name": "157", - "lat": "43.53562", - "lon": "-70.38290", - "postcode": "04064" - }, - { - "name": "161", - "lat": "43.53682", - "lon": "-70.38417", - "postcode": "04064" - }, - { - "name": "163", - "lat": "43.53799", - "lon": "-70.38428", - "postcode": "04064" - }, - { - "name": "165", - "lat": "43.53799", - "lon": "-70.38531", - "postcode": "04064" - }, - { - "name": "166", - "lat": "43.53612", - "lon": "-70.38458", - "postcode": "04064" - }, - { - "name": "168", - "lat": "43.53645", - "lon": "-70.38496", - "postcode": "04064" - }, - { - "name": "169", - "lat": "43.53918", - "lon": "-70.38578", - "postcode": "04064" - }, - { - "name": "170", - "lat": "43.53673", - "lon": "-70.38541", - "postcode": "04064" - }, - { - "name": "171", - "lat": "43.53926", - "lon": "-70.38642", - "postcode": "04064" - }, - { - "name": "173", - "lat": "43.54010", - "lon": "-70.38640", - "postcode": "04064" - }, - { - "name": "175", - "lat": "43.53993", - "lon": "-70.38681", - "postcode": "04064" - }, - { - "name": "176", - "lat": "43.53794", - "lon": "-70.38589", - "postcode": "04064" - }, - { - "name": "177", - "lat": "43.54043", - "lon": "-70.38739", - "postcode": "04064" - }, - { - "name": "178", - "lat": "43.53813", - "lon": "-70.38623", - "postcode": "04064" - }, - { - "name": "180", - "lat": "43.53858", - "lon": "-70.38664", - "postcode": "04064" - }, - { - "name": "182", - "lat": "43.53884", - "lon": "-70.38683", - "postcode": "04064" - }, - { - "name": "183", - "lat": "43.54114", - "lon": "-70.38861", - "postcode": "04064" - }, - { - "name": "184", - "lat": "43.53866", - "lon": "-70.38739", - "postcode": "04064" - }, - { - "name": "184", - "lat": "43.53904", - "lon": "-70.38689", - "postcode": "04064" - }, - { - "name": "185", - "lat": "43.54141", - "lon": "-70.38900", - "postcode": "04064" - }, - { - "name": "186", - "lat": "43.53934", - "lon": "-70.38719", - "postcode": "04064" - }, - { - "name": "187", - "lat": "43.54188", - "lon": "-70.38953", - "postcode": "04064" - }, - { - "name": "188", - "lat": "43.53940", - "lon": "-70.38745", - "postcode": "04064" - }, - { - "name": "190", - "lat": "43.53967", - "lon": "-70.38749", - "postcode": "04064" - }, - { - "name": "192", - "lat": "43.54035", - "lon": "-70.38865", - "postcode": "04064" - }, - { - "name": "199", - "lat": "43.54513", - "lon": "-70.39170", - "postcode": "04064" - }, - { - "name": "204", - "lat": "43.54290", - "lon": "-70.39170", - "postcode": "04064" - }, - { - "name": "205", - "lat": "43.54587", - "lon": "-70.39080", - "postcode": "04064" - }, - { - "name": "206", - "lat": "43.54357", - "lon": "-70.39219", - "postcode": "04064" - }, - { - "name": "212", - "lat": "43.54598", - "lon": "-70.39211", - "postcode": "04072" - }, - { - "name": "214", - "lat": "43.54636", - "lon": "-70.39149", - "postcode": "04072" - }, - { - "name": "215", - "lat": "43.54618", - "lon": "-70.39018", - "postcode": "04064" - }, - { - "name": "216", - "lat": "43.54674", - "lon": "-70.39082", - "postcode": "04072" - }, - { - "name": "218", - "lat": "43.54701", - "lon": "-70.39028", - "postcode": "04072" - }, - { - "name": "219", - "lat": "43.54653", - "lon": "-70.38951", - "postcode": "04064" - }, - { - "name": "220", - "lat": "43.54755", - "lon": "-70.38943", - "postcode": "04072" - } - ], - "intersectedStreets": [ - { - "name": "Saco Avenue", - "names": { - "alt_name": "State Route 5" - }, - "lat": "43.51751", - "lon": "-70.37762" - }, - { - "name": "Old Orchard Street", - "names": { - "alt_name": "State Route 5" - }, - "lat": "43.51751", - "lon": "-70.37762" - }, - { - "name": "Imperial Street", - "lat": "43.51854", - "lon": "-70.37777" - }, - { - "name": "Burdette Street", - "lat": "43.51980", - "lon": "-70.37833" - }, - { - "name": "Foote Street", - "lat": "43.52089", - "lon": "-70.37880" - }, - { - "name": "Cascade Road", - "names": { - "alt_name": "State Route 98" - }, - "lat": "43.52153", - "lon": "-70.37900" - }, - { - "name": "Smith Avenue", - "lat": "43.52224", - "lon": "-70.37838" - }, - { - "name": "Willow Haven Street", - "lat": "43.52238", - "lon": "-70.37829" - }, - { - "name": "Miles Avenue", - "lat": "43.52285", - "lon": "-70.37805" - }, - { - "name": "Lewis Avenue", - "lat": "43.52329", - "lon": "-70.37782" - }, - { - "name": "Emerson Drive", - "lat": "43.52360", - "lon": "-70.37767" - }, - { - "name": "Walnut Street", - "lat": "43.52480", - "lon": "-70.37698" - }, - { - "name": "Ross Road", - "lat": "43.53598", - "lon": "-70.38376" - }, - { - "name": "Milliken Mills Road (Milliken Mills)", - "lat": "43.54471", - "lon": "-70.39237" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Skowhegan", - "lat": "44.76526", - "lon": "-69.71924", - "id": 158901925, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Fort Kent", - "lat": "47.25873", - "lon": "-68.58971", - "id": 158842923, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Van Buren", - "lat": "47.15751", - "lon": "-67.93533", - "id": 158909978, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Augusta", - "enName": "Augusta", - "names": { - "ru": "Огаста", - "uk": "Огаста", - "pl": "Augusta", - "ta": "அகஸ்தா" - }, - "lat": "44.31058", - "lon": "-69.77966", - "id": 158860186, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Portland", - "enName": "Portland", - "names": { - "ru": "Портленд", - "uk": "Портленд" - }, - "lat": "43.66103", - "lon": "-70.25486", - "id": 158867610, - "type": "CITY", - "listOfStreets": [ - { - "name": "1st Street", - "lat": "43.59966", - "lon": "-70.32306", - "id": 37576 - }, - { - "name": "2nd Avenue", - "lat": "43.60159", - "lon": "-70.32314", - "id": 36506 - }, - { - "name": "3rd Avenue", - "lat": "43.60150", - "lon": "-70.32449", - "id": 39524 - }, - { - "name": "", - "enName": "", - "names": { - "ru": "<Портленд>", - "uk": "<Портленд>" - }, - "lat": "43.82416", - "lon": "-70.07293", - "id": 1008 - }, - { - "name": "Abbey Lane", - "lat": "43.84988", - "lon": "-70.18438", - "id": 33829 - }, - { - "name": "Abby Lane", - "lat": "43.71898", - "lon": "-70.28821", - "id": 12487 - }, - { - "name": "Acorn Lane", - "lat": "43.56932", - "lon": "-70.28669", - "id": 34610 - }, - { - "name": "Adams Way", - "lat": "43.61929", - "lon": "-70.40672", - "id": 33535 - }, - { - "name": "Albion Road", - "lat": "43.78749", - "lon": "-70.37498", - "id": 34379 - }, - { - "name": "Alden Lane", - "lat": "43.57963", - "lon": "-70.29111", - "id": 33713 - }, - { - "name": "Alder Street", - "lat": "43.62297", - "lon": "-70.23489", - "id": 32291 - }, - { - "name": "Alexander Drive", - "lat": "43.61076", - "lon": "-70.25559", - "id": 38837 - }, - { - "name": "Alice Street", - "lat": "43.72396", - "lon": "-70.29046", - "id": 12472 - }, - { - "name": "Allen Avenue", - "lat": "43.71111", - "lon": "-70.27733", - "id": 12980 - }, - { - "name": "Allen Drive", - "lat": "43.78635", - "lon": "-70.37241", - "id": 39680 - }, - { - "name": "Allison Avenue", - "lat": "43.71436", - "lon": "-70.30218", - "id": 12397 - }, - { - "name": "Amber Lane", - "lat": "43.78577", - "lon": "-70.36724", - "id": 33219 - }, - { - "name": "Ambrose Drive", - "lat": "43.73591", - "lon": "-70.12451", - "id": 40568 - }, - { - "name": "Ames Drive", - "lat": "43.88096", - "lon": "-70.42153", - "id": 39217 - }, - { - "name": "Anderson Road", - "lat": "43.72814", - "lon": "-70.37651", - "id": 33252 - }, - { - "name": "Andover Road", - "lat": "43.65347", - "lon": "-70.34374", - "id": 1820 - }, - { - "name": "Apple Blossom Way", - "lat": "43.83268", - "lon": "-70.29748", - "id": 32849 - }, - { - "name": "Apple Tree Lane", - "lat": "43.59320", - "lon": "-70.25729", - "id": 37555 - }, - { - "name": "Applewood Lane", - "lat": "43.72960", - "lon": "-70.25439", - "id": 85697 - }, - { - "name": "Arbor Lane", - "lat": "43.59447", - "lon": "-70.32188", - "id": 35018 - }, - { - "name": "Arbor Road", - "lat": "43.75640", - "lon": "-70.24388", - "id": 32830 - }, - { - "name": "Arbor Street", - "lat": "43.59861", - "lon": "-70.31855", - "id": 32531 - }, - { - "name": "Ardmore Street", - "lat": "43.69011", - "lon": "-70.30078", - "id": 12861 - }, - { - "name": "Arthur Avenue", - "lat": "43.71132", - "lon": "-70.23744", - "id": 32548 - }, - { - "name": "Ash Swamp Road", - "lat": "43.58171", - "lon": "-70.43824", - "id": 33374 - }, - { - "name": "Ashwood Lane", - "lat": "43.73430", - "lon": "-70.25971", - "id": 85761 - }, - { - "name": "Aspen Way", - "lat": "43.75922", - "lon": "-70.27918", - "id": 33367 - }, - { - "name": "Aster Lane", - "lat": "43.71831", - "lon": "-70.27943", - "id": 32976 - }, - { - "name": "Auburn Street", - "lat": "43.72347", - "lon": "-70.29435", - "id": 12473 - }, - { - "name": "Autumn Way", - "lat": "43.77153", - "lon": "-70.29686", - "id": 32403 - }, - { - "name": "Avalon Road", - "lat": "43.68968", - "lon": "-70.30231", - "id": 12840 - }, - { - "name": "Avalon Terrace", - "lat": "43.69079", - "lon": "-70.30177", - "id": 12858 - }, - { - "name": "Avenue A", - "lat": "43.56397", - "lon": "-70.33327", - "id": 39830 - }, - { - "name": "Avenue B", - "lat": "43.56438", - "lon": "-70.33280", - "id": 39841 - }, - { - "name": "Avon Street", - "lat": "43.75615", - "lon": "-70.10033", - "id": 32055 - }, - { - "name": "Ayer Drive", - "lat": "43.80894", - "lon": "-70.48871", - "id": 36701 - }, - { - "name": "Back Shore Road", - "lat": "43.75532", - "lon": "-70.10329", - "id": 35230 - }, - { - "name": "Bailey Drive", - "lat": "43.76417", - "lon": "-70.37614", - "id": 34348 - }, - { - "name": "Balsam Lane", - "lat": "43.73270", - "lon": "-70.32121", - "id": 36010 - }, - { - "name": "Balsam Street", - "lat": "43.59833", - "lon": "-70.31771", - "id": 33189 - }, - { - "name": "Barn Road", - "lat": "43.78976", - "lon": "-70.14622", - "id": 33703 - }, - { - "name": "Basin Point Road", - "lat": "43.74045", - "lon": "-70.04117", - "id": 35726 - }, - { - "name": "Batchelder Road", - "lat": "43.72239", - "lon": "-70.37795", - "id": 34169 - }, - { - "name": "Bay View Avenue", - "lat": "43.86817", - "lon": "-70.46562", - "id": 34180 - }, - { - "name": "Bayberry Lane", - "lat": "43.57982", - "lon": "-70.33660", - "id": 34497 - }, - { - "name": "Bayview Terrace", - "lat": "43.68255", - "lon": "-70.27529", - "id": 12936 - }, - { - "name": "Beach Road", - "lat": "43.79109", - "lon": "-70.35750", - "id": 35322 - }, - { - "name": "Beaumont Street", - "lat": "43.69084", - "lon": "-70.30250", - "id": 12582 - }, - { - "name": "Beaver Brook Road", - "lat": "43.60232", - "lon": "-70.41777", - "id": 35619 - }, - { - "name": "Beaver Dam Road", - "lat": "43.84505", - "lon": "-70.16614", - "id": 33497 - }, - { - "name": "Beech Hill Road", - "lat": "43.63016", - "lon": "-70.41106", - "id": 40896 - }, - { - "name": "Beech Ridge Road", - "lat": "43.61417", - "lon": "-70.40545", - "id": 37903 - }, - { - "name": "Beech Road", - "lat": "43.82073", - "lon": "-70.48202", - "id": 34593 - }, - { - "name": "Berry Road", - "lat": "43.61967", - "lon": "-70.39500", - "id": 36631 - }, - { - "name": "Betty Lane", - "lat": "43.74875", - "lon": "-70.40893", - "id": 81139 - }, - { - "name": "Birch Lane", - "lat": "43.57091", - "lon": "-70.28304", - "id": 37023 - }, - { - "name": "Birch Road", - "lat": "43.62592", - "lon": "-70.22358", - "id": 34203 - }, - { - "name": "Birchwood Terrace", - "lat": "43.87766", - "lon": "-70.25298", - "id": 38757 - }, - { - "name": "Bishop Street", - "lat": "43.68684", - "lon": "-70.30149", - "id": 12575 - }, - { - "name": "Bittersweet Lane", - "lat": "43.77661", - "lon": "-70.21525", - "id": 85742 - }, - { - "name": "Black Point Road", - "lat": "43.58044", - "lon": "-70.32870", - "id": 78038 - }, - { - "name": "Blackstrap Road", - "lat": "43.72251", - "lon": "-70.30003", - "id": 37258 - }, - { - "name": "Blanchard Road", - "lat": "43.81374", - "lon": "-70.28890", - "id": 32912 - }, - { - "name": "Blueberry Lane", - "lat": "43.72318", - "lon": "-70.25111", - "id": 36378 - }, - { - "name": "Blueberry Road", - "lat": "43.65229", - "lon": "-70.33379", - "id": 13514 - }, - { - "name": "Bonny Street", - "lat": "43.72033", - "lon": "-70.28980", - "id": 33377 - }, - { - "name": "Border Road", - "lat": "43.62078", - "lon": "-70.32982", - "id": 78998 - }, - { - "name": "Boulder Drive", - "lat": "43.82049", - "lon": "-70.47599", - "id": 34552 - }, - { - "name": "Boulder Way", - "lat": "43.85557", - "lon": "-70.46500", - "id": 39826 - }, - { - "name": "Bowery Beach Road", - "lat": "43.56993", - "lon": "-70.24369", - "id": 34413 - }, - { - "name": "Boyd Street", - "lat": "43.66362", - "lon": "-70.25620", - "id": 13140 - }, - { - "name": "Brackett Road", - "lat": "43.71859", - "lon": "-70.25218", - "id": 33816 - }, - { - "name": "Bradford Road", - "lat": "43.62051", - "lon": "-70.24723", - "id": 34618 - }, - { - "name": "Brentwood Road", - "lat": "43.78883", - "lon": "-70.36063", - "id": 39422 - }, - { - "name": "Brickyard Cove Lane", - "lat": "43.83419", - "lon": "-70.05554", - "id": 41432 - }, - { - "name": "Bridle Path", - "lat": "43.71626", - "lon": "-70.27961", - "id": 39593 - }, - { - "name": "Bridle Path Way", - "lat": "43.62205", - "lon": "-70.22107", - "id": 39898 - }, - { - "name": "Bristol Lane", - "lat": "43.85268", - "lon": "-70.18599", - "id": 33088 - }, - { - "name": "Broad Cove Road", - "lat": "43.57308", - "lon": "-70.21429", - "id": 32203 - }, - { - "name": "Brook Road", - "lat": "43.73261", - "lon": "-70.30638", - "id": 33126 - }, - { - "name": "Brookside Drive", - "lat": "43.72958", - "lon": "-70.31353", - "id": 32131 - }, - { - "name": "Brookview Lane", - "lat": "43.83386", - "lon": "-70.19644", - "id": 80492 - }, - { - "name": "Brown Street", - "lat": "43.70474", - "lon": "-70.23602", - "id": 36026 - }, - { - "name": "Browns Point Road", - "lat": "43.79548", - "lon": "-70.15266", - "id": 33805 - }, - { - "name": "Bucknam Road", - "lat": "43.72793", - "lon": "-70.23727", - "id": 77423 - }, - { - "name": "Burgess Road", - "lat": "43.87848", - "lon": "-70.51455", - "id": 34911 - }, - { - "name": "Burke Road", - "lat": "43.82417", - "lon": "-70.48978", - "id": 36251 - }, - { - "name": "Burnett Road", - "lat": "43.83078", - "lon": "-70.06655", - "id": 78955 - }, - { - "name": "Cameron Lane", - "lat": "43.85862", - "lon": "-70.42944", - "id": 32480 - }, - { - "name": "Camp Drive", - "lat": "43.84894", - "lon": "-70.46601", - "id": 39206 - }, - { - "name": "Campus Drive", - "lat": "43.60375", - "lon": "-70.31553", - "id": 78984 - }, - { - "name": "Canco Road", - "lat": "43.68677", - "lon": "-70.28248", - "id": 1170 - }, - { - "name": "Candlewyck Road", - "lat": "43.78635", - "lon": "-70.36913", - "id": 32460 - }, - { - "name": "Cape Road", - "lat": "43.88093", - "lon": "-70.51873", - "id": 33426 - }, - { - "name": "Cape Woods Road", - "lat": "43.62666", - "lon": "-70.23171", - "id": 37392 - }, - { - "name": "Caron Street", - "lat": "43.72230", - "lon": "-70.28939", - "id": 12477 - }, - { - "name": "Carriage Hill Road", - "lat": "43.58415", - "lon": "-70.21418", - "id": 33843 - }, - { - "name": "Carriage Road", - "lat": "43.71321", - "lon": "-70.27503", - "id": 34076 - }, - { - "name": "Carriage Way", - "lat": "43.56652", - "lon": "-70.38711", - "id": 37778 - }, - { - "name": "Carroll Street", - "lat": "43.70421", - "lon": "-70.23693", - "id": 34429 - }, - { - "name": "Carter Street", - "lat": "43.72189", - "lon": "-70.28806", - "id": 12478 - }, - { - "name": "Cedar Circle", - "lat": "43.57002", - "lon": "-70.34127", - "id": 40029 - }, - { - "name": "Cedarwood Drive", - "lat": "43.73827", - "lon": "-70.24227", - "id": 34634 - }, - { - "name": "Chadbourne Road", - "lat": "43.79038", - "lon": "-70.48699", - "id": 37046 - }, - { - "name": "Chambers Road", - "lat": "43.60589", - "lon": "-70.23476", - "id": 32288 - }, - { - "name": "Chandler Drive", - "lat": "43.74380", - "lon": "-70.23163", - "id": 37234 - }, - { - "name": "Chapel Street", - "lat": "43.66070", - "lon": "-70.25776", - "id": 82243 - }, - { - "name": "Checkerberry Lane", - "lat": "43.72579", - "lon": "-70.24557", - "id": 81288 - }, - { - "name": "Cherry Lane", - "lat": "43.59954", - "lon": "-70.31587", - "id": 40746 - }, - { - "name": "Chestnut Drive", - "lat": "43.58830", - "lon": "-70.40653", - "id": 36820 - }, - { - "name": "Chickadee Lane", - "lat": "43.76336", - "lon": "-70.35872", - "id": 35345 - }, - { - "name": "Christopher Road", - "lat": "43.88060", - "lon": "-70.26300", - "id": 39827 - }, - { - "name": "Church Street", - "lat": "43.65888", - "lon": "-70.25366", - "id": 33837 - }, - { - "name": "Clarks Point Road", - "lat": "43.81079", - "lon": "-70.48944", - "id": 35675 - }, - { - "name": "Clear Water Drive", - "lat": "43.57002", - "lon": "-70.30990", - "id": 34717 - }, - { - "name": "Clearview Drive", - "lat": "43.59402", - "lon": "-70.32228", - "id": 37204 - }, - { - "name": "Clifton Road", - "lat": "43.71125", - "lon": "-70.26057", - "id": 37558 - }, - { - "name": "Clinton Road", - "lat": "43.60336", - "lon": "-70.23446", - "id": 35326 - }, - { - "name": "Colby Drive", - "lat": "43.57195", - "lon": "-70.40065", - "id": 80842 - }, - { - "name": "Cole Farm Road", - "lat": "43.55779", - "lon": "-70.29458", - "id": 81318 - }, - { - "name": "Cole Road", - "lat": "43.88749", - "lon": "-70.41530", - "id": 39042 - }, - { - "name": "Cole Street", - "lat": "43.71972", - "lon": "-70.25077", - "id": 38576 - }, - { - "name": "Colonial Drive", - "lat": "43.59225", - "lon": "-70.37771", - "id": 40602 - }, - { - "name": "Commercial Drive", - "lat": "43.60389", - "lon": "-70.29864", - "id": 32504 - }, - { - "name": "Commercial Street", - "lat": "43.65902", - "lon": "-70.24929", - "id": 13126 - }, - { - "name": "Concord Drive", - "lat": "43.79368", - "lon": "-70.36007", - "id": 81144 - }, - { - "name": "Congress Street", - "lat": "43.66256", - "lon": "-70.25304", - "id": 285 - }, - { - "name": "Continental Drive", - "lat": "43.71129", - "lon": "-70.29926", - "id": 12402 - }, - { - "name": "Cook Road", - "lat": "43.77258", - "lon": "-70.42711", - "id": 32574 - }, - { - "name": "Cornerstone Drive", - "lat": "43.73734", - "lon": "-70.24178", - "id": 39496 - }, - { - "name": "Cottage Road", - "lat": "43.78541", - "lon": "-70.35606", - "id": 35982 - }, - { - "name": "Coulthard Farms Road", - "lat": "43.58846", - "lon": "-70.28364", - "id": 38707 - }, - { - "name": "Country Club Road", - "lat": "43.70986", - "lon": "-70.23139", - "id": 35853 - }, - { - "name": "Country Lane", - "lat": "43.69174", - "lon": "-70.27188", - "id": 12649 - }, - { - "name": "Cousins Street", - "lat": "43.77374", - "lon": "-70.14648", - "id": 78296 - }, - { - "name": "Cove Road", - "lat": "43.76603", - "lon": "-70.36080", - "id": 41381 - }, - { - "name": "Coveside Road", - "lat": "43.75893", - "lon": "-70.20075", - "id": 33669 - }, - { - "name": "Coyote Trail", - "lat": "43.77360", - "lon": "-70.50113", - "id": 84526 - }, - { - "name": "Crabapple Drive", - "lat": "43.78137", - "lon": "-70.36739", - "id": 31943 - }, - { - "name": "Craig Road", - "lat": "43.73729", - "lon": "-70.37018", - "id": 38191 - }, - { - "name": "Crescent Avenue", - "lat": "43.86831", - "lon": "-70.46665", - "id": 40513 - }, - { - "name": "Crestview Drive", - "lat": "43.72161", - "lon": "-70.28754", - "id": 12479 - }, - { - "name": "Cross Falmouth Trail", - "lat": "43.79929", - "lon": "-70.33934", - "id": 82246 - }, - { - "name": "Cross Hill Road", - "lat": "43.59517", - "lon": "-70.25791", - "id": 81571 - }, - { - "name": "Crossing Drive", - "lat": "43.56729", - "lon": "-70.38580", - "id": 40700 - }, - { - "name": "Crystal Lane", - "lat": "43.76992", - "lon": "-70.39724", - "id": 41124 - }, - { - "name": "Cumberland Avenue", - "lat": "43.66075", - "lon": "-70.25720", - "id": 13069 - }, - { - "name": "Cummings Road", - "lat": "43.62660", - "lon": "-70.34705", - "id": 38013 - }, - { - "name": "Cunningham Road", - "lat": "43.81443", - "lon": "-70.06608", - "id": 38959 - }, - { - "name": "Curtis Drive", - "lat": "43.78126", - "lon": "-70.43592", - "id": 32067 - }, - { - "name": "Curtis Road", - "lat": "43.72045", - "lon": "-70.28362", - "id": 12482 - }, - { - "name": "Custom House Wharf", - "lat": "43.65559", - "lon": "-70.24899", - "id": 13234 - }, - { - "name": "Cypress Street", - "lat": "43.59843", - "lon": "-70.31686", - "id": 37031 - }, - { - "name": "Davis Avenue", - "lat": "43.78104", - "lon": "-70.38436", - "id": 36359 - }, - { - "name": "Davis Farm Road", - "lat": "43.72118", - "lon": "-70.30177", - "id": 12557 - }, - { - "name": "Day Road", - "lat": "43.86651", - "lon": "-70.51467", - "id": 34977 - }, - { - "name": "Deans Way", - "lat": "43.75089", - "lon": "-70.20077", - "id": 39505 - }, - { - "name": "Deepwood Drive", - "lat": "43.71198", - "lon": "-70.27804", - "id": 12753 - }, - { - "name": "Deer Run Road", - "lat": "43.74582", - "lon": "-70.22712", - "id": 35094 - }, - { - "name": "Derby Lane", - "lat": "43.84740", - "lon": "-70.25922", - "id": 33517 - }, - { - "name": "Desert Road", - "lat": "43.85845", - "lon": "-70.15260", - "id": 79091 - }, - { - "name": "Dirigo Drive", - "lat": "43.58821", - "lon": "-70.44408", - "id": 83591 - }, - { - "name": "Dirigo Lane", - "lat": "43.78910", - "lon": "-69.93579", - "id": 38864 - }, - { - "name": "Dole Drive", - "lat": "43.70873", - "lon": "-70.30201", - "id": 12406 - }, - { - "name": "Dolloff Road", - "lat": "43.76173", - "lon": "-70.58229", - "id": 32560 - }, - { - "name": "Dorothy Street", - "lat": "43.69028", - "lon": "-70.30269", - "id": 12860 - }, - { - "name": "Doughty Road", - "lat": "43.80959", - "lon": "-70.23673", - "id": 32769 - }, - { - "name": "Douglas Road", - "lat": "43.57054", - "lon": "-70.38207", - "id": 38121 - }, - { - "name": "Dresser Road", - "lat": "43.60537", - "lon": "-70.39155", - "id": 41169 - }, - { - "name": "Dundee Road", - "lat": "43.77618", - "lon": "-70.45494", - "id": 38922 - }, - { - "name": "Eagle Drive", - "lat": "43.85820", - "lon": "-70.44238", - "id": 33513 - }, - { - "name": "East Drive", - "lat": "43.87423", - "lon": "-70.51092", - "id": 40627 - }, - { - "name": "East Oxford Street", - "lat": "43.66354", - "lon": "-70.25463", - "id": 13068 - }, - { - "name": "East Shore Drive", - "lat": "43.75656", - "lon": "-70.09747", - "id": 33504 - }, - { - "name": "Eastern Trail", - "lat": "43.57338", - "lon": "-70.35357", - "id": 31966 - }, - { - "name": "Eastfield Road", - "lat": "43.58364", - "lon": "-70.21371", - "id": 34444 - }, - { - "name": "Eastman Road", - "lat": "43.61021", - "lon": "-70.25639", - "id": 32277 - }, - { - "name": "Edes Road", - "lat": "43.78022", - "lon": "-70.21073", - "id": 33224 - }, - { - "name": "Edgecomb Court", - "lat": "43.69093", - "lon": "-70.27023", - "id": 12630 - }, - { - "name": "Edgewater Road", - "lat": "43.87538", - "lon": "-70.40606", - "id": 34752 - }, - { - "name": "Elizabeth Lane", - "lat": "43.59357", - "lon": "-70.42783", - "id": 35079 - }, - { - "name": "Elm Drive", - "lat": "43.71125", - "lon": "-70.22240", - "id": 32653 - }, - { - "name": "Elmwood Avenue", - "lat": "43.60204", - "lon": "-70.32525", - "id": 32707 - }, - { - "name": "Elmwood Road", - "lat": "43.87377", - "lon": "-70.14678", - "id": 22898 - }, - { - "name": "Enterprise Drive", - "lat": "43.58819", - "lon": "-70.35413", - "id": 34505 - }, - { - "name": "Equestrian Way", - "lat": "43.56758", - "lon": "-70.38333", - "id": 34441 - }, - { - "name": "Estes Drive", - "lat": "43.85870", - "lon": "-70.14459", - "id": 33939 - }, - { - "name": "Evergreen Road", - "lat": "43.86288", - "lon": "-70.14693", - "id": 40891 - }, - { - "name": "Fairwind Lane", - "lat": "43.78027", - "lon": "-70.18283", - "id": 34787 - }, - { - "name": "Falls Road", - "lat": "43.72031", - "lon": "-70.26519", - "id": 39937 - }, - { - "name": "Falmouth Road", - "lat": "43.72106", - "lon": "-70.26495", - "id": 1588 - }, - { - "name": "Farmhouse Road", - "lat": "43.59435", - "lon": "-70.28579", - "id": 82239 - }, - { - "name": "Federal East Street", - "lat": "43.66177", - "lon": "-70.25057", - "id": 13164 - }, - { - "name": "Federal Street", - "lat": "43.65997", - "lon": "-70.25362", - "id": 32446 - }, - { - "name": "Federal West Street", - "lat": "43.65910", - "lon": "-70.25497", - "id": 13093 - }, - { - "name": "Fern Avenue", - "lat": "43.68806", - "lon": "-70.15522", - "id": 37750 - }, - { - "name": "Fernwood Road", - "lat": "43.87067", - "lon": "-70.52622", - "id": 34514 - }, - { - "name": "Fiddlers Lane", - "lat": "43.84078", - "lon": "-70.17616", - "id": 36592 - }, - { - "name": "Field Road", - "lat": "43.75137", - "lon": "-70.27501", - "id": 34769 - }, - { - "name": "Fieldstone Court", - "lat": "43.69189", - "lon": "-70.26937", - "id": 12632 - }, - { - "name": "Fieldstone Lane", - "lat": "43.75839", - "lon": "-70.24918", - "id": 81905 - }, - { - "name": "Finch Way", - "lat": "43.60782", - "lon": "-70.34007", - "id": 83797 - }, - { - "name": "Finley Road", - "lat": "43.77051", - "lon": "-70.40576", - "id": 35005 - }, - { - "name": "Fire Lane 26", - "lat": "43.88014", - "lon": "-70.51319", - "id": 39091 - }, - { - "name": "Fire Ln 33", - "lat": "43.87067", - "lon": "-70.52351", - "id": 39571 - }, - { - "name": "Flintlock Drive", - "lat": "43.77972", - "lon": "-70.22377", - "id": 37406 - }, - { - "name": "Fogg Road", - "lat": "43.57744", - "lon": "-70.31076", - "id": 40412 - }, - { - "name": "Fore Street", - "lat": "43.65941", - "lon": "-70.25049", - "id": 13060 - }, - { - "name": "Foreside Road", - "lat": "43.70908", - "lon": "-70.23484", - "id": 32775 - }, - { - "name": "Fowler Road", - "lat": "43.58571", - "lon": "-70.22676", - "id": 39831 - }, - { - "name": "Fox Hill Road", - "lat": "43.60519", - "lon": "-70.23145", - "id": 36822 - }, - { - "name": "Fox Run", - "lat": "43.78924", - "lon": "-70.37531", - "id": 35299 - }, - { - "name": "Fox Run Road", - "lat": "43.81322", - "lon": "-70.28036", - "id": 36129 - }, - { - "name": "Fox Street", - "lat": "43.66391", - "lon": "-70.25883", - "id": 13096 - }, - { - "name": "Franklin Street", - "lat": "43.66127", - "lon": "-70.25465", - "id": 13057 - }, - { - "name": "Freeman Court", - "lat": "43.85239", - "lon": "-70.46099", - "id": 37077 - }, - { - "name": "Friar Lane", - "lat": "43.62196", - "lon": "-70.21989", - "id": 40987 - }, - { - "name": "Friendship Lane", - "lat": "43.60763", - "lon": "-70.40251", - "id": 34483 - }, - { - "name": "Frost Hill Road", - "lat": "43.71786", - "lon": "-70.28722", - "id": 12491 - }, - { - "name": "Frye Street", - "lat": "43.68435", - "lon": "-70.27821", - "id": 12883 - }, - { - "name": "Garden Lane", - "lat": "43.65918", - "lon": "-70.25291", - "id": 81248 - }, - { - "name": "Georgia Street", - "lat": "43.71650", - "lon": "-70.29402", - "id": 12493 - }, - { - "name": "Gerald Avenue", - "lat": "43.68789", - "lon": "-70.27731", - "id": 38042 - }, - { - "name": "Gibson Road", - "lat": "43.60734", - "lon": "-70.30405", - "id": 37076 - }, - { - "name": "Gilman Road", - "lat": "43.78611", - "lon": "-70.16330", - "id": 34447 - }, - { - "name": "Ginn Road", - "lat": "43.60530", - "lon": "-70.36664", - "id": 40442 - }, - { - "name": "Glen Avenue", - "lat": "43.63359", - "lon": "-70.22405", - "id": 32013 - }, - { - "name": "Glidden Road", - "lat": "43.80894", - "lon": "-70.48871", - "id": 34786 - }, - { - "name": "Goldenrod Lane", - "lat": "43.71963", - "lon": "-70.27647", - "id": 37923 - }, - { - "name": "Goodwin Lane", - "lat": "43.78908", - "lon": "-70.36548", - "id": 34372 - }, - { - "name": "Gordons Lane", - "lat": "43.61784", - "lon": "-70.23193", - "id": 32247 - }, - { - "name": "Gorham Road", - "lat": "43.62222", - "lon": "-70.35617", - "id": 77392 - }, - { - "name": "Granite Ridge Road", - "lat": "43.61942", - "lon": "-70.22727", - "id": 32867 - }, - { - "name": "Gray Road", - "names": { - "alt_name": "New Gray Road;State Route 26;State Route 100" - }, - "lat": "43.85133", - "lon": "-70.27364", - "id": 36541 - }, - { - "name": "Graystone Lane", - "lat": "43.69296", - "lon": "-70.27154", - "id": 12951 - }, - { - "name": "Graystone Road", - "lat": "43.61584", - "lon": "-70.22942", - "id": 35781 - }, - { - "name": "Green Acres Lane", - "lat": "43.60170", - "lon": "-70.32190", - "id": 32440 - }, - { - "name": "Green Road", - "lat": "43.63598", - "lon": "-70.37215", - "id": 32818 - }, - { - "name": "Griffin Road", - "lat": "43.56926", - "lon": "-70.38870", - "id": 36913 - }, - { - "name": "Grist Mill Lane", - "lat": "43.80152", - "lon": "-70.33464", - "id": 38566 - }, - { - "name": "Grover Road", - "lat": "43.58518", - "lon": "-70.22875", - "id": 40066 - }, - { - "name": "Gunstock Road", - "lat": "43.58299", - "lon": "-70.30441", - "id": 34494 - }, - { - "name": "Hadlock Road", - "lat": "43.77591", - "lon": "-70.29568", - "id": 40445 - }, - { - "name": "Hague Road", - "lat": "43.78471", - "lon": "-70.37031", - "id": 33087 - }, - { - "name": "Hall Street", - "lat": "43.68350", - "lon": "-70.27617", - "id": 12889 - }, - { - "name": "Hamlin Road", - "lat": "43.73022", - "lon": "-70.30452", - "id": 33932 - }, - { - "name": "Hamlin Street", - "lat": "43.62207", - "lon": "-70.24193", - "id": 80838 - }, - { - "name": "Hammond Road", - "lat": "43.70046", - "lon": "-70.23778", - "id": 39988 - }, - { - "name": "Hampshire Street", - "lat": "43.66086", - "lon": "-70.25308", - "id": 13062 - }, - { - "name": "Hancock Drive", - "lat": "43.77198", - "lon": "-70.37003", - "id": 81150 - }, - { - "name": "Hancock Street", - "lat": "43.66196", - "lon": "-70.24993", - "id": 13212 - }, - { - "name": "Harding Avenue", - "lat": "43.71101", - "lon": "-70.23562", - "id": 32897 - }, - { - "name": "Hardy Road", - "lat": "43.73799", - "lon": "-70.32452", - "id": 39553 - }, - { - "name": "Harlow Street", - "lat": "43.57151", - "lon": "-70.38593", - "id": 34644 - }, - { - "name": "Harpswell Islands Road", - "lat": "43.79532", - "lon": "-69.94540", - "id": 84912 - }, - { - "name": "Harris Road", - "lat": "43.76812", - "lon": "-70.23585", - "id": 32598 - }, - { - "name": "Harrison Avenue", - "lat": "43.61986", - "lon": "-70.24781", - "id": 38927 - }, - { - "name": "Haskell Road", - "lat": "43.85160", - "lon": "-70.28270", - "id": 38429 - }, - { - "name": "Haven Road", - "lat": "43.76920", - "lon": "-70.36271", - "id": 38638 - }, - { - "name": "Hawthorn Road", - "lat": "43.59882", - "lon": "-70.26222", - "id": 34420 - }, - { - "name": "Hawthorne Road", - "lat": "43.84217", - "lon": "-70.19114", - "id": 80585 - }, - { - "name": "Hearn Road", - "lat": "43.57615", - "lon": "-70.41852", - "id": 35195 - }, - { - "name": "Heather Drive", - "lat": "43.71257", - "lon": "-70.28046", - "id": 12966 - }, - { - "name": "Heather Lane", - "lat": "43.78434", - "lon": "-69.95836", - "id": 33866 - }, - { - "name": "Hemingway Street", - "lat": "43.68929", - "lon": "-70.30452", - "id": 34207 - }, - { - "name": "Hemlock Circle", - "lat": "43.57183", - "lon": "-70.34132", - "id": 40904 - }, - { - "name": "Hemlock Hill Road", - "lat": "43.62541", - "lon": "-70.23231", - "id": 35580 - }, - { - "name": "Hemlock Lane", - "lat": "43.73788", - "lon": "-70.26437", - "id": 34035 - }, - { - "name": "Hemlock Road", - "lat": "43.86170", - "lon": "-70.46652", - "id": 41355 - }, - { - "name": "Henderson Court", - "lat": "43.85327", - "lon": "-70.46463", - "id": 40488 - }, - { - "name": "Heritage Lane", - "lat": "43.76070", - "lon": "-70.20459", - "id": 41088 - }, - { - "name": "Heron Lane", - "lat": "43.75519", - "lon": "-70.20298", - "id": 37399 - }, - { - "name": "Hickory Lane", - "lat": "43.84435", - "lon": "-70.26246", - "id": 35029 - }, - { - "name": "Hicks Street", - "lat": "43.68839", - "lon": "-70.30673", - "id": 12845 - }, - { - "name": "Hidden Creek Lane", - "lat": "43.81676", - "lon": "-70.47199", - "id": 38465 - }, - { - "name": "Hideaway Lane", - "lat": "43.83850", - "lon": "-70.48120", - "id": 36586 - }, - { - "name": "Higgins Street", - "lat": "43.57123", - "lon": "-70.38440", - "id": 34762 - }, - { - "name": "High Point Road", - "lat": "43.56506", - "lon": "-70.34048", - "id": 32050 - }, - { - "name": "Highland Avenue", - "lat": "43.58024", - "lon": "-70.31741", - "id": 78056 - }, - { - "name": "Highview Road", - "lat": "43.58358", - "lon": "-70.21171", - "id": 40764 - }, - { - "name": "Hill Road", - "lat": "43.79568", - "lon": "-69.94514", - "id": 35305 - }, - { - "name": "Hill Way", - "lat": "43.56963", - "lon": "-70.22285", - "id": 33100 - }, - { - "name": "Hillcrest Avenue", - "lat": "43.59993", - "lon": "-70.31990", - "id": 38936 - }, - { - "name": "Hillcrest Drive", - "lat": "43.60153", - "lon": "-70.21794", - "id": 38217 - }, - { - "name": "Hillside Avenue", - "lat": "43.79280", - "lon": "-70.21283", - "id": 40156 - }, - { - "name": "Hillside Road", - "lat": "43.71633", - "lon": "-70.29046", - "id": 12494 - }, - { - "name": "Hilltop Drive", - "lat": "43.78062", - "lon": "-69.95263", - "id": 38434 - }, - { - "name": "Hodsdon Road", - "lat": "43.84482", - "lon": "-70.17225", - "id": 22946 - }, - { - "name": "Holmes Road", - "lat": "43.60878", - "lon": "-70.36183", - "id": 40228 - }, - { - "name": "Homestead Lane", - "lat": "43.82013", - "lon": "-70.28261", - "id": 39766 - }, - { - "name": "Hope Avenue", - "lat": "43.72265", - "lon": "-70.28641", - "id": 12344 - }, - { - "name": "Hope Lane", - "lat": "43.72343", - "lon": "-70.28939", - "id": 12474 - }, - { - "name": "Horseshoe Drive", - "lat": "43.57207", - "lon": "-70.31913", - "id": 33289 - }, - { - "name": "Howard Lane", - "lat": "43.60650", - "lon": "-70.42112", - "id": 77375 - }, - { - "name": "Hudson Avenue", - "lat": "43.59898", - "lon": "-70.32379", - "id": 32178 - }, - { - "name": "Hummingbird Lane", - "lat": "43.57748", - "lon": "-70.33868", - "id": 33601 - }, - { - "name": "Hunnewell Avenue", - "lat": "43.56533", - "lon": "-70.33237", - "id": 33193 - }, - { - "name": "Hunnewell Road", - "lat": "43.60446", - "lon": "-70.32819", - "id": 33492 - }, - { - "name": "Hunter Road", - "lat": "43.86487", - "lon": "-70.14734", - "id": 83728 - }, - { - "name": "Hunter Way", - "lat": "43.81329", - "lon": "-70.28014", - "id": 33217 - }, - { - "name": "Hurricane Road", - "lat": "43.79317", - "lon": "-70.32138", - "id": 40918 - }, - { - "name": "Hutchins Drive", - "lat": "43.65468", - "lon": "-70.33977", - "id": 13526 - }, - { - "name": "Ice House Road", - "lat": "43.77760", - "lon": "-70.36475", - "id": 32694 - }, - { - "name": "Indian Hill Lane", - "lat": "43.56691", - "lon": "-70.33773", - "id": 36427 - }, - { - "name": "Ironclad Road", - "lat": "43.58181", - "lon": "-70.29536", - "id": 40815 - }, - { - "name": "Island Cove Road", - "lat": "43.86467", - "lon": "-70.51405", - "id": 39519 - }, - { - "name": "Island Pond Road", - "lat": "43.75109", - "lon": "-70.20588", - "id": 39538 - }, - { - "name": "Island View Drive", - "lat": "43.77723", - "lon": "-70.18253", - "id": 36574 - }, - { - "name": "Island View Lane", - "lat": "43.81688", - "lon": "-70.05977", - "id": 33214 - }, - { - "name": "Jackson Street", - "lat": "43.71535", - "lon": "-70.28881", - "id": 12969 - }, - { - "name": "James Way", - "lat": "43.82107", - "lon": "-70.34018", - "id": 33265 - }, - { - "name": "Jetport Road", - "lat": "43.64997", - "lon": "-70.33653", - "id": 38498 - }, - { - "name": "Jewett Road", - "lat": "43.58266", - "lon": "-70.22935", - "id": 37582 - }, - { - "name": "Joes Road", - "lat": "43.78223", - "lon": "-70.37368", - "id": 40512 - }, - { - "name": "Johnson Road", - "lat": "43.61366", - "lon": "-70.41254", - "id": 32524 - }, - { - "name": "Juniper Drive", - "lat": "43.74876", - "lon": "-70.37080", - "id": 35367 - }, - { - "name": "Juniper Lane", - "lat": "43.73267", - "lon": "-70.27591", - "id": 32392 - }, - { - "name": "Juniper Street", - "lat": "43.71419", - "lon": "-70.28497", - "id": 12971 - }, - { - "name": "Karen Avenue", - "lat": "43.78098", - "lon": "-70.43790", - "id": 32095 - }, - { - "name": "Kelly Road", - "lat": "43.70023", - "lon": "-70.24212", - "id": 34703 - }, - { - "name": "Kennard Road", - "lat": "43.84867", - "lon": "-70.46599", - "id": 34540 - }, - { - "name": "Kennedy Park", - "lat": "43.66447", - "lon": "-70.25639", - "id": 13139 - }, - { - "name": "Kenneth Street", - "lat": "43.71456", - "lon": "-70.29070", - "id": 12957 - }, - { - "name": "Kerri Drive", - "lat": "43.84160", - "lon": "-70.29531", - "id": 38911 - }, - { - "name": "Kettle Cove Road", - "lat": "43.56778", - "lon": "-70.22053", - "id": 35358 - }, - { - "name": "Kimberly Lane", - "lat": "43.72670", - "lon": "-70.31104", - "id": 33028 - }, - { - "name": "Kineo Street", - "lat": "43.68455", - "lon": "-70.27759", - "id": 12731 - }, - { - "name": "King Street", - "lat": "43.68913", - "lon": "-70.30297", - "id": 13031 - }, - { - "name": "Kingfisher Cove", - "lat": "43.77441", - "lon": "-70.15766", - "id": 37093 - }, - { - "name": "Kingfisher Drive", - "lat": "43.55880", - "lon": "-70.30508", - "id": 36436 - }, - { - "name": "Labrador Lane", - "lat": "43.59952", - "lon": "-70.45414", - "id": 83587 - }, - { - "name": "Ladyslipper Lane", - "lat": "43.86082", - "lon": "-70.14592", - "id": 34248 - }, - { - "name": "Lake Avenue", - "lat": "43.86425", - "lon": "-70.46783", - "id": 36584 - }, - { - "name": "Lambert Road", - "lat": "43.80774", - "lon": "-70.14065", - "id": 39276 - }, - { - "name": "Lambert Street", - "lat": "43.71645", - "lon": "-70.29321", - "id": 12343 - }, - { - "name": "Lancaster Street", - "lat": "43.66290", - "lon": "-70.25808", - "id": 39179 - }, - { - "name": "Lawson Road", - "lat": "43.61091", - "lon": "-70.21388", - "id": 40011 - }, - { - "name": "Ledge Road", - "lat": "43.83511", - "lon": "-70.18588", - "id": 35901 - }, - { - "name": "Ledgewood Drive", - "lat": "43.70144", - "lon": "-70.26089", - "id": 12744 - }, - { - "name": "Ledgewood Lane", - "lat": "43.57649", - "lon": "-70.21139", - "id": 32256 - }, - { - "name": "Leighton Road", - "lat": "43.73362", - "lon": "-70.30430", - "id": 33130 - }, - { - "name": "Leighton Street", - "lat": "43.76913", - "lon": "-70.26922", - "id": 84490 - }, - { - "name": "Liberty Road", - "lat": "43.72715", - "lon": "-70.29383", - "id": 31952 - }, - { - "name": "Lilac Drive", - "lat": "43.74780", - "lon": "-70.37668", - "id": 36143 - }, - { - "name": "Lilac Lane", - "lat": "43.58599", - "lon": "-70.31050", - "id": 32924 - }, - { - "name": "Lillian Way", - "lat": "43.59523", - "lon": "-70.37065", - "id": 40017 - }, - { - "name": "Lincoln Avenue", - "lat": "43.58181", - "lon": "-70.35795", - "id": 35108 - }, - { - "name": "Linda Lane", - "lat": "43.77116", - "lon": "-70.37743", - "id": 40469 - }, - { - "name": "Little Duck Pond Road", - "lat": "43.79774", - "lon": "-70.36022", - "id": 31951 - }, - { - "name": "Littlefield Lane", - "lat": "43.59808", - "lon": "-70.32600", - "id": 33522 - }, - { - "name": "Lloyd Avenue", - "lat": "43.68648", - "lon": "-70.27426", - "id": 34155 - }, - { - "name": "Locksley Road", - "lat": "43.62230", - "lon": "-70.22283", - "id": 34452 - }, - { - "name": "Locust Street", - "lat": "43.66217", - "lon": "-70.25345", - "id": 13148 - }, - { - "name": "Long Lane Road", - "lat": "43.79085", - "lon": "-70.36911", - "id": 38765 - }, - { - "name": "Long Point Road", - "lat": "43.77266", - "lon": "-69.94102", - "id": 36495 - }, - { - "name": "Longview Drive", - "lat": "43.72273", - "lon": "-70.29059", - "id": 12476 - }, - { - "name": "Longwoods Road", - "names": { - "alt_name": "State Route 9" - }, - "lat": "43.75992", - "lon": "-70.24261", - "id": 32173 - }, - { - "name": "Lookout Lane", - "lat": "43.77072", - "lon": "-70.37732", - "id": 36850 - }, - { - "name": "Loraine Street", - "lat": "43.68395", - "lon": "-70.27652", - "id": 12886 - }, - { - "name": "Lucky Lane", - "lat": "43.79483", - "lon": "-69.93879", - "id": 34525 - }, - { - "name": "Lunt Road", - "lat": "43.72557", - "lon": "-70.24585", - "id": 35194 - }, - { - "name": "Lyons Point Road", - "lat": "43.88787", - "lon": "-70.42073", - "id": 36491 - }, - { - "name": "Mackenzie Lane", - "lat": "43.74056", - "lon": "-70.23716", - "id": 82001 - }, - { - "name": "Madison Drive", - "lat": "43.59059", - "lon": "-70.36973", - "id": 33083 - }, - { - "name": "Main Street", - "lat": "43.61012", - "lon": "-70.31319", - "id": 36749 - }, - { - "name": "Maine Turnpike", - "lat": "43.71600", - "lon": "-70.30611", - "id": 77278 - }, - { - "name": "Malilly Road", - "lat": "43.69003", - "lon": "-70.27486", - "id": 84585 - }, - { - "name": "Manor Way", - "lat": "43.61147", - "lon": "-70.22233", - "id": 41233 - }, - { - "name": "Maple Avenue", - "lat": "43.60338", - "lon": "-70.32979", - "id": 36872 - }, - { - "name": "Marginal Way", - "lat": "43.66357", - "lon": "-70.26158", - "id": 79341 - }, - { - "name": "Marigold Lane", - "lat": "43.71912", - "lon": "-70.23914", - "id": 80846 - }, - { - "name": "Marshview Circle", - "lat": "43.80369", - "lon": "-70.15794", - "id": 32808 - }, - { - "name": "Marshview Drive", - "lat": "43.80827", - "lon": "-70.14138", - "id": 39182 - }, - { - "name": "Marston Street", - "lat": "43.73754", - "lon": "-70.29911", - "id": 40780 - }, - { - "name": "Martin Avenue", - "lat": "43.57055", - "lon": "-70.39357", - "id": 39018 - }, - { - "name": "Mason Lane", - "lat": "43.81575", - "lon": "-70.47805", - "id": 39289 - }, - { - "name": "Mast Road", - "lat": "43.75615", - "lon": "-70.34428", - "id": 41001 - }, - { - "name": "Maxwell Lane", - "lat": "43.61879", - "lon": "-70.24330", - "id": 86175 - }, - { - "name": "Mayflower Road", - "lat": "43.71822", - "lon": "-70.27688", - "id": 38902 - }, - { - "name": "Mayo Street", - "lat": "43.66393", - "lon": "-70.25600", - "id": 13141 - }, - { - "name": "McIntosh Lane", - "lat": "43.79579", - "lon": "-70.36552", - "id": 41210 - }, - { - "name": "Mcalister Farm Road", - "lat": "43.69087", - "lon": "-70.33119", - "id": 12568 - }, - { - "name": "Meadowview Lane", - "lat": "43.61582", - "lon": "-70.23330", - "id": 32450 - }, - { - "name": "Meeting House Road", - "lat": "43.60791", - "lon": "-70.32995", - "id": 41081 - }, - { - "name": "Memory Lane", - "lat": "43.59772", - "lon": "-70.37509", - "id": 37918 - }, - { - "name": "Merrill Road", - "lat": "43.86773", - "lon": "-70.15421", - "id": 22986 - }, - { - "name": "Middle Road", - "lat": "43.75005", - "lon": "-70.22448", - "id": 38289 - }, - { - "name": "Middle Street", - "lat": "43.65946", - "lon": "-70.25124", - "id": 1114 - }, - { - "name": "Miles Road", - "lat": "43.74901", - "lon": "-70.39254", - "id": 81155 - }, - { - "name": "Mill Ridge Road", - "lat": "43.87306", - "lon": "-70.26083", - "id": 36203 - }, - { - "name": "Mill Road", - "lat": "43.86945", - "lon": "-70.25995", - "id": 35710 - }, - { - "name": "Millbrook Road", - "lat": "43.58958", - "lon": "-70.34866", - "id": 37588 - }, - { - "name": "Milliken Road", - "lat": "43.57748", - "lon": "-70.37833", - "id": 34632 - }, - { - "name": "Mineral Springs Road", - "lat": "43.85714", - "lon": "-70.46738", - "id": 37215 - }, - { - "name": "Minuteman Drive", - "lat": "43.58316", - "lon": "-70.29415", - "id": 38246 - }, - { - "name": "Misty Lane", - "lat": "43.57678", - "lon": "-70.21199", - "id": 33642 - }, - { - "name": "Mitchell Hill Road", - "lat": "43.61717", - "lon": "-70.42507", - "id": 32614 - }, - { - "name": "Mitchell Road", - "lat": "43.62127", - "lon": "-70.23396", - "id": 32881 - }, - { - "name": "Montgomery Road", - "lat": "43.74434", - "lon": "-70.39844", - "id": 32356 - }, - { - "name": "Morgan Lane", - "lat": "43.75332", - "lon": "-70.38106", - "id": 41265 - }, - { - "name": "Morningstar Lane", - "lat": "43.71803", - "lon": "-70.29679", - "id": 12489 - }, - { - "name": "Morton Road", - "lat": "43.77658", - "lon": "-70.16343", - "id": 41049 - }, - { - "name": "Moulton Beach Road", - "lat": "43.75462", - "lon": "-70.09945", - "id": 34474 - }, - { - "name": "Mount Hunger Shore Road", - "lat": "43.86450", - "lon": "-70.43247", - "id": 41013 - }, - { - "name": "Mountain Road", - "lat": "43.75239", - "lon": "-70.31505", - "id": 40947 - }, - { - "name": "Mourning Dove Lane", - "lat": "43.86274", - "lon": "-70.42002", - "id": 33508 - }, - { - "name": "Murray Street", - "lat": "43.68746", - "lon": "-70.27892", - "id": 12707 - }, - { - "name": "Mussey Road", - "lat": "43.62221", - "lon": "-70.33467", - "id": 35075 - }, - { - "name": "Natures Way", - "lat": "43.78831", - "lon": "-70.60789", - "id": 39466 - }, - { - "name": "New Gloucester Road", - "lat": "43.87918", - "lon": "-70.24738", - "id": 32195 - }, - { - "name": "New Road", - "lat": "43.62947", - "lon": "-70.36550", - "id": 32015 - }, - { - "name": "Newbury Street", - "lat": "43.66086", - "lon": "-70.25090", - "id": 13089 - }, - { - "name": "Nicholas Drive", - "lat": "43.77796", - "lon": "-70.38232", - "id": 34142 - }, - { - "name": "Nonesuch Road", - "lat": "43.62752", - "lon": "-70.42704", - "id": 39842 - }, - { - "name": "North Street", - "lat": "43.56996", - "lon": "-70.38874", - "id": 1587 - }, - { - "name": "Nottingham Drive", - "lat": "43.60852", - "lon": "-70.39108", - "id": 38259 - }, - { - "name": "Oak Hill Road", - "lat": "43.76042", - "lon": "-70.59083", - "id": 41284 - }, - { - "name": "Oakland Road", - "lat": "43.71138", - "lon": "-70.25828", - "id": 35071 - }, - { - "name": "Oakmont Drive", - "lat": "43.73766", - "lon": "-70.25276", - "id": 39266 - }, - { - "name": "Oakview Drive", - "lat": "43.60825", - "lon": "-70.23658", - "id": 35237 - }, - { - "name": "Ocean Avenue", - "lat": "43.69518", - "lon": "-70.26310", - "id": 12335 - }, - { - "name": "Ocean Gateway Pier", - "lat": "43.65910", - "lon": "-70.24540", - "id": 13169 - }, - { - "name": "Ocean House Road", - "lat": "43.60794", - "lon": "-70.23789", - "id": 35361 - }, - { - "name": "Old Barn Lane", - "lat": "43.71685", - "lon": "-70.28699", - "id": 12492 - }, - { - "name": "Old Blue Point Road", - "lat": "43.55514", - "lon": "-70.37904", - "id": 78111 - }, - { - "name": "Old Colony Lane", - "lat": "43.58042", - "lon": "-70.29242", - "id": 33658 - }, - { - "name": "Old County Road", - "lat": "43.77449", - "lon": "-70.39872", - "id": 38106 - }, - { - "name": "Old Farm Road", - "lat": "43.80112", - "lon": "-70.31134", - "id": 37570 - }, - { - "name": "Old Fort Road", - "lat": "43.62200", - "lon": "-70.21903", - "id": 36035 - }, - { - "name": "Old Mill Road", - "lat": "43.57610", - "lon": "-70.33722", - "id": 40672 - }, - { - "name": "Old Ocean House Road", - "lat": "43.58535", - "lon": "-70.21892", - "id": 35207 - }, - { - "name": "Olde Birch Lane", - "lat": "43.71378", - "lon": "-70.28171", - "id": 12973 - }, - { - "name": "Orchard Hill Road", - "lat": "43.56472", - "lon": "-70.34396", - "id": 36588 - }, - { - "name": "Orchard Road", - "lat": "43.78826", - "lon": "-70.35816", - "id": 38699 - }, - { - "name": "Orchard Street", - "lat": "43.56823", - "lon": "-70.38655", - "id": 38247 - }, - { - "name": "Oriole Street", - "lat": "43.73684", - "lon": "-70.30012", - "id": 35294 - }, - { - "name": "Orion Way", - "lat": "43.79577", - "lon": "-70.36844", - "id": 35766 - }, - { - "name": "Osprey Cove Lane", - "lat": "43.83920", - "lon": "-70.05149", - "id": 34517 - }, - { - "name": "Overlook Drive", - "lat": "43.60720", - "lon": "-70.33052", - "id": 31948 - }, - { - "name": "Overlook Road", - "lat": "43.78408", - "lon": "-70.37338", - "id": 32974 - }, - { - "name": "Oxford Street", - "lat": "43.66172", - "lon": "-70.25746", - "id": 13214 - }, - { - "name": "Palmer Avenue", - "lat": "43.71372", - "lon": "-70.30216", - "id": 12398 - }, - { - "name": "Paradise Way", - "lat": "43.77711", - "lon": "-69.94499", - "id": 32497 - }, - { - "name": "Park Avenue", - "lat": "43.60353", - "lon": "-70.32876", - "id": 36773 - }, - { - "name": "Park Circle", - "lat": "43.59730", - "lon": "-70.27373", - "id": 40692 - }, - { - "name": "Parkway Drive", - "lat": "43.59917", - "lon": "-70.29958", - "id": 32369 - }, - { - "name": "Partridge Lane", - "lat": "43.57498", - "lon": "-70.34119", - "id": 40436 - }, - { - "name": "Patricia Lane", - "lat": "43.72278", - "lon": "-70.29111", - "id": 12475 - }, - { - "name": "Payeur Circle", - "lat": "43.71566", - "lon": "-70.27596", - "id": 37628 - }, - { - "name": "Payne Road", - "lat": "43.62820", - "lon": "-70.34497", - "id": 40789 - }, - { - "name": "Payson Road", - "lat": "43.69915", - "lon": "-70.23879", - "id": 38677 - }, - { - "name": "Pearl Street", - "lat": "43.66278", - "lon": "-70.26004", - "id": 13084 - }, - { - "name": "Pheasant Hill Drive", - "lat": "43.69214", - "lon": "-70.27145", - "id": 12646 - }, - { - "name": "Phillips Road", - "lat": "43.69841", - "lon": "-70.23894", - "id": 32306 - }, - { - "name": "Pilgrim Drive", - "lat": "43.59373", - "lon": "-70.37541", - "id": 39227 - }, - { - "name": "Pilgrim Road", - "lat": "43.81733", - "lon": "-70.47998", - "id": 32727 - }, - { - "name": "Pilot Point Road", - "lat": "43.57932", - "lon": "-70.20901", - "id": 36154 - }, - { - "name": "Pine Drive", - "lat": "43.81933", - "lon": "-70.48571", - "id": 34724 - }, - { - "name": "Pine Point Road", - "lat": "43.56713", - "lon": "-70.37651", - "id": 35496 - }, - { - "name": "Pine Ridge Road", - "lat": "43.83691", - "lon": "-70.20210", - "id": 33834 - }, - { - "name": "Pine Road", - "lat": "43.71008", - "lon": "-70.25705", - "id": 37992 - }, - { - "name": "Pineloch Drive", - "lat": "43.71268", - "lon": "-70.27800", - "id": 12752 - }, - { - "name": "Pineview Road", - "lat": "43.73445", - "lon": "-70.30484", - "id": 33488 - }, - { - "name": "Pinewood Drive", - "lat": "43.73411", - "lon": "-70.26463", - "id": 32673 - }, - { - "name": "Pintail Lane", - "lat": "43.77061", - "lon": "-69.94259", - "id": 37305 - }, - { - "name": "Pioneer Road", - "lat": "43.75070", - "lon": "-70.40496", - "id": 40868 - }, - { - "name": "Pit Road", - "lat": "43.60894", - "lon": "-70.38108", - "id": 79386 - }, - { - "name": "Plantation Drive", - "lat": "43.58515", - "lon": "-70.36966", - "id": 37815 - }, - { - "name": "Pleasant Avenue", - "lat": "43.61155", - "lon": "-70.25057", - "id": 41366 - }, - { - "name": "Pleasant Hill Road", - "lat": "43.57874", - "lon": "-70.28769", - "id": 76973 - }, - { - "name": "Pleasant Valley Road", - "lat": "43.82440", - "lon": "-70.28051", - "id": 33960 - }, - { - "name": "Plover Lane", - "lat": "43.55853", - "lon": "-70.30531", - "id": 37375 - }, - { - "name": "Plymouth Drive", - "lat": "43.59301", - "lon": "-70.37601", - "id": 37784 - }, - { - "name": "Point Road", - "lat": "43.61021", - "lon": "-70.21354", - "id": 33475 - }, - { - "name": "Pond Road", - "lat": "43.78264", - "lon": "-70.50212", - "id": 41403 - }, - { - "name": "Pond View Drive", - "lat": "43.60297", - "lon": "-70.29589", - "id": 34381 - }, - { - "name": "Pond View Road", - "lat": "43.78587", - "lon": "-70.49858", - "id": 37458 - }, - { - "name": "Pondview Road", - "lat": "43.57484", - "lon": "-70.22193", - "id": 35149 - }, - { - "name": "Pope Road", - "lat": "43.76700", - "lon": "-70.39164", - "id": 33746 - }, - { - "name": "Poplar Ridge Road", - "lat": "43.80365", - "lon": "-70.33231", - "id": 32638 - }, - { - "name": "Pownal Road", - "lat": "43.87254", - "lon": "-70.14386", - "id": 83877 - }, - { - "name": "Presumpscot Street", - "lat": "43.69552", - "lon": "-70.25851", - "id": 12330 - }, - { - "name": "Pride Farm Road", - "lat": "43.77063", - "lon": "-70.35194", - "id": 33680 - }, - { - "name": "Princes Point Road", - "lat": "43.78186", - "lon": "-70.16766", - "id": 33919 - }, - { - "name": "Providence Avenue", - "lat": "43.71001", - "lon": "-70.23684", - "id": 76953 - }, - { - "name": "Pumpkin Lane", - "lat": "43.58655", - "lon": "-70.28924", - "id": 40503 - }, - { - "name": "Puritan Drive", - "lat": "43.59439", - "lon": "-70.37471", - "id": 38080 - }, - { - "name": "Quahog Lane", - "lat": "43.78749", - "lon": "-69.93206", - "id": 36356 - }, - { - "name": "Quarry Road", - "lat": "43.78790", - "lon": "-70.14670", - "id": 39617 - }, - { - "name": "Quiet Lane", - "lat": "43.71791", - "lon": "-70.28827", - "id": 12351 - }, - { - "name": "Rabbit Way", - "lat": "43.76008", - "lon": "-70.27403", - "id": 78559 - }, - { - "name": "Range Road", - "lat": "43.78951", - "lon": "-70.28342", - "id": 32899 - }, - { - "name": "Range Way", - "lat": "43.75992", - "lon": "-70.22298", - "id": 36022 - }, - { - "name": "Ravine Trail", - "lat": "43.78793", - "lon": "-70.22699", - "id": 77741 - }, - { - "name": "Reef Road", - "lat": "43.58403", - "lon": "-70.20843", - "id": 39418 - }, - { - "name": "Rice Street", - "lat": "43.71066", - "lon": "-70.30482", - "id": 12403 - }, - { - "name": "Richards Road", - "lat": "43.85783", - "lon": "-70.44805", - "id": 33808 - }, - { - "name": "Ridge Lane", - "lat": "43.74800", - "lon": "-70.32411", - "id": 38964 - }, - { - "name": "Ridge Road", - "lat": "43.69504", - "lon": "-70.26433", - "id": 12940 - }, - { - "name": "Ridgewood Estates", - "lat": "43.72847", - "lon": "-70.25319", - "id": 82000 - }, - { - "name": "Rigby Road", - "lat": "43.60446", - "lon": "-70.30083", - "id": 39866 - }, - { - "name": "River Road", - "lat": "43.72259", - "lon": "-70.40097", - "id": 85650 - }, - { - "name": "River Trail", - "lat": "43.78104", - "lon": "-70.31791", - "id": 81333 - }, - { - "name": "Riverside Drive", - "lat": "43.69784", - "lon": "-70.24407", - "id": 33080 - }, - { - "name": "Riverside Industrial Parkway", - "lat": "43.71363", - "lon": "-70.30398", - "id": 12399 - }, - { - "name": "Riverside Street", - "lat": "43.71338", - "lon": "-70.31098", - "id": 425 - }, - { - "name": "Roaring Brook Road", - "lat": "43.71271", - "lon": "-70.27911", - "id": 12751 - }, - { - "name": "Roberts Street", - "lat": "43.72546", - "lon": "-70.29581", - "id": 33557 - }, - { - "name": "Robin Lane", - "lat": "43.72777", - "lon": "-70.31726", - "id": 32387 - }, - { - "name": "Robinhood Road", - "lat": "43.62312", - "lon": "-70.22036", - "id": 32874 - }, - { - "name": "Rock Ridge", - "lat": "43.76556", - "lon": "-70.22851", - "id": 32026 - }, - { - "name": "Rocky Hill Road", - "lat": "43.56861", - "lon": "-70.34067", - "id": 35754 - }, - { - "name": "Rolling Hill Drive", - "lat": "43.74963", - "lon": "-70.39365", - "id": 81161 - }, - { - "name": "Roosevelt Trail", - "lat": "43.76263", - "lon": "-70.37252", - "id": 76966 - }, - { - "name": "Roundabout Lane", - "lat": "43.57451", - "lon": "-70.21066", - "id": 36297 - }, - { - "name": "Route 1", - "lat": "43.71881", - "lon": "-70.23422", - "id": 1526 - }, - { - "name": "Royal Road", - "lat": "43.85540", - "lon": "-70.18667", - "id": 23000 - }, - { - "name": "Running Brook Lane", - "lat": "43.72820", - "lon": "-70.31814", - "id": 34745 - }, - { - "name": "Running Brook Road", - "lat": "43.72831", - "lon": "-70.31971", - "id": 32535 - }, - { - "name": "Running Hill Road", - "lat": "43.63493", - "lon": "-70.36838", - "id": 35768 - }, - { - "name": "Russell Hill Road", - "lat": "43.78383", - "lon": "-70.15144", - "id": 34467 - }, - { - "name": "Russell Road", - "lat": "43.74540", - "lon": "-70.19725", - "id": 36796 - }, - { - "name": "Ryefield Drive", - "lat": "43.56441", - "lon": "-70.38760", - "id": 38745 - }, - { - "name": "Salt Marsh Circle", - "lat": "43.56438", - "lon": "-70.34374", - "id": 35080 - }, - { - "name": "Sand Beach Road", - "lat": "43.83795", - "lon": "-70.48019", - "id": 39864 - }, - { - "name": "Sanderson Road", - "lat": "43.74772", - "lon": "-70.19345", - "id": 33446 - }, - { - "name": "Sandy Point", - "lat": "43.56687", - "lon": "-70.34409", - "id": 39398 - }, - { - "name": "Sandy Point Road", - "lat": "43.56586", - "lon": "-70.34445", - "id": 33208 - }, - { - "name": "Sargent Road", - "lat": "43.58146", - "lon": "-70.38460", - "id": 33381 - }, - { - "name": "Sawyer Road", - "lat": "43.60084", - "lon": "-70.34494", - "id": 33073 - }, - { - "name": "Sawyer Street", - "lat": "43.62011", - "lon": "-70.25572", - "id": 32793 - }, - { - "name": "Scarborough Beach State Park", - "lat": "43.54611", - "lon": "-70.31282", - "id": 31980 - }, - { - "name": "Scarborough Connector", - "lat": "43.60293", - "lon": "-70.31855", - "id": 31962 - }, - { - "name": "Seacove Road", - "lat": "43.74968", - "lon": "-70.19991", - "id": 37826 - }, - { - "name": "Seal Ledge Lane", - "lat": "43.79314", - "lon": "-69.94205", - "id": 39259 - }, - { - "name": "Sebago Avenue", - "lat": "43.86679", - "lon": "-70.46700", - "id": 41059 - }, - { - "name": "Sequoia Lane", - "lat": "43.60580", - "lon": "-70.32645", - "id": 40448 - }, - { - "name": "Serenity Drive", - "lat": "43.59256", - "lon": "-70.31780", - "id": 34864 - }, - { - "name": "Shaw Road", - "lat": "43.78202", - "lon": "-70.30267", - "id": 34332 - }, - { - "name": "Shirley Lane", - "lat": "43.75597", - "lon": "-70.21671", - "id": 32265 - }, - { - "name": "Shore Drive", - "lat": "43.82032", - "lon": "-70.06408", - "id": 40809 - }, - { - "name": "Shore Road", - "lat": "43.60322", - "lon": "-70.21682", - "id": 33762 - }, - { - "name": "Short Road", - "lat": "43.58369", - "lon": "-70.23109", - "id": 37676 - }, - { - "name": "Skillings Road", - "lat": "43.87036", - "lon": "-70.40657", - "id": 41262 - }, - { - "name": "Skyway Drive", - "lat": "43.64896", - "lon": "-70.33490", - "id": 13622 - }, - { - "name": "Sleepy Hollow Road", - "lat": "43.86212", - "lon": "-70.46627", - "id": 34309 - }, - { - "name": "Sligo Road", - "lat": "43.83806", - "lon": "-70.22420", - "id": 82545 - }, - { - "name": "Slocum Drive", - "lat": "43.70367", - "lon": "-70.26308", - "id": 33052 - }, - { - "name": "Smith Lane", - "lat": "43.86794", - "lon": "-70.14925", - "id": 37347 - }, - { - "name": "Smith Street", - "lat": "43.66298", - "lon": "-70.25283", - "id": 13266 - }, - { - "name": "Smugglers Cove Road", - "lat": "43.60406", - "lon": "-70.21585", - "id": 38306 - }, - { - "name": "Snowdrift Lane", - "lat": "43.78096", - "lon": "-70.15790", - "id": 41531 - }, - { - "name": "Snowmobile Falmouth Trail", - "lat": "43.81798", - "lon": "-70.35009", - "id": 80787 - }, - { - "name": "Somerset Street", - "lat": "43.66339", - "lon": "-70.25991", - "id": 13210 - }, - { - "name": "South Ridge Drive", - "lat": "43.78621", - "lon": "-70.48918", - "id": 35131 - }, - { - "name": "South Street", - "lat": "43.62315", - "lon": "-70.24229", - "id": 83974 - }, - { - "name": "Southborough Drive", - "lat": "43.62839", - "lon": "-70.34327", - "id": 34351 - }, - { - "name": "Southgate Road", - "lat": "43.57964", - "lon": "-70.36477", - "id": 40492 - }, - { - "name": "Spring Brook Lane", - "lat": "43.59634", - "lon": "-70.41475", - "id": 35095 - }, - { - "name": "Spruce Circle", - "lat": "43.57296", - "lon": "-70.33984", - "id": 37416 - }, - { - "name": "Spruce Lane", - "lat": "43.73772", - "lon": "-70.25120", - "id": 34103 - }, - { - "name": "Sprucewood Lane", - "lat": "43.73007", - "lon": "-70.25450", - "id": 85698 - }, - { - "name": "Spurwink Road", - "lat": "43.58033", - "lon": "-70.26720", - "id": 76974 - }, - { - "name": "Squirrel Lane", - "lat": "43.78821", - "lon": "-70.14771", - "id": 40914 - }, - { - "name": "Stagecoach Road", - "lat": "43.74910", - "lon": "-70.32231", - "id": 32359 - }, - { - "name": "Stanhope Lane", - "lat": "43.76559", - "lon": "-70.24708", - "id": 80179 - }, - { - "name": "Starbird Road", - "lat": "43.57397", - "lon": "-70.27469", - "id": 40394 - }, - { - "name": "Starboard Lane", - "lat": "43.74797", - "lon": "-70.19598", - "id": 32231 - }, - { - "name": "Starboard Reach", - "lat": "43.78257", - "lon": "-70.18414", - "id": 37421 - }, - { - "name": "Steele Road", - "lat": "43.88888", - "lon": "-70.41236", - "id": 40195 - }, - { - "name": "Stewart Drive", - "lat": "43.56452", - "lon": "-70.39779", - "id": 1446 - }, - { - "name": "Stone Road", - "lat": "43.56562", - "lon": "-70.31503", - "id": 32537 - }, - { - "name": "Stonecrest Drive", - "lat": "43.71926", - "lon": "-70.29939", - "id": 12486 - }, - { - "name": "Stornoway Road", - "lat": "43.74020", - "lon": "-70.19772", - "id": 32298 - }, - { - "name": "Strawberry Lane", - "lat": "43.56195", - "lon": "-70.30750", - "id": 41182 - }, - { - "name": "Sulky Way", - "lat": "43.76146", - "lon": "-70.30535", - "id": 33626 - }, - { - "name": "Summer Place", - "lat": "43.69537", - "lon": "-70.26195", - "id": 12558 - }, - { - "name": "Summit Park Avenue", - "lat": "43.71448", - "lon": "-70.28860", - "id": 12970 - }, - { - "name": "Summit Street", - "lat": "43.71789", - "lon": "-70.29608", - "id": 64 - }, - { - "name": "Summit Terrace", - "lat": "43.80025", - "lon": "-70.33640", - "id": 33651 - }, - { - "name": "Sunnyfield Lane", - "lat": "43.72594", - "lon": "-70.27291", - "id": 37549 - }, - { - "name": "Sunset Point Road", - "lat": "43.76398", - "lon": "-70.17682", - "id": 41350 - }, - { - "name": "Sunset Ridge", - "lat": "43.76654", - "lon": "-70.24544", - "id": 80178 - }, - { - "name": "Sunset Road", - "lat": "43.70671", - "lon": "-70.09601", - "id": 12052 - }, - { - "name": "Surrey Lane", - "lat": "43.56693", - "lon": "-70.38694", - "id": 32043 - }, - { - "name": "Swan Road", - "lat": "43.78927", - "lon": "-70.37174", - "id": 35602 - }, - { - "name": "Sweet Fern Road", - "lat": "43.58212", - "lon": "-70.22671", - "id": 37774 - }, - { - "name": "Swett Road", - "lat": "43.76784", - "lon": "-70.40857", - "id": 36108 - }, - { - "name": "Tall Pines Road", - "lat": "43.57279", - "lon": "-70.33874", - "id": 36334 - }, - { - "name": "Tamarack Lane", - "lat": "43.62769", - "lon": "-70.38258", - "id": 83581 - }, - { - "name": "Tamarlane", - "lat": "43.68702", - "lon": "-70.27574", - "id": 12380 - }, - { - "name": "Tapley Road", - "lat": "43.60303", - "lon": "-70.48393", - "id": 76290 - }, - { - "name": "Tenney Lane", - "lat": "43.59251", - "lon": "-70.28461", - "id": 32012 - }, - { - "name": "Thames Street", - "lat": "43.66005", - "lon": "-70.24729", - "id": 76923 - }, - { - "name": "Thomas Drive", - "lat": "43.55923", - "lon": "-70.31982", - "id": 37356 - }, - { - "name": "Thomas Road", - "lat": "43.80852", - "lon": "-70.48774", - "id": 40825 - }, - { - "name": "Thomas Way", - "lat": "43.74455", - "lon": "-70.23673", - "id": 40676 - }, - { - "name": "Thunder Road", - "lat": "43.85554", - "lon": "-70.24641", - "id": 40800 - }, - { - "name": "Thurston Lane", - "lat": "43.59186", - "lon": "-70.41507", - "id": 40807 - }, - { - "name": "Tibbetts Road", - "lat": "43.60392", - "lon": "-70.45476", - "id": 83588 - }, - { - "name": "Tiger Lily Lane", - "lat": "43.59969", - "lon": "-70.25856", - "id": 32584 - }, - { - "name": "Todd Road", - "lat": "43.60083", - "lon": "-70.21811", - "id": 40496 - }, - { - "name": "Torrey Street", - "lat": "43.68400", - "lon": "-70.27928", - "id": 12590 - }, - { - "name": "Town Farm Road", - "lat": "43.81792", - "lon": "-70.72859", - "id": 34055 - }, - { - "name": "Town Landing Road", - "lat": "43.77241", - "lon": "-70.16712", - "id": 33590 - }, - { - "name": "Trundy Road", - "lat": "43.58131", - "lon": "-70.21339", - "id": 40566 - }, - { - "name": "Tucker Drive", - "lat": "43.75476", - "lon": "-70.39119", - "id": 35625 - }, - { - "name": "Tucker Lane", - "names": { - "source": "tiger" - }, - "lat": "43.58827", - "lon": "-70.20736", - "id": 83633 - }, - { - "name": "Tuttle Road", - "lat": "43.77724", - "lon": "-69.94032", - "id": 33460 - }, - { - "name": "Two Lights Road", - "lat": "43.57293", - "lon": "-70.22017", - "id": 40655 - }, - { - "name": "Two Rod Road", - "lat": "43.59211", - "lon": "-70.37136", - "id": 40879 - }, - { - "name": "Tyler Drive", - "lat": "43.78332", - "lon": "-70.18852", - "id": 31979 - }, - { - "name": "Tyler Street", - "lat": "43.68940", - "lon": "-70.30237", - "id": 32689 - }, - { - "name": "Upland Road", - "lat": "43.75854", - "lon": "-70.34112", - "id": 33946 - }, - { - "name": "Valley Road", - "lat": "43.81909", - "lon": "-70.28177", - "id": 32964 - }, - { - "name": "Vernon Road", - "lat": "43.58199", - "lon": "-70.23070", - "id": 40667 - }, - { - "name": "Veronica Lane", - "lat": "43.71977", - "lon": "-70.25746", - "id": 33692 - }, - { - "name": "Verrill Road", - "lat": "43.87050", - "lon": "-70.15800", - "id": 23009 - }, - { - "name": "Victoria Lane", - "lat": "43.75747", - "lon": "-70.32018", - "id": 36957 - }, - { - "name": "Vista Drive", - "lat": "43.79041", - "lon": "-70.36666", - "id": 34197 - }, - { - "name": "Walker Point", - "lat": "43.70790", - "lon": "-70.09709", - "id": 12050 - }, - { - "name": "Warren Avenue", - "lat": "43.68792", - "lon": "-70.30162", - "id": 12596 - }, - { - "name": "Washington Avenue", - "lat": "43.71498", - "lon": "-70.30149", - "id": 12396 - }, - { - "name": "Waterhouse Road", - "lat": "43.62054", - "lon": "-70.24701", - "id": 37241 - }, - { - "name": "Waters Edge", - "lat": "43.79765", - "lon": "-70.15354", - "id": 35065 - }, - { - "name": "Waters Edge Drive", - "lat": "43.79689", - "lon": "-70.15502", - "id": 33771 - }, - { - "name": "Watson Drive", - "lat": "43.78491", - "lon": "-69.94283", - "id": 34020 - }, - { - "name": "Webb Road", - "lat": "43.75939", - "lon": "-70.41376", - "id": 34458 - }, - { - "name": "Webster Lane", - "lat": "43.77469", - "lon": "-70.15835", - "id": 33358 - }, - { - "name": "Webster Way", - "lat": "43.57040", - "lon": "-70.39985", - "id": 80841 - }, - { - "name": "Wedgewood Road", - "lat": "43.61974", - "lon": "-70.23427", - "id": 39212 - }, - { - "name": "Wells Road", - "lat": "43.59237", - "lon": "-70.25491", - "id": 37723 - }, - { - "name": "Wellwood Road", - "lat": "43.68369", - "lon": "-70.27890", - "id": 12887 - }, - { - "name": "Wendy Way", - "lat": "43.71616", - "lon": "-70.28456", - "id": 12495 - }, - { - "name": "Wentworth Road", - "lat": "43.57610", - "lon": "-70.22193", - "id": 40079 - }, - { - "name": "West Elm Street", - "lat": "43.78456", - "lon": "-70.19832", - "id": 83867 - }, - { - "name": "West Main Street", - "lat": "43.80635", - "lon": "-70.22103", - "id": 33784 - }, - { - "name": "Westbrook Street", - "lat": "43.66126", - "lon": "-70.33387", - "id": 77395 - }, - { - "name": "Westfield Road", - "lat": "43.58195", - "lon": "-70.21688", - "id": 37856 - }, - { - "name": "Westside Trail", - "lat": "43.78002", - "lon": "-70.16079", - "id": 78549 - }, - { - "name": "Wetland Loop", - "lat": "43.77326", - "lon": "-70.50105", - "id": 84551 - }, - { - "name": "Wheeler Road", - "lat": "43.57155", - "lon": "-70.22124", - "id": 86044 - }, - { - "name": "White Pine Lane", - "lat": "43.87536", - "lon": "-70.25675", - "id": 32908 - }, - { - "name": "White Pine Way", - "lat": "43.75822", - "lon": "-70.24358", - "id": 81908 - }, - { - "name": "Whites Bridge Road", - "lat": "43.83073", - "lon": "-70.47444", - "id": 40591 - }, - { - "name": "Whites Point Road", - "lat": "43.84389", - "lon": "-70.47966", - "id": 33510 - }, - { - "name": "Whitney Road", - "lat": "43.69704", - "lon": "-70.23976", - "id": 34952 - }, - { - "name": "Wild Turkey Lane", - "lat": "43.84203", - "lon": "-70.27622", - "id": 86280 - }, - { - "name": "Wildwood Circle", - "lat": "43.69376", - "lon": "-70.26881", - "id": 12729 - }, - { - "name": "Wildwood Drive", - "lat": "43.60624", - "lon": "-70.23815", - "id": 37222 - }, - { - "name": "Wildwood Lane", - "lat": "43.56537", - "lon": "-70.29864", - "id": 33568 - }, - { - "name": "Williams Way", - "lat": "43.86544", - "lon": "-70.17918", - "id": 23046 - }, - { - "name": "Willow Drive", - "lat": "43.72679", - "lon": "-70.40354", - "id": 37730 - }, - { - "name": "Willow Street", - "lat": "43.75563", - "lon": "-70.09857", - "id": 40720 - }, - { - "name": "Winding Way", - "lat": "43.57975", - "lon": "-70.29450", - "id": 39297 - }, - { - "name": "Windmill Lane", - "lat": "43.61278", - "lon": "-70.24208", - "id": 32804 - }, - { - "name": "Windward Way", - "lat": "43.63006", - "lon": "-70.22040", - "id": 32198 - }, - { - "name": "Winn Road", - "lat": "43.76319", - "lon": "-70.27602", - "id": 41080 - }, - { - "name": "Winslow Road", - "lat": "43.69962", - "lon": "-70.23759", - "id": 32500 - }, - { - "name": "Winters Way", - "lat": "43.78003", - "lon": "-70.29233", - "id": 36855 - }, - { - "name": "Wood Lane", - "lat": "43.56520", - "lon": "-70.31731", - "id": 35488 - }, - { - "name": "Woodcock Road", - "lat": "43.61096", - "lon": "-70.21382", - "id": 34628 - }, - { - "name": "Woodfield Drive", - "lat": "43.58619", - "lon": "-70.43020", - "id": 39450 - }, - { - "name": "Woodland Road", - "lat": "43.87592", - "lon": "-70.15466", - "id": 23011 - }, - { - "name": "Woods Road", - "lat": "43.73864", - "lon": "-70.24916", - "id": 32097 - }, - { - "name": "Woodside Road", - "lat": "43.57417", - "lon": "-70.32190", - "id": 38589 - }, - { - "name": "Woodspell Road", - "lat": "43.61029", - "lon": "-70.33312", - "id": 34479 - }, - { - "name": "Woodview Drive", - "lat": "43.57399", - "lon": "-70.31314", - "id": 34275 - }, - { - "name": "Woodville Road", - "lat": "43.75881", - "lon": "-70.25933", - "id": 35055 - }, - { - "name": "Youngs Farm Road", - "lat": "43.77350", - "lon": "-70.43208", - "id": 80845 - }, - { - "name": "1st Street (Peaks Island)", - "lat": "43.65289", - "lon": "-70.18884", - "id": 37575 - }, - { - "name": "2nd Street (Peaks Island)", - "lat": "43.65404", - "lon": "-70.18762", - "id": 12259 - }, - { - "name": "2nd Street (Trefethen)", - "lat": "43.66846", - "lon": "-70.18895", - "id": 36485 - }, - { - "name": "3rd Street (Peaks Island)", - "lat": "43.65308", - "lon": "-70.18822", - "id": 12064 - }, - { - "name": "5th Street (North Deering)", - "lat": "43.69414", - "lon": "-70.29894", - "id": 34342 - }, - { - "name": "6th Street (North Deering)", - "lat": "43.69582", - "lon": "-70.29917", - "id": 37546 - }, - { - "name": "7th Street (North Deering)", - "lat": "43.69649", - "lon": "-70.29963", - "id": 36767 - }, - { - "name": "8th Street (North Deering)", - "lat": "43.69711", - "lon": "-70.30014", - "id": 40428 - }, - { - "name": "9th Street (North Deering)", - "lat": "43.69754", - "lon": "-70.30089", - "id": 33586 - }, - { - "name": " (Downtown)", - "enName": " (Downtown)", - "names": { - "ru": "<Портленд> (Downtown)", - "uk": "<Портленд> (Downtown)" - }, - "lat": "43.65708", - "lon": "-70.25911", - "id": 350 - }, - { - "name": "A Street (West End)", - "lat": "43.65274", - "lon": "-70.27800", - "id": 13608 - }, - { - "name": "Abbott Street (North Deering)", - "lat": "43.69878", - "lon": "-70.28845", - "id": 12998 - }, - { - "name": "Abner Lane (North Deering)", - "lat": "43.70893", - "lon": "-70.29757", - "id": 13033 - }, - { - "name": "Access Road (Lunts Corner)", - "lat": "43.68246", - "lon": "-70.26825", - "id": 39344 - }, - { - "name": "Adams Street (Peaks Island)", - "lat": "43.65426", - "lon": "-70.19609", - "id": 12066 - }, - { - "name": "Adams Street (Munjoy Hill)", - "lat": "43.66365", - "lon": "-70.24534", - "id": 13273 - }, - { - "name": "Alder Brook Road (Peaks Island)", - "lat": "43.65508", - "lon": "-70.18356", - "id": 37330 - }, - { - "name": "Alder Street (Downtown)", - "lat": "43.65892", - "lon": "-70.26285", - "id": 13175 - }, - { - "name": "Alpine Road (North Deering)", - "lat": "43.71308", - "lon": "-70.28660", - "id": 12975 - }, - { - "name": "Alton Street (Lunts Corner)", - "lat": "43.68338", - "lon": "-70.26478", - "id": 12785 - }, - { - "name": "Amherst Street (Deering Highlands)", - "lat": "43.67226", - "lon": "-70.28973", - "id": 12929 - }, - { - "name": "Anderson Avenue (Great Diamond Island Landing)", - "lat": "43.66736", - "lon": "-70.20993", - "id": 12314 - }, - { - "name": "Anderson Street (East End)", - "lat": "43.66694", - "lon": "-70.25594", - "id": 1023 - }, - { - "name": "Anson Road (Rosemont)", - "lat": "43.66290", - "lon": "-70.29596", - "id": 13332 - }, - { - "name": "Anthony Avenue (North Deering)", - "lat": "43.69224", - "lon": "-70.27767", - "id": 12644 - }, - { - "name": "Anthony Road (North Deering)", - "lat": "43.69217", - "lon": "-70.27725", - "id": 38363 - }, - { - "name": "Arbor Street (Morrills Corner)", - "lat": "43.68567", - "lon": "-70.29278", - "id": 12618 - }, - { - "name": "Arbutus Avenue (Trefethen)", - "lat": "43.66245", - "lon": "-70.18622", - "id": 12197 - }, - { - "name": "Arbutus Avenue (Deering Center)", - "lat": "43.67929", - "lon": "-70.29930", - "id": 84074 - }, - { - "name": "Arlington Street (Woodfords Corner)", - "lat": "43.67032", - "lon": "-70.28205", - "id": 13073 - }, - { - "name": "Arthur Street (North Deering)", - "lat": "43.69497", - "lon": "-70.30138", - "id": 12465 - }, - { - "name": "Arundel Road (Lunts Corner)", - "lat": "43.68550", - "lon": "-70.26540", - "id": 12722 - }, - { - "name": "Ashlar Court (East Deering)", - "lat": "43.69013", - "lon": "-70.26821", - "id": 12624 - }, - { - "name": "Ashley Lane (East Deering)", - "lat": "43.69329", - "lon": "-70.26186", - "id": 12360 - }, - { - "name": "Ashmont Street (Deering Highlands)", - "lat": "43.66731", - "lon": "-70.28690", - "id": 12663 - }, - { - "name": "Aspen Drive (Sagamore Village)", - "lat": "43.68473", - "lon": "-70.31643", - "id": 13430 - }, - { - "name": "Atlantic Street (Munjoy Hill)", - "lat": "43.66447", - "lon": "-70.24403", - "id": 13116 - }, - { - "name": "Austin Street (Woodfords Corner)", - "lat": "43.67695", - "lon": "-70.28016", - "id": 12907 - }, - { - "name": "Autumn Lane (North Deering)", - "lat": "43.70958", - "lon": "-70.28682", - "id": 12984 - }, - { - "name": "Avon Place (Downtown)", - "lat": "43.65480", - "lon": "-70.26585", - "id": 13113 - }, - { - "name": "Avon Street (Downtown)", - "lat": "43.65494", - "lon": "-70.26677", - "id": 13225 - }, - { - "name": "B Street (Trefethen)", - "lat": "43.66868", - "lon": "-70.19011", - "id": 34293 - }, - { - "name": "Back Cove Estates (Woodfords Corner)", - "lat": "43.68089", - "lon": "-70.27424", - "id": 12640 - }, - { - "name": "Back Cove Trail (East Deering)", - "lat": "43.67872", - "lon": "-70.25823", - "id": 76957 - }, - { - "name": "Bailey Avenue (Riverton)", - "lat": "43.70220", - "lon": "-70.30902", - "id": 12426 - }, - { - "name": "Ballfield Road (Trefethen)", - "lat": "43.66306", - "lon": "-70.19161", - "id": 12086 - }, - { - "name": "Bancroft Street (Rosemont)", - "lat": "43.66762", - "lon": "-70.29980", - "id": 13290 - }, - { - "name": "Bank Street (Bayside)", - "lat": "43.66436", - "lon": "-70.27220", - "id": 36841 - }, - { - "name": "Barclay Avenue (Riverton)", - "lat": "43.69962", - "lon": "-70.30216", - "id": 12445 - }, - { - "name": "Bartlett Street (Deering Center)", - "lat": "43.67628", - "lon": "-70.30269", - "id": 12514 - }, - { - "name": "Bates Street (East Deering)", - "lat": "43.68009", - "lon": "-70.25853", - "id": 12830 - }, - { - "name": "Battery Road (McKinley Estates)", - "lat": "43.68547", - "lon": "-70.19362", - "id": 84423 - }, - { - "name": "Baxter Boulevard (East Deering)", - "lat": "43.67943", - "lon": "-70.25785", - "id": 88 - }, - { - "name": "Bay Avenue (Great Diamond Island Landing)", - "lat": "43.67320", - "lon": "-70.20324", - "id": 12288 - }, - { - "name": "Bay Street (Woodfords Corner)", - "lat": "43.68113", - "lon": "-70.27909", - "id": 12359 - }, - { - "name": "Bay View Drive (Woodfords Corner)", - "lat": "43.67469", - "lon": "-70.28169", - "id": 12918 - }, - { - "name": "Bayberry Lane (Trefethen)", - "lat": "43.66064", - "lon": "-70.18023", - "id": 12257 - }, - { - "name": "Bayside Trail (Downtown)", - "lat": "43.66283", - "lon": "-70.26143", - "id": 76976 - }, - { - "name": "Beach Road (Cliff Island)", - "lat": "43.69635", - "lon": "-70.09715", - "id": 12038 - }, - { - "name": "Beach Road (Trefethen)", - "lat": "43.66606", - "lon": "-70.19365", - "id": 12215 - }, - { - "name": "Beach Street (West End)", - "lat": "43.64654", - "lon": "-70.26177", - "id": 13258 - }, - { - "name": "Beach Street (Trefethen)", - "lat": "43.66612", - "lon": "-70.19392", - "id": 34939 - }, - { - "name": "Beacon Street (Deering Highlands)", - "lat": "43.66936", - "lon": "-70.28782", - "id": 12605 - }, - { - "name": "Beal Street (Riverton)", - "lat": "43.70081", - "lon": "-70.31130", - "id": 12436 - }, - { - "name": "Beckett Street (Munjoy Hill)", - "lat": "43.66703", - "lon": "-70.24564", - "id": 13242 - }, - { - "name": "Bedford Street (Oakdale)", - "lat": "43.66303", - "lon": "-70.27368", - "id": 13024 - }, - { - "name": "Beechwood Avenue (Great Diamond Island Landing)", - "lat": "43.66783", - "lon": "-70.20978", - "id": 37390 - }, - { - "name": "Belknap Street (Brighton Corner)", - "lat": "43.66820", - "lon": "-70.29400", - "id": 12678 - }, - { - "name": "Bell Street (Deering Junction)", - "lat": "43.68643", - "lon": "-70.29126", - "id": 12337 - }, - { - "name": "Belmeade Road (Bayside)", - "lat": "43.66613", - "lon": "-70.27358", - "id": 13157 - }, - { - "name": "Belmont Street (Woodfords Corner)", - "lat": "43.66987", - "lon": "-70.27828", - "id": 13155 - }, - { - "name": "Belvedere Road (Trefethen)", - "lat": "43.66750", - "lon": "-70.18972", - "id": 12206 - }, - { - "name": "Benjamin Way (Rosemont)", - "lat": "43.66354", - "lon": "-70.30289", - "id": 13646 - }, - { - "name": "Berkeley Street (Deering Highlands)", - "lat": "43.67094", - "lon": "-70.29023", - "id": 12760 - }, - { - "name": "Berkshire Road (Lunts Corner)", - "lat": "43.68719", - "lon": "-70.26358", - "id": 12392 - }, - { - "name": "Bernard Road (North Deering)", - "lat": "43.69529", - "lon": "-70.28531", - "id": 12332 - }, - { - "name": "Berry Avenue (North Deering)", - "lat": "43.69267", - "lon": "-70.28503", - "id": 12955 - }, - { - "name": "Berwick Street (East Deering)", - "lat": "43.68095", - "lon": "-70.25313", - "id": 12826 - }, - { - "name": "Beverly Street (Riverton)", - "lat": "43.70320", - "lon": "-70.30329", - "id": 12364 - }, - { - "name": "Birch Avenue (Nasons Corner)", - "lat": "43.67911", - "lon": "-70.30563", - "id": 84078 - }, - { - "name": "Birchwood Avenue (Fort Gorges)", - "lat": "43.66581", - "lon": "-70.21038", - "id": 12323 - }, - { - "name": "Birchwood Drive (Sagamore Village)", - "lat": "43.68460", - "lon": "-70.31870", - "id": 13432 - }, - { - "name": "Boathouse Way (Peaks Island)", - "lat": "43.65623", - "lon": "-70.19830", - "id": 12102 - }, - { - "name": "Bolton Street (Rosemont)", - "lat": "43.66401", - "lon": "-70.28793", - "id": 13318 - }, - { - "name": "Bond Street (West End)", - "lat": "43.64684", - "lon": "-70.26561", - "id": 13591 - }, - { - "name": "Boody Street (Bradleys Corner)", - "lat": "43.65916", - "lon": "-70.29887", - "id": 13375 - }, - { - "name": "Booth Road (Sagamore Village)", - "lat": "43.68783", - "lon": "-70.31291", - "id": 35597 - }, - { - "name": "Boulder Road (Peaks Island)", - "lat": "43.65985", - "lon": "-70.19322", - "id": 12116 - }, - { - "name": "Bowdoin Street (West End)", - "lat": "43.64670", - "lon": "-70.27557", - "id": 13592 - }, - { - "name": "Boynton Street (West End)", - "lat": "43.65519", - "lon": "-70.27643", - "id": 13607 - }, - { - "name": "Brackett Avenue (Peaks Island)", - "lat": "43.65828", - "lon": "-70.18545", - "id": 12070 - }, - { - "name": "Brackett Street (West End)", - "lat": "43.64760", - "lon": "-70.26100", - "id": 13279 - }, - { - "name": "Bradley Street (Brighton Corner)", - "lat": "43.66722", - "lon": "-70.29383", - "id": 12808 - }, - { - "name": "Bramblewood Drive (North Deering)", - "lat": "43.70762", - "lon": "-70.28390", - "id": 12580 - }, - { - "name": "Brattle Street (Downtown)", - "lat": "43.65960", - "lon": "-70.26594", - "id": 13219 - }, - { - "name": "Brewer Street (Bradleys Corner)", - "lat": "43.65882", - "lon": "-70.30531", - "id": 13417 - }, - { - "name": "Brewster Street (North Deering)", - "lat": "43.70086", - "lon": "-70.28988", - "id": 12433 - }, - { - "name": "Briarwood Lane (East Deering)", - "lat": "43.69245", - "lon": "-70.26407", - "id": 12637 - }, - { - "name": "Briarwood Road (Fort Gorges)", - "lat": "43.66616", - "lon": "-70.21197", - "id": 34553 - }, - { - "name": "Briggs Street (West End)", - "lat": "43.64774", - "lon": "-70.26467", - "id": 13588 - }, - { - "name": "Brighton Avenue (Deering Highlands)", - "lat": "43.66615", - "lon": "-70.29147", - "id": 1138 - }, - { - "name": "Brimmer Street (Trefethen)", - "lat": "43.66851", - "lon": "-70.19266", - "id": 37929 - }, - { - "name": "Broadway (Riverton)", - "lat": "43.69853", - "lon": "-70.30237", - "id": 12451 - }, - { - "name": "Brook Lane (Evergreen Landing)", - "lat": "43.67250", - "lon": "-70.18635", - "id": 12180 - }, - { - "name": "Brook Road (North Deering)", - "lat": "43.70539", - "lon": "-70.28759", - "id": 12989 - }, - { - "name": "Brookside Lane (East Deering)", - "lat": "43.68227", - "lon": "-70.27274", - "id": 12819 - }, - { - "name": "Brookside Road (East Deering)", - "lat": "43.68215", - "lon": "-70.27347", - "id": 12820 - }, - { - "name": "Brown Street (Downtown)", - "lat": "43.65632", - "lon": "-70.26008", - "id": 13162 - }, - { - "name": "Bryant Street (Woodfords Corner)", - "lat": "43.67501", - "lon": "-70.28394", - "id": 12917 - }, - { - "name": "Burnham Street (Libbytown)", - "lat": "43.65536", - "lon": "-70.28304", - "id": 13612 - }, - { - "name": "Buttonwood Lane (Stroudwater)", - "lat": "43.66342", - "lon": "-70.32085", - "id": 13326 - }, - { - "name": "C Street (Peaks Island)", - "lat": "43.66034", - "lon": "-70.19588", - "id": 12264 - }, - { - "name": "C Street (West End)", - "lat": "43.65135", - "lon": "-70.27864", - "id": 13531 - }, - { - "name": "Cabot Street (Sagamore Village)", - "lat": "43.67470", - "lon": "-70.32136", - "id": 13502 - }, - { - "name": "Caleb Street (Brighton Corner)", - "lat": "43.66528", - "lon": "-70.29263", - "id": 13304 - }, - { - "name": "Campbell Road (Sagamore Village)", - "lat": "43.68395", - "lon": "-70.32484", - "id": 12497 - }, - { - "name": "Candlewyck Road (Nasons Corner)", - "lat": "43.67929", - "lon": "-70.31168", - "id": 13449 - }, - { - "name": "Capisic Street (Rosemont)", - "lat": "43.66755", - "lon": "-70.30926", - "id": 13292 - }, - { - "name": "Caribou Street (Bradleys Corner)", - "lat": "43.65691", - "lon": "-70.30085", - "id": 13512 - }, - { - "name": "Carleton Street (West End)", - "lat": "43.65132", - "lon": "-70.27115", - "id": 13532 - }, - { - "name": "Carriage Lane (North Deering)", - "lat": "43.69220", - "lon": "-70.29566", - "id": 12395 - }, - { - "name": "Carriage Road (Trefethen)", - "lat": "43.66449", - "lon": "-70.18736", - "id": 84848 - }, - { - "name": "Carroll Street (West End)", - "lat": "43.64850", - "lon": "-70.27104", - "id": 13585 - }, - { - "name": "Casco Bay Bridge (Downtown)", - "lat": "43.64558", - "lon": "-70.25798", - "id": 13176 - }, - { - "name": "Casco Street (Downtown)", - "lat": "43.65679", - "lon": "-70.26201", - "id": 34239 - }, - { - "name": "Castine Avenue (Riverton)", - "lat": "43.69923", - "lon": "-70.31499", - "id": 12831 - }, - { - "name": "Cedar Street (Downtown)", - "lat": "43.65964", - "lon": "-70.25974", - "id": 13199 - }, - { - "name": "Center Street (Old Port)", - "lat": "43.65497", - "lon": "-70.25718", - "id": 13167 - }, - { - "name": "Central Avenue (Peaks Island)", - "lat": "43.65842", - "lon": "-70.19442", - "id": 12096 - }, - { - "name": "Chadwick Street (West End)", - "lat": "43.64892", - "lon": "-70.27424", - "id": 13583 - }, - { - "name": "Chamberlain Avenue (Oakdale)", - "lat": "43.66087", - "lon": "-70.27536", - "id": 13035 - }, - { - "name": "Chandler Street (Bradleys Corner)", - "lat": "43.65493", - "lon": "-70.30003", - "id": 40233 - }, - { - "name": "Chapel Avenue (Deering Center)", - "lat": "43.68193", - "lon": "-70.29735", - "id": 76936 - }, - { - "name": "Chapman Street (North Deering)", - "lat": "43.70133", - "lon": "-70.29059", - "id": 12431 - }, - { - "name": "Charles Street (West End)", - "lat": "43.65336", - "lon": "-70.27495", - "id": 33051 - }, - { - "name": "Cherry Street (Libbytown)", - "lat": "43.65423", - "lon": "-70.28252", - "id": 13613 - }, - { - "name": "Chester Street (East Deering)", - "lat": "43.68207", - "lon": "-70.25190", - "id": 12821 - }, - { - "name": "Chestnut Street (Downtown)", - "lat": "43.65961", - "lon": "-70.25821", - "id": 13170 - }, - { - "name": "Church Avenue (Peaks Island)", - "lat": "43.66113", - "lon": "-70.19526", - "id": 12139 - }, - { - "name": "Church Road (Cliff Island)", - "lat": "43.70171", - "lon": "-70.09934", - "id": 12032 - }, - { - "name": "Churchill Street (East Deering)", - "lat": "43.68167", - "lon": "-70.25954", - "id": 12746 - }, - { - "name": "City Center (Downtown)", - "lat": "43.65715", - "lon": "-70.25791", - "id": 1240 - }, - { - "name": "City Point Road (Peaks Island)", - "lat": "43.66214", - "lon": "-70.19869", - "id": 12090 - }, - { - "name": "Cityview Road (Fort Gorges)", - "lat": "43.66512", - "lon": "-70.21098", - "id": 40111 - }, - { - "name": "Clark Street (West End)", - "lat": "43.65056", - "lon": "-70.26858", - "id": 13536 - }, - { - "name": "Cleeve Street (Great Diamond Island Landing)", - "lat": "43.67585", - "lon": "-70.20165", - "id": 12285 - }, - { - "name": "Cleeve Street (East End)", - "lat": "43.66433", - "lon": "-70.25265", - "id": 38437 - }, - { - "name": "Cleveland Street (East Deering)", - "lat": "43.68859", - "lon": "-70.25139", - "id": 12696 - }, - { - "name": "Cliff Street (Bradleys Corner)", - "lat": "43.65840", - "lon": "-70.30475", - "id": 13419 - }, - { - "name": "Clifford Street (West End)", - "lat": "43.64670", - "lon": "-70.27141", - "id": 13630 - }, - { - "name": "Clifton Street (Woodfords Corner)", - "lat": "43.67780", - "lon": "-70.27630", - "id": 12905 - }, - { - "name": "Clinton Street (Deering Center)", - "lat": "43.67520", - "lon": "-70.29439", - "id": 12915 - }, - { - "name": "College Street (Morrills Corner)", - "lat": "43.68429", - "lon": "-70.29570", - "id": 12356 - }, - { - "name": "Colonial Road (Rosemont)", - "lat": "43.66769", - "lon": "-70.30289", - "id": 13281 - }, - { - "name": "Columbia Road (Rosemont)", - "lat": "43.67231", - "lon": "-70.30018", - "id": 12528 - }, - { - "name": "Concord Street (Deering Center)", - "lat": "43.67329", - "lon": "-70.29321", - "id": 12615 - }, - { - "name": "Coolidge Avenue (North Deering)", - "lat": "43.70479", - "lon": "-70.29321", - "id": 12414 - }, - { - "name": "Cornell Street (Deering Junction)", - "lat": "43.68893", - "lon": "-70.28875", - "id": 12689 - }, - { - "name": "Cottage Lane (Trefethen)", - "lat": "43.67003", - "lon": "-70.18815", - "id": 39354 - }, - { - "name": "Cottage Road (Trefethen)", - "lat": "43.67054", - "lon": "-70.18802", - "id": 12225 - }, - { - "name": "Cottage Street (Woodfords Corner)", - "lat": "43.66755", - "lon": "-70.28293", - "id": 12573 - }, - { - "name": "Country Lane (North Deering)", - "lat": "43.69213", - "lon": "-70.27336", - "id": 12645 - }, - { - "name": "County Way (West End)", - "lat": "43.64899", - "lon": "-70.28036", - "id": 34074 - }, - { - "name": "Cove Side Drive (McKinley Estates)", - "lat": "43.68147", - "lon": "-70.19367", - "id": 12026 - }, - { - "name": "Cove Street (East End)", - "lat": "43.66862", - "lon": "-70.25652", - "id": 1236 - }, - { - "name": "Coyle Street (Woodfords Corner)", - "lat": "43.66824", - "lon": "-70.28664", - "id": 12607 - }, - { - "name": "Craigie Street (Deering Highlands)", - "lat": "43.66511", - "lon": "-70.29147", - "id": 13307 - }, - { - "name": "Crescent Avenue (Great Diamond Island Landing)", - "lat": "43.67912", - "lon": "-70.20433", - "id": 12015 - }, - { - "name": "Crescent Avenue (Peaks Island)", - "lat": "43.65331", - "lon": "-70.19476", - "id": 12112 - }, - { - "name": "Crescent Street (West End)", - "lat": "43.65446", - "lon": "-70.27561", - "id": 13389 - }, - { - "name": "Crosby Street (Deering Center)", - "lat": "43.67717", - "lon": "-70.29585", - "id": 12510 - }, - { - "name": "Cross Street (Old Port)", - "lat": "43.65488", - "lon": "-70.25559", - "id": 32329 - }, - { - "name": "Crystal Road (Trefethen)", - "lat": "43.66798", - "lon": "-70.18446", - "id": 12253 - }, - { - "name": "Cushing Court (East Deering)", - "lat": "43.69050", - "lon": "-70.26830", - "id": 12626 - }, - { - "name": "Cushman Street (West End)", - "lat": "43.64951", - "lon": "-70.26830", - "id": 13394 - }, - { - "name": "Cypress Street (North Deering)", - "lat": "43.70019", - "lon": "-70.28952", - "id": 12439 - }, - { - "name": "D Street (Peaks Island)", - "lat": "43.66039", - "lon": "-70.19629", - "id": 12135 - }, - { - "name": "D Street (West End)", - "lat": "43.64954", - "lon": "-70.27860", - "id": 36793 - }, - { - "name": "Daggett Street (North Deering)", - "lat": "43.69565", - "lon": "-70.27540", - "id": 12325 - }, - { - "name": "Dale Street (Sagamore Village)", - "lat": "43.67965", - "lon": "-70.32100", - "id": 13640 - }, - { - "name": "Dalton Street (East Deering)", - "lat": "43.68339", - "lon": "-70.25669", - "id": 12783 - }, - { - "name": "Dana Street (Old Port)", - "lat": "43.65586", - "lon": "-70.25323", - "id": 13227 - }, - { - "name": "Danforth Street (West End)", - "lat": "43.64730", - "lon": "-70.26574", - "id": 1558 - }, - { - "name": "Daniel Street (Peaks Island)", - "lat": "43.65848", - "lon": "-70.19221", - "id": 12275 - }, - { - "name": "Dartmouth Street (Oakdale)", - "lat": "43.66474", - "lon": "-70.28083", - "id": 12603 - }, - { - "name": "David Road (Nasons Corner)", - "lat": "43.67195", - "lon": "-70.31224", - "id": 13563 - }, - { - "name": "Davis Street (Rosemont)", - "lat": "43.65705", - "lon": "-70.29164", - "id": 13594 - }, - { - "name": "Dayton Street (Riverton)", - "lat": "43.69839", - "lon": "-70.30317", - "id": 12452 - }, - { - "name": "Deane Street (Oakdale)", - "lat": "43.66059", - "lon": "-70.28001", - "id": 13372 - }, - { - "name": "Deerfield Road (Oakdale)", - "lat": "43.66643", - "lon": "-70.27484", - "id": 13156 - }, - { - "name": "Deering Avenue (Woodfords Corner)", - "lat": "43.66585", - "lon": "-70.28353", - "id": 66 - }, - { - "name": "Deering Street (Downtown)", - "lat": "43.65463", - "lon": "-70.26628", - "id": 1266 - }, - { - "name": "Dennet Street (Nasons Corner)", - "lat": "43.67527", - "lon": "-70.31199", - "id": 37508 - }, - { - "name": "Dennett Street (Nasons Corner)", - "lat": "43.67670", - "lon": "-70.31078", - "id": 13462 - }, - { - "name": "Derby Road (Woodfords Corner)", - "lat": "43.67953", - "lon": "-70.28478", - "id": 12900 - }, - { - "name": "Devonshire Street (Oakdale)", - "lat": "43.66523", - "lon": "-70.28503", - "id": 12868 - }, - { - "name": "Diamond Avenue (McKinley Estates)", - "lat": "43.68387", - "lon": "-70.19305", - "id": 1163 - }, - { - "name": "Diamond Avenue (Fort Gorges)", - "lat": "43.66458", - "lon": "-70.20916", - "id": 38342 - }, - { - "name": "Diamond Street (East End)", - "lat": "43.66596", - "lon": "-70.25622", - "id": 1024 - }, - { - "name": "Dirigo Street (Bradleys Corner)", - "lat": "43.66200", - "lon": "-70.29602", - "id": 13351 - }, - { - "name": "Donald Street (Nasons Corner)", - "lat": "43.67481", - "lon": "-70.31203", - "id": 13481 - }, - { - "name": "Douglass Street (Oakdale)", - "lat": "43.66317", - "lon": "-70.28626", - "id": 1247 - }, - { - "name": "Dow Street (West End)", - "lat": "43.65271", - "lon": "-70.26864", - "id": 13609 - }, - { - "name": "Dudley Street (East Deering)", - "lat": "43.68303", - "lon": "-70.27390", - "id": 12788 - }, - { - "name": "Dump Road (Peaks Island)", - "lat": "43.65746", - "lon": "-70.18526", - "id": 38004 - }, - { - "name": "Durham Street (Oakdale)", - "lat": "43.66314", - "lon": "-70.27340", - "id": 13061 - }, - { - "name": "East Kidder Street (East Deering)", - "lat": "43.68792", - "lon": "-70.26233", - "id": 12702 - }, - { - "name": "East Side Drive (Evergreen Landing)", - "lat": "43.67906", - "lon": "-70.19017", - "id": 12023 - }, - { - "name": "Eastern Avenue (Deering Center)", - "lat": "43.67978", - "lon": "-70.29718", - "id": 84075 - }, - { - "name": "Eastern Promenade (East End)", - "lat": "43.67211", - "lon": "-70.25368", - "id": 13270 - }, - { - "name": "Eastfield Road (Bradleys Corner)", - "lat": "43.66131", - "lon": "-70.30055", - "id": 13360 - }, - { - "name": "Edgewood Avenue (North Deering)", - "lat": "43.69467", - "lon": "-70.28469", - "id": 13013 - }, - { - "name": "Edwards Street (Deering Highlands)", - "lat": "43.66491", - "lon": "-70.29040", - "id": 13309 - }, - { - "name": "Eighth Street (North Deering)", - "lat": "43.69782", - "lon": "-70.29939", - "id": 12455 - }, - { - "name": "Elipse Avenue (Deering Center)", - "lat": "43.67884", - "lon": "-70.30381", - "id": 76932 - }, - { - "name": "Elizabeth Road (Oakdale)", - "lat": "43.66272", - "lon": "-70.28666", - "id": 1249 - }, - { - "name": "Elizabeth Road (Fort Gorges)", - "lat": "43.66458", - "lon": "-70.21090", - "id": 12317 - }, - { - "name": "Elizabeth Street (Peaks Island)", - "lat": "43.66019", - "lon": "-70.19592", - "id": 12137 - }, - { - "name": "Ellsworth Street (West End)", - "lat": "43.65416", - "lon": "-70.27398", - "id": 13615 - }, - { - "name": "Elm Avenue (Deering Center)", - "lat": "43.68144", - "lon": "-70.30102", - "id": 83881 - }, - { - "name": "Elm Street (Downtown)", - "lat": "43.65963", - "lon": "-70.26150", - "id": 1622 - }, - { - "name": "Elmwood Avenue (Deering Center)", - "lat": "43.68077", - "lon": "-70.30317", - "id": 83882 - }, - { - "name": "Elmwood Street (Deering Center)", - "lat": "43.68257", - "lon": "-70.29308", - "id": 12894 - }, - { - "name": "Elmwood Street (Fort Gorges)", - "lat": "43.66643", - "lon": "-70.21152", - "id": 38923 - }, - { - "name": "Emerson Street (Munjoy Hill)", - "lat": "43.66885", - "lon": "-70.24761", - "id": 13128 - }, - { - "name": "Emery Street (West End)", - "lat": "43.64864", - "lon": "-70.26952", - "id": 13397 - }, - { - "name": "Ernest Street (Peaks Island)", - "lat": "43.65774", - "lon": "-70.19450", - "id": 34641 - }, - { - "name": "Essex Street (Nasons Corner)", - "lat": "43.67627", - "lon": "-70.31310", - "id": 13468 - }, - { - "name": "Everett Street (East End)", - "lat": "43.66590", - "lon": "-70.25463", - "id": 13238 - }, - { - "name": "Evergreen Avenue (Evergreen Landing)", - "lat": "43.67287", - "lon": "-70.18736", - "id": 33687 - }, - { - "name": "Evergreen Circle (Deering Center)", - "lat": "43.68117", - "lon": "-70.29907", - "id": 83880 - }, - { - "name": "Evergreen Drive (Riverton)", - "lat": "43.70815", - "lon": "-70.31591", - "id": 13020 - }, - { - "name": "Exchange Street (Downtown)", - "lat": "43.65829", - "lon": "-70.25587", - "id": 13054 - }, - { - "name": "Fairfield Street (East Deering)", - "lat": "43.68398", - "lon": "-70.25326", - "id": 12776 - }, - { - "name": "Fairmount Street (Deering Highlands)", - "lat": "43.66877", - "lon": "-70.28832", - "id": 12794 - }, - { - "name": "Fairview Street (Brighton Corner)", - "lat": "43.66480", - "lon": "-70.29664", - "id": 13311 - }, - { - "name": "Fall Lane (North Deering)", - "lat": "43.70882", - "lon": "-70.28965", - "id": 12959 - }, - { - "name": "Falmouth Street (Oakdale)", - "lat": "43.66438", - "lon": "-70.27566", - "id": 12602 - }, - { - "name": "Farm Hill Road (Cushing Island)", - "lat": "43.64331", - "lon": "-70.20395", - "id": 84650 - }, - { - "name": "Farmhouse Road (Cushing Island)", - "lat": "43.64326", - "lon": "-70.20264", - "id": 12305 - }, - { - "name": "Farragut Street (North Deering)", - "lat": "43.69915", - "lon": "-70.30044", - "id": 12446 - }, - { - "name": "Fellows Street (Rosemont)", - "lat": "43.66890", - "lon": "-70.29911", - "id": 12549 - }, - { - "name": "Fernald Street (Lunts Corner)", - "lat": "43.68480", - "lon": "-70.26705", - "id": 12665 - }, - { - "name": "Fernald Terrace (Lunts Corner)", - "lat": "43.68412", - "lon": "-70.26898", - "id": 12775 - }, - { - "name": "Fessenden Avenue (Fort Gorges)", - "lat": "43.66320", - "lon": "-70.21017", - "id": 12319 - }, - { - "name": "Fifth Street (North Deering)", - "lat": "43.69470", - "lon": "-70.29845", - "id": 12467 - }, - { - "name": "Fisher Street (North Deering)", - "lat": "43.70195", - "lon": "-70.29156", - "id": 12427 - }, - { - "name": "Fiske Street (Riverton)", - "lat": "43.68924", - "lon": "-70.32407", - "id": 40508 - }, - { - "name": "Fleetwood Street (Rosemont)", - "lat": "43.66764", - "lon": "-70.30188", - "id": 13288 - }, - { - "name": "Fletcher Street (West End)", - "lat": "43.64580", - "lon": "-70.27072", - "id": 36809 - }, - { - "name": "Florence Street (Deering Center)", - "lat": "43.67434", - "lon": "-70.28969", - "id": 12597 - }, - { - "name": "Florida Avenue (Peaks Island)", - "lat": "43.65792", - "lon": "-70.18519", - "id": 12120 - }, - { - "name": "Florida Avenue (North Deering)", - "lat": "43.69731", - "lon": "-70.28199", - "id": 12961 - }, - { - "name": "Fore River Parkway (West End)", - "lat": "43.64522", - "lon": "-70.28027", - "id": 13380 - }, - { - "name": "Fore River Sancturary Trail (Nasons Corner)", - "lat": "43.66758", - "lon": "-70.31965", - "id": 76958 - }, - { - "name": "Forest Avenue (Woodfords Corner)", - "lat": "43.66800", - "lon": "-70.28033", - "id": 420 - }, - { - "name": "Forest Circle (Riverton)", - "lat": "43.69331", - "lon": "-70.30229", - "id": 12856 - }, - { - "name": "Forest Park (Woodfords Corner)", - "lat": "43.66792", - "lon": "-70.27626", - "id": 13077 - }, - { - "name": "Forest Street (West End)", - "lat": "43.65461", - "lon": "-70.27765", - "id": 13628 - }, - { - "name": "Frances Street (Deering Highlands)", - "lat": "43.66457", - "lon": "-70.28991", - "id": 13312 - }, - { - "name": "Frederick Avenue (Trefethen)", - "lat": "43.66342", - "lon": "-70.18466", - "id": 12199 - }, - { - "name": "Free Street (Downtown)", - "lat": "43.65668", - "lon": "-70.25785", - "id": 1537, - "buildings": [ - { - "name": "2", - "lat": "43.65699", - "lon": "-70.25723", - "postcode": "04101" - }, - { - "name": "4", - "lat": "43.65693", - "lon": "-70.25727", - "postcode": "04101" - }, - { - "name": "6", - "lat": "43.65691", - "lon": "-70.25731", - "postcode": "04101" - }, - { - "name": "10", - "lat": "43.65685", - "lon": "-70.25738", - "postcode": "04101" - }, - { - "name": "11", - "lat": "43.65697", - "lon": "-70.25774", - "postcode": "04101" - }, - { - "name": "13", - "lat": "43.65693", - "lon": "-70.25780", - "postcode": "04101" - }, - { - "name": "14", - "lat": "43.65685", - "lon": "-70.25742", - "postcode": "04101" - }, - { - "name": "15", - "lat": "43.65688", - "lon": "-70.25795", - "postcode": "04101" - }, - { - "name": "16", - "lat": "43.65683", - "lon": "-70.25746", - "postcode": "04101" - }, - { - "name": "17", - "lat": "43.65685", - "lon": "-70.25800", - "postcode": "04101" - }, - { - "name": "18", - "lat": "43.65680", - "lon": "-70.25753", - "postcode": "04101" - }, - { - "name": "20", - "lat": "43.65676", - "lon": "-70.25759", - "postcode": "04101" - }, - { - "name": "22", - "lat": "43.65671", - "lon": "-70.25768", - "postcode": "04101" - }, - { - "name": "23", - "lat": "43.65682", - "lon": "-70.25843", - "postcode": "04101" - }, - { - "name": "24", - "lat": "43.65668", - "lon": "-70.25770", - "postcode": "04101" - }, - { - "name": "26", - "lat": "43.65668", - "lon": "-70.25785", - "postcode": "04101" - }, - { - "name": "26", - "lat": "43.65663", - "lon": "-70.25778" - }, - { - "name": "44", - "lat": "43.65634", - "lon": "-70.25845", - "postcode": "04101" - }, - { - "name": "48", - "lat": "43.65626", - "lon": "-70.25862", - "postcode": "04101" - }, - { - "name": "77", - "lat": "43.65584", - "lon": "-70.25986", - "postcode": "04101" - }, - { - "name": "81", - "lat": "43.65578", - "lon": "-70.25999", - "postcode": "04101" - }, - { - "name": "85", - "lat": "43.65570", - "lon": "-70.26010", - "postcode": "04101" - }, - { - "name": "94", - "lat": "43.65534", - "lon": "-70.26027", - "postcode": "04101" - }, - { - "name": "100", - "lat": "43.65516", - "lon": "-70.26066", - "postcode": "04101" - }, - { - "name": "110", - "lat": "43.65455", - "lon": "-70.26068", - "postcode": "04101" - }, - { - "name": "116", - "lat": "43.65479", - "lon": "-70.26134", - "postcode": "04101" - }, - { - "name": "120", - "lat": "43.65468", - "lon": "-70.26154", - "postcode": "04101" - }, - { - "name": "121", - "lat": "43.65486", - "lon": "-70.26169", - "postcode": "04101" - }, - { - "name": "123", - "lat": "43.65482", - "lon": "-70.26175", - "postcode": "04101" - }, - { - "name": "125", - "lat": "43.65479", - "lon": "-70.26180", - "postcode": "04101" - }, - { - "name": "128", - "lat": "43.65448", - "lon": "-70.26165", - "postcode": "04101" - }, - { - "name": "133", - "lat": "43.65457", - "lon": "-70.26218", - "postcode": "04101" - }, - { - "name": "135", - "lat": "43.65452", - "lon": "-70.26229", - "postcode": "04101" - }, - { - "name": "142", - "lat": "43.65415", - "lon": "-70.26227", - "postcode": "04101" - } - ], - "intersectedStreets": [ - { - "name": "Congress Street", - "lat": "43.65398", - "lon": "-70.26319" - }, - { - "name": "High Street (Downtown)", - "lat": "43.65398", - "lon": "-70.26319" - }, - { - "name": "Oak Street (Downtown)", - "lat": "43.65491", - "lon": "-70.26132" - }, - { - "name": "Brown Street (Downtown)", - "lat": "43.65586", - "lon": "-70.25961" - }, - { - "name": "Center Street (Old Port)", - "lat": "43.65628", - "lon": "-70.25883" - }, - { - "name": "City Center (Downtown)", - "lat": "43.65711", - "lon": "-70.25738" - }, - { - "name": "Cross Street (Old Port)", - "lat": "43.65718", - "lon": "-70.25723" - }, - { - "name": "Monument Square (Downtown)", - "lat": "43.65722", - "lon": "-70.25710" - }, - { - "name": "Temple Street (Downtown)", - "lat": "43.65750", - "lon": "-70.25654" - } - ] - }, - { - "name": "Freeman Street (Woodfords Corner)", - "lat": "43.66696", - "lon": "-70.27935", - "id": 12811 - }, - { - "name": "Front Street (East Deering)", - "lat": "43.68140", - "lon": "-70.26338", - "id": 12574 - }, - { - "name": "Frost Street (Bradleys Corner)", - "lat": "43.66235", - "lon": "-70.29840", - "id": 13341 - }, - { - "name": "Fuller Street (Deering Center)", - "lat": "43.67534", - "lon": "-70.30108", - "id": 12520 - }, - { - "name": "Garden Avenue (Deering Center)", - "lat": "43.68088", - "lon": "-70.30160", - "id": 76940 - }, - { - "name": "Garden Street (Trefethen)", - "lat": "43.67039", - "lon": "-70.18916", - "id": 37874 - }, - { - "name": "Garrison Street (Stroudwater)", - "lat": "43.65615", - "lon": "-70.31046", - "id": 13597 - }, - { - "name": "Gay Street (Rosemont)", - "lat": "43.67017", - "lon": "-70.30241", - "id": 12540 - }, - { - "name": "George Street (Woodfords Corner)", - "lat": "43.67729", - "lon": "-70.27881", - "id": 12906 - }, - { - "name": "Gertrude Avenue (North Deering)", - "lat": "43.69878", - "lon": "-70.28430", - "id": 12374 - }, - { - "name": "Gilbert Lane (Munjoy Hill)", - "lat": "43.66471", - "lon": "-70.24542", - "id": 38128 - }, - { - "name": "Gilman Street (West End)", - "lat": "43.65308", - "lon": "-70.27737", - "id": 13556 - }, - { - "name": "Glenridge Drive (Rosemont)", - "lat": "43.67073", - "lon": "-70.30574", - "id": 13387 - }, - { - "name": "Glenwood Avenue (Deering Highlands)", - "lat": "43.67090", - "lon": "-70.29209", - "id": 12762 - }, - { - "name": "Gold Street (Old Port)", - "lat": "43.65704", - "lon": "-70.25147", - "id": 13166 - }, - { - "name": "Goldenrod Road (Great Diamond Island Landing)", - "lat": "43.66710", - "lon": "-70.20952", - "id": 34760 - }, - { - "name": "Gorges Street (Great Diamond Island Landing)", - "lat": "43.67799", - "lon": "-70.20401", - "id": 12279 - }, - { - "name": "Gorges Street (Sagamore Village)", - "lat": "43.67807", - "lon": "-70.31988", - "id": 13500 - }, - { - "name": "Gould Street (East End)", - "lat": "43.66938", - "lon": "-70.25519", - "id": 13208 - }, - { - "name": "Grace Street (Woodfords Corner)", - "lat": "43.67133", - "lon": "-70.28345", - "id": 12934 - }, - { - "name": "Grace Street Place (Woodfords Corner)", - "lat": "43.67132", - "lon": "-70.28276", - "id": 13017 - }, - { - "name": "Grafton Street (East Deering)", - "lat": "43.68907", - "lon": "-70.26484", - "id": 12660 - }, - { - "name": "Granite Street (Oakdale)", - "lat": "43.66022", - "lon": "-70.27800", - "id": 13405 - }, - { - "name": "Grant Street (Downtown)", - "lat": "43.65696", - "lon": "-70.26701", - "id": 13059 - }, - { - "name": "Gray Street (West End)", - "lat": "43.64940", - "lon": "-70.26381", - "id": 1078 - }, - { - "name": "Great Pond Road (Peaks Island)", - "lat": "43.65281", - "lon": "-70.18871", - "id": 12062 - }, - { - "name": "Greeley Street (Rosemont)", - "lat": "43.65666", - "lon": "-70.29263", - "id": 13636 - }, - { - "name": "Greenleaf Street (East End)", - "lat": "43.66581", - "lon": "-70.25420", - "id": 13129 - }, - { - "name": "Greenwood Lane (North Deering)", - "lat": "43.70786", - "lon": "-70.29802", - "id": 12408 - }, - { - "name": "Greenwood Street (Peaks Island)", - "lat": "43.65300", - "lon": "-70.19762", - "id": 12163 - }, - { - "name": "Griffin Lane (Cliff Island)", - "lat": "43.69411", - "lon": "-70.10618", - "id": 12040 - }, - { - "name": "Grove Avenue (Deering Center)", - "lat": "43.68165", - "lon": "-70.29789", - "id": 76938 - }, - { - "name": "Grove Street (Riverton)", - "lat": "43.69031", - "lon": "-70.32488", - "id": 13015 - }, - { - "name": "Hale Street (Deering Center)", - "lat": "43.67579", - "lon": "-70.30398", - "id": 12515 - }, - { - "name": "Hammond Street (East End)", - "lat": "43.66745", - "lon": "-70.25469", - "id": 13081 - }, - { - "name": "Hanover Street (Downtown)", - "lat": "43.66058", - "lon": "-70.26476", - "id": 13038 - }, - { - "name": "Hanson Street (Lunts Corner)", - "lat": "43.68373", - "lon": "-70.26613", - "id": 12779 - }, - { - "name": "Harmon Road (Nasons Corner)", - "lat": "43.67352", - "lon": "-70.31119", - "id": 13493 - }, - { - "name": "Harmony Road (Riverton)", - "lat": "43.70016", - "lon": "-70.30651", - "id": 12441 - }, - { - "name": "Harris Avenue (Riverton)", - "lat": "43.69987", - "lon": "-70.30229", - "id": 12366 - }, - { - "name": "Hartley Street (Deering Center)", - "lat": "43.67580", - "lon": "-70.29370", - "id": 12612 - }, - { - "name": "Harvard Street (North Deering)", - "lat": "43.69261", - "lon": "-70.28220", - "id": 12372 - }, - { - "name": "Harvey Street (Nasons Corner)", - "lat": "43.67028", - "lon": "-70.30892", - "id": 13568 - }, - { - "name": "Haskell Road (North Deering)", - "lat": "43.70111", - "lon": "-70.30091", - "id": 38431 - }, - { - "name": "Haskell Street (North Deering)", - "lat": "43.70026", - "lon": "-70.30093", - "id": 12588 - }, - { - "name": "Hawthorne Street (East Deering)", - "lat": "43.68685", - "lon": "-70.25579", - "id": 12712 - }, - { - "name": "Heather Road (North Deering)", - "lat": "43.71201", - "lon": "-70.28128", - "id": 41075 - }, - { - "name": "Hemlock Street (Libbytown)", - "lat": "43.65418", - "lon": "-70.28158", - "id": 13614 - }, - { - "name": "Henry Street (Downtown)", - "lat": "43.65451", - "lon": "-70.26572", - "id": 41558 - }, - { - "name": "Heritage Court (Stroudwater)", - "lat": "43.65578", - "lon": "-70.31649", - "id": 13602 - }, - { - "name": "Higgins Street (Deering Center)", - "lat": "43.67085", - "lon": "-70.29418", - "id": 12761 - }, - { - "name": "High Street (Downtown)", - "lat": "43.65314", - "lon": "-70.26220", - "id": 1582 - }, - { - "name": "Highland Avenue (Trefethen)", - "lat": "43.66283", - "lon": "-70.18798", - "id": 12262 - }, - { - "name": "Highland Street (Deering Highlands)", - "lat": "43.66984", - "lon": "-70.29003", - "id": 12769 - }, - { - "name": "Hill Street (West End)", - "lat": "43.65378", - "lon": "-70.27381", - "id": 13542 - }, - { - "name": "Hillcrest Avenue (Nasons Corner)", - "lat": "43.67256", - "lon": "-70.31544", - "id": 13562 - }, - { - "name": "Hillcrest Circle (Riverton)", - "lat": "43.70148", - "lon": "-70.30767", - "id": 12429 - }, - { - "name": "Hillcrest Road (McKinley Estates)", - "lat": "43.68162", - "lon": "-70.19154", - "id": 12020 - }, - { - "name": "Hillside Road (Cliff Island)", - "lat": "43.69618", - "lon": "-70.10567", - "id": 12036 - }, - { - "name": "Hingham Street (Riverton)", - "lat": "43.70013", - "lon": "-70.30463", - "id": 12442 - }, - { - "name": "Hobart Street (Bradleys Corner)", - "lat": "43.65767", - "lon": "-70.30387", - "id": 13427 - }, - { - "name": "Holbrook Street (Riverton)", - "lat": "43.70320", - "lon": "-70.30237", - "id": 12422 - }, - { - "name": "Hollis Road (Deering Highlands)", - "lat": "43.66728", - "lon": "-70.29287", - "id": 12807 - }, - { - "name": "Holly Street (Deering Center)", - "lat": "43.67919", - "lon": "-70.28954", - "id": 12901 - }, - { - "name": "Holwell Street (Woodfords Corner)", - "lat": "43.66629", - "lon": "-70.28276", - "id": 12862 - }, - { - "name": "Homestead Avenue (North Deering)", - "lat": "43.69653", - "lon": "-70.29920", - "id": 12459 - }, - { - "name": "Homestead Road (Trefethen)", - "lat": "43.67056", - "lon": "-70.18822", - "id": 12223 - }, - { - "name": "Hooper Street (Libbytown)", - "lat": "43.65472", - "lon": "-70.29197", - "id": 76949 - }, - { - "name": "Horton Place (West End)", - "lat": "43.65258", - "lon": "-70.26830", - "id": 13611 - }, - { - "name": "Houlton Street (West End)", - "lat": "43.65149", - "lon": "-70.26989", - "id": 13392 - }, - { - "name": "Howard Street (Munjoy Hill)", - "lat": "43.66750", - "lon": "-70.24637", - "id": 13276 - }, - { - "name": "Hoyts Lane (Munjoy Hill)", - "lat": "43.66466", - "lon": "-70.24555", - "id": 33823 - }, - { - "name": "Hunt Street (Woodfords Corner)", - "lat": "43.67402", - "lon": "-70.28804", - "id": 12758 - }, - { - "name": "Huntington Avenue (North Deering)", - "lat": "43.69562", - "lon": "-70.27358", - "id": 12328 - }, - { - "name": "Hurley Lane (North Deering)", - "lat": "43.70297", - "lon": "-70.27235", - "id": 32226 - }, - { - "name": "Hussey Lane (McKinley Estates)", - "lat": "43.68175", - "lon": "-70.18871", - "id": 12021 - }, - { - "name": "Hussey Road (Trefethen)", - "lat": "43.66182", - "lon": "-70.18210", - "id": 12094 - }, - { - "name": "Indian Lane (Woodfords Corner)", - "lat": "43.66837", - "lon": "-70.27885", - "id": 35745 - }, - { - "name": "Indian Trail (Peaks Island)", - "lat": "43.65552", - "lon": "-70.18860", - "id": 84847 - }, - { - "name": "Industrial Way (Riverton)", - "lat": "43.70311", - "lon": "-70.31786", - "id": 1028 - }, - { - "name": "Ingalls Road (McKinley Estates)", - "lat": "43.68286", - "lon": "-70.19663", - "id": 12024 - }, - { - "name": "Ingalls Road (Riverton)", - "lat": "43.69160", - "lon": "-70.32516", - "id": 33560 - }, - { - "name": "Interstate 95 (Sagamore Village)", - "lat": "43.68047", - "lon": "-70.32791", - "id": 12512 - }, - { - "name": "Inverness Street (East Deering)", - "lat": "43.68634", - "lon": "-70.26280", - "id": 12715 - }, - { - "name": "Irving Street (Woodfords Corner)", - "lat": "43.67586", - "lon": "-70.28518", - "id": 12911 - }, - { - "name": "Island Avenue (Peaks Island)", - "lat": "43.66115", - "lon": "-70.19787", - "id": 12072 - }, - { - "name": "Island Avenue (Cliff Island)", - "lat": "43.69424", - "lon": "-70.10715", - "id": 36086 - }, - { - "name": "Island Street (East Deering)", - "lat": "43.68308", - "lon": "-70.25167", - "id": 12787 - }, - { - "name": "Ivy Street (Brighton Corner)", - "lat": "43.66579", - "lon": "-70.29536", - "id": 13301 - }, - { - "name": "Jackson Boulevard (Fort Levett)", - "lat": "43.64462", - "lon": "-70.19390", - "id": 12309 - }, - { - "name": "James Street (Deering Center)", - "lat": "43.67492", - "lon": "-70.29188", - "id": 13016 - }, - { - "name": "Jeanne Street (Deering Center)", - "lat": "43.67405", - "lon": "-70.30274", - "id": 13489 - }, - { - "name": "Jersey Avenue (North Deering)", - "lat": "43.70173", - "lon": "-70.27806", - "id": 12948 - }, - { - "name": "Jetport Access Road (Stroudwater)", - "lat": "43.65280", - "lon": "-70.31847", - "id": 32633 - }, - { - "name": "Jewell Road (Trefethen)", - "lat": "43.66131", - "lon": "-70.18039", - "id": 12201 - }, - { - "name": "Johnson Road (Stroudwater)", - "lat": "43.64856", - "lon": "-70.32810", - "id": 13522 - }, - { - "name": "Jordan Street (East Deering)", - "lat": "43.68040", - "lon": "-70.25602", - "id": 12740 - }, - { - "name": "Josslyn Street (Sagamore Village)", - "lat": "43.67652", - "lon": "-70.32166", - "id": 13496 - }, - { - "name": "June Street (Brighton Corner)", - "lat": "43.66477", - "lon": "-70.29917", - "id": 13310 - }, - { - "name": "Kendall Street (East Deering)", - "lat": "43.68148", - "lon": "-70.25154", - "id": 12824 - }, - { - "name": "Kennebec Street (Downtown)", - "lat": "43.66078", - "lon": "-70.26426", - "id": 13037 - }, - { - "name": "Kent Street (Nasons Corner)", - "lat": "43.67534", - "lon": "-70.31437", - "id": 13377 - }, - { - "name": "Knickerbocker Road (Evergreen Landing)", - "lat": "43.67281", - "lon": "-70.18532", - "id": 38627 - }, - { - "name": "Knight Street (North Deering)", - "lat": "43.69779", - "lon": "-70.28950", - "id": 13004 - }, - { - "name": "Lafayette Street (Munjoy Hill)", - "lat": "43.66764", - "lon": "-70.24892", - "id": 13202 - }, - { - "name": "Lancaster Lane (Downtown)", - "lat": "43.65701", - "lon": "-70.25860", - "id": 31999 - }, - { - "name": "Lane Avenue (Riverton)", - "lat": "43.69064", - "lon": "-70.31709", - "id": 12745 - }, - { - "name": "Larrabee Road (Sagamore Village)", - "lat": "43.68092", - "lon": "-70.32952", - "id": 77374 - }, - { - "name": "Lawn Avenue (Deering Highlands)", - "lat": "43.67098", - "lon": "-70.29267", - "id": 12759 - }, - { - "name": "Lawrence Avenue (North Deering)", - "lat": "43.69213", - "lon": "-70.27561", - "id": 12647 - }, - { - "name": "Ledgewood Drive (East Deering)", - "lat": "43.69107", - "lon": "-70.26909", - "id": 35184 - }, - { - "name": "Ledgewood Road (Peaks Island)", - "lat": "43.65896", - "lon": "-70.19448", - "id": 38678 - }, - { - "name": "Ledgewood Street (Peaks Island)", - "lat": "43.65865", - "lon": "-70.19526", - "id": 12189 - }, - { - "name": "Leighton Avenue (Riverton)", - "lat": "43.69335", - "lon": "-70.32379", - "id": 12855 - }, - { - "name": "Leisure Lane (Riverton)", - "lat": "43.69858", - "lon": "-70.30767", - "id": 12584 - }, - { - "name": "Leland Street (Deering Center)", - "lat": "43.67785", - "lon": "-70.29647", - "id": 12507 - }, - { - "name": "Lennox Street (East Deering)", - "lat": "43.68144", - "lon": "-70.25233", - "id": 12825 - }, - { - "name": "Leonard Street (Deering Center)", - "lat": "43.67836", - "lon": "-70.29808", - "id": 12504 - }, - { - "name": "Lewis Street (West End)", - "lat": "43.65019", - "lon": "-70.26907", - "id": 13539 - }, - { - "name": "Lexington Avenue (Riverton)", - "lat": "43.69860", - "lon": "-70.30538", - "id": 12449 - }, - { - "name": "Libby Street (Riverton)", - "lat": "43.69635", - "lon": "-70.30284", - "id": 12461 - }, - { - "name": "Liberty Way (North Deering)", - "lat": "43.70370", - "lon": "-70.27416", - "id": 12995 - }, - { - "name": "Lincoln Street (Woodfords Corner)", - "lat": "43.66938", - "lon": "-70.28467", - "id": 12790 - }, - { - "name": "Linden Street (Woodfords Corner)", - "lat": "43.66747", - "lon": "-70.28239", - "id": 12805 - }, - { - "name": "Little Road (Nasons Corner)", - "lat": "43.66824", - "lon": "-70.31053", - "id": 13576 - }, - { - "name": "Lomond Street (Nasons Corner)", - "lat": "43.67614", - "lon": "-70.31754", - "id": 13470 - }, - { - "name": "Long Point Road (Peaks Island)", - "lat": "43.65198", - "lon": "-70.19532", - "id": 12169 - }, - { - "name": "Longfellow Street (Woodfords Corner)", - "lat": "43.66661", - "lon": "-70.28154", - "id": 34231 - }, - { - "name": "Longfellow West Street (Deering Highlands)", - "lat": "43.66592", - "lon": "-70.28870", - "id": 12604 - }, - { - "name": "Longwood Drive (Nasons Corner)", - "lat": "43.67852", - "lon": "-70.31113", - "id": 13453 - }, - { - "name": "Loop Road (Stroudwater)", - "lat": "43.64954", - "lon": "-70.31233", - "id": 82911 - }, - { - "name": "Loring Avenue (North Deering)", - "lat": "43.69745", - "lon": "-70.28428", - "id": 13006 - }, - { - "name": "Lowell Street (Libbytown)", - "lat": "43.65507", - "lon": "-70.28379", - "id": 13626 - }, - { - "name": "Ludlow Street (Nasons Corner)", - "lat": "43.68043", - "lon": "-70.31083", - "id": 12498 - }, - { - "name": "Luke Street (North Deering)", - "lat": "43.69900", - "lon": "-70.30188", - "id": 12447 - }, - { - "name": "Lynn Street (Riverton)", - "lat": "43.70131", - "lon": "-70.30898", - "id": 12430 - }, - { - "name": "Madison Street (East End)", - "lat": "43.66629", - "lon": "-70.25338", - "id": 13249 - }, - { - "name": "Maggie Lane (North Deering)", - "lat": "43.69183", - "lon": "-70.29752", - "id": 12942 - }, - { - "name": "Magnolia Avenue (Deering Center)", - "lat": "43.68033", - "lon": "-70.29924", - "id": 84076 - }, - { - "name": "Main Avenue (Deering Center)", - "lat": "43.67801", - "lon": "-70.29587", - "id": 76928 - }, - { - "name": "Main Street (Sagamore Village)", - "lat": "43.67723", - "lon": "-70.32928", - "id": 31928 - }, - { - "name": "Maine Avenue (North Deering)", - "lat": "43.69556", - "lon": "-70.28403", - "id": 12331 - }, - { - "name": "Maple Avenue (Deering Center)", - "lat": "43.67964", - "lon": "-70.30055", - "id": 83884 - }, - { - "name": "Maple Street (Peaks Island)", - "lat": "43.65395", - "lon": "-70.18963", - "id": 12203 - }, - { - "name": "Maple Street (Old Port)", - "lat": "43.65309", - "lon": "-70.25776", - "id": 13260 - }, - { - "name": "Maplewood Road (Great Diamond Island Landing)", - "lat": "43.66711", - "lon": "-70.21013", - "id": 40662 - }, - { - "name": "Marion Street (East End)", - "lat": "43.66688", - "lon": "-70.25182", - "id": 13246 - }, - { - "name": "Market Street (Old Port)", - "lat": "43.65786", - "lon": "-70.25398", - "id": 13066 - }, - { - "name": "Marshall Street (West End)", - "lat": "43.65146", - "lon": "-70.27225", - "id": 13384 - }, - { - "name": "Marston Street (Libbytown)", - "lat": "43.65398", - "lon": "-70.28297", - "id": 40781 - }, - { - "name": "Martin Road (North Deering)", - "lat": "43.71037", - "lon": "-70.28662", - "id": 12982 - }, - { - "name": "Mason Street (Deering Highlands)", - "lat": "43.66863", - "lon": "-70.29330", - "id": 12798 - }, - { - "name": "Massachusetts Avenue (Oakdale)", - "lat": "43.66281", - "lon": "-70.28686", - "id": 1248 - }, - { - "name": "Matthews Street (Deering Center)", - "lat": "43.67352", - "lon": "-70.29394", - "id": 12922 - }, - { - "name": "May Street (West End)", - "lat": "43.64834", - "lon": "-70.26664", - "id": 13586 - }, - { - "name": "Mayland Street (Woodfords Corner)", - "lat": "43.67630", - "lon": "-70.28533", - "id": 12910 - }, - { - "name": "Meadow Lane (North Deering)", - "lat": "43.70812", - "lon": "-70.28154", - "id": 12985 - }, - { - "name": "Meadow Road (Nasons Corner)", - "lat": "43.68705", - "lon": "-70.30975", - "id": 32783 - }, - { - "name": "Meadowbrook Lane (Nasons Corner)", - "lat": "43.66820", - "lon": "-70.31183", - "id": 13577 - }, - { - "name": "Mechanic Street (Peaks Island)", - "lat": "43.66143", - "lon": "-70.19826", - "id": 12251 - }, - { - "name": "Mechanic Street (Downtown)", - "lat": "43.65704", - "lon": "-70.26493", - "id": 13198 - }, - { - "name": "Melbourne Street (Munjoy Hill)", - "lat": "43.66973", - "lon": "-70.24851", - "id": 13048 - }, - { - "name": "Melody Lane (North Deering)", - "lat": "43.71018", - "lon": "-70.28718", - "id": 12983 - }, - { - "name": "Melrose Street (Woodfords Corner)", - "lat": "43.67073", - "lon": "-70.28038", - "id": 13152 - }, - { - "name": "Memorial Drive (Deering Center)", - "lat": "43.67936", - "lon": "-70.29572", - "id": 82528 - }, - { - "name": "Merriam Street (Peaks Island)", - "lat": "43.65345", - "lon": "-70.19049", - "id": 12193 - }, - { - "name": "Merriam Street (Rosemont)", - "lat": "43.67180", - "lon": "-70.30111", - "id": 12530 - }, - { - "name": "Merrill Street (Munjoy Hill)", - "lat": "43.66750", - "lon": "-70.24808", - "id": 13049 - }, - { - "name": "Merrymeeting Drive (North Deering)", - "lat": "43.70241", - "lon": "-70.28250", - "id": 12586 - }, - { - "name": "Middle Avenue (Nasons Corner)", - "lat": "43.67928", - "lon": "-70.30456", - "id": 76943 - }, - { - "name": "Milk Street (Old Port)", - "lat": "43.65764", - "lon": "-70.25259", - "id": 13055 - }, - { - "name": "Milliken Street (Riverton)", - "lat": "43.70680", - "lon": "-70.30413", - "id": 12410 - }, - { - "name": "Mitton Street (Rosemont)", - "lat": "43.65812", - "lon": "-70.29332", - "id": 13421 - }, - { - "name": "Monroe Street (East End)", - "lat": "43.66556", - "lon": "-70.25285", - "id": 13231 - }, - { - "name": "Montgomery Street (East End)", - "lat": "43.66311", - "lon": "-70.25160", - "id": 13127 - }, - { - "name": "Montreal Street (Munjoy Hill)", - "lat": "43.66977", - "lon": "-70.24991", - "id": 13045 - }, - { - "name": "Montrose Avenue (Rosemont)", - "lat": "43.66902", - "lon": "-70.29787", - "id": 12393 - }, - { - "name": "Monument Square (Downtown)", - "lat": "43.65749", - "lon": "-70.25873", - "id": 13254 - }, - { - "name": "Monument Street (Munjoy Hill)", - "lat": "43.66543", - "lon": "-70.24723", - "id": 13173 - }, - { - "name": "Monument Way (Downtown)", - "lat": "43.65775", - "lon": "-70.25841", - "id": 1224 - }, - { - "name": "Moody Street (Munjoy Hill)", - "lat": "43.66640", - "lon": "-70.24525", - "id": 13085 - }, - { - "name": "Morgan Court (Deering Center)", - "lat": "43.68068", - "lon": "-70.29117", - "id": 12386 - }, - { - "name": "Morning Street (Munjoy Hill)", - "lat": "43.66720", - "lon": "-70.24302", - "id": 13067 - }, - { - "name": "Morrill Street (Deering Junction)", - "lat": "43.68916", - "lon": "-70.28954", - "id": 12659 - }, - { - "name": "Morse Street (Lunts Corner)", - "lat": "43.68525", - "lon": "-70.26624", - "id": 12385 - }, - { - "name": "Motley Street (Rosemont)", - "lat": "43.66716", - "lon": "-70.29853", - "id": 13295 - }, - { - "name": "Moulton Street (Old Port)", - "lat": "43.65617", - "lon": "-70.25255", - "id": 13233 - }, - { - "name": "Mountfort Street (Munjoy Hill)", - "lat": "43.66253", - "lon": "-70.24841", - "id": 13181 - }, - { - "name": "Munjoy South (East End)", - "lat": "43.66311", - "lon": "-70.24896", - "id": 13150 - }, - { - "name": "Myrtle Avenue (Deering Center)", - "lat": "43.68109", - "lon": "-70.30160", - "id": 76939 - }, - { - "name": "Myrtle Street (Downtown)", - "lat": "43.66098", - "lon": "-70.25858", - "id": 13137 - }, - { - "name": "Nancy Lane (Great Diamond Island Landing)", - "lat": "43.67056", - "lon": "-70.19955", - "id": 12027 - }, - { - "name": "Nature Trail (Cliff Island)", - "lat": "43.69590", - "lon": "-70.09357", - "id": 77885 - }, - { - "name": "Neal Street (West End)", - "lat": "43.65148", - "lon": "-70.27214", - "id": 13383 - }, - { - "name": "New Street (Deering Center)", - "lat": "43.67763", - "lon": "-70.29568", - "id": 12508 - }, - { - "name": "Newcomb Street (Riverton)", - "lat": "43.68862", - "lon": "-70.31274", - "id": 12562 - }, - { - "name": "Newman Street (Deering Center)", - "lat": "43.67917", - "lon": "-70.30005", - "id": 12499 - }, - { - "name": "Newton Street (Riverton)", - "lat": "43.70086", - "lon": "-70.30231", - "id": 12434 - }, - { - "name": "Ninth Street (North Deering)", - "lat": "43.69870", - "lon": "-70.29960", - "id": 12448 - }, - { - "name": "North Street (East End)", - "lat": "43.66925", - "lon": "-70.25167", - "id": 13130 - }, - { - "name": "Northwood Drive (North Deering)", - "lat": "43.70612", - "lon": "-70.29566", - "id": 12949 - }, - { - "name": "Norwood Street (Woodfords Corner)", - "lat": "43.67112", - "lon": "-70.28862", - "id": 12606 - }, - { - "name": "Noyes Street (Oakdale)", - "lat": "43.66471", - "lon": "-70.28261", - "id": 12610 - }, - { - "name": "Nye Street (Downtown)", - "lat": "43.65123", - "lon": "-70.25965", - "id": 13109 - }, - { - "name": "Oak Avenue (Peaks Island)", - "lat": "43.65339", - "lon": "-70.19976", - "id": 12068 - }, - { - "name": "Oak Grove Road (Great Diamond Island Landing)", - "lat": "43.66640", - "lon": "-70.20841", - "id": 40279 - }, - { - "name": "Oak Street (Downtown)", - "lat": "43.65570", - "lon": "-70.26216", - "id": 13165 - }, - { - "name": "Oakdale Street (Oakdale)", - "lat": "43.66595", - "lon": "-70.28040", - "id": 12611 - }, - { - "name": "Oakland Avenue (Peaks Island)", - "lat": "43.65421", - "lon": "-70.19581", - "id": 12110 - }, - { - "name": "Ocean Avenue (East Deering)", - "lat": "43.69205", - "lon": "-70.26536", - "id": 12648 - }, - { - "name": "Ocean Street (Trefethen)", - "lat": "43.66494", - "lon": "-70.19513", - "id": 12237 - }, - { - "name": "Ocean View Terrace (Peaks Island)", - "lat": "43.65362", - "lon": "-70.18927", - "id": 12151 - }, - { - "name": "Oceanview Road (Fort Gorges)", - "lat": "43.66657", - "lon": "-70.21070", - "id": 40265 - }, - { - "name": "Ohio Street (North Deering)", - "lat": "43.69704", - "lon": "-70.28233", - "id": 13007 - }, - { - "name": "Old Birch Lane (North Deering)", - "lat": "43.71276", - "lon": "-70.28351", - "id": 39204 - }, - { - "name": "Old Mast Road (Stroudwater)", - "lat": "43.65448", - "lon": "-70.31156", - "id": 13558 - }, - { - "name": "Old Pier Road (Great Diamond Island Landing)", - "lat": "43.66500", - "lon": "-70.20826", - "id": 84651 - }, - { - "name": "Orange Street (West End)", - "lat": "43.64668", - "lon": "-70.26600", - "id": 13593 - }, - { - "name": "Orchard Street (Peaks Island)", - "lat": "43.65538", - "lon": "-70.19390", - "id": 12171 - }, - { - "name": "Orchard Street (West End)", - "lat": "43.64563", - "lon": "-70.27079", - "id": 13580 - }, - { - "name": "Orono Road (Nasons Corner)", - "lat": "43.67770", - "lon": "-70.31673", - "id": 13455 - }, - { - "name": "Ottawa Avenue (Cushing Island)", - "lat": "43.64226", - "lon": "-70.20504", - "id": 12296 - }, - { - "name": "Par Drive (Riverton)", - "lat": "43.70908", - "lon": "-70.31239", - "id": 12572 - }, - { - "name": "Park Avenue (Peaks Island)", - "lat": "43.66143", - "lon": "-70.19431", - "id": 12147 - }, - { - "name": "Park Avenue (West End)", - "lat": "43.65693", - "lon": "-70.27210", - "id": 13092 - }, - { - "name": "Park Street (Downtown)", - "lat": "43.65261", - "lon": "-70.26358", - "id": 13125 - }, - { - "name": "Parsons Road (Woodfords Corner)", - "lat": "43.67548", - "lon": "-70.28235", - "id": 12914 - }, - { - "name": "Partridge Road (Stroudwater)", - "lat": "43.66104", - "lon": "-70.31889", - "id": 13361 - }, - { - "name": "Penwood Drive (Nasons Corner)", - "lat": "43.68348", - "lon": "-70.31366", - "id": 13434 - }, - { - "name": "Perimeter Road (Stroudwater)", - "lat": "43.65402", - "lon": "-70.30810", - "id": 13547 - }, - { - "name": "Pershing Street (Deering Center)", - "lat": "43.67976", - "lon": "-70.29061", - "id": 12899 - }, - { - "name": "Philbrick Avenue (Nasons Corner)", - "lat": "43.67279", - "lon": "-70.31840", - "id": 40526 - }, - { - "name": "Phipps Road (Nasons Corner)", - "lat": "43.67517", - "lon": "-70.30484", - "id": 13478 - }, - { - "name": "Pierce Avenue (Stroudwater)", - "lat": "43.66227", - "lon": "-70.32535", - "id": 13344 - }, - { - "name": "Pine Street (West End)", - "lat": "43.65146", - "lon": "-70.26873", - "id": 324 - }, - { - "name": "Pinecrest Road (Sagamore Village)", - "lat": "43.68462", - "lon": "-70.31557", - "id": 13431 - }, - { - "name": "Pinewood Road (Riverton)", - "lat": "43.69771", - "lon": "-70.32027", - "id": 12733 - }, - { - "name": "Pitt Street (Oakdale)", - "lat": "43.66556", - "lon": "-70.27703", - "id": 12866 - }, - { - "name": "Pleasant Avenue (Trefethen)", - "lat": "43.67043", - "lon": "-70.18738", - "id": 12153 - }, - { - "name": "Pleasant Avenue (Deering Center)", - "lat": "43.67487", - "lon": "-70.29731", - "id": 12521 - }, - { - "name": "Pleasant Street (Downtown)", - "lat": "43.65311", - "lon": "-70.26008", - "id": 13229 - }, - { - "name": "Poland Street (Morrills Corner)", - "lat": "43.68414", - "lon": "-70.29312", - "id": 12884 - }, - { - "name": "Portland Fish Pier (Old Port)", - "lat": "43.65218", - "lon": "-70.25411", - "id": 13044 - }, - { - "name": "Portland Street (Downtown)", - "lat": "43.65808", - "lon": "-70.26493", - "id": 1435 - }, - { - "name": "Powsland Street (Rosemont)", - "lat": "43.65780", - "lon": "-70.29299", - "id": 13426 - }, - { - "name": "Preble Street (Downtown)", - "lat": "43.66011", - "lon": "-70.26343", - "id": 13098 - }, - { - "name": "Prentiss Street (East Deering)", - "lat": "43.68573", - "lon": "-70.25682", - "id": 12720 - }, - { - "name": "Primrose Lane (North Deering)", - "lat": "43.70697", - "lon": "-70.29787", - "id": 12412 - }, - { - "name": "Prince Avenue (Evergreen Landing)", - "lat": "43.66990", - "lon": "-70.18513", - "id": 12159 - }, - { - "name": "Princeton Street (Deering Junction)", - "lat": "43.68974", - "lon": "-70.28986", - "id": 12654 - }, - { - "name": "Prospect Avenue (Peaks Island)", - "lat": "43.65643", - "lon": "-70.19534", - "id": 12219 - }, - { - "name": "Prospect Street (Deering Highlands)", - "lat": "43.66755", - "lon": "-70.29252", - "id": 12683 - }, - { - "name": "Prospect Street (Peaks Island)", - "lat": "43.65583", - "lon": "-70.19682", - "id": 41416 - }, - { - "name": "Providence Street (Lunts Corner)", - "lat": "43.68828", - "lon": "-70.26553", - "id": 12698 - }, - { - "name": "Purchase Street (Sagamore Village)", - "lat": "43.67611", - "lon": "-70.31971", - "id": 38312 - }, - { - "name": "Quaker Lane (North Deering)", - "lat": "43.71087", - "lon": "-70.29699", - "id": 12623 - }, - { - "name": "Quarry Road (Deering Junction)", - "lat": "43.68766", - "lon": "-70.28482", - "id": 12945 - }, - { - "name": "Quebec Street (Munjoy Hill)", - "lat": "43.66952", - "lon": "-70.24778", - "id": 13099 - }, - { - "name": "Rabbit Run (Bradleys Corner)", - "lat": "43.66067", - "lon": "-70.30171", - "id": 13368 - }, - { - "name": "Rackleff Street (Deering Highlands)", - "lat": "43.66921", - "lon": "-70.29119", - "id": 12792 - }, - { - "name": "Rand Road (Sagamore Village)", - "lat": "43.67009", - "lon": "-70.32246", - "id": 13540 - }, - { - "name": "Randall Street (East Deering)", - "lat": "43.68091", - "lon": "-70.25950", - "id": 12595 - }, - { - "name": "Ray Street (North Deering)", - "lat": "43.69531", - "lon": "-70.27855", - "id": 12333 - }, - { - "name": "Raymond Road (Nasons Corner)", - "lat": "43.67445", - "lon": "-70.31126", - "id": 13485 - }, - { - "name": "Read Street (Woodfords Corner)", - "lat": "43.68167", - "lon": "-70.28332", - "id": 12353 - }, - { - "name": "Redlon Road (Brighton Corner)", - "lat": "43.66362", - "lon": "-70.29875", - "id": 13323 - }, - { - "name": "Reed Avenue (Evergreen Landing)", - "lat": "43.67200", - "lon": "-70.18281", - "id": 12211 - }, - { - "name": "Reservoir Road (Trefethen)", - "lat": "43.66008", - "lon": "-70.18073", - "id": 12241 - }, - { - "name": "Revere Street (Woodfords Corner)", - "lat": "43.67023", - "lon": "-70.28461", - "id": 12765 - }, - { - "name": "Rice Road (Riverton)", - "lat": "43.71008", - "lon": "-70.30531", - "id": 34772 - }, - { - "name": "Richardson Street (Deering Center)", - "lat": "43.67798", - "lon": "-70.29851", - "id": 12505 - }, - { - "name": "Richmond Street (East Deering)", - "lat": "43.68289", - "lon": "-70.25422", - "id": 12813 - }, - { - "name": "Rivers Edge Drive (Stroudwater)", - "lat": "43.65733", - "lon": "-70.32085", - "id": 13524 - }, - { - "name": "Riverview Street (Rosemont)", - "lat": "43.66334", - "lon": "-70.30576", - "id": 13328 - }, - { - "name": "Roberts Street (Oakdale)", - "lat": "43.65864", - "lon": "-70.28139", - "id": 13400 - }, - { - "name": "Robin Street (Sagamore Village)", - "lat": "43.68288", - "lon": "-70.31958", - "id": 13436 - }, - { - "name": "Rockland Avenue (Rosemont)", - "lat": "43.66762", - "lon": "-70.30465", - "id": 13287 - }, - { - "name": "Rockwood Terrace (North Deering)", - "lat": "43.71023", - "lon": "-70.27611", - "id": 33340 - }, - { - "name": "Rosedale Street (East Deering)", - "lat": "43.68397", - "lon": "-70.27407", - "id": 12777 - }, - { - "name": "Rosemont Avenue (Rosemont)", - "lat": "43.67163", - "lon": "-70.29948", - "id": 12531 - }, - { - "name": "Rosewood Avenue (Nasons Corner)", - "lat": "43.67883", - "lon": "-70.30471", - "id": 84079 - }, - { - "name": "Roundabout Lane (Stroudwater)", - "lat": "43.66197", - "lon": "-70.31553", - "id": 13350 - }, - { - "name": "Ruby Lane (North Deering)", - "lat": "43.69439", - "lon": "-70.29553", - "id": 12871 - }, - { - "name": "Rudman Road (Bradleys Corner)", - "lat": "43.66110", - "lon": "-70.29819", - "id": 13362 - }, - { - "name": "Runnells Street (Rosemont)", - "lat": "43.66852", - "lon": "-70.29827", - "id": 12368 - }, - { - "name": "Russell Street (West End)", - "lat": "43.65323", - "lon": "-70.27465", - "id": 13631 - }, - { - "name": "Rustic Lane (North Deering)", - "lat": "43.71102", - "lon": "-70.28660", - "id": 12981 - }, - { - "name": "Saint George Street (Oakdale)", - "lat": "43.66463", - "lon": "-70.28606", - "id": 40240 - }, - { - "name": "Saint James Street (Oakdale)", - "lat": "43.65887", - "lon": "-70.28430", - "id": 33625 - }, - { - "name": "Saint John Street (Libbytown)", - "lat": "43.65413", - "lon": "-70.28021", - "id": 595 - }, - { - "name": "Saint Joseph Street (Deering Center)", - "lat": "43.68133", - "lon": "-70.29327", - "id": 35056 - }, - { - "name": "Salem Street (West End)", - "lat": "43.64653", - "lon": "-70.26383", - "id": 13519 - }, - { - "name": "Samuel Road (North Deering)", - "lat": "43.69563", - "lon": "-70.28690", - "id": 12326 - }, - { - "name": "Sanborn Street (North Deering)", - "lat": "43.70446", - "lon": "-70.29016", - "id": 12990 - }, - { - "name": "Sanctuary Lane (East Deering)", - "lat": "43.69177", - "lon": "-70.26199", - "id": 13014 - }, - { - "name": "Sandpiper Road (Peaks Island)", - "lat": "43.65385", - "lon": "-70.18180", - "id": 12122 - }, - { - "name": "Sandy Beach Road (Fort Gorges)", - "lat": "43.66430", - "lon": "-70.21083", - "id": 12318 - }, - { - "name": "Sandy Terrace (Rosemont)", - "lat": "43.66911", - "lon": "-70.30810", - "id": 13574 - }, - { - "name": "Sara Lane (North Deering)", - "lat": "43.69560", - "lon": "-70.28557", - "id": 12327 - }, - { - "name": "Sargent Road (Trefethen)", - "lat": "43.66692", - "lon": "-70.18901", - "id": 12126 - }, - { - "name": "Sawyer Street (Woodfords Corner)", - "lat": "43.67565", - "lon": "-70.28482", - "id": 12912 - }, - { - "name": "School Street (West End)", - "lat": "43.64673", - "lon": "-70.26531", - "id": 13644 - }, - { - "name": "Schooner Lane (East Deering)", - "lat": "43.68905", - "lon": "-70.26173", - "id": 12734 - }, - { - "name": "Scott Street (Rosemont)", - "lat": "43.65996", - "lon": "-70.29199", - "id": 13409 - }, - { - "name": "Seashore Avenue (Trefethen)", - "lat": "43.66020", - "lon": "-70.17753", - "id": 12056 - }, - { - "name": "Sewage Plant Road (Bayside)", - "lat": "43.67287", - "lon": "-70.25712", - "id": 36099 - }, - { - "name": "Sewall Street (Rosemont)", - "lat": "43.65742", - "lon": "-70.29109", - "id": 13546 - }, - { - "name": "Shamrock Lane (Cushing Island)", - "lat": "43.64014", - "lon": "-70.20521", - "id": 12313 - }, - { - "name": "Shepard Lane (Riverton)", - "lat": "43.70761", - "lon": "-70.30259", - "id": 37860 - }, - { - "name": "Shepherd Lane (North Deering)", - "lat": "43.70969", - "lon": "-70.29787", - "id": 12377 - }, - { - "name": "Shepley Street (Downtown)", - "lat": "43.65652", - "lon": "-70.26233", - "id": 38533 - }, - { - "name": "Sheridan Street (East End)", - "lat": "43.66601", - "lon": "-70.25081", - "id": 13039 - }, - { - "name": "Sherman Street (Downtown)", - "lat": "43.65629", - "lon": "-70.26712", - "id": 13091 - }, - { - "name": "Sherwood Street (East Deering)", - "lat": "43.68266", - "lon": "-70.25819", - "id": 12348 - }, - { - "name": "Shore Avenue (Deering Center)", - "lat": "43.68417", - "lon": "-70.30317", - "id": 76935 - }, - { - "name": "Shore Road (Cushing Island)", - "lat": "43.64219", - "lon": "-70.20663", - "id": 12299 - }, - { - "name": "Short Street (North Deering)", - "lat": "43.69858", - "lon": "-70.29046", - "id": 12450 - }, - { - "name": "Silver Street (Old Port)", - "lat": "43.65739", - "lon": "-70.25263", - "id": 13267 - }, - { - "name": "Sixth Street (North Deering)", - "lat": "43.69625", - "lon": "-70.29808", - "id": 12462 - }, - { - "name": "Skillings Avenue (Trefethen)", - "lat": "43.66784", - "lon": "-70.18925", - "id": 39918 - }, - { - "name": "Sorrento Road (Fort Gorges)", - "lat": "43.66548", - "lon": "-70.20972", - "id": 12295 - }, - { - "name": "South Road (Cliff Island)", - "lat": "43.69391", - "lon": "-70.10955", - "id": 12042 - }, - { - "name": "South Street (Old Port)", - "lat": "43.65468", - "lon": "-70.25849", - "id": 1193 - }, - { - "name": "Southern Avenue (Deering Center)", - "lat": "43.68148", - "lon": "-70.29624", - "id": 31927 - }, - { - "name": "Spar Cove Road (Trefethen)", - "lat": "43.66516", - "lon": "-70.18502", - "id": 12195 - }, - { - "name": "Spar Lane (Stroudwater)", - "lat": "43.66391", - "lon": "-70.31900", - "id": 13321 - }, - { - "name": "Spring Avenue (Great Diamond Island Landing)", - "lat": "43.67532", - "lon": "-70.20189", - "id": 12289 - }, - { - "name": "Spring Cove Avenue (Fort Levett)", - "lat": "43.64522", - "lon": "-70.19907", - "id": 12302 - }, - { - "name": "Spring Street (Downtown)", - "lat": "43.65201", - "lon": "-70.26336", - "id": 13072 - }, - { - "name": "Spring Street Place (Downtown)", - "lat": "43.65298", - "lon": "-70.26302", - "id": 13278 - }, - { - "name": "Spruce Avenue (Peaks Island)", - "lat": "43.65401", - "lon": "-70.19210", - "id": 12078 - }, - { - "name": "Spruce Street (West End)", - "lat": "43.64813", - "lon": "-70.26997", - "id": 13545 - }, - { - "name": "St George Street (Oakdale)", - "lat": "43.66438", - "lon": "-70.28583", - "id": 12676 - }, - { - "name": "St James Street (Libbytown)", - "lat": "43.65806", - "lon": "-70.28454", - "id": 13641 - }, - { - "name": "St John Street (Oakdale)", - "lat": "43.66354", - "lon": "-70.28469", - "id": 13022 - }, - { - "name": "St John Street (West End)", - "lat": "43.65075", - "lon": "-70.27900", - "id": 13633 - }, - { - "name": "St Joseph Street (Deering Center)", - "lat": "43.68142", - "lon": "-70.29263", - "id": 13029 - }, - { - "name": "Starbird Road (Rosemont)", - "lat": "43.66731", - "lon": "-70.31033", - "id": 13402 - }, - { - "name": "State Street (West End)", - "lat": "43.65295", - "lon": "-70.26716", - "id": 322 - }, - { - "name": "Stepping Stone Lane (North Deering)", - "lat": "43.69677", - "lon": "-70.27709", - "id": 12880 - }, - { - "name": "Sterling Street (Peaks Island)", - "lat": "43.65868", - "lon": "-70.19710", - "id": 12114 - }, - { - "name": "Stetson Street (Downtown)", - "lat": "43.65027", - "lon": "-70.26074", - "id": 40989 - }, - { - "name": "Stevens Avenue (Deering Center)", - "lat": "43.68210", - "lon": "-70.29443", - "id": 12358 - }, - { - "name": "Stone Street (Downtown)", - "lat": "43.66025", - "lon": "-70.25815", - "id": 13136 - }, - { - "name": "Storer Street (West End)", - "lat": "43.64615", - "lon": "-70.26888", - "id": 13645 - }, - { - "name": "Stuart Street (Riverton)", - "lat": "43.70012", - "lon": "-70.30692", - "id": 12443 - }, - { - "name": "Sullivan Street (East Deering)", - "lat": "43.68352", - "lon": "-70.25195", - "id": 12781 - }, - { - "name": "Summer Street (West End)", - "lat": "43.64758", - "lon": "-70.26218", - "id": 13624 - }, - { - "name": "Summit Avenue (Great Diamond Island Landing)", - "lat": "43.67631", - "lon": "-70.20124", - "id": 12292 - }, - { - "name": "Sunrise Lane (McKinley Estates)", - "lat": "43.68488", - "lon": "-70.19285", - "id": 12018 - }, - { - "name": "Sunset Avenue (Great Diamond Island Landing)", - "lat": "43.67636", - "lon": "-70.20191", - "id": 12011 - }, - { - "name": "Sunset Avenue (Deering Center)", - "lat": "43.67872", - "lon": "-70.29658", - "id": 76927 - }, - { - "name": "Sunset Lane (Sagamore Village)", - "lat": "43.68190", - "lon": "-70.31735", - "id": 13442 - }, - { - "name": "Sunset Road (Cliff Island)", - "lat": "43.69562", - "lon": "-70.10876", - "id": 12008 - }, - { - "name": "Sunset Road (Trefethen)", - "lat": "43.66557", - "lon": "-70.19457", - "id": 12235 - }, - { - "name": "Swan Street (Stroudwater)", - "lat": "43.66281", - "lon": "-70.32503", - "id": 13335 - }, - { - "name": "Taft Avenue (Sagamore Village)", - "lat": "43.68257", - "lon": "-70.31967", - "id": 13439 - }, - { - "name": "Tampa Street (North Deering)", - "lat": "43.70651", - "lon": "-70.27995", - "id": 12742 - }, - { - "name": "Taylor Street (West End)", - "lat": "43.64746", - "lon": "-70.26697", - "id": 13398 - }, - { - "name": "Technology Park Drive (Stroudwater)", - "lat": "43.66342", - "lon": "-70.32881", - "id": 13642 - }, - { - "name": "Temple Street (Downtown)", - "lat": "43.65789", - "lon": "-70.25665", - "id": 13114 - }, - { - "name": "Terrace Avenue (Nasons Corner)", - "lat": "43.67330", - "lon": "-70.31913", - "id": 13559 - }, - { - "name": "Thomas Street (West End)", - "lat": "43.64747", - "lon": "-70.27085", - "id": 13382 - }, - { - "name": "Thompsons Point Road (Libbytown)", - "lat": "43.65024", - "lon": "-70.29087", - "id": 13508 - }, - { - "name": "Tide Mill Road (Stroudwater)", - "lat": "43.65461", - "lon": "-70.31598", - "id": 13388 - }, - { - "name": "Tolman Road (Trefethen)", - "lat": "43.66677", - "lon": "-70.18697", - "id": 12133 - }, - { - "name": "Trefethen Avenue (Trefethen)", - "lat": "43.66821", - "lon": "-70.18914", - "id": 12227 - }, - { - "name": "Tremont Street (Deering Center)", - "lat": "43.67248", - "lon": "-70.29336", - "id": 12621 - }, - { - "name": "True Street (East Deering)", - "lat": "43.68957", - "lon": "-70.26381", - "id": 12656 - }, - { - "name": "Trundy Road (Sagamore Village)", - "lat": "43.68753", - "lon": "-70.31175", - "id": 40567 - }, - { - "name": "Turner Street (Munjoy Hill)", - "lat": "43.66823", - "lon": "-70.24705", - "id": 13205 - }, - { - "name": "Tyng Street (Downtown)", - "lat": "43.64879", - "lon": "-70.26059", - "id": 13518 - }, - { - "name": "Union Street (Old Port)", - "lat": "43.65510", - "lon": "-70.25465", - "id": 13252 - }, - { - "name": "University Park (North Deering)", - "lat": "43.69202", - "lon": "-70.29205", - "id": 37326 - }, - { - "name": "University Street (Deering Junction)", - "lat": "43.68950", - "lon": "-70.28834", - "id": 12657 - }, - { - "name": "Valley Avenue (Great Diamond Island Landing)", - "lat": "43.67737", - "lon": "-70.19880", - "id": 12286 - }, - { - "name": "Valley Avenue (Nasons Corner)", - "lat": "43.68280", - "lon": "-70.30510", - "id": 84077 - }, - { - "name": "Valley Street (West End)", - "lat": "43.65149", - "lon": "-70.27789", - "id": 13404 - }, - { - "name": "Vaughan Street (West End)", - "lat": "43.64862", - "lon": "-70.27297", - "id": 13525 - }, - { - "name": "Vermont Avenue (North Deering)", - "lat": "43.70114", - "lon": "-70.27516", - "id": 12754 - }, - { - "name": "Vermont Avenue (Trefethen)", - "lat": "43.66244", - "lon": "-70.19026", - "id": 40886 - }, - { - "name": "Vesper Street (Munjoy Hill)", - "lat": "43.66666", - "lon": "-70.24384", - "id": 13217 - }, - { - "name": "Victoria Street (East Deering)", - "lat": "43.68767", - "lon": "-70.25068", - "id": 12705 - }, - { - "name": "View Street (Riverton)", - "lat": "43.70376", - "lon": "-70.32108", - "id": 12420 - }, - { - "name": "Violette Avenue (Nasons Corner)", - "lat": "43.67406", - "lon": "-70.31113", - "id": 13490 - }, - { - "name": "Virginia Avenue (Trefethen)", - "lat": "43.66382", - "lon": "-70.18401", - "id": 33021 - }, - { - "name": "Virginia Street (North Deering)", - "lat": "43.70626", - "lon": "-70.28040", - "id": 12994 - }, - { - "name": "Wadsworth Street (Oakdale)", - "lat": "43.66539", - "lon": "-70.28424", - "id": 33585 - }, - { - "name": "Waldo Street (Stroudwater)", - "lat": "43.65786", - "lon": "-70.31147", - "id": 13423 - }, - { - "name": "Walker Street (West End)", - "lat": "43.65269", - "lon": "-70.26980", - "id": 13610 - }, - { - "name": "Wall Street (North Deering)", - "lat": "43.69571", - "lon": "-70.29823", - "id": 12463 - }, - { - "name": "Walnut Street (Munjoy Hill)", - "lat": "43.67009", - "lon": "-70.24965", - "id": 13047 - }, - { - "name": "Walton Court (Woodfords Corner)", - "lat": "43.67902", - "lon": "-70.28392", - "id": 34360 - }, - { - "name": "Walton Street (Deering Center)", - "lat": "43.68037", - "lon": "-70.29136", - "id": 12594 - }, - { - "name": "Warwick Street (Nasons Corner)", - "lat": "43.67996", - "lon": "-70.31392", - "id": 13447 - }, - { - "name": "Washburn Avenue (Oakdale)", - "lat": "43.66072", - "lon": "-70.27493", - "id": 13036 - }, - { - "name": "Washington Avenue (East End)", - "lat": "43.66508", - "lon": "-70.25160", - "id": 1026 - }, - { - "name": "Watson Street (East Deering)", - "lat": "43.68294", - "lon": "-70.25240", - "id": 12789 - }, - { - "name": "Waverly Street (Deering Center)", - "lat": "43.68300", - "lon": "-70.29175", - "id": 12390 - }, - { - "name": "Wayside Road (Nasons Corner)", - "lat": "43.67610", - "lon": "-70.30548", - "id": 13471 - }, - { - "name": "Webb Street (Sagamore Village)", - "lat": "43.67358", - "lon": "-70.31928", - "id": 13541 - }, - { - "name": "Welch Street (Peaks Island)", - "lat": "43.65565", - "lon": "-70.19843", - "id": 12098 - }, - { - "name": "Wellington Road (Woodfords Corner)", - "lat": "43.68044", - "lon": "-70.28336", - "id": 12363 - }, - { - "name": "Wescott Street (West End)", - "lat": "43.65390", - "lon": "-70.27491", - "id": 33631 - }, - { - "name": "West Shore Drive (McKinley Estates)", - "lat": "43.68556", - "lon": "-70.19957", - "id": 12013 - }, - { - "name": "West Street (West End)", - "lat": "43.65070", - "lon": "-70.27278", - "id": 13534 - }, - { - "name": "Westbrook Arterial (Sagamore Village)", - "lat": "43.66658", - "lon": "-70.32952", - "id": 77372 - }, - { - "name": "Western Avenue (Deering Center)", - "lat": "43.68307", - "lon": "-70.29922", - "id": 76930 - }, - { - "name": "Western Promenade (West End)", - "lat": "43.64896", - "lon": "-70.27531", - "id": 13581 - }, - { - "name": "Westfield Street (Libbytown)", - "lat": "43.65302", - "lon": "-70.28257", - "id": 13544 - }, - { - "name": "Westland Avenue (Bradleys Corner)", - "lat": "43.65815", - "lon": "-70.29978", - "id": 13420 - }, - { - "name": "Westminster Avenue (Rosemont)", - "lat": "43.67278", - "lon": "-70.30126", - "id": 12527 - }, - { - "name": "Weymouth Street (Great Diamond Island Landing)", - "lat": "43.67442", - "lon": "-70.20105", - "id": 12017 - }, - { - "name": "Weymouth Street (West End)", - "lat": "43.65514", - "lon": "-70.27613", - "id": 13629 - }, - { - "name": "Weymouth Way (McKinley Estates)", - "lat": "43.68238", - "lon": "-70.19075", - "id": 34956 - }, - { - "name": "Whaleback Road (Trefethen)", - "lat": "43.66110", - "lon": "-70.17933", - "id": 12239 - }, - { - "name": "Wharf Road (Cliff Island)", - "lat": "43.69470", - "lon": "-70.10960", - "id": 12004 - }, - { - "name": "Wharf Street (Old Port)", - "lat": "43.65590", - "lon": "-70.25405", - "id": 1581 - }, - { - "name": "White Birch Lane (North Deering)", - "lat": "43.69650", - "lon": "-70.28868", - "id": 12635 - }, - { - "name": "Whitehead Avenue (Cushing Island)", - "lat": "43.64173", - "lon": "-70.20251", - "id": 12304 - }, - { - "name": "Whitney Avenue (Deering Highlands)", - "lat": "43.66432", - "lon": "-70.28890", - "id": 13314 - }, - { - "name": "Whittier Street (East Deering)", - "lat": "43.68698", - "lon": "-70.25379", - "id": 12711 - }, - { - "name": "Wiley Street (Peaks Island)", - "lat": "43.66138", - "lon": "-70.19259", - "id": 12149 - }, - { - "name": "William Street (Oakdale)", - "lat": "43.66332", - "lon": "-70.28119", - "id": 12620 - }, - { - "name": "Willis Street (McKinley Estates)", - "lat": "43.68074", - "lon": "-70.19978", - "id": 12284 - }, - { - "name": "Willis Street (Munjoy Hill)", - "lat": "43.66956", - "lon": "-70.25053", - "id": 13180 - }, - { - "name": "Willow Lane (Bradleys Corner)", - "lat": "43.65656", - "lon": "-70.29544", - "id": 13596 - }, - { - "name": "Willow Street (Peaks Island)", - "lat": "43.65680", - "lon": "-70.19736", - "id": 12118 - }, - { - "name": "Wilson Street (Munjoy Hill)", - "lat": "43.66536", - "lon": "-70.24480", - "id": 13190 - }, - { - "name": "Winding Way (Peaks Island)", - "lat": "43.65364", - "lon": "-70.18807", - "id": 12088 - }, - { - "name": "Winding Way (Nasons Corner)", - "lat": "43.66765", - "lon": "-70.31259", - "id": 13284 - }, - { - "name": "Windsor Terrace (East Deering)", - "lat": "43.68156", - "lon": "-70.25268", - "id": 12664 - }, - { - "name": "Wingate Drive (Nasons Corner)", - "lat": "43.67430", - "lon": "-70.30542", - "id": 13486 - }, - { - "name": "Winter Street (West End)", - "lat": "43.65201", - "lon": "-70.26755", - "id": 13395 - }, - { - "name": "Winthrop Street (East End)", - "lat": "43.66694", - "lon": "-70.25420", - "id": 13244 - }, - { - "name": "Woodbury Street (North Deering)", - "lat": "43.70010", - "lon": "-70.30132", - "id": 12444 - }, - { - "name": "Woodford Street (Brighton Corner)", - "lat": "43.67003", - "lon": "-70.29553", - "id": 12542 - }, - { - "name": "Woodland Road (Trefethen)", - "lat": "43.66865", - "lon": "-70.18435", - "id": 12266 - }, - { - "name": "Woodlawn Avenue (Morrills Corner)", - "lat": "43.69106", - "lon": "-70.29177", - "id": 12650 - }, - { - "name": "Woodlawn Avenue (Deering Center)", - "lat": "43.68052", - "lon": "-70.30351", - "id": 76929 - }, - { - "name": "Woodmont Street (Oakdale)", - "lat": "43.66197", - "lon": "-70.28042", - "id": 13353 - }, - { - "name": "Woods Road (Evergreen Landing)", - "lat": "43.67200", - "lon": "-70.18564", - "id": 12157 - }, - { - "name": "Woodside Drive (McKinley Estates)", - "lat": "43.68631", - "lon": "-70.19180", - "id": 84422 - }, - { - "name": "Wyoming Avenue (North Deering)", - "lat": "43.70479", - "lon": "-70.28119", - "id": 12577 - }, - { - "name": "Yale Street (North Deering)", - "lat": "43.69148", - "lon": "-70.28787", - "id": 12583 - }, - { - "name": "Yellowbird Road (Bradleys Corner)", - "lat": "43.64913", - "lon": "-70.30014", - "id": 13530 - }, - { - "name": "York Street (Old Port)", - "lat": "43.65303", - "lon": "-70.25768", - "id": 1312 - }, - { - "name": "2 Portland Fish Pier Portland ME Representative Pingrees Office", - "lat": "43.65213", - "lon": "-70.25525", - "id": 32528 - }, - { - "name": "3 Trail", - "lat": "43.66907", - "lon": "-70.31649", - "id": 82200 - }, - { - "name": "33 Maggie Lane", - "lat": "43.69126", - "lon": "-70.29523", - "id": 31940 - }, - { - "name": "8Th Maine Avenue", - "lat": "43.65243", - "lon": "-70.19195", - "id": 12191 - }, - { - "name": "8th Main Avenue", - "lat": "43.65271", - "lon": "-70.19227", - "id": 39634 - }, - { - "name": "Abaco Street", - "lat": "43.62582", - "lon": "-70.22937", - "id": 40197 - }, - { - "name": "Abbadaba Road", - "lat": "43.78604", - "lon": "-70.35780", - "id": 40405 - }, - { - "name": "Abigail Way", - "lat": "43.60282", - "lon": "-70.33323", - "id": 35566 - }, - { - "name": "Adam Roberts Drive", - "lat": "43.75473", - "lon": "-70.40243", - "id": 34603 - }, - { - "name": "Adelaide Street", - "lat": "43.68535", - "lon": "-70.29057", - "id": 12882 - }, - { - "name": "Aimhi Woods Road", - "lat": "43.86246", - "lon": "-70.41799", - "id": 37160 - }, - { - "name": "Al McKay Avenue", - "lat": "43.65080", - "lon": "-70.31188", - "id": 38616 - }, - { - "name": "Alba Street", - "lat": "43.67796", - "lon": "-70.30128", - "id": 12506 - }, - { - "name": "Albion Street", - "lat": "43.67161", - "lon": "-70.31263", - "id": 13565 - }, - { - "name": "Alden Circle", - "lat": "43.67352", - "lon": "-70.30924", - "id": 13494 - }, - { - "name": "Alder Way", - "lat": "43.79354", - "lon": "-70.29576", - "id": 86001 - }, - { - "name": "Aldworth Street", - "lat": "43.69891", - "lon": "-70.31306", - "id": 12833 - }, - { - "name": "Alewife Cove Road", - "lat": "43.58664", - "lon": "-70.21283", - "id": 40994 - }, - { - "name": "Alewife Road", - "lat": "43.58871", - "lon": "-70.21109", - "id": 32980 - }, - { - "name": "Alger Drive", - "lat": "43.56576", - "lon": "-70.39144", - "id": 34008 - }, - { - "name": "Algonquin Road", - "lat": "43.58201", - "lon": "-70.20714", - "id": 32156 - }, - { - "name": "Alice Court", - "lat": "43.72461", - "lon": "-70.29143", - "id": 12378 - }, - { - "name": "Allmonte Road", - "lat": "43.66764", - "lon": "-70.29435", - "id": 36975 - }, - { - "name": "Almon Avenue", - "lat": "43.67009", - "lon": "-70.31930", - "id": 41217 - }, - { - "name": "Alweber Road", - "lat": "43.72515", - "lon": "-70.39721", - "id": 37744 - }, - { - "name": "Andrea Way", - "lat": "43.76208", - "lon": "-70.23922", - "id": 86252 - }, - { - "name": "Andrews Avenue", - "lat": "43.69669", - "lon": "-70.24060", - "id": 34503 - }, - { - "name": "Ann Arbor Drive", - "lat": "43.62014", - "lon": "-70.23600", - "id": 33989 - }, - { - "name": "Anthoine Road", - "lat": "43.77683", - "lon": "-70.37441", - "id": 39213 - }, - { - "name": "Anthony Vail Way", - "lat": "43.58911", - "lon": "-70.43354", - "id": 83592 - }, - { - "name": "Apple Ledge Drive", - "lat": "43.69635", - "lon": "-70.27010", - "id": 12581 - }, - { - "name": "Applebee Circle", - "lat": "43.70662", - "lon": "-70.28280", - "id": 12986 - }, - { - "name": "Applebee Court", - "lat": "43.70634", - "lon": "-70.28252", - "id": 34917 - }, - { - "name": "Appletree Court", - "lat": "43.70676", - "lon": "-70.28235", - "id": 36180 - }, - { - "name": "Arbor View Lane", - "lat": "43.59666", - "lon": "-70.31919", - "id": 32658 - }, - { - "name": "Arcadia Street", - "lat": "43.68617", - "lon": "-70.25675", - "id": 12382 - }, - { - "name": "Arcadian Lane", - "lat": "43.78670", - "lon": "-70.28209", - "id": 34526 - }, - { - "name": "Ardora Circle", - "lat": "43.57004", - "lon": "-70.39275", - "id": 39814 - }, - { - "name": "Arlington Place", - "lat": "43.67046", - "lon": "-70.28250", - "id": 13153 - }, - { - "name": "Armstrong Heights", - "lat": "43.72461", - "lon": "-70.29336", - "id": 12593 - }, - { - "name": "Ash Avenue", - "lat": "43.68275", - "lon": "-70.30248", - "id": 76937 - }, - { - "name": "Asselyn Drive", - "lat": "43.60796", - "lon": "-70.33735", - "id": 40794 - }, - { - "name": "Atlantic Drive", - "lat": "43.55223", - "lon": "-70.30269", - "id": 33699 - }, - { - "name": "Atrium Way", - "lat": "43.58627", - "lon": "-70.34754", - "id": 35633 - }, - { - "name": "Auburn Terrace", - "lat": "43.71031", - "lon": "-70.29136", - "id": 40113 - }, - { - "name": "Austrian Way", - "lat": "43.73121", - "lon": "-70.28085", - "id": 85139 - }, - { - "name": "Avon Road", - "lat": "43.69669", - "lon": "-70.23856", - "id": 32378 - }, - { - "name": "Azalea Avenue", - "lat": "43.67824", - "lon": "-70.30581", - "id": 76942 - }, - { - "name": "Babbidge Street", - "lat": "43.76962", - "lon": "-70.26834", - "id": 84492 - }, - { - "name": "Back Cove Connector", - "lat": "43.66561", - "lon": "-70.26089", - "id": 79000 - }, - { - "name": "Back Cove Estates Road", - "lat": "43.68095", - "lon": "-70.27381", - "id": 40303 - }, - { - "name": "Back Cove Trail Connector", - "lat": "43.67150", - "lon": "-70.25607", - "id": 77009 - }, - { - "name": "Bakery Lane", - "lat": "43.68454", - "lon": "-70.19392", - "id": 12281 - }, - { - "name": "Ballpark Drive", - "lat": "43.71605", - "lon": "-70.30035", - "id": 12874 - }, - { - "name": "Baltusrol Circle", - "lat": "43.76499", - "lon": "-70.27652", - "id": 38698 - }, - { - "name": "Bancroft Court", - "lat": "43.66227", - "lon": "-70.30499", - "id": 13343 - }, - { - "name": "Barley Lane", - "lat": "43.62005", - "lon": "-70.39412", - "id": 33174 - }, - { - "name": "Barnswallow Court", - "lat": "43.58111", - "lon": "-70.34542", - "id": 35179 - }, - { - "name": "Barrows Lane", - "lat": "43.74405", - "lon": "-70.03945", - "id": 40875 - }, - { - "name": "Bartley Avenue", - "lat": "43.70793", - "lon": "-70.28761", - "id": 12960 - }, - { - "name": "Basin Harbor", - "lat": "43.83672", - "lon": "-70.47081", - "id": 36982 - }, - { - "name": "Basin Harbor Drive", - "lat": "43.83589", - "lon": "-70.47180", - "id": 34252 - }, - { - "name": "Basket Lane", - "lat": "43.72377", - "lon": "-70.28694", - "id": 13726 - }, - { - "name": "Basswood Avenue", - "lat": "43.68077", - "lon": "-70.30317", - "id": 76941 - }, - { - "name": "Bates Court", - "lat": "43.67926", - "lon": "-70.25815", - "id": 33660 - }, - { - "name": "Battery Point Lane", - "lat": "43.76304", - "lon": "-70.17399", - "id": 40247 - }, - { - "name": "Battery Steele Loop", - "lat": "43.65854", - "lon": "-70.18002", - "id": 84843 - }, - { - "name": "Bay Shore Drive", - "lat": "43.69459", - "lon": "-70.24225", - "id": 37056 - }, - { - "name": "Bay Street Extension", - "lat": "43.68232", - "lon": "-70.28291", - "id": 12589 - }, - { - "name": "Bayside Promenade Multi-Use Trail", - "lat": "43.66143", - "lon": "-70.26368", - "id": 79340 - }, - { - "name": "Bayside Terrace", - "lat": "43.66446", - "lon": "-70.25759", - "id": 13144 - }, - { - "name": "Bayside Trail connector", - "lat": "43.66922", - "lon": "-70.25639", - "id": 83963 - }, - { - "name": "Baywoods Drive", - "lat": "43.57150", - "lon": "-70.33679", - "id": 33271 - }, - { - "name": "Beach Bluff Terrace", - "lat": "43.60184", - "lon": "-70.22098", - "id": 32027 - }, - { - "name": "Beachridge Motor Speedway", - "lat": "43.61015", - "lon": "-70.38123", - "id": 79384 - }, - { - "name": "Bean Pot Circle", - "lat": "43.67810", - "lon": "-70.25478", - "id": 12564 - }, - { - "name": "Bears Run Road", - "lat": "43.86681", - "lon": "-70.14494", - "id": 37909 - }, - { - "name": "Beauregard Drive", - "lat": "43.69771", - "lon": "-70.27647", - "id": 76959 - }, - { - "name": "Beaver Pond Trail", - "lat": "43.65753", - "lon": "-70.17944", - "id": 84844 - }, - { - "name": "Beckwith Street", - "lat": "43.80506", - "lon": "-70.21545", - "id": 37805 - }, - { - "name": "Bedell Street", - "lat": "43.67872", - "lon": "-70.29879", - "id": 12501 - }, - { - "name": "Bedford Falls Way", - "lat": "43.76200", - "lon": "-70.31795", - "id": 40311 - }, - { - "name": "Belden Street", - "lat": "43.69841", - "lon": "-70.31259", - "id": 12835 - }, - { - "name": "Belfield Road", - "lat": "43.61032", - "lon": "-70.22229", - "id": 37105 - }, - { - "name": "Belfield Street", - "lat": "43.66784", - "lon": "-70.29645", - "id": 12346 - }, - { - "name": "Belfort Street", - "lat": "43.69628", - "lon": "-70.30690", - "id": 12847 - }, - { - "name": "Belvidere Road", - "lat": "43.66762", - "lon": "-70.19075", - "id": 33030 - }, - { - "name": "Bentridge Drive", - "lat": "43.75532", - "lon": "-70.31990", - "id": 35085 - }, - { - "name": "Best Street", - "lat": "43.67821", - "lon": "-70.29877", - "id": 12373 - }, - { - "name": "Beverly Terrace", - "lat": "43.61963", - "lon": "-70.25077", - "id": 39741 - }, - { - "name": "Bimmer Drive", - "lat": "43.79593", - "lon": "-70.36252", - "id": 81140 - }, - { - "name": "Birch Forest Drive", - "lat": "43.82032", - "lon": "-70.47412", - "id": 32505 - }, - { - "name": "Birchvale Drive", - "lat": "43.68251", - "lon": "-70.31716", - "id": 13440 - }, - { - "name": "Birchwood Circle", - "lat": "43.74090", - "lon": "-70.26308", - "id": 39509 - }, - { - "name": "Birdsong Lane", - "lat": "43.78925", - "lon": "-70.36700", - "id": 35549 - }, - { - "name": "Birkdale Road", - "lat": "43.76533", - "lon": "-70.26051", - "id": 32557 - }, - { - "name": "Bismark Street", - "lat": "43.68839", - "lon": "-70.25083", - "id": 12697 - }, - { - "name": "Black Point Meadows", - "lat": "43.57386", - "lon": "-70.31606", - "id": 32147 - }, - { - "name": "Blackstrap Way", - "lat": "43.73438", - "lon": "-70.31377", - "id": 32348 - }, - { - "name": "Blossom Road", - "lat": "43.68718", - "lon": "-70.31018", - "id": 35097 - }, - { - "name": "Blue Moon Drive", - "lat": "43.84380", - "lon": "-70.24688", - "id": 83273 - }, - { - "name": "Bluff - North Point", - "lat": "43.69815", - "lon": "-70.08893", - "id": 77887 - }, - { - "name": "Bluff - South Point", - "lat": "43.69486", - "lon": "-70.09267", - "id": 77886 - }, - { - "name": "Blyth Court", - "lat": "43.65135", - "lon": "-70.27040", - "id": 40337 - }, - { - "name": "Blythe Court", - "lat": "43.65121", - "lon": "-70.26907", - "id": 13393 - }, - { - "name": "Boat Cove Road", - "lat": "43.58905", - "lon": "-70.21884", - "id": 85995 - }, - { - "name": "Bond Brook Drive", - "lat": "43.59472", - "lon": "-70.43833", - "id": 41523 - }, - { - "name": "Bornheimer Place", - "lat": "43.57957", - "lon": "-70.31289", - "id": 41154 - }, - { - "name": "Brackett Farm Lane", - "lat": "43.72182", - "lon": "-70.39037", - "id": 38141 - }, - { - "name": "Brackett Pond Trail", - "lat": "43.65395", - "lon": "-70.18528", - "id": 84846 - }, - { - "name": "Braddish Court", - "lat": "43.71189", - "lon": "-70.29345", - "id": 12340 - }, - { - "name": "Brads Way", - "lat": "43.88643", - "lon": "-70.40869", - "id": 41068 - }, - { - "name": "Braebrook Road", - "lat": "43.66956", - "lon": "-70.18521", - "id": 38762 - }, - { - "name": "Braeburn Road", - "lat": "43.70316", - "lon": "-70.28613", - "id": 12992 - }, - { - "name": "Braintree Street", - "lat": "43.70426", - "lon": "-70.30718", - "id": 12416 - }, - { - "name": "Bramhall Court", - "lat": "43.69050", - "lon": "-70.26928", - "id": 39922 - }, - { - "name": "Bramhall Place", - "lat": "43.65385", - "lon": "-70.27328", - "id": 33555 - }, - { - "name": "Bramhall Street", - "lat": "43.65177", - "lon": "-70.27613", - "id": 13554 - }, - { - "name": "Bramhall Terrace", - "lat": "43.69051", - "lon": "-70.26892", - "id": 12628 - }, - { - "name": "Brandon Street", - "lat": "43.69857", - "lon": "-70.31462", - "id": 12834 - }, - { - "name": "Breakwater Farm Road", - "lat": "43.56290", - "lon": "-70.24057", - "id": 35552 - }, - { - "name": "Brentwood Street", - "lat": "43.67867", - "lon": "-70.30091", - "id": 12502 - }, - { - "name": "Briarwood", - "lat": "43.75910", - "lon": "-70.34404", - "id": 41329 - }, - { - "name": "Bridges Drive", - "lat": "43.61038", - "lon": "-70.36750", - "id": 34428 - }, - { - "name": "Bridle Court", - "lat": "43.56736", - "lon": "-70.38282", - "id": 37811 - }, - { - "name": "Broad Cove Woods", - "lat": "43.77873", - "lon": "-70.17966", - "id": 36265 - }, - { - "name": "Broadturn Road", - "lat": "43.57209", - "lon": "-70.39503", - "id": 33113 - }, - { - "name": "Brook Hill Road", - "lat": "43.84748", - "lon": "-70.15650", - "id": 39607 - }, - { - "name": "Brookfield Road", - "lat": "43.72606", - "lon": "-70.30907", - "id": 39782 - }, - { - "name": "Brooklet Place", - "lat": "43.66672", - "lon": "-70.19296", - "id": 40075 - }, - { - "name": "Brookview Court", - "lat": "43.59301", - "lon": "-70.44365", - "id": 41045 - }, - { - "name": "Brookview Terrace", - "lat": "43.68269", - "lon": "-70.31602", - "id": 13438 - }, - { - "name": "Brown Hill Lane", - "lat": "43.62864", - "lon": "-70.37544", - "id": 85622 - }, - { - "name": "Browns Way", - "lat": "43.80553", - "lon": "-70.23396", - "id": 39240 - }, - { - "name": "Bruce Avenue", - "lat": "43.60630", - "lon": "-70.23665", - "id": 40129 - }, - { - "name": "Bruce Hill Road", - "lat": "43.80203", - "lon": "-70.29370", - "id": 40462 - }, - { - "name": "Bruns Drive", - "lat": "43.84158", - "lon": "-70.35432", - "id": 36405 - }, - { - "name": "Buca Run", - "lat": "43.70220", - "lon": "-70.30583", - "id": 12425 - }, - { - "name": "Buca Run Road", - "lat": "43.70123", - "lon": "-70.30525", - "id": 39552 - }, - { - "name": "Bucknam Point", - "lat": "43.77322", - "lon": "-70.16019", - "id": 34825 - }, - { - "name": "Bucknam Point Road", - "lat": "43.77377", - "lon": "-70.16180", - "id": 35498 - }, - { - "name": "Bunker Hill", - "lat": "43.59640", - "lon": "-70.37853", - "id": 38935 - }, - { - "name": "Bunker Hill Terrace", - "lat": "43.59652", - "lon": "-70.37702", - "id": 32323 - }, - { - "name": "Burbank Lane", - "lat": "43.78883", - "lon": "-70.16315", - "id": 37615 - }, - { - "name": "Burnside Avenue", - "lat": "43.69847", - "lon": "-70.27806", - "id": 13000 - }, - { - "name": "Buttonwood", - "lat": "43.66306", - "lon": "-70.32123", - "id": 34065 - }, - { - "name": "Byfield Road", - "lat": "43.68803", - "lon": "-70.26924", - "id": 12701 - }, - { - "name": "Byram Avenue", - "lat": "43.82030", - "lon": "-70.05951", - "id": 35362 - }, - { - "name": "Byrd Avenue", - "lat": "43.58614", - "lon": "-70.35396", - "id": 32545 - }, - { - "name": "Caddie Lane", - "lat": "43.70945", - "lon": "-70.31265", - "id": 12570 - }, - { - "name": "Cajun Court", - "lat": "43.76733", - "lon": "-70.39361", - "id": 35019 - }, - { - "name": "Caldwell Street", - "lat": "43.67076", - "lon": "-70.29808", - "id": 12534 - }, - { - "name": "Calumet Avenue", - "lat": "43.64446", - "lon": "-70.20433", - "id": 33893 - }, - { - "name": "Calumet Road", - "lat": "43.64410", - "lon": "-70.20195", - "id": 12301 - }, - { - "name": "Cambridge Street", - "lat": "43.68878", - "lon": "-70.28825", - "id": 12692 - }, - { - "name": "Campion Road", - "lat": "43.62334", - "lon": "-70.23624", - "id": 38680 - }, - { - "name": "Canada Hill Road", - "lat": "43.73148", - "lon": "-70.38245", - "id": 36195 - }, - { - "name": "Canal Plaza", - "lat": "43.65690", - "lon": "-70.25574", - "id": 319 - }, - { - "name": "Candlewyck Terrace", - "lat": "43.68004", - "lon": "-70.31194", - "id": 13446 - }, - { - "name": "Canterbury Blue", - "lat": "43.61815", - "lon": "-70.23791", - "id": 83325 - }, - { - "name": "Canterbury Way", - "lat": "43.61560", - "lon": "-70.24493", - "id": 36402 - }, - { - "name": "Cape Woods Drive", - "lat": "43.62714", - "lon": "-70.23025", - "id": 34362 - }, - { - "name": "Capisic Brook Trail", - "lat": "43.66803", - "lon": "-70.30645", - "id": 77010 - }, - { - "name": "Captain Strout Circle", - "lat": "43.62290", - "lon": "-70.20899", - "id": 34668 - }, - { - "name": "Captain's Landing", - "lat": "43.65705", - "lon": "-70.31713", - "id": 36394 - }, - { - "name": "Captains Landing", - "lat": "43.65696", - "lon": "-70.31677", - "id": 13552 - }, - { - "name": "Carignan Drive", - "lat": "43.76256", - "lon": "-70.36589", - "id": 33298 - }, - { - "name": "Carlyle Road", - "lat": "43.68015", - "lon": "-70.28471", - "id": 12667 - }, - { - "name": "Caroline Road", - "lat": "43.66435", - "lon": "-70.29941", - "id": 41004 - }, - { - "name": "Carriage Hill", - "lat": "43.84256", - "lon": "-70.26634", - "id": 86237 - }, - { - "name": "Carter Brook Drive", - "lat": "43.60028", - "lon": "-70.42781", - "id": 41544 - }, - { - "name": "Casco's Way", - "lat": "43.79525", - "lon": "-69.93427", - "id": 40637 - }, - { - "name": "Cassidy Point Drive", - "lat": "43.64233", - "lon": "-70.27675", - "id": 13505 - }, - { - "name": "Castine", - "lat": "43.69771", - "lon": "-70.31647", - "id": 39513 - }, - { - "name": "Castle Terrace", - "lat": "43.57512", - "lon": "-70.40400", - "id": 33547 - }, - { - "name": "Catherine Drive", - "lat": "43.55705", - "lon": "-70.32233", - "id": 38164 - }, - { - "name": "Catherine Street", - "lat": "43.66287", - "lon": "-70.28345", - "id": 13333 - }, - { - "name": "Cattle Drive", - "lat": "43.76438", - "lon": "-70.38213", - "id": 81141 - }, - { - "name": "Cedarhurst Lane", - "lat": "43.68052", - "lon": "-70.31638", - "id": 13445 - }, - { - "name": "Celebration Court", - "lat": "43.68175", - "lon": "-70.32269", - "id": 13550 - }, - { - "name": "Cellar Point Road", - "lat": "43.64570", - "lon": "-70.20483", - "id": 12298 - }, - { - "name": "Centennial Street", - "lat": "43.66078", - "lon": "-70.19888", - "id": 12104 - }, - { - "name": "Centennial Street Rear", - "lat": "43.66090", - "lon": "-70.19869", - "id": 39079 - }, - { - "name": "Central Wharf", - "lat": "43.65531", - "lon": "-70.25295", - "id": 76962 - }, - { - "name": "Central Wharf Street", - "lat": "43.65489", - "lon": "-70.25233", - "id": 33436 - }, - { - "name": "Challenge Drive", - "lat": "43.76218", - "lon": "-70.38001", - "id": 81142 - }, - { - "name": "Chandler", - "lat": "43.74270", - "lon": "-70.23248", - "id": 32117 - }, - { - "name": "Chandlers Wharf", - "lat": "43.65502", - "lon": "-70.25235", - "id": 13118 - }, - { - "name": "Channel Point", - "lat": "43.77554", - "lon": "-70.15453", - "id": 32963 - }, - { - "name": "Channel Point Road", - "lat": "43.77535", - "lon": "-70.15502", - "id": 35742 - }, - { - "name": "Charles Circle", - "lat": "43.56940", - "lon": "-70.39344", - "id": 40616 - }, - { - "name": "Charles E Jordan Road", - "lat": "43.56380", - "lon": "-70.26207", - "id": 33884 - }, - { - "name": "Charlotte Drive", - "lat": "43.70314", - "lon": "-70.27169", - "id": 35953 - }, - { - "name": "Chase Deer Lane", - "lat": "43.56764", - "lon": "-70.32205", - "id": 32905 - }, - { - "name": "Chenery Street", - "lat": "43.67408", - "lon": "-70.28282", - "id": 12920 - }, - { - "name": "Chesley Avenue", - "lat": "43.69244", - "lon": "-70.28797", - "id": 12937 - }, - { - "name": "Chester Avenue", - "lat": "43.71113", - "lon": "-70.23682", - "id": 41006 - }, - { - "name": "Chesterwood Road", - "lat": "43.59715", - "lon": "-70.26431", - "id": 32563 - }, - { - "name": "Cheverus", - "lat": "43.62245", - "lon": "-70.23409", - "id": 32766 - }, - { - "name": "Cheverus Road", - "lat": "43.62172", - "lon": "-70.23686", - "id": 37294 - }, - { - "name": "Chimera Hill Road", - "lat": "43.86625", - "lon": "-70.43462", - "id": 37194 - }, - { - "name": "Chisholm Trail", - "lat": "43.62916", - "lon": "-70.37447", - "id": 80772 - }, - { - "name": "Christy Road", - "lat": "43.71170", - "lon": "-70.28649", - "id": 12977 - }, - { - "name": "Chute Road", - "lat": "43.75461", - "lon": "-70.40254", - "id": 36426 - }, - { - "name": "City Hospital Drive", - "lat": "43.67604", - "lon": "-70.32589", - "id": 31996 - }, - { - "name": "City Line Drive", - "lat": "43.64893", - "lon": "-70.32293", - "id": 13385 - }, - { - "name": "City View Avenue", - "lat": "43.66520", - "lon": "-70.21191", - "id": 12316 - }, - { - "name": "City View Road", - "lat": "43.66058", - "lon": "-70.19912", - "id": 12106 - }, - { - "name": "Civic Center Square", - "lat": "43.65559", - "lon": "-70.25918", - "id": 81543 - }, - { - "name": "Claimont Court", - "lat": "43.66868", - "lon": "-70.28270", - "id": 86469 - }, - { - "name": "Clairmont Court", - "lat": "43.66809", - "lon": "-70.28336", - "id": 86468 - }, - { - "name": "Claman Drive", - "lat": "43.86565", - "lon": "-70.46689", - "id": 32409 - }, - { - "name": "Clapboard Road", - "lat": "43.72098", - "lon": "-70.28510", - "id": 12481 - }, - { - "name": "Clay Hill Drive", - "lat": "43.72222", - "lon": "-70.38683", - "id": 33690 - }, - { - "name": "Clay Pits Road", - "lat": "43.56920", - "lon": "-70.32190", - "id": 37792 - }, - { - "name": "Clayton Street", - "lat": "43.71571", - "lon": "-70.28967", - "id": 12968 - }, - { - "name": "Cleeves Street", - "lat": "43.66412", - "lon": "-70.25257", - "id": 13133 - }, - { - "name": "Cliffstone Road", - "lat": "43.66615", - "lon": "-70.20684", - "id": 33285 - }, - { - "name": "Clover Leaf Lane", - "lat": "43.61748", - "lon": "-70.39477", - "id": 35517 - }, - { - "name": "Coachlantern Lane", - "lat": "43.57983", - "lon": "-70.33653", - "id": 41198 - }, - { - "name": "Coachlight Lane", - "lat": "43.66335", - "lon": "-70.29750", - "id": 13606 - }, - { - "name": "Coast Lane", - "lat": "43.68999", - "lon": "-70.26259", - "id": 12737 - }, - { - "name": "Cobb Avenue", - "lat": "43.65466", - "lon": "-70.31038", - "id": 13600 - }, - { - "name": "Cobbert Road", - "lat": "43.66180", - "lon": "-70.29875", - "id": 13355 - }, - { - "name": "Codman Street", - "lat": "43.67287", - "lon": "-70.28280", - "id": 12685 - }, - { - "name": "Cold Bear Drive", - "lat": "43.77143", - "lon": "-70.37046", - "id": 81143 - }, - { - "name": "Cole Field", - "lat": "43.60000", - "lon": "-70.26928", - "id": 34908 - }, - { - "name": "Cole Field Road", - "lat": "43.59924", - "lon": "-70.26873", - "id": 33273 - }, - { - "name": "Coleman Way", - "lat": "43.74202", - "lon": "-70.29287", - "id": 31921 - }, - { - "name": "Colonel Dow Drive", - "lat": "43.57111", - "lon": "-70.39818", - "id": 80840 - }, - { - "name": "Colonial Court", - "lat": "43.66616", - "lon": "-70.30396", - "id": 13298 - }, - { - "name": "Colonial Village", - "lat": "43.71201", - "lon": "-70.23300", - "id": 38624 - }, - { - "name": "Colson Circle", - "lat": "43.68555", - "lon": "-70.28053", - "id": 12643 - }, - { - "name": "Columbarium Avenue", - "lat": "43.68029", - "lon": "-70.29658", - "id": 82529 - }, - { - "name": "Columbia Terrace", - "lat": "43.67079", - "lon": "-70.30190", - "id": 12533 - }, - { - "name": "Columbus Road", - "lat": "43.62002", - "lon": "-70.23723", - "id": 41360 - }, - { - "name": "Commercial St", - "lat": "43.65649", - "lon": "-70.25102", - "id": 1182 - }, - { - "name": "Commonwealth Drive", - "lat": "43.69566", - "lon": "-70.30589", - "id": 12849 - }, - { - "name": "Concord West Street", - "lat": "43.67417", - "lon": "-70.29731", - "id": 12523 - }, - { - "name": "Congress Square", - "lat": "43.65359", - "lon": "-70.26308", - "id": 1072 - }, - { - "name": "Congressional Drive", - "lat": "43.77201", - "lon": "-70.27480", - "id": 35400 - }, - { - "name": "Conifer Ridge", - "lat": "43.75454", - "lon": "-70.20588", - "id": 40597 - }, - { - "name": "Conifer Ridge Road", - "lat": "43.74455", - "lon": "-70.20006", - "id": 32969 - }, - { - "name": "Cooper Drive", - "lat": "43.58501", - "lon": "-70.24139", - "id": 34199 - }, - { - "name": "Copley Woods Circle", - "lat": "43.69808", - "lon": "-70.27164", - "id": 13002 - }, - { - "name": "Copley Woods Circle Prvt", - "lat": "43.69790", - "lon": "-70.27186", - "id": 35144 - }, - { - "name": "Copps Way", - "lat": "43.77421", - "lon": "-70.30413", - "id": 34092 - }, - { - "name": "Coralburst Lane", - "lat": "43.58370", - "lon": "-70.31362", - "id": 40778 - }, - { - "name": "Corless", - "lat": "43.68373", - "lon": "-70.26001", - "id": 34242 - }, - { - "name": "Corliss Road", - "lat": "43.68389", - "lon": "-70.26025", - "id": 12778 - }, - { - "name": "Cottage Park Road", - "lat": "43.70576", - "lon": "-70.28579", - "id": 12988 - }, - { - "name": "Cotton Street", - "lat": "43.65528", - "lon": "-70.25710", - "id": 1382 - }, - { - "name": "Cove Street stairs", - "lat": "43.66893", - "lon": "-70.25330", - "id": 80517 - }, - { - "name": "Coyle Lane", - "lat": "43.69799", - "lon": "-70.09516", - "id": 31969 - }, - { - "name": "Coyles Lane", - "lat": "43.69801", - "lon": "-70.09537", - "id": 12054 - }, - { - "name": "Crabapple Road", - "lat": "43.78079", - "lon": "-70.37106", - "id": 41442 - }, - { - "name": "Cranberry Pines Road", - "lat": "43.58047", - "lon": "-70.40194", - "id": 36484 - }, - { - "name": "Cranbrook Drive", - "lat": "43.60738", - "lon": "-70.22757", - "id": 36090 - }, - { - "name": "Crane Farm Way", - "lat": "43.79851", - "lon": "-70.15629", - "id": 37672 - }, - { - "name": "Cranston Street", - "lat": "43.68770", - "lon": "-70.26592", - "id": 12704 - }, - { - "name": "Crescent View Avenue", - "lat": "43.56814", - "lon": "-70.22206", - "id": 38681 - }, - { - "name": "Cresfeld Terrace", - "lat": "43.71282", - "lon": "-70.29381", - "id": 33778 - }, - { - "name": "Cresfield Terrace", - "lat": "43.71260", - "lon": "-70.29473", - "id": 12342 - }, - { - "name": "Cresthaven Road", - "lat": "43.76562", - "lon": "-70.36050", - "id": 36475 - }, - { - "name": "Critter Drive", - "lat": "43.79260", - "lon": "-70.36492", - "id": 32287 - }, - { - "name": "Croquet Lane", - "lat": "43.70603", - "lon": "-70.29224", - "id": 12560 - }, - { - "name": "Cross North Street", - "lat": "43.65687", - "lon": "-70.25718", - "id": 13280 - }, - { - "name": "Cross Street Stairs", - "lat": "43.65638", - "lon": "-70.25671", - "id": 76925 - }, - { - "name": "Crows Nest Drive", - "lat": "43.80232", - "lon": "-70.14002", - "id": 36812 - }, - { - "name": "Cumberland Way", - "lat": "43.61080", - "lon": "-70.33746", - "id": 35695 - }, - { - "name": "Cummings Street", - "lat": "43.68255", - "lon": "-70.26298", - "id": 12817 - }, - { - "name": "Cunningham Drive", - "lat": "43.77233", - "lon": "-70.39543", - "id": 35461 - }, - { - "name": "Custom House Street", - "lat": "43.65750", - "lon": "-70.25085", - "id": 13222 - }, - { - "name": "Cutter Street", - "lat": "43.66958", - "lon": "-70.24150", - "id": 13080 - }, - { - "name": "Dakota Street", - "lat": "43.69691", - "lon": "-70.27937", - "id": 12962 - }, - { - "name": "Dale Court", - "lat": "43.67895", - "lon": "-70.32040", - "id": 13639 - }, - { - "name": "Danforth Place", - "lat": "43.64781", - "lon": "-70.26420", - "id": 13587 - }, - { - "name": "Davcarley Road", - "lat": "43.61037", - "lon": "-70.23866", - "id": 40660 - }, - { - "name": "Daveis Trail", - "lat": "43.66908", - "lon": "-70.18332", - "id": 84853 - }, - { - "name": "Dawe Road", - "lat": "43.61335", - "lon": "-70.25152", - "id": 35822 - }, - { - "name": "Daybreak Lane", - "lat": "43.78369", - "lon": "-70.15026", - "id": 37162 - }, - { - "name": "Deake's Wharf", - "lat": "43.64909", - "lon": "-70.25770", - "id": 81096 - }, - { - "name": "Deakes Wharf", - "lat": "43.64921", - "lon": "-70.25761", - "id": 13261 - }, - { - "name": "Dean Way", - "lat": "43.57523", - "lon": "-70.21884", - "id": 33662 - }, - { - "name": "Deblois Street", - "lat": "43.66593", - "lon": "-70.28930", - "id": 12864 - }, - { - "name": "Dedham Street", - "lat": "43.70071", - "lon": "-70.30394", - "id": 12371 - }, - { - "name": "Deer Brook Apt Road", - "lat": "43.86664", - "lon": "-70.27731", - "id": 32410 - }, - { - "name": "Deer Brook Farm", - "lat": "43.85297", - "lon": "-70.27109", - "id": 37283 - }, - { - "name": "Deering Place", - "lat": "43.65461", - "lon": "-70.26495", - "id": 37240 - }, - { - "name": "Deering Run Drive", - "lat": "43.71225", - "lon": "-70.29954", - "id": 12400 - }, - { - "name": "Deerwood Street", - "lat": "43.59764", - "lon": "-70.31645", - "id": 33119 - }, - { - "name": "Delaware Court", - "lat": "43.69663", - "lon": "-70.29126", - "id": 12946 - }, - { - "name": "Demerest Street", - "lat": "43.69579", - "lon": "-70.27285", - "id": 12367 - }, - { - "name": "Den Drive", - "lat": "43.61104", - "lon": "-70.39960", - "id": 40855 - }, - { - "name": "Dennison Drive", - "lat": "43.58499", - "lon": "-70.24369", - "id": 34623 - }, - { - "name": "Dermot Court", - "lat": "43.64931", - "lon": "-70.26555", - "id": 13521 - }, - { - "name": "Desfosses Ave", - "lat": "43.59990", - "lon": "-70.31229", - "id": 84603 - }, - { - "name": "Devon Street", - "lat": "43.67703", - "lon": "-70.31471", - "id": 13460 - }, - { - "name": "Diamond Pass", - "lat": "43.66441", - "lon": "-70.19564", - "id": 12247 - }, - { - "name": "Diamond Ridge Way", - "lat": "43.72724", - "lon": "-70.24864", - "id": 35035 - }, - { - "name": "Diamond Shore Avenue", - "lat": "43.67368", - "lon": "-70.19798", - "id": 80552 - }, - { - "name": "Diamond Shore Road", - "lat": "43.67344", - "lon": "-70.19744", - "id": 12014 - }, - { - "name": "Dibiase Street", - "lat": "43.69363", - "lon": "-70.30353", - "id": 12853 - }, - { - "name": "Dingley Court", - "lat": "43.68114", - "lon": "-70.29175", - "id": 12592 - }, - { - "name": "District Road", - "lat": "43.64837", - "lon": "-70.33784", - "id": 13549 - }, - { - "name": "Dock Off Way", - "lat": "43.57484", - "lon": "-70.38243", - "id": 34859 - }, - { - "name": "Dog Trail", - "lat": "43.78916", - "lon": "-70.22414", - "id": 77742 - }, - { - "name": "Dolloff Way", - "lat": "43.57318", - "lon": "-70.38372", - "id": 39643 - }, - { - "name": "Dominicus Crossing Road", - "lat": "43.59756", - "lon": "-70.26283", - "id": 32767 - }, - { - "name": "Doris Avenue", - "lat": "43.75784", - "lon": "-70.41221", - "id": 40768 - }, - { - "name": "Doris Drive", - "lat": "43.87505", - "lon": "-70.51324", - "id": 33282 - }, - { - "name": "Dorset Street", - "lat": "43.67760", - "lon": "-70.31557", - "id": 13456 - }, - { - "name": "Dover Avenue", - "lat": "43.70165", - "lon": "-70.31119", - "id": 12428 - }, - { - "name": "Down Home Road", - "lat": "43.77511", - "lon": "-70.44112", - "id": 35378 - }, - { - "name": "Drake Street", - "lat": "43.69486", - "lon": "-70.28297", - "id": 13012 - }, - { - "name": "Dresden Circle", - "lat": "43.69110", - "lon": "-70.26855", - "id": 12627 - }, - { - "name": "Dresden Court", - "lat": "43.69129", - "lon": "-70.26853", - "id": 32166 - }, - { - "name": "Drinkwater Point Road", - "lat": "43.77830", - "lon": "-70.15953", - "id": 39316 - }, - { - "name": "Dune Drive", - "lat": "43.85461", - "lon": "-70.15343", - "id": 81426 - }, - { - "name": "Dunham Pond Lane", - "lat": "43.75495", - "lon": "-70.25079", - "id": 34100 - }, - { - "name": "Dunn Estates Drive", - "lat": "43.61358", - "lon": "-70.45015", - "id": 37920 - }, - { - "name": "Dunstan Avenue", - "lat": "43.56879", - "lon": "-70.39196", - "id": 37698 - }, - { - "name": "Dunstan Landing Road", - "lat": "43.56828", - "lon": "-70.38140", - "id": 33972 - }, - { - "name": "Eagle Buff", - "lat": "43.79480", - "lon": "-69.94354", - "id": 36557 - }, - { - "name": "Eagle's Nest Drive", - "lat": "43.84844", - "lon": "-70.15481", - "id": 36072 - }, - { - "name": "Earl Street", - "lat": "43.72532", - "lon": "-70.29688", - "id": 37315 - }, - { - "name": "East Coachlantern Lane", - "lat": "43.57703", - "lon": "-70.33632", - "id": 39493 - }, - { - "name": "East Commonwealth Drive", - "lat": "43.69552", - "lon": "-70.30544", - "id": 12850 - }, - { - "name": "East Cove Street", - "lat": "43.66897", - "lon": "-70.25341", - "id": 13235 - }, - { - "name": "East Lancaster Street", - "lat": "43.66505", - "lon": "-70.25486", - "id": 13195 - }, - { - "name": "Eastern Prom Midslope Trail", - "lat": "43.67212", - "lon": "-70.25300", - "id": 81177 - }, - { - "name": "Eastern Promenade Trail", - "lat": "43.67065", - "lon": "-70.24431", - "id": 76956 - }, - { - "name": "Eastern Trail extension", - "lat": "43.60134", - "lon": "-70.29250", - "id": 80832 - }, - { - "name": "Eastlawn Road", - "lat": "43.69672", - "lon": "-70.30364", - "id": 12458 - }, - { - "name": "Eastman Avenue", - "lat": "43.69978", - "lon": "-70.31121", - "id": 12354 - }, - { - "name": "Ebb Tide Drive", - "lat": "43.77701", - "lon": "-70.18139", - "id": 35270 - }, - { - "name": "Eben Hill Drive", - "lat": "43.68955", - "lon": "-70.26259", - "id": 12736 - }, - { - "name": "Ebenezer Drive", - "lat": "43.72037", - "lon": "-70.37840", - "id": 85703 - }, - { - "name": "Edgeworth Avenue", - "lat": "43.67304", - "lon": "-70.30158", - "id": 12526 - }, - { - "name": "Elbert Street", - "lat": "43.69349", - "lon": "-70.30774", - "id": 12854 - }, - { - "name": "Eleanor Street", - "lat": "43.69059", - "lon": "-70.29493", - "id": 12469 - }, - { - "name": "Elsie Way", - "lat": "43.59873", - "lon": "-70.34681", - "id": 33047 - }, - { - "name": "Elysian Way", - "lat": "43.60571", - "lon": "-70.33198", - "id": 85764 - }, - { - "name": "Emerald Pond", - "lat": "43.72713", - "lon": "-70.24538", - "id": 85162 - }, - { - "name": "Emhardt Street", - "lat": "43.69613", - "lon": "-70.10664", - "id": 12006 - }, - { - "name": "Emmons Street", - "lat": "43.68041", - "lon": "-70.25667", - "id": 12828 - }, - { - "name": "Empire Way", - "lat": "43.69525", - "lon": "-70.30849", - "id": 12851 - }, - { - "name": "Emu Street", - "lat": "43.80042", - "lon": "-70.12472", - "id": 39844 - }, - { - "name": "Entwood Road", - "lat": "43.72532", - "lon": "-70.25817", - "id": 31982 - }, - { - "name": "Environental Way", - "lat": "43.77363", - "lon": "-70.36838", - "id": 81146 - }, - { - "name": "Epping Street", - "lat": "43.69433", - "lon": "-70.31520", - "id": 12679 - }, - { - "name": "Epps Street", - "lat": "43.65629", - "lon": "-70.19614", - "id": 12128 - }, - { - "name": "Erie Road", - "lat": "43.62075", - "lon": "-70.24941", - "id": 33869 - }, - { - "name": "Ernwood Heights", - "lat": "43.76009", - "lon": "-70.38134", - "id": 81147 - }, - { - "name": "Euclid Avenue", - "lat": "43.69715", - "lon": "-70.31325", - "id": 12838 - }, - { - "name": "Eugene Street", - "lat": "43.72419", - "lon": "-70.29480", - "id": 34749 - }, - { - "name": "Eureka Road", - "lat": "43.75104", - "lon": "-70.28662", - "id": 32066 - }, - { - "name": "Everglade Avenue", - "lat": "43.67889", - "lon": "-70.30460", - "id": 76934 - }, - { - "name": "Evergreen Farm Road", - "lat": "43.58204", - "lon": "-70.34623", - "id": 34653 - }, - { - "name": "Evergreen Landing", - "lat": "43.67321", - "lon": "-70.18618", - "id": 12183 - }, - { - "name": "Evergreen Ledge", - "lat": "43.67230", - "lon": "-70.18719", - "id": 36476 - }, - { - "name": "Exeter Street", - "lat": "43.66058", - "lon": "-70.27961", - "id": 13370 - }, - { - "name": "Fakcon Road", - "lat": "43.74831", - "lon": "-70.40945", - "id": 81148 - }, - { - "name": "Fall Brook Street", - "lat": "43.68892", - "lon": "-70.27576", - "id": 12690 - }, - { - "name": "Fall Line Road", - "lat": "43.86246", - "lon": "-70.27948", - "id": 32439 - }, - { - "name": "Falmouth Ridges Drive", - "lat": "43.72703", - "lon": "-70.25107", - "id": 33721 - }, - { - "name": "Falmouth Spur", - "lat": "43.73251", - "lon": "-70.23379", - "id": 77279 - }, - { - "name": "Farm Gate Road", - "lat": "43.72062", - "lon": "-70.23939", - "id": 76982 - }, - { - "name": "Farm House Lane", - "lat": "43.70440", - "lon": "-70.28351", - "id": 12578 - }, - { - "name": "Farm Loop Trail", - "lat": "43.82691", - "lon": "-70.07112", - "id": 81425 - }, - { - "name": "Farmhouse", - "lat": "43.70451", - "lon": "-70.28392", - "id": 36587 - }, - { - "name": "Farms Edge", - "lat": "43.78525", - "lon": "-70.21570", - "id": 32549 - }, - { - "name": "Farms Edge Road", - "lat": "43.59526", - "lon": "-70.26783", - "id": 33262 - }, - { - "name": "Farnham Street", - "lat": "43.69818", - "lon": "-70.31010", - "id": 12836 - }, - { - "name": "Fawn Run", - "lat": "43.58582", - "lon": "-70.36868", - "id": 35654 - }, - { - "name": "Fayette Street", - "lat": "43.68432", - "lon": "-70.25315", - "id": 12773 - }, - { - "name": "Feeney Way", - "lat": "43.68941", - "lon": "-70.28385", - "id": 12755 - }, - { - "name": "Felicia Lane", - "lat": "43.69093", - "lon": "-70.27527", - "id": 40570 - }, - { - "name": "Fengler Road", - "lat": "43.60964", - "lon": "-70.42891", - "id": 37673 - }, - { - "name": "Fenway Road", - "lat": "43.57983", - "lon": "-70.23343", - "id": 40576 - }, - { - "name": "Fenway Street", - "lat": "43.65631", - "lon": "-70.30121", - "id": 13511 - }, - { - "name": "Fenwick Street", - "lat": "43.66466", - "lon": "-70.27291", - "id": 35955 - }, - { - "name": "Fern Circle", - "lat": "43.57504", - "lon": "-70.34085", - "id": 32175 - }, - { - "name": "Fessenden Street", - "lat": "43.66491", - "lon": "-70.27643", - "id": 12686 - }, - { - "name": "Fire Rd 50", - "lat": "43.79212", - "lon": "-69.93583", - "id": 34119 - }, - { - "name": "Fisherman's Cove", - "lat": "43.69771", - "lon": "-70.10312", - "id": 33290 - }, - { - "name": "Fishermans Cove", - "lat": "43.69774", - "lon": "-70.10254", - "id": 12034 - }, - { - "name": "Flintlock Lane", - "lat": "43.75225", - "lon": "-70.31832", - "id": 33716 - }, - { - "name": "Florance Lane", - "lat": "43.87646", - "lon": "-70.14670", - "id": 23112 - }, - { - "name": "Fobes Street", - "lat": "43.69765", - "lon": "-70.28699", - "id": 13005 - }, - { - "name": "Fogg Farm Road", - "lat": "43.80192", - "lon": "-70.13219", - "id": 39424 - }, - { - "name": "Foggs Point", - "lat": "43.80398", - "lon": "-70.13165", - "id": 40717 - }, - { - "name": "Folly Cove Road", - "lat": "43.76640", - "lon": "-70.17513", - "id": 34564 - }, - { - "name": "Fore River Sanctuary Trail (white)", - "lat": "43.66062", - "lon": "-70.30746", - "id": 79010 - }, - { - "name": "Fore River Trail", - "lat": "43.65778", - "lon": "-70.30158", - "id": 76951 - }, - { - "name": "Foreside Common Drive", - "lat": "43.70247", - "lon": "-70.24064", - "id": 86047 - }, - { - "name": "Foreside Common Road", - "lat": "43.70226", - "lon": "-70.24032", - "id": 35240 - }, - { - "name": "Foreside Village", - "lat": "43.71805", - "lon": "-70.22985", - "id": 38260 - }, - { - "name": "Forest City Trail (blue)", - "lat": "43.66798", - "lon": "-70.31857", - "id": 79012 - }, - { - "name": "Forest Park Lane", - "lat": "43.66736", - "lon": "-70.27720", - "id": 13124 - }, - { - "name": "Forest View Drive", - "lat": "43.79486", - "lon": "-70.32578", - "id": 79682 - }, - { - "name": "Fort Levett Road", - "lat": "43.64090", - "lon": "-70.20169", - "id": 12311 - }, - { - "name": "Foundry Lane", - "lat": "43.65351", - "lon": "-70.25671", - "id": 34946 - }, - { - "name": "Four Winds Road", - "lat": "43.67912", - "lon": "-70.30975", - "id": 13451 - }, - { - "name": "Fox Hall Road", - "lat": "43.73802", - "lon": "-70.29536", - "id": 41155 - }, - { - "name": "Foxwell Drive", - "lat": "43.56533", - "lon": "-70.39016", - "id": 32893 - }, - { - "name": "Frederic Street", - "lat": "43.65252", - "lon": "-70.28555", - "id": 13520 - }, - { - "name": "Frederick Thompson Drive", - "lat": "43.58218", - "lon": "-70.31231", - "id": 33753 - }, - { - "name": "Freshman Alley", - "lat": "43.65862", - "lon": "-70.25858", - "id": 81233 - }, - { - "name": "Frigate Lane", - "lat": "43.68930", - "lon": "-70.26295", - "id": 12735 - }, - { - "name": "Frog Farm Road", - "lat": "43.79907", - "lon": "-70.13073", - "id": 33465 - }, - { - "name": "Fundy Road", - "lat": "43.71850", - "lon": "-70.23169", - "id": 36102 - }, - { - "name": "Gable Court", - "lat": "43.69182", - "lon": "-70.27066", - "id": 12633 - }, - { - "name": "Galvin Street", - "lat": "43.68064", - "lon": "-70.25903", - "id": 12827 - }, - { - "name": "Garden Place", - "lat": "43.65404", - "lon": "-70.19837", - "id": 12161 - }, - { - "name": "Garrison Street Extension", - "lat": "43.65620", - "lon": "-70.30894", - "id": 13390 - }, - { - "name": "Garsoe Drive", - "lat": "43.72436", - "lon": "-70.29197", - "id": 12471 - }, - { - "name": "Gateledge Drive", - "lat": "43.61986", - "lon": "-70.23130", - "id": 37386 - }, - { - "name": "Gayfield Road", - "lat": "43.56383", - "lon": "-70.25735", - "id": 36105 - }, - { - "name": "Geary Way", - "lat": "43.73149", - "lon": "-70.27441", - "id": 36498 - }, - { - "name": "Gentle Breeze", - "lat": "43.74248", - "lon": "-70.39337", - "id": 81149 - }, - { - "name": "Gilberts Lane", - "lat": "43.66497", - "lon": "-70.24525", - "id": 13196 - }, - { - "name": "Gilman Place", - "lat": "43.65170", - "lon": "-70.27744", - "id": 13620 - }, - { - "name": "Gilsland Farm Road", - "lat": "43.70635", - "lon": "-70.24126", - "id": 40618 - }, - { - "name": "Glacial Hill Road", - "lat": "43.86452", - "lon": "-70.43384", - "id": 33910 - }, - { - "name": "Gleckler Road", - "lat": "43.68161", - "lon": "-70.28418", - "id": 12898 - }, - { - "name": "Glen Haven East Road", - "lat": "43.68116", - "lon": "-70.31231", - "id": 13443 - }, - { - "name": "Glen Haven West Road", - "lat": "43.68021", - "lon": "-70.31364", - "id": 13635 - }, - { - "name": "Glendon Road", - "lat": "43.62572", - "lon": "-70.22581", - "id": 33724 - }, - { - "name": "Glengarden Street", - "lat": "43.68320", - "lon": "-70.28340", - "id": 12391 - }, - { - "name": "Glenhaven Road East", - "lat": "43.68054", - "lon": "-70.31239", - "id": 35137 - }, - { - "name": "Glenhaven Road West", - "lat": "43.68089", - "lon": "-70.31437", - "id": 35268 - }, - { - "name": "Glenndale Circle", - "lat": "43.59310", - "lon": "-70.41880", - "id": 40453 - }, - { - "name": "Glenndale Drive", - "lat": "43.59077", - "lon": "-70.42202", - "id": 39863 - }, - { - "name": "Glo's Way", - "lat": "43.62048", - "lon": "-70.24227", - "id": 86174 - }, - { - "name": "Goche Way", - "lat": "43.60204", - "lon": "-70.47830", - "id": 35059 - }, - { - "name": "Godfrey Street", - "lat": "43.67801", - "lon": "-70.32106", - "id": 13498 - }, - { - "name": "Goldenwood Drive", - "lat": "43.59129", - "lon": "-70.43801", - "id": 40785 - }, - { - "name": "Goldrup Lane", - "lat": "43.85845", - "lon": "-70.15260", - "id": 33351 - }, - { - "name": "Gollum's Way", - "lat": "43.85823", - "lon": "-70.43582", - "id": 41012 - }, - { - "name": "Goodale Street", - "lat": "43.68913", - "lon": "-70.30514", - "id": 12844 - }, - { - "name": "Goodridge Avenue", - "lat": "43.69039", - "lon": "-70.29424", - "id": 12470 - }, - { - "name": "Grace St Place", - "lat": "43.67144", - "lon": "-70.28334", - "id": 33498 - }, - { - "name": "Graham Terrace", - "lat": "43.68729", - "lon": "-70.26886", - "id": 12708 - }, - { - "name": "Granpa's Village", - "lat": "43.79467", - "lon": "-70.36694", - "id": 35051 - }, - { - "name": "Grapevine", - "lat": "43.60650", - "lon": "-70.40981", - "id": 86233 - }, - { - "name": "Grasmere Road", - "lat": "43.66528", - "lon": "-70.27388", - "id": 13160 - }, - { - "name": "Grassy Path", - "lat": "43.67051", - "lon": "-70.18856", - "id": 12221 - }, - { - "name": "Gravel Hill Road", - "lat": "43.76338", - "lon": "-70.36179", - "id": 32282 - }, - { - "name": "Grayhurst Park", - "lat": "43.64690", - "lon": "-70.26920", - "id": 13590 - }, - { - "name": "Great Pond Terrace", - "lat": "43.58134", - "lon": "-70.23306", - "id": 40110 - }, - { - "name": "Greenway Drive", - "lat": "43.69880", - "lon": "-70.24328", - "id": 33845 - }, - { - "name": "Greta Way", - "lat": "43.75039", - "lon": "-70.28699", - "id": 34192 - }, - { - "name": "Grey Osprey Lane", - "lat": "43.77946", - "lon": "-69.93562", - "id": 32749 - }, - { - "name": "Griffin's Lane", - "lat": "43.69410", - "lon": "-70.10696", - "id": 77883 - }, - { - "name": "Groveside Road", - "lat": "43.67605", - "lon": "-70.30626", - "id": 13472 - }, - { - "name": "Guilford Court", - "lat": "43.65005", - "lon": "-70.25959", - "id": 13079 - }, - { - "name": "Gun Point Road", - "lat": "43.77907", - "lon": "-69.94422", - "id": 36458 - }, - { - "name": "Hackamatack Road", - "lat": "43.57526", - "lon": "-70.29023", - "id": 35688 - }, - { - "name": "Hadlock Cove Road", - "lat": "43.65295", - "lon": "-70.19588", - "id": 12100 - }, - { - "name": "Hadlock Street", - "lat": "43.76951", - "lon": "-70.27010", - "id": 84489 - }, - { - "name": "Hadlock's Cove Road", - "lat": "43.65253", - "lon": "-70.19566", - "id": 40709 - }, - { - "name": "Haigis Parkway", - "lat": "43.60288", - "lon": "-70.36606", - "id": 37551 - }, - { - "name": "Halet Street", - "lat": "43.66975", - "lon": "-70.30947", - "id": 13570 - }, - { - "name": "Hall Court", - "lat": "43.66076", - "lon": "-70.26057", - "id": 13218 - }, - { - "name": "Hamblet Avenue", - "lat": "43.67839", - "lon": "-70.30164", - "id": 12503 - }, - { - "name": "Hamlin Court", - "lat": "43.64828", - "lon": "-70.26317", - "id": 13504 - }, - { - "name": "Hampton Circle", - "lat": "43.56265", - "lon": "-70.31671", - "id": 32583 - }, - { - "name": "Hampton Road", - "lat": "43.58271", - "lon": "-70.22830", - "id": 33004 - }, - { - "name": "Hannarin Drive", - "lat": "43.78301", - "lon": "-70.49929", - "id": 35370 - }, - { - "name": "Hanson S Lane", - "lat": "43.66536", - "lon": "-70.24381", - "id": 40163 - }, - { - "name": "Harmons Way", - "lat": "43.84123", - "lon": "-70.29681", - "id": 32521 - }, - { - "name": "Harmony Street", - "lat": "43.69922", - "lon": "-70.30598", - "id": 32968 - }, - { - "name": "Harry Harmon Drive", - "lat": "43.65244", - "lon": "-70.34087", - "id": 40205 - }, - { - "name": "Hartford Avenue", - "lat": "43.70963", - "lon": "-70.23772", - "id": 33437 - }, - { - "name": "Harvard Common", - "lat": "43.69255", - "lon": "-70.28323", - "id": 13019 - }, - { - "name": "Harvard Street Path", - "lat": "43.69138", - "lon": "-70.29029", - "id": 81176 - }, - { - "name": "Harvey Brook Drive", - "lat": "43.84343", - "lon": "-70.16796", - "id": 34023 - }, - { - "name": "Hastings Street", - "lat": "43.66730", - "lon": "-70.30439", - "id": 13294 - }, - { - "name": "Hat Trick Drive", - "lat": "43.72098", - "lon": "-70.23575", - "id": 37340 - }, - { - "name": "Haverty's", - "lat": "43.71510", - "lon": "-70.29394", - "id": 34336 - }, - { - "name": "Havertys Way", - "lat": "43.71464", - "lon": "-70.29587", - "id": 12956 - }, - { - "name": "Hawthorn Circle", - "lat": "43.57352", - "lon": "-70.34250", - "id": 39815 - }, - { - "name": "Hayden Way", - "lat": "43.70289", - "lon": "-70.26250", - "id": 37362 - }, - { - "name": "Haystack Circle", - "lat": "43.58933", - "lon": "-70.28733", - "id": 35913 - }, - { - "name": "Haywood Street", - "lat": "43.66065", - "lon": "-70.30113", - "id": 13367 - }, - { - "name": "Hazelwood Road", - "lat": "43.66679", - "lon": "-70.21090", - "id": 40722 - }, - { - "name": "Headland Lane", - "lat": "43.61950", - "lon": "-70.24173", - "id": 86007 - }, - { - "name": "Hearthside Drive", - "lat": "43.83159", - "lon": "-70.47886", - "id": 39368 - }, - { - "name": "Hearthside Road", - "lat": "43.83340", - "lon": "-70.48264", - "id": 32798 - }, - { - "name": "Helene Street", - "lat": "43.68881", - "lon": "-70.25291", - "id": 12693 - }, - { - "name": "Hemlock Creek", - "lat": "43.86206", - "lon": "-70.15073", - "id": 35238 - }, - { - "name": "Hemon Cobb Road", - "lat": "43.76005", - "lon": "-70.38885", - "id": 34478 - }, - { - "name": "Hennessy Drive", - "lat": "43.70398", - "lon": "-70.29469", - "id": 12419 - }, - { - "name": "Herman Avenue", - "lat": "43.65822", - "lon": "-70.19294", - "id": 12082 - }, - { - "name": "Heron Point", - "lat": "43.59296", - "lon": "-70.26701", - "id": 82849 - }, - { - "name": "Heron Point Road", - "lat": "43.71982", - "lon": "-70.24096", - "id": 81236 - }, - { - "name": "Herrli Street", - "lat": "43.59809", - "lon": "-70.31958", - "id": 40293 - }, - { - "name": "Hersey Street", - "lat": "43.67261", - "lon": "-70.28360", - "id": 12673 - }, - { - "name": "Hewson Road", - "lat": "43.87819", - "lon": "-70.52379", - "id": 41033 - }, - { - "name": "Hidden Creek Drive", - "lat": "43.58221", - "lon": "-70.40762", - "id": 32855 - }, - { - "name": "Hideaway Acres Drive", - "lat": "43.80585", - "lon": "-70.28866", - "id": 38238 - }, - { - "name": "High Bluff Lane", - "lat": "43.59929", - "lon": "-70.41266", - "id": 33158 - }, - { - "name": "High Bluffs Road", - "lat": "43.75639", - "lon": "-70.31750", - "id": 84583 - }, - { - "name": "High Street Court", - "lat": "43.65215", - "lon": "-70.25877", - "id": 13163 - }, - { - "name": "High Winds Drive", - "lat": "43.77408", - "lon": "-70.17382", - "id": 85767 - }, - { - "name": "Highfield Avenue", - "lat": "43.68015", - "lon": "-70.30147", - "id": 83883 - }, - { - "name": "Highland Cliff Road", - "lat": "43.74213", - "lon": "-70.39262", - "id": 36974 - }, - { - "name": "Highland Shore Road", - "lat": "43.76579", - "lon": "-70.36213", - "id": 35714 - }, - { - "name": "Hillcrest West", - "lat": "43.69942", - "lon": "-70.30907", - "id": 12634 - }, - { - "name": "Hillis Street", - "lat": "43.67133", - "lon": "-70.29868", - "id": 12532 - }, - { - "name": "Hobsons Pier", - "lat": "43.65066", - "lon": "-70.25637", - "id": 40039 - }, - { - "name": "Hobsons Wharf", - "lat": "43.65098", - "lon": "-70.25727", - "id": 13275 - }, - { - "name": "Hodgins Street", - "lat": "43.68409", - "lon": "-70.25497", - "id": 12383 - }, - { - "name": "Holiday Drive", - "lat": "43.68690", - "lon": "-70.27967", - "id": 12873 - }, - { - "name": "Holm Avenue", - "lat": "43.68459", - "lon": "-70.31937", - "id": 13433 - }, - { - "name": "Holyoke Wharf", - "lat": "43.64996", - "lon": "-70.25746", - "id": 38158 - }, - { - "name": "Homeport Drive", - "lat": "43.79037", - "lon": "-69.93579", - "id": 34227 - }, - { - "name": "Homer Sands Drive", - "lat": "43.55881", - "lon": "-70.39039", - "id": 85136 - }, - { - "name": "Homewood Circle", - "lat": "43.77470", - "lon": "-70.15798", - "id": 33151 - }, - { - "name": "Honey Comb Drive", - "lat": "43.80252", - "lon": "-70.23240", - "id": 85799 - }, - { - "name": "Hopes Way", - "lat": "43.78068", - "lon": "-70.22379", - "id": 35028 - }, - { - "name": "Hophornbeem Lane", - "lat": "43.83491", - "lon": "-70.21639", - "id": 40574 - }, - { - "name": "Hoylake Circle", - "lat": "43.76274", - "lon": "-70.26180", - "id": 37607 - }, - { - "name": "Hugh Road", - "lat": "43.60286", - "lon": "-70.32819", - "id": 41031 - }, - { - "name": "Humboldt Street", - "lat": "43.69703", - "lon": "-70.27452", - "id": 13008 - }, - { - "name": "Humbolt Street", - "lat": "43.69660", - "lon": "-70.27441", - "id": 41542 - }, - { - "name": "Humphreys Road", - "lat": "43.62193", - "lon": "-70.21272", - "id": 31970 - }, - { - "name": "Hunter Point Drive", - "lat": "43.56275", - "lon": "-70.38556", - "id": 33804 - }, - { - "name": "Huntington North", - "lat": "43.71097", - "lon": "-70.29186", - "id": 33501 - }, - { - "name": "Huntley Drive", - "lat": "43.58560", - "lon": "-70.41157", - "id": 35076 - }, - { - "name": "Huntress Street", - "lat": "43.65401", - "lon": "-70.28443", - "id": 13616 - }, - { - "name": "Hyde Street", - "lat": "43.67884", - "lon": "-70.29924", - "id": 12500 - }, - { - "name": "Ice Pond Drive", - "lat": "43.70199", - "lon": "-70.26474", - "id": 12967 - }, - { - "name": "Idaho Street", - "lat": "43.69650", - "lon": "-70.28119", - "id": 13009 - }, - { - "name": "Idlewood", - "lat": "43.78463", - "lon": "-70.28362", - "id": 36302 - }, - { - "name": "Idlewood Crossing", - "lat": "43.78285", - "lon": "-70.27652", - "id": 33524 - }, - { - "name": "Idlewood Road", - "lat": "43.78285", - "lon": "-70.27652", - "id": 33698 - }, - { - "name": "Iffley Street", - "lat": "43.69101", - "lon": "-70.30997", - "id": 12585 - }, - { - "name": "Illsley Street", - "lat": "43.68151", - "lon": "-70.26072", - "id": 12513 - }, - { - "name": "India Street", - "lat": "43.66185", - "lon": "-70.25180", - "id": 1434 - }, - { - "name": "Indian Rock Road", - "lat": "43.57305", - "lon": "-70.28368", - "id": 33553 - }, - { - "name": "Indian Way", - "lat": "43.72948", - "lon": "-70.32289", - "id": 39957 - }, - { - "name": "Indian Woods Road", - "lat": "43.57475", - "lon": "-70.28785", - "id": 33201 - }, - { - "name": "Industry", - "lat": "43.60930", - "lon": "-70.30726", - "id": 40803 - }, - { - "name": "Ingersoll Drive", - "lat": "43.69154", - "lon": "-70.32904", - "id": 12566 - }, - { - "name": "Inner Loop Trail", - "lat": "43.78341", - "lon": "-70.22311", - "id": 77740 - }, - { - "name": "Innkeepers Lane", - "lat": "43.75273", - "lon": "-70.31679", - "id": 39642 - }, - { - "name": "International Parkway", - "lat": "43.64848", - "lon": "-70.31216", - "id": 13386 - }, - { - "name": "Interstate 95 North Ramp", - "lat": "43.64858", - "lon": "-70.32943", - "id": 13465 - }, - { - "name": "Interstate 95 South Ramp", - "lat": "43.64896", - "lon": "-70.33492", - "id": 13619 - }, - { - "name": "Inverness", - "lat": "43.77108", - "lon": "-70.26903", - "id": 33294 - }, - { - "name": "Inverness Road", - "lat": "43.77283", - "lon": "-70.27411", - "id": 36684 - }, - { - "name": "Irish Spring Lane", - "lat": "43.76324", - "lon": "-70.38943", - "id": 36564 - }, - { - "name": "Island Ave", - "lat": "43.65618", - "lon": "-70.19817", - "id": 67 - }, - { - "name": "Ivaloo Street", - "lat": "43.69346", - "lon": "-70.27634", - "id": 12662 - }, - { - "name": "Ivie Road", - "lat": "43.62568", - "lon": "-70.22347", - "id": 34118 - }, - { - "name": "Ivy Place", - "lat": "43.69861", - "lon": "-70.24354", - "id": 36066 - }, - { - "name": "Jack Path", - "lat": "43.66945", - "lon": "-70.25347", - "id": 80518 - }, - { - "name": "Jackson Way", - "lat": "43.74571", - "lon": "-70.22875", - "id": 34030 - }, - { - "name": "Jacob Avenue", - "lat": "43.59646", - "lon": "-70.31278", - "id": 81254 - }, - { - "name": "Jameco Mill Road", - "lat": "43.60796", - "lon": "-70.33452", - "id": 38154 - }, - { - "name": "Jameson Drive", - "lat": "43.70711", - "lon": "-70.27422", - "id": 39518 - }, - { - "name": "Jamestown Circle", - "lat": "43.58459", - "lon": "-70.29121", - "id": 36618 - }, - { - "name": "Jana Lane", - "lat": "43.63438", - "lon": "-70.38376", - "id": 39046 - }, - { - "name": "Japanese Pond Road", - "lat": "43.55572", - "lon": "-70.25532", - "id": 33142 - }, - { - "name": "Jarita Court", - "lat": "43.69272", - "lon": "-70.31628", - "id": 12963 - }, - { - "name": "Jeanne Court", - "lat": "43.67102", - "lon": "-70.30447", - "id": 13495 - }, - { - "name": "Jeep Trail", - "lat": "43.55037", - "lon": "-70.30523", - "id": 32665 - }, - { - "name": "Jensen Way", - "lat": "43.73968", - "lon": "-70.23004", - "id": 39999 - }, - { - "name": "Jessies Lane", - "lat": "43.77173", - "lon": "-70.21452", - "id": 85800 - }, - { - "name": "Jetport Boulevard", - "lat": "43.65126", - "lon": "-70.31256", - "id": 13548 - }, - { - "name": "Jewel Road", - "lat": "43.66109", - "lon": "-70.17968", - "id": 32978 - }, - { - "name": "Johansen Street", - "lat": "43.68303", - "lon": "-70.26381", - "id": 12682 - }, - { - "name": "Jolly Roger Road", - "lat": "43.77924", - "lon": "-69.95311", - "id": 33647 - }, - { - "name": "Jordan Farm", - "lat": "43.77870", - "lon": "-70.22414", - "id": 41338 - }, - { - "name": "Joseph Avenue", - "lat": "43.69169", - "lon": "-70.27825", - "id": 12881 - }, - { - "name": "Joss Hill Road", - "lat": "43.60146", - "lon": "-70.44961", - "id": 33896 - }, - { - "name": "Joy Place", - "lat": "43.65120", - "lon": "-70.26671", - "id": 13533 - }, - { - "name": "Judge Hasty Lane", - "lat": "43.59582", - "lon": "-70.32053", - "id": 35386 - }, - { - "name": "Judkins Corner Road", - "lat": "43.78341", - "lon": "-69.95341", - "id": 33511 - }, - { - "name": "Juneberry Lane", - "lat": "43.59130", - "lon": "-70.34752", - "id": 33103 - }, - { - "name": "Junior Street", - "lat": "43.70739", - "lon": "-70.28836", - "id": 33998 - }, - { - "name": "Just A Mere Road", - "lat": "43.69546", - "lon": "-70.24180", - "id": 32872 - }, - { - "name": "Kala Lane", - "lat": "43.62778", - "lon": "-70.37292", - "id": 85621 - }, - { - "name": "Kansas Avenue", - "lat": "43.70508", - "lon": "-70.27862", - "id": 12954 - }, - { - "name": "Katahdin Road", - "lat": "43.57991", - "lon": "-70.20961", - "id": 34084 - }, - { - "name": "Katies Lane", - "lat": "43.60426", - "lon": "-70.45614", - "id": 86048 - }, - { - "name": "Kellogg Street", - "lat": "43.66402", - "lon": "-70.24654", - "id": 13102 - }, - { - "name": "Kenilworth Street", - "lat": "43.66765", - "lon": "-70.29920", - "id": 13285 - }, - { - "name": "Kennebago Dr", - "lat": "43.60725", - "lon": "-70.38421", - "id": 31933 - }, - { - "name": "Kensington Street", - "lat": "43.68271", - "lon": "-70.25499", - "id": 12815 - }, - { - "name": "Kenwood Street", - "lat": "43.66225", - "lon": "-70.28143", - "id": 13345 - }, - { - "name": "Kerri Farms Drive", - "lat": "43.78251", - "lon": "-70.48867", - "id": 36863 - }, - { - "name": "Kerryman Circle", - "lat": "43.59411", - "lon": "-70.41505", - "id": 36478 - }, - { - "name": "Killdeer Road", - "lat": "43.62028", - "lon": "-70.23924", - "id": 33577 - }, - { - "name": "Kimberly Court", - "lat": "43.69146", - "lon": "-70.28199", - "id": 12876 - }, - { - "name": "Kimbertown Lane", - "lat": "43.77763", - "lon": "-70.38074", - "id": 80550 - }, - { - "name": "Kincain Place", - "lat": "43.88869", - "lon": "-70.41387", - "id": 32811 - }, - { - "name": "Kingfisher Cove Road", - "lat": "43.77371", - "lon": "-70.15796", - "id": 35198 - }, - { - "name": "Kingsmark Lane", - "lat": "43.66376", - "lon": "-70.31816", - "id": 13322 - }, - { - "name": "Kirkwood Circle", - "lat": "43.55240", - "lon": "-70.29993", - "id": 38620 - }, - { - "name": "Kirkwood Road", - "lat": "43.55265", - "lon": "-70.30287", - "id": 37073 - }, - { - "name": "Knickerbocker Lane", - "lat": "43.67278", - "lon": "-70.18562", - "id": 12177 - }, - { - "name": "Kostos Road", - "lat": "43.75963", - "lon": "-70.39659", - "id": 85813 - }, - { - "name": "Kylie Avenue", - "lat": "43.60328", - "lon": "-70.45397", - "id": 83589 - }, - { - "name": "Label Avenue", - "lat": "43.69469", - "lon": "-70.31786", - "id": 12852 - }, - { - "name": "Laidlaw Lane", - "lat": "43.60417", - "lon": "-70.32904", - "id": 41112 - }, - { - "name": "Lamplighter Lane", - "lat": "43.59551", - "lon": "-70.37649", - "id": 32982 - }, - { - "name": "Lamplighter Road", - "lat": "43.77157", - "lon": "-70.37657", - "id": 35499 - }, - { - "name": "Lancewood Avenue", - "lat": "43.67999", - "lon": "-70.30394", - "id": 84081 - }, - { - "name": "Land of Nod", - "lat": "43.74918", - "lon": "-70.37346", - "id": 38853 - }, - { - "name": "Landmark Road", - "lat": "43.58376", - "lon": "-70.40972", - "id": 32484 - }, - { - "name": "Lanes Island Way", - "lat": "43.80031", - "lon": "-70.12571", - "id": 33407 - }, - { - "name": "Lanewood Road", - "lat": "43.75343", - "lon": "-70.20272", - "id": 35067 - }, - { - "name": "Larabee Farms Road", - "lat": "43.63412", - "lon": "-70.38876", - "id": 37248 - }, - { - "name": "Larrabee Landing", - "lat": "43.78671", - "lon": "-70.15970", - "id": 35392 - }, - { - "name": "Larry Falls Drive", - "lat": "43.57204", - "lon": "-70.40168", - "id": 80844 - }, - { - "name": "Lassell Street", - "lat": "43.65795", - "lon": "-70.29488", - "id": 13401 - }, - { - "name": "Lattimer Pt Road", - "lat": "43.87708", - "lon": "-70.40698", - "id": 34466 - }, - { - "name": "Laughton Circle", - "lat": "43.56180", - "lon": "-70.38513", - "id": 36317 - }, - { - "name": "Laurel Ridge Road", - "lat": "43.62666", - "lon": "-70.37859", - "id": 38894 - }, - { - "name": "Ledgewood", - "lat": "43.69211", - "lon": "-70.27092", - "id": 40308 - }, - { - "name": "Ledgewood Circle", - "lat": "43.56794", - "lon": "-70.34138", - "id": 40434 - }, - { - "name": "Leeman Street", - "lat": "43.67189", - "lon": "-70.30252", - "id": 12529 - }, - { - "name": "Leighton Farm Road", - "lat": "43.59579", - "lon": "-70.25336", - "id": 37454 - }, - { - "name": "Lester Drive", - "lat": "43.71797", - "lon": "-70.30010", - "id": 12490 - }, - { - "name": "Levia Street", - "lat": "43.67186", - "lon": "-70.31988", - "id": 13564 - }, - { - "name": "Libby Hill Loop, Lowell Preserve", - "lat": "43.79625", - "lon": "-70.35814", - "id": 82989 - }, - { - "name": "Lincoln", - "lat": "43.77681", - "lon": "-69.94495", - "id": 35232 - }, - { - "name": "Lincoln Farms Road", - "lat": "43.74637", - "lon": "-70.26828", - "id": 39644 - }, - { - "name": "Lindburg Avenue", - "lat": "43.58617", - "lon": "-70.35271", - "id": 83800 - }, - { - "name": "Linnel Road", - "lat": "43.85850", - "lon": "-70.46058", - "id": 32884 - }, - { - "name": "Little Bear Road", - "lat": "43.61296", - "lon": "-70.38601", - "id": 80357 - }, - { - "name": "Little Crow Point", - "lat": "43.77549", - "lon": "-69.94240", - "id": 35040 - }, - { - "name": "Little Wohelor", - "lat": "43.87915", - "lon": "-70.52176", - "id": 40321 - }, - { - "name": "Littlebrook Drive", - "lat": "43.76040", - "lon": "-70.24371", - "id": 81906 - }, - { - "name": "Livrite Way", - "lat": "43.77535", - "lon": "-70.36953", - "id": 81151 - }, - { - "name": "Logmad Avenue", - "lat": "43.60406", - "lon": "-70.45116", - "id": 83590 - }, - { - "name": "Lolo Lane", - "lat": "43.74461", - "lon": "-70.38919", - "id": 81152 - }, - { - "name": "Long Wharf", - "lat": "43.65598", - "lon": "-70.25233", - "id": 13119 - }, - { - "name": "Longfellow East Street", - "lat": "43.66685", - "lon": "-70.28061", - "id": 12677 - }, - { - "name": "Longfellow Square", - "lat": "43.65302", - "lon": "-70.26643", - "id": 81170 - }, - { - "name": "Longmeadow Road", - "lat": "43.59977", - "lon": "-70.41955", - "id": 41437 - }, - { - "name": "Longspur Way", - "lat": "43.75975", - "lon": "-70.31643", - "id": 36177 - }, - { - "name": "Longwood Terrace", - "lat": "43.67726", - "lon": "-70.31151", - "id": 13459 - }, - { - "name": "Lorenzo Lane", - "lat": "43.59447", - "lon": "-70.25534", - "id": 34855 - }, - { - "name": "Lorenzo Street", - "lat": "43.66894", - "lon": "-70.32089", - "id": 32367 - }, - { - "name": "Loring Stairs", - "lat": "43.67316", - "lon": "-70.25574", - "id": 79320 - }, - { - "name": "Low Tide Road", - "lat": "43.81138", - "lon": "-70.13678", - "id": 34543 - }, - { - "name": "Lower A", - "lat": "43.65729", - "lon": "-70.19523", - "id": 32047 - }, - { - "name": "Lower A Street", - "lat": "43.65699", - "lon": "-70.19719", - "id": 12145 - }, - { - "name": "Lower Flying Point Road", - "lat": "43.82539", - "lon": "-70.05960", - "id": 37768 - }, - { - "name": "Lucas Street", - "lat": "43.67082", - "lon": "-70.30937", - "id": 13567 - }, - { - "name": "Ludlow Terrace", - "lat": "43.67695", - "lon": "-70.30660", - "id": 13461 - }, - { - "name": "Lufkin Road", - "lat": "43.85324", - "lon": "-70.25989", - "id": 41003 - }, - { - "name": "Luther Street", - "lat": "43.65899", - "lon": "-70.19749", - "id": 12143 - }, - { - "name": "Luther Street Ballpark Trail", - "lat": "43.66095", - "lon": "-70.19217", - "id": 84851 - }, - { - "name": "Lydon Lane", - "lat": "43.62398", - "lon": "-70.23695", - "id": 38360 - }, - { - "name": "Lynda Road", - "lat": "43.68494", - "lon": "-70.26787", - "id": 12723 - }, - { - "name": "Lyndon Avenue", - "lat": "43.66455", - "lon": "-70.18697", - "id": 12058 - }, - { - "name": "Lyseth Moore Drive", - "lat": "43.70748", - "lon": "-70.28720", - "id": 35894 - }, - { - "name": "Lyseth/Moore/Pine Grove Trail", - "lat": "43.70449", - "lon": "-70.28132", - "id": 76985 - }, - { - "name": "Mabel Street", - "lat": "43.67756", - "lon": "-70.30199", - "id": 12509 - }, - { - "name": "Mac Millan Road", - "lat": "43.65337", - "lon": "-70.27257", - "id": 33943 - }, - { - "name": "Maccabe Road", - "lat": "43.71276", - "lon": "-70.25660", - "id": 32335 - }, - { - "name": "Machigonne Street", - "lat": "43.66747", - "lon": "-70.30529", - "id": 13293 - }, - { - "name": "MackWorth Island Hiking Trail", - "lat": "43.68918", - "lon": "-70.23532", - "id": 78273 - }, - { - "name": "Mackworth Island", - "lat": "43.68887", - "lon": "-70.23182", - "id": 81294 - }, - { - "name": "Mackworth Street", - "lat": "43.67647", - "lon": "-70.28149", - "id": 12909 - }, - { - "name": "Macy Street", - "lat": "43.66562", - "lon": "-70.30632", - "id": 13303 - }, - { - "name": "Madeline Street", - "lat": "43.67687", - "lon": "-70.30222", - "id": 12511 - }, - { - "name": "Maggi Road", - "lat": "43.66947", - "lon": "-70.18785", - "id": 12233 - }, - { - "name": "Magnolia Street", - "lat": "43.69025", - "lon": "-70.29117", - "id": 12652 - }, - { - "name": "Maine State Pier", - "lat": "43.65758", - "lon": "-70.24888", - "id": 40339 - }, - { - "name": "Mainewharf", - "lat": "43.65739", - "lon": "-70.25038", - "id": 81409 - }, - { - "name": "Majors Court", - "lat": "43.68904", - "lon": "-70.28433", - "id": 12878 - }, - { - "name": "Malcolm Drive", - "lat": "43.73991", - "lon": "-70.04112", - "id": 36178 - }, - { - "name": "Mallards Way", - "lat": "43.77100", - "lon": "-70.39752", - "id": 36807 - }, - { - "name": "Manhattan Way", - "lat": "43.73653", - "lon": "-70.30847", - "id": 82789 - }, - { - "name": "Manson Libby Road", - "lat": "43.57551", - "lon": "-70.36054", - "id": 37485 - }, - { - "name": "Manter Street", - "lat": "43.62464", - "lon": "-70.23519", - "id": 32940 - }, - { - "name": "Manuel Drive", - "lat": "43.69473", - "lon": "-70.32295", - "id": 12875 - }, - { - "name": "Many Oaks Lane", - "lat": "43.86170", - "lon": "-70.42200", - "id": 33980 - }, - { - "name": "Maple Hill Lane", - "lat": "43.85998", - "lon": "-70.27819", - "id": 38200 - }, - { - "name": "Maplewood Circle", - "lat": "43.73793", - "lon": "-70.26873", - "id": 35573 - }, - { - "name": "Maplewood Street", - "lat": "43.69767", - "lon": "-70.28812", - "id": 12365 - }, - { - "name": "Maquoit Drive", - "lat": "43.82087", - "lon": "-70.05582", - "id": 33360 - }, - { - "name": "Marc Lane", - "lat": "43.76183", - "lon": "-70.39146", - "id": 81154 - }, - { - "name": "Marion Jordan Road", - "lat": "43.55649", - "lon": "-70.29636", - "id": 38276 - }, - { - "name": "Maritime Lane", - "lat": "43.69157", - "lon": "-70.26231", - "id": 12739 - }, - { - "name": "Marlborough Road", - "lat": "43.69515", - "lon": "-70.27714", - "id": 12334 - }, - { - "name": "Marlow Street", - "lat": "43.67037", - "lon": "-70.29737", - "id": 12538 - }, - { - "name": "Marriner Court", - "lat": "43.66590", - "lon": "-70.18399", - "id": 12243 - }, - { - "name": "Marsh Rock Circle", - "lat": "43.56763", - "lon": "-70.31394", - "id": 34990 - }, - { - "name": "Marsh Winds Street", - "lat": "43.56841", - "lon": "-70.37992", - "id": 38303 - }, - { - "name": "Martin", - "lat": "43.77337", - "lon": "-69.94628", - "id": 41411 - }, - { - "name": "Martin Point Bridge", - "lat": "43.69115", - "lon": "-70.24529", - "id": 35420 - }, - { - "name": "Mary Way", - "lat": "43.61464", - "lon": "-70.42318", - "id": 40626 - }, - { - "name": "Mayer Road", - "lat": "43.67139", - "lon": "-70.31042", - "id": 13566 - }, - { - "name": "Mayfield Street", - "lat": "43.68733", - "lon": "-70.29503", - "id": 12846 - }, - { - "name": "McAllister Farms Road", - "lat": "43.68843", - "lon": "-70.32943", - "id": 38122 - }, - { - "name": "McAuley Drive", - "lat": "43.62270", - "lon": "-70.23959", - "id": 35749 - }, - { - "name": "McCann Way", - "lat": "43.57170", - "lon": "-70.40299", - "id": 80843 - }, - { - "name": "McDermott Way", - "lat": "43.76048", - "lon": "-70.34681", - "id": 37478 - }, - { - "name": "McIntyre Way", - "lat": "43.62663", - "lon": "-70.36378", - "id": 32041 - }, - { - "name": "McKinley Court", - "lat": "43.68553", - "lon": "-70.19485", - "id": 1161 - }, - { - "name": "McKinley Road", - "lat": "43.69740", - "lon": "-70.23821", - "id": 32300 - }, - { - "name": "McMaster Lane", - "lat": "43.78248", - "lon": "-69.95214", - "id": 35338 - }, - { - "name": "McNaught Way", - "lat": "43.60746", - "lon": "-70.30690", - "id": 35887 - }, - { - "name": "Mcauley Road", - "lat": "43.66914", - "lon": "-70.20847", - "id": 12321 - }, - { - "name": "Mcauley Way", - "lat": "43.67829", - "lon": "-70.29139", - "id": 13034 - }, - { - "name": "Meadow Avenue", - "lat": "43.67447", - "lon": "-70.20429", - "id": 12016 - }, - { - "name": "Meadow Woods Lane", - "lat": "43.59833", - "lon": "-70.33823", - "id": 37557 - }, - { - "name": "Meadowwood Drive", - "lat": "43.55911", - "lon": "-70.29608", - "id": 33303 - }, - { - "name": "Mechanic Place", - "lat": "43.65755", - "lon": "-70.26452", - "id": 13106 - }, - { - "name": "Medinah Circle", - "lat": "43.76711", - "lon": "-70.27915", - "id": 38124 - }, - { - "name": "Melbourne Road", - "lat": "43.56006", - "lon": "-70.31707", - "id": 36838 - }, - { - "name": "Mellen Street", - "lat": "43.65519", - "lon": "-70.27053", - "id": 13216 - }, - { - "name": "Melrose", - "lat": "43.67087", - "lon": "-70.28081", - "id": 32071 - }, - { - "name": "Memorial Loop", - "lat": "43.68055", - "lon": "-70.29544", - "id": 76926 - }, - { - "name": "Merganser Way", - "lat": "43.81158", - "lon": "-70.06677", - "id": 39975 - }, - { - "name": "Meridian Street", - "lat": "43.65448", - "lon": "-70.19480", - "id": 12173 - }, - { - "name": "Meriline Avenue", - "lat": "43.67298", - "lon": "-70.31761", - "id": 13560 - }, - { - "name": "Merrill Brook Drive", - "lat": "43.58852", - "lon": "-70.44852", - "id": 32702 - }, - { - "name": "Merrimac Place", - "lat": "43.61142", - "lon": "-70.23502", - "id": 36782 - }, - { - "name": "Millet Drive", - "lat": "43.74224", - "lon": "-70.39612", - "id": 34450 - }, - { - "name": "Milton Street", - "lat": "43.70500", - "lon": "-70.30829", - "id": 12413 - }, - { - "name": "Mineral Springs Circle", - "lat": "43.85652", - "lon": "-70.46880", - "id": 37366 - }, - { - "name": "Mona Road", - "lat": "43.69565", - "lon": "-70.28849", - "id": 12324 - }, - { - "name": "Monastery Road", - "lat": "43.56795", - "lon": "-70.24881", - "id": 33171 - }, - { - "name": "Monroe Court", - "lat": "43.66536", - "lon": "-70.25411", - "id": 13146 - }, - { - "name": "Moon Garden Way", - "lat": "43.68651", - "lon": "-70.19088", - "id": 12010 - }, - { - "name": "Moonshadow Circle", - "lat": "43.62436", - "lon": "-70.23414", - "id": 83343 - }, - { - "name": "Moonshadow Lane", - "lat": "43.62441", - "lon": "-70.23375", - "id": 37533 - }, - { - "name": "Moores Drive", - "lat": "43.78894", - "lon": "-70.37226", - "id": 39285 - }, - { - "name": "Moose Creek Lane", - "lat": "43.58266", - "lon": "-70.43054", - "id": 83806 - }, - { - "name": "Moravain Farm Road", - "lat": "43.75795", - "lon": "-70.38271", - "id": 81156 - }, - { - "name": "Morning Mist Lane", - "lat": "43.77941", - "lon": "-69.95347", - "id": 38137 - }, - { - "name": "Morton Trail", - "lat": "43.78340", - "lon": "-70.22139", - "id": 77743 - }, - { - "name": "Moss Road", - "lat": "43.77817", - "lon": "-70.37132", - "id": 37094 - }, - { - "name": "Mount Hunger Shores", - "lat": "43.87615", - "lon": "-70.42693", - "id": 33070 - }, - { - "name": "Mourning Dove Extended", - "lat": "43.86340", - "lon": "-70.42245", - "id": 37728 - }, - { - "name": "Mt. Carmel Cemetery Road", - "lat": "43.68963", - "lon": "-70.30705", - "id": 80645 - }, - { - "name": "Mt. Sinai Cemetery Road", - "lat": "43.69068", - "lon": "-70.30707", - "id": 80644 - }, - { - "name": "Mugwhy", - "lat": "43.70300", - "lon": "-70.29267", - "id": 35974 - }, - { - "name": "Mugwhy Lane", - "lat": "43.70254", - "lon": "-70.29263", - "id": 12361 - }, - { - "name": "Mulberry Avenue", - "lat": "43.67950", - "lon": "-70.30207", - "id": 76931 - }, - { - "name": "Munjoy Street", - "lat": "43.66514", - "lon": "-70.24334", - "id": 13105 - }, - { - "name": "Musson Road", - "lat": "43.87524", - "lon": "-70.51626", - "id": 40663 - }, - { - "name": "Mystical Way", - "lat": "43.80245", - "lon": "-70.32739", - "id": 32860 - }, - { - "name": "Narshall Valley Road", - "lat": "43.74794", - "lon": "-70.39224", - "id": 81157 - }, - { - "name": "Natick Street", - "lat": "43.66176", - "lon": "-70.19813", - "id": 12249 - }, - { - "name": "Negaunee Road", - "lat": "43.85902", - "lon": "-70.46612", - "id": 38532 - }, - { - "name": "Nest Lane", - "lat": "43.72847", - "lon": "-70.31814", - "id": 36922 - }, - { - "name": "Nevada Avenue", - "lat": "43.70252", - "lon": "-70.27834", - "id": 12996 - }, - { - "name": "Nevens Street", - "lat": "43.67136", - "lon": "-70.28739", - "id": 12666 - }, - { - "name": "New Island Avenue", - "lat": "43.65316", - "lon": "-70.19641", - "id": 12131 - }, - { - "name": "New Minnot Way", - "lat": "43.76093", - "lon": "-70.31799", - "id": 85120 - }, - { - "name": "Newbury West Street", - "lat": "43.65946", - "lon": "-70.25289", - "id": 13120 - }, - { - "name": "Newell Avenue", - "lat": "43.70341", - "lon": "-70.30952", - "id": 36602 - }, - { - "name": "Nicholas Court", - "lat": "43.69047", - "lon": "-70.28300", - "id": 12877 - }, - { - "name": "Nicholas Street", - "lat": "43.67278", - "lon": "-70.19899", - "id": 12290 - }, - { - "name": "Nicholi's Way", - "lat": "43.75715", - "lon": "-70.30102", - "id": 35760 - }, - { - "name": "Nobile Road", - "lat": "43.58662", - "lon": "-70.35155", - "id": 37789 - }, - { - "name": "Nonesuch Cove Road", - "lat": "43.57032", - "lon": "-70.31859", - "id": 36025 - }, - { - "name": "North Boyd Street", - "lat": "43.66516", - "lon": "-70.25832", - "id": 37344 - }, - { - "name": "North Boyd Street Trail", - "lat": "43.66424", - "lon": "-70.25716", - "id": 81122 - }, - { - "name": "North Greenleaf Street", - "lat": "43.66643", - "lon": "-70.25486", - "id": 13083 - }, - { - "name": "North Landing Road", - "lat": "43.66562", - "lon": "-70.21191", - "id": 36730 - }, - { - "name": "North Meadow Trail", - "lat": "43.70753", - "lon": "-70.24117", - "id": 77297 - }, - { - "name": "Northern Oaks Drive", - "lat": "43.88142", - "lon": "-70.41925", - "id": 34889 - }, - { - "name": "Northledge Terrace", - "lat": "43.70513", - "lon": "-70.26600", - "id": 38328 - }, - { - "name": "Northport Drive", - "lat": "43.69995", - "lon": "-70.28471", - "id": 12879 - }, - { - "name": "Nottingham Avenue", - "lat": "43.69424", - "lon": "-70.27441", - "id": 12953 - }, - { - "name": "Nubbin Reach", - "lat": "43.76271", - "lon": "-70.17519", - "id": 34111 - }, - { - "name": "O'Brion Street", - "lat": "43.66570", - "lon": "-70.24341", - "id": 33112 - }, - { - "name": "Oak Knoll Road", - "lat": "43.58693", - "lon": "-70.20558", - "id": 38001 - }, - { - "name": "Oak Ridge Way", - "lat": "43.70668", - "lon": "-70.26137", - "id": 33288 - }, - { - "name": "Oakdale Drive", - "lat": "43.59736", - "lon": "-70.34570", - "id": 40783 - }, - { - "name": "Oaklawn Road", - "lat": "43.66700", - "lon": "-70.19350", - "id": 12217 - }, - { - "name": "Oakley Street", - "lat": "43.68567", - "lon": "-70.26139", - "id": 12721 - }, - { - "name": "Oakmont Circle", - "lat": "43.77271", - "lon": "-70.28106", - "id": 34370 - }, - { - "name": "Oaks Apartment", - "lat": "43.60302", - "lon": "-70.33501", - "id": 33177 - }, - { - "name": "Oakwood Road", - "lat": "43.60527", - "lon": "-70.23379", - "id": 40975 - }, - { - "name": "Obrion Street", - "lat": "43.66548", - "lon": "-70.24336", - "id": 13186 - }, - { - "name": "Ocean Port Avenue", - "lat": "43.68648", - "lon": "-70.27426", - "id": 33026 - }, - { - "name": "Ocean Spray Road", - "lat": "43.66733", - "lon": "-70.18335", - "id": 12245 - }, - { - "name": "Odell Way", - "lat": "43.83474", - "lon": "-70.18152", - "id": 39116 - }, - { - "name": "Old Campus Drive", - "lat": "43.69171", - "lon": "-70.28712", - "id": 12947 - }, - { - "name": "Old Neck Road", - "lat": "43.55861", - "lon": "-70.31752", - "id": 34530 - }, - { - "name": "Old Oak Way", - "lat": "43.73487", - "lon": "-70.25566", - "id": 32826 - }, - { - "name": "Old Payne Road", - "lat": "43.57256", - "lon": "-70.38728", - "id": 85840 - }, - { - "name": "Old Sam Trott Road", - "lat": "43.66186", - "lon": "-70.19704", - "id": 12231 - }, - { - "name": "Old Sea Point Road", - "lat": "43.58387", - "lon": "-70.22113", - "id": 85503 - }, - { - "name": "Olde Blackwood Way", - "lat": "43.74994", - "lon": "-70.24216", - "id": 37696 - }, - { - "name": "Olde Colony Lane", - "lat": "43.60777", - "lon": "-70.21899", - "id": 37032 - }, - { - "name": "Ole Musket Road", - "lat": "43.74636", - "lon": "-70.19388", - "id": 34389 - }, - { - "name": "Olmsted Road", - "lat": "43.63926", - "lon": "-70.20221", - "id": 12312 - }, - { - "name": "Olympia Street", - "lat": "43.68879", - "lon": "-70.25332", - "id": 12694 - }, - { - "name": "Olympic Drive", - "lat": "43.77571", - "lon": "-70.27652", - "id": 86011 - }, - { - "name": "Onway Avenue", - "lat": "43.65378", - "lon": "-70.18384", - "id": 12124 - }, - { - "name": "Oramel Avenue", - "lat": "43.70314", - "lon": "-70.29787", - "id": 12423 - }, - { - "name": "Oregon Street", - "lat": "43.68825", - "lon": "-70.25042", - "id": 12699 - }, - { - "name": "Orkney Street", - "lat": "43.67136", - "lon": "-70.29396", - "id": 12933 - }, - { - "name": "Orland Street", - "lat": "43.66533", - "lon": "-70.28864", - "id": 12389 - }, - { - "name": "Osgood Street", - "lat": "43.65449", - "lon": "-70.29978", - "id": 13513 - }, - { - "name": "Oshawa Path", - "lat": "43.66655", - "lon": "-70.19373", - "id": 39453 - }, - { - "name": "Osprey Terrace", - "lat": "43.69523", - "lon": "-70.26484", - "id": 12941 - }, - { - "name": "Out Back Road", - "lat": "43.67796", - "lon": "-70.25435", - "id": 12565 - }, - { - "name": "Outer Loop Trail", - "lat": "43.61399", - "lon": "-70.21901", - "id": 78318 - }, - { - "name": "Overset Road", - "lat": "43.71982", - "lon": "-70.28227", - "id": 12485 - }, - { - "name": "Owls Head Drive", - "lat": "43.78992", - "lon": "-70.36580", - "id": 32565 - }, - { - "name": "Paddock Way", - "lat": "43.75806", - "lon": "-70.27956", - "id": 79281 - }, - { - "name": "Palmer Point Road", - "lat": "43.80014", - "lon": "-70.12777", - "id": 41231 - }, - { - "name": "Pamela Road", - "lat": "43.71944", - "lon": "-70.28707", - "id": 13021 - }, - { - "name": "Panoramic View Drive", - "lat": "43.72079", - "lon": "-70.29048", - "id": 38352 - }, - { - "name": "Panoramic View Street", - "lat": "43.72123", - "lon": "-70.29089", - "id": 12480 - }, - { - "name": "Paper Street", - "lat": "43.66548", - "lon": "-70.27362", - "id": 35057 - }, - { - "name": "Pari Place", - "lat": "43.69712", - "lon": "-70.31276", - "id": 12839 - }, - { - "name": "Park Ave Ballpark Trail", - "lat": "43.66169", - "lon": "-70.19156", - "id": 84852 - }, - { - "name": "Parker Path", - "lat": "43.65590", - "lon": "-70.18541", - "id": 84845 - }, - { - "name": "Parris Street", - "lat": "43.65722", - "lon": "-70.26356", - "id": 13070 - }, - { - "name": "Parsons Pond Drive", - "lat": "43.71260", - "lon": "-70.29197", - "id": 12338 - }, - { - "name": "Parthas Court", - "lat": "43.77872", - "lon": "-69.94517", - "id": 39203 - }, - { - "name": "Partridge Circle", - "lat": "43.66061", - "lon": "-70.32100", - "id": 13369 - }, - { - "name": "Patience Drive", - "lat": "43.74002", - "lon": "-70.39361", - "id": 81158 - }, - { - "name": "Patricia's Way", - "lat": "43.77532", - "lon": "-70.29460", - "id": 33965 - }, - { - "name": "Patrick Way", - "lat": "43.69286", - "lon": "-70.29666", - "id": 12872 - }, - { - "name": "Patton Court", - "lat": "43.65685", - "lon": "-70.25424", - "id": 81169 - }, - { - "name": "Payson Street", - "lat": "43.65913", - "lon": "-70.28061", - "id": 13399 - }, - { - "name": "Peabbles Cove Road", - "names": { - "source": "tiger" - }, - "lat": "43.58709", - "lon": "-70.21058", - "id": 34425 - }, - { - "name": "Peables Cove Road", - "lat": "43.58491", - "lon": "-70.21141", - "id": 34844 - }, - { - "name": "Pembroke Street", - "lat": "43.68230", - "lon": "-70.25989", - "id": 12747 - }, - { - "name": "Penn Avenue", - "lat": "43.70105", - "lon": "-70.27804", - "id": 12939 - }, - { - "name": "Pennell Avenue", - "lat": "43.70085", - "lon": "-70.29304", - "id": 12435 - }, - { - "name": "Penrith Road", - "lat": "43.66145", - "lon": "-70.31454", - "id": 13358 - }, - { - "name": "Peppergrass Road", - "lat": "43.60021", - "lon": "-70.25551", - "id": 40572 - }, - { - "name": "Percival Street", - "lat": "43.67652", - "lon": "-70.29402", - "id": 12908 - }, - { - "name": "Percy Hawkes Road", - "lat": "43.76060", - "lon": "-70.36187", - "id": 33549 - }, - { - "name": "Phantom Farm Road", - "lat": "43.57512", - "lon": "-70.21635", - "id": 32945 - }, - { - "name": "Pheasant Hill Road", - "lat": "43.60311", - "lon": "-70.24690", - "id": 41212 - }, - { - "name": "Pheasant Ridge Drive", - "lat": "43.78296", - "lon": "-70.38303", - "id": 35707 - }, - { - "name": "Phinneas Lane", - "lat": "43.57585", - "lon": "-70.31091", - "id": 34870 - }, - { - "name": "Pilgrims Lane", - "lat": "43.78665", - "lon": "-70.36938", - "id": 33521 - }, - { - "name": "Pine Grove Way", - "lat": "43.71612", - "lon": "-70.22905", - "id": 81413 - }, - { - "name": "Pine Tree Industrial Parkway", - "lat": "43.66969", - "lon": "-70.32640", - "id": 13517 - }, - { - "name": "Pinebrook Lane", - "lat": "43.68195", - "lon": "-70.31456", - "id": 13441 - }, - { - "name": "Pinehurst Lane", - "lat": "43.73989", - "lon": "-70.26649", - "id": 34220 - }, - { - "name": "Pineledge Terrace", - "lat": "43.68767", - "lon": "-70.27373", - "id": 12732 - }, - { - "name": "Pintail Point Drive", - "lat": "43.57649", - "lon": "-70.30557", - "id": 37838 - }, - { - "name": "Pintail Road", - "lat": "43.77069", - "lon": "-69.94308", - "id": 34387 - }, - { - "name": "Pioneer Lane", - "lat": "43.81816", - "lon": "-70.48187", - "id": 33720 - }, - { - "name": "Pit Lane", - "lat": "43.61029", - "lon": "-70.38125", - "id": 79385 - }, - { - "name": "Pitchfork Lane", - "lat": "43.59101", - "lon": "-70.28684", - "id": 35849 - }, - { - "name": "Pittee Creek Way", - "lat": "43.77489", - "lon": "-70.17215", - "id": 85768 - }, - { - "name": "Pleasant Cove Lane", - "lat": "43.68708", - "lon": "-70.19064", - "id": 12268 - }, - { - "name": "Pleasant Valley Avenue", - "lat": "43.60555", - "lon": "-70.23633", - "id": 35199 - }, - { - "name": "Plowman Street", - "lat": "43.67122", - "lon": "-70.25667", - "id": 39521 - }, - { - "name": "Plumwood Way", - "lat": "43.70901", - "lon": "-70.25993", - "id": 40358 - }, - { - "name": "Plymouth Street", - "lat": "43.69737", - "lon": "-70.29654", - "id": 12352 - }, - { - "name": "Poe Street", - "lat": "43.68058", - "lon": "-70.31952", - "id": 13444 - }, - { - "name": "Pomeroy Street", - "lat": "43.66509", - "lon": "-70.30179", - "id": 86041 - }, - { - "name": "Ponce Street", - "lat": "43.66371", - "lon": "-70.24987", - "id": 13209 - }, - { - "name": "Pond View", - "lat": "43.78518", - "lon": "-70.49699", - "id": 35021 - }, - { - "name": "Pond Villa", - "lat": "43.76003", - "lon": "-70.36069", - "id": 40649 - }, - { - "name": "Pond Villa Extension", - "lat": "43.75933", - "lon": "-70.35981", - "id": 38409 - }, - { - "name": "Poole Drive", - "lat": "43.88101", - "lon": "-70.42176", - "id": 32191 - }, - { - "name": "Popham Street", - "lat": "43.67611", - "lon": "-70.32057", - "id": 13466 - }, - { - "name": "Porch Street", - "lat": "43.70452", - "lon": "-70.28555", - "id": 12938 - }, - { - "name": "Port Drive", - "lat": "43.80262", - "lon": "-70.12086", - "id": 34577 - }, - { - "name": "Porteous Way", - "lat": "43.75175", - "lon": "-70.20101", - "id": 41321 - }, - { - "name": "Portland Farms Road", - "lat": "43.59499", - "lon": "-70.32254", - "id": 33917 - }, - { - "name": "Portland Pier", - "lat": "43.65604", - "lon": "-70.25120", - "id": 13117 - }, - { - "name": "Portland Square", - "lat": "43.65581", - "lon": "-70.25568", - "id": 81237 - }, - { - "name": "Portland Trails Fore River Sancturary Trail (white)", - "lat": "43.66686", - "lon": "-70.31662", - "id": 34666 - }, - { - "name": "Poulos Road", - "lat": "43.75868", - "lon": "-70.39752", - "id": 85812 - }, - { - "name": "Powell Point Trail", - "lat": "43.80189", - "lon": "-70.14650", - "id": 78283 - }, - { - "name": "Preble Street Extension", - "lat": "43.66509", - "lon": "-70.26761", - "id": 13201 - }, - { - "name": "Presnell Street", - "lat": "43.66967", - "lon": "-70.30870", - "id": 13571 - }, - { - "name": "Prestwick Circle", - "lat": "43.76347", - "lon": "-70.26300", - "id": 34457 - }, - { - "name": "Prim Street", - "lat": "43.70441", - "lon": "-70.32072", - "id": 12415 - }, - { - "name": "Proctor Street", - "lat": "43.67417", - "lon": "-70.20324", - "id": 80553 - }, - { - "name": "Professional Drive", - "lat": "43.59514", - "lon": "-70.32469", - "id": 33661 - }, - { - "name": "Prospector Lane", - "lat": "43.57915", - "lon": "-70.30008", - "id": 37537 - }, - { - "name": "Prout Place", - "lat": "43.59819", - "lon": "-70.26847", - "id": 32061 - }, - { - "name": "Purchas Street", - "lat": "43.67574", - "lon": "-70.31960", - "id": 13506 - }, - { - "name": "Purington", - "lat": "43.76913", - "lon": "-70.27040", - "id": 84491 - }, - { - "name": "Purpodock Drive", - "lat": "43.61501", - "lon": "-70.24787", - "id": 40470 - }, - { - "name": "Pya Court", - "lat": "43.60564", - "lon": "-70.39222", - "id": 83802 - }, - { - "name": "Pya Road", - "lat": "43.67867", - "lon": "-70.27868", - "id": 12904 - }, - { - "name": "Quartermasters Court", - "lat": "43.68328", - "lon": "-70.19328", - "id": 12019 - }, - { - "name": "Quartz Knob Road", - "lat": "43.61570", - "lon": "-70.22819", - "id": 37357 - }, - { - "name": "Queens Drive", - "lat": "43.56285", - "lon": "-70.39824", - "id": 1217 - }, - { - "name": "Racine Avenue", - "lat": "43.70722", - "lon": "-70.27950", - "id": 12993 - }, - { - "name": "Rainbow Mall Road", - "lat": "43.68947", - "lon": "-70.26898", - "id": 32660 - }, - { - "name": "Rainmaker Drive", - "lat": "43.69514", - "lon": "-70.32372", - "id": 12619 - }, - { - "name": "Ram Light Lane", - "lat": "43.58802", - "lon": "-70.20834", - "id": 34759 - }, - { - "name": "Randolph Street", - "lat": "43.70243", - "lon": "-70.30336", - "id": 12424 - }, - { - "name": "Rands Way", - "lat": "43.66728", - "lon": "-70.20476", - "id": 12320 - }, - { - "name": "Range", - "lat": "43.76299", - "lon": "-70.22924", - "id": 38151 - }, - { - "name": "Range Street", - "lat": "43.68960", - "lon": "-70.30136", - "id": 12842 - }, - { - "name": "Raven Terrace", - "lat": "43.58073", - "lon": "-70.34359", - "id": 34482 - }, - { - "name": "Ravine Way", - "lat": "43.77926", - "lon": "-70.18266", - "id": 39172 - }, - { - "name": "Raymond Wood Road", - "lat": "43.58933", - "lon": "-70.41867", - "id": 37263 - }, - { - "name": "Reamer's Road", - "lat": "43.69242", - "lon": "-70.10872", - "id": 77882 - }, - { - "name": "Reamers Road", - "lat": "43.69360", - "lon": "-70.10878", - "id": 12044 - }, - { - "name": "Rebecca Way", - "lat": "43.70624", - "lon": "-70.25974", - "id": 33777 - }, - { - "name": "Recompense Lane", - "lat": "43.82875", - "lon": "-70.06507", - "id": 34109 - }, - { - "name": "Red Barn Circle", - "lat": "43.59634", - "lon": "-70.28267", - "id": 82824 - }, - { - "name": "Redhawk Drive", - "lat": "43.85970", - "lon": "-70.46234", - "id": 32996 - }, - { - "name": "Redlon Park Road", - "lat": "43.66416", - "lon": "-70.30104", - "id": 13316 - }, - { - "name": "Redwood Avenue", - "lat": "43.67928", - "lon": "-70.30456", - "id": 84080 - }, - { - "name": "Reef Lane", - "lat": "43.57080", - "lon": "-70.34014", - "id": 32740 - }, - { - "name": "Reg Roc Road", - "lat": "43.69622", - "lon": "-70.24137", - "id": 41466 - }, - { - "name": "Regal Pines Drive", - "lat": "43.58997", - "lon": "-70.37445", - "id": 32735 - }, - { - "name": "Regan Lane", - "lat": "43.70704", - "lon": "-70.29596", - "id": 12411 - }, - { - "name": "Retriever Lane", - "lat": "43.76084", - "lon": "-70.39191", - "id": 81159 - }, - { - "name": "Rhonda Drive", - "lat": "43.55754", - "lon": "-70.32100", - "id": 34066 - }, - { - "name": "Rich Way", - "lat": "43.72779", - "lon": "-70.23841", - "id": 34961 - }, - { - "name": "Richmond Terrace", - "lat": "43.56596", - "lon": "-70.22379", - "id": 39444 - }, - { - "name": "Ricker Park", - "lat": "43.66883", - "lon": "-70.27757", - "id": 13131 - }, - { - "name": "Riggs Street", - "lat": "43.67559", - "lon": "-70.31649", - "id": 13474 - }, - { - "name": "Riley Drive", - "lat": "43.75127", - "lon": "-70.39183", - "id": 36116 - }, - { - "name": "Ritzcraft Street", - "lat": "43.59795", - "lon": "-70.31960", - "id": 32245 - }, - { - "name": "River Basin Lane", - "lat": "43.82457", - "lon": "-70.21345", - "id": 38919 - }, - { - "name": "River Bend Lane", - "lat": "43.56847", - "lon": "-70.32357", - "id": 36387 - }, - { - "name": "River Place", - "lat": "43.71415", - "lon": "-70.25401", - "id": 33417 - }, - { - "name": "River's Edge Drive", - "lat": "43.65690", - "lon": "-70.31896", - "id": 83579 - }, - { - "name": "Riverside Court", - "lat": "43.68255", - "lon": "-70.32739", - "id": 33423 - }, - { - "name": "Riverton Drive", - "lat": "43.69981", - "lon": "-70.32042", - "id": 12636 - }, - { - "name": "Rock Crest Drive", - "lat": "43.61506", - "lon": "-70.22697", - "id": 37201 - }, - { - "name": "Rock Crest Point", - "lat": "43.61612", - "lon": "-70.22457", - "id": 38050 - }, - { - "name": "Rock Ridge Run", - "lat": "43.76631", - "lon": "-70.23216", - "id": 33595 - }, - { - "name": "Rock Wall Lane", - "lat": "43.62514", - "lon": "-70.22701", - "id": 34822 - }, - { - "name": "Rockledge Avenue", - "lat": "43.67003", - "lon": "-70.20609", - "id": 12294 - }, - { - "name": "Romasco Lane", - "lat": "43.66548", - "lon": "-70.25109", - "id": 13188 - }, - { - "name": "Rose Hill Lane", - "lat": "43.69962", - "lon": "-70.10243", - "id": 12030 - }, - { - "name": "Rosehill Way", - "lat": "43.57556", - "lon": "-70.38054", - "id": 33325 - }, - { - "name": "Round Stone Way", - "lat": "43.71004", - "lon": "-70.28233", - "id": 12670 - }, - { - "name": "Rowe Avenue", - "lat": "43.67304", - "lon": "-70.31857", - "id": 13379 - }, - { - "name": "Royal Ridge Road", - "lat": "43.58418", - "lon": "-70.36514", - "id": 35676 - }, - { - "name": "Royall Meadows Road", - "lat": "43.78419", - "lon": "-70.15931", - "id": 39735 - }, - { - "name": "Royall Point Road", - "lat": "43.78755", - "lon": "-70.15622", - "id": 32371 - }, - { - "name": "Ruby Mae Lane", - "lat": "43.60418", - "lon": "-70.45822", - "id": 85740 - }, - { - "name": "Running Tide Drive", - "lat": "43.57033", - "lon": "-70.33930", - "id": 34409 - }, - { - "name": "Ryefield Street", - "lat": "43.65288", - "lon": "-70.19247", - "id": 12084 - }, - { - "name": "Sa Yer Street", - "lat": "43.76968", - "lon": "-70.26997", - "id": 84488 - }, - { - "name": "Sagebrush Drive", - "lat": "43.59617", - "lon": "-70.34376", - "id": 39241 - }, - { - "name": "Saint Jude Street", - "lat": "43.68553", - "lon": "-70.26214", - "id": 37847 - }, - { - "name": "Saint Street", - "lat": "43.68577", - "lon": "-70.26190", - "id": 32375 - }, - { - "name": "Salt MarshWay", - "lat": "43.59231", - "lon": "-70.26437", - "id": 85765 - }, - { - "name": "Sanctuary Road", - "lat": "43.78381", - "lon": "-69.94409", - "id": 36687 - }, - { - "name": "Sandpiper Cove", - "lat": "43.56083", - "lon": "-70.30782", - "id": 34988 - }, - { - "name": "Sandpiper Cove Drive", - "lat": "43.55715", - "lon": "-70.30372", - "id": 34173 - }, - { - "name": "Sandpiper Cove Road", - "lat": "43.76832", - "lon": "-70.16951", - "id": 37158 - }, - { - "name": "Sandy Creek Lane", - "lat": "43.58289", - "lon": "-70.40417", - "id": 39771 - }, - { - "name": "Santiago Way", - "lat": "43.79325", - "lon": "-70.29499", - "id": 85619 - }, - { - "name": "Sarah Liberty Lane", - "lat": "43.58939", - "lon": "-70.43243", - "id": 31919 - }, - { - "name": "Saratoga Lane", - "lat": "43.57549", - "lon": "-70.39704", - "id": 33412 - }, - { - "name": "Saugus Street", - "lat": "43.70325", - "lon": "-70.30583", - "id": 12421 - }, - { - "name": "Saunders Street", - "lat": "43.67234", - "lon": "-70.28615", - "id": 12927 - }, - { - "name": "Saville Street", - "lat": "43.68826", - "lon": "-70.31299", - "id": 41285 - }, - { - "name": "Savoy Street", - "lat": "43.68313", - "lon": "-70.26154", - "id": 12362 - }, - { - "name": "Sayward Road", - "lat": "43.77515", - "lon": "-70.40022", - "id": 34082 - }, - { - "name": "Scarborough Downs Road", - "lat": "43.59701", - "lon": "-70.35477", - "id": 32690 - }, - { - "name": "Schuster Road", - "lat": "43.78868", - "lon": "-70.30254", - "id": 40532 - }, - { - "name": "Scottow Hill Road", - "lat": "43.58717", - "lon": "-70.37207", - "id": 35090 - }, - { - "name": "Scottow Way", - "lat": "43.59026", - "lon": "-70.36928", - "id": 40681 - }, - { - "name": "Sea Barn Road", - "lat": "43.61066", - "lon": "-70.21510", - "id": 32005 - }, - { - "name": "Sea Meadows Lane", - "lat": "43.77209", - "lon": "-70.13346", - "id": 39193 - }, - { - "name": "Sea Spray Reach", - "lat": "43.76838", - "lon": "-70.17071", - "id": 39026 - }, - { - "name": "Seaborne Drive", - "lat": "43.77450", - "lon": "-70.15672", - "id": 38672 - }, - { - "name": "Seal Cove Lane", - "lat": "43.68769", - "lon": "-70.19605", - "id": 12012 - }, - { - "name": "Seaspot Run", - "lat": "43.78025", - "lon": "-69.94487", - "id": 36023 - }, - { - "name": "Seaview Road", - "lat": "43.68255", - "lon": "-70.19347", - "id": 12283 - }, - { - "name": "Seaward Point", - "lat": "43.68614", - "lon": "-70.11421", - "id": 12046 - }, - { - "name": "Sebago View Road", - "lat": "43.81776", - "lon": "-70.48285", - "id": 32125 - }, - { - "name": "Secret Cove Road", - "lat": "43.85813", - "lon": "-70.44661", - "id": 32463 - }, - { - "name": "Seeley Avenue", - "lat": "43.66860", - "lon": "-70.29081", - "id": 12748 - }, - { - "name": "Settlers Court", - "lat": "43.71226", - "lon": "-70.29345", - "id": 12339 - }, - { - "name": "Shaw Acres Extended", - "lat": "43.83720", - "lon": "-70.48019", - "id": 36155 - }, - { - "name": "Shaw Acres Road", - "lat": "43.83586", - "lon": "-70.47820", - "id": 33152 - }, - { - "name": "Sheffield Street", - "lat": "43.66241", - "lon": "-70.28267", - "id": 13339 - }, - { - "name": "Shenandoah Hill", - "lat": "43.85115", - "lon": "-70.27177", - "id": 40615 - }, - { - "name": "Sherbrooke Street", - "lat": "43.66475", - "lon": "-70.24643", - "id": 36605 - }, - { - "name": "Sheridan Street Woonerf", - "lat": "43.66897", - "lon": "-70.25308", - "id": 80516 - }, - { - "name": "Shingle Way", - "lat": "43.70589", - "lon": "-70.28542", - "id": 12987 - }, - { - "name": "Shinnecock Lane", - "lat": "43.77528", - "lon": "-70.27525", - "id": 86012 - }, - { - "name": "Shipwreck Cove Road", - "lat": "43.58801", - "lon": "-70.20669", - "id": 31983 - }, - { - "name": "Shore Line Drive", - "lat": "43.69703", - "lon": "-70.23697", - "id": 37987 - }, - { - "name": "Silva Drive", - "lat": "43.60125", - "lon": "-70.26538", - "id": 39545 - }, - { - "name": "Skylark Road", - "lat": "43.70266", - "lon": "-70.29632", - "id": 12379 - }, - { - "name": "Skyline Street", - "lat": "43.59913", - "lon": "-70.32014", - "id": 32600 - }, - { - "name": "Sled Run Road", - "lat": "43.85089", - "lon": "-70.27478", - "id": 36360 - }, - { - "name": "Slemons Road", - "lat": "43.68755", - "lon": "-70.26823", - "id": 12706 - }, - { - "name": "Sloan Road", - "lat": "43.68687", - "lon": "-70.31441", - "id": 33131 - }, - { - "name": "Smith Farm Lane", - "lat": "43.71226", - "lon": "-70.29793", - "id": 13025 - }, - { - "name": "Snowshead Road", - "lat": "43.77855", - "lon": "-69.93615", - "id": 37560 - }, - { - "name": "Sonnet Lane", - "lat": "43.67759", - "lon": "-70.30752", - "id": 13457 - }, - { - "name": "Sophia Ave", - "lat": "43.59741", - "lon": "-70.31179", - "id": 81255 - }, - { - "name": "Sorsfield Road", - "lat": "43.69113", - "lon": "-70.30977", - "id": 34837 - }, - { - "name": "South Grafton Street", - "lat": "43.68856", - "lon": "-70.26212", - "id": 13026 - }, - { - "name": "South Side Lane", - "lat": "43.68449", - "lon": "-70.15706", - "id": 32169 - }, - { - "name": "Southpointe Drive", - "lat": "43.58599", - "lon": "-70.34724", - "id": 34835 - }, - { - "name": "Southside Drive", - "lat": "43.77504", - "lon": "-70.37968", - "id": 34436 - }, - { - "name": "Southwell Road", - "lat": "43.62264", - "lon": "-70.23693", - "id": 33799 - }, - { - "name": "Spar Circle", - "lat": "43.80304", - "lon": "-70.15777", - "id": 36404 - }, - { - "name": "Spoondrift Lane", - "lat": "43.57766", - "lon": "-70.21210", - "id": 39676 - }, - { - "name": "Spring Cove Lane", - "lat": "43.68752", - "lon": "-70.19315", - "id": 34183 - }, - { - "name": "Springbrook Way", - "lat": "43.69720", - "lon": "-70.31973", - "id": 12642 - }, - { - "name": "Spunky Way", - "lat": "43.78383", - "lon": "-69.93313", - "id": 34840 - }, - { - "name": "Spurwink Avenue", - "lat": "43.58487", - "lon": "-70.24457", - "id": 36209 - }, - { - "name": "St Joseph's College", - "lat": "43.82555", - "lon": "-70.48051", - "id": 37008 - }, - { - "name": "St Jude Street", - "lat": "43.68594", - "lon": "-70.26210", - "id": 13027 - }, - { - "name": "St Lawrence Street", - "lat": "43.66365", - "lon": "-70.24401", - "id": 13269 - }, - { - "name": "Stanford Lane", - "lat": "43.58230", - "lon": "-70.26785", - "id": 38974 - }, - { - "name": "Stapleford Drive", - "lat": "43.71571", - "lon": "-70.27516", - "id": 39860 - }, - { - "name": "Starlight Road", - "lat": "43.67919", - "lon": "-70.31317", - "id": 13450 - }, - { - "name": "State Avenue", - "lat": "43.61977", - "lon": "-70.24997", - "id": 37304 - }, - { - "name": "State St", - "lat": "43.65291", - "lon": "-70.26703", - "id": 321 - }, - { - "name": "Steeplebush Road", - "lat": "43.59584", - "lon": "-70.25525", - "id": 33997 - }, - { - "name": "Steeplechase Drive", - "lat": "43.56682", - "lon": "-70.38387", - "id": 34094 - }, - { - "name": "Steeplechase Road", - "lat": "43.84586", - "lon": "-70.25701", - "id": 37058 - }, - { - "name": "Stephenson Street", - "lat": "43.62388", - "lon": "-70.24298", - "id": 35663 - }, - { - "name": "Sterlingwood Drive", - "lat": "43.59239", - "lon": "-70.43485", - "id": 32704 - }, - { - "name": "Stetson Court", - "lat": "43.65058", - "lon": "-70.26016", - "id": 13087 - }, - { - "name": "Stetsons Court", - "lat": "43.65030", - "lon": "-70.26031", - "id": 33999 - }, - { - "name": "Stillwood Road", - "lat": "43.73349", - "lon": "-70.27508", - "id": 33315 - }, - { - "name": "Stirrup Road", - "lat": "43.60463", - "lon": "-70.23085", - "id": 35058 - }, - { - "name": "Stone Brook Road", - "lat": "43.78744", - "lon": "-70.37735", - "id": 34168 - }, - { - "name": "Stone Brooke Road", - "lat": "43.58532", - "lon": "-70.41616", - "id": 32742 - }, - { - "name": "Stonebridge Road", - "lat": "43.60759", - "lon": "-70.22547", - "id": 35591 - }, - { - "name": "Stonegate Road", - "lat": "43.61963", - "lon": "-70.23051", - "id": 33903 - }, - { - "name": "Stoneledge Drive", - "lat": "43.66523", - "lon": "-70.29707", - "id": 13509 - }, - { - "name": "Stoneridge", - "lat": "43.82185", - "lon": "-70.47699", - "id": 33727 - }, - { - "name": "Stoneridge Circle", - "lat": "43.82335", - "lon": "-70.47976", - "id": 34196 - }, - { - "name": "Stoneridge Drive", - "lat": "43.56509", - "lon": "-70.29460", - "id": 39428 - }, - { - "name": "Stoney Creek Road", - "lat": "43.58552", - "lon": "-70.34898", - "id": 38852 - }, - { - "name": "Stony Ridge Road", - "lat": "43.74589", - "lon": "-70.20577", - "id": 32624 - }, - { - "name": "Storm Drive", - "lat": "43.85833", - "lon": "-70.45472", - "id": 1144 - }, - { - "name": "Stormy Bridge", - "lat": "43.74548", - "lon": "-70.23345", - "id": 37007 - }, - { - "name": "Stormy Brook Road", - "lat": "43.74450", - "lon": "-70.23126", - "id": 40646 - }, - { - "name": "Stowell Brooke Road", - "lat": "43.87097", - "lon": "-70.25456", - "id": 79677 - }, - { - "name": "Stratton Place", - "lat": "43.65084", - "lon": "-70.26038", - "id": 13111 - }, - { - "name": "Streamwood Lane", - "lat": "43.73396", - "lon": "-70.27267", - "id": 40983 - }, - { - "name": "Stroudwater Road", - "lat": "43.66353", - "lon": "-70.31471", - "id": 13324 - }, - { - "name": "Stroudwater Trail", - "lat": "43.65680", - "lon": "-70.32673", - "id": 76960 - }, - { - "name": "Sturbridge Lane", - "lat": "43.82911", - "lon": "-70.28428", - "id": 38125 - }, - { - "name": "Sturdivant Drive", - "lat": "43.72030", - "lon": "-70.28551", - "id": 12484 - }, - { - "name": "Sturdivant Road", - "lat": "43.75718", - "lon": "-70.20109", - "id": 36444 - }, - { - "name": "Sullivan Court", - "lat": "43.68964", - "lon": "-70.28478", - "id": 38641 - }, - { - "name": "Sumac Street", - "lat": "43.70975", - "lon": "-70.28407", - "id": 12928 - }, - { - "name": "Summerfield Lane", - "lat": "43.59160", - "lon": "-70.32007", - "id": 34709 - }, - { - "name": "Sumner Court", - "lat": "43.66630", - "lon": "-70.24961", - "id": 13177 - }, - { - "name": "Sunset Pt Road", - "lat": "43.76333", - "lon": "-70.17466", - "id": 39197 - }, - { - "name": "Surfside Avenue", - "lat": "43.58215", - "lon": "-70.20476", - "id": 37924 - }, - { - "name": "Surrenden Street", - "lat": "43.66148", - "lon": "-70.27544", - "id": 40563 - }, - { - "name": "Susan Avenue", - "lat": "43.57141", - "lon": "-70.39546", - "id": 32536 - }, - { - "name": "Susan Road", - "lat": "43.57745", - "lon": "-70.24175", - "id": 33616 - }, - { - "name": "Sweet Williams Way", - "lat": "43.78092", - "lon": "-69.95405", - "id": 31900 - }, - { - "name": "Sweetbrier Lane", - "lat": "43.62949", - "lon": "-70.38509", - "id": 35006 - }, - { - "name": "Sweetsir Road", - "lat": "43.58404", - "lon": "-70.23321", - "id": 37301 - }, - { - "name": "Sylvia Road", - "lat": "43.68454", - "lon": "-70.26843", - "id": 12726 - }, - { - "name": "Talbot Street", - "lat": "43.71406", - "lon": "-70.28566", - "id": 12972 - }, - { - "name": "Tanya Lane", - "lat": "43.80296", - "lon": "-70.33585", - "id": 36101 - }, - { - "name": "Tarbell Avenue", - "lat": "43.70413", - "lon": "-70.30857", - "id": 12417 - }, - { - "name": "Tashia Way", - "lat": "43.60729", - "lon": "-70.33552", - "id": 40793 - }, - { - "name": "Tate Street", - "lat": "43.64885", - "lon": "-70.26195", - "id": 13516 - }, - { - "name": "Technology Way", - "lat": "43.59222", - "lon": "-70.35411", - "id": 83801 - }, - { - "name": "Tee Drive", - "lat": "43.70938", - "lon": "-70.31317", - "id": 12569 - }, - { - "name": "Terison Drive", - "lat": "43.76169", - "lon": "-70.27304", - "id": 38286 - }, - { - "name": "Texas Street", - "lat": "43.69793", - "lon": "-70.28121", - "id": 13003 - }, - { - "name": "The Tote Road", - "lat": "43.77690", - "lon": "-69.94590", - "id": 32845 - }, - { - "name": "Thomes Way", - "lat": "43.83162", - "lon": "-70.29063", - "id": 85708 - }, - { - "name": "Thompson's Way", - "lat": "43.86365", - "lon": "-70.14850", - "id": 37102 - }, - { - "name": "Thompsons Point", - "lat": "43.65143", - "lon": "-70.29042", - "id": 1165 - }, - { - "name": "Thompsons Point Connector Road", - "lat": "43.65359", - "lon": "-70.29201", - "id": 13637 - }, - { - "name": "Thomspons Point Road", - "lat": "43.65401", - "lon": "-70.29132", - "id": 76950 - }, - { - "name": "Thrasher Road", - "lat": "43.62107", - "lon": "-70.23665", - "id": 40753 - }, - { - "name": "Thurston Street", - "lat": "43.66914", - "lon": "-70.18723", - "id": 37017 - }, - { - "name": "Tidewater Cove", - "lat": "43.69911", - "lon": "-70.24482", - "id": 37091 - }, - { - "name": "Tigerlilly Lane", - "lat": "43.58404", - "lon": "-70.31214", - "id": 34037 - }, - { - "name": "To Beach", - "lat": "43.70083", - "lon": "-70.09934", - "id": 77884 - }, - { - "name": "Todd", - "lat": "43.60073", - "lon": "-70.21888", - "id": 39420 - }, - { - "name": "Toronita Street", - "lat": "43.69515", - "lon": "-70.27654", - "id": 12336 - }, - { - "name": "Torrington Avenue", - "lat": "43.65207", - "lon": "-70.19770", - "id": 12108 - }, - { - "name": "Torrington Point Road", - "lat": "43.65184", - "lon": "-70.19764", - "id": 12165 - }, - { - "name": "Totman Pt Road", - "lat": "43.79399", - "lon": "-69.94452", - "id": 32728 - }, - { - "name": "Trademark Drive", - "lat": "43.58759", - "lon": "-70.40865", - "id": 83804 - }, - { - "name": "Trapper John Road", - "lat": "43.60165", - "lon": "-70.47830", - "id": 37185 - }, - { - "name": "Traveld Street", - "lat": "43.59836", - "lon": "-70.31997", - "id": 41007 - }, - { - "name": "Tree Farm Way", - "lat": "43.72760", - "lon": "-70.27830", - "id": 31998 - }, - { - "name": "Trelawny Street", - "lat": "43.67908", - "lon": "-70.19976", - "id": 39491 - }, - { - "name": "Tremaine Street", - "lat": "43.68182", - "lon": "-70.29201", - "id": 12897 - }, - { - "name": "Trestle Way", - "lat": "43.72408", - "lon": "-70.40666", - "id": 36001 - }, - { - "name": "Trillium Lane", - "lat": "43.73413", - "lon": "-70.28327", - "id": 37364 - }, - { - "name": "Trolley Farm Road", - "lat": "43.77960", - "lon": "-70.30842", - "id": 40766 - }, - { - "name": "Trott-Littlejohn Loop", - "names": { - "alt_name": "TLJ Loop" - }, - "lat": "43.65991", - "lon": "-70.18687", - "id": 84850 - }, - { - "name": "Trotwood Street", - "lat": "43.59912", - "lon": "-70.31911", - "id": 35053 - }, - { - "name": "Trout Pond Lane", - "lat": "43.59718", - "lon": "-70.39129", - "id": 83803 - }, - { - "name": "Trowbridge Place", - "lat": "43.65291", - "lon": "-70.27210", - "id": 81267 - }, - { - "name": "Tucker Avenue", - "lat": "43.70399", - "lon": "-70.31038", - "id": 12418 - }, - { - "name": "Tukey Street Connector", - "lat": "43.67152", - "lon": "-70.25667", - "id": 80646 - }, - { - "name": "Tukey's Bridge", - "lat": "43.67706", - "lon": "-70.25658", - "id": 76963 - }, - { - "name": "Tukey's Bridge Pathway", - "lat": "43.67779", - "lon": "-70.25675", - "id": 76964 - }, - { - "name": "Tukey's Bridge Sidewalk", - "lat": "43.67954", - "lon": "-70.25692", - "id": 78075 - }, - { - "name": "Turnberry Circle", - "lat": "43.58502", - "lon": "-70.42908", - "id": 82530 - }, - { - "name": "Twin Knolls Lane", - "lat": "43.65978", - "lon": "-70.29821", - "id": 13527 - }, - { - "name": "Twin Meadows Lane", - "lat": "43.75905", - "lon": "-70.25317", - "id": 81907 - }, - { - "name": "Twin Ponds Drive", - "lat": "43.74341", - "lon": "-70.28737", - "id": 32227 - }, - { - "name": "Umpire Way", - "lat": "43.77525", - "lon": "-70.16303", - "id": 38946 - }, - { - "name": "Union Wharf", - "lat": "43.65392", - "lon": "-70.25308", - "id": 13112 - }, - { - "name": "Upland Avenue", - "lat": "43.68336", - "lon": "-70.25353", - "id": 12786 - }, - { - "name": "Upland Street", - "lat": "43.68324", - "lon": "-70.25375", - "id": 33653 - }, - { - "name": "Upper A Street", - "lat": "43.65895", - "lon": "-70.18890", - "id": 12080 - }, - { - "name": "Upper Veterans Street", - "lat": "43.65412", - "lon": "-70.19257", - "id": 32415 - }, - { - "name": "Vaill Point Road", - "lat": "43.78519", - "lon": "-70.15603", - "id": 34670 - }, - { - "name": "Vaill Street", - "lat": "43.68873", - "lon": "-70.25162", - "id": 12695 - }, - { - "name": "Val Terrace", - "lat": "43.56598", - "lon": "-70.31381", - "id": 36089 - }, - { - "name": "Van Carll Circle", - "lat": "43.57103", - "lon": "-70.31565", - "id": 33791 - }, - { - "name": "Van Vechten Street", - "lat": "43.69650", - "lon": "-70.27561", - "id": 13010 - }, - { - "name": "Vannah Avenue", - "lat": "43.67192", - "lon": "-70.28368", - "id": 12599 - }, - { - "name": "Vasabond Street", - "lat": "43.59767", - "lon": "-70.31814", - "id": 36274 - }, - { - "name": "Vera Street", - "lat": "43.68671", - "lon": "-70.27270", - "id": 12713 - }, - { - "name": "Veranda Street", - "lat": "43.68521", - "lon": "-70.25319", - "id": 12388 - }, - { - "name": "Vernon Place", - "lat": "43.65375", - "lon": "-70.26671", - "id": 13230 - }, - { - "name": "Verrill Street", - "lat": "43.69484", - "lon": "-70.30896", - "id": 12738 - }, - { - "name": "Veteran Street", - "lat": "43.65562", - "lon": "-70.19296", - "id": 12175 - }, - { - "name": "Veterans Bridge Pathway", - "lat": "43.64403", - "lon": "-70.28214", - "id": 79093 - }, - { - "name": "Veterans Memorial Bridge", - "lat": "43.64407", - "lon": "-70.28218", - "id": 78987 - }, - { - "name": "Victor Road", - "lat": "43.68423", - "lon": "-70.27188", - "id": 12576 - }, - { - "name": "Village Oak Hill", - "lat": "43.60049", - "lon": "-70.33756", - "id": 32920 - }, - { - "name": "Vindale Street", - "lat": "43.59951", - "lon": "-70.31971", - "id": 41011 - }, - { - "name": "Violette Hill", - "lat": "43.67413", - "lon": "-70.31012", - "id": 13488 - }, - { - "name": "Violette Hill Street", - "lat": "43.67368", - "lon": "-70.31035", - "id": 33855 - }, - { - "name": "Virginia Loop, Lowell Preserve", - "lat": "43.79983", - "lon": "-70.35522", - "id": 82990 - }, - { - "name": "W Presumpscot Street W", - "lat": "43.68108", - "lon": "-70.26180", - "id": 33450 - }, - { - "name": "Wabun Road", - "lat": "43.58142", - "lon": "-70.20989", - "id": 39779 - }, - { - "name": "Wagner Way", - "lat": "43.60471", - "lon": "-70.30299", - "id": 33293 - }, - { - "name": "Wainwright Drive", - "lat": "43.59264", - "lon": "-70.24718", - "id": 36621 - }, - { - "name": "Wakely Court", - "lat": "43.71132", - "lon": "-70.29400", - "id": 12341 - }, - { - "name": "Walch Drive", - "lat": "43.70848", - "lon": "-70.31286", - "id": 12743 - }, - { - "name": "Walcott Avenue", - "lat": "43.70863", - "lon": "-70.23757", - "id": 34857 - }, - { - "name": "Waldron", - "lat": "43.69574", - "lon": "-70.32098", - "id": 39479 - }, - { - "name": "Waldron Drive", - "lat": "43.57120", - "lon": "-70.39992", - "id": 80839 - }, - { - "name": "Waldron Way", - "lat": "43.69658", - "lon": "-70.32095", - "id": 12591 - }, - { - "name": "Wander-A-Way", - "lat": "43.84234", - "lon": "-70.26373", - "id": 35523 - }, - { - "name": "Warf Cove Trail", - "lat": "43.66194", - "lon": "-70.18300", - "id": 84849 - }, - { - "name": "Washington Place", - "lat": "43.66339", - "lon": "-70.24974", - "id": 32207 - }, - { - "name": "Waters Edge Terrace", - "lat": "43.60477", - "lon": "-70.33168", - "id": 36897 - }, - { - "name": "Waterview Road", - "lat": "43.87258", - "lon": "-70.40490", - "id": 32414 - }, - { - "name": "Waterville Street", - "lat": "43.66365", - "lon": "-70.24454", - "id": 13075 - }, - { - "name": "Watts Farm Way", - "lat": "43.75915", - "lon": "-70.27220", - "id": 40867 - }, - { - "name": "Waumbeck Road", - "lat": "43.58201", - "lon": "-70.20714", - "id": 32979 - }, - { - "name": "Way Side Road", - "lat": "43.83077", - "lon": "-70.21485", - "id": 32046 - }, - { - "name": "Waymouth Street", - "lat": "43.67464", - "lon": "-70.20116", - "id": 33292 - }, - { - "name": "Wayne Street", - "lat": "43.66531", - "lon": "-70.29578", - "id": 13305 - }, - { - "name": "Weathervane Way", - "lat": "43.59540", - "lon": "-70.28862", - "id": 82240 - }, - { - "name": "Webber Way", - "lat": "43.69670", - "lon": "-70.24300", - "id": 39598 - }, - { - "name": "Wedge Way", - "lat": "43.70914", - "lon": "-70.31183", - "id": 12571 - }, - { - "name": "Wedgewood Street", - "lat": "43.59104", - "lon": "-70.32222", - "id": 38720 - }, - { - "name": "Weeping Willow Way", - "lat": "43.84615", - "lon": "-70.27227", - "id": 86281 - }, - { - "name": "Wellesley Estates", - "lat": "43.69937", - "lon": "-70.31789", - "id": 12638 - }, - { - "name": "Wellhouse Way", - "lat": "43.85355", - "lon": "-70.46697", - "id": 83531 - }, - { - "name": "Wellstone Drive", - "lat": "43.69079", - "lon": "-70.26493", - "id": 12944 - }, - { - "name": "Wendell Street", - "lat": "43.69565", - "lon": "-70.31623", - "id": 12681 - }, - { - "name": "Wessex Street", - "lat": "43.67546", - "lon": "-70.31939", - "id": 13477 - }, - { - "name": "West Beech Ridge Road", - "lat": "43.59276", - "lon": "-70.39844", - "id": 36054 - }, - { - "name": "West Circle", - "lat": "43.75037", - "lon": "-70.29012", - "id": 38718 - }, - { - "name": "West Coachlantern Lane", - "lat": "43.57495", - "lon": "-70.33651", - "id": 33938 - }, - { - "name": "West Commercial Street", - "lat": "43.64539", - "lon": "-70.26514", - "id": 13381 - }, - { - "name": "West Commonwealth Drive", - "lat": "43.69571", - "lon": "-70.30626", - "id": 12848 - }, - { - "name": "West Concord Street", - "lat": "43.67389", - "lon": "-70.29596", - "id": 37775 - }, - { - "name": "West Kidder Street", - "lat": "43.68418", - "lon": "-70.26628", - "id": 12774 - }, - { - "name": "West Lynne Avenue", - "lat": "43.71186", - "lon": "-70.30181", - "id": 13028 - }, - { - "name": "West Meadow Trail", - "lat": "43.70700", - "lon": "-70.24484", - "id": 77298 - }, - { - "name": "West Presumpscot Street", - "lat": "43.68173", - "lon": "-70.26147", - "id": 12823 - }, - { - "name": "Westcustoco Point", - "lat": "43.77785", - "lon": "-70.15453", - "id": 33807 - }, - { - "name": "Westcustogo Point", - "lat": "43.77743", - "lon": "-70.15406", - "id": 34627 - }, - { - "name": "Westerlea Way", - "lat": "43.82971", - "lon": "-70.48266", - "id": 33654 - }, - { - "name": "Western Prom", - "lat": "43.64983", - "lon": "-70.27675", - "id": 32518 - }, - { - "name": "Westlawn Road", - "lat": "43.69728", - "lon": "-70.30417", - "id": 12457 - }, - { - "name": "Westminster Terrace", - "lat": "43.61612", - "lon": "-70.24375", - "id": 38755 - }, - { - "name": "Whale Back Way", - "lat": "43.58039", - "lon": "-70.21856", - "id": 85736 - }, - { - "name": "Whaleboat Road", - "lat": "43.72033", - "lon": "-70.28340", - "id": 12483 - }, - { - "name": "Whipple Lane", - "lat": "43.59290", - "lon": "-70.36913", - "id": 41172 - }, - { - "name": "White's Cove", - "lat": "43.78220", - "lon": "-70.15873", - "id": 32081 - }, - { - "name": "White's Cove Road", - "lat": "43.78343", - "lon": "-70.15146", - "id": 39934 - }, - { - "name": "Whitehead", - "lat": "43.71878", - "lon": "-70.28302", - "id": 36313 - }, - { - "name": "Whitehead Circle", - "lat": "43.71896", - "lon": "-70.28248", - "id": 12488 - }, - { - "name": "Whitehead Street", - "lat": "43.65353", - "lon": "-70.19590", - "id": 12167 - }, - { - "name": "Whites Point Annex", - "lat": "43.84321", - "lon": "-70.47212", - "id": 34489 - }, - { - "name": "Whitetail Road", - "lat": "43.76479", - "lon": "-70.23866", - "id": 35963 - }, - { - "name": "Whitney Farm Way", - "lat": "43.73177", - "lon": "-70.28203", - "id": 85138 - }, - { - "name": "Widgery Wharf", - "lat": "43.65482", - "lon": "-70.25353", - "id": 13228 - }, - { - "name": "Wild Rose Path", - "lat": "43.66679", - "lon": "-70.19298", - "id": 12074 - }, - { - "name": "Wildflower Drive", - "lat": "43.78155", - "lon": "-70.50159", - "id": 35010 - }, - { - "name": "Wildrose Lane", - "lat": "43.57863", - "lon": "-70.30439", - "id": 40689 - }, - { - "name": "Wildwood Way", - "lat": "43.75206", - "lon": "-70.25195", - "id": 40665 - }, - { - "name": "Wilkie Street", - "lat": "43.69526", - "lon": "-70.31709", - "id": 12384 - }, - { - "name": "Williamsburg Lane", - "lat": "43.58481", - "lon": "-70.29038", - "id": 32438 - }, - { - "name": "Willow Court", - "lat": "43.65707", - "lon": "-70.19487", - "id": 38240 - }, - { - "name": "Willow Wood Lane", - "lat": "43.58442", - "lon": "-70.35243", - "id": 33089 - }, - { - "name": "Willowdale Road", - "lat": "43.58162", - "lon": "-70.35351", - "id": 33828 - }, - { - "name": "Wilmot Street", - "lat": "43.66171", - "lon": "-70.25718", - "id": 13213 - }, - { - "name": "Wilton Lane", - "lat": "43.61876", - "lon": "-70.25109", - "id": 37292 - }, - { - "name": "Windward Shore Road", - "lat": "43.87272", - "lon": "-70.52682", - "id": 34048 - }, - { - "name": "Windward Shores", - "lat": "43.87395", - "lon": "-70.52622", - "id": 33276 - }, - { - "name": "Winn Farm Lane", - "lat": "43.76742", - "lon": "-70.27287", - "id": 81909 - }, - { - "name": "Winn Farm Road", - "lat": "43.76834", - "lon": "-70.26875", - "id": 39517 - }, - { - "name": "Winnocks Neck Road", - "lat": "43.57228", - "lon": "-70.33525", - "id": 39687 - }, - { - "name": "Winnocks Neck Square", - "lat": "43.57798", - "lon": "-70.33321", - "id": 39219 - }, - { - "name": "Winslow Park Way", - "lat": "43.80646", - "lon": "-70.12887", - "id": 33267 - }, - { - "name": "Winslow Place", - "lat": "43.61155", - "lon": "-70.23362", - "id": 33233 - }, - { - "name": "Winsome Lea Road", - "lat": "43.76620", - "lon": "-70.26892", - "id": 36789 - }, - { - "name": "Winter's Way", - "lat": "43.78197", - "lon": "-70.29126", - "id": 36665 - }, - { - "name": "Wirt Street", - "lat": "43.69487", - "lon": "-70.30802", - "id": 41147 - }, - { - "name": "Wohelo Road", - "lat": "43.88438", - "lon": "-70.51869", - "id": 38965 - }, - { - "name": "Wolcott Street", - "lat": "43.66767", - "lon": "-70.30076", - "id": 13282 - }, - { - "name": "Woodfield Road", - "lat": "43.67565", - "lon": "-70.30932", - "id": 13473 - }, - { - "name": "Woodfords Street", - "lat": "43.67084", - "lon": "-70.28194", - "id": 32107 - }, - { - "name": "Woodlands Drive", - "lat": "43.74056", - "lon": "-70.25407", - "id": 32206 - }, - { - "name": "Woodmere Road", - "lat": "43.70353", - "lon": "-70.28557", - "id": 12991 - }, - { - "name": "Woodrock Drive", - "lat": "43.56484", - "lon": "-70.31291", - "id": 38749 - }, - { - "name": "Woods Knoll Road", - "lat": "43.58899", - "lon": "-70.22137", - "id": 41199 - }, - { - "name": "Woods Path", - "lat": "43.69832", - "lon": "-70.10320", - "id": 12002 - }, - { - "name": "Woodvale Street", - "lat": "43.68283", - "lon": "-70.31329", - "id": 13437 - }, - { - "name": "Worcester Drive", - "lat": "43.88141", - "lon": "-70.42453", - "id": 40455 - }, - { - "name": "Wordsworth Street", - "lat": "43.68705", - "lon": "-70.25540", - "id": 12710 - }, - { - "name": "Wright Way", - "lat": "43.72292", - "lon": "-70.25643", - "id": 85152 - }, - { - "name": "Wrights Wharf", - "lat": "43.65098", - "lon": "-70.25635", - "id": 33213 - }, - { - "name": "Wyndham Street", - "lat": "43.69779", - "lon": "-70.31550", - "id": 12837 - }, - { - "name": "Wynmoor Drive", - "lat": "43.56456", - "lon": "-70.31634", - "id": 37952 - }, - { - "name": "Zeb Cove Road", - "lat": "43.59467", - "lon": "-70.21656", - "id": 31936 - } - ], - "init": 1, - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "North Anson", - "lat": "44.85506", - "lon": "-69.89978", - "id": 158854805, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "New Portland Hill Road (East New Portland)", - "lat": "44.89828", - "lon": "-70.02308", - "id": 23283 - }, - { - "name": "New Portland Hill Road", - "lat": "44.87620", - "lon": "-70.01662", - "id": 23818 - }, - { - "name": "New Portland Hill Road", - "lat": "44.88581", - "lon": "-70.00169", - "id": 23819 - }, - { - "name": "New Portland Hill Road", - "lat": "44.87762", - "lon": "-70.00484", - "id": 23820 - }, - { - "name": "New Portland Hill Road", - "lat": "44.89373", - "lon": "-70.00681", - "id": 23822 - } - ], - "matchStreet": 1 - }, - { - "name": "Lexington", - "lat": "44.99867", - "lon": "-70.05368", - "id": 158913053, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Snowmobile Kingfield New Portland Connector (Lexington Township)", - "lat": "44.97664", - "lon": "-70.11099", - "id": 79830 - } - ], - "matchStreet": 1 - }, - { - "name": "Caribou", - "lat": "46.86056", - "lon": "-68.01197", - "id": 158869918, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Grand Falls", - "enName": "Grand Falls", - "names": { - "fr": "Grand-Sault" - }, - "lat": "47.04670", - "lon": "-67.77684", - "id": 1097017, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Calais", - "lat": "45.18903", - "lon": "-67.27814", - "id": 5964911273, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Deep Cut", - "lat": "43.91036", - "lon": "-70.01450", - "id": 158839961, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Old Portland Road", - "lat": "43.91110", - "lon": "-70.01649", - "id": 82609, - "buildings": [ - { - "name": "170", - "lat": "43.91110", - "lon": "-70.01649", - "postcode": "04011" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Arundel", - "lat": "43.38259", - "lon": "-70.47783", - "id": 158851592, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "43.40854", - "lon": "-70.52173", - "id": 8003, - "buildings": [ - { - "name": "1005", - "lat": "43.40297", - "lon": "-70.52562", - "postcode": "04046" - }, - { - "name": "1005", - "lat": "43.40291", - "lon": "-70.52557", - "postcode": "04046" - }, - { - "name": "1005", - "lat": "43.40304", - "lon": "-70.52566", - "postcode": "04046" - }, - { - "name": "1009", - "lat": "43.40304", - "lon": "-70.52510", - "postcode": "04046" - }, - { - "name": "1024", - "lat": "43.40383", - "lon": "-70.52545", - "postcode": "04046" - }, - { - "name": "1048", - "lat": "43.40450", - "lon": "-70.52515", - "postcode": "04046" - }, - { - "name": "1099", - "lat": "43.40555", - "lon": "-70.52358", - "postcode": "04046" - }, - { - "name": "1120", - "lat": "43.40678", - "lon": "-70.52390", - "postcode": "04046" - }, - { - "name": "1121", - "lat": "43.40658", - "lon": "-70.52294", - "postcode": "04046" - }, - { - "name": "1132", - "lat": "43.40712", - "lon": "-70.52390", - "postcode": "04046" - }, - { - "name": "1140", - "lat": "43.40715", - "lon": "-70.52384", - "postcode": "04046" - }, - { - "name": "1144", - "lat": "43.40756", - "lon": "-70.52347", - "postcode": "04046" - }, - { - "name": "1152", - "lat": "43.40779", - "lon": "-70.52330", - "postcode": "04046" - }, - { - "name": "1181", - "lat": "43.40854", - "lon": "-70.52173", - "postcode": "04046" - }, - { - "name": "1183", - "lat": "43.40905", - "lon": "-70.52206", - "postcode": "04046" - }, - { - "name": "1185", - "lat": "43.40910", - "lon": "-70.52201", - "postcode": "04046" - }, - { - "name": "1189", - "lat": "43.40915", - "lon": "-70.52199", - "postcode": "04046" - }, - { - "name": "1200", - "lat": "43.40940", - "lon": "-70.52266", - "postcode": "04046" - }, - { - "name": "1202", - "lat": "43.40954", - "lon": "-70.52223", - "postcode": "04046" - }, - { - "name": "1205", - "lat": "43.40921", - "lon": "-70.52163", - "postcode": "04046" - }, - { - "name": "1216", - "lat": "43.40979", - "lon": "-70.52238", - "postcode": "04046" - }, - { - "name": "1220", - "lat": "43.40985", - "lon": "-70.52233", - "postcode": "04046" - }, - { - "name": "1222", - "lat": "43.40999", - "lon": "-70.52223", - "postcode": "04046" - }, - { - "name": "1232", - "lat": "43.41010", - "lon": "-70.52216", - "postcode": "04046" - }, - { - "name": "1234", - "lat": "43.41013", - "lon": "-70.52216", - "postcode": "04046" - }, - { - "name": "1236", - "lat": "43.41021", - "lon": "-70.52214", - "postcode": "04046" - }, - { - "name": "1248", - "lat": "43.41086", - "lon": "-70.52176", - "postcode": "04046" - }, - { - "name": "1249", - "lat": "43.41075", - "lon": "-70.52094", - "postcode": "04046" - }, - { - "name": "1260", - "lat": "43.41128", - "lon": "-70.52154", - "postcode": "04046" - }, - { - "name": "1261", - "lat": "43.41105", - "lon": "-70.52081", - "postcode": "04046" - }, - { - "name": "1269", - "lat": "43.41136", - "lon": "-70.52058", - "postcode": "04046" - }, - { - "name": "1272", - "lat": "43.41159", - "lon": "-70.52150", - "postcode": "04046" - }, - { - "name": "1289", - "lat": "43.41205", - "lon": "-70.52025", - "postcode": "04046" - }, - { - "name": "1299", - "lat": "43.41222", - "lon": "-70.51924", - "postcode": "04046" - }, - { - "name": "1341", - "lat": "43.41356", - "lon": "-70.51914", - "postcode": "04046" - }, - { - "name": "1364", - "lat": "43.41465", - "lon": "-70.51997", - "postcode": "04046" - }, - { - "name": "1369", - "lat": "43.41463", - "lon": "-70.51914", - "postcode": "04046" - }, - { - "name": "1370", - "lat": "43.41520", - "lon": "-70.51970", - "postcode": "04046" - }, - { - "name": "1377", - "lat": "43.41451", - "lon": "-70.51815", - "postcode": "04046" - }, - { - "name": "1379", - "lat": "43.41502", - "lon": "-70.51897", - "postcode": "04046" - }, - { - "name": "1389", - "lat": "43.41534", - "lon": "-70.51864", - "postcode": "04046" - }, - { - "name": "1393", - "lat": "43.41520", - "lon": "-70.51809", - "postcode": "04046" - }, - { - "name": "1401", - "lat": "43.41580", - "lon": "-70.51858", - "postcode": "04046" - }, - { - "name": "1405", - "lat": "43.41585", - "lon": "-70.51858", - "postcode": "04046" - }, - { - "name": "1413", - "lat": "43.41591", - "lon": "-70.51834", - "postcode": "04046" - }, - { - "name": "1427", - "lat": "43.41630", - "lon": "-70.51811", - "postcode": "04046" - }, - { - "name": "1429", - "lat": "43.41636", - "lon": "-70.51804", - "postcode": "04046" - }, - { - "name": "1437", - "lat": "43.41666", - "lon": "-70.51781", - "postcode": "04046" - }, - { - "name": "1448", - "lat": "43.41736", - "lon": "-70.51901", - "postcode": "04046" - }, - { - "name": "1449", - "lat": "43.41703", - "lon": "-70.51770", - "postcode": "04046" - }, - { - "name": "1466", - "lat": "43.41775", - "lon": "-70.51809", - "postcode": "04046" - }, - { - "name": "1468", - "lat": "43.41783", - "lon": "-70.51804", - "postcode": "04046" - }, - { - "name": "1476", - "lat": "43.41811", - "lon": "-70.51794", - "postcode": "04046" - }, - { - "name": "1477", - "lat": "43.41795", - "lon": "-70.51731", - "postcode": "04046" - }, - { - "name": "1477", - "lat": "43.41752", - "lon": "-70.51322", - "postcode": "04046" - }, - { - "name": "1479", - "lat": "43.41806", - "lon": "-70.51725", - "postcode": "04046" - }, - { - "name": "1492", - "lat": "43.41887", - "lon": "-70.51759", - "postcode": "04046" - }, - { - "name": "1513", - "lat": "43.41922", - "lon": "-70.51650", - "postcode": "04046" - }, - { - "name": "1516", - "lat": "43.41928", - "lon": "-70.51744", - "postcode": "04046" - }, - { - "name": "1544", - "lat": "43.42048", - "lon": "-70.51742", - "postcode": "04046" - }, - { - "name": "1561", - "lat": "43.42054", - "lon": "-70.51547", - "postcode": "04046" - }, - { - "name": "1601", - "lat": "43.42199", - "lon": "-70.51517", - "postcode": "04046" - }, - { - "name": "1617", - "lat": "43.42266", - "lon": "-70.51482", - "postcode": "04046" - }, - { - "name": "1621", - "lat": "43.42297", - "lon": "-70.51485", - "postcode": "04046" - }, - { - "name": "1632", - "lat": "43.42341", - "lon": "-70.51611", - "postcode": "04046" - }, - { - "name": "1641", - "lat": "43.42314", - "lon": "-70.51476", - "postcode": "04046" - }, - { - "name": "1652", - "lat": "43.42383", - "lon": "-70.51506", - "postcode": "04046" - }, - { - "name": "1654", - "lat": "43.42413", - "lon": "-70.51506", - "postcode": "04046" - }, - { - "name": "1669", - "lat": "43.42386", - "lon": "-70.51377", - "postcode": "04046" - }, - { - "name": "1676", - "lat": "43.42445", - "lon": "-70.51476", - "postcode": "04046" - }, - { - "name": "1680", - "lat": "43.42458", - "lon": "-70.51463", - "postcode": "04046" - }, - { - "name": "1692", - "lat": "43.42489", - "lon": "-70.51409", - "postcode": "04046" - }, - { - "name": "1697", - "lat": "43.42470", - "lon": "-70.51339", - "postcode": "04046" - }, - { - "name": "1712", - "lat": "43.42550", - "lon": "-70.51386", - "postcode": "04046" - }, - { - "name": "1713", - "lat": "43.42522", - "lon": "-70.51289", - "postcode": "04046" - }, - { - "name": "1715", - "lat": "43.42556", - "lon": "-70.51276", - "postcode": "04046" - }, - { - "name": "1716", - "lat": "43.42564", - "lon": "-70.51367", - "postcode": "04046" - }, - { - "name": "1720", - "lat": "43.42601", - "lon": "-70.51379", - "postcode": "04046" - }, - { - "name": "1721", - "lat": "43.42495", - "lon": "-70.51169", - "postcode": "04046" - }, - { - "name": "1736", - "lat": "43.42600", - "lon": "-70.51294", - "postcode": "04046" - }, - { - "name": "1740", - "lat": "43.42640", - "lon": "-70.51302", - "postcode": "04046" - }, - { - "name": "1752", - "lat": "43.42659", - "lon": "-70.51261", - "postcode": "04046" - }, - { - "name": "1760", - "lat": "43.42724", - "lon": "-70.51332", - "postcode": "04046" - }, - { - "name": "1761", - "lat": "43.42663", - "lon": "-70.51203", - "postcode": "04046" - }, - { - "name": "1768", - "lat": "43.42712", - "lon": "-70.51249", - "postcode": "04046" - }, - { - "name": "1781", - "lat": "43.42673", - "lon": "-70.51197", - "postcode": "04046" - }, - { - "name": "1789", - "lat": "43.42679", - "lon": "-70.51191", - "postcode": "04046" - }, - { - "name": "1791", - "lat": "43.42737", - "lon": "-70.51100", - "postcode": "04046" - }, - { - "name": "1796", - "lat": "43.42815", - "lon": "-70.51167", - "postcode": "04046" - }, - { - "name": "1829", - "lat": "43.42850", - "lon": "-70.51006", - "postcode": "04046" - }, - { - "name": "1881", - "lat": "43.42860", - "lon": "-70.50704", - "postcode": "04046" - }, - { - "name": "1903", - "lat": "43.43031", - "lon": "-70.50834", - "postcode": "04046" - }, - { - "name": "1905", - "lat": "43.43064", - "lon": "-70.50856", - "postcode": "04046" - }, - { - "name": "1912", - "lat": "43.43126", - "lon": "-70.50864", - "postcode": "04046" - }, - { - "name": "1916", - "lat": "43.43137", - "lon": "-70.50925", - "postcode": "04046" - }, - { - "name": "1933", - "lat": "43.43165", - "lon": "-70.50764", - "postcode": "04046" - }, - { - "name": "2105", - "lat": "43.43665", - "lon": "-70.50352", - "postcode": "04046" - }, - { - "name": "2204", - "lat": "43.43961", - "lon": "-70.50388", - "postcode": "04046" - }, - { - "name": "2210", - "lat": "43.43996", - "lon": "-70.50369", - "postcode": "04046" - }, - { - "name": "2218", - "lat": "43.44041", - "lon": "-70.50352", - "postcode": "04046" - }, - { - "name": "2224", - "lat": "43.44077", - "lon": "-70.50334", - "postcode": "04046" - }, - { - "name": "2239", - "lat": "43.44047", - "lon": "-70.50216", - "postcode": "04046" - }, - { - "name": "2244", - "lat": "43.44175", - "lon": "-70.50242", - "postcode": "04046" - }, - { - "name": "2256", - "lat": "43.44189", - "lon": "-70.50274", - "postcode": "04046" - }, - { - "name": "2324", - "lat": "43.44426", - "lon": "-70.50231", - "postcode": "04046" - }, - { - "name": "2365", - "lat": "43.44535", - "lon": "-70.50056", - "postcode": "04046" - }, - { - "name": "2397", - "lat": "43.44620", - "lon": "-70.49991", - "postcode": "04046" - }, - { - "name": "2409", - "lat": "43.44664", - "lon": "-70.49950", - "postcode": "04046" - }, - { - "name": "2421", - "lat": "43.44683", - "lon": "-70.49899", - "postcode": "04046" - }, - { - "name": "2461", - "lat": "43.44817", - "lon": "-70.49854", - "postcode": "04046" - }, - { - "name": "2492", - "lat": "43.44935", - "lon": "-70.49884", - "postcode": "04046" - }, - { - "name": "2501", - "lat": "43.44959", - "lon": "-70.49768", - "postcode": "04046" - }, - { - "name": "2564", - "lat": "43.45175", - "lon": "-70.49731", - "postcode": "04046" - }, - { - "name": "2569", - "lat": "43.45153", - "lon": "-70.49648", - "postcode": "04046" - }, - { - "name": "2581", - "lat": "43.45195", - "lon": "-70.49635", - "postcode": "04046" - }, - { - "name": "2625", - "lat": "43.45325", - "lon": "-70.49564", - "postcode": "04046" - }, - { - "name": "2628", - "lat": "43.45357", - "lon": "-70.49607", - "postcode": "04046" - }, - { - "name": "2636", - "lat": "43.45384", - "lon": "-70.49601", - "postcode": "04046" - }, - { - "name": "2640", - "lat": "43.45396", - "lon": "-70.49583", - "postcode": "04046" - }, - { - "name": "2652", - "lat": "43.45440", - "lon": "-70.49556", - "postcode": "04046" - }, - { - "name": "2776", - "lat": "43.45817", - "lon": "-70.49347", - "postcode": "04046" - }, - { - "name": "2796", - "lat": "43.45876", - "lon": "-70.49296", - "postcode": "04046" - }, - { - "name": "2805", - "lat": "43.45909", - "lon": "-70.49214", - "postcode": "04046" - }, - { - "name": "2808", - "lat": "43.45932", - "lon": "-70.49350", - "postcode": "04046" - }, - { - "name": "2812", - "lat": "43.45946", - "lon": "-70.49341", - "postcode": "04046" - } - ], - "intersectedStreets": [ - { - "name": "Walkers Lane", - "lat": "43.40343", - "lon": "-70.52551" - }, - { - "name": "Old Post Road", - "names": { - "alt_name": "Route 1A Extension" - }, - "lat": "43.40372", - "lon": "-70.52521" - }, - { - "name": "Limerick Road", - "lat": "43.40770", - "lon": "-70.52298" - }, - { - "name": "Old Sawmill Lane", - "lat": "43.40965", - "lon": "-70.52191" - }, - { - "name": "Sam's Road", - "lat": "43.41970", - "lon": "-70.51686" - }, - { - "name": "Bentleys Way", - "lat": "43.42140", - "lon": "-70.51605" - }, - { - "name": "Campground Road", - "lat": "43.42466", - "lon": "-70.51401" - }, - { - "name": "Log Cabin Road", - "lat": "43.42466", - "lon": "-70.51401" - }, - { - "name": "Searles Lane", - "lat": "43.42801", - "lon": "-70.51113" - }, - { - "name": "Fritz's Lane", - "lat": "43.43041", - "lon": "-70.50910" - }, - { - "name": "St Amand Drive", - "lat": "43.43108", - "lon": "-70.50852" - }, - { - "name": "Enterprise Drive Private", - "lat": "43.44013", - "lon": "-70.50304" - }, - { - "name": "Dmr Drive", - "lat": "43.44943", - "lon": "-70.49830" - }, - { - "name": "Dmr Road", - "lat": "43.45225", - "lon": "-70.49652" - }, - { - "name": "Proctor Road", - "lat": "43.45870", - "lon": "-70.49272" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Bridgton", - "lat": "44.05503", - "lon": "-70.71350", - "id": 158860426, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "44.04369", - "lon": "-70.70078", - "id": 40545, - "intersectedStreets": [ - { - "name": "Lumberyard Road", - "lat": "44.04512", - "lon": "-70.70103" - }, - { - "name": "Willett Road", - "lat": "44.04512", - "lon": "-70.70103" - }, - { - "name": "Mt Henry Road", - "lat": "44.04734", - "lon": "-70.70116" - }, - { - "name": "Smith Avenue", - "lat": "44.05029", - "lon": "-70.70136" - }, - { - "name": "Maple Street", - "lat": "44.05172", - "lon": "-70.70129" - }, - { - "name": "Frances Bell Drive", - "lat": "44.05243", - "lon": "-70.70140" - }, - { - "name": "Main Street", - "lat": "44.05407", - "lon": "-70.70166" - }, - { - "name": "Flint Street", - "lat": "44.05407", - "lon": "-70.70166" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Léonard", - "lat": "47.16520", - "lon": "-67.92447", - "id": 34705955, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Buxton", - "lat": "43.63806", - "lon": "-70.51918", - "id": 158866573, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "43.61576", - "lon": "-70.50197", - "id": 74620, - "intersectedStreets": [ - { - "name": "Narragansett Trail", - "lat": "43.61427", - "lon": "-70.52618" - }, - { - "name": "Main Street (Emory Corner)", - "lat": "43.61427", - "lon": "-70.52618" - }, - { - "name": "Pennell Road (Roberts Corner)", - "lat": "43.61459", - "lon": "-70.51980" - }, - { - "name": "Townsend Road (Roberts Corner)", - "lat": "43.61459", - "lon": "-70.51980" - }, - { - "name": "Jesse Daniel Drive", - "lat": "43.61529", - "lon": "-70.51023" - }, - { - "name": "Albert Circle", - "lat": "43.61545", - "lon": "-70.50792" - }, - { - "name": "Allegra Way", - "lat": "43.61576", - "lon": "-70.50197" - }, - { - "name": "Town Farm Road", - "lat": "43.61622", - "lon": "-70.49931" - }, - { - "name": "Pease Road", - "lat": "43.61800", - "lon": "-70.49429" - }, - { - "name": "Old County Road (South Buxton)", - "lat": "43.62081", - "lon": "-70.47920" - }, - { - "name": "State Route 22", - "lat": "43.62081", - "lon": "-70.47920" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Bar Harbor", - "lat": "44.39121", - "lon": "-68.20073", - "id": 4307278286, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Eastport", - "lat": "44.90647", - "lon": "-66.99051", - "id": 158853506, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Rollinsford", - "lat": "43.22773", - "lon": "-70.82966", - "id": 370355, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Portland Avenue", - "lat": "43.22566", - "lon": "-70.81405", - "id": 84161, - "intersectedStreets": [ - { - "name": "Short Street", - "lat": "43.22535", - "lon": "-70.81465" - }, - { - "name": "Sligo Road", - "lat": "43.22535", - "lon": "-70.81465" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Waterville", - "lat": "44.55201", - "lon": "-69.63171", - "id": 158813569, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Gray", - "lat": "43.88602", - "lon": "-70.33173", - "id": 158811531, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "43.88204", - "lon": "-70.32855", - "id": 438, - "buildings": [ - { - "name": "21", - "lat": "43.88204", - "lon": "-70.32855", - "postcode": "04039" - } - ] - }, - { - "name": "Old Portland Road", - "lat": "43.87904", - "lon": "-70.33301", - "id": 35547, - "intersectedStreets": [ - { - "name": "Center Road", - "lat": "43.87884", - "lon": "-70.33316" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Great Works", - "lat": "44.91729", - "lon": "-68.63864", - "id": 158903302, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Portland Street", - "lat": "44.91743", - "lon": "-68.63648", - "id": 59910 - } - ], - "matchStreet": 1 - }, - { - "name": "St. Stephen", - "lat": "45.20040", - "lon": "-67.27986", - "id": 204489936, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Saint-Leonard", - "lat": "47.16390", - "lon": "-67.92423", - "id": 1099568, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "South Berwick", - "lat": "43.23448", - "lon": "-70.80894", - "id": 158821769, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Street", - "names": { - "alt_name": "State Route 4" - }, - "lat": "43.23428", - "lon": "-70.80875", - "id": 1645, - "buildings": [ - { - "name": "2", - "lat": "43.23420", - "lon": "-70.80871", - "postcode": "03908" - }, - { - "name": "4", - "lat": "43.23424", - "lon": "-70.80877", - "postcode": "03908" - }, - { - "name": "5", - "lat": "43.23481", - "lon": "-70.80901", - "postcode": "03908" - }, - { - "name": "10", - "lat": "43.23428", - "lon": "-70.80875", - "postcode": "03908" - }, - { - "name": "10", - "lat": "43.23429", - "lon": "-70.80875", - "postcode": "03908" - }, - { - "name": "12", - "lat": "43.23439", - "lon": "-70.80867", - "postcode": "03908" - }, - { - "name": "16", - "lat": "43.23448", - "lon": "-70.80867", - "postcode": "03908" - }, - { - "name": "18", - "lat": "43.23449", - "lon": "-70.80864", - "postcode": "03908" - }, - { - "name": "24", - "lat": "43.23481", - "lon": "-70.80828", - "postcode": "03908" - }, - { - "name": "27", - "lat": "43.23496", - "lon": "-70.80882", - "postcode": "03908" - }, - { - "name": "30", - "lat": "43.23493", - "lon": "-70.80811", - "postcode": "03908" - }, - { - "name": "35", - "lat": "43.23500", - "lon": "-70.80871", - "postcode": "03908" - }, - { - "name": "37", - "lat": "43.23510", - "lon": "-70.80869", - "postcode": "03908" - }, - { - "name": "40", - "lat": "43.23509", - "lon": "-70.80794", - "postcode": "03908" - }, - { - "name": "41", - "lat": "43.23523", - "lon": "-70.80830", - "postcode": "03908" - }, - { - "name": "45", - "lat": "43.23553", - "lon": "-70.80873", - "postcode": "03908" - }, - { - "name": "49", - "lat": "43.23540", - "lon": "-70.80839", - "postcode": "03908" - }, - { - "name": "57", - "lat": "43.23565", - "lon": "-70.80837", - "postcode": "03908" - }, - { - "name": "65", - "lat": "43.23567", - "lon": "-70.80789", - "postcode": "03908" - }, - { - "name": "71", - "lat": "43.23584", - "lon": "-70.80781", - "postcode": "03908" - }, - { - "name": "75", - "lat": "43.23593", - "lon": "-70.80770", - "postcode": "03908" - }, - { - "name": "79", - "lat": "43.23601", - "lon": "-70.80761", - "postcode": "03908" - }, - { - "name": "84", - "lat": "43.23529", - "lon": "-70.80768", - "postcode": "03908" - }, - { - "name": "85", - "lat": "43.23620", - "lon": "-70.80734", - "postcode": "03908" - }, - { - "name": "88", - "lat": "43.23540", - "lon": "-70.80755", - "postcode": "03908" - }, - { - "name": "96", - "lat": "43.23559", - "lon": "-70.80734", - "postcode": "03908" - }, - { - "name": "99", - "lat": "43.23657", - "lon": "-70.80688", - "postcode": "03908" - }, - { - "name": "104", - "lat": "43.23582", - "lon": "-70.80703", - "postcode": "03908" - }, - { - "name": "105", - "lat": "43.23671", - "lon": "-70.80665", - "postcode": "03908" - }, - { - "name": "109", - "lat": "43.23679", - "lon": "-70.80646", - "postcode": "03908" - }, - { - "name": "110", - "lat": "43.23604", - "lon": "-70.80678", - "postcode": "03908" - }, - { - "name": "117", - "lat": "43.23704", - "lon": "-70.80622", - "postcode": "03908" - }, - { - "name": "120", - "lat": "43.23625", - "lon": "-70.80650", - "postcode": "03908" - }, - { - "name": "123", - "lat": "43.23729", - "lon": "-70.80590", - "postcode": "03908" - }, - { - "name": "128", - "lat": "43.23645", - "lon": "-70.80626", - "postcode": "03908" - }, - { - "name": "133", - "lat": "43.23757", - "lon": "-70.80570", - "postcode": "03908" - }, - { - "name": "135", - "lat": "43.23751", - "lon": "-70.80547", - "postcode": "03908" - }, - { - "name": "135", - "lat": "43.23751", - "lon": "-70.80547", - "postcode": "03908" - }, - { - "name": "144", - "lat": "43.23664", - "lon": "-70.80594", - "postcode": "03908" - }, - { - "name": "150", - "lat": "43.23690", - "lon": "-70.80549", - "postcode": "03908" - }, - { - "name": "151", - "lat": "43.23817", - "lon": "-70.80425", - "postcode": "03908" - }, - { - "name": "151", - "lat": "43.23817", - "lon": "-70.80425", - "postcode": "03908" - }, - { - "name": "156", - "lat": "43.23714", - "lon": "-70.80519", - "postcode": "03908" - }, - { - "name": "162", - "lat": "43.23729", - "lon": "-70.80504", - "postcode": "03908" - }, - { - "name": "165", - "lat": "43.23842", - "lon": "-70.80369", - "postcode": "03908" - }, - { - "name": "169", - "lat": "43.23847", - "lon": "-70.80349", - "postcode": "03908" - }, - { - "name": "170", - "lat": "43.23747", - "lon": "-70.80478", - "postcode": "03908" - }, - { - "name": "171", - "lat": "43.23865", - "lon": "-70.80313", - "postcode": "03908" - }, - { - "name": "172", - "lat": "43.23756", - "lon": "-70.80448", - "postcode": "03908" - }, - { - "name": "173", - "lat": "43.23903", - "lon": "-70.80373", - "postcode": "03908" - }, - { - "name": "174", - "lat": "43.23809", - "lon": "-70.80313", - "postcode": "03908" - }, - { - "name": "175", - "lat": "43.23890", - "lon": "-70.80272", - "postcode": "03908" - }, - { - "name": "176", - "lat": "43.23815", - "lon": "-70.80304", - "postcode": "03908" - }, - { - "name": "184", - "lat": "43.23856", - "lon": "-70.80236", - "postcode": "03908" - }, - { - "name": "194", - "lat": "43.23878", - "lon": "-70.80197", - "postcode": "03908" - }, - { - "name": "200", - "lat": "43.23903", - "lon": "-70.80178", - "postcode": "03908" - }, - { - "name": "204", - "lat": "43.23923", - "lon": "-70.80141", - "postcode": "03908" - }, - { - "name": "214", - "lat": "43.23975", - "lon": "-70.80137", - "postcode": "03908" - }, - { - "name": "216", - "lat": "43.23992", - "lon": "-70.80113", - "postcode": "03908" - }, - { - "name": "218", - "lat": "43.24022", - "lon": "-70.80124", - "postcode": "03908" - }, - { - "name": "220", - "lat": "43.24056", - "lon": "-70.80120", - "postcode": "03908" - }, - { - "name": "224", - "lat": "43.24079", - "lon": "-70.80103", - "postcode": "03908" - }, - { - "name": "231", - "lat": "43.24184", - "lon": "-70.80221", - "postcode": "03908" - }, - { - "name": "233", - "lat": "43.24219", - "lon": "-70.80216", - "postcode": "03908" - }, - { - "name": "241", - "lat": "43.24314", - "lon": "-70.80094", - "postcode": "03908" - } - ], - "intersectedStreets": [ - { - "name": "Main Street", - "names": { - "alt_name": "State Route 236" - }, - "lat": "43.23428", - "lon": "-70.80897" - }, - { - "name": "Colcord Street", - "lat": "43.23543", - "lon": "-70.80787" - }, - { - "name": "Highland Avenue", - "lat": "43.23667", - "lon": "-70.80631" - }, - { - "name": "Goodwin Street", - "lat": "43.23767", - "lon": "-70.80470" - }, - { - "name": "Agamenticus Road", - "lat": "43.23772", - "lon": "-70.80461" - }, - { - "name": "Jewett Avenue", - "lat": "43.23809", - "lon": "-70.80371" - } - ] - }, - { - "name": "Portland Avenue", - "lat": "43.22724", - "lon": "-70.81150", - "id": 79321, - "intersectedStreets": [ - { - "name": "Main Street", - "names": { - "alt_name": "State Route 236" - }, - "lat": "43.22724", - "lon": "-70.81150" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Lake Arrowhead", - "lat": "43.66369", - "lon": "-70.73478", - "id": 158903930, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Old Portland Road", - "lat": "43.66258", - "lon": "-70.73440", - "id": 73478, - "intersectedStreets": [ - { - "name": "Lone Pine Road", - "lat": "43.66090", - "lon": "-70.74622" - }, - { - "name": "Love Lane", - "lat": "43.66090", - "lon": "-70.74622" - }, - { - "name": "Ebony Lane", - "lat": "43.66135", - "lon": "-70.74453" - }, - { - "name": "Country Lane", - "lat": "43.66185", - "lon": "-70.74305" - }, - { - "name": "Center Circle", - "lat": "43.66368", - "lon": "-70.73861" - }, - { - "name": "Cresent Drive", - "lat": "43.66303", - "lon": "-70.73586" - }, - { - "name": "Crystal Lane", - "lat": "43.66289", - "lon": "-70.73541" - }, - { - "name": "Lenox Circle", - "lat": "43.66239", - "lon": "-70.73410" - }, - { - "name": "Golden Lane", - "lat": "43.66183", - "lon": "-70.73303" - }, - { - "name": "Sequoia Lane", - "lat": "43.66166", - "lon": "-70.72938" - }, - { - "name": "Fairview Drive", - "lat": "43.66197", - "lon": "-70.72859" - }, - { - "name": "Beechwood Circle", - "lat": "43.66216", - "lon": "-70.72771" - }, - { - "name": "Allview Terrace", - "lat": "43.66202", - "lon": "-70.72608" - }, - { - "name": "Briar Lane", - "lat": "43.66211", - "lon": "-70.72477" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Kingfield", - "lat": "44.95945", - "lon": "-70.15457", - "id": 158858100, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrabassett Road;West New Portland Road", - "lat": "44.94775", - "lon": "-70.14880", - "id": 43387 - }, - { - "name": "West New Portland Road", - "lat": "44.94383", - "lon": "-70.14676", - "id": 43696 - } - ], - "matchStreet": 1 - }, - { - "name": "Hampden", - "lat": "44.74452", - "lon": "-68.83698", - "id": 158862067, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "South Gray", - "lat": "43.84869", - "lon": "-70.32172", - "id": 158861427, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "43.84937", - "lon": "-70.32205", - "id": 40542, - "intersectedStreets": [ - { - "name": "Upper Marginal Way", - "lat": "43.84963", - "lon": "-70.32205" - }, - { - "name": "Dutton Hill", - "lat": "43.83758", - "lon": "-70.32117" - }, - { - "name": "Files Farm Road", - "lat": "43.83567", - "lon": "-70.32080" - }, - { - "name": "Two Lights Road", - "lat": "43.83400", - "lon": "-70.32046" - }, - { - "name": "Verrill Road", - "lat": "43.83340", - "lon": "-70.32031" - }, - { - "name": "Whitney Road", - "lat": "43.85102", - "lon": "-70.32173" - }, - { - "name": "Long Hill Road", - "lat": "43.85943", - "lon": "-70.32216" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Ellsworth", - "lat": "44.54348", - "lon": "-68.42018", - "id": 158907508, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Brunswick", - "lat": "43.91452", - "lon": "-69.96533", - "id": 158864618, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Old Portland Road (Deep Cut)", - "lat": "43.91208", - "lon": "-70.00061", - "id": 77167, - "buildings": [ - { - "name": "36", - "lat": "43.91258", - "lon": "-70.00366", - "postcode": "04011" - }, - { - "name": "170", - "lat": "43.91110", - "lon": "-70.01651", - "postcode": "04011" - } - ], - "intersectedStreets": [ - { - "name": "Main Street (Deep Cut)", - "lat": "43.91216", - "lon": "-69.99935" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Edmundston", - "enName": "Edmundston", - "names": { - "ru": "Эдмундстон", - "uk": "Едмундстон" - }, - "lat": "47.36441", - "lon": "-68.32809", - "id": 34699332, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "York", - "lat": "43.15210", - "lon": "-70.64932", - "id": 6357513599, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Biddeford", - "lat": "43.49258", - "lon": "-70.45338", - "id": 158859755, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Mexico", - "lat": "44.56112", - "lon": "-70.54596", - "id": 158855781, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Millinocket", - "lat": "45.65773", - "lon": "-68.70987", - "id": 158903664, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "North New Portland", - "lat": "44.92506", - "lon": "-70.02312", - "id": 158823917, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "3rd Street", - "lat": "44.95734", - "lon": "-70.00641", - "id": 67576 - }, - { - "name": "4th Street", - "lat": "44.96091", - "lon": "-70.00814", - "id": 69451 - }, - { - "name": "Airport Road", - "lat": "44.91809", - "lon": "-70.05057", - "id": 68124 - }, - { - "name": "Bakers Way", - "lat": "44.95402", - "lon": "-70.05908", - "id": 4896 - }, - { - "name": "Black Hill Road", - "lat": "44.91887", - "lon": "-70.00905", - "id": 67554 - }, - { - "name": "Bog Road", - "lat": "44.92502", - "lon": "-70.02340", - "id": 23281 - }, - { - "name": "Cameron Road", - "lat": "44.95443", - "lon": "-70.04297", - "id": 70220 - }, - { - "name": "Church Street", - "lat": "44.92706", - "lon": "-70.02276", - "id": 68034 - }, - { - "name": "Fairgrounds Road", - "lat": "44.91726", - "lon": "-70.02649", - "id": 67974 - }, - { - "name": "George E Cole Road", - "lat": "44.94286", - "lon": "-70.03540", - "id": 68563 - }, - { - "name": "Gilman Pond Road", - "lat": "44.93604", - "lon": "-70.05181", - "id": 70300 - }, - { - "name": "Hancock Pond Road", - "lat": "44.92619", - "lon": "-70.02244", - "id": 23755 - }, - { - "name": "Hutchins Street", - "lat": "44.92671", - "lon": "-70.02316", - "id": 23903 - }, - { - "name": "Long Falls Dam Road", - "lat": "44.92551", - "lon": "-70.02312", - "id": 23779 - }, - { - "name": "Meadow Brook Road", - "lat": "44.92536", - "lon": "-70.02186", - "id": 23785 - }, - { - "name": "Millay Hill Road", - "lat": "44.92457", - "lon": "-70.06636", - "id": 66352 - }, - { - "name": "Mullen Road", - "lat": "44.93951", - "lon": "-70.01690", - "id": 71178 - }, - { - "name": "Pinkham Road", - "lat": "44.96026", - "lon": "-70.00651", - "id": 68689 - }, - { - "name": "Reed Road", - "lat": "44.94475", - "lon": "-70.05760", - "id": 69470 - }, - { - "name": "Reservoir Road", - "lat": "44.93632", - "lon": "-70.01132", - "id": 68301 - }, - { - "name": "Snowmobile Kingfield New Portland Connector", - "lat": "44.95103", - "lon": "-70.05531", - "id": 80956 - }, - { - "name": "Fitzys Road", - "lat": "44.93519", - "lon": "-70.04070", - "id": 67935 - }, - { - "name": "Gilman Pond Rd D", - "lat": "44.95104", - "lon": "-70.05908", - "id": 71460 - }, - { - "name": "Podunk Road", - "lat": "44.91931", - "lon": "-70.02531", - "id": 71583 - }, - { - "name": "Taylor Pit Road", - "lat": "44.91618", - "lon": "-70.03188", - "id": 67630 - }, - { - "name": "Trudell Road", - "lat": "44.92440", - "lon": "-70.02829", - "id": 67889 - }, - { - "name": "Wilbur Place", - "lat": "44.94065", - "lon": "-70.04634", - "id": 71564 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Berwick", - "lat": "43.27259", - "lon": "-70.86732", - "id": 158846698, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Portland Street", - "names": { - "alt_name": "State Route 4" - }, - "lat": "43.27002", - "lon": "-70.76903", - "id": 76268, - "buildings": [ - { - "name": "241", - "lat": "43.24312", - "lon": "-70.80096", - "postcode": "03908" - } - ], - "intersectedStreets": [ - { - "name": "Old Route 4", - "lat": "43.26850", - "lon": "-70.77453" - }, - { - "name": "Stone Lane", - "lat": "43.26950", - "lon": "-70.77148" - }, - { - "name": "Industry Drive", - "lat": "43.26994", - "lon": "-70.76951" - }, - { - "name": "Coffin Road", - "lat": "43.27067", - "lon": "-70.76532" - }, - { - "name": "Circuit Road", - "lat": "43.24845", - "lon": "-70.79631" - }, - { - "name": "Blackberry Hill Road", - "lat": "43.24894", - "lon": "-70.79583" - }, - { - "name": "Irwin Lane", - "lat": "43.25480", - "lon": "-70.79068" - }, - { - "name": "Anderson Lane", - "lat": "43.25757", - "lon": "-70.78888" - }, - { - "name": "Junction Road", - "lat": "43.26141", - "lon": "-70.78515" - }, - { - "name": "Dead Horse Lane", - "lat": "43.26224", - "lon": "-70.78410" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Kennebunk", - "lat": "43.38409", - "lon": "-70.54527", - "id": 158807785, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Portland Road", - "lat": "43.38799", - "lon": "-70.53697", - "id": 74619, - "buildings": [ - { - "name": "45", - "lat": "43.39384", - "lon": "-70.53102", - "postcode": "04043" - } - ], - "intersectedStreets": [ - { - "name": "Green Street", - "lat": "43.38780", - "lon": "-70.53708" - }, - { - "name": "Main Street", - "lat": "43.38780", - "lon": "-70.53708" - }, - { - "name": "Summer Street", - "names": { - "alt_name": "State Route 9A; State Route 35" - }, - "lat": "43.38780", - "lon": "-70.53708" - }, - { - "name": "Hope Cemetery Trail", - "lat": "43.38868", - "lon": "-70.53682" - }, - { - "name": "Barnard Lane", - "lat": "43.38896", - "lon": "-70.53665" - }, - { - "name": "Penny Lane (Bartlett Mills)", - "lat": "43.39156", - "lon": "-70.53444" - }, - { - "name": "Fieldcrest Drive (Bartlett Mills)", - "lat": "43.39222", - "lon": "-70.53390" - }, - { - "name": "Post Office Square (Bartlett Mills)", - "lat": "43.39284", - "lon": "-70.53341" - }, - { - "name": "Merrifield Drive", - "lat": "43.39448", - "lon": "-70.53203" - }, - { - "name": "Shoppers Village Way", - "lat": "43.39448", - "lon": "-70.53203" - }, - { - "name": "Shape Drive", - "lat": "43.39596", - "lon": "-70.53102" - }, - { - "name": "Farragut Way", - "lat": "43.39876", - "lon": "-70.52905" - }, - { - "name": "Ross Road (Bartlett Mills)", - "lat": "43.39959", - "lon": "-70.52849" - }, - { - "name": "Powder Mill Drive", - "lat": "43.39975", - "lon": "-70.52841" - }, - { - "name": "Rollins Lane (Bartlett Mills)", - "lat": "43.40263", - "lon": "-70.52660" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/poi_biergarten.json b/OsmAnd-java/src/test/resources/search/poi_biergarten.json deleted file mode 100644 index 362e58f4d7..0000000000 --- a/OsmAnd-java/src/test/resources/search/poi_biergarten.json +++ /dev/null @@ -1,662 +0,0 @@ -{ - "settings": { - "lat": "51.04933", - "lon": "13.73815", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "Biergarten", - "results": [ - "Biergarten (Food)", - "Biergarten Italienisches Dörfchen", - "Biergarten Narrenhäus'l", - "Biergarten Elbsegler", - "Biergarten Elbsegler", - "Biergarten", - "Biergarten", - "Biergarten", - "Biergarten", - "Biergarten" - ], - "amenities": [ - { - "lat": "51.02489", - "lon": "13.69860", - "id": 244538865, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "surface_fine_gravel": "fine_gravel" - } - }, - { - "lat": "51.09478", - "lon": "13.84153", - "id": 865332598, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Einkehr" - } - }, - { - "lat": "51.01123", - "lon": "13.67918", - "id": 9712288200, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "website": "http://www.zur-linde-freital.de/", - "operator": "Zur Linde", - "image": "http://commons.wikimedia.org/wiki/File:Hotel_und_Gasthaus_Zur_Linde_Freital-Birkigt.jpg" - } - }, - { - "name": "Altes Wettbüro", - "lat": "51.06472", - "lon": "13.74467", - "id": 11451975032, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Tu-Sa 17:00-22:00", - "additionalInfo": { - "wheelchair_limited": "limited", - "outdoor_seating_yes": "yes", - "outdoor_seating_filter_yes": "yes", - "opening_hours": "Tu-Sa 17:00-22:00", - "website": "http://www.altes-wettbuero.de", - "phone": "+49 351 6588983", - "operator": "Falk Gruß" - } - }, - { - "name": "Carolaschlösschen", - "lat": "51.03341", - "lon": "13.76392", - "id": 3704353318, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Su 11:00-24:00", - "additionalInfo": { - "wheelchair_limited": "limited", - "opening_hours": "Mo-Su 11:00-24:00", - "facebook": "https://www.facebook.com/carolaschloesschen/" - } - }, - { - "lat": "51.01251", - "lon": "13.69407", - "id": 562115695, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Torwirtschaft", - "lat": "51.04156", - "lon": "13.75139", - "id": 517007905, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes", - "website": "http://www.torwirtschaft-dresden.de", - "facebook": "https://www.facebook.com/Torwirtschaft-der-Biergarten-f%C3%BCr-alle-Dynamofans-168677023169963/" - } - }, - { - "name": "Biergarten Italienisches Dörfchen", - "lat": "51.05429", - "lon": "13.73759", - "id": 486232011, - "subType": "biergarten", - "type": "sustenance" - }, - { - "lat": "51.04261", - "lon": "13.75229", - "id": 98518191, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes" - } - }, - { - "name": "Körnergarten", - "names": { - "prefix": "Biergarten" - }, - "lat": "51.05316", - "lon": "13.81192", - "id": 3704353594, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Su 11:00-24:00", - "additionalInfo": { - "wheelchair_limited": "limited", - "opening_hours": "Mo-Su 11:00-24:00", - "website": "http://www.koernergarten.de/" - } - }, - { - "lat": "51.06397", - "lon": "13.79748", - "id": 670742479, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Weingut Seifert", - "lat": "51.11134", - "lon": "13.66701", - "id": 789740008, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "note": "not really a 'biergarten' :)" - } - }, - { - "lat": "50.98710", - "lon": "13.65086", - "id": 9037536542, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Zum Gründl" - } - }, - { - "lat": "51.10538", - "lon": "13.62622", - "id": 9289210778, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Zum Bürgergarten" - } - }, - { - "lat": "51.09459", - "lon": "13.84170", - "id": 5598697742, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Einkehr" - } - }, - { - "name": "Trobischhof", - "lat": "51.08649", - "lon": "13.71338", - "id": 409847251, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_limited": "limited" - } - }, - { - "name": "Demnitz Elbegarten", - "lat": "51.05328", - "lon": "13.81175", - "id": 771102016, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_no": "no", - "cuisine_german": "german", - "website": "http://www.elbegarten.de" - } - }, - { - "name": "Augustus Garten am Narrenhäusl", - "lat": "51.05697", - "lon": "13.74166", - "id": 465538291, - "subType": "biergarten", - "type": "sustenance" - }, - { - "lat": "51.01529", - "lon": "13.65107", - "id": 7482890514, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Burgwartschänke" - } - }, - { - "name": "el Horst", - "lat": "51.04361", - "lon": "13.78979", - "id": 559979958, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Oct-Apr: Mo-Fr 17:00-18:00+, Oct-Apr: Sa,PH 11:30-18:00+, May-Sep: Mo-Fr 15:00-18:00+, May-Sep: Sa,PH 11:30-18:00+", - "additionalInfo": { - "opening_hours": "Oct-Apr: Mo-Fr 17:00-18:00+, Oct-Apr: Sa,PH 11:30-18:00+, May-Sep: Mo-Fr 15:00-18:00+, May-Sep: Sa,PH 11:30-18:00+" - } - }, - { - "lat": "51.07376", - "lon": "13.70135", - "id": 553613482, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Wirtshaus Lindenschänke" - } - }, - { - "name": "Wachstube", - "lat": "51.04254", - "lon": "13.75222", - "id": 46060263, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "11:00+", - "additionalInfo": { - "wheelchair_no": "no", - "opening_hours": "11:00+", - "website": "https://www.torwirtschaft-dresden.de/wachstube/restaurant.php", - "phone": "+49 351 4466975", - "image": "https://commons.wikimedia.org/wiki/File:Torhaus_N_Grosser_Garten_Dresden-2.jpg", - "wheelchair_description:de": "Zugang ins Gebäude nur über Stufen", - "height": "5.7", - "facebook": "https://www.facebook.com/Wachstube-im-Gro%C3%9Fen-Garten-Dresden-144180698984577/", - "email": "info@wachstube-dresden.de" - } - }, - { - "lat": "51.09050", - "lon": "13.70555", - "id": 6300849046, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Bäckerei Werner" - } - }, - { - "name": "Biergarten Elbsegler", - "lat": "51.05731", - "lon": "13.73973", - "id": 465318113, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_limited": "limited" - } - }, - { - "name": "Straußenwirtschaft Weingut Pesterwitz", - "lat": "51.02883", - "lon": "13.64144", - "id": 478369183, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "website": "https://www.gut-pesterwitz.de/" - } - }, - { - "name": "Schillergarten", - "lat": "51.05228", - "lon": "13.80908", - "id": 493702544, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Su 11:00-01:00", - "additionalInfo": { - "wheelchair_yes": "yes", - "opening_hours": "Mo-Su 11:00-01:00" - } - }, - { - "lat": "51.04111", - "lon": "13.80554", - "id": 5837244174, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Astloch" - } - }, - { - "name": "Spitzwegerich", - "lat": "51.07767", - "lon": "13.70757", - "id": 412610355, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes", - "toilets_wheelchair_no": "no" - } - }, - { - "name": "Biergarten Goldener Anker", - "lat": "51.10399", - "lon": "13.62850", - "id": 143015201, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Tu-Su,PH 11:00-21:00", - "additionalInfo": { - "wheelchair_yes": "yes", - "opening_hours": "Tu-Su,PH 11:00-21:00" - } - }, - { - "name": "Bottoms Up", - "lat": "51.06516", - "lon": "13.75615", - "id": 1394136626, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Biergarten Narrenhäus'l", - "lat": "51.05666", - "lon": "13.74130", - "id": 466763007, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Zum Schießhaus", - "lat": "51.05464", - "lon": "13.72727", - "id": 326416539, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Su,PH 11:00-23:00", - "additionalInfo": { - "wheelchair_yes": "yes", - "toilets_wheelchair_no": "no", - "opening_hours": "Mo-Su,PH 11:00-23:00" - } - }, - { - "name": "Palais Bistro", - "lat": "51.05182", - "lon": "13.73682", - "id": 501015667, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Apr-Oct: Mo-Su 11:00-24:00, Nov-Mar: Mo-Th 12:00-14:30,17:30-24:00, Nov-Mar: Fr-Su 12:00-24:00", - "additionalInfo": { - "wheelchair_yes": "yes", - "opening_hours": "Apr-Oct: Mo-Su 11:00-24:00, Nov-Mar: Mo-Th 12:00-14:30,17:30-24:00, Nov-Mar: Fr-Su 12:00-24:00" - } - }, - { - "name": "Brauhaus am Waldschlößchen", - "lat": "51.06778", - "lon": "13.77786", - "id": 594989978, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Su 11:00-01:00", - "additionalInfo": { - "wheelchair_limited": "limited", - "opening_hours": "Mo-Su 11:00-01:00" - } - }, - { - "lat": "51.00222", - "lon": "13.68504", - "id": 2469999180, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Biergarten Elbsegler", - "lat": "51.05738", - "lon": "13.73913", - "id": 466539133, - "subType": "biergarten", - "type": "sustenance" - }, - { - "lat": "51.01010", - "lon": "13.66208", - "id": 7987508388, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes", - "operator": "Zum goldenen Löwen" - } - }, - { - "lat": "50.99476", - "lon": "13.72701", - "id": 6765029580, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Eutschützer Mühle" - } - }, - { - "lat": "50.99295", - "lon": "13.64362", - "id": 6065174964, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Alte Schmiede" - } - }, - { - "name": "Louisengarten", - "lat": "51.06681", - "lon": "13.75278", - "id": 68516655, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Apr-Sep Su-Th 16:00+; Apr-Sep Fr,Sa 15:00+ || off \"Bei unfreundlichem Wetter\"", - "additionalInfo": { - "wheelchair_no": "no", - "opening_hours": "Apr-Sep Su-Th 16:00+; Apr-Sep Fr,Sa 15:00+ || off \"Bei unfreundlichem Wetter\"", - "website": "http://www.biergarten-dresden.de", - "note": "Neustädter Winter Hüttn von Oktober-Dezember", - "alt_name": "Neustädter Winter Hüttn" - } - }, - { - "lat": "51.00871", - "lon": "13.65959", - "id": 9237211698, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes", - "operator": "Akropolis" - } - }, - { - "lat": "51.03435", - "lon": "13.76042", - "id": 595971770, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Apr-Oct: Mo-Fr 11:00-19:00; Sa-Su 10:00-19:00; PH 10:00-19:00", - "additionalInfo": { - "wheelchair_yes": "yes", - "opening_hours": "Apr-Oct: Mo-Fr 11:00-19:00; Sa-Su 10:00-19:00; PH 10:00-19:00", - "website": "https://www.grosser-garten-dresden.de/de/gaesteservice/gastronomie-shop/", - "phone": "+49 152 37 00 67 53" - } - }, - { - "name": "Landgut Hofewiese", - "lat": "51.10989", - "lon": "13.83207", - "id": 8455509378, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes" - } - }, - { - "name": "Café & Restaurant Saite", - "lat": "51.07636", - "lon": "13.74825", - "id": 577481323, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Fr 18:00-24:00, Su 10:00-15:00", - "additionalInfo": { - "wheelchair_limited": "limited", - "opening_hours": "Mo-Fr 18:00-24:00, Su 10:00-15:00" - } - }, - { - "name": "Alt-Dresden", - "lat": "51.04977", - "lon": "13.69881", - "id": 970594717, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_limited": "limited", - "phone": "0351 4135133" - } - }, - { - "lat": "51.08677", - "lon": "13.70081", - "id": 413620001, - "subType": "biergarten", - "type": "sustenance" - }, - { - "lat": "50.98618", - "lon": "13.63208", - "id": 10355747978, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "Hirschbergschenke" - } - }, - { - "name": "Fährgarten Johannstadt", - "lat": "51.06151", - "lon": "13.76679", - "id": 4415013507072, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_yes": "yes", - "outdoor_seating_yes": "yes", - "outdoor_seating_filter_yes": "yes", - "website": "http://www.faehrgarten.de/", - "phone": "+49 351 4596262", - "brewery_additional": "Radeberger", - "email": "info@faehrgarten.de" - } - }, - { - "lat": "51.02343", - "lon": "13.73347", - "id": 4563637454, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Besenwirtschaft Steinrücken", - "lat": "51.11590", - "lon": "13.62457", - "id": 7474665554, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "website": "http://www.besenwirtschaft-steinruecken.de/index.html" - } - }, - { - "lat": "51.05181", - "lon": "13.81396", - "id": 9819148822, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "operator": "WSV \"Am Blauen Wunder\"" - } - }, - { - "name": "Zacke", - "lat": "51.01300", - "lon": "13.63618", - "id": 7498805230, - "subType": "biergarten", - "type": "sustenance" - }, - { - "name": "Klotzscher Sommerwirtschaft", - "lat": "51.11072", - "lon": "13.76879", - "id": 717794449, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Fr 17:00-23:00; Sa-Su 11:00-23:00; Nov-Mar off", - "additionalInfo": { - "opening_hours": "Mo-Fr 17:00-23:00; Sa-Su 11:00-23:00; Nov-Mar off", - "website": "http://klotzschersommerwirtschaft.de", - "phone": "+49 351 8804570", - "fax": "+49 351 8902050", - "email": "Kontakt@klotzscher-sommerwirtschaft.de", - "capacity": "20" - } - }, - { - "name": "Brauhaus Watzke", - "lat": "51.07744", - "lon": "13.71540", - "id": 397976739, - "subType": "biergarten", - "type": "sustenance", - "additionalInfo": { - "wheelchair_limited": "limited", - "toilets_wheelchair_no": "no" - } - }, - { - "name": "Trachauer Sommergarten", - "lat": "51.09166", - "lon": "13.70289", - "id": 1822089672, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "Mo-Su 17:00-21:00", - "additionalInfo": { - "opening_hours": "Mo-Su 17:00-21:00", - "note": "Auch im Winter geöffnet" - } - }, - { - "lat": "51.06520", - "lon": "13.82406", - "id": 11565282314, - "subType": "biergarten", - "type": "sustenance", - "openingHours": "seasonal", - "additionalInfo": { - "outdoor_seating_yes": "yes", - "outdoor_seating_filter_yes": "yes", - "opening_hours": "seasonal" - } - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/spring_street.json b/OsmAnd-java/src/test/resources/search/spring_street.json deleted file mode 100644 index 5ad960f31b..0000000000 --- a/OsmAnd-java/src/test/resources/search/spring_street.json +++ /dev/null @@ -1,8102 +0,0 @@ -{ - "settings": { - "lat": "41.11323", - "lon": "-74.04549", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "spring street", - "results": [ - "Spring (Natural)", - "Spring (Spring / Natural)", - "Spring (Ice rink / Sport)", - "Spring (Bridge / Transport construction)", - "Spring Street, South Nyack", - "Spring Street, Tomkins Cove", - "Spring Street, Southfields", - "Spring Street, Hastings-on-Hudson", - "Spring Street, Pleasantville", - "Spring Street (Mount Pleasant), Hawthorne", - "Spring Street, Durland", - "Spring Street, Warwick", - "Spring Street, Nelsonville", - "Spring Street, Goshen", - "Spring Street (Little Italy), Manhattan", - "Spring Street, Maybrook", - "West Spring Street, Maybrook", - "Spring Street, South Salem", - "Spring Street, Groveville", - "Spring Street, East Middletown", - "Spring Street, Montgomery", - "Spring Street, Chelsea", - "Spring Street, Wappingers Falls", - "Spring Street, Cold Spring Harbor", - "Spring Street, Staten Island", - "Spring Street, East Meadow", - "Spring Street, Inwood", - "Spring Street, Port Jervis", - "Spring Street, Roosevelt", - "Spring Street, Pawling", - "Spring Street, Fairview", - "Spring Street (Wyandanch), Wheatley Heights", - "Spring Street, Wyandanch", - "Spring Street, East Massapequa", - "Spring Street, Ellenville", - "Spring Street, Monticello", - "Spring Street, Tillson", - "Spring Street, Port Jefferson", - "Spring Street (Smallwood), Bethel", - "Spring Street, Liberty", - "Spring Street (Livingston Manor), Rockland", - "Spring Street, Livingston Manor", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street", - "Spring Street" - ], - "amenities": [ - { - "name": "Spring Street Station (6) - Uptown & The Bronx", - "lat": "40.72210", - "lon": "-73.99683", - "id": 10304686932, - "subType": "subway_entrance", - "type": "transportation" - }, - { - "name": "Spring Street", - "lat": "42.58764", - "lon": "-76.36736", - "id": 509891265, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "operator": "Tompkins Consolidated Area Transit", - "route_bus_ref": "40, 43, 74" - } - }, - { - "name": "Broadway/Spring Street", - "lat": "40.72274", - "lon": "-73.99906", - "id": 9511662874, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "operator": "New York City Transit Authority", - "network": "NYC Transit", - "route_bus_ref": "M55", - "ref": "400157" - } - }, - { - "name": "Spring Street", - "lat": "43.02503", - "lon": "-76.00483", - "id": 434392461, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Broadway & Spring Street", - "lat": "40.72277", - "lon": "-73.99912", - "id": 9511662872, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "operator": "New York City Transit Authority", - "network": "NYC Transit", - "route_bus_ref": "M55", - "ref": "400157" - } - }, - { - "name": "Spring Street", - "lat": "40.72232", - "lon": "-73.99719", - "id": 1195856686, - "subType": "public_transport_station", - "type": "transportation", - "openingHours": "24/7", - "additionalInfo": { - "subway_station": "subway", - "wheelchair_no": "no", - "opening_hours": "24/7", - "subway_region": "newyork", - "network": "nyc subway", - "operator": "New York City Transit Authority" - } - }, - { - "name": "Spring Street", - "lat": "40.72232", - "lon": "-73.99719", - "id": 1195856686, - "subType": "railway_station", - "type": "transportation", - "openingHours": "24/7", - "additionalInfo": { - "subway_station": "subway", - "wheelchair_no": "no", - "opening_hours": "24/7", - "subway_region": "newyork", - "network": "nyc subway", - "operator": "New York City Transit Authority" - } - }, - { - "name": "Spring Street Salt Shed", - "lat": "40.72591", - "lon": "-74.01052", - "id": 1177548959, - "subType": "building", - "type": "man_made" - }, - { - "name": "Spring Street Apartments", - "lat": "43.07260", - "lon": "-76.16036", - "id": 10379550690, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "phone": "+1 315 313 5612" - } - }, - { - "name": "6th Avenue & Spring Street", - "lat": "40.72570", - "lon": "-74.00384", - "id": 10271601928, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "wheelchair_yes": "yes", - "covered_no": "no", - "bench_no": "no", - "lit_no": "no", - "network": "M21;M55", - "operator": "MTA" - } - }, - { - "name": "Spring Street Gallery", - "lat": "43.07862", - "lon": "-73.78002", - "id": 715284310, - "subType": "gallery", - "type": "entertainment", - "additionalInfo": { - "ele": "94" - } - }, - { - "name": "Spring Street Station (6) - Uptown & The Bronx", - "lat": "40.72223", - "lon": "-73.99683", - "id": 10304686930, - "subType": "subway_entrance", - "type": "transportation" - }, - { - "name": "Spring Street", - "lat": "40.72521", - "lon": "-74.00283", - "id": 11957491402, - "subType": "alcohol", - "type": "shop" - }, - { - "name": "West Spring Street School", - "lat": "42.94620", - "lon": "-74.19986", - "id": 715193700, - "subType": "school", - "type": "education", - "additionalInfo": { - "ele": "96" - } - }, - { - "name": "Spring Street", - "lat": "42.46436", - "lon": "-75.32156", - "id": 493931189, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Spring Street Station (6) - Downtown", - "lat": "40.72248", - "lon": "-73.99738", - "id": 10304686966, - "subType": "subway_entrance", - "type": "transportation" - }, - { - "name": "Spring Street", - "lat": "40.72568", - "lon": "-74.00401", - "id": 1195874960, - "subType": "internet_access_wlan", - "type": "service", - "openingHours": "24/7", - "additionalInfo": { - "subway_station": "subway", - "wheelchair_no": "no", - "internet_access_fee_no": "no", - "opening_hours": "24/7", - "subway_region": "newyork", - "network": "nyc subway", - "operator": "New York City Transit Authority" - } - }, - { - "name": "Spring Street", - "lat": "40.72568", - "lon": "-74.00401", - "id": 1195874960, - "subType": "public_transport_station", - "type": "transportation", - "openingHours": "24/7", - "additionalInfo": { - "subway_station": "subway", - "wheelchair_no": "no", - "internet_access_fee_no": "no", - "opening_hours": "24/7", - "subway_region": "newyork", - "network": "nyc subway", - "operator": "New York City Transit Authority" - } - }, - { - "name": "Spring Street", - "lat": "40.72568", - "lon": "-74.00401", - "id": 1195874960, - "subType": "railway_station", - "type": "transportation", - "openingHours": "24/7", - "additionalInfo": { - "subway_station": "subway", - "wheelchair_no": "no", - "internet_access_fee_no": "no", - "opening_hours": "24/7", - "subway_region": "newyork", - "network": "nyc subway", - "operator": "New York City Transit Authority" - } - }, - { - "name": "Richmond Road & Spring Street", - "lat": "40.60307", - "lon": "-74.09274", - "id": 8818460186, - "subType": "public_transport_platform", - "type": "transportation" - }, - { - "name": "Spring Street", - "lat": "43.05323", - "lon": "-74.35030", - "id": 236085273, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Spring Street Station (6) - Downtown", - "lat": "40.72240", - "lon": "-73.99745", - "id": 10304686968, - "subType": "subway_entrance", - "type": "transportation" - }, - { - "name": "Spring Street", - "lat": "42.92837", - "lon": "-74.65995", - "id": 482828491, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Spring Street Park", - "lat": "40.72497", - "lon": "-74.00451", - "id": 479976213, - "subType": "park", - "type": "entertainment", - "additionalInfo": { - "website": "https://www.nycgovparks.org/parks/soho-square" - } - }, - { - "name": "Spring Street", - "lat": "43.03055", - "lon": "-73.38284", - "id": 1364728717, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Spring Street", - "lat": "44.69014", - "lon": "-75.49388", - "id": 79158433, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - } - ], - "cities": [ - { - "name": "Newtonville", - "lat": "42.72452", - "lon": "-73.75845", - "id": 158804318, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Willow Spring Drive", - "lat": "42.72507", - "lon": "-73.75777", - "id": 39199 - }, - { - "name": "Willow Spring", - "lat": "42.72575", - "lon": "-73.75800", - "id": 37250 - } - ], - "matchStreet": 1 - }, - { - "name": "Stissing", - "lat": "41.90926", - "lon": "-73.68207", - "id": 158863700, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "41.91076", - "lon": "-73.71273", - "id": 247825 - } - ], - "matchStreet": 1 - }, - { - "name": "Crugers", - "lat": "41.23343", - "lon": "-73.92264", - "id": 158859593, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Place", - "lat": "41.23348", - "lon": "-73.91780", - "id": 278456, - "intersectedStreets": [ - { - "name": "Vale Lane", - "lat": "41.23412", - "lon": "-73.91758" - }, - { - "name": "Springvale Road", - "lat": "41.23246", - "lon": "-73.91664" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Springville", - "lat": "42.50839", - "lon": "-78.66725", - "id": 158496065, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.51145", - "lon": "-78.66271", - "id": 68084 - } - ], - "matchStreet": 1 - }, - { - "name": "Verona", - "lat": "43.13832", - "lon": "-75.57083", - "id": 158391622, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Road (Town of Verona)", - "lat": "43.13735", - "lon": "-75.54135", - "id": 138792 - } - ], - "matchStreet": 1 - }, - { - "name": "Middle Island", - "lat": "40.88622", - "lon": "-72.97305", - "id": 2795064941, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lake Drive", - "lat": "40.88592", - "lon": "-72.95357", - "id": 286044 - } - ], - "matchStreet": 1 - }, - { - "name": "Bronck House", - "lat": "42.34537", - "lon": "-73.84651", - "id": 158846286, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "42.33063", - "lon": "-73.86784", - "id": 110572 - } - ], - "matchStreet": 1 - }, - { - "name": "Richland", - "lat": "43.56952", - "lon": "-76.04770", - "id": 157624666, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Brook Road (Town of Richland)", - "lat": "43.57520", - "lon": "-76.09032", - "id": 144890 - } - ], - "matchStreet": 1 - }, - { - "name": "Groton", - "lat": "42.58669", - "lon": "-76.36662", - "id": 158481744, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.58762", - "lon": "-76.36738", - "id": 269558 - } - ], - "matchStreet": 1 - }, - { - "name": "Cobleskill", - "lat": "42.67785", - "lon": "-74.48542", - "id": 158843210, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.67841", - "lon": "-74.48044", - "id": 148384 - } - ], - "matchStreet": 1 - }, - { - "name": "Morris", - "lat": "42.54874", - "lon": "-75.24521", - "id": 158266672, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.54252", - "lon": "-75.24652", - "id": 147115 - } - ], - "matchStreet": 1 - }, - { - "name": "Middle Island", - "lat": "40.88426", - "lon": "-72.93733", - "id": 158852404, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lake Drive", - "lat": "40.89530", - "lon": "-72.95544", - "id": 156617 - } - ], - "matchStreet": 1 - }, - { - "name": "Sayre", - "lat": "41.99596", - "lon": "-76.52372", - "id": 187398, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.99540", - "lon": "-76.52190", - "id": 65052 - } - ], - "matchStreet": 1 - }, - { - "name": "Staten Island", - "enName": "Staten Island", - "names": { - "ru": "Статен-Айленд" - }, - "lat": "40.58345", - "lon": "-74.14960", - "id": 158851392, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.60341", - "lon": "-74.09450", - "id": 15091 - } - ], - "matchStreet": 1 - }, - { - "name": "Cambridge", - "lat": "43.02813", - "lon": "-73.38123", - "id": 158857511, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Valley Road", - "lat": "43.03218", - "lon": "-73.37067", - "id": 192340 - }, - { - "name": "Spring Street", - "lat": "43.03049", - "lon": "-73.38354", - "id": 189273 - } - ], - "matchStreet": 1 - }, - { - "name": "Tuckahoe", - "lat": "40.89899", - "lon": "-72.41092", - "id": 158852389, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "40.89473", - "lon": "-72.40705", - "id": 264339 - }, - { - "name": "Cold Spring Point Road", - "lat": "40.90381", - "lon": "-72.45629", - "id": 169327 - }, - { - "name": "Spring Pond Lane", - "lat": "40.89809", - "lon": "-72.45215", - "id": 177773 - }, - { - "name": "Cold Spring Court", - "lat": "40.89721", - "lon": "-72.46943", - "id": 187217 - } - ], - "matchStreet": 1 - }, - { - "name": "Hoosick Falls", - "lat": "42.90119", - "lon": "-73.35150", - "id": 158856494, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.90003", - "lon": "-73.35277", - "id": 44598 - } - ], - "matchStreet": 1 - }, - { - "name": "Mineville", - "lat": "44.08860", - "lon": "-73.51574", - "id": 158823704, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Mountain Spring Road", - "lat": "44.10261", - "lon": "-73.51896", - "id": 107540 - } - ], - "matchStreet": 1 - }, - { - "name": "Westport", - "lat": "44.18417", - "lon": "-73.43571", - "id": 158868766, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Mountain Spring Road", - "lat": "44.14857", - "lon": "-73.49602", - "id": 105913 - }, - { - "name": "Cold Spring Way", - "lat": "44.16378", - "lon": "-73.40966", - "id": 110090 - } - ], - "matchStreet": 1 - }, - { - "name": "Hastings-on-Hudson", - "lat": "40.99466", - "lon": "-73.87859", - "id": 158912800, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.99522", - "lon": "-73.88267", - "id": 210798 - } - ], - "matchStreet": 1 - }, - { - "name": "Lorraine", - "lat": "43.76646", - "lon": "-75.95937", - "id": 158657812, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.79709", - "lon": "-75.96597", - "id": 276627 - } - ], - "matchStreet": 1 - }, - { - "name": "East Hills", - "lat": "40.79585", - "lon": "-73.62406", - "id": 158843167, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Road", - "lat": "40.78922", - "lon": "-73.62930", - "id": 228551, - "intersectedStreets": [ - { - "name": "Old Farm Road", - "lat": "40.78972", - "lon": "-73.62784" - }, - { - "name": "High Hollow Road", - "lat": "40.78899", - "lon": "-73.63041" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Canaseraga", - "lat": "42.46146", - "lon": "-77.77694", - "id": 158572802, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.46782", - "lon": "-77.77385", - "id": 84104 - } - ], - "matchStreet": 1 - }, - { - "name": "Kings Point", - "lat": "40.81983", - "lon": "-73.73513", - "id": 158856454, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "40.80902", - "lon": "-73.73051", - "id": 231122, - "intersectedStreets": [ - { - "name": "Hicks Lane", - "lat": "40.80655", - "lon": "-73.73032" - }, - { - "name": "Woodcrest Road", - "lat": "40.80769", - "lon": "-73.73051" - }, - { - "name": "Rogers Road", - "lat": "40.80925", - "lon": "-73.73049" - }, - { - "name": "Shady Brook Road", - "lat": "40.80967", - "lon": "-73.73045" - }, - { - "name": "Henhawk Road", - "lat": "40.81045", - "lon": "-73.73051" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Limestreet", - "lat": "42.30842", - "lon": "-73.87569", - "id": 158856451, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "42.31188", - "lon": "-73.87816", - "id": 110568 - } - ], - "matchStreet": 1 - }, - { - "name": "Valley Cottage", - "lat": "41.11815", - "lon": "-73.95541", - "id": 158908673, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "41.13332", - "lon": "-73.93998", - "id": 241443, - "intersectedStreets": [ - { - "name": "Emerald Drive", - "lat": "41.13196", - "lon": "-73.94050" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Maple Shade", - "lat": "43.01869", - "lon": "-73.72623", - "id": 158811404, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Waters Drive", - "lat": "43.02446", - "lon": "-73.72178", - "id": 44806 - } - ], - "matchStreet": 1 - }, - { - "name": "Knapps Corner", - "lat": "41.62856", - "lon": "-73.91664", - "id": 158855434, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "41.62779", - "lon": "-73.91074", - "id": 246745, - "intersectedStreets": [ - { - "name": "Old Post Road", - "lat": "41.62831", - "lon": "-73.91634" - }, - { - "name": "Kerr Road", - "lat": "41.62794", - "lon": "-73.91378" - }, - { - "name": "Labrador Lane", - "lat": "41.62778", - "lon": "-73.91102" - }, - { - "name": "Victor Lane", - "lat": "41.62792", - "lon": "-73.90900" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Quigley Park", - "lat": "42.13645", - "lon": "-79.39589", - "id": 157596955, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.13100", - "lon": "-79.39414", - "id": 257319 - } - ], - "matchStreet": 1 - }, - { - "name": "Valatie", - "lat": "42.41341", - "lon": "-73.67318", - "id": 158811382, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.41348", - "lon": "-73.67290", - "id": 98387 - } - ], - "matchStreet": 1 - }, - { - "name": "South Nyack", - "lat": "41.08320", - "lon": "-73.92020", - "id": 158843124, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.08690", - "lon": "-73.92428", - "id": 244097 - } - ], - "matchStreet": 1 - }, - { - "name": "Perry", - "lat": "42.71562", - "lon": "-78.00556", - "id": 157567202, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.71650", - "lon": "-78.00029", - "id": 198072 - } - ], - "matchStreet": 1 - }, - { - "name": "Upper Red Hook", - "lat": "42.02981", - "lon": "-73.84457", - "id": 158840064, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lake Road", - "lat": "42.02558", - "lon": "-73.84501", - "id": 249101 - } - ], - "matchStreet": 1 - }, - { - "name": "Mumford", - "lat": "42.99284", - "lon": "-77.86029", - "id": 158505210, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.98946", - "lon": "-77.86661", - "id": 124781 - } - ], - "matchStreet": 1 - }, - { - "name": "Cossayuna", - "lat": "43.18369", - "lon": "-73.42678", - "id": 158823673, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Maple Spring Way", - "lat": "43.19075", - "lon": "-73.42079", - "id": 192511 - } - ], - "matchStreet": 1 - }, - { - "name": "Montgomery", - "lat": "41.52759", - "lon": "-74.23682", - "id": 158836967, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.52607", - "lon": "-74.23361", - "id": 200973 - } - ], - "matchStreet": 1 - }, - { - "name": "Pleasant Valley", - "lat": "41.74454", - "lon": "-73.82125", - "id": 158802149, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Creek Drive", - "lat": "41.75491", - "lon": "-73.83246", - "id": 250333 - } - ], - "matchStreet": 1 - }, - { - "name": "Palatine Bridge", - "lat": "42.91091", - "lon": "-74.57403", - "id": 158853346, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.90989", - "lon": "-74.57949", - "id": 123565 - } - ], - "matchStreet": 1 - }, - { - "name": "Ilion", - "lat": "43.01507", - "lon": "-75.03543", - "id": 158268663, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.01075", - "lon": "-75.02973", - "id": 111336 - } - ], - "matchStreet": 1 - }, - { - "name": "West Mahopac", - "lat": "41.37092", - "lon": "-73.79013", - "id": 158813422, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "41.37352", - "lon": "-73.78808", - "id": 237830, - "intersectedStreets": [ - { - "name": "Lake Shore Drive", - "lat": "41.37360", - "lon": "-73.78778" - } - ] - }, - { - "name": "Spring Brook Road", - "lat": "41.37272", - "lon": "-73.78210", - "id": 238395, - "intersectedStreets": [ - { - "name": "Secor Road", - "lat": "41.37119", - "lon": "-73.78184" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Old Brookville", - "lat": "40.83204", - "lon": "-73.60485", - "id": 158815469, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "40.84446", - "lon": "-73.60638", - "id": 221249, - "intersectedStreets": [ - { - "name": "Pound Hollow Road", - "lat": "40.84539", - "lon": "-73.60681" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Raymond", - "lat": "43.10700", - "lon": "-78.66725", - "id": 158581203, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Ln", - "lat": "43.10314", - "lon": "-78.65799", - "id": 261915 - } - ], - "matchStreet": 1 - }, - { - "name": "Catskill", - "lat": "42.21731", - "lon": "-73.86457", - "id": 158808533, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.22410", - "lon": "-73.86203", - "id": 108121 - } - ], - "matchStreet": 1 - }, - { - "name": "Whitehall", - "lat": "43.55576", - "lon": "-73.40378", - "id": 158856659, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.54118", - "lon": "-73.41170", - "id": 189278 - } - ], - "matchStreet": 1 - }, - { - "name": "Manchester Center", - "lat": "42.97590", - "lon": "-77.17997", - "id": 158563804, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Run", - "lat": "42.97194", - "lon": "-77.16829", - "id": 129856 - } - ], - "matchStreet": 1 - }, - { - "name": "Black Creek", - "lat": "42.27563", - "lon": "-78.22640", - "id": 158554591, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Valley Road", - "lat": "42.26712", - "lon": "-78.20785", - "id": 272027 - } - ], - "matchStreet": 1 - }, - { - "name": "Sylvan Beach", - "lat": "42.46479", - "lon": "-77.10831", - "id": 158368224, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Bubbling Spring Road", - "lat": "42.46464", - "lon": "-77.11051", - "id": 84473 - } - ], - "matchStreet": 1 - }, - { - "name": "Portville", - "lat": "42.03868", - "lon": "-78.34085", - "id": 158647757, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Court", - "lat": "42.03691", - "lon": "-78.32780", - "id": 91800 - } - ], - "matchStreet": 1 - }, - { - "name": "Bath", - "lat": "42.33702", - "lon": "-77.31775", - "id": 158546379, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.34586", - "lon": "-77.32255", - "id": 83079 - } - ], - "matchStreet": 1 - }, - { - "name": "White Creek", - "lat": "42.97008", - "lon": "-73.29122", - "id": 158838223, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Lane (Town of White Creek)", - "lat": "43.00750", - "lon": "-73.38007", - "id": 195067 - }, - { - "name": "Spring Valley Road (Cambridge)", - "lat": "43.03218", - "lon": "-73.37069", - "id": 192341 - }, - { - "name": "Spring Street (Cambridge)", - "lat": "43.03050", - "lon": "-73.38354", - "id": 189274 - } - ], - "matchStreet": 1 - }, - { - "name": "North Chili", - "lat": "43.11978", - "lon": "-77.80556", - "id": 158342606, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Flower Drive", - "lat": "43.12598", - "lon": "-77.79084", - "id": 128329 - } - ], - "matchStreet": 1 - }, - { - "name": "Rocky Point", - "lat": "40.95260", - "lon": "-72.92538", - "id": 158846392, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Garden Road", - "lat": "40.96144", - "lon": "-72.95061", - "id": 172951 - } - ], - "matchStreet": 1 - }, - { - "name": "Wyandanch", - "lat": "40.75399", - "lon": "-73.36040", - "id": 158806452, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.76145", - "lon": "-73.35541", - "id": 283852 - } - ], - "matchStreet": 1 - }, - { - "name": "Ellenville", - "lat": "41.71704", - "lon": "-74.39571", - "id": 158839217, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.72034", - "lon": "-74.39431", - "id": 178524 - } - ], - "matchStreet": 1 - }, - { - "name": "Marilla", - "lat": "42.84006", - "lon": "-78.55502", - "id": 158237098, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Garden", - "lat": "42.78509", - "lon": "-78.55765", - "id": 71192 - } - ], - "matchStreet": 1 - }, - { - "name": "South Dover", - "lat": "41.66120", - "lon": "-73.55901", - "id": 158826941, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "41.66972", - "lon": "-73.54960", - "id": 247171, - "intersectedStreets": [ - { - "name": "Berkshire Road", - "lat": "41.66974", - "lon": "-73.54941" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Port Jervis", - "lat": "41.37509", - "lon": "-74.69267", - "id": 158842300, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.37536", - "lon": "-74.68944", - "id": 200976 - } - ], - "matchStreet": 1 - }, - { - "name": "Richfield", - "lat": "42.85730", - "lon": "-75.05404", - "id": 157615530, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Park Drive", - "lat": "42.85426", - "lon": "-74.98469", - "id": 147877 - }, - { - "name": "Spring Street (Richfield Springs)", - "lat": "42.84787", - "lon": "-74.99272", - "id": 147119 - } - ], - "matchStreet": 1 - }, - { - "name": "Gas Spring", - "lat": "42.41535", - "lon": "-77.83417", - "id": 158578109, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Marbletown", - "lat": "41.88343", - "lon": "-74.11320", - "id": 158853544, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Farm Road (Town of Marbletown)", - "lat": "41.79555", - "lon": "-74.12345", - "id": 266055, - "intersectedStreets": [ - { - "name": "Upper 27 Knolls Road", - "lat": "41.79653", - "lon": "-74.12319" - }, - { - "name": "Cedar Drive (Mohonk Lake)", - "lat": "41.79446", - "lon": "-74.12338" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Schuylerville", - "lat": "43.10023", - "lon": "-73.58196", - "id": 158808485, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.10590", - "lon": "-73.58181", - "id": 748 - } - ], - "matchStreet": 1 - }, - { - "name": "Old Forge", - "lat": "43.71007", - "lon": "-74.97434", - "id": 158808482, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.70604", - "lon": "-74.98042", - "id": 111339 - } - ], - "matchStreet": 1 - }, - { - "name": "Cooperstown", - "lat": "42.70063", - "lon": "-74.92432", - "id": 158877089, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.69332", - "lon": "-74.93905", - "id": 147105 - } - ], - "matchStreet": 1 - }, - { - "name": "Long View", - "lat": "42.12450", - "lon": "-79.39227", - "id": 158266803, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.13022", - "lon": "-79.39347", - "id": 91218 - } - ], - "matchStreet": 1 - }, - { - "name": "Melody Lake", - "lat": "41.59482", - "lon": "-74.66516", - "id": 158853548, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "41.60266", - "lon": "-74.67740", - "id": 267396, - "intersectedStreets": [ - { - "name": "Rose Valley Road", - "lat": "41.58974", - "lon": "-74.67019" - }, - { - "name": "Lost Lake Boulevard", - "lat": "41.59250", - "lon": "-74.67208" - }, - { - "name": "Forrestburg Tl", - "lat": "41.59417", - "lon": "-74.67283" - }, - { - "name": "Melody Lake Drive", - "lat": "41.59792", - "lon": "-74.67330" - }, - { - "name": "Lena Road", - "lat": "41.61074", - "lon": "-74.67727" - }, - { - "name": "Kukas Road", - "lat": "41.61206", - "lon": "-74.67755" - }, - { - "name": "Jim Lane", - "lat": "41.61692", - "lon": "-74.67843" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "North Wantagh", - "lat": "40.69344", - "lon": "-73.50762", - "id": 158807468, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "40.69489", - "lon": "-73.50163", - "id": 231124, - "intersectedStreets": [ - { - "name": "Tusk Lane", - "lat": "40.69499", - "lon": "-73.50141" - }, - { - "name": "Fortune Court", - "lat": "40.69486", - "lon": "-73.50242" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Motts Corner", - "lat": "43.02729", - "lon": "-77.40027", - "id": 158404015, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Creek Drive", - "lat": "43.03483", - "lon": "-77.40319", - "id": 130712 - } - ], - "matchStreet": 1 - }, - { - "name": "Sound Beach", - "lat": "40.95621", - "lon": "-72.96788", - "id": 158812585, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Drive", - "lat": "40.96258", - "lon": "-72.96325", - "id": 171047 - } - ], - "matchStreet": 1 - }, - { - "name": "Union Center", - "lat": "42.15147", - "lon": "-76.06909", - "id": 158505368, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.14568", - "lon": "-76.06968", - "id": 74309 - } - ], - "matchStreet": 1 - }, - { - "name": "South Corning", - "lat": "42.12174", - "lon": "-77.03718", - "id": 158622109, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Terrace", - "lat": "42.11846", - "lon": "-77.03521", - "id": 85090 - } - ], - "matchStreet": 1 - }, - { - "name": "Upper Mongaup", - "lat": "41.45760", - "lon": "-74.76488", - "id": 158914965, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cranes Spring Road", - "lat": "41.46228", - "lon": "-74.76218", - "id": 163634, - "intersectedStreets": [ - { - "name": "Powerhouse Road", - "lat": "41.46251", - "lon": "-74.76246" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Hannans Corner", - "lat": "43.06917", - "lon": "-77.44250", - "id": 158438813, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Hill", - "lat": "43.07666", - "lon": "-77.43876", - "id": 122767 - } - ], - "matchStreet": 1 - }, - { - "name": "Southfields", - "lat": "41.24481", - "lon": "-74.17543", - "id": 158899596, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.24351", - "lon": "-74.17512", - "id": 200972 - } - ], - "matchStreet": 1 - }, - { - "name": "Williamsville", - "lat": "42.96379", - "lon": "-78.73773", - "id": 158307739, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "East Spring Street", - "lat": "42.96350", - "lon": "-78.74612", - "id": 67705 - }, - { - "name": "West Spring Street", - "lat": "42.96277", - "lon": "-78.74976", - "id": 71824 - } - ], - "matchStreet": 1 - }, - { - "name": "Muttontown", - "lat": "40.82399", - "lon": "-73.54763", - "id": 158902660, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Court", - "lat": "40.82118", - "lon": "-73.51830", - "id": 222268, - "intersectedStreets": [ - { - "name": "Cecilia Drive", - "lat": "40.82118", - "lon": "-73.51830" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Glenville", - "lat": "41.06565", - "lon": "-73.84069", - "id": 158814605, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring St", - "lat": "41.06560", - "lon": "-73.84033", - "id": 210806, - "intersectedStreets": [ - { - "name": "Old White Plains Road", - "lat": "41.06426", - "lon": "-73.84104" - }, - { - "name": "Benedict Avenue", - "lat": "41.06560", - "lon": "-73.84033" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Cove", - "lat": "44.57117", - "lon": "-74.45600", - "id": 158811511, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Northwest Harbor", - "lat": "41.00982", - "lon": "-72.22119", - "id": 158846325, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Red Spring Path", - "lat": "40.99214", - "lon": "-72.25483", - "id": 170545 - } - ], - "matchStreet": 1 - }, - { - "name": "Buckberg", - "lat": "41.26250", - "lon": "-73.99084", - "id": 158855538, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Drive", - "lat": "41.26700", - "lon": "-73.99391", - "id": 242401, - "intersectedStreets": [ - { - "name": "Crestview Drive", - "lat": "41.26760", - "lon": "-73.99333" - }, - { - "name": "Cortlandt Lane", - "lat": "41.26663", - "lon": "-73.99496" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Hampton Manor", - "lat": "42.61619", - "lon": "-73.72012", - "id": 158865791, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Avenue East", - "lat": "42.61610", - "lon": "-73.72195", - "id": 42219 - } - ], - "matchStreet": 1 - }, - { - "name": "Haydenville", - "lat": "42.11145", - "lon": "-78.37502", - "id": 158428535, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Ponds Lane", - "lat": "42.10854", - "lon": "-78.36277", - "id": 92347 - } - ], - "matchStreet": 1 - }, - { - "name": "Sand Ridge", - "lat": "43.25590", - "lon": "-76.23020", - "id": 158573948, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.26117", - "lon": "-76.21628", - "id": 140509 - } - ], - "matchStreet": 1 - }, - { - "name": "Butler Center", - "lat": "43.16868", - "lon": "-76.77135", - "id": 157545840, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Wolcott Spring Lake Road", - "lat": "43.18756", - "lon": "-76.77248", - "id": 193862 - } - ], - "matchStreet": 1 - }, - { - "name": "Inwood", - "lat": "40.62205", - "lon": "-73.74680", - "id": 158802280, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.62107", - "lon": "-73.73562", - "id": 225794 - } - ], - "matchStreet": 1 - }, - { - "name": "Manhasset", - "lat": "40.79788", - "lon": "-73.69957", - "id": 158863724, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Mill Spring Road", - "lat": "40.78860", - "lon": "-73.68170", - "id": 234125, - "intersectedStreets": [ - { - "name": "Country Club Drive (Strathmore)", - "lat": "40.78912", - "lon": "-73.67927" - }, - { - "name": "Castle Ridge Road", - "lat": "40.78860", - "lon": "-73.68159" - }, - { - "name": "Payne Whitney Lane", - "lat": "40.78959", - "lon": "-73.68378" - }, - { - "name": "Old Mill Road (Strathmore)", - "lat": "40.79476", - "lon": "-73.67803" - }, - { - "name": "Short Drive (Strathmore)", - "lat": "40.79398", - "lon": "-73.67784" - }, - { - "name": "Rockcrest Road", - "lat": "40.79325", - "lon": "-73.67764" - }, - { - "name": "Hilltop Drive (Strathmore)", - "lat": "40.79221", - "lon": "-73.67738" - }, - { - "name": "Woodland Way (Strathmore)", - "lat": "40.79050", - "lon": "-73.67781" - }, - { - "name": "Chapel Road (Strathmore)", - "lat": "40.79011", - "lon": "-73.67889" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Nelsonville", - "lat": "41.42464", - "lon": "-73.94673", - "id": 158844268, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.42456", - "lon": "-73.94674", - "id": 237496 - } - ], - "matchStreet": 1 - }, - { - "name": "Fay", - "lat": "44.89283", - "lon": "-74.34268", - "id": 158861672, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "44.89960", - "lon": "-74.38551", - "id": 107558 - } - ], - "matchStreet": 1 - }, - { - "name": "Cold Spring", - "lat": "42.94979", - "lon": "-76.57716", - "id": 158233676, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Munro Street", - "lat": "42.94830", - "lon": "-76.57810", - "id": 88755 - }, - { - "name": "State Street", - "lat": "42.94934", - "lon": "-76.57737", - "id": 261144 - } - ], - "matchCity": 1 - }, - { - "name": "Clifton Springs", - "lat": "42.96173", - "lon": "-77.13998", - "id": 158224457, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.96366", - "lon": "-77.13625", - "id": 127755 - } - ], - "matchStreet": 1 - }, - { - "name": "East Massapequa", - "lat": "40.67344", - "lon": "-73.43651", - "id": 158821470, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.66410", - "lon": "-73.43195", - "id": 225796 - } - ], - "matchStreet": 1 - }, - { - "name": "Gardnertown", - "lat": "41.53509", - "lon": "-74.07015", - "id": 158813277, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Square Business Park", - "lat": "41.52887", - "lon": "-74.07206", - "id": 202448 - } - ], - "matchStreet": 1 - }, - { - "name": "Jewett", - "lat": "42.27036", - "lon": "-74.30292", - "id": 158814299, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Silver Spring Road (Town of Jewett)", - "lat": "42.22601", - "lon": "-74.27618", - "id": 111642 - } - ], - "matchStreet": 1 - }, - { - "name": "Tomkins Cove", - "lat": "41.25704", - "lon": "-73.98348", - "id": 158863433, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.25621", - "lon": "-73.98196", - "id": 244099 - } - ], - "matchStreet": 1 - }, - { - "name": "Ramapo", - "lat": "41.14120", - "lon": "-74.16850", - "id": 158818371, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Spring Hill Terrace", - "lat": "41.07380", - "lon": "-74.06358", - "id": 242838, - "intersectedStreets": [ - { - "name": "Chestnut Ridge Road (Chestnut Ridge)", - "lat": "41.07477", - "lon": "-74.06487" - }, - { - "name": "Orchard Court (Chestnut Ridge)", - "lat": "41.07380", - "lon": "-74.06358" - }, - { - "name": "Brian Terrace", - "lat": "41.07130", - "lon": "-74.06158" - } - ] - }, - { - "name": "Spring Rock Place", - "lat": "41.14378", - "lon": "-74.04910", - "id": 243011, - "intersectedStreets": [ - { - "name": "Brick Church Road (New Hempstead)", - "lat": "41.14255", - "lon": "-74.04927" - }, - { - "name": "Zavatone Court", - "lat": "41.14316", - "lon": "-74.04918" - }, - { - "name": "Wits End (New Hempstead)", - "lat": "41.14468", - "lon": "-74.04968" - } - ] - }, - { - "name": "Spring Valley Commons Road", - "lat": "41.12349", - "lon": "-74.03824", - "id": 294292, - "intersectedStreets": [ - { - "name": "Slinn Avenue", - "lat": "41.12367", - "lon": "-74.03682" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Avon", - "lat": "42.91199", - "lon": "-77.74546", - "id": 158573646, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.90605", - "lon": "-77.75087", - "id": 117437 - } - ], - "matchStreet": 1 - }, - { - "name": "Cold Spring", - "lat": "42.09700", - "lon": "-78.86476", - "id": 158332972, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Conklin", - "lat": "42.03424", - "lon": "-75.80380", - "id": 158426165, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hollow Drive", - "lat": "42.05321", - "lon": "-75.83377", - "id": 74650 - } - ], - "matchStreet": 1 - }, - { - "name": "Esperance", - "lat": "42.76118", - "lon": "-74.25652", - "id": 158843944, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Lane", - "lat": "42.76497", - "lon": "-74.29713", - "id": 147535 - } - ], - "matchStreet": 1 - }, - { - "name": "Palmyra", - "lat": "43.06237", - "lon": "-77.23472", - "id": 158634018, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.05751", - "lon": "-77.22773", - "id": 193444 - } - ], - "matchStreet": 1 - }, - { - "name": "Fostertown", - "lat": "41.55343", - "lon": "-74.04542", - "id": 158860334, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Lane", - "lat": "41.55365", - "lon": "-74.04141", - "id": 199429, - "intersectedStreets": [ - { - "name": "Ramble Wood Drive", - "lat": "41.55343", - "lon": "-74.04210" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Alma", - "lat": "42.01257", - "lon": "-78.05779", - "id": 158347305, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Appalachian Spring Trail", - "lat": "42.00980", - "lon": "-78.00593", - "id": 85734 - } - ], - "matchStreet": 1 - }, - { - "name": "Austerlitz", - "lat": "42.31175", - "lon": "-73.47317", - "id": 158861346, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Lane (Town of Austerlitz)", - "lat": "42.29318", - "lon": "-73.56909", - "id": 293608 - } - ], - "matchStreet": 1 - }, - { - "name": "Quaker Springs", - "lat": "43.03952", - "lon": "-73.64289", - "id": 158843951, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "43.03954", - "lon": "-73.64288", - "id": 46091 - }, - { - "name": "Quaker Spring Road", - "lat": "43.04096", - "lon": "-73.64082", - "id": 48315 - } - ], - "matchStreet": 1 - }, - { - "name": "Richfield Springs", - "lat": "42.85340", - "lon": "-74.98543", - "id": 158895143, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Park Drive", - "lat": "42.85428", - "lon": "-74.98469", - "id": 147876 - } - ], - "matchStreet": 1 - }, - { - "name": "Brockport", - "lat": "43.21367", - "lon": "-77.93918", - "id": 158276657, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.21214", - "lon": "-77.93446", - "id": 124780 - } - ], - "matchStreet": 1 - }, - { - "name": "Bethel", - "lat": "41.68343", - "lon": "-74.87128", - "id": 158805015, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Smallwood)", - "lat": "41.66224", - "lon": "-74.81885", - "id": 153162 - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Mills", - "lat": "42.00784", - "lon": "-77.76360", - "id": 158224398, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Mills Road", - "lat": "42.00383", - "lon": "-77.76591", - "id": 82939 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Lysander", - "lat": "43.20646", - "lon": "-76.45910", - "id": 158652433, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Warming Spring", - "lat": "43.19904", - "lon": "-76.29140", - "id": 140641 - } - ], - "matchStreet": 1 - }, - { - "name": "Ravena", - "lat": "42.46842", - "lon": "-73.81624", - "id": 158801923, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.48098", - "lon": "-73.81360", - "id": 35862 - } - ], - "matchStreet": 1 - }, - { - "name": "South Canisteo", - "lat": "42.19591", - "lon": "-77.55054", - "id": 158657521, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Red Spring Run", - "lat": "42.19781", - "lon": "-77.57569", - "id": 83245 - }, - { - "name": "Spring Brook Road", - "lat": "42.22116", - "lon": "-77.56534", - "id": 85516 - } - ], - "matchStreet": 1 - }, - { - "name": "Fine", - "lat": "44.24790", - "lon": "-75.13790", - "id": 158377974, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring", - "lat": "44.24887", - "lon": "-75.14022", - "id": 61590 - }, - { - "name": "Spring Street", - "lat": "44.24880", - "lon": "-75.13882", - "id": 61675 - }, - { - "name": "SPRING ST", - "lat": "44.24857", - "lon": "-75.14161", - "id": 5786 - } - ], - "matchStreet": 1 - }, - { - "name": "Potsdam", - "lat": "44.66980", - "lon": "-74.98134", - "id": 158895102, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.66179", - "lon": "-74.97862", - "id": 61672 - } - ], - "matchStreet": 1 - }, - { - "name": "Ballston Spa", - "lat": "43.00091", - "lon": "-73.84901", - "id": 158844913, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.00334", - "lon": "-73.85038", - "id": 50651 - } - ], - "matchStreet": 1 - }, - { - "name": "Westfield", - "lat": "42.32228", - "lon": "-79.57811", - "id": 158473206, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.32094", - "lon": "-79.56805", - "id": 91219 - }, - { - "name": "Spring View Drive", - "lat": "42.32213", - "lon": "-79.56707", - "id": 95178 - } - ], - "matchStreet": 1 - }, - { - "name": "Barrington", - "lat": "42.54702", - "lon": "-77.05608", - "id": 158503930, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Crystal Springs Road (Crystal Spring)", - "lat": "42.48447", - "lon": "-77.05154", - "id": 148669 - } - ], - "matchStreet": 1 - }, - { - "name": "Hudson Falls", - "lat": "43.30070", - "lon": "-73.58608", - "id": 158844925, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.30566", - "lon": "-73.58876", - "id": 189280 - } - ], - "matchStreet": 1 - }, - { - "name": "Centerport", - "lat": "40.88537", - "lon": "-73.37623", - "id": 158825446, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Hollow Road (Huntington)", - "lat": "40.89684", - "lon": "-73.36453", - "id": 280967 - } - ], - "matchStreet": 1 - }, - { - "name": "Livonia", - "lat": "42.82145", - "lon": "-77.66861", - "id": 158603233, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.81766", - "lon": "-77.66740", - "id": 117434 - } - ], - "matchStreet": 1 - }, - { - "name": "Broadalbin", - "lat": "43.05868", - "lon": "-74.19652", - "id": 158798830, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.05757", - "lon": "-74.19293", - "id": 105334 - } - ], - "matchStreet": 1 - }, - { - "name": "Dundee", - "lat": "42.52340", - "lon": "-76.97663", - "id": 158503919, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.52219", - "lon": "-76.97946", - "id": 196082 - } - ], - "matchStreet": 1 - }, - { - "name": "Goshen", - "lat": "41.40203", - "lon": "-74.32432", - "id": 158876645, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.40084", - "lon": "-74.33579", - "id": 200970 - }, - { - "name": "Spring Rock Drive", - "lat": "41.40974", - "lon": "-74.33058", - "id": 199633, - "intersectedStreets": [ - { - "name": "Gregory Drive", - "lat": "41.41064", - "lon": "-74.33154" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "New Lebanon", - "lat": "42.46397", - "lon": "-73.39649", - "id": 158803156, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Road (Lebanon Springs)", - "lat": "42.48011", - "lon": "-73.37013", - "id": 99307 - }, - { - "name": "Crystal Spring", - "lat": "42.47808", - "lon": "-73.37050", - "id": 102726 - } - ], - "matchStreet": 1 - }, - { - "name": "Keeseville", - "lat": "44.50505", - "lon": "-73.48014", - "id": 158820562, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.50093", - "lon": "-73.47892", - "id": 106726 - } - ], - "matchStreet": 1 - }, - { - "name": "Noyack", - "lat": "40.99566", - "lon": "-72.34119", - "id": 158868704, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "40.99418", - "lon": "-72.33555", - "id": 162494 - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Lake", - "lat": "43.12562", - "lon": "-76.68800", - "id": 158370009, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Peters Road", - "lat": "43.13677", - "lon": "-76.72369", - "id": 192870 - }, - { - "name": "Wolcott Spring Lake Road", - "lat": "43.14718", - "lon": "-76.71663", - "id": 193861 - }, - { - "name": "Saeli Road", - "lat": "43.15935", - "lon": "-76.71086", - "id": 193210 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Kingsbury", - "lat": "43.36368", - "lon": "-73.53150", - "id": 158903506, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street (Hudson Falls)", - "lat": "43.30568", - "lon": "-73.58879", - "id": 189281 - } - ], - "matchStreet": 1 - }, - { - "name": "South Argyle", - "lat": "43.18480", - "lon": "-73.49373", - "id": 158859475, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Lick Spring Road", - "lat": "43.19729", - "lon": "-73.50643", - "id": 193534 - } - ], - "matchStreet": 1 - }, - { - "name": "Sour Spring Grove", - "lat": "43.01228", - "lon": "-78.92310", - "id": 158414043, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Copake", - "lat": "42.10356", - "lon": "-73.54966", - "id": 158872792, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Copake Lake)", - "lat": "42.15403", - "lon": "-73.58432", - "id": 98395 - } - ], - "matchStreet": 1 - }, - { - "name": "Howes Landing", - "lat": "43.81534", - "lon": "-73.43595", - "id": 158821593, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Pine Spring Park Road", - "lat": "43.83143", - "lon": "-73.44296", - "id": 106843 - } - ], - "matchStreet": 1 - }, - { - "name": "Colton", - "lat": "44.55329", - "lon": "-74.93980", - "id": 158810310, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.55560", - "lon": "-74.93676", - "id": 61674 - }, - { - "name": "SPRING ST", - "lat": "44.55543", - "lon": "-74.93779", - "id": 4478 - } - ], - "matchStreet": 1 - }, - { - "name": "Ballston Center", - "lat": "42.95591", - "lon": "-73.86540", - "id": 158810307, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Circle", - "lat": "42.96870", - "lon": "-73.86872", - "id": 274322 - } - ], - "matchStreet": 1 - }, - { - "name": "Walworth", - "lat": "43.13923", - "lon": "-77.27221", - "id": 158569669, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Day Spring Ridge", - "lat": "43.12370", - "lon": "-77.30779", - "id": 193983 - } - ], - "matchStreet": 1 - }, - { - "name": "Adams", - "lat": "43.80923", - "lon": "-76.02409", - "id": 158449866, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.80486", - "lon": "-76.00331", - "id": 113025 - } - ], - "matchStreet": 1 - }, - { - "name": "Ellenburg", - "lat": "44.89407", - "lon": "-73.83671", - "id": 158818508, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "44.89586", - "lon": "-73.82083", - "id": 99025 - } - ], - "matchStreet": 1 - }, - { - "name": "Melville", - "lat": "40.79343", - "lon": "-73.41512", - "id": 158822603, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Drive (Wheatley Heights)", - "lat": "40.77009", - "lon": "-73.37631", - "id": 161283, - "intersectedStreets": [ - { - "name": "Chateau Drive (Wheatley Heights)", - "lat": "40.77001", - "lon": "-73.37661" - }, - { - "name": "Kallenberger Drive", - "lat": "40.77092", - "lon": "-73.37369" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Waverly", - "lat": "42.01035", - "lon": "-76.52717", - "id": 158518477, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.01088", - "lon": "-76.53538", - "id": 81012 - } - ], - "matchStreet": 1 - }, - { - "name": "Cokertown", - "lat": "42.01926", - "lon": "-73.82124", - "id": 158844105, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lake Road", - "lat": "42.02532", - "lon": "-73.81596", - "id": 267094 - } - ], - "matchStreet": 1 - }, - { - "name": "Diamond Point (hamlet)", - "lat": "43.47924", - "lon": "-73.68706", - "id": 158816435, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Woods", - "lat": "43.48271", - "lon": "-73.71637", - "id": 293922 - } - ], - "matchStreet": 1 - }, - { - "name": "Deer River", - "lat": "43.92979", - "lon": "-75.58908", - "id": 158270633, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Park Road", - "lat": "43.93604", - "lon": "-75.55989", - "id": 113889 - } - ], - "matchStreet": 1 - }, - { - "name": "Mohawk", - "lat": "43.01146", - "lon": "-75.00405", - "id": 158635197, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.00352", - "lon": "-75.00928", - "id": 111337 - } - ], - "matchStreet": 1 - }, - { - "name": "East Syracuse", - "lat": "43.06534", - "lon": "-76.07853", - "id": 157642924, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.06729", - "lon": "-76.06457", - "id": 141281 - } - ], - "matchStreet": 1 - }, - { - "name": "Gurn Spring", - "lat": "43.17091", - "lon": "-73.71762", - "id": 158843046, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "North Road", - "lat": "43.17254", - "lon": "-73.71717", - "id": 35685 - } - ], - "matchCity": 1 - }, - { - "name": "Carlisle Gardens", - "lat": "43.17922", - "lon": "-78.65587", - "id": 158618785, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.17406", - "lon": "-78.68174", - "id": 57875 - }, - { - "name": "Cold Spring Alley", - "lat": "43.17481", - "lon": "-78.68116", - "id": 58327 - } - ], - "matchStreet": 1 - }, - { - "name": "Conquest", - "lat": "43.12117", - "lon": "-76.64801", - "id": 157617329, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Lake Road (Town of Conquest)", - "lat": "43.10670", - "lon": "-76.66406", - "id": 89658 - } - ], - "matchStreet": 1 - }, - { - "name": "Berlin", - "lat": "42.69314", - "lon": "-73.37205", - "id": 158915747, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Lake Road (Town of Berlin)", - "lat": "42.65495", - "lon": "-73.42283", - "id": 44198 - } - ], - "matchStreet": 1 - }, - { - "name": "Campville", - "lat": "42.08758", - "lon": "-76.14882", - "id": 158343313, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.08770", - "lon": "-76.14463", - "id": 296659 - } - ], - "matchStreet": 1 - }, - { - "name": "Newrys", - "lat": "42.43786", - "lon": "-73.98985", - "id": 158853271, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Valley Road", - "lat": "42.42700", - "lon": "-73.96133", - "id": 110232 - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Brook Station", - "lat": "42.83894", - "lon": "-78.68003", - "id": 158477457, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Sand Lake", - "lat": "42.63731", - "lon": "-73.54067", - "id": 158844051, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Brook Spring Avenue (Town of Sand Lake)", - "lat": "42.59807", - "lon": "-73.56825", - "id": 41438 - } - ], - "matchStreet": 1 - }, - { - "name": "West Hills", - "lat": "40.81621", - "lon": "-73.43235", - "id": 158806162, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Lane", - "lat": "40.83377", - "lon": "-73.45030", - "id": 181365, - "intersectedStreets": [ - { - "name": "East Gate Drive", - "lat": "40.83321", - "lon": "-73.45041" - } - ] - }, - { - "name": "Cold Spring Hills Road", - "lat": "40.83402", - "lon": "-73.44094", - "id": 160408, - "intersectedStreets": [ - { - "name": "West Rogues Path", - "lat": "40.83755", - "lon": "-73.44375" - }, - { - "name": "Ledgewood Drive", - "lat": "40.83727", - "lon": "-73.44337" - }, - { - "name": "Hamilton Lane", - "lat": "40.83503", - "lon": "-73.44129" - }, - { - "name": "22nd Street", - "lat": "40.83156", - "lon": "-73.43996" - }, - { - "name": "Lee Street", - "lat": "40.83070", - "lon": "-73.43963" - }, - { - "name": "Colonial Drive", - "lat": "40.83003", - "lon": "-73.43938" - }, - { - "name": "Sherman Street", - "lat": "40.83003", - "lon": "-73.43938" - }, - { - "name": "Sheridan Street", - "lat": "40.82937", - "lon": "-73.43908" - }, - { - "name": "Nimitz Street", - "lat": "40.82872", - "lon": "-73.43882" - }, - { - "name": "Clark Street", - "lat": "40.82805", - "lon": "-73.43854" - }, - { - "name": "Bluebird Lane", - "lat": "40.82737", - "lon": "-73.43822" - }, - { - "name": "Hartman Hill Road", - "lat": "40.82737", - "lon": "-73.43822" - }, - { - "name": "West Jericho Turnpike", - "lat": "40.82737", - "lon": "-73.43822" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Hampton Manor", - "lat": "42.62091", - "lon": "-73.72845", - "id": 158853265, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Avenue East", - "lat": "42.61610", - "lon": "-73.72195", - "id": 42218 - }, - { - "name": "Spring Place", - "lat": "42.61602", - "lon": "-73.72303", - "id": 42261 - }, - { - "name": "Spring Avenue West", - "lat": "42.61563", - "lon": "-73.72805", - "id": 45765 - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Brook", - "lat": "42.81812", - "lon": "-78.67558", - "id": 157576330, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Summit", - "lat": "42.57952", - "lon": "-74.58820", - "id": 158845064, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Willow Spring Road", - "lat": "42.51856", - "lon": "-74.69336", - "id": 149222 - } - ], - "matchStreet": 1 - }, - { - "name": "Coram", - "lat": "40.86871", - "lon": "-73.00149", - "id": 158869643, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Court", - "lat": "40.91744", - "lon": "-73.02061", - "id": 180219, - "intersectedStreets": [ - { - "name": "Pine Street", - "lat": "40.91744", - "lon": "-73.02061" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Fairport", - "lat": "43.09930", - "lon": "-77.44301", - "id": 157572241, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Crystal Spring Lane", - "lat": "43.09462", - "lon": "-77.46990", - "id": 271659 - }, - { - "name": "Little Spring Run", - "lat": "43.06527", - "lon": "-77.46127", - "id": 7042 - } - ], - "matchStreet": 1 - }, - { - "name": "Thousand Island Park", - "lat": "44.28699", - "lon": "-76.02773", - "id": 158350469, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.28907", - "lon": "-76.02874", - "id": 113027 - } - ], - "matchStreet": 1 - }, - { - "name": "Modena", - "lat": "41.66842", - "lon": "-74.10264", - "id": 158875791, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Breeze Lane", - "lat": "41.68145", - "lon": "-74.10504", - "id": 169016, - "intersectedStreets": [ - { - "name": "State Highway 32", - "lat": "41.68125", - "lon": "-74.10401" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Crawford", - "lat": "41.65565", - "lon": "-74.32821", - "id": 158876805, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Indian Spring Camp Road", - "lat": "41.65286", - "lon": "-74.32642", - "id": 177421, - "intersectedStreets": [ - { - "name": "Indian Springs Road", - "lat": "41.65419", - "lon": "-74.32513" - }, - { - "name": "Spadola Lane", - "lat": "41.65419", - "lon": "-74.32513" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "McGraw", - "lat": "42.59618", - "lon": "-76.09326", - "id": 158598282, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.59211", - "lon": "-76.08953", - "id": 101627 - } - ], - "matchStreet": 1 - }, - { - "name": "Braeside", - "lat": "42.53703", - "lon": "-73.60873", - "id": 158856312, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Avenue", - "lat": "42.53718", - "lon": "-73.61323", - "id": 41692 - } - ], - "matchStreet": 1 - }, - { - "name": "Chemung", - "lat": "42.00841", - "lon": "-76.62374", - "id": 158488692, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Water Drive", - "lat": "42.00487", - "lon": "-76.60280", - "id": 95966 - } - ], - "matchStreet": 1 - }, - { - "name": "Mosher Corners", - "lat": "42.59090", - "lon": "-76.40133", - "id": 158325859, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.59078", - "lon": "-76.40092", - "id": 155278 - } - ], - "matchStreet": 1 - }, - { - "name": "Forestport", - "lat": "43.44220", - "lon": "-75.20725", - "id": 157573236, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Town of Forestport)", - "lat": "43.40916", - "lon": "-75.18931", - "id": 144837 - } - ], - "matchStreet": 1 - }, - { - "name": "Seneca Falls", - "lat": "42.91072", - "lon": "-76.79678", - "id": 158573669, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "South Spring Street", - "lat": "42.90217", - "lon": "-76.79518", - "id": 150858 - }, - { - "name": "Spring Street", - "lat": "42.90627", - "lon": "-76.79467", - "id": 151489 - } - ], - "matchStreet": 1 - }, - { - "name": "Fairview", - "lat": "41.72371", - "lon": "-73.91986", - "id": 158814305, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.72360", - "lon": "-73.91986", - "id": 249366 - } - ], - "matchStreet": 1 - }, - { - "name": "Middleburgh", - "lat": "42.59869", - "lon": "-74.33292", - "id": 158813293, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Indian Spring Lane", - "lat": "42.58928", - "lon": "-74.33706", - "id": 150010 - } - ], - "matchStreet": 1 - }, - { - "name": "Groveville", - "lat": "41.51537", - "lon": "-73.93959", - "id": 158821484, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.51804", - "lon": "-73.94447", - "id": 249365 - } - ], - "matchStreet": 1 - }, - { - "name": "Canisteo", - "lat": "42.27035", - "lon": "-77.60582", - "id": 158637163, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.27091", - "lon": "-77.61150", - "id": 83080 - } - ], - "matchStreet": 1 - }, - { - "name": "Sodus", - "lat": "43.23784", - "lon": "-77.06137", - "id": 158270285, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.24200", - "lon": "-77.06199", - "id": 193445 - } - ], - "matchStreet": 1 - }, - { - "name": "Willow Glen", - "lat": "42.48980", - "lon": "-76.32799", - "id": 158562134, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Run Road", - "lat": "42.48303", - "lon": "-76.34524", - "id": 158263 - } - ], - "matchStreet": 1 - }, - { - "name": "Fayetteville", - "lat": "43.02979", - "lon": "-76.00436", - "id": 158231390, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.02744", - "lon": "-76.00503", - "id": 141278 - } - ], - "matchStreet": 1 - }, - { - "name": "Westmoreland", - "lat": "43.11627", - "lon": "-75.40398", - "id": 158524232, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring House Road (Lowell)", - "lat": "43.13081", - "lon": "-75.50002", - "id": 145843 - } - ], - "matchStreet": 1 - }, - { - "name": "Mount Morris", - "lat": "42.72562", - "lon": "-77.87417", - "id": 158260049, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.71864", - "lon": "-77.86991", - "id": 117439 - } - ], - "matchStreet": 1 - }, - { - "name": "Valley Brook", - "lat": "42.92897", - "lon": "-74.65903", - "id": 158814025, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.92504", - "lon": "-74.66897", - "id": 123559 - } - ], - "matchStreet": 1 - }, - { - "name": "Powers Corner", - "lat": "42.85951", - "lon": "-76.66439", - "id": 158355249, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street Road", - "lat": "42.84650", - "lon": "-76.65796", - "id": 89014 - } - ], - "matchStreet": 1 - }, - { - "name": "Dryden", - "lat": "42.49090", - "lon": "-76.29715", - "id": 158231341, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring House Road", - "lat": "42.49268", - "lon": "-76.31370", - "id": 158808 - } - ], - "matchStreet": 1 - }, - { - "name": "Brinckerhoff", - "lat": "41.54398", - "lon": "-73.86819", - "id": 158811967, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "41.54048", - "lon": "-73.86911", - "id": 273691, - "intersectedStreets": [ - { - "name": "E Merritt Blvd", - "lat": "41.53981", - "lon": "-73.86917" - }, - { - "name": "Hustis Lane", - "lat": "41.54116", - "lon": "-73.86791" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Bardonia", - "lat": "41.10957", - "lon": "-73.99525", - "id": 158827326, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Oak Spring Road", - "lat": "41.11557", - "lon": "-73.97406", - "id": 241860, - "intersectedStreets": [ - { - "name": "Rockford Drive (Germonds)", - "lat": "41.11418", - "lon": "-73.97483" - }, - { - "name": "Melrose Lane", - "lat": "41.11708", - "lon": "-73.97258" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Savannah", - "lat": "43.06729", - "lon": "-76.75967", - "id": 158341950, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Lake Road (Savannah Town)", - "lat": "43.12562", - "lon": "-76.70532", - "id": 89660 - }, - { - "name": "Savannah Spring Lake Road", - "lat": "43.07372", - "lon": "-76.74274", - "id": 193432 - } - ], - "matchStreet": 1 - }, - { - "name": "Manhattan", - "names": { - "ru": "Манхэттен", - "uk": "Мангеттен", - "lt": "Manhatanas", - "he": "מנהטן" - }, - "lat": "40.79009", - "lon": "-73.95983", - "id": 357644127, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Spring Street (Little Italy)", - "lat": "40.72157", - "lon": "-73.99562", - "id": 7485 - } - ], - "matchStreet": 1 - }, - { - "name": "Corbin Corner", - "lat": "42.44701", - "lon": "-75.72519", - "id": 158463778, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Sulphur Spring Road", - "lat": "42.44875", - "lon": "-75.76039", - "id": 98728 - } - ], - "matchStreet": 1 - }, - { - "name": "Pleasantville", - "lat": "41.13288", - "lon": "-73.79263", - "id": 158853923, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.13156", - "lon": "-73.79735", - "id": 210796 - } - ], - "matchStreet": 1 - }, - { - "name": "Lloyd Harbor", - "lat": "40.90343", - "lon": "-73.45985", - "id": 158805806, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Bay Lane", - "lat": "40.92804", - "lon": "-73.48993", - "id": 167119, - "intersectedStreets": [ - { - "name": "Watch Way", - "lat": "40.92590", - "lon": "-73.48965" - }, - { - "name": "Lloyd Lane", - "lat": "40.92930", - "lon": "-73.49010" - }, - { - "name": "Lloyd Cove Court", - "lat": "40.92930", - "lon": "-73.49010" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Malone", - "lat": "44.84881", - "lon": "-74.29504", - "id": 158865177, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Flower Drive", - "lat": "44.83527", - "lon": "-74.29762", - "id": 108617 - } - ], - "matchStreet": 1 - }, - { - "name": "Maybrook", - "lat": "41.48398", - "lon": "-74.21765", - "id": 158853910, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.48574", - "lon": "-74.21462", - "id": 200974 - }, - { - "name": "West Spring Street", - "lat": "41.48608", - "lon": "-74.21520", - "id": 204416 - } - ], - "matchStreet": 1 - }, - { - "name": "Brewster Hill", - "lat": "41.42416", - "lon": "-73.60414", - "id": 158842643, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "41.43272", - "lon": "-73.61297", - "id": 237684, - "intersectedStreets": [ - { - "name": "Spring Knoll Road", - "lat": "41.43279", - "lon": "-73.61260" - } - ] - }, - { - "name": "Spring Knoll Road", - "lat": "41.43230", - "lon": "-73.61177", - "id": 241153, - "intersectedStreets": [ - { - "name": "State Highway 312", - "lat": "41.43324", - "lon": "-73.61271" - }, - { - "name": "Spring Lane", - "lat": "41.43277", - "lon": "-73.61258" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Tivoli", - "lat": "42.05853", - "lon": "-73.90891", - "id": 158844689, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.05635", - "lon": "-73.90887", - "id": 249367 - } - ], - "matchStreet": 1 - }, - { - "name": "Sanford", - "lat": "42.10231", - "lon": "-75.48351", - "id": 158646045, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Road (Sanford Town)", - "lat": "42.05858", - "lon": "-75.55051", - "id": 74648 - } - ], - "matchStreet": 1 - }, - { - "name": "East Middletown", - "lat": "41.44463", - "lon": "-74.40036", - "id": 158815008, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.44191", - "lon": "-74.41673", - "id": 35233 - } - ], - "matchStreet": 1 - }, - { - "name": "Grays Corners", - "lat": "42.81980", - "lon": "-73.75873", - "id": 158898961, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Kendall Drive", - "names": { - "alt_name": "Spring Brook Mobile Home Park" - }, - "lat": "42.82092", - "lon": "-73.75815", - "id": 51507 - }, - { - "name": "Jacob Drive", - "names": { - "alt_name": "Spring Brook Mobile Home Park" - }, - "lat": "42.82152", - "lon": "-73.75877", - "id": 51512 - } - ], - "matchStreet": 1 - }, - { - "name": "Rockland", - "lat": "41.94537", - "lon": "-74.91294", - "id": 158810888, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Livingston Manor)", - "lat": "41.89563", - "lon": "-74.83110", - "id": 153171 - } - ], - "matchStreet": 1 - }, - { - "name": "Nashville", - "lat": "43.07728", - "lon": "-78.86587", - "id": 158573315, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Court", - "lat": "43.08024", - "lon": "-78.86261", - "id": 60471 - } - ], - "matchStreet": 1 - }, - { - "name": "Dresden", - "lat": "43.67257", - "lon": "-73.41067", - "id": 158810884, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "43.68362", - "lon": "-73.42485", - "id": 190211 - } - ], - "matchStreet": 1 - }, - { - "name": "South Salem", - "lat": "41.27232", - "lon": "-73.55291", - "id": 158856974, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.27307", - "lon": "-73.55490", - "id": 294226 - } - ], - "matchStreet": 1 - }, - { - "name": "Bushnell Basin", - "lat": "43.05951", - "lon": "-77.47416", - "id": 158269203, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Little Spring Run", - "lat": "43.06572", - "lon": "-77.46260", - "id": 119447 - } - ], - "matchStreet": 1 - }, - { - "name": "Hawthorne", - "lat": "41.10732", - "lon": "-73.79597", - "id": 158843640, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street (Mount Pleasant)", - "lat": "41.10029", - "lon": "-73.79313", - "id": 210804 - } - ], - "matchStreet": 1 - }, - { - "name": "Bergen", - "lat": "43.08539", - "lon": "-77.94171", - "id": 158442230, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.08624", - "lon": "-77.93980", - "id": 197234 - } - ], - "matchStreet": 1 - }, - { - "name": "Gilbertsville", - "lat": "42.47146", - "lon": "-75.32573", - "id": 158569207, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.46334", - "lon": "-75.32124", - "id": 147111 - } - ], - "matchStreet": 1 - }, - { - "name": "Miller Place", - "lat": "40.95982", - "lon": "-72.99621", - "id": 158842620, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Drive", - "lat": "40.96258", - "lon": "-72.96323", - "id": 171048 - }, - { - "name": "Spring Street", - "lat": "40.91912", - "lon": "-72.96722", - "id": 182504 - }, - { - "name": "Spring Garden Road", - "lat": "40.96144", - "lon": "-72.95061", - "id": 172952 - } - ], - "matchStreet": 1 - }, - { - "name": "Pound Ridge", - "lat": "41.20870", - "lon": "-73.57485", - "id": 158896874, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring House Road (Town of Pound Ridge)", - "lat": "41.22638", - "lon": "-73.59883", - "id": 218675, - "intersectedStreets": [ - { - "name": "Honey Hollow Road (Town of Pound Ridge)", - "lat": "41.22520", - "lon": "-73.60254" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Esopus", - "lat": "41.82787", - "lon": "-73.96514", - "id": 158852841, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Port Ewen)", - "lat": "41.91063", - "lon": "-73.99249", - "id": 178520 - } - ], - "matchStreet": 1 - }, - { - "name": "Baldwin Place", - "lat": "41.34759", - "lon": "-73.76208", - "id": 158839529, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Drive", - "lat": "41.34684", - "lon": "-73.76231", - "id": 238335, - "intersectedStreets": [ - { - "name": "Kennard Road", - "lat": "41.34568", - "lon": "-73.76268" - }, - { - "name": "Hickory Road", - "lat": "41.34695", - "lon": "-73.76229" - }, - { - "name": "Maple Drive", - "lat": "41.34819", - "lon": "-73.76204" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Valley", - "lat": "41.16870", - "lon": "-73.83875", - "id": 158821335, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Belle Avenue", - "lat": "41.16883", - "lon": "-73.84010", - "id": 215192 - }, - { - "name": "Briarcliff-Peekskill Parkway", - "lat": "41.16856", - "lon": "-73.83857", - "id": 210672 - }, - { - "name": "Cooper Drive", - "lat": "41.17189", - "lon": "-73.83237", - "id": 211053 - }, - { - "name": "Croton Avenue", - "lat": "41.16835", - "lon": "-73.83812", - "id": 218256 - }, - { - "name": "Decker Road", - "lat": "41.16725", - "lon": "-73.83658", - "id": 211470 - }, - { - "name": "Leawood Drive", - "lat": "41.16478", - "lon": "-73.83572", - "id": 213814 - }, - { - "name": "Mohegan Road", - "lat": "41.16728", - "lon": "-73.84018", - "id": 209119 - }, - { - "name": "Pugsley Place", - "lat": "41.16984", - "lon": "-73.84061", - "id": 215045 - }, - { - "name": "Robin Drive", - "lat": "41.16846", - "lon": "-73.83302", - "id": 213187 - }, - { - "name": "Tuttle Drive", - "lat": "41.16824", - "lon": "-73.83499", - "id": 219535 - }, - { - "name": "Upper Croton Avenue", - "lat": "41.16828", - "lon": "-73.83853", - "id": 215261 - }, - { - "name": "Ganung Drive", - "lat": "41.16828", - "lon": "-73.83615", - "id": 218305 - }, - { - "name": "Sleator Drive", - "lat": "41.16751", - "lon": "-73.83137", - "id": 209791 - } - ], - "matchCity": 1 - }, - { - "name": "West Babylon", - "lat": "40.71815", - "lon": "-73.35429", - "id": 158901210, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Place (ny)", - "lat": "40.73100", - "lon": "-73.35992", - "id": 284778 - } - ], - "matchStreet": 1 - }, - { - "name": "Warrensburg", - "lat": "43.49677", - "lon": "-73.77628", - "id": 158904280, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Old Spring Road", - "lat": "43.45812", - "lon": "-73.78218", - "id": 293683 - } - ], - "matchStreet": 1 - }, - { - "name": "Mariaville Lake", - "lat": "42.82480", - "lon": "-74.12874", - "id": 158806992, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "42.82764", - "lon": "-74.11795", - "id": 47070 - } - ], - "matchStreet": 1 - }, - { - "name": "Spring Glen", - "lat": "41.66565", - "lon": "-74.42987", - "id": 158820301, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Anderson Drive", - "lat": "41.65709", - "lon": "-74.44514", - "id": 164252 - }, - { - "name": "Klein Road", - "lat": "41.66571", - "lon": "-74.42988", - "id": 171575 - }, - { - "name": "Lake View Drive East", - "lat": "41.65361", - "lon": "-74.43943", - "id": 160108 - }, - { - "name": "Mountaindale Road", - "lat": "41.66751", - "lon": "-74.44244", - "id": 161649 - }, - { - "name": "Old Route 209", - "lat": "41.66576", - "lon": "-74.42956", - "id": 261255 - }, - { - "name": "Red Hill Road", - "lat": "41.65756", - "lon": "-74.45256", - "id": 164524 - }, - { - "name": "Tempaloni Road", - "lat": "41.66671", - "lon": "-74.43862", - "id": 161832 - }, - { - "name": "Terrace Drive", - "lat": "41.65332", - "lon": "-74.43990", - "id": 156445 - }, - { - "name": "Fox Hill A Road", - "lat": "41.65840", - "lon": "-74.42227", - "id": 154492 - }, - { - "name": "Jeannie Drive", - "lat": "41.65299", - "lon": "-74.43769", - "id": 153516 - }, - { - "name": "Kraw Street", - "lat": "41.66571", - "lon": "-74.43205", - "id": 178584 - }, - { - "name": "Meyerson Road", - "lat": "41.66307", - "lon": "-74.44345", - "id": 165811 - }, - { - "name": "Nissenbaum Road", - "lat": "41.65748", - "lon": "-74.42845", - "id": 165250 - }, - { - "name": "Ten Rus Lane", - "lat": "41.66685", - "lon": "-74.42988", - "id": 294728 - } - ], - "matchCity": 1 - }, - { - "name": "Hoosick", - "lat": "42.86258", - "lon": "-73.32816", - "id": 158852022, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Hoosick Falls)", - "lat": "42.90003", - "lon": "-73.35275", - "id": 44599 - } - ], - "matchStreet": 1 - }, - { - "name": "Hambletville", - "lat": "42.09675", - "lon": "-75.39296", - "id": 158489521, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Run Farm Road", - "lat": "42.10101", - "lon": "-75.38872", - "id": 80024 - } - ], - "matchStreet": 1 - }, - { - "name": "East Meadow", - "lat": "40.71399", - "lon": "-73.55901", - "id": 158836672, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.71256", - "lon": "-73.57091", - "id": 225792 - }, - { - "name": "Spring Drive", - "lat": "40.71461", - "lon": "-73.57793", - "id": 274373, - "intersectedStreets": [ - { - "name": "Avenue C", - "lat": "40.71522", - "lon": "-73.57932" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Crystal Spring", - "lat": "42.48785", - "lon": "-77.05191", - "id": 158434235, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Crystal Springs Road", - "lat": "42.48767", - "lon": "-77.05165", - "id": 195265 - }, - { - "name": "Dean Lane", - "lat": "42.46619", - "lon": "-77.03137", - "id": 149185 - }, - { - "name": "Pulver Road", - "lat": "42.47536", - "lon": "-77.02401", - "id": 148843 - }, - { - "name": "State Route 230", - "lat": "42.48044", - "lon": "-77.07053", - "id": 148617 - }, - { - "name": "Ardrey Road", - "lat": "42.46679", - "lon": "-77.04871", - "id": 148524 - }, - { - "name": "Crystal Valley Road", - "lat": "42.48044", - "lon": "-77.05141", - "id": 148989 - }, - { - "name": "Losey Hill Road", - "lat": "42.47232", - "lon": "-77.02738", - "id": 149220 - }, - { - "name": "Spearville Road", - "lat": "42.47221", - "lon": "-77.05635", - "id": 149126 - } - ], - "matchCity": 1 - }, - { - "name": "Shenorock", - "lat": "41.33176", - "lon": "-73.73819", - "id": 158916524, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "West Spring Court", - "lat": "41.33144", - "lon": "-73.74156", - "id": 213928, - "intersectedStreets": [ - { - "name": "Shenorock Drive", - "lat": "41.33144", - "lon": "-73.74156" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Inlet", - "lat": "43.75473", - "lon": "-74.79321", - "id": 158863279, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road (Town of Inlet)", - "lat": "43.74721", - "lon": "-74.88519", - "id": 113333 - } - ], - "matchStreet": 1 - }, - { - "name": "Montvale", - "lat": "41.05644", - "lon": "-74.04408", - "id": 170651, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Spring Valley Road", - "lat": "41.05657", - "lon": "-74.05206", - "id": 256202, - "intersectedStreets": [ - { - "name": "Summit Avenue", - "lat": "41.05961", - "lon": "-74.05266" - }, - { - "name": "Strawberry Hill Court", - "lat": "41.06115", - "lon": "-74.05246" - }, - { - "name": "North Avenue", - "lat": "41.06253", - "lon": "-74.05225" - }, - { - "name": "Upper Saddle River Road", - "lat": "41.06271", - "lon": "-74.05223" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Weedsport", - "lat": "43.04868", - "lon": "-76.56272", - "id": 158364564, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "43.04159", - "lon": "-76.57333", - "id": 295927 - } - ], - "matchStreet": 1 - }, - { - "name": "Whiteside Corners", - "lat": "43.06480", - "lon": "-74.09124", - "id": 158916508, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "43.05335", - "lon": "-74.10450", - "id": 46089 - } - ], - "matchStreet": 1 - }, - { - "name": "Coldwater", - "lat": "43.13590", - "lon": "-77.73529", - "id": 158604178, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Circle", - "lat": "43.14116", - "lon": "-77.73720", - "id": 130745 - } - ], - "matchStreet": 1 - }, - { - "name": "Syosset", - "lat": "40.82621", - "lon": "-73.50206", - "id": 158807954, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Harbor Road", - "lat": "40.84888", - "lon": "-73.47066", - "id": 226733, - "intersectedStreets": [ - { - "name": "Cold Spring Road", - "lat": "40.84839", - "lon": "-73.47482" - } - ] - }, - { - "name": "Cold Spring Road", - "lat": "40.82656", - "lon": "-73.50111", - "id": 13194, - "intersectedStreets": [ - { - "name": "Cherry Lane", - "lat": "40.83581", - "lon": "-73.48519" - }, - { - "name": "Calvert Drive", - "lat": "40.83529", - "lon": "-73.48725" - }, - { - "name": "Chelsea Drive", - "lat": "40.83505", - "lon": "-73.48897" - }, - { - "name": "Townsend Drive", - "lat": "40.83402", - "lon": "-73.49141" - }, - { - "name": "Renee Road", - "lat": "40.83232", - "lon": "-73.49384" - }, - { - "name": "Iris Lane", - "lat": "40.83018", - "lon": "-73.49405" - }, - { - "name": "Syosset Woodbury Road", - "lat": "40.82789", - "lon": "-73.49388" - }, - { - "name": "Nevada Street", - "lat": "40.82750", - "lon": "-73.49527" - }, - { - "name": "Magnolia Lane", - "lat": "40.82748", - "lon": "-73.49538" - }, - { - "name": "Woodbury Way", - "lat": "40.82691", - "lon": "-73.49808" - }, - { - "name": "Arizona Avenue", - "lat": "40.82670", - "lon": "-73.49907" - }, - { - "name": "Orchard Street", - "lat": "40.82657", - "lon": "-73.49967" - }, - { - "name": "Jackson Avenue", - "lat": "40.82617", - "lon": "-73.50126" - }, - { - "name": "Springwood Path", - "lat": "40.85115", - "lon": "-73.47425" - }, - { - "name": "Cold Spring Harbor Road", - "lat": "40.84838", - "lon": "-73.47482" - }, - { - "name": "Shady Lane", - "lat": "40.84531", - "lon": "-73.47596" - }, - { - "name": "Woodvale Drive", - "lat": "40.84235", - "lon": "-73.47882" - }, - { - "name": "Laurel Lane", - "lat": "40.84066", - "lon": "-73.48051" - }, - { - "name": "White Oak Tree Road", - "lat": "40.84028", - "lon": "-73.48088" - }, - { - "name": "Stillwell Lane", - "lat": "40.83789", - "lon": "-73.48281" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Brantingham", - "lat": "43.68868", - "lon": "-75.29212", - "id": 158575515, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.68716", - "lon": "-75.26547", - "id": 114656 - } - ], - "matchStreet": 1 - }, - { - "name": "Hartwood", - "lat": "41.53537", - "lon": "-74.69766", - "id": 158854047, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "41.55421", - "lon": "-74.68163", - "id": 160276, - "intersectedStreets": [ - { - "name": "Hartwood Road", - "lat": "41.53579", - "lon": "-74.68392" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Schoharie", - "names": { - "ru": "Скохари" - }, - "lat": "42.66591", - "lon": "-74.30958", - "id": 158817180, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.66183", - "lon": "-74.31036", - "id": 148385 - } - ], - "matchStreet": 1 - }, - { - "name": "Westmere", - "lat": "42.69119", - "lon": "-73.86873", - "id": 158843784, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Hollow Court", - "lat": "42.68668", - "lon": "-73.88391", - "id": 39446 - } - ], - "matchStreet": 1 - }, - { - "name": "Bedell", - "lat": "42.19509", - "lon": "-74.55015", - "id": 158846855, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Clear Spring Lane", - "lat": "42.19236", - "lon": "-74.55406", - "id": 78810 - } - ], - "matchStreet": 1 - }, - { - "name": "Mexico", - "lat": "43.45952", - "lon": "-76.22882", - "id": 158560129, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.45764", - "lon": "-76.23136", - "id": 141493 - } - ], - "matchStreet": 1 - }, - { - "name": "East Otto", - "lat": "42.38979", - "lon": "-78.75475", - "id": 158401416, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.38838", - "lon": "-78.75682", - "id": 90035 - } - ], - "matchStreet": 1 - }, - { - "name": "Ossian", - "lat": "42.52117", - "lon": "-77.77944", - "id": 158458760, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Road South", - "lat": "42.56781", - "lon": "-77.80942", - "id": 117829 - } - ], - "matchStreet": 1 - }, - { - "name": "Salamanca", - "lat": "42.15784", - "lon": "-78.71503", - "id": 158619533, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.15073", - "lon": "-78.71301", - "id": 90036 - } - ], - "matchStreet": 1 - }, - { - "name": "Livingston Manor", - "lat": "41.90037", - "lon": "-74.82821", - "id": 158869381, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.89565", - "lon": "-74.83110", - "id": 153170 - } - ], - "matchStreet": 1 - }, - { - "name": "Cold Spring", - "lat": "41.42009", - "lon": "-73.95459", - "id": 158816115, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "(u)", - "lat": "41.42481", - "lon": "-73.96784", - "id": 282051 - }, - { - "name": "Academy Street", - "lat": "41.42019", - "lon": "-73.95357", - "id": 238219 - }, - { - "name": "B Street", - "lat": "41.42141", - "lon": "-73.95440", - "id": 238018 - }, - { - "name": "Bank Street", - "lat": "41.42067", - "lon": "-73.94621", - "id": 237297 - }, - { - "name": "Benedict Road", - "lat": "41.41750", - "lon": "-73.95217", - "id": 239392 - }, - { - "name": "Cedar Street", - "lat": "41.42379", - "lon": "-73.95524", - "id": 239154 - }, - { - "name": "Cherry Street", - "lat": "41.41950", - "lon": "-73.95380", - "id": 238601 - }, - { - "name": "Chestnut Street", - "lat": "41.41816", - "lon": "-73.95264", - "id": 32030 - }, - { - "name": "Church Street", - "lat": "41.41929", - "lon": "-73.95666", - "id": 238110 - }, - { - "name": "Cold Spring", - "lat": "41.41565", - "lon": "-73.95839", - "id": 263547 - }, - { - "name": "Constitution Drive", - "lat": "41.41559", - "lon": "-73.95468", - "id": 239085 - }, - { - "name": "Cross Street", - "lat": "41.41882", - "lon": "-73.95912", - "id": 239147 - }, - { - "name": "Depot Square", - "lat": "41.41718", - "lon": "-73.95955", - "id": 238044 - }, - { - "name": "Fair Street", - "lat": "41.42498", - "lon": "-73.96331", - "id": 239568 - }, - { - "name": "Fish Street", - "lat": "41.41678", - "lon": "-73.96020", - "id": 241005 - }, - { - "name": "Fishkill Avenue", - "lat": "41.42152", - "lon": "-73.95511", - "id": 240604 - }, - { - "name": "Furnace Street", - "lat": "41.41874", - "lon": "-73.95522", - "id": 238209 - }, - { - "name": "Garden Street", - "lat": "41.41958", - "lon": "-73.95874", - "id": 237642 - }, - { - "name": "Grandview Terrace", - "lat": "41.42255", - "lon": "-73.96048", - "id": 238235 - }, - { - "name": "Grove Court", - "lat": "41.41892", - "lon": "-73.95011", - "id": 257639 - }, - { - "name": "Hamilton Street", - "lat": "41.42386", - "lon": "-73.95846", - "id": 237816 - }, - { - "name": "Herd Path", - "lat": "41.41832", - "lon": "-73.94653", - "id": 272099 - }, - { - "name": "High Street", - "lat": "41.42035", - "lon": "-73.95694", - "id": 240974 - }, - { - "name": "Locust Ridge", - "lat": "41.42316", - "lon": "-73.95282", - "id": 239074 - }, - { - "name": "Main Street", - "lat": "41.41877", - "lon": "-73.95713", - "id": 32287 - }, - { - "name": "Maple Terrace", - "lat": "41.42273", - "lon": "-73.95048", - "id": 238960 - }, - { - "name": "Marion Avenue", - "lat": "41.41802", - "lon": "-73.95316", - "id": 239350 - }, - { - "name": "Market Street", - "lat": "41.41444", - "lon": "-73.95784", - "id": 240348 - }, - { - "name": "Morris Avenue", - "lat": "41.42217", - "lon": "-73.95799", - "id": 238961 - }, - { - "name": "Mountain Avenue", - "lat": "41.42246", - "lon": "-73.95380", - "id": 239483 - }, - { - "name": "New Street", - "lat": "41.41576", - "lon": "-73.96015", - "id": 239951 - }, - { - "name": "North Street", - "lat": "41.41695", - "lon": "-73.96095", - "id": 239401 - }, - { - "name": "Northern Avenue", - "lat": "41.42051", - "lon": "-73.95829", - "id": 238572 - }, - { - "name": "Oak Street", - "lat": "41.41896", - "lon": "-73.95200", - "id": 237962 - }, - { - "name": "Orchard Street", - "lat": "41.42191", - "lon": "-73.95275", - "id": 238821 - }, - { - "name": "Parsonage Street", - "lat": "41.42238", - "lon": "-73.94962", - "id": 238791 - }, - { - "name": "Paulding Avenue", - "lat": "41.42007", - "lon": "-73.95103", - "id": 237813 - }, - { - "name": "Pine Street", - "lat": "41.42188", - "lon": "-73.94825", - "id": 239131 - }, - { - "name": "Railroad Avenue", - "lat": "41.41813", - "lon": "-73.95940", - "id": 237442 - }, - { - "name": "Rock Street", - "lat": "41.41745", - "lon": "-73.95756", - "id": 239045 - }, - { - "name": "Rocky Road", - "lat": "41.44319", - "lon": "-73.93288", - "id": 31994 - }, - { - "name": "State Highway 9D", - "lat": "41.42666", - "lon": "-73.96569", - "id": 240117 - }, - { - "name": "Stephanie Lane", - "lat": "41.46986", - "lon": "-73.91288", - "id": 34645 - }, - { - "name": "Stone Street", - "lat": "41.41813", - "lon": "-73.95940", - "id": 240471 - }, - { - "name": "The Boulevard", - "lat": "41.41702", - "lon": "-73.95541", - "id": 238936 - }, - { - "name": "U.S. 9", - "lat": "41.47936", - "lon": "-73.91357", - "id": 32860 - }, - { - "name": "Wall Street", - "lat": "41.41819", - "lon": "-73.95556", - "id": 238618 - }, - { - "name": "West Bank Street", - "lat": "41.41964", - "lon": "-73.94737", - "id": 237786 - }, - { - "name": "West Street", - "lat": "41.41679", - "lon": "-73.96178", - "id": 240289 - }, - { - "name": "Craigside Drive", - "lat": "41.42260", - "lon": "-73.95460", - "id": 317 - }, - { - "name": "East Belvedere Street", - "lat": "41.42312", - "lon": "-73.95762", - "id": 239637 - }, - { - "name": "Forge Gate Drive", - "lat": "41.41616", - "lon": "-73.95762", - "id": 237695 - }, - { - "name": "Haldane Street", - "lat": "41.42069", - "lon": "-73.95653", - "id": 239010 - }, - { - "name": "Kemble Avenue", - "lat": "41.41657", - "lon": "-73.95303", - "id": 258567 - }, - { - "name": "Lunn Terrace", - "lat": "41.41567", - "lon": "-73.95880", - "id": 238000 - }, - { - "name": "Northern Gate", - "lat": "41.41840", - "lon": "-73.96013", - "id": 238728 - }, - { - "name": "Old Forge Trail", - "lat": "41.41356", - "lon": "-73.95415", - "id": 258566 - }, - { - "name": "Parrot Street", - "lat": "41.42106", - "lon": "-73.94876", - "id": 239361 - }, - { - "name": "West Belvedere Street", - "lat": "41.42244", - "lon": "-73.95842", - "id": 238368 - }, - { - "name": "Whitehill Place", - "lat": "41.42381", - "lon": "-73.96007", - "id": 238117 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Scotch Bush", - "lat": "42.85757", - "lon": "-74.19541", - "id": 158861170, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Sulphur Spring Road", - "lat": "42.85756", - "lon": "-74.17308", - "id": 49076 - } - ], - "matchStreet": 1 - }, - { - "name": "Shelter Island Heights", - "lat": "41.08399", - "lon": "-72.35591", - "id": 158899061, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Garden Avenue", - "lat": "41.08419", - "lon": "-72.35619", - "id": 167828 - } - ], - "matchStreet": 1 - }, - { - "name": "Davenport", - "lat": "42.47175", - "lon": "-74.84460", - "id": 158812026, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Beaver Spring Road", - "lat": "42.47882", - "lon": "-74.83679", - "id": 79909 - }, - { - "name": "Beaver Spring Spur", - "lat": "42.47602", - "lon": "-74.83282", - "id": 79631 - }, - { - "name": "Beaver Spring Lane", - "lat": "42.47624", - "lon": "-74.83436", - "id": 79802 - } - ], - "matchStreet": 1 - }, - { - "name": "St. Johnsville", - "lat": "43.00353", - "lon": "-74.67799", - "id": 175831, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Saint Johnsville)", - "lat": "42.99653", - "lon": "-74.67478", - "id": 123552 - } - ], - "matchStreet": 1 - }, - { - "name": "Palisades", - "lat": "41.01118", - "lon": "-73.91346", - "id": 158835553, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Washington Spring Road", - "lat": "41.01064", - "lon": "-73.90936", - "id": 243372, - "intersectedStreets": [ - { - "name": "Highland Avenue", - "lat": "41.01125", - "lon": "-73.91335" - }, - { - "name": "Oak Tree Road", - "lat": "41.01125", - "lon": "-73.91335" - }, - { - "name": "Woods Road", - "lat": "41.01101", - "lon": "-73.91153" - }, - { - "name": "Corsett Lane", - "lat": "41.01099", - "lon": "-73.91052" - }, - { - "name": "Ludlow Lane", - "lat": "41.01049", - "lon": "-73.90881" - }, - { - "name": "Corbett Lane", - "lat": "41.01171", - "lon": "-73.90668" - }, - { - "name": "Lawrence Lane", - "lat": "41.01041", - "lon": "-73.90486" - }, - { - "name": "Snedens Landing", - "lat": "41.01041", - "lon": "-73.90486" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Stamford", - "lat": "42.40731", - "lon": "-74.61431", - "id": 158853998, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Lane", - "lat": "42.40955", - "lon": "-74.60702", - "id": 78773 - } - ], - "matchStreet": 1 - }, - { - "name": "Carthage", - "lat": "43.97824", - "lon": "-75.60963", - "id": 157603712, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.97788", - "lon": "-75.61141", - "id": 113026 - } - ], - "matchStreet": 1 - }, - { - "name": "Fort Plain", - "lat": "42.93146", - "lon": "-74.62264", - "id": 158836589, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.93459", - "lon": "-74.62783", - "id": 123563 - } - ], - "matchStreet": 1 - }, - { - "name": "Hague", - "lat": "43.74555", - "lon": "-73.49854", - "id": 158801771, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Rock Road", - "lat": "43.73960", - "lon": "-73.50693", - "id": 191860 - }, - { - "name": "Spring Hill (Sabbath Day Point)", - "lat": "43.66149", - "lon": "-73.52392", - "id": 191938 - }, - { - "name": "Spring Lane (Indian Kettles)", - "lat": "43.76158", - "lon": "-73.48457", - "id": 189331 - } - ], - "matchStreet": 1 - }, - { - "name": "Chatham", - "lat": "42.36425", - "lon": "-73.59484", - "id": 158844503, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.36776", - "lon": "-73.58952", - "id": 98391 - } - ], - "matchStreet": 1 - }, - { - "name": "Madrid Springs", - "lat": "44.74006", - "lon": "-75.14353", - "id": 157597262, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.73641", - "lon": "-75.14945", - "id": 61670 - } - ], - "matchStreet": 1 - }, - { - "name": "Pawling", - "lat": "41.56204", - "lon": "-73.60263", - "id": 158813790, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.56200", - "lon": "-73.59728", - "id": 249369 - } - ], - "matchStreet": 1 - }, - { - "name": "Norwood", - "lat": "44.75161", - "lon": "-74.99439", - "id": 158821981, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.74701", - "lon": "-74.99916", - "id": 61673 - } - ], - "matchStreet": 1 - }, - { - "name": "New Hempstead", - "lat": "41.15009", - "lon": "-74.03625", - "id": 158873172, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Rock Place", - "lat": "41.14376", - "lon": "-74.04910", - "id": 243010, - "intersectedStreets": [ - { - "name": "Brick Church Road", - "lat": "41.14253", - "lon": "-74.04927" - }, - { - "name": "Zavatone Court", - "lat": "41.14315", - "lon": "-74.04918" - }, - { - "name": "Wits End", - "lat": "41.14466", - "lon": "-74.04968" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Monticello", - "lat": "41.65565", - "lon": "-74.68933", - "id": 158813785, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.64954", - "lon": "-74.68354", - "id": 153165 - }, - { - "name": "East Cold Spring Road", - "lat": "41.64245", - "lon": "-74.68386", - "id": 156262, - "intersectedStreets": [ - { - "name": "Waverly Avenue", - "lat": "41.64000", - "lon": "-74.67680" - }, - { - "name": "Schroeder Road", - "lat": "41.64226", - "lon": "-74.68343" - }, - { - "name": "Fairground Road", - "lat": "41.64306", - "lon": "-74.68484" - }, - { - "name": "Saint John Street", - "lat": "41.64739", - "lon": "-74.68693" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Liberty", - "lat": "41.80120", - "lon": "-74.74656", - "id": 158806584, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "41.80699", - "lon": "-74.73729", - "id": 160249, - "intersectedStreets": [ - { - "name": "Cemetery Road", - "lat": "41.80235", - "lon": "-74.73900" - }, - { - "name": "Park Avenue", - "lat": "41.80235", - "lon": "-74.73900" - }, - { - "name": "Woodland Avenue", - "lat": "41.80336", - "lon": "-74.73855" - }, - { - "name": "Highview Avenue", - "lat": "41.80422", - "lon": "-74.73817" - }, - { - "name": "Summit Avenue", - "lat": "41.80510", - "lon": "-74.73776" - }, - { - "name": "Mager Avenue", - "lat": "41.80605", - "lon": "-74.73748" - }, - { - "name": "Kelly Avenue", - "lat": "41.80699", - "lon": "-74.73729" - }, - { - "name": "California Avenue", - "lat": "41.80795", - "lon": "-74.73716" - }, - { - "name": "Neversink Road", - "lat": "41.80590", - "lon": "-74.72993" - } - ] - }, - { - "name": "Spring Street", - "lat": "41.79728", - "lon": "-74.74613", - "id": 153167 - } - ], - "matchStreet": 1 - }, - { - "name": "Horseheads", - "lat": "42.16702", - "lon": "-76.82052", - "id": 158257710, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Creek Drive", - "lat": "42.17721", - "lon": "-76.81632", - "id": 96212 - } - ], - "matchStreet": 1 - }, - { - "name": "Cold Spring", - "lat": "43.67146", - "lon": "-73.40678", - "id": 158844465, - "type": "HAMLET", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "York", - "lat": "42.87114", - "lon": "-77.88556", - "id": 158656063, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Retsof)", - "lat": "42.83845", - "lon": "-77.88326", - "id": 264174 - } - ], - "matchStreet": 1 - }, - { - "name": "Uniondale", - "lat": "40.70038", - "lon": "-73.59291", - "id": 158810686, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Avenue", - "lat": "40.69133", - "lon": "-73.58954", - "id": 221857, - "intersectedStreets": [ - { - "name": "Summer Avenue", - "lat": "40.69050", - "lon": "-73.59151" - }, - { - "name": "Fall Avenue", - "lat": "40.69086", - "lon": "-73.59076" - }, - { - "name": "Winter Avenue", - "lat": "40.69180", - "lon": "-73.58907" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Gilboa", - "lat": "42.39730", - "lon": "-74.44598", - "id": 158798397, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Circle (Town of Gilboa)", - "lat": "42.41701", - "lon": "-74.45823", - "id": 276882 - } - ], - "matchStreet": 1 - }, - { - "name": "Diddell", - "lat": "41.62343", - "lon": "-73.85208", - "id": 158825000, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Hill Court", - "lat": "41.62633", - "lon": "-73.85117", - "id": 247837, - "intersectedStreets": [ - { - "name": "Cross Ridge Road", - "lat": "41.62686", - "lon": "-73.85151" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Tompkins Corners", - "lat": "41.19121", - "lon": "-73.78263", - "id": 158865961, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Crystal Spring Road", - "lat": "41.18960", - "lon": "-73.78351", - "id": 218697 - } - ], - "matchStreet": 1 - }, - { - "name": "Beaverkill", - "lat": "41.98147", - "lon": "-74.83543", - "id": 158843439, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Little Spring Brook Trail", - "lat": "42.03328", - "lon": "-74.87646", - "id": 271388 - }, - { - "name": "Little Spring Brook Road Spur", - "lat": "42.01825", - "lon": "-74.88991", - "id": 78087 - }, - { - "name": "Spring Brook Estates", - "lat": "42.03157", - "lon": "-74.88755", - "id": 79389 - }, - { - "name": "Little Spring Brook Road", - "lat": "42.02089", - "lon": "-74.88472", - "id": 78569 - }, - { - "name": "Spring Brook Road", - "lat": "42.01461", - "lon": "-74.89034", - "id": 78587 - } - ], - "matchStreet": 1 - }, - { - "name": "Durland", - "lat": "41.28287", - "lon": "-74.30793", - "id": 158809647, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.28801", - "lon": "-74.29380", - "id": 200975 - } - ], - "matchStreet": 1 - }, - { - "name": "Newcomb", - "lat": "43.96959", - "lon": "-74.16492", - "id": 158905886, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.96528", - "lon": "-74.17158", - "id": 106728 - }, - { - "name": "Cold Spring", - "lat": "43.96454", - "lon": "-74.27005", - "id": 295805 - } - ], - "matchStreet": 1 - }, - { - "name": "Millers Corners", - "lat": "42.58536", - "lon": "-73.56956", - "id": 158804508, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Brook Spring Avenue", - "lat": "42.59764", - "lon": "-73.56643", - "id": 251676 - } - ], - "matchStreet": 1 - }, - { - "name": "Brushton", - "lat": "44.83055", - "lon": "-74.51374", - "id": 158813722, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Grove Road", - "lat": "44.84241", - "lon": "-74.49996", - "id": 103564 - } - ], - "matchStreet": 1 - }, - { - "name": "Shinnecock Hills", - "lat": "40.89094", - "lon": "-72.46370", - "id": 158811654, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Court", - "lat": "40.89712", - "lon": "-72.46840", - "id": 288370 - } - ], - "matchStreet": 1 - }, - { - "name": "East Aurora", - "lat": "42.76891", - "lon": "-78.61776", - "id": 158618125, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.75940", - "lon": "-78.61954", - "id": 87798 - } - ], - "matchStreet": 1 - }, - { - "name": "Allentown", - "lat": "42.08368", - "lon": "-78.06445", - "id": 157628957, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Wolf Spring Road", - "lat": "42.11280", - "lon": "-78.06644", - "id": 84468 - } - ], - "matchStreet": 1 - }, - { - "name": "Pelham Manor", - "lat": "40.89538", - "lon": "-73.80708", - "id": 158798327, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "40.89006", - "lon": "-73.81673", - "id": 211421, - "intersectedStreets": [ - { - "name": "Boston Post Road", - "lat": "40.89146", - "lon": "-73.81710" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Collins", - "lat": "42.49645", - "lon": "-78.92059", - "id": 157557219, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.49963", - "lon": "-78.92329", - "id": 68087 - } - ], - "matchStreet": 1 - }, - { - "name": "Lyons Corners", - "lat": "42.26729", - "lon": "-78.25335", - "id": 157607406, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Valley Road", - "lat": "42.25451", - "lon": "-78.24396", - "id": 84958 - } - ], - "matchStreet": 1 - }, - { - "name": "Caledonia", - "lat": "42.97311", - "lon": "-77.85279", - "id": 158419452, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "42.94496", - "lon": "-77.82766", - "id": 118042 - }, - { - "name": "Spring Street", - "lat": "42.97787", - "lon": "-77.86045", - "id": 117433 - } - ], - "matchStreet": 1 - }, - { - "name": "Rhinebeck", - "lat": "41.92688", - "lon": "-73.91267", - "id": 158861811, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Brook Ave", - "lat": "41.93728", - "lon": "-73.91005", - "id": 32892 - }, - { - "name": "Spring Brook Avenue", - "lat": "41.93640", - "lon": "-73.90996", - "id": 248564 - }, - { - "name": "Spring Brook Park", - "lat": "41.93844", - "lon": "-73.91063", - "id": 238328 - } - ], - "matchStreet": 1 - }, - { - "name": "Hamilton", - "lat": "42.82688", - "lon": "-75.54442", - "id": 158408189, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Road", - "lat": "42.82644", - "lon": "-75.52789", - "id": 117950 - }, - { - "name": "Spring Street", - "lat": "42.82460", - "lon": "-75.53053", - "id": 119707 - } - ], - "matchStreet": 1 - }, - { - "name": "Tannersville", - "lat": "42.19564", - "lon": "-74.13375", - "id": 158861814, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.20152", - "lon": "-74.12757", - "id": 108123 - } - ], - "matchStreet": 1 - }, - { - "name": "Peconic", - "lat": "41.04788", - "lon": "-72.46314", - "id": 158844387, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "41.03484", - "lon": "-72.45440", - "id": 162493 - } - ], - "matchStreet": 1 - }, - { - "name": "Port Jefferson", - "lat": "40.94651", - "lon": "-73.06912", - "id": 158859749, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.94422", - "lon": "-73.06526", - "id": 182502 - } - ], - "matchStreet": 1 - }, - { - "name": "Bald Mountain", - "lat": "43.12952", - "lon": "-73.53817", - "id": 158874087, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Lick Spring Road", - "lat": "43.15179", - "lon": "-73.52639", - "id": 193533 - } - ], - "matchStreet": 1 - }, - { - "name": "Craigie Clair", - "lat": "41.96425", - "lon": "-74.86627", - "id": 158877401, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Brook Road", - "lat": "41.97910", - "lon": "-74.89350", - "id": 78588 - } - ], - "matchStreet": 1 - }, - { - "name": "Saint Regis Falls", - "lat": "44.67395", - "lon": "-74.54490", - "id": 158895834, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.67454", - "lon": "-74.53985", - "id": 107037 - } - ], - "matchStreet": 1 - }, - { - "name": "Randelville", - "lat": "41.34287", - "lon": "-74.34848", - "id": 158802646, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Twin Spring Lane", - "lat": "41.35128", - "lon": "-74.34403", - "id": 204950, - "intersectedStreets": [ - { - "name": "Quaker Mill Run", - "lat": "41.35175", - "lon": "-74.34337" - }, - { - "name": "Durland Road", - "lat": "41.35027", - "lon": "-74.34463" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Grove Springs", - "lat": "42.47118", - "lon": "-77.15608", - "id": 158369499, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cedar Spring", - "lat": "42.47493", - "lon": "-77.14042", - "id": 85660 - } - ], - "matchStreet": 1 - }, - { - "name": "McIntyre", - "lat": "41.88982", - "lon": "-73.69819", - "id": 158897875, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "41.88963", - "lon": "-73.69738", - "id": 247827 - }, - { - "name": "Cold Spring Way", - "lat": "41.89913", - "lon": "-73.70788", - "id": 245998 - } - ], - "matchStreet": 1 - }, - { - "name": "Afton", - "lat": "42.22814", - "lon": "-75.52657", - "id": 158578376, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.23448", - "lon": "-75.53536", - "id": 97252 - } - ], - "matchStreet": 1 - }, - { - "name": "Pantigo", - "lat": "40.96788", - "lon": "-72.16480", - "id": 158809795, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Close Lane", - "lat": "40.97065", - "lon": "-72.16305", - "id": 287475 - }, - { - "name": "Spring Close Highway", - "lat": "40.97136", - "lon": "-72.16625", - "id": 173967 - } - ], - "matchStreet": 1 - }, - { - "name": "New Baltimore", - "lat": "42.44619", - "lon": "-73.78846", - "id": 158809808, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road (Town of New Baltimore)", - "lat": "42.43838", - "lon": "-73.94046", - "id": 110565 - } - ], - "matchStreet": 1 - }, - { - "name": "Strathmore", - "lat": "40.79204", - "lon": "-73.67735", - "id": 158895814, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Mill Spring Road", - "lat": "40.79044", - "lon": "-73.67820", - "id": 234126, - "intersectedStreets": [ - { - "name": "Rockcrest Road", - "lat": "40.79328", - "lon": "-73.67766" - }, - { - "name": "Hilltop Drive", - "lat": "40.79222", - "lon": "-73.67741" - }, - { - "name": "Woodland Way", - "lat": "40.79052", - "lon": "-73.67784" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Wheatley Heights", - "lat": "40.76371", - "lon": "-73.36984", - "id": 158852811, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street (Wyandanch)", - "lat": "40.76042", - "lon": "-73.35927", - "id": 283895 - } - ], - "matchStreet": 1 - }, - { - "name": "South Glens Falls", - "lat": "43.29945", - "lon": "-73.63518", - "id": 158815946, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.30182", - "lon": "-73.63305", - "id": 261409 - }, - { - "name": "Spring Street Extension", - "lat": "43.29943", - "lon": "-73.63059", - "id": 50650 - } - ], - "matchStreet": 1 - }, - { - "name": "Livingston", - "lat": "42.14203", - "lon": "-73.77790", - "id": 158844617, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Road (Town of Livingston)", - "lat": "42.18703", - "lon": "-73.78948", - "id": 99448 - }, - { - "name": "Cold Spring Road (Town of Livingston)", - "lat": "42.16087", - "lon": "-73.79738", - "id": 102265 - } - ], - "matchStreet": 1 - }, - { - "name": "Roxbury", - "lat": "42.28398", - "lon": "-74.56487", - "id": 158853815, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road (Town of Roxbury)", - "lat": "42.25217", - "lon": "-74.60049", - "id": 78932 - } - ], - "matchStreet": 1 - }, - { - "name": "Gang Mills", - "lat": "42.14618", - "lon": "-77.11164", - "id": 158595763, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Pond Road", - "lat": "42.15629", - "lon": "-77.11216", - "id": 272754 - } - ], - "matchStreet": 1 - }, - { - "name": "Milan", - "lat": "41.95343", - "lon": "-73.79208", - "id": 158853811, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cold Spring Road (Town of Milan)", - "lat": "41.93373", - "lon": "-73.75937", - "id": 247826 - }, - { - "name": "Spring Lake Road (Town of Milan)", - "lat": "42.03777", - "lon": "-73.80102", - "id": 249100 - } - ], - "matchStreet": 1 - }, - { - "name": "Phoenix", - "lat": "43.23118", - "lon": "-76.30077", - "id": 157630116, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.23446", - "lon": "-76.29812", - "id": 141491 - } - ], - "matchStreet": 1 - }, - { - "name": "Dickersonville", - "lat": "43.19061", - "lon": "-78.93032", - "id": 157571747, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Black Nose Spring Road", - "lat": "43.18256", - "lon": "-78.93037", - "id": 60913 - } - ], - "matchStreet": 1 - }, - { - "name": "Newark Valley", - "lat": "42.22369", - "lon": "-76.18327", - "id": 158263974, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.22358", - "lon": "-76.18873", - "id": 75 - } - ], - "matchStreet": 1 - }, - { - "name": "Castile", - "lat": "42.62895", - "lon": "-78.05445", - "id": 158458529, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.62365", - "lon": "-78.05943", - "id": 198073 - } - ], - "matchStreet": 1 - }, - { - "name": "Cold Spring Harbor", - "lat": "40.87148", - "lon": "-73.45679", - "id": 158842530, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Ackerman Place", - "lat": "40.86910", - "lon": "-73.43148", - "id": 185441 - }, - { - "name": "Albert Place", - "lat": "40.86999", - "lon": "-73.44242", - "id": 155356 - }, - { - "name": "Alden Lane", - "lat": "40.87049", - "lon": "-73.44084", - "id": 186851 - }, - { - "name": "Anderson Place", - "lat": "40.86931", - "lon": "-73.43167", - "id": 183701 - }, - { - "name": "Avondale Drive", - "lat": "40.86879", - "lon": "-73.46032", - "id": 162698 - }, - { - "name": "Barrow Court", - "lat": "40.86446", - "lon": "-73.43588", - "id": 155982 - }, - { - "name": "Beech Place", - "lat": "40.86855", - "lon": "-73.45922", - "id": 177357 - }, - { - "name": "Briarwood Drive", - "lat": "40.86267", - "lon": "-73.43208", - "id": 153223 - }, - { - "name": "Carnegie Avenue", - "lat": "40.87024", - "lon": "-73.44504", - "id": 159225 - }, - { - "name": "Cedar Drive", - "lat": "40.85917", - "lon": "-73.43481", - "id": 170884 - }, - { - "name": "Chestnut Street", - "lat": "40.86024", - "lon": "-73.43530", - "id": 179753 - }, - { - "name": "Crosby Place", - "lat": "40.85049", - "lon": "-73.43897", - "id": 180539 - }, - { - "name": "Diamond Court", - "lat": "40.85586", - "lon": "-73.43410", - "id": 177686 - }, - { - "name": "Donovan Drive", - "lat": "40.86279", - "lon": "-73.44092", - "id": 175383 - }, - { - "name": "Eastwoods Drive", - "lat": "40.84250", - "lon": "-73.45184", - "id": 160390 - }, - { - "name": "Elm Place", - "lat": "40.86976", - "lon": "-73.46068", - "id": 165264 - }, - { - "name": "Erick Court", - "lat": "40.86796", - "lon": "-73.45311", - "id": 183050 - }, - { - "name": "Fairway Place", - "lat": "40.87024", - "lon": "-73.45541", - "id": 181052 - }, - { - "name": "Flora Street", - "lat": "40.86830", - "lon": "-73.46047", - "id": 169216 - }, - { - "name": "Fox Hunt Court", - "lat": "40.86602", - "lon": "-73.44732", - "id": 285455 - }, - { - "name": "Fox Hunt Lane", - "lat": "40.87069", - "lon": "-73.44931", - "id": 168116 - }, - { - "name": "Garden Court", - "lat": "40.86642", - "lon": "-73.43871", - "id": 165427 - }, - { - "name": "Glen Way", - "lat": "40.87157", - "lon": "-73.44704", - "id": 158771 - }, - { - "name": "Goose Hill Road", - "lat": "40.87994", - "lon": "-73.45169", - "id": 285449 - }, - { - "name": "Grove Street", - "lat": "40.87194", - "lon": "-73.45092", - "id": 184500 - }, - { - "name": "Halyard Court", - "lat": "40.86860", - "lon": "-73.45725", - "id": 156584 - }, - { - "name": "Harbor Road", - "lat": "40.86323", - "lon": "-73.46133", - "id": 31343 - }, - { - "name": "Hawxhurst Road", - "lat": "40.85865", - "lon": "-73.43777", - "id": 182187 - }, - { - "name": "Heritage Court", - "lat": "40.87200", - "lon": "-73.44948", - "id": 164008 - }, - { - "name": "Highland Court", - "lat": "40.86894", - "lon": "-73.43558", - "id": 161675 - }, - { - "name": "Hillside Avenue", - "lat": "40.86774", - "lon": "-73.43294", - "id": 185620 - }, - { - "name": "Insbrook Court", - "lat": "40.86569", - "lon": "-73.43255", - "id": 154086 - }, - { - "name": "Jennings Road", - "lat": "40.88433", - "lon": "-73.45131", - "id": 285450 - }, - { - "name": "Kennedy Lane", - "lat": "40.86895", - "lon": "-73.44867", - "id": 179346 - }, - { - "name": "Lawrence Hill Road", - "lat": "40.86142", - "lon": "-73.45004", - "id": 179172 - }, - { - "name": "Lisa Court", - "lat": "40.85359", - "lon": "-73.43734", - "id": 186647 - }, - { - "name": "Locust Court", - "lat": "40.85724", - "lon": "-73.43459", - "id": 184616 - }, - { - "name": "Main Street", - "lat": "40.87028", - "lon": "-73.43109", - "id": 275521 - }, - { - "name": "Midland Street", - "lat": "40.87088", - "lon": "-73.44671", - "id": 185231 - }, - { - "name": "Nassau/Suffolk Greenbelt Trail", - "lat": "40.85337", - "lon": "-73.45948", - "id": 275417 - }, - { - "name": "North Hempstead Turnpike", - "lat": "40.85828", - "lon": "-73.46223", - "id": 265480 - }, - { - "name": "Oakwood Road", - "lat": "40.85240", - "lon": "-73.43210", - "id": 251241 - }, - { - "name": "Peabody Road", - "lat": "40.86095", - "lon": "-73.44442", - "id": 164633 - }, - { - "name": "Pegs Lane", - "lat": "40.85320", - "lon": "-73.43579", - "id": 168948 - }, - { - "name": "Pennington Drive", - "lat": "40.85824", - "lon": "-73.43594", - "id": 180152 - }, - { - "name": "Pine Drive", - "lat": "40.86801", - "lon": "-73.45768", - "id": 175600 - }, - { - "name": "Poplar Place", - "lat": "40.87108", - "lon": "-73.45588", - "id": 156808 - }, - { - "name": "Portland Place", - "lat": "40.86907", - "lon": "-73.46150", - "id": 186754 - }, - { - "name": "Proposed Bethpage State Parkway (Historical)", - "lat": "40.84883", - "lon": "-73.45674", - "id": 290915 - }, - { - "name": "Pulaski Road", - "lat": "40.84677", - "lon": "-73.43476", - "id": 285415 - }, - { - "name": "Quaker Path", - "lat": "40.87061", - "lon": "-73.44298", - "id": 179002 - }, - { - "name": "Ridge Road", - "lat": "40.87100", - "lon": "-73.45011", - "id": 186079 - }, - { - "name": "Rogers Drive", - "lat": "40.86063", - "lon": "-73.44747", - "id": 187042 - }, - { - "name": "Saint Marks Place", - "lat": "40.87230", - "lon": "-73.44551", - "id": 285454 - }, - { - "name": "Saw Mill Lane", - "lat": "40.85359", - "lon": "-73.45399", - "id": 155838 - }, - { - "name": "Saw Mill Road", - "lat": "40.85573", - "lon": "-73.44742", - "id": 156849 - }, - { - "name": "Scudder Place", - "lat": "40.86865", - "lon": "-73.43266", - "id": 285408 - }, - { - "name": "Shore Road", - "lat": "40.87056", - "lon": "-73.46040", - "id": 176136 - }, - { - "name": "Skyline Drive", - "lat": "40.85639", - "lon": "-73.43161", - "id": 171737 - }, - { - "name": "Snake Hill Road", - "lat": "40.87927", - "lon": "-73.46476", - "id": 285458 - }, - { - "name": "Soundview Road", - "lat": "40.86224", - "lon": "-73.43092", - "id": 285410 - }, - { - "name": "Spring", - "lat": "40.87196", - "lon": "-73.45706", - "id": 161594 - }, - { - "name": "Spring Hill Road", - "lat": "40.87538", - "lon": "-73.45811", - "id": 184255 - }, - { - "name": "Spring Road", - "lat": "40.85779", - "lon": "-73.45983", - "id": 285462 - }, - { - "name": "Spring Street", - "lat": "40.87114", - "lon": "-73.45927", - "id": 182506 - }, - { - "name": "Spruce Court", - "lat": "40.86243", - "lon": "-73.43277", - "id": 164443 - }, - { - "name": "St Marks Place", - "lat": "40.87212", - "lon": "-73.44435", - "id": 184680 - }, - { - "name": "Tall Oak Drive", - "lat": "40.85454", - "lon": "-73.43358", - "id": 162935 - }, - { - "name": "Tall Tree Court", - "lat": "40.85954", - "lon": "-73.43985", - "id": 185693 - }, - { - "name": "Terrace Place", - "lat": "40.86532", - "lon": "-73.46122", - "id": 177144 - }, - { - "name": "The Commons", - "lat": "40.85102", - "lon": "-73.44850", - "id": 180007 - }, - { - "name": "Titus Lane", - "lat": "40.87593", - "lon": "-73.45365", - "id": 170466 - }, - { - "name": "Trillium Place", - "lat": "40.85685", - "lon": "-73.43676", - "id": 168968 - }, - { - "name": "Valentine Court", - "lat": "40.87504", - "lon": "-73.45345", - "id": 186614 - }, - { - "name": "Walnut Place", - "lat": "40.86107", - "lon": "-73.43167", - "id": 165398 - }, - { - "name": "Walters Avenue", - "lat": "40.87147", - "lon": "-73.45289", - "id": 285452 - }, - { - "name": "West Main Street", - "lat": "40.87139", - "lon": "-73.45695", - "id": 31460 - }, - { - "name": "West Pulaski Road", - "lat": "40.84445", - "lon": "-73.44079", - "id": 254595 - }, - { - "name": "West Ridge Road", - "lat": "40.87157", - "lon": "-73.44704", - "id": 187978 - }, - { - "name": "White Hill Road", - "lat": "40.88073", - "lon": "-73.45489", - "id": 285460 - }, - { - "name": "Willowbrook Road", - "lat": "40.87220", - "lon": "-73.45779", - "id": 169733 - }, - { - "name": "Wilton Road", - "lat": "40.84980", - "lon": "-73.44453", - "id": 188336 - }, - { - "name": "Woodbury Road", - "lat": "40.83685", - "lon": "-73.45304", - "id": 184566 - }, - { - "name": "Woodchuck Hollow Road", - "lat": "40.85487", - "lon": "-73.43669", - "id": 185268 - }, - { - "name": "Woodcutters Lane", - "lat": "40.87940", - "lon": "-73.45689", - "id": 157584 - }, - { - "name": "Woodlee Road", - "lat": "40.84975", - "lon": "-73.45126", - "id": 182741 - }, - { - "name": "Brandy Road", - "lat": "40.85404", - "lon": "-73.43785", - "id": 168194 - }, - { - "name": "Carley Avenue", - "lat": "40.86847", - "lon": "-73.43695", - "id": 187518 - }, - { - "name": "Coleman Court", - "lat": "40.85628", - "lon": "-73.44860", - "id": 164101 - }, - { - "name": "Commons", - "lat": "40.85110", - "lon": "-73.44976", - "id": 285456 - }, - { - "name": "Cragg Court", - "lat": "40.85823", - "lon": "-73.43148", - "id": 176528 - }, - { - "name": "Cyril Drive", - "lat": "40.84872", - "lon": "-73.43562", - "id": 170082 - }, - { - "name": "Edcris Lane", - "lat": "40.84961", - "lon": "-73.43539", - "id": 185051 - }, - { - "name": "Folly Field Court", - "lat": "40.87372", - "lon": "-73.45674", - "id": 285461 - }, - { - "name": "Insbrook Drive", - "lat": "40.86538", - "lon": "-73.43290", - "id": 174585 - }, - { - "name": "Kaylor Court", - "lat": "40.86008", - "lon": "-73.44841", - "id": 184792 - }, - { - "name": "Meadow Farm Lane", - "lat": "40.86767", - "lon": "-73.44637", - "id": 161900 - }, - { - "name": "Minetta Court", - "lat": "40.86655", - "lon": "-73.43448", - "id": 174159 - }, - { - "name": "Mow Bray Lane North", - "lat": "40.87501", - "lon": "-73.45968", - "id": 185887 - }, - { - "name": "Mowbray Lane N", - "lat": "40.87565", - "lon": "-73.45976", - "id": 285457 - }, - { - "name": "Nassau - Suffolk Trail LIGTC", - "lat": "40.86741", - "lon": "-73.46131", - "id": 291058 - }, - { - "name": "Newbury Place", - "lat": "40.86561", - "lon": "-73.43903", - "id": 169352 - }, - { - "name": "North Run", - "lat": "40.84469", - "lon": "-73.45279", - "id": 185523 - }, - { - "name": "Pegs Court", - "lat": "40.85245", - "lon": "-73.43616", - "id": 185043 - }, - { - "name": "Pilgrim Path", - "lat": "40.86795", - "lon": "-73.44146", - "id": 160827 - }, - { - "name": "Pond Field Court", - "lat": "40.87919", - "lon": "-73.45217", - "id": 176224 - }, - { - "name": "Rancher Place", - "lat": "40.85170", - "lon": "-73.43423", - "id": 180332 - }, - { - "name": "Rough Riders Court", - "lat": "40.86232", - "lon": "-73.44208", - "id": 173429 - }, - { - "name": "Rusco Street", - "lat": "40.86535", - "lon": "-73.43837", - "id": 159575 - }, - { - "name": "Seaward Court", - "lat": "40.86191", - "lon": "-73.45594", - "id": 164109 - }, - { - "name": "Snake Hill Lane", - "lat": "40.87797", - "lon": "-73.46480", - "id": 172164 - }, - { - "name": "Snowball Drive", - "lat": "40.85425", - "lon": "-73.43963", - "id": 170334 - }, - { - "name": "South Run", - "lat": "40.84039", - "lon": "-73.45240", - "id": 185331 - }, - { - "name": "Spg Hill Road", - "lat": "40.87921", - "lon": "-73.46313", - "id": 184610 - }, - { - "name": "Squadron Court", - "lat": "40.86358", - "lon": "-73.43985", - "id": 171374 - }, - { - "name": "Sundown Court", - "lat": "40.86271", - "lon": "-73.43586", - "id": 178585 - }, - { - "name": "Thicket Drive", - "lat": "40.86905", - "lon": "-73.45639", - "id": 154752 - }, - { - "name": "Toboggan Hill Path", - "lat": "40.87749", - "lon": "-73.45609", - "id": 176544 - }, - { - "name": "Trainer Court", - "lat": "40.86558", - "lon": "-73.43687", - "id": 159741 - }, - { - "name": "Turkey Lane", - "lat": "40.86632", - "lon": "-73.45126", - "id": 186748 - }, - { - "name": "Uplands West Loop NC", - "lat": "40.85644", - "lon": "-73.45583", - "id": 273793 - }, - { - "name": "Walnut Tree Lane", - "lat": "40.87647", - "lon": "-73.46240", - "id": 182315 - }, - { - "name": "Wawapek Road", - "lat": "40.87823", - "lon": "-73.45940", - "id": 169044 - }, - { - "name": "Whaling Avenue", - "lat": "40.87286", - "lon": "-73.45111", - "id": 285395 - }, - { - "name": "Woodleaf Court", - "lat": "40.86877", - "lon": "-73.44963", - "id": 153231 - }, - { - "name": "Wyona Court", - "lat": "40.86918", - "lon": "-73.43869", - "id": 165825 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Wappingers Falls", - "lat": "41.59657", - "lon": "-73.91121", - "id": 158814882, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.59983", - "lon": "-73.91743", - "id": 249368 - } - ], - "matchStreet": 1 - }, - { - "name": "Cold Spring Park", - "lat": "43.99839", - "lon": "-73.47485", - "id": 158852777, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Cold Spring Road", - "lat": "43.99621", - "lon": "-73.48828", - "id": 107712 - } - ], - "matchCity": 1, - "matchStreet": 1 - }, - { - "name": "Shelter Island", - "lat": "41.06816", - "lon": "-72.33869", - "id": 158806679, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Garden Avenue", - "lat": "41.08472", - "lon": "-72.35617", - "id": 278645 - } - ], - "matchStreet": 1 - }, - { - "name": "North Hills", - "lat": "40.78093", - "lon": "-73.67652", - "id": 158808726, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hollow Road", - "lat": "40.76969", - "lon": "-73.67118", - "id": 224011, - "intersectedStreets": [ - { - "name": "Acorn Ponds Drive", - "lat": "40.76959", - "lon": "-73.67123" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Copake Lake", - "lat": "42.13925", - "lon": "-73.58234", - "id": 158853779, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.15403", - "lon": "-73.58432", - "id": 98394 - } - ], - "matchStreet": 1 - }, - { - "name": "Alexander", - "lat": "42.90117", - "lon": "-78.25669", - "id": 158257798, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Road", - "lat": "42.87834", - "lon": "-78.22652", - "id": 196900 - } - ], - "matchStreet": 1 - }, - { - "name": "Halseys Corners", - "lat": "44.70782", - "lon": "-73.46902", - "id": 158858908, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Circle", - "lat": "44.70681", - "lon": "-73.47010", - "id": 97983 - } - ], - "matchStreet": 1 - }, - { - "name": "Starkey", - "lat": "42.53535", - "lon": "-76.92440", - "id": 158298781, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street (Dundee)", - "lat": "42.52219", - "lon": "-76.97944", - "id": 196083 - } - ], - "matchStreet": 1 - }, - { - "name": "Windham", - "lat": "42.30731", - "lon": "-74.25209", - "id": 158819973, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Lane", - "lat": "42.33666", - "lon": "-74.23288", - "id": 107720 - } - ], - "matchStreet": 1 - }, - { - "name": "Hume", - "lat": "42.47284", - "lon": "-78.13640", - "id": 158418566, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Stone Spring Road", - "lat": "42.50256", - "lon": "-78.18208", - "id": 83026 - }, - { - "name": "Spring Street", - "lat": "42.49447", - "lon": "-78.14496", - "id": 84100 - } - ], - "matchStreet": 1 - }, - { - "name": "Port Henry", - "lat": "44.04861", - "lon": "-73.45974", - "id": 158842498, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.05129", - "lon": "-73.46212", - "id": 106724 - } - ], - "matchStreet": 1 - }, - { - "name": "Port Ewen", - "lat": "41.90537", - "lon": "-73.97625", - "id": 158876303, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street (Connelly)", - "lat": "41.91063", - "lon": "-73.99247", - "id": 178519 - } - ], - "matchStreet": 1 - }, - { - "name": "Setauket", - "lat": "40.93555", - "lon": "-73.11888", - "id": 158813826, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Meadow Lane (Setauket-East Setauket)", - "lat": "40.89014", - "lon": "-73.09657", - "id": 279937 - }, - { - "name": "Spring Lane (East Setauket)", - "lat": "40.93537", - "lon": "-73.09438", - "id": 162496, - "intersectedStreets": [ - { - "name": "Peters Path (East Setauket)", - "lat": "40.93537", - "lon": "-73.09438" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Meredith", - "lat": "42.35842", - "lon": "-74.93433", - "id": 158843531, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Valley Road (Town of Meredith)", - "lat": "42.32140", - "lon": "-74.92796", - "id": 78740 - } - ], - "matchStreet": 1 - }, - { - "name": "Wolcott", - "lat": "43.22062", - "lon": "-76.81496", - "id": 158467728, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Green Road", - "lat": "43.20432", - "lon": "-76.76424", - "id": 192987 - } - ], - "matchStreet": 1 - }, - { - "name": "Greene", - "lat": "42.32924", - "lon": "-75.76992", - "id": 158553719, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Valley Road", - "lat": "42.36187", - "lon": "-75.77537", - "id": 98506 - } - ], - "matchStreet": 1 - }, - { - "name": "Connelly", - "lat": "41.91009", - "lon": "-73.99125", - "id": 158893684, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.91063", - "lon": "-73.99247", - "id": 178521 - } - ], - "matchStreet": 1 - }, - { - "name": "Mendon", - "lat": "42.99784", - "lon": "-77.50444", - "id": 158589566, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Wood Spring Hill", - "lat": "42.99302", - "lon": "-77.53159", - "id": 128554 - } - ], - "matchStreet": 1 - }, - { - "name": "North Salem", - "lat": "41.33482", - "lon": "-73.57123", - "id": 158836345, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Road (Salem Center)", - "lat": "41.33732", - "lon": "-73.60801", - "id": 213330, - "intersectedStreets": [ - { - "name": "Delancey Road (Town of North Salem)", - "lat": "41.33730", - "lon": "-73.60602" - }, - { - "name": "Elizabeth Drive (Salem Center)", - "lat": "41.33993", - "lon": "-73.60904" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Lake Placid", - "lat": "44.27962", - "lon": "-73.97987", - "id": 158810726, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "44.27941", - "lon": "-73.98344", - "id": 106727 - } - ], - "matchStreet": 1 - }, - { - "name": "Warwick", - "lat": "41.25648", - "lon": "-74.35988", - "id": 158862955, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.25868", - "lon": "-74.36055", - "id": 200971 - } - ], - "matchStreet": 1 - }, - { - "name": "Chelsea", - "lat": "41.55371", - "lon": "-73.96681", - "id": 158859884, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.55168", - "lon": "-73.96807", - "id": 249364 - } - ], - "matchStreet": 1 - }, - { - "name": "East Randolph", - "lat": "42.17284", - "lon": "-78.94782", - "id": 158532200, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "42.16533", - "lon": "-78.95048", - "id": 90034 - } - ], - "matchStreet": 1 - }, - { - "name": "Roosevelt", - "lat": "40.67871", - "lon": "-73.58902", - "id": 158819939, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "40.67921", - "lon": "-73.58488", - "id": 225795 - } - ], - "matchStreet": 1 - }, - { - "name": "Tillson", - "lat": "41.82899", - "lon": "-74.06847", - "id": 158841443, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "41.83734", - "lon": "-74.06916", - "id": 178518 - } - ], - "matchStreet": 1 - }, - { - "name": "Chestnut Ridge", - "lat": "41.08408", - "lon": "-74.05567", - "id": 158799457, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Terrace", - "lat": "41.07380", - "lon": "-74.06358", - "id": 242837, - "intersectedStreets": [ - { - "name": "Chestnut Ridge Road", - "lat": "41.07477", - "lon": "-74.06487" - }, - { - "name": "Orchard Court", - "lat": "41.07380", - "lon": "-74.06358" - }, - { - "name": "Brian Terrace", - "lat": "41.07130", - "lon": "-74.06158" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "West Sparta", - "lat": "42.62701", - "lon": "-77.77305", - "id": 158553701, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rock Spring Hill Road", - "lat": "42.62790", - "lon": "-77.78749", - "id": 117891 - }, - { - "name": "Spring Road East", - "lat": "42.56925", - "lon": "-77.80621", - "id": 117651 - } - ], - "matchStreet": 1 - }, - { - "name": "Nissequogue", - "lat": "40.90399", - "lon": "-73.19789", - "id": 158826092, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hollow Road", - "lat": "40.89707", - "lon": "-73.18017", - "id": 173397, - "intersectedStreets": [ - { - "name": "Frog Hollow", - "lat": "40.89686", - "lon": "-73.18040" - }, - { - "name": "Spring Hill Road", - "lat": "40.89622", - "lon": "-73.18135" - }, - { - "name": "Moriches Road", - "lat": "40.89279", - "lon": "-73.18757" - } - ] - }, - { - "name": "Spring Hill Road", - "lat": "40.89759", - "lon": "-73.18257", - "id": 184256, - "intersectedStreets": [ - { - "name": "Spring Hollow Road", - "lat": "40.89622", - "lon": "-73.18135" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Elka Park", - "lat": "42.15925", - "lon": "-74.15736", - "id": 158846572, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring access trail (yellow)", - "lat": "42.13727", - "lon": "-74.16235", - "id": 271053 - } - ], - "matchStreet": 1 - }, - { - "name": "Cuba", - "lat": "42.21757", - "lon": "-78.27529", - "id": 157560443, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Spring Hill Road", - "lat": "42.21355", - "lon": "-78.25544", - "id": 83057 - }, - { - "name": "Spring Street", - "lat": "42.21704", - "lon": "-78.27016", - "id": 84103 - }, - { - "name": "Oil Spring Park Rd", - "lat": "42.23166", - "lon": "-78.30945", - "id": 82774 - } - ], - "matchStreet": 1 - }, - { - "name": "Chestertown", - "lat": "43.65257", - "lon": "-73.80096", - "id": 158821993, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Spring Street", - "lat": "43.65458", - "lon": "-73.79377", - "id": 189051 - } - ], - "matchStreet": 1 - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json b/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json deleted file mode 100644 index 525aee1b12..0000000000 --- a/OsmAnd-java/src/test/resources/search/street_komsomolskaya.json +++ /dev/null @@ -1,2897 +0,0 @@ -{ - "settings": { - "lat": "55.28666", - "lon": "52.00558", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "комсомольская", - "results": [ - "Комсомольская улица, Заинск", - "Комсомольская улица, Чукмарлы", - "Комсомольская улица, Русский Акташ", - "Комсомольская улица, Альметьевск", - "Комсомольская набережная, Набережные Челны", - "Комсомольская улица, Новое Надырово", - "Комсомольская улица, Тарловка" - ], - "amenities": [ - { - "name": "Комсомольская средняя общеобразовательная школа", - "lat": "55.58591", - "lon": "52.49345", - "id": 408464669, - "subType": "school", - "type": "education" - }, - { - "name": "ПС Комсомольская", - "lat": "55.34627", - "lon": "49.28010", - "id": 549500069, - "subType": "power_substation", - "type": "man_made" - } - ], - "cities": [ - { - "name": "Тараща", - "enName": "Tarascha", - "names": { - "de": "Taraschtscha", - "ru": "Тараща", - "uk": "Тараща", - "prefix": "місто", - "pl": "Taraszcza" - }, - "lat": "49.55550", - "lon": "30.50234", - "id": 620750304, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Сарманово", - "enName": "Sarmanovo", - "names": { - "tt": "Сарман", - "de": "Sarmanowo", - "ru": "Сарманово", - "ja": "サルマノヴォ" - }, - "lat": "55.25225", - "lon": "52.58872", - "id": 337839105, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Богатые Сабы", - "enName": "Bogatye Saby", - "names": { - "tt": "Байлар Сабасы", - "ru": "Богатые Сабы", - "ja": "ボガートィエ・サブィ" - }, - "lat": "56.01062", - "lon": "50.44677", - "id": 701847474, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Прип’ять", - "enName": "Pripyat", - "names": { - "de": "Prypjat", - "no": "Pripjat", - "be": "Прып'яць", - "fi": "Prypjat", - "ru": "Припять", - "pt": "Pripyat", - "bg": "Припя̀т", - "prefix": "місто", - "lt": "Pripetė", - "hr": "Prėpetė", - "fr": "Pripiat", - "hu": "Pripjaty", - "uk": "Прип’ять", - "sk": "Pripjať", - "sl": "Pripjat", - "id": "Prypiat", - "pam": "Prypiat", - "ca": "Pripyat", - "sr": "Припјат", - "sv": "Pripjat", - "ko": "프리피야티", - "eo": "Pripjat", - "it": "Pripjat", - "es": "Prípiat", - "zh": "普里皮亚特", - "et": "Prõpjat", - "cs": "Pripjať", - "ja": "プリピャチ", - "pl": "Prypeć", - "da": "Prypiat", - "ro": "Pripiat", - "nl": "Prypjat" - }, - "lat": "51.40613", - "lon": "30.05711", - "id": 127835001, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Актаныш", - "enName": "Aktanysh", - "names": { - "tt": "Актаныш", - "ru": "Актаныш", - "ja": "アクタヌィシ" - }, - "lat": "55.72218", - "lon": "54.05773", - "id": 606106631, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.72131", - "lon": "54.05469", - "id": 7710 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Баришівка", - "enName": "Baryshivka", - "names": { - "de": "Baryschiwka", - "ru": "Барышевка", - "uk": "Баришівка", - "prefix": "селище міського типу", - "pl": "Baryszówka" - }, - "lat": "50.36453", - "lon": "31.32567", - "id": 337523450, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старые Алгаши", - "enName": "Staryye Algashi", - "names": { - "cv": "Кивӗ Улхаш", - "ru": "Старые Алгаши" - }, - "lat": "54.66233", - "lon": "47.73995", - "id": 336525031, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.66400", - "lon": "47.73695", - "id": 11319 - } - ], - "matchStreet": 1 - }, - { - "name": "Чорнобиль", - "enName": "Chornobyl", - "names": { - "nn": "Tsjernobyl", - "de": "Tschornobyl", - "no": "Tsjernobyl", - "be": "Чарнобыль", - "fi": "Tšernobyl", - "ru": "Чернобыль", - "pt": "Chernobyl", - "prefix": "місто", - "lt": "Černobylis", - "hr": "Černobil", - "fr": "Tchernobyl", - "hu": "Csernobil", - "yi": "טשערנאבל", - "oc": "Chornobyl", - "uk": "Чорнобиль", - "sk": "Černobyľ", - "sl": "Černobil", - "id": "Chernobyl", - "ca": "Txernòbil", - "scn": "Chernobyl", - "sr": "Černobilj", - "sv": "Tjernobyl", - "ko": "초르노빌", - "af": "Černobylis", - "ms": "Chernobyl", - "eo": "Ĉernobilo", - "it": "Černobyl", - "es": "Chernóbil", - "zh": "切尔诺贝利", - "et": "Tšornobõl", - "cs": "Černobyl", - "eu": "Txernobyl", - "ar": "تشيرنوبيل", - "vi": "Chernobyl", - "lb": "Tschernobyl", - "ja": "チョルノーブィリ", - "pl": "Czarnobyl", - "da": "Tjernobyl", - "he": "צ'רנוביל", - "ro": "Cernobîl", - "nl": "Tsjernobyl", - "tr": "Çernobil" - }, - "lat": "51.27053", - "lon": "30.21944", - "id": 127834997, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Новое Надырово", - "names": { - "tt": "Яңа Нəдер" - }, - "lat": "54.89366", - "lon": "52.47019", - "id": 1504453249, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.89767", - "lon": "52.46710", - "id": 7941 - } - ], - "matchStreet": 1 - }, - { - "name": "Узин", - "enName": "Uzyn", - "names": { - "ru": "Узин", - "uk": "Узин", - "prefix": "місто", - "eo": "Uzin", - "fr": "Ouzyn", - "pl": "Uzyn" - }, - "lat": "49.82847", - "lon": "30.41973", - "id": 337543666, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Камские Поляны", - "enName": "Kamskiye Polyani", - "names": { - "tt": "Кама Аланы", - "de": "Kamskije Poljany", - "ru": "Камские Поляны", - "ja": "カムスキエ・ポリャヌィ" - }, - "lat": "55.42550", - "lon": "51.41016", - "id": 587614698, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Большие Ключи", - "names": { - "tt": "Большие Ключи" - }, - "lat": "55.98296", - "lon": "48.80483", - "id": 652108458, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.98220", - "lon": "48.79005", - "id": 5779 - } - ], - "matchStreet": 1 - }, - { - "name": "Бабинці", - "enName": "Babyntsi", - "names": { - "ru": "Бабинцы", - "uk": "Бабинці", - "prefix": "селище міського типу", - "pl": "Babyntsi" - }, - "lat": "50.64241", - "lon": "30.02907", - "id": 1668578377, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Славутич", - "enName": "Slavutych", - "names": { - "de": "Slawutytsch", - "ru": "Славутич", - "uk": "Славутич", - "prefix": "місто", - "lt": "Slavutičius", - "pl": "Sławutycz" - }, - "lat": "51.52014", - "lon": "30.75623", - "id": 337507300, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Иннополис", - "enName": "Innopolis", - "names": { - "tt": "Иннополис", - "ru": "Иннополис" - }, - "lat": "55.75226", - "lon": "48.74458", - "id": 2294499518, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Лащ-Таяба", - "names": { - "cv": "Лаш Таяпа", - "ru": "Лащ-Таяба" - }, - "lat": "55.03009", - "lon": "47.99935", - "id": 795358551, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.03201", - "lon": "47.99221", - "id": 10729 - } - ], - "matchStreet": 1 - }, - { - "name": "Вишневе", - "enName": "Vyshneve", - "names": { - "de": "Wyschnewe", - "ru": "Вишнёвое", - "uk": "Вишневе", - "prefix": "місто", - "pl": "Wysznewe", - "hu": "Vyshneve" - }, - "lat": "50.39175", - "lon": "30.36791", - "id": 36507630, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Боярка", - "enName": "Boiarka", - "names": { - "ru": "Боярка", - "uk": "Боярка", - "prefix": "місто", - "pl": "Bojarka", - "hu": "Boiarka" - }, - "lat": "50.33567", - "lon": "30.28476", - "id": 36507632, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Васильево", - "enName": "Vasilyevo", - "names": { - "tt": "Васильево", - "de": "Wassiljewo", - "ru": "Васильево", - "ja": "ヴァシーリエヴォ" - }, - "lat": "55.83729", - "lon": "48.67924", - "id": 336524045, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.83829", - "lon": "48.66132", - "id": 2221 - } - ], - "matchStreet": 1 - }, - { - "name": "Волжск", - "enName": "Volzhsk", - "names": { - "tt": "Волжск", - "de": "Wolschsk", - "ru": "Волжск", - "chm": "Юлсер-Ола", - "eo": "Volĵsk", - "it": "Volžsk", - "fr": "Voljsk", - "cs": "Volžsk", - "cv": "Волжск", - "uk": "Волзьк", - "mhr": "Юлсер-Ола", - "ja": "ヴォルシスク", - "pl": "Wołżsk", - "tr": "Voljsk" - }, - "lat": "55.86366", - "lon": "48.36186", - "id": 336523790, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "names": { - "ru": "Комсомольская улица" - }, - "lat": "55.86639", - "lon": "48.36347", - "id": 1897 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Бориспіль", - "enName": "Boryspil", - "names": { - "de": "Boryspil", - "ru": "Борисполь", - "uk": "Бориспіль", - "prefix": "місто", - "eo": "Borispilo", - "fr": "Boryspil", - "pl": "Boryspol", - "hu": "Boryspil" - }, - "lat": "50.35121", - "lon": "30.95076", - "id": 26150796, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Атабаево", - "names": { - "tt": "Атабай" - }, - "lat": "55.28842", - "lon": "49.35494", - "id": 703108525, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.28848", - "lon": "49.34872", - "id": 2636 - } - ], - "matchStreet": 1 - }, - { - "name": "Клавдієво-Тарасове", - "enName": "Klavdiievo-Tarasove", - "names": { - "ru": "Клавдиево-Тарасово", - "uk": "Клавдієво-Тарасове", - "prefix": "селище міського типу", - "pl": "Klavdiievo-Tarasove" - }, - "lat": "50.58414", - "lon": "30.00950", - "id": 337519388, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Гребінки", - "enName": "Hrebinky", - "names": { - "ru": "Гребёнки", - "uk": "Гребінки", - "prefix": "селище міського типу", - "pl": "Hrebinky" - }, - "lat": "49.95346", - "lon": "30.17635", - "id": 337539356, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Чистополь", - "enName": "Chistopol", - "names": { - "tt": "Чистай", - "de": "Tschistopol", - "cv": "Чистай", - "ru": "Чистополь", - "ja": "チストポリ" - }, - "lat": "55.37148", - "lon": "50.63674", - "id": 295864677, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.37373", - "lon": "50.65916", - "id": 4322 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ірпінь", - "enName": "Irpin", - "names": { - "de": "Irpin", - "ru": "Ирпень", - "uk": "Ірпінь", - "prefix": "місто", - "fr": "Irpine", - "pl": "Irpień", - "hu": "Irpin" - }, - "lat": "50.51665", - "lon": "30.25004", - "id": 36505064, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тарловка", - "enName": "Tarlovka", - "lat": "55.75428", - "lon": "52.32179", - "id": 573214945, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.75495", - "lon": "52.32159", - "id": 11794 - } - ], - "matchStreet": 1 - }, - { - "name": "Заинск", - "enName": "Zainsk", - "names": { - "tt": "Зәй", - "de": "Sainsk", - "ru": "Заинск", - "ja": "ザインスク" - }, - "lat": "55.28665", - "lon": "52.00561", - "id": 337839081, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.28014", - "lon": "52.00160", - "id": 729 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Яготин", - "enName": "Yahotyn", - "names": { - "de": "Jahotyn", - "ru": "Яготин", - "uk": "Яготин", - "prefix": "місто", - "pl": "Jagodzin" - }, - "lat": "50.27589", - "lon": "31.76349", - "id": 337525267, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Лесная Хмелёвка", - "lat": "54.52728", - "lon": "49.66655", - "id": 28349988061, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.52387", - "lon": "49.66524", - "id": 9249 - } - ], - "matchStreet": 1 - }, - { - "name": "Немішаєве", - "enName": "Nemishaieve", - "names": { - "ru": "Немешаево", - "uk": "Немішаєве", - "prefix": "селище міського типу", - "fr": "Nemishayeve" - }, - "lat": "50.56801", - "lon": "30.10151", - "id": 337519630, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Кагарлик", - "enName": "Kaharlyk", - "names": { - "de": "Kaharlyk", - "ru": "Кагарлык", - "uk": "Кагарлик", - "prefix": "місто", - "pl": "Kaharłyk" - }, - "lat": "49.86507", - "lon": "30.82268", - "id": 1819209275, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Муслюмово", - "enName": "Muslyumovo", - "names": { - "tt": "Мөслим", - "ru": "Муслюмово", - "ja": "ムスリュモヴォ" - }, - "lat": "55.30593", - "lon": "53.19415", - "id": 337839100, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.30712", - "lon": "53.18859", - "id": 7660 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Менделеевск", - "enName": "Mendeleyevsk", - "names": { - "tt": "Менделеевск", - "de": "Mendelejewsk", - "ru": "Менделеевск", - "ja": "メンデリェーエフスク" - }, - "lat": "55.88787", - "lon": "52.30844", - "id": 321322750, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Верхний Услон", - "enName": "Verhnij Uslon", - "names": { - "tt": "Югары Ослан", - "de": "Werchni Uslonn", - "ru": "Верхний Услон", - "ja": "ヴェルフニー・ウスロン", - "ba": "Үрге Ослан" - }, - "lat": "55.76855", - "lon": "48.98293", - "id": 703197622, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Зеленодольск", - "enName": "Zelenodol'sk", - "names": { - "tt": "Яшел Үзән", - "de": "Selenodolsk", - "ru": "Зеленодольск", - "ko": "젤레노돌스크", - "uk": "Зеленодольськ", - "mhr": "Парат", - "ja": "ゼレノドリスク", - "eo": "Zelenodolsk", - "fa": "زلنودولسک، روسیه", - "pl": "Zielonodolsk", - "ro": "Zelenodolsk", - "sr": "Зеленодољск" - }, - "lat": "55.84776", - "lon": "48.50970", - "id": 336524051, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "names": { - "ru": "Комсомольская улица" - }, - "lat": "55.84713", - "lon": "48.49792", - "id": 1958 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Вятские Поляны", - "enName": "Vyatskiye Polyany", - "names": { - "tt": "Нократ Аланы", - "de": "Wjatskije Poljany", - "ja": "ヴャーツキエ・ポリャーヌィ" - }, - "lat": "56.23101", - "lon": "51.02939", - "id": 3237869, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Глеваха", - "enName": "Hlevakha", - "names": { - "kk": "Glevaha", - "de": "Hlewacha", - "ceb": "Hlevakha", - "be": "Глэваха", - "ru": "Глеваха", - "prefix": "селище міського типу", - "fr": "Hlevakha", - "cs": "Hlevacha", - "ar": "هليفاخا", - "hy": "Հլեվահա", - "uk": "Глеваха", - "pl": "Hłewacha", - "tr": "Glevaha", - "rmy": "Hlevaha" - }, - "lat": "50.25968", - "lon": "30.30591", - "id": 337525824, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Казань", - "enName": "Kazan", - "names": { - "tt": "Казан", - "de": "Kasan", - "hi": "काज़ान", - "fi": "Kazan", - "ru": "Казань", - "pt": "Cazã", - "lt": "Kazanė", - "lv": "Kazaņa", - "fr": "Kazan", - "hu": "Kazany", - "hy": "Կազան", - "oc": "Kazan", - "ka": "ყაზანი", - "uk": "Казань", - "sk": "Kazaň", - "sr": "Казањ", - "kn": "ಕಾಜಾ಼ನ್", - "os": "Хъазан", - "chm": "Озаҥ", - "it": "Kazan'", - "kv": "Казан", - "es": "Kazán", - "zh": "喀山", - "cs": "Kazaň", - "ar": "قازان", - "cv": "Хусан", - "mhr": "Озаҥ", - "ja": "カザン", - "pl": "Kazań", - "da": "Kazan", - "he": "קאזאן", - "ro": "Kazan", - "nl": "Kazan", - "ba": "Ҡаҙан", - "udm": "Кузон" - }, - "lat": "55.78235", - "lon": "49.12423", - "id": 27504067, - "type": "CITY", - "listOfStreets": [ - { - "name": "Комсомольская улица (Козья слобода)", - "lat": "55.81106", - "lon": "49.09485", - "id": 2013 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Володарка", - "enName": "Volodarka", - "names": { - "de": "Wolodarka", - "ru": "Володарка", - "uk": "Володарка", - "prefix": "селище міського типу", - "pl": "Wołodarka" - }, - "lat": "49.52250", - "lon": "29.92805", - "id": 337556285, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старое Дрожжаное", - "enName": "Staroye Drozhzhanoye", - "names": { - "tt": "Иске Чүпрәле", - "ru": "Старое Дрожжаное", - "ja": "スターロエ・ドロジジャノエ" - }, - "lat": "54.72499", - "lon": "47.56454", - "id": 336525099, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Ворзель", - "enName": "Vorzel", - "names": { - "ru": "Ворзель", - "uk": "Ворзель", - "prefix": "селище міського типу", - "pl": "Vorzel" - }, - "lat": "50.54573", - "lon": "30.15629", - "id": 337519932, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Джалиль", - "names": { - "tt": "Җәлил", - "ja": "ジャリリ" - }, - "lat": "55.02197", - "lon": "52.73899", - "id": 371194680, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Городок", - "names": { - "ru": "Городок", - "uk": "Городок", - "prefix": "селище міського типу", - "pl": "Gródek" - }, - "lat": "50.58336", - "lon": "29.47816", - "id": 6726413, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Біла Церква", - "enName": "Bila Tserkva", - "names": { - "de": "Bila Zerkwa", - "be": "Белая Царква", - "ru": "Белая Церковь", - "prefix": "місто", - "lt": "Bila Cerkva", - "eo": "Bila-Cerkva", - "fr": "Bila Tserkva", - "hu": "Bila Cerkva", - "et": "Bila Tserkva", - "cs": "Bila Cerkva", - "uk": "Біла Церква", - "pl": "Biała Cerkiew", - "ro": "Bila Țerkva", - "sr": "Била Церква" - }, - "lat": "49.80382", - "lon": "30.11170", - "id": 255259998, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старая Майна", - "enName": "Staraya Mayna", - "names": { - "ru": "Старая Майна", - "ja": "スターラヤ・マイナ" - }, - "lat": "54.61114", - "lon": "48.92349", - "id": 11135157981, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.60671", - "lon": "48.91229", - "id": 8342 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Высокая Гора", - "names": { - "tt": "Биектау", - "ja": "ヴイソーカヤ・ゴラー" - }, - "lat": "55.91018", - "lon": "49.30720", - "id": 704304024, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Агидель", - "enName": "Agidel", - "names": { - "tt": "Агыйдел", - "ru": "Агидель", - "ja": "アギデーリ", - "ba": "Ағиҙел", - "et": "Agidel" - }, - "lat": "55.89928", - "lon": "53.93742", - "id": 251071107, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Большая Атня", - "enName": "Bolshaya Atnya", - "names": { - "tt": "Олы Әтнә", - "ru": "Большая Атня", - "ja": "ボリシャヤ・アトニャ" - }, - "lat": "56.24947", - "lon": "49.45390", - "id": 698459097, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.24843", - "lon": "49.45315", - "id": 7008 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Болгар", - "enName": "Bolgar", - "names": { - "tt": "Болгар", - "cv": "Пӑлхар", - "ru": "Болгар", - "ja": "ボルガル" - }, - "lat": "54.97474", - "lon": "49.03020", - "id": 599924350, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.96961", - "lon": "49.02911", - "id": 7480 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Челно-Вершины", - "lat": "54.41588", - "lon": "51.08582", - "id": 8519359, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Бородянка", - "enName": "Borodianka", - "names": { - "de": "Borodjanka", - "ru": "Бородянка", - "uk": "Бородянка", - "prefix": "селище міського типу", - "pl": "Borodzianka" - }, - "lat": "50.64657", - "lon": "29.92558", - "id": 295809953, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Красятичі", - "enName": "Krasiatychi", - "names": { - "de": "Krasjatytschi", - "ru": "Красятичи", - "uk": "Красятичі", - "prefix": "селище міського типу", - "pl": "Krasiatyczi" - }, - "lat": "51.07829", - "lon": "29.63779", - "id": 337512030, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Іванків", - "enName": "Ivankiv", - "names": { - "de": "Iwankiw", - "ru": "Иванков", - "uk": "Іванків", - "prefix": "селище міського типу", - "pl": "Iwanków" - }, - "lat": "50.93300", - "lon": "29.90463", - "id": 337513819, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Русский Акташ", - "enName": "Russkiy Aktash", - "names": { - "tt": "Рус Акташы", - "ru": "Русский Акташ", - "ja": "ルースキー・アクタシ" - }, - "lat": "55.04037", - "lon": "52.11699", - "id": 337839143, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.04117", - "lon": "52.11530", - "id": 148 - } - ], - "matchStreet": 1 - }, - { - "name": "Данилкино", - "lat": "56.07810", - "lon": "48.79013", - "id": 661092578, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.07952", - "lon": "48.79226", - "id": 2271 - } - ], - "matchStreet": 1 - }, - { - "name": "Ставище", - "enName": "Stavysche", - "names": { - "de": "Stawyschtsche", - "ru": "Ставище", - "uk": "Ставище", - "prefix": "селище міського типу", - "pl": "Stawyszcze" - }, - "lat": "49.38620", - "lon": "30.18316", - "id": 337560920, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Новошешминск", - "enName": "Novosheshminsk", - "names": { - "tt": "Яңа Чишмә", - "de": "Nowoscheschminsk", - "ru": "Новошешминск", - "ja": "ノヴォシェシミンスク" - }, - "lat": "55.06165", - "lon": "51.22489", - "id": 337839146, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Нырья", - "names": { - "tt": "Нырья" - }, - "lat": "56.19929", - "lon": "50.58311", - "id": 796778738, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.20261", - "lon": "50.58084", - "id": 12056 - } - ], - "matchStreet": 1 - }, - { - "name": "Малтабарово", - "names": { - "tt": "Малтабар" - }, - "lat": "55.79553", - "lon": "52.78860", - "id": 593611502, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Комсомольская", - "lat": "55.79264", - "lon": "52.78630", - "id": 12145 - } - ], - "matchStreet": 1 - }, - { - "name": "Билярск", - "names": { - "tt": "Биләр" - }, - "lat": "54.98370", - "lon": "50.38888", - "id": 336524609, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.98580", - "lon": "50.39718", - "id": 199 - } - ], - "matchStreet": 1 - }, - { - "name": "Кузкеево", - "names": { - "tt": "Күзкәй" - }, - "lat": "55.77079", - "lon": "52.80849", - "id": 593611503, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.77212", - "lon": "52.79931", - "id": 8524 - } - ], - "matchStreet": 1 - }, - { - "name": "Актюбинский", - "names": { - "tt": "Актүбә", - "ru": "Актюбинский", - "ja": "アクチュビンスキー" - }, - "lat": "54.81319", - "lon": "52.80257", - "id": 445771973, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.81157", - "lon": "52.81645", - "id": 4525 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Яльчики", - "names": { - "de": "Jaltschiki", - "cv": "Елчӗк", - "ru": "Яльчики", - "ja": "ヤリチキ" - }, - "lat": "55.16287", - "lon": "48.00334", - "id": 850408359, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Азнакаево", - "enName": "Aznakayevo", - "names": { - "tt": "Азнакай", - "de": "Asnakajewo", - "cv": "Аснакай", - "ru": "Азнакаево", - "ja": "アズナカエヴォ" - }, - "lat": "54.86296", - "lon": "53.07922", - "id": 337839164, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Карабаш", - "enName": "Karabash", - "names": { - "tt": "Карабаш", - "ja": "カラバシ" - }, - "lat": "54.69440", - "lon": "52.58739", - "id": 2406531050, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.69694", - "lon": "52.58593", - "id": 7913 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Переяслав-Хмельницький", - "enName": "Pereiaslav-Khmelnytskyi", - "names": { - "de": "Perejaslaw-Chmelnyzkyj", - "be": "Пераяслаў-Хмяльніцкі", - "ru": "Переяслав-Хмельницкий", - "uk": "Переяслав-Хмельницький", - "prefix": "місто", - "eo": "Perejaslav-Ĥmelnickij", - "pl": "Perejasław Chmielnicki" - }, - "lat": "50.06440", - "lon": "31.44474", - "id": 337535557, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Нижнекамск", - "enName": "Nizhnekamsk", - "names": { - "cs": "Nižněkamsk", - "tt": "Түбән Кама", - "de": "Nischnekamsk", - "ru": "Нижнекамск", - "uk": "Нижньокамськ", - "ja": "ニジネカムスク", - "lt": "Nižnekamskas", - "fr": "Nijnekamsk", - "pl": "Niżniekamsk", - "es": "Nizhnekamsk" - }, - "lat": "55.64129", - "lon": "51.81603", - "id": 553037933, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Малая Пурга", - "enName": "Malaya Purga", - "names": { - "ja": "マラヤ・プルガ", - "udm": "Пичи Пурга" - }, - "lat": "56.54955", - "lon": "53.00551", - "id": 621090917, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Шемурша", - "names": { - "de": "Schemurscha", - "cv": "Шӑмӑршӑ", - "ja": "シェムルシャー" - }, - "lat": "54.88548", - "lon": "47.51651", - "id": 855192927, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Агрыз", - "enName": "Agryz", - "names": { - "tt": "Әгерҗе", - "ru": "Агрыз", - "ja": "アグルイズ" - }, - "lat": "56.52546", - "lon": "52.99725", - "id": 1773881620, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.53128", - "lon": "53.00704", - "id": 7971 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Лениногорск", - "enName": "Leninogorsk", - "names": { - "tt": "Лениногорск", - "de": "Leninogorsk", - "cv": "Ҫӗнӗ Пӗҫмен", - "ru": "Лениногорск", - "ja": "レニノゴルスク" - }, - "lat": "54.59943", - "lon": "52.44691", - "id": 273310116, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.60837", - "lon": "52.46062", - "id": 1038 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Аксубаево", - "enName": "Aksubayevo", - "names": { - "tt": "Аксубай", - "de": "Aksubajewo", - "cv": "Аксу", - "ru": "Аксубаево", - "ja": "アクスバエヴォ" - }, - "lat": "54.84635", - "lon": "50.80554", - "id": 336524899, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.85470", - "lon": "50.81432", - "id": 7569 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Нурлат", - "enName": "Nurlat", - "names": { - "tt": "Нурлат", - "de": "Nurlat", - "cv": "Нурлат", - "ru": "Нурлат", - "ja": "ヌルラート" - }, - "lat": "54.42973", - "lon": "50.80196", - "id": 336525410, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.41543", - "lon": "50.80589", - "id": 1717 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Пісківка", - "enName": "Piskivka", - "names": { - "ru": "Песковка", - "uk": "Пісківка", - "prefix": "селище міського типу", - "pl": "Piskivka" - }, - "lat": "50.69686", - "lon": "29.59311", - "id": 337517677, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Октябрьский", - "enName": "Oktjabrski", - "names": { - "tt": "Октябрьски", - "de": "Oktjabrski", - "ru": "Октябрьский", - "ja": "オクチャブリスキー", - "lt": "Oktiabrskis", - "ba": "Октябрьский", - "et": "Oktjabrski" - }, - "lat": "54.48097", - "lon": "53.46600", - "id": 191901380, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "names": { - "ru": "Комсомольская улица" - }, - "lat": "54.48629", - "lon": "53.44462", - "id": 1564 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Куйбышевский Затон", - "names": { - "tt": "Куйбышев Затоны", - "ja": "クイビシェフスキー・ザトン" - }, - "lat": "55.15645", - "lon": "49.16940", - "id": 697269501, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.16218", - "lon": "49.17156", - "id": 10632 - } - ], - "matchStreet": 1 - }, - { - "name": "Буча", - "enName": "Bucha", - "names": { - "de": "Butscha", - "ru": "Буча", - "prefix": "місто", - "uk": "Буча", - "fr": "Boutcha", - "pl": "Bucza" - }, - "lat": "50.54858", - "lon": "30.22071", - "id": 312987923, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Базарные Матаки", - "enName": "Bazarnyye Mataki", - "names": { - "tt": "Базарлы Матак", - "ja": "バザールヌイエ・マターキ" - }, - "lat": "54.90349", - "lon": "49.92754", - "id": 336524666, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Борова", - "enName": "Borova", - "names": { - "ru": "Боровая", - "uk": "Борова", - "prefix": "селище міського типу", - "pl": "Borowa" - }, - "lat": "50.17834", - "lon": "30.10254", - "id": 337527400, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Нижняя Мактама", - "names": { - "tt": "Түбəн Мактама", - "ja": "ニジニャヤ・マクタマ" - }, - "lat": "54.86247", - "lon": "52.42313", - "id": 1804405492, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Велика Димерка", - "enName": "Velyka Dymerka", - "names": { - "ru": "Великая Дымерка", - "uk": "Велика Димерка", - "prefix": "селище міського типу", - "pl": "Wielka Dymirka" - }, - "lat": "50.59183", - "lon": "30.90109", - "id": 337519261, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Вишгород", - "enName": "Vyshhorod", - "names": { - "de": "Wyschhorod", - "ru": "Вышгород", - "uk": "Вишгород", - "prefix": "місто", - "fr": "Vychhorod", - "pl": "Wyszogród" - }, - "lat": "50.58243", - "lon": "30.48513", - "id": 289308798, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Обухів", - "enName": "Obukhiv", - "names": { - "de": "Obuchiw", - "ru": "Обухов", - "uk": "Обухів", - "prefix": "місто", - "fr": "Oboukhiv", - "pl": "Obuchów", - "hu": "Obukhiv" - }, - "lat": "50.11020", - "lon": "30.62675", - "id": 337534108, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Черемшан", - "enName": "Cheremshan", - "names": { - "tt": "Чирмешән", - "cv": "Ҫарӑмсан", - "ru": "Черемшан", - "ja": "チェレムシャン" - }, - "lat": "54.66110", - "lon": "51.50532", - "id": 337839206, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Українка", - "enName": "Ukrainka", - "names": { - "ru": "Украинка", - "uk": "Українка", - "prefix": "місто", - "pl": "Ukrajinka" - }, - "lat": "50.15372", - "lon": "30.74206", - "id": 337528474, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Калинівка", - "enName": "Kalynivka", - "names": { - "kk": "Kalyni'vka", - "de": "Kalyniwka (Wassylkiw)", - "hy": "Կալյնիվկա", - "ru": "Калиновка", - "vi": "Kalynivka", - "prefix": "селище міського типу", - "uk": "Калинівка", - "ja": "カルィーニウカ", - "fr": "Kalynivka", - "pl": "Kalinówka", - "ro": "Kalînivka, Vasîlkiv", - "tr": "Kalınivka" - }, - "lat": "50.22573", - "lon": "30.22618", - "id": 337526421, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Фастів", - "enName": "Fastiv", - "names": { - "de": "Fastiw", - "ru": "Фастов", - "uk": "Фастів", - "prefix": "місто", - "eo": "Fastiv", - "fr": "Fastiv", - "pl": "Fastów", - "hu": "Fastiv" - }, - "lat": "50.07993", - "lon": "29.91629", - "id": 337535126, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Уруссу", - "enName": "Urussu", - "names": { - "tt": "Урыссу", - "ru": "Уруссу", - "ja": "ウルスー" - }, - "lat": "54.59933", - "lon": "53.46632", - "id": 337839216, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.60163", - "lon": "53.44535", - "id": 2599 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Елабуга", - "enName": "Elabuga", - "names": { - "tt": "Алабуга", - "ar": "ييلابوغا", - "de": "Jelabuga", - "cv": "Алапӳ", - "ru": "Елабуга", - "uk": "Єлабуга", - "ja": "エラブガ", - "tt-lat": "Alabuğa", - "fa": "یلابوگا", - "tr": "Alabuga", - "ba": "Алабуға" - }, - "lat": "55.75771", - "lon": "52.05400", - "id": 153568874, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Ютаза", - "enName": "Yutaza", - "names": { - "tt": "Ютазы", - "ru": "Ютаза" - }, - "lat": "54.58879", - "lon": "53.27073", - "id": 337839220, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.59253", - "lon": "53.26195", - "id": 2683 - } - ], - "matchStreet": 1 - }, - { - "name": "Макарів", - "enName": "Makariv", - "names": { - "de": "Makariw", - "ru": "Макаров", - "uk": "Макарів", - "prefix": "селище міського типу", - "pl": "Makarow" - }, - "lat": "50.46399", - "lon": "29.80690", - "id": 1494035871, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Кукмор", - "enName": "Kukmor", - "names": { - "tt": "Кукмара", - "de": "Kukmor", - "ru": "Кукмор", - "ja": "クークモル" - }, - "lat": "56.18653", - "lon": "50.89721", - "id": 409487025, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.18861", - "lon": "50.88569", - "id": 10547 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Київ", - "enName": "Kyiv", - "names": { - "hi": "कीव", - "pt": "Kiev", - "prefix": "місто", - "hr": "Kijev", - "ht": "Kyèv", - "hu": "Kijev", - "lmo": "Kiev", - "xmf": "კიევი", - "yi": "קיעוו", - "hy": "Կիև", - "bar": "Kiew", - "nah": "Kiev", - "yo": "Kiev", - "pms": "Kijv", - "ia": "Kyiv", - "nan": "Kyyiv", - "id": "Kyiv", - "ie": "Kyiv", - "sco": "Kiev", - "scn": "Kiev", - "ext": "Kyiv", - "ab": "Кыив", - "qu": "Kiyiw", - "af": "Kiëf", - "pnb": "کیف", - "io": "Kyiv", - "frr": "Kyiv", - "is": "Kænugarður", - "it": "Kyiv", - "am": "ኪየቭ", - "an": "Kiev", - "zh": "基輔", - "ar": "كييف", - "jbo": "kiev", - "mhr": "Киев", - "ja": "キエフ", - "az": "Kiyev", - "zu": "IKiyevi", - "ro": "Kiev", - "ba": "Киев", - "be": "Кіеў", - "ru": "Киев", - "bg": "Киев", - "bi": "Kyiv", - "myv": "Киев ош", - "bn": "কিয়েভ", - "jv": "Kyiv", - "bo": "ཀིབ།", - "br": "Kyiv", - "sc": "Kiev", - "bs": "Kijev", - "se": "Kiova", - "sh": "Kijev", - "ka": "კიევი", - "sk": "Kyjev", - "roa-rup": "Kiev", - "sl": "Kijev", - "ca": "Kyiv", - "sq": "Kievi", - "sr": "Кијев", - "kk": "Киев", - "kl": "Kyiv", - "kn": "ಕೀವ್", - "sv": "Kiev", - "ko": "키예프", - "mrj": "Киев", - "sw": "Kiev", - "arz": "كييف", - "ku": "Kîev", - "kv": "Киев", - "ta": "கீவ்", - "ky": "Киев", - "cs": "Kyjev", - "te": "క్యివ్", - "cu": "Кꙑѥвъ", - "cv": "Кийӳ", - "tg": "Киев", - "th": "เคียฟ", - "la": "Kiovia", - "cy": "Kyiv", - "lb": "Kiew", - "tl": "Kiev", - "nds": "Kiew", - "da": "Kyiv", - "tr": "Kiev", - "tt": "Киев", - "be-tarask": "Кіеў", - "de": "Kiew", - "ln": "Kyjiw", - "ast": "Kiev", - "rue": "Київ", - "tw": "Kiev", - "hif": "Kiev", - "koi": "Киев", - "lt": "Kijevas", - "lv": "Kijeva", - "lij": "Kiev", - "lad": "Kyiv", - "ug": "كىيېۋ", - "roa-tara": "Kiev", - "vec": "Kiev", - "uk": "Київ", - "fiu-vro": "Kiiova", - "mi": "Kieu", - "ur": "کیف", - "mk": "Киев", - "pap": "Kiev", - "ml": "കീവ്", - "rmy": "Kiev", - "vep": "Kijev", - "mn": "Киев", - "mr": "क्यीव", - "uz": "Kiyev", - "ms": "Kiev", - "el": "Κίεβο", - "mt": "Kjiv", - "tzl": "Kíiv", - "als": "Kiew", - "eo": "Kievo", - "my": "ကီးယက်မြို့", - "ilo": "Kyiv", - "es": "Kyiv", - "mdf": "Киев", - "et": "Kiiev", - "eu": "Kyiv", - "dsb": "Kijew", - "vi": "Kiev", - "bat-smg": "Kijevs", - "hsb": "Kijew", - "vo": "Küyiv", - "fa": "کی‌یف", - "nl": "Kiev", - "udm": "Киев", - "nn": "Kiev", - "no": "Kiev", - "fi": "Kiova", - "yue": "基輔", - "fo": "Kyiv", - "fr": "Kyiv", - "gag": "Kyiv", - "fy": "Kiev", - "nov": "Kiyev", - "oc": "Kyiiv", - "crh": "Kiyev", - "wo": "Kiyew", - "ga": "Cív", - "ang": "Cænugeard", - "sah": "Киев", - "bxr": "Киев", - "gd": "Kyiv", - "os": "Киев", - "szl": "Kijůw", - "gl": "Kiev", - "war": "Kiev", - "bpy": "কিয়েভ", - "gv": "Kyiv", - "pa": "ਕੀਵ", - "csb": "Kyiv", - "cbk-zam": "Kyiv", - "ckb": "کیێڤ", - "pl": "Kijów", - "he": "קייב" - }, - "lat": "50.45011", - "lon": "30.52405", - "id": 26150422, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тетіїв", - "enName": "Tetiiv", - "names": { - "de": "Tetijiw", - "ru": "Тетиев", - "uk": "Тетіїв", - "prefix": "місто", - "pl": "Tetyjów" - }, - "lat": "49.36862", - "lon": "29.67712", - "id": 337561478, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тетюши", - "enName": "Tetyushi", - "names": { - "tt": "Тәтеш", - "de": "Tetjuschi", - "cv": "Теччӗ", - "ru": "Тетюши", - "ja": "テチューシ" - }, - "lat": "54.93431", - "lon": "48.83168", - "id": 336524694, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.94122", - "lon": "48.81528", - "id": 6044 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Лаишево", - "enName": "Laishevo", - "names": { - "tt": "Лаеш", - "de": "Laischewo", - "cv": "Лаиш", - "ru": "Лаишево", - "ja": "ライシェヴォ", - "lt": "Laiševas" - }, - "lat": "55.40434", - "lon": "49.54684", - "id": 336524182, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.40922", - "lon": "49.54424", - "id": 2631 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Куркуль", - "names": { - "tt": "Кыркүл" - }, - "lat": "55.19469", - "lon": "50.10916", - "id": 826359259, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.19516", - "lon": "50.11581", - "id": 6495 - } - ], - "matchStreet": 1 - }, - { - "name": "Ржищів", - "enName": "Rzhyschiv", - "names": { - "de": "Rschyschtschiw", - "ru": "Ржищев", - "uk": "Ржищів", - "prefix": "місто", - "pl": "Rzyszczów" - }, - "lat": "49.96822", - "lon": "31.04118", - "id": 337538749, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Миронівка", - "enName": "Myronivka", - "names": { - "de": "Myroniwka", - "ru": "Мироновка", - "uk": "Миронівка", - "prefix": "місто", - "pl": "Mironówka" - }, - "lat": "49.65834", - "lon": "30.98250", - "id": 5119801550, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Березань", - "enName": "Berezan", - "names": { - "de": "Beresan", - "ru": "Березань", - "uk": "Березань", - "prefix": "місто", - "lt": "Berezanė", - "pl": "Berezań" - }, - "lat": "50.31327", - "lon": "31.46892", - "id": 337524664, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Чукмарлы", - "names": { - "tt": "Чукмарлы" - }, - "lat": "55.28447", - "lon": "52.43184", - "id": 583375597, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.28066", - "lon": "52.42903", - "id": 10262 - } - ], - "matchStreet": 1 - }, - { - "name": "Нижние Вязовые", - "enName": "Nizhniye Vyazovye", - "names": { - "tt": "Карамалы Тау", - "ja": "ニジニエ・ヴャゾヴイエ" - }, - "lat": "55.79963", - "lon": "48.52238", - "id": 752193024, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.79462", - "lon": "48.52856", - "id": 7858 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Вахоткино", - "lat": "56.00524", - "lon": "48.65201", - "id": 660899983, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.00694", - "lon": "48.64604", - "id": 11576 - } - ], - "matchStreet": 1 - }, - { - "name": "Осиново", - "names": { - "tt": "Осиново" - }, - "lat": "55.87730", - "lon": "48.89103", - "id": 722796219, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.87905", - "lon": "48.88858", - "id": 3983 - } - ], - "matchStreet": 1 - }, - { - "name": "Альметьевск", - "enName": "Almetyevsk", - "names": { - "tt": "Әлмәт", - "de": "Almetjewsk", - "be": "Альмецьеўск", - "ru": "Альметьевск", - "ko": "알메티옙스크", - "lt": "Almetjevskas", - "it": "Al'met'evsk", - "fr": "Almetievsk", - "es": "Almétievsk", - "zh": "阿尔梅季耶夫斯克", - "ar": "ألميتيفسك", - "cv": "Элмет", - "uk": "Альметьєвськ", - "hsb": "Almetjewsk", - "ja": "アリメチエフスク", - "az": "Əlmət", - "fa": "آلماتیفسک", - "pl": "Almietjewsk", - "ro": "Almetievsk", - "ba": "Әлмәт" - }, - "lat": "54.89965", - "lon": "52.30149", - "id": 2173235770, - "type": "CITY", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.91562", - "lon": "52.33893", - "id": 6097 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Апастово", - "enName": "Apastovo", - "names": { - "tt": "Апас", - "ar": "أباستوفو", - "de": "Apastowo", - "cv": "Апас", - "ru": "Апастово", - "ja": "アパソトヴォ", - "ca": "Apàstovo", - "ba": "Апас" - }, - "lat": "55.20267", - "lon": "48.50687", - "id": 703166491, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Балтаси", - "enName": "Baltasi", - "names": { - "tt": "Балтач", - "ru": "Балтаси", - "ja": "バルタシ" - }, - "lat": "56.34462", - "lon": "50.21142", - "id": 701721057, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Камское Устье", - "enName": "Kamskoye Ustye", - "names": { - "tt": "Кама Тамагы", - "cv": "Кама Вӑрри", - "ru": "Камское Устье", - "ja": "カムスコエ・ウスチエ" - }, - "lat": "55.20157", - "lon": "49.26802", - "id": 336524471, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.20141", - "lon": "49.26975", - "id": 7501 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Кагарлик", - "lat": "49.85635", - "lon": "30.74794", - "id": 6629021, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Коцюбинське", - "enName": "Kotsiubynske", - "names": { - "ru": "Коцюбинское", - "uk": "Коцюбинське", - "prefix": "селище міського типу", - "pl": "Kotsiubynske" - }, - "lat": "50.49047", - "lon": "30.33379", - "id": 337520861, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Рокитне", - "enName": "Rokytne", - "names": { - "de": "Rokytne", - "ru": "Ракитное", - "uk": "Рокитне", - "prefix": "селище міського типу", - "pl": "Rokitna" - }, - "lat": "49.68673", - "lon": "30.47303", - "id": 337549274, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Богуслав", - "enName": "Bohuslav", - "names": { - "de": "Bohuslaw", - "ru": "Богуслав", - "uk": "Богуслав", - "prefix": "місто", - "pl": "Bohusław" - }, - "lat": "49.54765", - "lon": "30.87330", - "id": 337555159, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Пестрецы", - "enName": "Pestretsy", - "names": { - "tt": "Питрәч", - "ru": "Пестрецы", - "ja": "ペストレツィ", - "lt": "Pestrecai" - }, - "lat": "55.75021", - "lon": "49.65709", - "id": 697241159, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.75617", - "lon": "49.64662", - "id": 2581 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Алексеевское", - "enName": "Alexeyevskoye", - "names": { - "tt": "Алексеевск", - "de": "Alexejewskoje", - "ru": "Алексеевское", - "ja": "アレクセーエフスコエ", - "lt": "Aleksėjevskojė" - }, - "lat": "55.30496", - "lon": "50.11289", - "id": 336524229, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "names": { - "tt": "Комсомоллар урамы" - }, - "lat": "55.30439", - "lon": "50.10965", - "id": 6105 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Мензелинск", - "enName": "Menzelinsk", - "names": { - "tt": "Минзәлә", - "de": "Menselinsk", - "ru": "Мензелинск", - "ja": "メンゼリンスク" - }, - "lat": "55.72556", - "lon": "53.10718", - "id": 337839017, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.72125", - "lon": "53.11864", - "id": 3881 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Бугульма", - "enName": "Bugulma", - "names": { - "tt": "Бөгелмә", - "de": "Bugulma", - "ru": "Бугульма", - "ja": "ブグリマ" - }, - "lat": "54.53841", - "lon": "52.79559", - "id": 1707207947, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.54021", - "lon": "52.76684", - "id": 2055 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Мамадыш", - "enName": "Mamadysh", - "names": { - "tt": "Мамадыш", - "de": "Mamadysch", - "ru": "Мамадыш", - "ja": "ママドィシ", - "az": "Mamadış" - }, - "lat": "55.70908", - "lon": "51.40891", - "id": 337839024, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.72513", - "lon": "51.40426", - "id": 8919 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Бавлы", - "enName": "Bavly", - "names": { - "tt": "Баулы", - "de": "Bawly", - "ru": "Бавлы", - "ja": "バヴルィ", - "et": "Bavlõ" - }, - "lat": "54.40309", - "lon": "53.23571", - "id": 337839279, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.40355", - "lon": "53.24687", - "id": 7026 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Згурівка", - "enName": "Zghurivka", - "names": { - "de": "Shuriwka", - "ru": "Згуровка", - "prefix": "селище міського типу", - "uk": "Згурівка", - "pl": "Zhuriwka" - }, - "lat": "50.49506", - "lon": "31.76918", - "id": 337520849, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Буинск", - "enName": "Buinsk", - "names": { - "tt": "Буа", - "de": "Buinsk", - "cv": "Пӑва", - "ru": "Буинск", - "ja": "ブインスク" - }, - "lat": "54.97229", - "lon": "48.29289", - "id": 295862317, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.98741", - "lon": "48.29586", - "id": 5979 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Гостомель", - "enName": "Hostomel", - "names": { - "ru": "Гостомель", - "uk": "Гостомель", - "prefix": "селище міського типу", - "pl": "Hostomel" - }, - "lat": "50.58826", - "lon": "30.25909", - "id": 337519314, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Бровари", - "enName": "Brovary", - "names": { - "de": "Browary", - "ru": "Бровары", - "prefix": "місто", - "uk": "Бровари", - "eo": "Brovari", - "fr": "Brovary", - "pl": "Browary", - "hu": "Brovari", - "et": "Brovarõ", - "sr": "Бровари" - }, - "lat": "50.51111", - "lon": "30.79004", - "id": 3673183717, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Победа", - "names": { - "tt": "Победа" - }, - "lat": "54.67300", - "lon": "52.66657", - "id": 783002941, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "54.67386", - "lon": "52.66232", - "id": 4542 - } - ], - "matchStreet": 1 - }, - { - "name": "Димер", - "enName": "Dymer", - "names": { - "ru": "Дымер", - "uk": "Димер", - "prefix": "селище міського типу", - "pl": "Dymer" - }, - "lat": "50.78355", - "lon": "30.30780", - "id": 1585808480, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Набережные Челны", - "enName": "Naberezhnye Chelny", - "names": { - "tt": "Яр Чаллы", - "de": "Nabereschnyje Tschelny", - "no": "Naberezjnyje Tsjelny", - "be": "Наберажныя Чалны", - "fi": "Naberežnyje Tšelny", - "ru": "Набережные Челны", - "pt": "Naberejnye Chelny", - "bg": "Набережние Челни", - "lt": "Naberežnyje Čelnai", - "hr": "Naberežnye Čelny", - "lv": "Naberežnije Čelni", - "fr": "Naberejnye Tchelny", - "ka": "ნაბერეჟნიე ჩელნი", - "uk": "Набережні Човни", - "ca": "Nàberejnie_Txelní", - "sr": "Набережније Челни", - "sv": "Naberezjnyje Tjelny", - "ko": "나베레즈니예첼니", - "it": "Naberežnye Čelny", - "es": "Náberezhnye Chelny", - "zh": "卡马河畔切尔尼", - "et": "Naberežnõje Tšelnõ", - "cs": "Naberežnyje Čelny", - "ar": "نابريجناي تشلني", - "cv": "Чаллă", - "ja": "ナベレジヌイェ・チェルヌイ", - "az": "Naberejnıye Çelnı", - "fa": "نابرژنیه چلنی", - "pl": "Nabierieżnyje Czełny", - "ro": "Naberejnîe Celnî", - "nl": "Naberezjnye Tsjelny", - "tr": "Yarçallı", - "ba": "Яр Саллы" - }, - "lat": "55.74201", - "lon": "52.39923", - "id": 191749240, - "type": "CITY", - "listOfStreets": [ - { - "name": "Комсомольская набережная", - "lat": "55.69179", - "lon": "52.29220", - "id": 1022 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Сквира", - "enName": "Skvyra", - "names": { - "kk": "Skvyra", - "de": "Skwyra", - "ceb": "Skvyra", - "be": "Сквыра", - "ru": "Сквира", - "sv": "Skvyra", - "prefix": "місто", - "it": "Skvyra", - "fr": "Skvyra", - "cs": "Skvyra", - "hy": "Սկվյրա", - "vi": "Skvyra", - "uk": "Сквира", - "sk": "Skvyra", - "fa": "اسکویرا", - "pl": "Skwyra", - "ro": "Skvîra" - }, - "lat": "49.73370", - "lon": "29.66266", - "id": 337547206, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Рыбная Слобода", - "enName": "Rybnaya Sloboda", - "names": { - "tt": "Балык Бистәсе", - "ru": "Рыбная Слобода", - "ja": "ルィブナヤ・スロボーダ" - }, - "lat": "55.46442", - "lon": "50.14061", - "id": 703680750, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "55.45858", - "lon": "50.13169", - "id": 10141 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Арск", - "enName": "Arsk", - "names": { - "tt": "Арча", - "de": "Arsk", - "ru": "Арск", - "ja": "アルスク" - }, - "lat": "56.09099", - "lon": "49.87718", - "id": 295868224, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Комсомольская улица", - "lat": "56.08784", - "lon": "49.86229", - "id": 6776 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Тюлячи", - "enName": "Tyulyachi", - "names": { - "tt": "Теләче", - "ru": "Тюлячи", - "ja": "チュリャチ" - }, - "lat": "55.89188", - "lon": "50.23350", - "id": 697241170, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Васильків", - "enName": "Vasylkiv", - "names": { - "de": "Wassylkiw", - "ru": "Васильков", - "uk": "Васильків", - "prefix": "місто", - "fr": "Vassylkiv", - "pl": "Wasilków", - "hu": "Vasylkiv" - }, - "lat": "50.17387", - "lon": "30.32158", - "id": 337527490, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Красный Ключ", - "enName": "Krasny Klyuch", - "names": { - "tt": "Красный Ключ", - "ja": "クラスヌイ・クリューチ" - }, - "lat": "55.68249", - "lon": "51.81914", - "id": 585272830, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/street_lenina_30.json b/OsmAnd-java/src/test/resources/search/street_lenina_30.json deleted file mode 100644 index 2c510ea1e0..0000000000 --- a/OsmAnd-java/src/test/resources/search/street_lenina_30.json +++ /dev/null @@ -1,8626 +0,0 @@ -{ - "settings": { - "lat": "55.28666", - "lon": "52.00558", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "ленина 30", - "results": [ - "30А, улица Ленина, Заинск", - "30Б, улица Ленина, Заинск", - "30, улица Ленина, Сарманово", - "30, улица Ленина, Большое Афанасово", - "30, улица Ленина, Альметьевск", - "30А, улица Ленина, Альметьевск", - "улица Ленина, Заинск", - "улица Ленина, Аксарино", - "улица Ленина, Светлое Озеро" - ], - "amenities": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.26804", - "lon": "50.85634", - "id": 712954141, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "улица Ленина", - "lat": "55.25628", - "lon": "51.75138", - "id": 1168759757, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "surface_gravel": "gravel", - "bridge_car": "yes" - } - }, - { - "name": "Дом-музей В.И.Ленина", - "lat": "55.78690", - "lon": "49.13873", - "id": 345097079, - "subType": "museum", - "type": "tourism" - }, - { - "name": "Дом-музей В.И.Ленина", - "lat": "55.78690", - "lon": "49.13873", - "id": 345097079, - "subType": "building", - "type": "man_made" - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.33029", - "lon": "50.80344", - "id": 714393277, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "ref": "16К-1014" - } - }, - { - "name": "Ленина 148", - "lat": "56.34420", - "lon": "50.23104", - "id": 10550243242, - "subType": "wilderness_hut", - "type": "tourism" - }, - { - "name": "совхоза имени Ленина", - "enName": "Sovkhoza imeni Lenina", - "names": { - "ru": "совхоза имени Ленина" - }, - "lat": "55.58691", - "lon": "37.73102", - "id": -627450, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "4742" - } - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.30894", - "lon": "50.10678", - "id": 346283479, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.51206", - "lon": "51.81751", - "id": 482839291, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "улица Ленина", - "lat": "54.89796", - "lon": "52.28482", - "id": 9047976566, - "subType": "clock", - "type": "tourism", - "additionalInfo": { - "date_yes": "yes", - "support_pole": "pole", - "display_digital_yes": "yes", - "visibility_street": "street", - "start_date": "2016" - } - }, - { - "name": "улица Ленина", - "lat": "54.89796", - "lon": "52.28482", - "id": 9047976566, - "subType": "monitoring_station", - "type": "man_made", - "additionalInfo": { - "date_yes": "yes", - "support_pole": "pole", - "display_digital_yes": "yes", - "visibility_street": "street", - "start_date": "2016" - } - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.21664", - "lon": "48.36718", - "id": 311139765, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.98256", - "lon": "50.38562", - "id": 603647995, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "ДК им.Ленина", - "names": { - "tt": "Ленин исемендәге мәдәният һәм ял комплексы" - }, - "lat": "55.85446", - "lon": "49.08569", - "id": 1981869798, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "6, 18, 42, 60, 76", - "operator": "ПАТП-2, ПАТП-4" - } - }, - { - "name": "Парк «Крылья Советов»", - "names": { - "tt": "«Крылья Советов» паркы", - "ru": "Парк «Крылья Советов»" - }, - "lat": "55.85330", - "lon": "49.09005", - "id": 81482207, - "subType": "park", - "type": "entertainment", - "additionalInfo": { - "wikipedia": "http://ru.wikipedia.org/wiki/Крылья Советов (парк)", - "old_name": "Парк Ленина" - } - }, - { - "name": "Культурно-досуговый комплекс им. В.И.Ленина", - "lat": "55.85390", - "lon": "49.08687", - "id": 145151087, - "subType": "community_centre", - "type": "entertainment", - "additionalInfo": { - "website": "https://vk.com/kdklenin" - } - }, - { - "name": "Культурно-досуговый комплекс им. В.И.Ленина", - "lat": "55.85390", - "lon": "49.08687", - "id": 145151087, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "website": "https://vk.com/kdklenin" - } - }, - { - "name": "Ленина", - "lat": "55.83146", - "lon": "48.66248", - "id": 899597590, - "subType": "public_transport_stop_position", - "type": "transportation" - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "ru": "улица Ленина", - "be": "вулiца Ленiна", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.51247", - "lon": "52.99594", - "id": 620696879, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "НПО им. Ленина", - "lat": "55.86587", - "lon": "48.86088", - "id": 4776241786, - "subType": "suburb", - "type": "administrative" - }, - { - "name": "Ул Ленина", - "lat": "55.93939", - "lon": "52.25632", - "id": 10608626446, - "subType": "bus_stop", - "type": "transportation" - }, - { - "name": "НПО им. Ленина", - "lat": "55.86505", - "lon": "48.86116", - "id": 116563497, - "subType": "suburb", - "type": "administrative", - "additionalInfo": { - "rural": "rural" - } - }, - { - "name": "НПО им. Ленина", - "lat": "55.86505", - "lon": "48.86116", - "id": 116563497, - "subType": "residential", - "type": "administrative", - "additionalInfo": { - "rural": "rural" - } - }, - { - "name": "Леніна", - "enName": "Lenina", - "names": { - "ru": "Ленина", - "uk": "Леніна" - }, - "lat": "48.43517", - "lon": "39.14890", - "id": -707666, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "1083" - } - }, - { - "name": "Санаторий имени В.И. Ленина", - "lat": "54.59147", - "lon": "48.40525", - "id": 399567309, - "subType": "resort", - "type": "tourism", - "additionalInfo": { - "sanatorium": "sanatorium", - "operator": "ОАО \"Ульяновсккурорт\"" - } - }, - { - "name": "ДК им.Ленина", - "names": { - "tt": "Ленин исемендәге мәдәният һәм ял комплексы" - }, - "lat": "55.85434", - "lon": "49.08668", - "id": 1981869822, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "42, 93", - "operator": "ПАТП-4" - } - }, - { - "name": "Парк Ленина", - "lat": "56.18713", - "lon": "50.89041", - "id": 705187927, - "subType": "park", - "type": "entertainment" - } - ], - "cities": [ - { - "name": "Тараща", - "enName": "Tarascha", - "names": { - "de": "Taraschtscha", - "ru": "Тараща", - "uk": "Тараща", - "prefix": "місто", - "pl": "Taraszcza" - }, - "lat": "49.55550", - "lon": "30.50234", - "id": 620750304, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Сарманово", - "enName": "Sarmanovo", - "names": { - "tt": "Сарман", - "de": "Sarmanowo", - "ru": "Сарманово", - "ja": "サルマノヴォ" - }, - "lat": "55.25225", - "lon": "52.58872", - "id": 337839105, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.24364", - "lon": "52.57943", - "id": 1777, - "buildings": [ - { - "name": "1", - "lat": "55.24647", - "lon": "52.58063" - }, - { - "name": "2В", - "lat": "55.24580", - "lon": "52.58254" - }, - { - "name": "12А", - "lat": "55.24959", - "lon": "52.58672" - }, - { - "name": "17", - "lat": "55.24952", - "lon": "52.58473" - }, - { - "name": "20", - "lat": "55.25097", - "lon": "52.58722" - }, - { - "name": "22", - "lat": "55.25134", - "lon": "52.58775" - }, - { - "name": "24", - "lat": "55.25156", - "lon": "52.58810" - }, - { - "name": "26", - "lat": "55.25185", - "lon": "52.58900" - }, - { - "name": "28Б", - "lat": "55.25162", - "lon": "52.59093" - }, - { - "name": "28Б", - "lat": "55.25192", - "lon": "52.59042" - }, - { - "name": "30", - "lat": "55.25225", - "lon": "52.58949" - }, - { - "name": "31", - "lat": "55.25155", - "lon": "52.58679" - }, - { - "name": "32", - "lat": "55.25298", - "lon": "52.58996" - }, - { - "name": "33", - "lat": "55.25203", - "lon": "52.58741" - }, - { - "name": "34", - "lat": "55.25328", - "lon": "52.59018" - }, - { - "name": "35", - "lat": "55.25260", - "lon": "52.58801" - }, - { - "name": "37", - "lat": "55.25320", - "lon": "52.58840" - }, - { - "name": "40", - "lat": "55.25361", - "lon": "52.59050", - "postcode": "423350" - }, - { - "name": "42", - "lat": "55.25394", - "lon": "52.59091", - "postcode": "423350" - }, - { - "name": "44", - "lat": "55.25435", - "lon": "52.59149", - "postcode": "423350" - }, - { - "name": "46", - "lat": "55.25449", - "lon": "52.59181", - "postcode": "423350" - }, - { - "name": "48", - "lat": "55.25470", - "lon": "52.59190" - }, - { - "name": "50", - "lat": "55.25491", - "lon": "52.59228" - }, - { - "name": "52", - "lat": "55.25532", - "lon": "52.59275" - }, - { - "name": "58", - "lat": "55.25519", - "lon": "52.59449" - }, - { - "name": "60", - "lat": "55.25554", - "lon": "52.59404" - }, - { - "name": "62", - "lat": "55.25602", - "lon": "52.59359" - }, - { - "name": "63", - "lat": "55.25674", - "lon": "52.59177" - }, - { - "name": "65", - "lat": "55.25629", - "lon": "52.59282" - } - ], - "intersectedStreets": [ - { - "name": "улица Хайруллина", - "lat": "55.23851", - "lon": "52.57400" - }, - { - "name": "улица Рафикова", - "lat": "55.23939", - "lon": "52.57497" - }, - { - "name": "улица Татарстана", - "names": { - "tt": "Татарстан урамы" - }, - "lat": "55.24022", - "lon": "52.57587" - }, - { - "name": "улица Х. Туфана", - "lat": "55.24104", - "lon": "52.57673" - }, - { - "name": "улица З. Хасана", - "lat": "55.24187", - "lon": "52.57756" - }, - { - "name": "улица М. Тинчурина", - "lat": "55.24281", - "lon": "52.57855" - }, - { - "name": "улица Гаяза Исхаки", - "lat": "55.24364", - "lon": "52.57943" - }, - { - "name": "Советская улица", - "lat": "55.24519", - "lon": "52.58100" - }, - { - "name": "улица Строителей", - "lat": "55.24686", - "lon": "52.58256" - }, - { - "name": "улица Яруллина", - "lat": "55.24874", - "lon": "52.58439" - }, - { - "name": "улица Терешковой", - "lat": "55.25358", - "lon": "52.59007" - }, - { - "name": "улица Мусы Джалиля", - "lat": "55.26035", - "lon": "52.60063" - }, - { - "name": "улица Ямашева", - "lat": "55.26347", - "lon": "52.60303" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Богатые Сабы", - "enName": "Bogatye Saby", - "names": { - "tt": "Байлар Сабасы", - "ru": "Богатые Сабы", - "ja": "ボガートィエ・サブィ" - }, - "lat": "56.01062", - "lon": "50.44677", - "id": 701847474, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.01590", - "lon": "50.46038", - "id": 8825 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Прип’ять", - "enName": "Pripyat", - "names": { - "de": "Prypjat", - "no": "Pripjat", - "be": "Прып'яць", - "fi": "Prypjat", - "ru": "Припять", - "pt": "Pripyat", - "bg": "Припя̀т", - "prefix": "місто", - "lt": "Pripetė", - "hr": "Prėpetė", - "fr": "Pripiat", - "hu": "Pripjaty", - "uk": "Прип’ять", - "sk": "Pripjať", - "sl": "Pripjat", - "id": "Prypiat", - "pam": "Prypiat", - "ca": "Pripyat", - "sr": "Припјат", - "sv": "Pripjat", - "ko": "프리피야티", - "eo": "Pripjat", - "it": "Pripjat", - "es": "Prípiat", - "zh": "普里皮亚特", - "et": "Prõpjat", - "cs": "Pripjať", - "ja": "プリピャチ", - "pl": "Prypeć", - "da": "Prypiat", - "ro": "Pripiat", - "nl": "Prypjat" - }, - "lat": "51.40613", - "lon": "30.05711", - "id": 127835001, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Актаныш", - "enName": "Aktanysh", - "names": { - "tt": "Актаныш", - "ru": "Актаныш", - "ja": "アクタヌィシ" - }, - "lat": "55.72218", - "lon": "54.05773", - "id": 606106631, - "type": "TOWN", - "listOfStreets": [ - { - "name": "проспект Ленина", - "lat": "55.72025", - "lon": "54.06795", - "id": 681 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Баришівка", - "enName": "Baryshivka", - "names": { - "de": "Baryschiwka", - "ru": "Барышевка", - "uk": "Баришівка", - "prefix": "селище міського типу", - "pl": "Baryszówka" - }, - "lat": "50.36453", - "lon": "31.32567", - "id": 337523450, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Чорнобиль", - "enName": "Chornobyl", - "names": { - "nn": "Tsjernobyl", - "de": "Tschornobyl", - "no": "Tsjernobyl", - "be": "Чарнобыль", - "fi": "Tšernobyl", - "ru": "Чернобыль", - "pt": "Chernobyl", - "prefix": "місто", - "lt": "Černobylis", - "hr": "Černobil", - "fr": "Tchernobyl", - "hu": "Csernobil", - "yi": "טשערנאבל", - "oc": "Chornobyl", - "uk": "Чорнобиль", - "sk": "Černobyľ", - "sl": "Černobil", - "id": "Chernobyl", - "ca": "Txernòbil", - "scn": "Chernobyl", - "sr": "Černobilj", - "sv": "Tjernobyl", - "ko": "초르노빌", - "af": "Černobylis", - "ms": "Chernobyl", - "eo": "Ĉernobilo", - "it": "Černobyl", - "es": "Chernóbil", - "zh": "切尔诺贝利", - "et": "Tšornobõl", - "cs": "Černobyl", - "eu": "Txernobyl", - "ar": "تشيرنوبيل", - "vi": "Chernobyl", - "lb": "Tschernobyl", - "ja": "チョルノーブィリ", - "pl": "Czarnobyl", - "da": "Tjernobyl", - "he": "צ'רנוביל", - "ro": "Cernobîl", - "nl": "Tsjernobyl", - "tr": "Çernobil" - }, - "lat": "51.27053", - "lon": "30.21944", - "id": 127834997, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "НПО им. Ленина", - "lat": "55.86587", - "lon": "48.86088", - "id": 2388120893, - "type": "SUBURB", - "listOfStreets": [], - "matchCity": 1 - }, - { - "name": "Узин", - "enName": "Uzyn", - "names": { - "ru": "Узин", - "uk": "Узин", - "prefix": "місто", - "eo": "Uzin", - "fr": "Ouzyn", - "pl": "Uzyn" - }, - "lat": "49.82847", - "lon": "30.41973", - "id": 337543666, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Камские Поляны", - "enName": "Kamskiye Polyani", - "names": { - "tt": "Кама Аланы", - "de": "Kamskije Poljany", - "ru": "Камские Поляны", - "ja": "カムスキエ・ポリャヌィ" - }, - "lat": "55.42550", - "lon": "51.41016", - "id": 587614698, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Малая Шильна", - "names": { - "tt": "Кече Шилнә" - }, - "lat": "55.80199", - "lon": "52.53396", - "id": 593611093, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.80198", - "lon": "52.53385", - "id": 8882, - "buildings": [ - { - "name": "10", - "lat": "55.80697", - "lon": "52.53375" - }, - { - "name": "23", - "lat": "55.80428", - "lon": "52.53360" - } - ], - "intersectedStreets": [ - { - "name": "Солнечная улица", - "lat": "55.79622", - "lon": "52.53536" - }, - { - "name": "Родниковая улица", - "lat": "55.79746", - "lon": "52.53497" - }, - { - "name": "Центральная улица", - "lat": "55.80198", - "lon": "52.53385" - }, - { - "name": "улица Карла Маркса", - "lat": "55.80718", - "lon": "52.53402" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Малая Цильна", - "names": { - "tt": "Кече Чынлы" - }, - "lat": "54.76570", - "lon": "47.86951", - "id": 761955165, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.76848", - "lon": "47.85664", - "id": 10999 - } - ], - "matchStreet": 1 - }, - { - "name": "Бабинці", - "enName": "Babyntsi", - "names": { - "ru": "Бабинцы", - "uk": "Бабинці", - "prefix": "селище міського типу", - "pl": "Babyntsi" - }, - "lat": "50.64241", - "lon": "30.02907", - "id": 1668578377, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Славутич", - "enName": "Slavutych", - "names": { - "de": "Slawutytsch", - "ru": "Славутич", - "uk": "Славутич", - "prefix": "місто", - "lt": "Slavutičius", - "pl": "Sławutycz" - }, - "lat": "51.52014", - "lon": "30.75623", - "id": 337507300, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Иннополис", - "enName": "Innopolis", - "names": { - "tt": "Иннополис", - "ru": "Иннополис" - }, - "lat": "55.75226", - "lon": "48.74458", - "id": 2294499518, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Измери", - "names": { - "tt": "Әҗмәр" - }, - "lat": "55.13665", - "lon": "49.53504", - "id": 787285204, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "55.13857", - "lon": "49.53388", - "id": 11882 - } - ], - "matchStreet": 1 - }, - { - "name": "Лащ-Таяба", - "names": { - "cv": "Лаш Таяпа", - "ru": "Лащ-Таяба" - }, - "lat": "55.03009", - "lon": "47.99935", - "id": 795358551, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "55.03053", - "lon": "47.99341", - "id": 11865 - } - ], - "matchStreet": 1 - }, - { - "name": "Вишневе", - "enName": "Vyshneve", - "names": { - "de": "Wyschnewe", - "ru": "Вишнёвое", - "uk": "Вишневе", - "prefix": "місто", - "pl": "Wysznewe", - "hu": "Vyshneve" - }, - "lat": "50.39175", - "lon": "30.36791", - "id": 36507630, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Боярка", - "enName": "Boiarka", - "names": { - "ru": "Боярка", - "uk": "Боярка", - "prefix": "місто", - "pl": "Bojarka", - "hu": "Boiarka" - }, - "lat": "50.33567", - "lon": "30.28476", - "id": 36507632, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Васильево", - "enName": "Vasilyevo", - "names": { - "tt": "Васильево", - "de": "Wassiljewo", - "ru": "Васильево", - "ja": "ヴァシーリエヴォ" - }, - "lat": "55.83729", - "lon": "48.67924", - "id": 336524045, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.83157", - "lon": "48.65047", - "id": 71 - } - ], - "matchStreet": 1 - }, - { - "name": "Волжск", - "enName": "Volzhsk", - "names": { - "tt": "Волжск", - "de": "Wolschsk", - "ru": "Волжск", - "chm": "Юлсер-Ола", - "eo": "Volĵsk", - "it": "Volžsk", - "fr": "Voljsk", - "cs": "Volžsk", - "cv": "Волжск", - "uk": "Волзьк", - "mhr": "Юлсер-Ола", - "ja": "ヴォルシスク", - "pl": "Wołżsk", - "tr": "Voljsk" - }, - "lat": "55.86366", - "lon": "48.36186", - "id": 336523790, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.86402", - "lon": "48.35956", - "id": 14 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Бориспіль", - "enName": "Boryspil", - "names": { - "de": "Boryspil", - "ru": "Борисполь", - "uk": "Бориспіль", - "prefix": "місто", - "eo": "Borispilo", - "fr": "Boryspil", - "pl": "Boryspol", - "hu": "Boryspil" - }, - "lat": "50.35121", - "lon": "30.95076", - "id": 26150796, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Клавдієво-Тарасове", - "enName": "Klavdiievo-Tarasove", - "names": { - "ru": "Клавдиево-Тарасово", - "uk": "Клавдієво-Тарасове", - "prefix": "селище міського типу", - "pl": "Klavdiievo-Tarasove" - }, - "lat": "50.58414", - "lon": "30.00950", - "id": 337519388, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Гребінки", - "enName": "Hrebinky", - "names": { - "ru": "Гребёнки", - "uk": "Гребінки", - "prefix": "селище міського типу", - "pl": "Hrebinky" - }, - "lat": "49.95346", - "lon": "30.17635", - "id": 337539356, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Большое Мереткозино", - "names": { - "tt": "Олы Мәрәтхуҗа" - }, - "lat": "55.23953", - "lon": "49.07874", - "id": 723847137, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "55.23875", - "lon": "49.08286", - "id": 11838 - } - ], - "matchStreet": 1 - }, - { - "name": "Чистополь", - "enName": "Chistopol", - "names": { - "tt": "Чистай", - "de": "Tschistopol", - "cv": "Чистай", - "ru": "Чистополь", - "ja": "チストポリ" - }, - "lat": "55.37148", - "lon": "50.63674", - "id": 295864677, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.37059", - "lon": "50.64558", - "id": 234 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Чупаево", - "names": { - "tt": "Чупай" - }, - "lat": "54.79709", - "lon": "52.13289", - "id": 867304315, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.79555", - "lon": "52.12682", - "id": 6365, - "intersectedStreets": [ - { - "name": "улица Кирова", - "names": { - "tt": "Киров урамы" - }, - "lat": "54.79539", - "lon": "52.12725" - }, - { - "name": "Советская улица", - "lat": "54.79425", - "lon": "52.13004" - }, - { - "name": "улица Тукая", - "lat": "54.79326", - "lon": "52.13470" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Малые Кабаны", - "names": { - "tt": "Кече Кабан" - }, - "lat": "55.65275", - "lon": "49.28042", - "id": 760312409, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.64963", - "lon": "49.27699", - "id": 10859 - } - ], - "matchStreet": 1 - }, - { - "name": "Ірпінь", - "enName": "Irpin", - "names": { - "de": "Irpin", - "ru": "Ирпень", - "uk": "Ірпінь", - "prefix": "місто", - "fr": "Irpine", - "pl": "Irpień", - "hu": "Irpin" - }, - "lat": "50.51665", - "lon": "30.25004", - "id": 36505064, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Починок Сутер", - "names": { - "tt": "Пүчинкә-Сутер" - }, - "lat": "56.06771", - "lon": "51.02679", - "id": 797048460, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.06966", - "lon": "51.03001", - "id": 6864 - } - ], - "matchStreet": 1 - }, - { - "name": "Заинск", - "enName": "Zainsk", - "names": { - "tt": "Зәй", - "de": "Sainsk", - "ru": "Заинск", - "ja": "ザインスク" - }, - "lat": "55.28665", - "lon": "52.00561", - "id": 337839081, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.28712", - "lon": "51.99900", - "id": 730, - "buildings": [ - { - "name": "1", - "lat": "55.28849", - "lon": "52.00003", - "postcode": "423520" - }, - { - "name": "1А", - "lat": "55.29061", - "lon": "52.00093", - "postcode": "423520" - }, - { - "name": "1Б", - "lat": "55.29008", - "lon": "52.00082", - "postcode": "423520" - }, - { - "name": "1В", - "lat": "55.28956", - "lon": "52.00072" - }, - { - "name": "1Г", - "lat": "55.28980", - "lon": "52.00022", - "postcode": "423520" - }, - { - "name": "2", - "lat": "55.28615", - "lon": "51.99898", - "postcode": "423520" - }, - { - "name": "2А", - "lat": "55.28889", - "lon": "51.99926", - "postcode": "423520" - }, - { - "name": "2Б", - "lat": "55.28988", - "lon": "51.99958" - }, - { - "name": "2Г", - "lat": "55.28738", - "lon": "51.99911" - }, - { - "name": "2Д", - "lat": "55.28712", - "lon": "51.99900" - }, - { - "name": "2Д", - "lat": "55.28713", - "lon": "51.99900" - }, - { - "name": "3", - "lat": "55.28769", - "lon": "52.00014" - }, - { - "name": "4", - "lat": "55.28574", - "lon": "51.99887", - "postcode": "423520" - }, - { - "name": "5", - "lat": "55.28701", - "lon": "51.99973" - }, - { - "name": "6", - "lat": "55.28530", - "lon": "51.99878", - "postcode": "423520" - }, - { - "name": "6А", - "lat": "55.28503", - "lon": "51.99799" - }, - { - "name": "7", - "lat": "55.28578", - "lon": "51.99947", - "postcode": "423520" - }, - { - "name": "7А", - "lat": "55.28545", - "lon": "52.00011", - "postcode": "423520" - }, - { - "name": "7Б", - "lat": "55.28551", - "lon": "51.99945", - "postcode": "423520" - }, - { - "name": "8", - "lat": "55.28470", - "lon": "51.99859", - "postcode": "423520" - }, - { - "name": "9", - "lat": "55.28487", - "lon": "51.99930", - "postcode": "423520" - }, - { - "name": "9А", - "lat": "55.28508", - "lon": "52.00005" - }, - { - "name": "9Б", - "lat": "55.28364", - "lon": "51.99941" - }, - { - "name": "9Б", - "lat": "55.28354", - "lon": "51.99913", - "postcode": "423520" - }, - { - "name": "10", - "lat": "55.28427", - "lon": "51.99855", - "postcode": "423520" - }, - { - "name": "10А", - "lat": "55.28413", - "lon": "51.99821" - }, - { - "name": "10Б", - "lat": "55.28436", - "lon": "51.99818" - }, - { - "name": "11", - "lat": "55.28221", - "lon": "51.99876", - "postcode": "423520" - }, - { - "name": "11А", - "lat": "55.28189", - "lon": "51.99941" - }, - { - "name": "12", - "lat": "55.28384", - "lon": "51.99846", - "postcode": "423520" - }, - { - "name": "13", - "lat": "55.28167", - "lon": "51.99868", - "postcode": "423520" - }, - { - "name": "14", - "lat": "55.28331", - "lon": "51.99838", - "postcode": "423520" - }, - { - "name": "15", - "lat": "55.28129", - "lon": "51.99857", - "postcode": "423520" - }, - { - "name": "15А", - "lat": "55.28151", - "lon": "51.99934" - }, - { - "name": "16А", - "lat": "55.28289", - "lon": "51.99814" - }, - { - "name": "17", - "lat": "55.28023", - "lon": "51.99823", - "postcode": "423520" - }, - { - "name": "18", - "lat": "55.28245", - "lon": "51.99823", - "postcode": "423520" - }, - { - "name": "18А", - "lat": "55.28217", - "lon": "51.99743" - }, - { - "name": "19", - "lat": "55.27951", - "lon": "51.99827", - "postcode": "423520" - }, - { - "name": "19А", - "lat": "55.27863", - "lon": "51.99808", - "postcode": "423520" - }, - { - "name": "19А", - "lat": "55.27892", - "lon": "51.99821" - }, - { - "name": "19Б", - "lat": "55.27912", - "lon": "51.99816", - "postcode": "423520" - }, - { - "name": "20", - "lat": "55.28185", - "lon": "51.99810", - "postcode": "423520" - }, - { - "name": "21", - "lat": "55.27742", - "lon": "51.99795" - }, - { - "name": "22", - "lat": "55.28143", - "lon": "51.99801" - }, - { - "name": "23", - "lat": "55.27684", - "lon": "51.99771" - }, - { - "name": "23А", - "lat": "55.27714", - "lon": "51.99893" - }, - { - "name": "24", - "lat": "55.28099", - "lon": "51.99793" - }, - { - "name": "25", - "lat": "55.27600", - "lon": "51.99754" - }, - { - "name": "25А", - "lat": "55.27632", - "lon": "51.99866" - }, - { - "name": "26", - "lat": "55.28037", - "lon": "51.99778" - }, - { - "name": "26А", - "lat": "55.27968", - "lon": "51.99715" - }, - { - "name": "26Г/1", - "lat": "55.27982", - "lon": "51.99602" - }, - { - "name": "26Г/2", - "lat": "55.28017", - "lon": "51.99600", - "postcode": "423520" - }, - { - "name": "27", - "lat": "55.27534", - "lon": "51.99859" - }, - { - "name": "27А", - "lat": "55.27566", - "lon": "52.00093" - }, - { - "name": "27Б", - "lat": "55.27607", - "lon": "52.00200" - }, - { - "name": "28", - "lat": "55.27761", - "lon": "51.99718" - }, - { - "name": "28А", - "lat": "55.27859", - "lon": "51.99737" - }, - { - "name": "29", - "lat": "55.27486", - "lon": "51.99735" - }, - { - "name": "29А", - "lat": "55.27511", - "lon": "51.99840" - }, - { - "name": "29Б", - "lat": "55.27492", - "lon": "51.99930" - }, - { - "name": "30Б", - "lat": "55.27657", - "lon": "51.99698" - }, - { - "name": "30А", - "lat": "55.27579", - "lon": "51.99679", - "postcode": "423520" - }, - { - "name": "31", - "lat": "55.27457", - "lon": "51.99833" - }, - { - "name": "32", - "lat": "55.27589", - "lon": "51.99524" - }, - { - "name": "34", - "lat": "55.27500", - "lon": "51.99664" - }, - { - "name": "34А", - "lat": "55.27530", - "lon": "51.99503" - }, - { - "name": "36", - "lat": "55.27461", - "lon": "51.99533" - } - ], - "intersectedStreets": [ - { - "name": "проспект Нефтяников", - "lat": "55.28642", - "lon": "51.99932" - }, - { - "name": "улица Лобачевского", - "lat": "55.28428", - "lon": "51.99887" - }, - { - "name": "улица Островского", - "lat": "55.28356", - "lon": "51.99872" - }, - { - "name": "улица Крупской", - "lat": "55.28284", - "lon": "51.99857" - }, - { - "name": "переулок Строителей", - "lat": "55.28265", - "lon": "51.99853" - }, - { - "name": "Комсомольская улица", - "lat": "55.28069", - "lon": "51.99812" - }, - { - "name": "Казанская улица", - "names": { - "tt": "Казан урамы", - "tt-lat": "Qazan uramı" - }, - "lat": "55.28885", - "lon": "51.99975" - }, - { - "name": "улица Никифорова", - "lat": "55.27815", - "lon": "51.99763" - }, - { - "name": "улица Гагарина", - "names": { - "tt": "Гагарин урамы" - }, - "lat": "55.27597", - "lon": "51.99720" - }, - { - "name": "улица Надежды", - "lat": "55.27431", - "lon": "51.99685" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Яготин", - "enName": "Yahotyn", - "names": { - "de": "Jahotyn", - "ru": "Яготин", - "uk": "Яготин", - "prefix": "місто", - "pl": "Jagodzin" - }, - "lat": "50.27589", - "lon": "31.76349", - "id": 337525267, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Немішаєве", - "enName": "Nemishaieve", - "names": { - "ru": "Немешаево", - "uk": "Немішаєве", - "prefix": "селище міського типу", - "fr": "Nemishayeve" - }, - "lat": "50.56801", - "lon": "30.10151", - "id": 337519630, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Кагарлик", - "enName": "Kaharlyk", - "names": { - "de": "Kaharlyk", - "ru": "Кагарлык", - "uk": "Кагарлик", - "prefix": "місто", - "pl": "Kaharłyk" - }, - "lat": "49.86507", - "lon": "30.82268", - "id": 1819209275, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Буденовец", - "lat": "55.35224", - "lon": "51.14801", - "id": 19254633849, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.35043", - "lon": "51.15277", - "id": 10672, - "intersectedStreets": [ - { - "name": "улица Кирова", - "lat": "55.35478", - "lon": "51.15217" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Маметьево", - "names": { - "tt": "Мəмəт" - }, - "lat": "54.81426", - "lon": "52.08193", - "id": 867306598, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.81923", - "lon": "52.08590", - "id": 6914, - "intersectedStreets": [ - { - "name": "улица Шайдулина", - "lat": "54.81661", - "lon": "52.08882" - }, - { - "name": "Советская улица", - "lat": "54.81721", - "lon": "52.08775" - }, - { - "name": "улица Октября", - "lat": "54.81923", - "lon": "52.08590" - }, - { - "name": "улица Калинина", - "lat": "54.81973", - "lon": "52.08423" - }, - { - "name": "улица Куйбышева", - "lat": "54.81974", - "lon": "52.08234" - }, - { - "name": "улица Мириханова", - "lat": "54.82012", - "lon": "52.07936" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Шимкусы", - "lat": "55.54700", - "lon": "47.95491", - "id": 4058603, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "55.54616", - "lon": "47.94449", - "id": 11767 - } - ], - "matchStreet": 1 - }, - { - "name": "Муслюмово", - "enName": "Muslyumovo", - "names": { - "tt": "Мөслим", - "ru": "Муслюмово", - "ja": "ムスリュモヴォ" - }, - "lat": "55.30593", - "lon": "53.19415", - "id": 337839100, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Кудаш", - "names": { - "tt": "Кодаш" - }, - "lat": "56.13616", - "lon": "49.01430", - "id": 825450987, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "56.13677", - "lon": "49.01705", - "id": 8539 - } - ], - "matchStreet": 1 - }, - { - "name": "Менделеевск", - "enName": "Mendeleyevsk", - "names": { - "tt": "Менделеевск", - "de": "Mendelejewsk", - "ru": "Менделеевск", - "ja": "メンデリェーエフスク" - }, - "lat": "55.88787", - "lon": "52.30844", - "id": 321322750, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.91167", - "lon": "52.29029", - "id": 9263 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Нижний Услон", - "enName": "Nignij Uslon", - "names": { - "tt": "Түбән Ослан", - "ru": "Нижний Услон" - }, - "lat": "55.69507", - "lon": "48.96694", - "id": 703197619, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "55.70412", - "lon": "48.97227", - "id": 12012 - } - ], - "matchStreet": 1 - }, - { - "name": "Верхний Услон", - "enName": "Verhnij Uslon", - "names": { - "tt": "Югары Ослан", - "de": "Werchni Uslonn", - "ru": "Верхний Услон", - "ja": "ヴェルフニー・ウスロン", - "ba": "Үрге Ослан" - }, - "lat": "55.76855", - "lon": "48.98293", - "id": 703197622, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.77954", - "lon": "48.97984", - "id": 6158 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Зеленодольск", - "enName": "Zelenodol'sk", - "names": { - "tt": "Яшел Үзән", - "de": "Selenodolsk", - "ru": "Зеленодольск", - "ko": "젤레노돌스크", - "uk": "Зеленодольськ", - "mhr": "Парат", - "ja": "ゼレノドリスク", - "eo": "Zelenodolsk", - "fa": "زلنودولسک، روسیه", - "pl": "Zielonodolsk", - "ro": "Zelenodolsk", - "sr": "Зеленодољск" - }, - "lat": "55.84776", - "lon": "48.50970", - "id": 336524051, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.84548", - "lon": "48.51730", - "id": 504 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Вятские Поляны", - "enName": "Vyatskiye Polyany", - "names": { - "tt": "Нократ Аланы", - "de": "Wjatskije Poljany", - "ja": "ヴャーツキエ・ポリャーヌィ" - }, - "lat": "56.23101", - "lon": "51.02939", - "id": 3237869, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.21668", - "lon": "51.03392", - "id": 9799 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Чирша", - "names": { - "tt": "Чыршы" - }, - "lat": "56.08640", - "lon": "49.22040", - "id": 816440693, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Ленина", - "lat": "56.08601", - "lon": "49.18292", - "id": 867 - } - ], - "matchStreet": 1 - }, - { - "name": "Глеваха", - "enName": "Hlevakha", - "names": { - "kk": "Glevaha", - "de": "Hlewacha", - "ceb": "Hlevakha", - "be": "Глэваха", - "ru": "Глеваха", - "prefix": "селище міського типу", - "fr": "Hlevakha", - "cs": "Hlevacha", - "ar": "هليفاخا", - "hy": "Հլեվահա", - "uk": "Глеваха", - "pl": "Hłewacha", - "tr": "Glevaha", - "rmy": "Hlevaha" - }, - "lat": "50.25968", - "lon": "30.30591", - "id": 337525824, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Казань", - "enName": "Kazan", - "names": { - "tt": "Казан", - "de": "Kasan", - "hi": "काज़ान", - "fi": "Kazan", - "ru": "Казань", - "pt": "Cazã", - "lt": "Kazanė", - "lv": "Kazaņa", - "fr": "Kazan", - "hu": "Kazany", - "hy": "Կազան", - "oc": "Kazan", - "ka": "ყაზანი", - "uk": "Казань", - "sk": "Kazaň", - "sr": "Казањ", - "kn": "ಕಾಜಾ಼ನ್", - "os": "Хъазан", - "chm": "Озаҥ", - "it": "Kazan'", - "kv": "Казан", - "es": "Kazán", - "zh": "喀山", - "cs": "Kazaň", - "ar": "قازان", - "cv": "Хусан", - "mhr": "Озаҥ", - "ja": "カザン", - "pl": "Kazań", - "da": "Kazan", - "he": "קאזאן", - "ro": "Kazan", - "nl": "Kazan", - "ba": "Ҡаҙан", - "udm": "Кузон" - }, - "lat": "55.78235", - "lon": "49.12423", - "id": 27504067, - "type": "CITY", - "listOfStreets": [ - { - "name": "улица Ульянова-Ленина", - "enName": "Ulyanova-Lenina Street", - "names": { - "tt": "Ульянов-Ленин урамы", - "ru": "улица Ульянова-Ленина" - }, - "lat": "55.78637", - "lon": "49.13541", - "id": 1292 - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.88035", - "lon": "49.15122", - "id": 3396 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Лебяжье", - "names": { - "tt": "Лебяжье" - }, - "lat": "55.32639", - "lon": "50.15632", - "id": 824088896, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "ru": "улица Ленина" - }, - "lat": "55.32475", - "lon": "50.15757", - "id": 4071 - } - ], - "matchStreet": 1 - }, - { - "name": "Красная Кадка", - "names": { - "tt": "Кызыл Чапчак" - }, - "lat": "55.41651", - "lon": "51.79221", - "id": 585272708, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.41732", - "lon": "51.79011", - "id": 9827, - "buildings": [ - { - "name": "60", - "lat": "55.41483", - "lon": "51.79412" - }, - { - "name": "66", - "lat": "55.41433", - "lon": "51.79492" - } - ], - "intersectedStreets": [ - { - "name": "«Чистополь — Нижнекамск» — Красная Кадка — Верхние Челны", - "lat": "55.41961", - "lon": "51.78045" - }, - { - "name": "Пионерская улица", - "lat": "55.41997", - "lon": "51.78163" - }, - { - "name": "Двор тыкрыгы", - "lat": "55.41844", - "lon": "51.78794" - }, - { - "name": "Садовая улица", - "lat": "55.41732", - "lon": "51.79011" - }, - { - "name": "Рамазанова улица", - "lat": "55.41596", - "lon": "51.79264" - }, - { - "name": "Кооперативная улица", - "lat": "55.41475", - "lon": "51.79464" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Володарка", - "enName": "Volodarka", - "names": { - "de": "Wolodarka", - "ru": "Володарка", - "uk": "Володарка", - "prefix": "селище міського типу", - "pl": "Wołodarka" - }, - "lat": "49.52250", - "lon": "29.92805", - "id": 337556285, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старое Дрожжаное", - "enName": "Staroye Drozhzhanoye", - "names": { - "tt": "Иске Чүпрәле", - "ru": "Старое Дрожжаное", - "ja": "スターロエ・ドロジジャノエ" - }, - "lat": "54.72499", - "lon": "47.56454", - "id": 336525099, - "type": "TOWN", - "listOfStreets": [ - { - "name": "переулок Ленина", - "lat": "54.72970", - "lon": "47.55649", - "id": 7047 - }, - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.73008", - "lon": "47.55971", - "id": 7048 - }, - { - "name": "2-й переулок Ленина", - "lat": "54.72928", - "lon": "47.55312", - "id": 7073 - }, - { - "name": "3-й переулок Ленина", - "lat": "54.72663", - "lon": "47.54844", - "id": 7074 - }, - { - "name": "4-й переулок Ленина", - "lat": "54.72586", - "lon": "47.54608", - "id": 7075 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ворзель", - "enName": "Vorzel", - "names": { - "ru": "Ворзель", - "uk": "Ворзель", - "prefix": "селище міського типу", - "pl": "Vorzel" - }, - "lat": "50.54573", - "lon": "30.15629", - "id": 337519932, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Джалиль", - "names": { - "tt": "Җәлил", - "ja": "ジャリリ" - }, - "lat": "55.02197", - "lon": "52.73899", - "id": 371194680, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.02426", - "lon": "52.73854", - "id": 5778, - "buildings": [ - { - "name": "1", - "lat": "55.02287", - "lon": "52.73862" - }, - { - "name": "2", - "lat": "55.02377", - "lon": "52.74038" - }, - { - "name": "3", - "lat": "55.02330", - "lon": "52.73824" - }, - { - "name": "4", - "lat": "55.02401", - "lon": "52.73993" - }, - { - "name": "5", - "lat": "55.02362", - "lon": "52.73777" - }, - { - "name": "6", - "lat": "55.02414", - "lon": "52.73914" - }, - { - "name": "7", - "lat": "55.02310", - "lon": "52.73725" - }, - { - "name": "8", - "lat": "55.02468", - "lon": "52.73993" - }, - { - "name": "9", - "lat": "55.02351", - "lon": "52.73680" - }, - { - "name": "10", - "lat": "55.02468", - "lon": "52.73867" - }, - { - "name": "11", - "lat": "55.02405", - "lon": "52.73738" - }, - { - "name": "12", - "lat": "55.02508", - "lon": "52.73822" - }, - { - "name": "13", - "lat": "55.02436", - "lon": "52.73691" - }, - { - "name": "14", - "lat": "55.02560", - "lon": "52.73749" - }, - { - "name": "15", - "lat": "55.02480", - "lon": "52.73654" - }, - { - "name": "15/2", - "lat": "55.02484", - "lon": "52.73691" - }, - { - "name": "16", - "lat": "55.02597", - "lon": "52.73830" - }, - { - "name": "17", - "lat": "55.02458", - "lon": "52.73560" - }, - { - "name": "18", - "lat": "55.02545", - "lon": "52.73948" - }, - { - "name": "19", - "lat": "55.02402", - "lon": "52.73622" - }, - { - "name": "21", - "lat": "55.02366", - "lon": "52.73502" - }, - { - "name": "23", - "lat": "55.02309", - "lon": "52.73579" - } - ], - "intersectedStreets": [ - { - "name": "улица Ветеранов", - "lat": "55.02276", - "lon": "52.74023" - }, - { - "name": "улица 30 лет Победы", - "lat": "55.02614", - "lon": "52.73637" - }, - { - "name": "улица Ахмадиева", - "lat": "55.02262", - "lon": "52.73985" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Шугурово", - "enName": "Shugurovo", - "names": { - "tt": "Шөгер", - "ja": "シュグロヴォ" - }, - "lat": "54.50877", - "lon": "52.13047", - "id": 779202585, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.50936", - "lon": "52.13549", - "id": 6724 - } - ], - "matchStreet": 1 - }, - { - "name": "Камышлы-Куль", - "names": { - "tt": "Камышлы Күл" - }, - "lat": "54.77764", - "lon": "53.07253", - "id": 587988771, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.77790", - "lon": "53.07214", - "id": 4498 - } - ], - "matchStreet": 1 - }, - { - "name": "Городок", - "names": { - "ru": "Городок", - "uk": "Городок", - "prefix": "селище міського типу", - "pl": "Gródek" - }, - "lat": "50.58336", - "lon": "29.47816", - "id": 6726413, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Біла Церква", - "enName": "Bila Tserkva", - "names": { - "de": "Bila Zerkwa", - "be": "Белая Царква", - "ru": "Белая Церковь", - "prefix": "місто", - "lt": "Bila Cerkva", - "eo": "Bila-Cerkva", - "fr": "Bila Tserkva", - "hu": "Bila Cerkva", - "et": "Bila Tserkva", - "cs": "Bila Cerkva", - "uk": "Біла Церква", - "pl": "Biała Cerkiew", - "ro": "Bila Țerkva", - "sr": "Била Церква" - }, - "lat": "49.80382", - "lon": "30.11170", - "id": 255259998, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старая Майна", - "enName": "Staraya Mayna", - "names": { - "ru": "Старая Майна", - "ja": "スターラヤ・マイナ" - }, - "lat": "54.61114", - "lon": "48.92349", - "id": 11135157981, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Туба", - "names": { - "tt": "Тоба" - }, - "lat": "55.46819", - "lon": "51.74410", - "id": 585272714, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.46972", - "lon": "51.74447", - "id": 10598, - "buildings": [ - { - "name": "19", - "lat": "55.47337", - "lon": "51.74342" - } - ], - "intersectedStreets": [ - { - "name": "улица Зая", - "lat": "55.46627", - "lon": "51.74625" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Дым-Тамак", - "names": { - "tt": "Димтамак" - }, - "lat": "54.52695", - "lon": "53.35881", - "id": 566546537, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "54.52743", - "lon": "53.35989", - "id": 563 - } - ], - "matchStreet": 1 - }, - { - "name": "Исергапово", - "names": { - "tt": "Исергәп" - }, - "lat": "54.33162", - "lon": "53.38497", - "id": 750057945, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "54.33273", - "lon": "53.39147", - "id": 12219 - } - ], - "matchStreet": 1 - }, - { - "name": "Высокая Гора", - "names": { - "tt": "Биектау", - "ja": "ヴイソーカヤ・ゴラー" - }, - "lat": "55.91018", - "lon": "49.30720", - "id": 704304024, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Дубъязы", - "names": { - "tt": "Дөбьяз" - }, - "lat": "56.11974", - "lon": "49.20088", - "id": 698423501, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Ленина", - "lat": "56.12148", - "lon": "49.19356", - "id": 11793 - } - ], - "matchStreet": 1 - }, - { - "name": "Большие Яльчики", - "names": { - "cv": "Аслӑ Елчӗк", - "ru": "Большие Яльчики" - }, - "lat": "55.17187", - "lon": "48.05579", - "id": 733535693, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.16625", - "lon": "48.05624", - "id": 6274 - } - ], - "matchStreet": 1 - }, - { - "name": "Агидель", - "enName": "Agidel", - "names": { - "tt": "Агыйдел", - "ru": "Агидель", - "ja": "アギデーリ", - "ba": "Ағиҙел", - "et": "Agidel" - }, - "lat": "55.89928", - "lon": "53.93742", - "id": 251071107, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Бегишево", - "names": { - "tt": "Бигеш" - }, - "lat": "55.48721", - "lon": "52.03453", - "id": 586094745, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "55.48693", - "lon": "52.03743", - "id": 9484, - "buildings": [ - { - "name": "7А", - "lat": "55.48501", - "lon": "52.04438" - }, - { - "name": "10", - "lat": "55.48424", - "lon": "52.04204" - }, - { - "name": "28", - "lat": "55.48666", - "lon": "52.04213" - }, - { - "name": "90", - "lat": "55.49077", - "lon": "52.03061" - }, - { - "name": "99", - "lat": "55.48989", - "lon": "52.02859" - } - ], - "intersectedStreets": [ - { - "name": "Клубная улица", - "lat": "55.48871", - "lon": "52.03440" - }, - { - "name": "Молодёжная улица", - "lat": "55.48749", - "lon": "52.03649" - }, - { - "name": "улица Гагарина", - "lat": "55.49010", - "lon": "52.02825" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Большая Атня", - "enName": "Bolshaya Atnya", - "names": { - "tt": "Олы Әтнә", - "ru": "Большая Атня", - "ja": "ボリシャヤ・アトニャ" - }, - "lat": "56.24947", - "lon": "49.45390", - "id": 698459097, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Енабердино", - "names": { - "tt": "Енабердино" - }, - "lat": "55.97809", - "lon": "52.32820", - "id": 775959290, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "55.98322", - "lon": "52.33127", - "id": 12140 - } - ], - "matchStreet": 1 - }, - { - "name": "Лубяны", - "names": { - "tt": "Лубян", - "ja": "ルビャヌイ" - }, - "lat": "56.03798", - "lon": "51.39806", - "id": 797805233, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.03292", - "lon": "51.39512", - "id": 9489 - } - ], - "matchStreet": 1 - }, - { - "name": "Верхняя Ошторма", - "names": { - "tt": "Югары Оштырма" - }, - "lat": "56.08485", - "lon": "50.72480", - "id": 797012416, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "56.08551", - "lon": "50.72538", - "id": 12081 - } - ], - "matchStreet": 1 - }, - { - "name": "Болгар", - "enName": "Bolgar", - "names": { - "tt": "Болгар", - "cv": "Пӑлхар", - "ru": "Болгар", - "ja": "ボルガル" - }, - "lat": "54.97474", - "lon": "49.03020", - "id": 599924350, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.98034", - "lon": "49.03321", - "id": 469 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Челно-Вершины", - "lat": "54.41588", - "lon": "51.08582", - "id": 8519359, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старые Челны", - "lat": "55.69735", - "lon": "52.30569", - "id": 3312654093, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.69949", - "lon": "52.31056", - "id": 1335, - "intersectedStreets": [ - { - "name": "Полевая улица", - "lat": "55.69823", - "lon": "52.30951" - }, - { - "name": "улица Фрунзе", - "names": { - "tt": "Фрунзе урамы" - }, - "lat": "55.69823", - "lon": "52.30951" - }, - { - "name": "улица Карла Маркса", - "names": { - "tt": "Карл Маркс урамы" - }, - "lat": "55.69994", - "lon": "52.31026" - }, - { - "name": "Красногвардейская улица", - "lat": "55.70028", - "lon": "52.31007" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Бородянка", - "enName": "Borodianka", - "names": { - "de": "Borodjanka", - "ru": "Бородянка", - "uk": "Бородянка", - "prefix": "селище міського типу", - "pl": "Borodzianka" - }, - "lat": "50.64657", - "lon": "29.92558", - "id": 295809953, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Красятичі", - "enName": "Krasiatychi", - "names": { - "de": "Krasjatytschi", - "ru": "Красятичи", - "uk": "Красятичі", - "prefix": "селище міського типу", - "pl": "Krasiatyczi" - }, - "lat": "51.07829", - "lon": "29.63779", - "id": 337512030, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Черемушка", - "names": { - "tt": "Шомыртлы" - }, - "lat": "54.96081", - "lon": "50.54108", - "id": 1071321497, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "54.96309", - "lon": "50.54505", - "id": 11100 - } - ], - "matchStreet": 1 - }, - { - "name": "Іванків", - "enName": "Ivankiv", - "names": { - "de": "Iwankiw", - "ru": "Иванков", - "uk": "Іванків", - "prefix": "селище міського типу", - "pl": "Iwanków" - }, - "lat": "50.93300", - "lon": "29.90463", - "id": 337513819, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Березняк", - "names": { - "tt": "Березняк" - }, - "lat": "56.11196", - "lon": "50.79986", - "id": 797026502, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.10540", - "lon": "50.79771", - "id": 2940 - } - ], - "matchStreet": 1 - }, - { - "name": "Русский Акташ", - "enName": "Russkiy Aktash", - "names": { - "tt": "Рус Акташы", - "ru": "Русский Акташ", - "ja": "ルースキー・アクタシ" - }, - "lat": "55.04037", - "lon": "52.11699", - "id": 337839143, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.04846", - "lon": "52.11421", - "id": 5590, - "intersectedStreets": [ - { - "name": "Советская улица", - "lat": "55.04574", - "lon": "52.11766" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Большие Аты", - "names": { - "tt": "Олы Аты" - }, - "lat": "55.39833", - "lon": "51.74820", - "id": 585272678, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.39935", - "lon": "51.74031", - "id": 9314, - "buildings": [ - { - "name": "26", - "lat": "55.40090", - "lon": "51.74322" - }, - { - "name": "41", - "lat": "55.40116", - "lon": "51.74269" - } - ], - "intersectedStreets": [ - { - "name": "Заинск — Сухарево", - "names": { - "alt_name": "Нижнекамск — Заинск" - }, - "lat": "55.40197", - "lon": "51.74412" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Ставище", - "enName": "Stavysche", - "names": { - "de": "Stawyschtsche", - "ru": "Ставище", - "uk": "Ставище", - "prefix": "селище міського типу", - "pl": "Stawyszcze" - }, - "lat": "49.38620", - "lon": "30.18316", - "id": 337560920, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тямле Чишма", - "names": { - "tt": "Тәмле Чишмә" - }, - "lat": "56.07587", - "lon": "50.74705", - "id": 797012425, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "56.07592", - "lon": "50.74641", - "id": 12080 - } - ], - "matchStreet": 1 - }, - { - "name": "Новошешминск", - "enName": "Novosheshminsk", - "names": { - "tt": "Яңа Чишмә", - "de": "Nowoscheschminsk", - "ru": "Новошешминск", - "ja": "ノヴォシェシミンスク" - }, - "lat": "55.06165", - "lon": "51.22489", - "id": 337839146, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.06093", - "lon": "51.21983", - "id": 7527, - "buildings": [ - { - "name": "6", - "lat": "55.06695", - "lon": "51.24049" - }, - { - "name": "19", - "lat": "55.06512", - "lon": "51.23646" - }, - { - "name": "25", - "lat": "55.06461", - "lon": "51.23500" - }, - { - "name": "28", - "lat": "55.06566", - "lon": "51.23423" - }, - { - "name": "39", - "lat": "55.06280", - "lon": "51.22768" - }, - { - "name": "42", - "lat": "55.06424", - "lon": "51.23133" - }, - { - "name": "48", - "lat": "55.06362", - "lon": "51.22912" - }, - { - "name": "49", - "lat": "55.06209", - "lon": "51.22509" - }, - { - "name": "53", - "lat": "55.06176", - "lon": "51.22466" - }, - { - "name": "93", - "lat": "55.05897", - "lon": "51.21352" - } - ], - "intersectedStreets": [ - { - "name": "Чистополь - Новошешминск", - "lat": "55.05613", - "lon": "51.21116" - }, - { - "name": "Полевая улица", - "lat": "55.05843", - "lon": "51.21255" - }, - { - "name": "Лесная улица", - "lat": "55.05935", - "lon": "51.21395" - }, - { - "name": "улица Мира", - "lat": "55.05980", - "lon": "51.21564" - }, - { - "name": "Молодёжная улица", - "lat": "55.06026", - "lon": "51.21736" - }, - { - "name": "улица Дружбы", - "lat": "55.06095", - "lon": "51.21983" - }, - { - "name": "улица Юности", - "lat": "55.06158", - "lon": "51.22219" - }, - { - "name": "Солнечная улица", - "lat": "55.06300", - "lon": "51.22736" - }, - { - "name": "Заливная улица", - "lat": "55.06372", - "lon": "51.23006" - }, - { - "name": "Набережная улица", - "lat": "55.06641", - "lon": "51.24369" - }, - { - "name": "Объездная улица", - "lat": "55.06641", - "lon": "51.24369" - }, - { - "name": "улица Чернышевского", - "names": { - "tt": "Чернышевский урамы" - }, - "lat": "55.06641", - "lon": "51.24369" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Починок Кучук", - "names": { - "tt": "Пүчинкә-Кучук", - "ru": "Починок Кучук", - "mhr": "Уял", - "chm": "Уял" - }, - "lat": "56.08026", - "lon": "50.87539", - "id": 797026508, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.07401", - "lon": "50.87515", - "id": 10463 - } - ], - "matchStreet": 1 - }, - { - "name": "Протопоповка", - "names": { - "tt": "Протопоповка" - }, - "lat": "55.77319", - "lon": "48.52170", - "id": 752193178, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.77312", - "lon": "48.51820", - "id": 5053 - } - ], - "matchStreet": 1 - }, - { - "name": "Билярск", - "names": { - "tt": "Биләр" - }, - "lat": "54.98370", - "lon": "50.38888", - "id": 336524609, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.98858", - "lon": "50.37849", - "id": 156 - } - ], - "matchStreet": 1 - }, - { - "name": "Верхняя Уратьма", - "names": { - "tt": "Югары Уратма" - }, - "lat": "55.25698", - "lon": "51.75228", - "id": 2523940608, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.26365", - "lon": "51.74078", - "id": 479, - "buildings": [ - { - "name": "1", - "lat": "55.25603", - "lon": "51.75028" - }, - { - "name": "3", - "lat": "55.25630", - "lon": "51.75003" - }, - { - "name": "12", - "lat": "55.25808", - "lon": "51.74936" - }, - { - "name": "17", - "lat": "55.25799", - "lon": "51.74861" - }, - { - "name": "44", - "lat": "55.26177", - "lon": "51.74588" - }, - { - "name": "55", - "lat": "55.26365", - "lon": "51.74078", - "postcode": "423568" - } - ], - "intersectedStreets": [ - { - "name": "Нагорная улица", - "lat": "55.25847", - "lon": "51.74870" - }, - { - "name": "Верхняя Уратьма — Благодатная", - "names": { - "alt_name": "Новошешминск - Заинск" - }, - "lat": "55.26590", - "lon": "51.73762" - }, - { - "name": "Заинск — Верхняя Уратьма — Шереметьевка", - "lat": "55.26287", - "lon": "51.74331" - }, - { - "name": "улица Гагарина", - "lat": "55.25618", - "lon": "51.75144" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Чувашский Чикилдым", - "names": { - "tt": "Чуаш Чагылдымы" - }, - "lat": "54.77986", - "lon": "48.41053", - "id": 787139174, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.78001", - "lon": "48.41117", - "id": 7544 - } - ], - "matchStreet": 1 - }, - { - "name": "Актюбинский", - "names": { - "tt": "Актүбә", - "ru": "Актюбинский", - "ja": "アクチュビンスキー" - }, - "lat": "54.81319", - "lon": "52.80257", - "id": 445771973, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.81508", - "lon": "52.80750", - "id": 4528, - "buildings": [ - { - "name": "4", - "lat": "54.81439", - "lon": "52.80778" - }, - { - "name": "6", - "lat": "54.81412", - "lon": "52.80795" - }, - { - "name": "6А", - "lat": "54.81413", - "lon": "52.80843" - }, - { - "name": "6Б", - "lat": "54.81412", - "lon": "52.80896" - }, - { - "name": "7", - "lat": "54.81365", - "lon": "52.80707" - }, - { - "name": "8", - "lat": "54.81366", - "lon": "52.80806" - }, - { - "name": "8А", - "lat": "54.81373", - "lon": "52.80909" - }, - { - "name": "9", - "lat": "54.81320", - "lon": "52.80622" - }, - { - "name": "10", - "lat": "54.81326", - "lon": "52.80806" - }, - { - "name": "12", - "lat": "54.81299", - "lon": "52.80778" - } - ], - "intersectedStreets": [ - { - "name": "Лесная улица", - "lat": "54.81508", - "lon": "52.80750" - }, - { - "name": "улица Губкина", - "lat": "54.81237", - "lon": "52.80748" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Емелькино", - "names": { - "tt": "Емелькино", - "cv": "Емелккел (Кивӗ Этемшӳ)" - }, - "lat": "54.96785", - "lon": "50.55872", - "id": 854660709, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "54.96861", - "lon": "50.55687", - "id": 11986 - } - ], - "matchStreet": 1 - }, - { - "name": "Яльчики", - "names": { - "de": "Jaltschiki", - "cv": "Елчӗк", - "ru": "Яльчики", - "ja": "ヤリチキ" - }, - "lat": "55.16287", - "lon": "48.00334", - "id": 850408359, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Азнакаево", - "enName": "Aznakayevo", - "names": { - "tt": "Азнакай", - "de": "Asnakajewo", - "cv": "Аснакай", - "ru": "Азнакаево", - "ja": "アズナカエヴォ" - }, - "lat": "54.86296", - "lon": "53.07922", - "id": 337839164, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.86173", - "lon": "53.08068", - "id": 1562 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Карабаш", - "enName": "Karabash", - "names": { - "tt": "Карабаш", - "ja": "カラバシ" - }, - "lat": "54.69440", - "lon": "52.58739", - "id": 2406531050, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.69158", - "lon": "52.58031", - "id": 6794, - "intersectedStreets": [ - { - "name": "улица Аклима Мухаметзянова", - "lat": "54.69106", - "lon": "52.57904" - }, - { - "name": "улица Тукая", - "lat": "54.69313", - "lon": "52.58501" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Переяслав-Хмельницький", - "enName": "Pereiaslav-Khmelnytskyi", - "names": { - "de": "Perejaslaw-Chmelnyzkyj", - "be": "Пераяслаў-Хмяльніцкі", - "ru": "Переяслав-Хмельницкий", - "uk": "Переяслав-Хмельницький", - "prefix": "місто", - "eo": "Perejaslav-Ĥmelnickij", - "pl": "Perejasław Chmielnicki" - }, - "lat": "50.06440", - "lon": "31.44474", - "id": 337535557, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Нижнекамск", - "enName": "Nizhnekamsk", - "names": { - "cs": "Nižněkamsk", - "tt": "Түбән Кама", - "de": "Nischnekamsk", - "ru": "Нижнекамск", - "uk": "Нижньокамськ", - "ja": "ニジネカムスク", - "lt": "Nižnekamskas", - "fr": "Nijnekamsk", - "pl": "Niżniekamsk", - "es": "Nizhnekamsk" - }, - "lat": "55.64129", - "lon": "51.81603", - "id": 553037933, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Красная Горка", - "names": { - "tt": "Красная Горка", - "ja": "クラスナヤ・ゴールカ" - }, - "lat": "55.70776", - "lon": "51.36656", - "id": 798213322, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.70766", - "lon": "51.36832", - "id": 8924, - "buildings": [ - { - "name": "5", - "lat": "55.70650", - "lon": "51.36649" - }, - { - "name": "7", - "lat": "55.70674", - "lon": "51.36698" - }, - { - "name": "9", - "lat": "55.70686", - "lon": "51.36716" - }, - { - "name": "11", - "lat": "55.70714", - "lon": "51.36769" - }, - { - "name": "13", - "lat": "55.70747", - "lon": "51.36834" - }, - { - "name": "13А", - "lat": "55.70726", - "lon": "51.36795" - }, - { - "name": "15", - "lat": "55.70882", - "lon": "51.37078" - }, - { - "name": "17", - "lat": "55.70899", - "lon": "51.37113" - }, - { - "name": "18", - "lat": "55.70925", - "lon": "51.37061" - }, - { - "name": "19", - "lat": "55.70929", - "lon": "51.37173" - }, - { - "name": "20", - "lat": "55.70936", - "lon": "51.37098" - }, - { - "name": "21", - "lat": "55.70946", - "lon": "51.37207" - }, - { - "name": "22", - "lat": "55.70946", - "lon": "51.37132" - }, - { - "name": "23", - "lat": "55.70967", - "lon": "51.37269" - }, - { - "name": "24", - "lat": "55.70967", - "lon": "51.37177" - }, - { - "name": "25", - "lat": "55.70979", - "lon": "51.37291" - }, - { - "name": "26", - "lat": "55.70983", - "lon": "51.37209" - }, - { - "name": "27", - "lat": "55.70989", - "lon": "51.37321" - }, - { - "name": "28", - "lat": "55.70996", - "lon": "51.37244" - }, - { - "name": "29", - "lat": "55.71009", - "lon": "51.37370" - }, - { - "name": "31", - "lat": "55.71021", - "lon": "51.37400" - }, - { - "name": "32", - "lat": "55.71049", - "lon": "51.37349" - }, - { - "name": "33", - "lat": "55.71038", - "lon": "51.37434" - }, - { - "name": "35", - "lat": "55.71053", - "lon": "51.37456" - }, - { - "name": "36", - "lat": "55.71061", - "lon": "51.37465" - }, - { - "name": "37", - "lat": "55.71076", - "lon": "51.37480" - }, - { - "name": "38", - "lat": "55.71087", - "lon": "51.37497" - }, - { - "name": "39", - "lat": "55.71096", - "lon": "51.37510" - }, - { - "name": "40", - "lat": "55.71106", - "lon": "51.37522" - } - ], - "intersectedStreets": [ - { - "name": "переулок Жданова", - "lat": "55.70766", - "lon": "51.36832" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Карай", - "lat": "56.04267", - "lon": "48.64798", - "id": 660900089, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.04220", - "lon": "48.65244", - "id": 11363 - } - ], - "matchStreet": 1 - }, - { - "name": "Старый Чувашский Адам", - "names": { - "tt": "Иске Чуаш Әдәмсуы" - }, - "lat": "54.94203", - "lon": "50.54104", - "id": 854660718, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "54.94502", - "lon": "50.54084", - "id": 10677 - } - ], - "matchStreet": 1 - }, - { - "name": "Малая Пурга", - "enName": "Malaya Purga", - "names": { - "ja": "マラヤ・プルガ", - "udm": "Пичи Пурга" - }, - "lat": "56.54955", - "lon": "53.00551", - "id": 621090917, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Шемурша", - "names": { - "de": "Schemurscha", - "cv": "Шӑмӑршӑ", - "ja": "シェムルシャー" - }, - "lat": "54.88548", - "lon": "47.51651", - "id": 855192927, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "54.88690", - "lon": "47.52984", - "id": 4027 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Агрыз", - "enName": "Agryz", - "names": { - "tt": "Әгерҗе", - "ru": "Агрыз", - "ja": "アグルイズ" - }, - "lat": "56.52546", - "lon": "52.99725", - "id": 1773881620, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.51014", - "lon": "52.99230", - "id": 7268 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Лениногорск", - "enName": "Leninogorsk", - "names": { - "tt": "Лениногорск", - "de": "Leninogorsk", - "cv": "Ҫӗнӗ Пӗҫмен", - "ru": "Лениногорск", - "ja": "レニノゴルスク" - }, - "lat": "54.59943", - "lon": "52.44691", - "id": 273310116, - "type": "TOWN", - "listOfStreets": [ - { - "name": "проспект Ленина", - "lat": "54.60202", - "lon": "52.44837", - "id": 787 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Кичкеево", - "names": { - "cv": "Киччӗ", - "ru": "Кичкеево" - }, - "lat": "55.46093", - "lon": "47.90395", - "id": 1297116347, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.45797", - "lon": "47.90161", - "id": 8973 - } - ], - "matchStreet": 1 - }, - { - "name": "Аксубаево", - "enName": "Aksubayevo", - "names": { - "tt": "Аксубай", - "de": "Aksubajewo", - "cv": "Аксу", - "ru": "Аксубаево", - "ja": "アクスバエヴォ" - }, - "lat": "54.84635", - "lon": "50.80554", - "id": 336524899, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "cv": "Ленин", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.84658", - "lon": "50.80338", - "id": 7551 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Нурлат", - "enName": "Nurlat", - "names": { - "tt": "Нурлат", - "de": "Nurlat", - "cv": "Нурлат", - "ru": "Нурлат", - "ja": "ヌルラート" - }, - "lat": "54.42973", - "lon": "50.80196", - "id": 336525410, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.42106", - "lon": "50.82743", - "id": 1727 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Пісківка", - "enName": "Piskivka", - "names": { - "ru": "Песковка", - "uk": "Пісківка", - "prefix": "селище міського типу", - "pl": "Piskivka" - }, - "lat": "50.69686", - "lon": "29.59311", - "id": 337517677, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Верхние Тимерсяны", - "enName": "Verkhniye Timersyany", - "names": { - "cv": "Ирҫел", - "ru": "Верхние Тимерсяны" - }, - "lat": "54.54342", - "lon": "47.65577", - "id": 336525181, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "54.53880", - "lon": "47.65507", - "id": 8893 - } - ], - "matchStreet": 1 - }, - { - "name": "Октябрьский", - "enName": "Oktjabrski", - "names": { - "tt": "Октябрьски", - "de": "Oktjabrski", - "ru": "Октябрьский", - "ja": "オクチャブリスキー", - "lt": "Oktiabrskis", - "ba": "Октябрьский", - "et": "Oktjabrski" - }, - "lat": "54.48097", - "lon": "53.46600", - "id": 191901380, - "type": "TOWN", - "listOfStreets": [ - { - "name": "проспект Ленина", - "lat": "54.48212", - "lon": "53.46630", - "id": 107 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Куйбышевский Затон", - "names": { - "tt": "Куйбышев Затоны", - "ja": "クイビシェフスキー・ザトン" - }, - "lat": "55.15645", - "lon": "49.16940", - "id": 697269501, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.15673", - "lon": "49.17463", - "id": 10637 - } - ], - "matchStreet": 1 - }, - { - "name": "Буча", - "enName": "Bucha", - "names": { - "de": "Butscha", - "ru": "Буча", - "prefix": "місто", - "uk": "Буча", - "fr": "Boutcha", - "pl": "Bucza" - }, - "lat": "50.54858", - "lon": "30.22071", - "id": 312987923, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Имянлебаш", - "names": { - "tt": "Имәнлебаш", - "ru": "Имянлебаш" - }, - "lat": "55.34954", - "lon": "51.82646", - "id": 585272661, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.34489", - "lon": "51.81624", - "id": 9304 - } - ], - "matchStreet": 1 - }, - { - "name": "Шингальчи", - "names": { - "tt": "Шәңгәлче" - }, - "lat": "55.51315", - "lon": "51.82206", - "id": 705268096, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.51207", - "lon": "51.81751", - "id": 9819, - "intersectedStreets": [ - { - "name": "улица Механизаторов", - "lat": "55.51141", - "lon": "51.81652" - }, - { - "name": "улица Гагарина", - "lat": "55.51520", - "lon": "51.82588" - }, - { - "name": "Новая улица", - "lat": "55.51673", - "lon": "51.82717" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Базарные Матаки", - "enName": "Bazarnyye Mataki", - "names": { - "tt": "Базарлы Матак", - "ja": "バザールヌイエ・マターキ" - }, - "lat": "54.90349", - "lon": "49.92754", - "id": 336524666, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.90183", - "lon": "49.92110", - "id": 2732 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Борова", - "enName": "Borova", - "names": { - "ru": "Боровая", - "uk": "Борова", - "prefix": "селище міського типу", - "pl": "Borowa" - }, - "lat": "50.17834", - "lon": "30.10254", - "id": 337527400, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Аксарино", - "names": { - "tt": "Аксар" - }, - "lat": "55.33954", - "lon": "51.91351", - "id": 585272665, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.34291", - "lon": "51.90720", - "id": 514, - "buildings": [ - { - "name": "1", - "lat": "55.34168", - "lon": "51.91549", - "postcode": "423501" - }, - { - "name": "2", - "lat": "55.34207", - "lon": "51.91523", - "postcode": "423501" - }, - { - "name": "29", - "lat": "55.34157", - "lon": "51.91092", - "postcode": "423501" - }, - { - "name": "36", - "lat": "55.34223", - "lon": "51.91001" - }, - { - "name": "38", - "lat": "55.34237", - "lon": "51.90939", - "postcode": "423501" - }, - { - "name": "40", - "lat": "55.34250", - "lon": "51.90858", - "postcode": "423501" - }, - { - "name": "40", - "lat": "55.34250", - "lon": "51.90858", - "postcode": "423501" - }, - { - "name": "41", - "lat": "55.34228", - "lon": "51.90783", - "postcode": "423501" - }, - { - "name": "42", - "lat": "55.34291", - "lon": "51.90720", - "postcode": "423501" - }, - { - "name": "42", - "lat": "55.34294", - "lon": "51.90720", - "postcode": "423501" - }, - { - "name": "46", - "lat": "55.34318", - "lon": "51.90613", - "postcode": "423501" - } - ], - "intersectedStreets": [ - { - "name": "Молодёжная улица", - "lat": "55.34181", - "lon": "51.91592" - }, - { - "name": "Колхозная улица", - "lat": "55.34197", - "lon": "51.91119" - }, - { - "name": "улица Вахитова", - "lat": "55.34261", - "lon": "51.90737" - }, - { - "name": "улица Тукая", - "lat": "55.34261", - "lon": "51.90737" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Кармалы", - "names": { - "tt": "Кармалы" - }, - "lat": "55.30420", - "lon": "51.17732", - "id": 779172045, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.30562", - "lon": "51.18112", - "id": 10574 - } - ], - "matchStreet": 1 - }, - { - "name": "Нижняя Мактама", - "names": { - "tt": "Түбəн Мактама", - "ja": "ニジニャヤ・マクタマ" - }, - "lat": "54.86247", - "lon": "52.42313", - "id": 1804405492, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Велика Димерка", - "enName": "Velyka Dymerka", - "names": { - "ru": "Великая Дымерка", - "uk": "Велика Димерка", - "prefix": "селище міського типу", - "pl": "Wielka Dymirka" - }, - "lat": "50.59183", - "lon": "30.90109", - "id": 337519261, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Вишгород", - "enName": "Vyshhorod", - "names": { - "de": "Wyschhorod", - "ru": "Вышгород", - "uk": "Вишгород", - "prefix": "місто", - "fr": "Vychhorod", - "pl": "Wyszogród" - }, - "lat": "50.58243", - "lon": "30.48513", - "id": 289308798, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старый Токмак", - "names": { - "tt": "Иске Тәкмәк" - }, - "lat": "55.39208", - "lon": "51.98147", - "id": 586094637, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "55.39715", - "lon": "51.99192", - "id": 2837, - "intersectedStreets": [ - { - "name": "улица Речная", - "lat": "55.39594", - "lon": "51.98954" - }, - { - "name": "улица Луговая", - "lat": "55.39715", - "lon": "51.99192" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Орловка", - "enName": "Orlovka", - "names": { - "ru": "Орловка" - }, - "lat": "55.71491", - "lon": "52.37174", - "id": 568525857, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "55.71641", - "lon": "52.38245", - "id": 5664, - "buildings": [ - { - "name": "9", - "lat": "55.71641", - "lon": "52.38245" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Мунайка", - "names": { - "tt": "Монай" - }, - "lat": "55.89279", - "lon": "52.26012", - "id": 775959237, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.89364", - "lon": "52.26132", - "id": 4125 - } - ], - "matchStreet": 1 - }, - { - "name": "Обухів", - "enName": "Obukhiv", - "names": { - "de": "Obuchiw", - "ru": "Обухов", - "uk": "Обухів", - "prefix": "місто", - "fr": "Oboukhiv", - "pl": "Obuchów", - "hu": "Obukhiv" - }, - "lat": "50.11020", - "lon": "30.62675", - "id": 337534108, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Черемшан", - "enName": "Cheremshan", - "names": { - "tt": "Чирмешән", - "cv": "Ҫарӑмсан", - "ru": "Черемшан", - "ja": "チェレムシャン" - }, - "lat": "54.66110", - "lon": "51.50532", - "id": 337839206, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Ядыгерь", - "names": { - "tt": "Ядегәр" - }, - "lat": "56.23022", - "lon": "50.50930", - "id": 796777404, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.22996", - "lon": "50.51228", - "id": 11226 - } - ], - "matchStreet": 1 - }, - { - "name": "Українка", - "enName": "Ukrainka", - "names": { - "ru": "Украинка", - "uk": "Українка", - "prefix": "місто", - "pl": "Ukrajinka" - }, - "lat": "50.15372", - "lon": "30.74206", - "id": 337528474, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Подгорный Дрюш", - "names": { - "tt": "Таулы Дөреш" - }, - "lat": "55.50122", - "lon": "52.55138", - "id": 594677179, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "ru": "улица Ленина" - }, - "lat": "55.50009", - "lon": "52.55241", - "id": 9785 - } - ], - "matchStreet": 1 - }, - { - "name": "Калинівка", - "enName": "Kalynivka", - "names": { - "kk": "Kalyni'vka", - "de": "Kalyniwka (Wassylkiw)", - "hy": "Կալյնիվկա", - "ru": "Калиновка", - "vi": "Kalynivka", - "prefix": "селище міського типу", - "uk": "Калинівка", - "ja": "カルィーニウカ", - "fr": "Kalynivka", - "pl": "Kalinówka", - "ro": "Kalînivka, Vasîlkiv", - "tr": "Kalınivka" - }, - "lat": "50.22573", - "lon": "30.22618", - "id": 337526421, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Фастів", - "enName": "Fastiv", - "names": { - "de": "Fastiw", - "ru": "Фастов", - "uk": "Фастів", - "prefix": "місто", - "eo": "Fastiv", - "fr": "Fastiv", - "pl": "Fastów", - "hu": "Fastiv" - }, - "lat": "50.07993", - "lon": "29.91629", - "id": 337535126, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тамаево", - "names": { - "tt": "Тәмәй" - }, - "lat": "56.35173", - "lon": "50.83694", - "id": 797083146, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.35513", - "lon": "50.83874", - "id": 10747 - } - ], - "matchStreet": 1 - }, - { - "name": "Уруссу", - "enName": "Urussu", - "names": { - "tt": "Урыссу", - "ru": "Уруссу", - "ja": "ウルスー" - }, - "lat": "54.59933", - "lon": "53.46632", - "id": 337839216, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.59502", - "lon": "53.46949", - "id": 2587 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Туембаш", - "names": { - "tt": "Туембаш" - }, - "lat": "56.26669", - "lon": "50.86387", - "id": 797083152, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.26702", - "lon": "50.86209", - "id": 11179 - } - ], - "matchStreet": 1 - }, - { - "name": "Елабуга", - "enName": "Elabuga", - "names": { - "tt": "Алабуга", - "ar": "ييلابوغا", - "de": "Jelabuga", - "cv": "Алапӳ", - "ru": "Елабуга", - "uk": "Єлабуга", - "ja": "エラブガ", - "tt-lat": "Alabuğa", - "fa": "یلابوگا", - "tr": "Alabuga", - "ba": "Алабуға" - }, - "lat": "55.75771", - "lon": "52.05400", - "id": 153568874, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Ютаза", - "enName": "Yutaza", - "names": { - "tt": "Ютазы", - "ru": "Ютаза" - }, - "lat": "54.58879", - "lon": "53.27073", - "id": 337839220, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.58895", - "lon": "53.26753", - "id": 2688 - } - ], - "matchStreet": 1 - }, - { - "name": "Петровский Завод", - "enName": "Petrovsky Zavod", - "names": { - "tt": "Петровский Завод" - }, - "lat": "55.31827", - "lon": "52.49617", - "id": 582997231, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.31683", - "lon": "52.49512", - "id": 10260, - "buildings": [ - { - "name": "1", - "lat": "55.31623", - "lon": "52.49484", - "postcode": "423364" - }, - { - "name": "2", - "lat": "55.31657", - "lon": "52.49416", - "postcode": "423364" - }, - { - "name": "3", - "lat": "55.31661", - "lon": "52.49512", - "postcode": "423364" - }, - { - "name": "4", - "lat": "55.31719", - "lon": "52.49471", - "postcode": "423364" - }, - { - "name": "5", - "lat": "55.31701", - "lon": "52.49544", - "postcode": "423364" - }, - { - "name": "6", - "lat": "55.31691", - "lon": "52.49416", - "postcode": "423364" - } - ], - "intersectedStreets": [ - { - "name": "Заводская улица", - "lat": "55.31604", - "lon": "52.49452" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Макарів", - "enName": "Makariv", - "names": { - "de": "Makariw", - "ru": "Макаров", - "uk": "Макарів", - "prefix": "селище міського типу", - "pl": "Makarow" - }, - "lat": "50.46399", - "lon": "29.80690", - "id": 1494035871, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Комаровка", - "names": { - "tt": "Комаровка" - }, - "lat": "55.89661", - "lon": "50.26097", - "id": 801827934, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.89504", - "lon": "50.25857", - "id": 10199 - } - ], - "matchStreet": 1 - }, - { - "name": "Кукмор", - "enName": "Kukmor", - "names": { - "tt": "Кукмара", - "de": "Kukmor", - "ru": "Кукмор", - "ja": "クークモル" - }, - "lat": "56.18653", - "lon": "50.89721", - "id": 409487025, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.18256", - "lon": "50.90891", - "id": 748 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Київ", - "enName": "Kyiv", - "names": { - "hi": "कीव", - "pt": "Kiev", - "prefix": "місто", - "hr": "Kijev", - "ht": "Kyèv", - "hu": "Kijev", - "lmo": "Kiev", - "xmf": "კიევი", - "yi": "קיעוו", - "hy": "Կիև", - "bar": "Kiew", - "nah": "Kiev", - "yo": "Kiev", - "pms": "Kijv", - "ia": "Kyiv", - "nan": "Kyyiv", - "id": "Kyiv", - "ie": "Kyiv", - "sco": "Kiev", - "scn": "Kiev", - "ext": "Kyiv", - "ab": "Кыив", - "qu": "Kiyiw", - "af": "Kiëf", - "pnb": "کیف", - "io": "Kyiv", - "frr": "Kyiv", - "is": "Kænugarður", - "it": "Kyiv", - "am": "ኪየቭ", - "an": "Kiev", - "zh": "基輔", - "ar": "كييف", - "jbo": "kiev", - "mhr": "Киев", - "ja": "キエフ", - "az": "Kiyev", - "zu": "IKiyevi", - "ro": "Kiev", - "ba": "Киев", - "be": "Кіеў", - "ru": "Киев", - "bg": "Киев", - "bi": "Kyiv", - "myv": "Киев ош", - "bn": "কিয়েভ", - "jv": "Kyiv", - "bo": "ཀིབ།", - "br": "Kyiv", - "sc": "Kiev", - "bs": "Kijev", - "se": "Kiova", - "sh": "Kijev", - "ka": "კიევი", - "sk": "Kyjev", - "roa-rup": "Kiev", - "sl": "Kijev", - "ca": "Kyiv", - "sq": "Kievi", - "sr": "Кијев", - "kk": "Киев", - "kl": "Kyiv", - "kn": "ಕೀವ್", - "sv": "Kiev", - "ko": "키예프", - "mrj": "Киев", - "sw": "Kiev", - "arz": "كييف", - "ku": "Kîev", - "kv": "Киев", - "ta": "கீவ்", - "ky": "Киев", - "cs": "Kyjev", - "te": "క్యివ్", - "cu": "Кꙑѥвъ", - "cv": "Кийӳ", - "tg": "Киев", - "th": "เคียฟ", - "la": "Kiovia", - "cy": "Kyiv", - "lb": "Kiew", - "tl": "Kiev", - "nds": "Kiew", - "da": "Kyiv", - "tr": "Kiev", - "tt": "Киев", - "be-tarask": "Кіеў", - "de": "Kiew", - "ln": "Kyjiw", - "ast": "Kiev", - "rue": "Київ", - "tw": "Kiev", - "hif": "Kiev", - "koi": "Киев", - "lt": "Kijevas", - "lv": "Kijeva", - "lij": "Kiev", - "lad": "Kyiv", - "ug": "كىيېۋ", - "roa-tara": "Kiev", - "vec": "Kiev", - "uk": "Київ", - "fiu-vro": "Kiiova", - "mi": "Kieu", - "ur": "کیف", - "mk": "Киев", - "pap": "Kiev", - "ml": "കീവ്", - "rmy": "Kiev", - "vep": "Kijev", - "mn": "Киев", - "mr": "क्यीव", - "uz": "Kiyev", - "ms": "Kiev", - "el": "Κίεβο", - "mt": "Kjiv", - "tzl": "Kíiv", - "als": "Kiew", - "eo": "Kievo", - "my": "ကီးယက်မြို့", - "ilo": "Kyiv", - "es": "Kyiv", - "mdf": "Киев", - "et": "Kiiev", - "eu": "Kyiv", - "dsb": "Kijew", - "vi": "Kiev", - "bat-smg": "Kijevs", - "hsb": "Kijew", - "vo": "Küyiv", - "fa": "کی‌یف", - "nl": "Kiev", - "udm": "Киев", - "nn": "Kiev", - "no": "Kiev", - "fi": "Kiova", - "yue": "基輔", - "fo": "Kyiv", - "fr": "Kyiv", - "gag": "Kyiv", - "fy": "Kiev", - "nov": "Kiyev", - "oc": "Kyiiv", - "crh": "Kiyev", - "wo": "Kiyew", - "ga": "Cív", - "ang": "Cænugeard", - "sah": "Киев", - "bxr": "Киев", - "gd": "Kyiv", - "os": "Киев", - "szl": "Kijůw", - "gl": "Kiev", - "war": "Kiev", - "bpy": "কিয়েভ", - "gv": "Kyiv", - "pa": "ਕੀਵ", - "csb": "Kyiv", - "cbk-zam": "Kyiv", - "ckb": "کیێڤ", - "pl": "Kijów", - "he": "קייב" - }, - "lat": "50.45011", - "lon": "30.52405", - "id": 26150422, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тетіїв", - "enName": "Tetiiv", - "names": { - "de": "Tetijiw", - "ru": "Тетиев", - "uk": "Тетіїв", - "prefix": "місто", - "pl": "Tetyjów" - }, - "lat": "49.36862", - "lon": "29.67712", - "id": 337561478, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Тетюши", - "enName": "Tetyushi", - "names": { - "tt": "Тәтеш", - "de": "Tetjuschi", - "cv": "Теччӗ", - "ru": "Тетюши", - "ja": "テチューシ" - }, - "lat": "54.93431", - "lon": "48.83168", - "id": 336524694, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.93456", - "lon": "48.83687", - "id": 261 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Лаишево", - "enName": "Laishevo", - "names": { - "tt": "Лаеш", - "de": "Laischewo", - "cv": "Лаиш", - "ru": "Лаишево", - "ja": "ライシェヴォ", - "lt": "Laiševas" - }, - "lat": "55.40434", - "lon": "49.54684", - "id": 336524182, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.39917", - "lon": "49.55297", - "id": 8277 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Кошкино", - "names": { - "tt": "Күкшел" - }, - "lat": "56.33042", - "lon": "50.80158", - "id": 797079071, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.33087", - "lon": "50.80482", - "id": 11218 - } - ], - "matchStreet": 1 - }, - { - "name": "Малая Бугульма", - "names": { - "tt": "Кече Бөгелмә" - }, - "lat": "54.50524", - "lon": "52.87763", - "id": 445814288, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "54.51180", - "lon": "52.85812", - "id": 4576 - } - ], - "matchStreet": 1 - }, - { - "name": "Ржищів", - "enName": "Rzhyschiv", - "names": { - "de": "Rschyschtschiw", - "ru": "Ржищев", - "uk": "Ржищів", - "prefix": "місто", - "pl": "Rzyszczów" - }, - "lat": "49.96822", - "lon": "31.04118", - "id": 337538749, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Мамашир", - "names": { - "tt": "Мәмәшир" - }, - "lat": "56.36733", - "lon": "50.84810", - "id": 797079080, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.36595", - "lon": "50.85237", - "id": 10619 - } - ], - "matchStreet": 1 - }, - { - "name": "Миронівка", - "enName": "Myronivka", - "names": { - "de": "Myroniwka", - "ru": "Мироновка", - "uk": "Миронівка", - "prefix": "місто", - "pl": "Mironówka" - }, - "lat": "49.65834", - "lon": "30.98250", - "id": 5119801550, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Березань", - "enName": "Berezan", - "names": { - "de": "Beresan", - "ru": "Березань", - "uk": "Березань", - "prefix": "місто", - "lt": "Berezanė", - "pl": "Berezań" - }, - "lat": "50.31327", - "lon": "31.46892", - "id": 337524664, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Нижние Вязовые", - "enName": "Nizhniye Vyazovye", - "names": { - "tt": "Карамалы Тау", - "ja": "ニジニエ・ヴャゾヴイエ" - }, - "lat": "55.79963", - "lon": "48.52238", - "id": 752193024, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.81148", - "lon": "48.51114", - "id": 5094 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Осиново", - "names": { - "tt": "Осиново" - }, - "lat": "55.87730", - "lon": "48.89103", - "id": 722796219, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.87683", - "lon": "48.89710", - "id": 3975 - } - ], - "matchStreet": 1 - }, - { - "name": "Альметьевск", - "enName": "Almetyevsk", - "names": { - "tt": "Әлмәт", - "de": "Almetjewsk", - "be": "Альмецьеўск", - "ru": "Альметьевск", - "ko": "알메티옙스크", - "lt": "Almetjevskas", - "it": "Al'met'evsk", - "fr": "Almetievsk", - "es": "Almétievsk", - "zh": "阿尔梅季耶夫斯克", - "ar": "ألميتيفسك", - "cv": "Элмет", - "uk": "Альметьєвськ", - "hsb": "Almetjewsk", - "ja": "アリメチエフスク", - "az": "Əlmət", - "fa": "آلماتیفسک", - "pl": "Almietjewsk", - "ro": "Almetievsk", - "ba": "Әлмәт" - }, - "lat": "54.89965", - "lon": "52.30149", - "id": 2173235770, - "type": "CITY", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.89948", - "lon": "52.27471", - "id": 70, - "buildings": [ - { - "name": "1", - "lat": "54.90372", - "lon": "52.31715" - }, - { - "name": "1А", - "lat": "54.90288", - "lon": "52.31537" - }, - { - "name": "1А/1", - "lat": "54.90344", - "lon": "52.31443" - }, - { - "name": "1Б", - "lat": "54.90368", - "lon": "52.31606" - }, - { - "name": "1В", - "lat": "54.90384", - "lon": "52.31443" - }, - { - "name": "2", - "lat": "54.90476", - "lon": "52.31224" - }, - { - "name": "2А", - "lat": "54.90430", - "lon": "52.31679" - }, - { - "name": "2А", - "lat": "54.90432", - "lon": "52.31745" - }, - { - "name": "2А/1", - "lat": "54.90467", - "lon": "52.31466" - }, - { - "name": "3", - "lat": "54.90367", - "lon": "52.31243" - }, - { - "name": "4", - "lat": "54.90456", - "lon": "52.31011" - }, - { - "name": "5", - "lat": "54.90392", - "lon": "52.31194" - }, - { - "name": "6", - "lat": "54.90477", - "lon": "52.30921" - }, - { - "name": "7", - "lat": "54.90370", - "lon": "52.31125" - }, - { - "name": "8", - "lat": "54.90450", - "lon": "52.30904" - }, - { - "name": "10", - "lat": "54.90507", - "lon": "52.30741" - }, - { - "name": "11", - "lat": "54.90395", - "lon": "52.31001" - }, - { - "name": "12", - "lat": "54.90473", - "lon": "52.30795" - }, - { - "name": "13", - "lat": "54.90404", - "lon": "52.30872" - }, - { - "name": "14", - "lat": "54.90505", - "lon": "52.30778" - }, - { - "name": "15", - "lat": "54.90375", - "lon": "52.30795" - }, - { - "name": "15Б", - "lat": "54.90367", - "lon": "52.30904" - }, - { - "name": "16", - "lat": "54.90457", - "lon": "52.30679" - }, - { - "name": "17", - "lat": "54.90412", - "lon": "52.30726" - }, - { - "name": "18", - "lat": "54.90508", - "lon": "52.30666" - }, - { - "name": "19", - "lat": "54.90413", - "lon": "52.30606" - }, - { - "name": "20", - "lat": "54.90467", - "lon": "52.30544" - }, - { - "name": "21", - "lat": "54.90366", - "lon": "52.30445" - }, - { - "name": "21А", - "lat": "54.90400", - "lon": "52.30544" - }, - { - "name": "22", - "lat": "54.90456", - "lon": "52.30438" - }, - { - "name": "23", - "lat": "54.90340", - "lon": "52.30288" - }, - { - "name": "23", - "lat": "54.90338", - "lon": "52.30314" - }, - { - "name": "24", - "lat": "54.90416", - "lon": "52.30342" - }, - { - "name": "25", - "lat": "54.90307", - "lon": "52.30215" - }, - { - "name": "26", - "lat": "54.90384", - "lon": "52.30263" - }, - { - "name": "27", - "lat": "54.90276", - "lon": "52.30136" - }, - { - "name": "28", - "lat": "54.90350", - "lon": "52.30179" - }, - { - "name": "29", - "lat": "54.90238", - "lon": "52.30048" - }, - { - "name": "30", - "lat": "54.90354", - "lon": "52.30104" - }, - { - "name": "30А", - "lat": "54.90408", - "lon": "52.30106" - }, - { - "name": "31", - "lat": "54.90205", - "lon": "52.29984" - }, - { - "name": "32", - "lat": "54.90310", - "lon": "52.30080" - }, - { - "name": "32А", - "lat": "54.90376", - "lon": "52.30022" - }, - { - "name": "33", - "lat": "54.90183", - "lon": "52.29928" - }, - { - "name": "33А", - "lat": "54.90162", - "lon": "52.29960" - }, - { - "name": "33Б", - "lat": "54.90205", - "lon": "52.29947" - }, - { - "name": "34", - "lat": "54.90282", - "lon": "52.29992" - }, - { - "name": "35", - "lat": "54.90134", - "lon": "52.29872" - }, - { - "name": "36", - "lat": "54.90247", - "lon": "52.29908" - }, - { - "name": "37", - "names": { - "tt": "Әлмәт татар дәүләт драма театры", - "hy": "Ալմետևսկի թաթարական պետական դրամատիկական թատրոն" - }, - "lat": "54.90051", - "lon": "52.29799" - }, - { - "name": "38", - "lat": "54.90265", - "lon": "52.29818" - }, - { - "name": "39", - "lat": "54.90046", - "lon": "52.29627" - }, - { - "name": "40", - "lat": "54.90213", - "lon": "52.29829" - }, - { - "name": "41", - "lat": "54.90033", - "lon": "52.29539" - }, - { - "name": "41А", - "lat": "54.89985", - "lon": "52.29634" - }, - { - "name": "42", - "lat": "54.90188", - "lon": "52.29720" - }, - { - "name": "42А", - "lat": "54.90173", - "lon": "52.29760" - }, - { - "name": "43", - "lat": "54.90009", - "lon": "52.29477" - }, - { - "name": "44", - "lat": "54.90246", - "lon": "52.29733" - }, - { - "name": "46", - "lat": "54.90134", - "lon": "52.29619" - }, - { - "name": "47", - "lat": "54.89972", - "lon": "52.29363" - }, - { - "name": "48", - "lat": "54.90099", - "lon": "52.29529" - }, - { - "name": "49", - "lat": "54.89932", - "lon": "52.29342" - }, - { - "name": "49А", - "lat": "54.89929", - "lon": "52.29290" - }, - { - "name": "50", - "lat": "54.90071", - "lon": "52.29411" - }, - { - "name": "51", - "lat": "54.89903", - "lon": "52.29271" - }, - { - "name": "51А", - "lat": "54.89869", - "lon": "52.29363" - }, - { - "name": "52", - "lat": "54.90170", - "lon": "52.29443" - }, - { - "name": "53", - "lat": "54.89912", - "lon": "52.29209" - }, - { - "name": "55", - "lat": "54.89876", - "lon": "52.29117" - }, - { - "name": "55А", - "lat": "54.89859", - "lon": "52.29067" - }, - { - "name": "56", - "lat": "54.90022", - "lon": "52.29327" - }, - { - "name": "57", - "lat": "54.89858", - "lon": "52.29258" - }, - { - "name": "58", - "lat": "54.90020", - "lon": "52.29260" - }, - { - "name": "59", - "lat": "54.89828", - "lon": "52.29295" - }, - { - "name": "60", - "lat": "54.89986", - "lon": "52.29198", - "postcode": "423450" - }, - { - "name": "61", - "lat": "54.89797", - "lon": "52.29331" - }, - { - "name": "62", - "lat": "54.89964", - "lon": "52.29119" - }, - { - "name": "63", - "lat": "54.89765", - "lon": "52.29366" - }, - { - "name": "64", - "lat": "54.90030", - "lon": "52.29095" - }, - { - "name": "65", - "lat": "54.89740", - "lon": "52.29462" - }, - { - "name": "66", - "lat": "54.90013", - "lon": "52.29016" - }, - { - "name": "67", - "lat": "54.89718", - "lon": "52.29391" - }, - { - "name": "68", - "lat": "54.89924", - "lon": "52.29072" - }, - { - "name": "68А", - "lat": "54.89914", - "lon": "52.29082" - }, - { - "name": "69А", - "lat": "54.89788", - "lon": "52.28943" - }, - { - "name": "70", - "lat": "54.89946", - "lon": "52.28988" - }, - { - "name": "70А", - "lat": "54.89999", - "lon": "52.28924" - }, - { - "name": "71", - "lat": "54.89739", - "lon": "52.28887" - }, - { - "name": "72", - "lat": "54.89900", - "lon": "52.28975" - }, - { - "name": "72А", - "lat": "54.89877", - "lon": "52.28960" - }, - { - "name": "73", - "lat": "54.89677", - "lon": "52.28700" - }, - { - "name": "74", - "lat": "54.89909", - "lon": "52.28891" - }, - { - "name": "74А", - "lat": "54.89965", - "lon": "52.28836" - }, - { - "name": "75", - "lat": "54.89716", - "lon": "52.28722" - }, - { - "name": "75", - "lat": "54.89719", - "lon": "52.28651" - }, - { - "name": "75", - "lat": "54.89733", - "lon": "52.28683" - }, - { - "name": "75", - "lat": "54.89733", - "lon": "52.28632" - }, - { - "name": "75", - "lat": "54.89740", - "lon": "52.28673" - }, - { - "name": "75", - "lat": "54.89767", - "lon": "52.28683" - }, - { - "name": "76", - "lat": "54.89856", - "lon": "52.28900" - }, - { - "name": "77", - "lat": "54.89772", - "lon": "52.28589" - }, - { - "name": "78", - "lat": "54.89911", - "lon": "52.28795" - }, - { - "name": "80", - "lat": "54.89865", - "lon": "52.28745" - }, - { - "name": "82", - "lat": "54.89834", - "lon": "52.28795" - }, - { - "name": "82А", - "lat": "54.89842", - "lon": "52.28696" - }, - { - "name": "83", - "lat": "54.89712", - "lon": "52.28164" - }, - { - "name": "85", - "lat": "54.89790", - "lon": "52.28112" - }, - { - "name": "85", - "lat": "54.89777", - "lon": "52.28115" - }, - { - "name": "86", - "lat": "54.89866", - "lon": "52.28649" - }, - { - "name": "87", - "lat": "54.89693", - "lon": "52.28061" - }, - { - "name": "88", - "lat": "54.89838", - "lon": "52.28608" - }, - { - "name": "89", - "lat": "54.89756", - "lon": "52.27986" - }, - { - "name": "90", - "lat": "54.89865", - "lon": "52.28565" - }, - { - "name": "91", - "lat": "54.89700", - "lon": "52.27898" - }, - { - "name": "92", - "lat": "54.89923", - "lon": "52.28597" - }, - { - "name": "93", - "lat": "54.89785", - "lon": "52.27864" - }, - { - "name": "94", - "lat": "54.89999", - "lon": "52.28123" - }, - { - "name": "95", - "lat": "54.89703", - "lon": "52.27812" - }, - { - "name": "97", - "lat": "54.89764", - "lon": "52.27737" - }, - { - "name": "98", - "lat": "54.89920", - "lon": "52.27746" - }, - { - "name": "99", - "lat": "54.89708", - "lon": "52.27651" - }, - { - "name": "100", - "lat": "54.89948", - "lon": "52.27471" - }, - { - "name": "100", - "lat": "54.89941", - "lon": "52.27391" - }, - { - "name": "101", - "lat": "54.89790", - "lon": "52.27615" - }, - { - "name": "103", - "lat": "54.89713", - "lon": "52.27565" - }, - { - "name": "104А", - "lat": "54.90096", - "lon": "52.26671" - }, - { - "name": "104Б", - "lat": "54.90123", - "lon": "52.26572" - }, - { - "name": "104Б", - "lat": "54.90134", - "lon": "52.26632" - }, - { - "name": "105", - "lat": "54.89772", - "lon": "52.27490" - }, - { - "name": "106", - "lat": "54.90203", - "lon": "52.26681" - }, - { - "name": "107", - "lat": "54.89718", - "lon": "52.27404" - }, - { - "name": "108", - "lat": "54.90261", - "lon": "52.26694" - }, - { - "name": "109", - "lat": "54.89804", - "lon": "52.27370" - }, - { - "name": "110", - "lat": "54.90314", - "lon": "52.26709" - }, - { - "name": "110А", - "lat": "54.90367", - "lon": "52.26735" - }, - { - "name": "111", - "lat": "54.89718", - "lon": "52.27316" - }, - { - "name": "112", - "lat": "54.90187", - "lon": "52.26507" - }, - { - "name": "112", - "lat": "54.90208", - "lon": "52.26417" - }, - { - "name": "112А", - "lat": "54.90164", - "lon": "52.26495" - }, - { - "name": "113", - "lat": "54.89780", - "lon": "52.27243" - }, - { - "name": "113А", - "lat": "54.89817", - "lon": "52.27250" - }, - { - "name": "114А", - "lat": "54.90235", - "lon": "52.26383" - }, - { - "name": "114Б", - "lat": "54.90261", - "lon": "52.26357" - }, - { - "name": "115", - "lat": "54.89722", - "lon": "52.27153" - }, - { - "name": "115А", - "lat": "54.89707", - "lon": "52.27235" - }, - { - "name": "116", - "lat": "54.90312", - "lon": "52.26297" - }, - { - "name": "117", - "lat": "54.89809", - "lon": "52.27119" - }, - { - "name": "118", - "lat": "54.90373", - "lon": "52.26385" - }, - { - "name": "119", - "lat": "54.89750", - "lon": "52.27067" - }, - { - "name": "119А", - "lat": "54.89767", - "lon": "52.27046" - }, - { - "name": "120", - "lat": "54.90373", - "lon": "52.26222" - }, - { - "name": "121", - "lat": "54.90097", - "lon": "52.26434" - }, - { - "name": "121А", - "lat": "54.89927", - "lon": "52.26720" - }, - { - "name": "121Б", - "lat": "54.89908", - "lon": "52.26810" - }, - { - "name": "121В", - "lat": "54.89887", - "lon": "52.26666" - }, - { - "name": "122", - "lat": "54.90333", - "lon": "52.26179" - }, - { - "name": "122", - "lat": "54.90325", - "lon": "52.26166" - }, - { - "name": "123", - "lat": "54.89999", - "lon": "52.26572" - }, - { - "name": "123Б", - "lat": "54.89927", - "lon": "52.26617" - }, - { - "name": "123В", - "lat": "54.89956", - "lon": "52.26664" - }, - { - "name": "124", - "lat": "54.90527", - "lon": "52.26482" - }, - { - "name": "124 с1", - "lat": "54.90573", - "lon": "52.25909" - }, - { - "name": "124 с2", - "lat": "54.90595", - "lon": "52.25939" - }, - { - "name": "125", - "lat": "54.89923", - "lon": "52.26499" - }, - { - "name": "126", - "lat": "54.90662", - "lon": "52.25707" - }, - { - "name": "127", - "lat": "54.89859", - "lon": "52.26495" - }, - { - "name": "128", - "lat": "54.90627", - "lon": "52.25585" - }, - { - "name": "129", - "lat": "54.89812", - "lon": "52.26460" - }, - { - "name": "129А", - "lat": "54.89823", - "lon": "52.26400" - }, - { - "name": "131", - "lat": "54.89891", - "lon": "52.26377" - }, - { - "name": "132", - "lat": "54.90779", - "lon": "52.25540" - }, - { - "name": "135", - "lat": "54.90069", - "lon": "52.26252" - }, - { - "name": "137", - "lat": "54.89929", - "lon": "52.26304" - }, - { - "name": "139", - "lat": "54.89920", - "lon": "52.26183" - }, - { - "name": "139Б", - "lat": "54.89953", - "lon": "52.26179" - }, - { - "name": "140", - "lat": "54.90801", - "lon": "52.25224", - "postcode": "423455" - }, - { - "name": "140", - "lat": "54.90851", - "lon": "52.25256", - "postcode": "423455" - }, - { - "name": "141", - "lat": "54.89976", - "lon": "52.26070" - }, - { - "name": "143", - "lat": "54.90057", - "lon": "52.26031" - }, - { - "name": "145", - "lat": "54.90143", - "lon": "52.26072" - }, - { - "name": "147", - "lat": "54.90157", - "lon": "52.26005" - }, - { - "name": "149", - "lat": "54.90129", - "lon": "52.26237" - }, - { - "name": "151", - "lat": "54.90185", - "lon": "52.26243" - }, - { - "name": "153", - "lat": "54.90223", - "lon": "52.26138" - }, - { - "name": "157", - "lat": "54.90117", - "lon": "52.25885" - }, - { - "name": "157А", - "lat": "54.90057", - "lon": "52.25909" - }, - { - "name": "171", - "lat": "54.90199", - "lon": "52.25671" - }, - { - "name": "187", - "lat": "54.90302", - "lon": "52.25544" - }, - { - "name": "189", - "lat": "54.90335", - "lon": "52.25385" - }, - { - "name": "193", - "lat": "54.90488", - "lon": "52.25400" - }, - { - "name": "195", - "lat": "54.90462", - "lon": "52.25572" - }, - { - "name": "195", - "lat": "54.90418", - "lon": "52.25679" - }, - { - "name": "195", - "lat": "54.90451", - "lon": "52.25647" - }, - { - "name": "197", - "lat": "54.90426", - "lon": "52.25340" - }, - { - "name": "199", - "lat": "54.90487", - "lon": "52.25209" - }, - { - "name": "201", - "lat": "54.90619", - "lon": "52.25250" - }, - { - "name": "203", - "lat": "54.90720", - "lon": "52.25070" - } - ], - "intersectedStreets": [ - { - "name": "улица Герцена", - "names": { - "tt": "Герцен урамы" - }, - "lat": "54.90398", - "lon": "52.31797" - }, - { - "name": "улица Ризы Фахретдина", - "names": { - "tt": "Риза Фәхреддин урамы" - }, - "lat": "54.90398", - "lon": "52.31797" - }, - { - "name": "проспект Тукая", - "names": { - "tt": "Тукай проспекты", - "ru": "проспект Тукая" - }, - "lat": "54.90412", - "lon": "52.31383" - }, - { - "name": "проспект Зарипова", - "lat": "54.90766", - "lon": "52.25008" - }, - { - "name": "улица Аминова", - "lat": "54.90362", - "lon": "52.25967" - }, - { - "name": "улица Зифы Балакиной", - "lat": "54.89988", - "lon": "52.26761" - }, - { - "name": "улица Марджани", - "lat": "54.89816", - "lon": "52.28522" - }, - { - "name": "улица Чехова", - "names": { - "tt": "Чехов урамы", - "tt-lat": "Çexov uramı" - }, - "lat": "54.90434", - "lon": "52.30475" - }, - { - "name": "улица Пушкина", - "names": { - "tt": "Пушкин урамы" - }, - "lat": "54.90378", - "lon": "52.30331" - }, - { - "name": "улица Маяковского", - "names": { - "tt": "Маяковский урамы" - }, - "lat": "54.90423", - "lon": "52.31044" - }, - { - "name": "улица Островского", - "names": { - "tt": "Островский урамы" - }, - "lat": "54.90437", - "lon": "52.30589" - }, - { - "name": "улица Радищева", - "names": { - "tt": "Радищев урамы" - }, - "lat": "54.90244", - "lon": "52.29984" - }, - { - "name": "улица Гагарина", - "lat": "54.90141", - "lon": "52.29720" - }, - { - "name": "улица Джалиля", - "names": { - "tt": "Җәлил урамы" - }, - "lat": "54.90024", - "lon": "52.29413" - }, - { - "name": "улица Заслонова", - "names": { - "tt": "Заслонов урамы" - }, - "lat": "54.89871", - "lon": "52.29014" - } - ] - }, - { - "name": "Ленина", - "lat": "54.90885", - "lon": "52.25265", - "id": 726, - "buildings": [ - { - "name": "140", - "lat": "54.90885", - "lon": "52.25265" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Давликеево", - "names": { - "tt": "Дәүләки" - }, - "lat": "55.21625", - "lon": "48.36310", - "id": 703166489, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.21762", - "lon": "48.36134", - "id": 6609 - } - ], - "matchStreet": 1 - }, - { - "name": "Большая Цильна", - "names": { - "tt": "Зур Чынлы" - }, - "lat": "54.68808", - "lon": "47.85389", - "id": 762000538, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.69761", - "lon": "47.85312", - "id": 10335 - } - ], - "matchStreet": 1 - }, - { - "name": "Апастово", - "enName": "Apastovo", - "names": { - "tt": "Апас", - "ar": "أباستوفو", - "de": "Apastowo", - "cv": "Апас", - "ru": "Апастово", - "ja": "アパソトヴォ", - "ca": "Apàstovo", - "ba": "Апас" - }, - "lat": "55.20267", - "lon": "48.50687", - "id": 703166491, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "uliza Lenina", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.20401", - "lon": "48.51266", - "id": 2565 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Балтаси", - "enName": "Baltasi", - "names": { - "tt": "Балтач", - "ru": "Балтаси", - "ja": "バルタシ" - }, - "lat": "56.34462", - "lon": "50.21142", - "id": 701721057, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "56.34680", - "lon": "50.20677", - "id": 275 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Светлое Озеро", - "names": { - "tt": "Яктыкүл" - }, - "lat": "55.18347", - "lon": "52.01205", - "id": 586094617, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.17911", - "lon": "52.01449", - "id": 525, - "buildings": [ - { - "name": "1", - "lat": "55.19065", - "lon": "52.00960" - }, - { - "name": "2", - "lat": "55.19073", - "lon": "52.00889" - }, - { - "name": "45", - "lat": "55.18594", - "lon": "52.01245" - }, - { - "name": "77", - "lat": "55.18224", - "lon": "52.01449" - }, - { - "name": "79", - "lat": "55.18177", - "lon": "52.01473" - }, - { - "name": "81", - "lat": "55.18094", - "lon": "52.01533", - "postcode": "423538" - }, - { - "name": "83", - "lat": "55.18046", - "lon": "52.01499" - }, - { - "name": "94", - "lat": "55.17950", - "lon": "52.01449", - "postcode": "423538" - }, - { - "name": "96", - "lat": "55.17911", - "lon": "52.01449", - "postcode": "423538" - }, - { - "name": "96", - "lat": "55.17912", - "lon": "52.01449", - "postcode": "423538" - }, - { - "name": "98", - "lat": "55.17871", - "lon": "52.01451" - } - ], - "intersectedStreets": [ - { - "name": "улица Академика Акатьева", - "lat": "55.18053", - "lon": "52.01464" - }, - { - "name": "переулок Вахитова", - "lat": "55.17898", - "lon": "52.01479" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Камское Устье", - "enName": "Kamskoye Ustye", - "names": { - "tt": "Кама Тамагы", - "cv": "Кама Вӑрри", - "ru": "Камское Устье", - "ja": "カムスコエ・ウスチエ" - }, - "lat": "55.20157", - "lon": "49.26802", - "id": 336524471, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.20416", - "lon": "49.26960", - "id": 7493 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Кагарлик", - "lat": "49.85635", - "lon": "30.74794", - "id": 6629021, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Старое Клянчино", - "names": { - "tt": "Иске Теләнче", - "ru": "Старое Клянчино" - }, - "lat": "55.47022", - "lon": "52.52591", - "id": 582997319, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "ru": "улица Ленина" - }, - "lat": "55.46914", - "lon": "52.52182", - "id": 11253 - } - ], - "matchStreet": 1 - }, - { - "name": "Заря", - "names": { - "tt": "Заря", - "ja": "ザリャー" - }, - "lat": "54.99205", - "lon": "50.84252", - "id": 854647311, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы" - }, - "lat": "54.99286", - "lon": "50.84267", - "id": 12004 - } - ], - "matchStreet": 1 - }, - { - "name": "Коцюбинське", - "enName": "Kotsiubynske", - "names": { - "ru": "Коцюбинское", - "uk": "Коцюбинське", - "prefix": "селище міського типу", - "pl": "Kotsiubynske" - }, - "lat": "50.49047", - "lon": "30.33379", - "id": 337520861, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Большое Афанасово", - "names": { - "tt": "Олы Афанас", - "ru": "Большое Афанасово" - }, - "lat": "55.59972", - "lon": "51.77507", - "id": 2463557141, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.60991", - "lon": "51.79354", - "id": 9734, - "buildings": [ - { - "name": "1", - "lat": "55.60995", - "lon": "51.79442" - }, - { - "name": "2", - "lat": "55.61010", - "lon": "51.79384" - }, - { - "name": "2А", - "lat": "55.61071", - "lon": "51.79333" - }, - { - "name": "3", - "lat": "55.60971", - "lon": "51.79416" - }, - { - "name": "4", - "lat": "55.60991", - "lon": "51.79354" - }, - { - "name": "5", - "lat": "55.60952", - "lon": "51.79393" - }, - { - "name": "6", - "lat": "55.60972", - "lon": "51.79331" - }, - { - "name": "7", - "lat": "55.60934", - "lon": "51.79361" - }, - { - "name": "8", - "lat": "55.60953", - "lon": "51.79305" - }, - { - "name": "9", - "lat": "55.60920", - "lon": "51.79339" - }, - { - "name": "10", - "lat": "55.60929", - "lon": "51.79264" - }, - { - "name": "11", - "lat": "55.60898", - "lon": "51.79307" - }, - { - "name": "12", - "lat": "55.60909", - "lon": "51.79225" - }, - { - "name": "13", - "lat": "55.60884", - "lon": "51.79283" - }, - { - "name": "14", - "lat": "55.60894", - "lon": "51.79200" - }, - { - "name": "15", - "lat": "55.60872", - "lon": "51.79266" - }, - { - "name": "16", - "lat": "55.60881", - "lon": "51.79183" - }, - { - "name": "17", - "lat": "55.60862", - "lon": "51.79247" - }, - { - "name": "18", - "lat": "55.60869", - "lon": "51.79163" - }, - { - "name": "19", - "lat": "55.60843", - "lon": "51.79217" - }, - { - "name": "20", - "lat": "55.60849", - "lon": "51.79144" - }, - { - "name": "21", - "lat": "55.60827", - "lon": "51.79189" - }, - { - "name": "22", - "lat": "55.60834", - "lon": "51.79116" - }, - { - "name": "23", - "lat": "55.60805", - "lon": "51.79155" - }, - { - "name": "24", - "lat": "55.60820", - "lon": "51.79095" - }, - { - "name": "25", - "lat": "55.60791", - "lon": "51.79133" - }, - { - "name": "26", - "lat": "55.60808", - "lon": "51.79075" - }, - { - "name": "27", - "lat": "55.60778", - "lon": "51.79114" - }, - { - "name": "27А", - "lat": "55.60766", - "lon": "51.79092" - }, - { - "name": "28", - "lat": "55.60795", - "lon": "51.79054" - }, - { - "name": "29", - "lat": "55.60752", - "lon": "51.79067" - }, - { - "name": "30", - "lat": "55.60780", - "lon": "51.79028" - }, - { - "name": "31", - "lat": "55.60735", - "lon": "51.79043" - }, - { - "name": "32", - "lat": "55.60778", - "lon": "51.78938" - }, - { - "name": "33", - "lat": "55.60718", - "lon": "51.79017" - }, - { - "name": "34", - "lat": "55.60743", - "lon": "51.78949" - }, - { - "name": "35", - "lat": "55.60703", - "lon": "51.78994" - }, - { - "name": "36", - "lat": "55.60721", - "lon": "51.78949" - }, - { - "name": "37", - "lat": "55.60686", - "lon": "51.78966" - }, - { - "name": "39", - "lat": "55.60672", - "lon": "51.78942" - }, - { - "name": "39А", - "lat": "55.60652", - "lon": "51.78884" - }, - { - "name": "41", - "lat": "55.60662", - "lon": "51.78848" - }, - { - "name": "42", - "lat": "55.60683", - "lon": "51.78846" - }, - { - "name": "42Б", - "lat": "55.60658", - "lon": "51.78747" - }, - { - "name": "45", - "lat": "55.60627", - "lon": "51.78783" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Саклов-Баш", - "names": { - "tt": "Саклаубаш" - }, - "lat": "55.37935", - "lon": "52.88140", - "id": 593610600, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "tt-lat": "Lenin uramı" - }, - "lat": "55.37916", - "lon": "52.88016", - "id": 1816 - } - ], - "matchStreet": 1 - }, - { - "name": "Рокитне", - "enName": "Rokytne", - "names": { - "de": "Rokytne", - "ru": "Ракитное", - "uk": "Рокитне", - "prefix": "селище міського типу", - "pl": "Rokitna" - }, - "lat": "49.68673", - "lon": "30.47303", - "id": 337549274, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Богуслав", - "enName": "Bohuslav", - "names": { - "de": "Bohuslaw", - "ru": "Богуслав", - "uk": "Богуслав", - "prefix": "місто", - "pl": "Bohusław" - }, - "lat": "49.54765", - "lon": "30.87330", - "id": 337555159, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Пестрецы", - "enName": "Pestretsy", - "names": { - "tt": "Питрәч", - "ru": "Пестрецы", - "ja": "ペストレツィ", - "lt": "Pestrecai" - }, - "lat": "55.75021", - "lon": "49.65709", - "id": 697241159, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Алексеевское", - "enName": "Alexeyevskoye", - "names": { - "tt": "Алексеевск", - "de": "Alexejewskoje", - "ru": "Алексеевское", - "ja": "アレクセーエフスコエ", - "lt": "Aleksėjevskojė" - }, - "lat": "55.30496", - "lon": "50.11289", - "id": 336524229, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "uliza Lenina", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.30730", - "lon": "50.12300", - "id": 6508 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Мензелинск", - "enName": "Menzelinsk", - "names": { - "tt": "Минзәлә", - "de": "Menselinsk", - "ru": "Мензелинск", - "ja": "メンゼリンスク" - }, - "lat": "55.72556", - "lon": "53.10718", - "id": 337839017, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.72411", - "lon": "53.10192", - "id": 3916 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Бугульма", - "enName": "Bugulma", - "names": { - "tt": "Бөгелмә", - "de": "Bugulma", - "ru": "Бугульма", - "ja": "ブグリマ" - }, - "lat": "54.53841", - "lon": "52.79559", - "id": 1707207947, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.54633", - "lon": "52.78989", - "id": 595 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Мамадыш", - "enName": "Mamadysh", - "names": { - "tt": "Мамадыш", - "de": "Mamadysch", - "ru": "Мамадыш", - "ja": "ママドィシ", - "az": "Mamadış" - }, - "lat": "55.70908", - "lon": "51.40891", - "id": 337839024, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица В. И. Ленина", - "lat": "55.71813", - "lon": "51.42443", - "id": 1740, - "buildings": [ - { - "name": "1/22", - "lat": "55.71805", - "lon": "51.42372", - "postcode": "422190" - }, - { - "name": "2", - "lat": "55.71847", - "lon": "51.42376" - }, - { - "name": "16", - "lat": "55.71888", - "lon": "51.42202" - }, - { - "name": "18/26", - "lat": "55.71893", - "lon": "51.42172" - }, - { - "name": "19", - "lat": "55.71890", - "lon": "51.41992" - }, - { - "name": "23", - "lat": "55.71911", - "lon": "51.41926" - }, - { - "name": "70", - "lat": "55.72104", - "lon": "51.41293" - }, - { - "name": "73", - "lat": "55.72167", - "lon": "51.40851" - }, - { - "name": "74", - "lat": "55.72127", - "lon": "51.41194" - }, - { - "name": "75А", - "lat": "55.72172", - "lon": "51.40578" - }, - { - "name": "75В", - "lat": "55.72161", - "lon": "51.40640" - }, - { - "name": "80", - "lat": "55.72155", - "lon": "51.41087" - }, - { - "name": "85А", - "lat": "55.72338", - "lon": "51.40188" - }, - { - "name": "94Б", - "lat": "55.72255", - "lon": "51.40617" - }, - { - "name": "96", - "lat": "55.72326", - "lon": "51.40492" - }, - { - "name": "104", - "lat": "55.72411", - "lon": "51.40293" - }, - { - "name": "105", - "lat": "55.72850", - "lon": "51.39870" - }, - { - "name": "107", - "lat": "55.72903", - "lon": "51.39891" - }, - { - "name": "107А", - "lat": "55.72898", - "lon": "51.39791" - }, - { - "name": "108", - "lat": "55.72640", - "lon": "51.40123", - "postcode": "422190" - }, - { - "name": "110", - "lat": "55.72655", - "lon": "51.40100", - "postcode": "422190" - }, - { - "name": "118", - "lat": "55.72943", - "lon": "51.39990", - "postcode": "422190" - } - ], - "intersectedStreets": [ - { - "name": "улица Толстого", - "lat": "55.71882", - "lon": "51.42155" - }, - { - "name": "улица Галактионова", - "lat": "55.71814", - "lon": "51.42443" - }, - { - "name": "улица Максимова", - "lat": "55.73760", - "lon": "51.39655" - }, - { - "name": "улица Абсалямова", - "names": { - "tt": "Әпсәләмов урамы" - }, - "lat": "55.73633", - "lon": "51.39705" - }, - { - "name": "Ипподромная улица", - "lat": "55.73581", - "lon": "51.39722" - }, - { - "name": "Товарищеская улица", - "lat": "55.73557", - "lon": "51.39728" - }, - { - "name": "улица Р. Нуриева", - "lat": "55.73485", - "lon": "51.39763" - }, - { - "name": "Вишнёвая улица", - "lat": "55.73407", - "lon": "51.39801" - }, - { - "name": "улица Энергетиков", - "lat": "55.73401", - "lon": "51.39803" - }, - { - "name": "улица Х. Такташ", - "lat": "55.73389", - "lon": "51.39810" - }, - { - "name": "Радужная улица", - "lat": "55.73326", - "lon": "51.39842" - }, - { - "name": "улица Дружбы", - "lat": "55.73326", - "lon": "51.39842" - }, - { - "name": "улица 50 лет Победы", - "lat": "55.73045", - "lon": "51.39947" - }, - { - "name": "улица Ш. Маннура", - "lat": "55.73006", - "lon": "51.39956" - }, - { - "name": "Майская улица", - "lat": "55.72997", - "lon": "51.39956" - }, - { - "name": "улица Нигматуллина", - "lat": "55.72785", - "lon": "51.40001" - }, - { - "name": "переулок Нигматуллина", - "lat": "55.72776", - "lon": "51.40003" - }, - { - "name": "улица Мичурина", - "lat": "55.72707", - "lon": "51.40037" - }, - { - "name": "Школьная улица", - "lat": "55.72677", - "lon": "51.40059" - }, - { - "name": "улица Ф. Энгельса", - "lat": "55.72602", - "lon": "51.40110" - }, - { - "name": "Садовая улица", - "lat": "55.72500", - "lon": "51.40188" - }, - { - "name": "Комсомольская улица", - "lat": "55.72367", - "lon": "51.40290" - }, - { - "name": "Союзная улица", - "lat": "55.72246", - "lon": "51.40591" - }, - { - "name": "улица Тукая", - "lat": "55.72201", - "lon": "51.40795" - }, - { - "name": "улица Азина", - "names": { - "tt": "Азин урамы" - }, - "lat": "55.72148", - "lon": "51.41020" - }, - { - "name": "Красноармейская улица", - "lat": "55.72093", - "lon": "51.41252" - }, - { - "name": "улица Гагарина", - "names": { - "tt": "Гагарин урамы" - }, - "lat": "55.72043", - "lon": "51.41469" - }, - { - "name": "улица М. Джалиля", - "lat": "55.71993", - "lon": "51.41677" - }, - { - "name": "улица К. Маркса", - "lat": "55.71946", - "lon": "51.41889" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Болгар", - "names": { - "tt": "Болгар", - "ja": "ボルガル" - }, - "lat": "55.41516", - "lon": "51.60141", - "id": 705268166, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.41721", - "lon": "51.59851", - "id": 9311, - "intersectedStreets": [ - { - "name": "улица Гагарина", - "lat": "55.41721", - "lon": "51.59851" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Бавлы", - "enName": "Bavly", - "names": { - "tt": "Баулы", - "de": "Bawly", - "ru": "Бавлы", - "ja": "バヴルィ", - "et": "Bavlõ" - }, - "lat": "54.40309", - "lon": "53.23571", - "id": 337839279, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "enName": "Lenina Street", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.40419", - "lon": "53.23696", - "id": 6957 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Згурівка", - "enName": "Zghurivka", - "names": { - "de": "Shuriwka", - "ru": "Згуровка", - "prefix": "селище міського типу", - "uk": "Згурівка", - "pl": "Zhuriwka" - }, - "lat": "50.49506", - "lon": "31.76918", - "id": 337520849, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Буинск", - "enName": "Buinsk", - "names": { - "tt": "Буа", - "de": "Buinsk", - "cv": "Пӑва", - "ru": "Буинск", - "ja": "ブインスク" - }, - "lat": "54.97229", - "lon": "48.29289", - "id": 295862317, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.96690", - "lon": "48.29476", - "id": 5936 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Гостомель", - "enName": "Hostomel", - "names": { - "ru": "Гостомель", - "uk": "Гостомель", - "prefix": "селище міського типу", - "pl": "Hostomel" - }, - "lat": "50.58826", - "lon": "30.25909", - "id": 337519314, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Бровари", - "enName": "Brovary", - "names": { - "de": "Browary", - "ru": "Бровары", - "prefix": "місто", - "uk": "Бровари", - "eo": "Brovari", - "fr": "Brovary", - "pl": "Browary", - "hu": "Brovari", - "et": "Brovarõ", - "sr": "Бровари" - }, - "lat": "50.51111", - "lon": "30.79004", - "id": 3673183717, - "type": "CITY", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Победа", - "names": { - "tt": "Победа" - }, - "lat": "54.67300", - "lon": "52.66657", - "id": 783002941, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "54.67386", - "lon": "52.66232", - "id": 4552 - } - ], - "matchStreet": 1 - }, - { - "name": "Димер", - "enName": "Dymer", - "names": { - "ru": "Дымер", - "uk": "Димер", - "prefix": "селище міського типу", - "pl": "Dymer" - }, - "lat": "50.78355", - "lon": "30.30780", - "id": 1585808480, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Набережные Челны", - "enName": "Naberezhnye Chelny", - "names": { - "tt": "Яр Чаллы", - "de": "Nabereschnyje Tschelny", - "no": "Naberezjnyje Tsjelny", - "be": "Наберажныя Чалны", - "fi": "Naberežnyje Tšelny", - "ru": "Набережные Челны", - "pt": "Naberejnye Chelny", - "bg": "Набережние Челни", - "lt": "Naberežnyje Čelnai", - "hr": "Naberežnye Čelny", - "lv": "Naberežnije Čelni", - "fr": "Naberejnye Tchelny", - "ka": "ნაბერეჟნიე ჩელნი", - "uk": "Набережні Човни", - "ca": "Nàberejnie_Txelní", - "sr": "Набережније Челни", - "sv": "Naberezjnyje Tjelny", - "ko": "나베레즈니예첼니", - "it": "Naberežnye Čelny", - "es": "Náberezhnye Chelny", - "zh": "卡马河畔切尔尼", - "et": "Naberežnõje Tšelnõ", - "cs": "Naberežnyje Čelny", - "ar": "نابريجناي تشلني", - "cv": "Чаллă", - "ja": "ナベレジヌイェ・チェルヌイ", - "az": "Naberejnıye Çelnı", - "fa": "نابرژنیه چلنی", - "pl": "Nabierieżnyje Czełny", - "ro": "Naberejnîe Celnî", - "nl": "Naberezjnye Tsjelny", - "tr": "Yarçallı", - "ba": "Яр Саллы" - }, - "lat": "55.74201", - "lon": "52.39923", - "id": 191749240, - "type": "CITY", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.69950", - "lon": "52.31059", - "id": 1334, - "buildings": [ - { - "name": "9", - "lat": "55.71643", - "lon": "52.38245" - } - ], - "intersectedStreets": [ - { - "name": "Полевая улица", - "lat": "55.69824", - "lon": "52.30953" - }, - { - "name": "улица Фрунзе", - "names": { - "tt": "Фрунзе урамы" - }, - "lat": "55.69824", - "lon": "52.30953" - }, - { - "name": "улица Карла Маркса", - "names": { - "tt": "Карл Маркс урамы" - }, - "lat": "55.69995", - "lon": "52.31029" - }, - { - "name": "Красногвардейская улица", - "lat": "55.70029", - "lon": "52.31009" - }, - { - "name": "Комсомольская набережная", - "lat": "55.70193", - "lon": "52.30900" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Богдашкино", - "enName": "Bogdashkino", - "names": { - "cv": "Пухтел", - "ru": "Богдашкино" - }, - "lat": "54.61321", - "lon": "47.67519", - "id": 336525269, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "переулок Ленина", - "lat": "54.61380", - "lon": "47.67824", - "id": 10951 - }, - { - "name": "улица Ленина", - "lat": "54.60684", - "lon": "47.67318", - "id": 9171 - } - ], - "matchStreet": 1 - }, - { - "name": "Сквира", - "enName": "Skvyra", - "names": { - "kk": "Skvyra", - "de": "Skwyra", - "ceb": "Skvyra", - "be": "Сквыра", - "ru": "Сквира", - "sv": "Skvyra", - "prefix": "місто", - "it": "Skvyra", - "fr": "Skvyra", - "cs": "Skvyra", - "hy": "Սկվյրա", - "vi": "Skvyra", - "uk": "Сквира", - "sk": "Skvyra", - "fa": "اسکویرا", - "pl": "Skwyra", - "ro": "Skvîra" - }, - "lat": "49.73370", - "lon": "29.66266", - "id": 337547206, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Рыбная Слобода", - "enName": "Rybnaya Sloboda", - "names": { - "tt": "Балык Бистәсе", - "ru": "Рыбная Слобода", - "ja": "ルィブナヤ・スロボーダ" - }, - "lat": "55.46442", - "lon": "50.14061", - "id": 703680750, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "tt-lat": "Lenin uramı", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.46726", - "lon": "50.14763", - "id": 2637 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Арск", - "enName": "Arsk", - "names": { - "tt": "Арча", - "de": "Arsk", - "ru": "Арск", - "ja": "アルスク" - }, - "lat": "56.09099", - "lon": "49.87718", - "id": 295868224, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Каркаусь", - "names": { - "tt": "Кәркәүч" - }, - "lat": "56.10411", - "lon": "51.14129", - "id": 797051488, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "lat": "56.10492", - "lon": "51.14228", - "id": 7812 - } - ], - "matchStreet": 1 - }, - { - "name": "Мусабай-Завод", - "names": { - "tt": "Мусабай-Завод", - "ru": "Мусабай-Завод" - }, - "lat": "55.51024", - "lon": "52.40260", - "id": 582657576, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.51051", - "lon": "52.40217", - "id": 7928, - "buildings": [ - { - "name": "29", - "lat": "55.51133", - "lon": "52.40182" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Тюлячи", - "enName": "Tyulyachi", - "names": { - "tt": "Теләче", - "ru": "Тюлячи", - "ja": "チュリャチ" - }, - "lat": "55.89188", - "lon": "50.23350", - "id": 697241170, - "type": "TOWN", - "listOfStreets": [ - { - "name": "улица Ленина", - "names": { - "tt": "Ленин урамы", - "de": "Leninstraße", - "be": "вулiца Ленiна", - "ru": "улица Ленина", - "mrj": "Ленин öлицä", - "fr": "Rue Lénine", - "ba": "Ленин урамы" - }, - "lat": "55.89223", - "lon": "50.24659", - "id": 3195 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Васильків", - "enName": "Vasylkiv", - "names": { - "de": "Wassylkiw", - "ru": "Васильков", - "uk": "Васильків", - "prefix": "місто", - "fr": "Vassylkiv", - "pl": "Wasilków", - "hu": "Vasylkiv" - }, - "lat": "50.17387", - "lon": "30.32158", - "id": 337527490, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - }, - { - "name": "Красный Ключ", - "enName": "Krasny Klyuch", - "names": { - "tt": "Красный Ключ", - "ja": "クラスヌイ・クリューチ" - }, - "lat": "55.68249", - "lon": "51.81914", - "id": 585272830, - "type": "TOWN", - "listOfStreets": [], - "init": 1 - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/street_rue_emile.json b/OsmAnd-java/src/test/resources/search/street_rue_emile.json deleted file mode 100644 index 74c6541b34..0000000000 --- a/OsmAnd-java/src/test/resources/search/street_rue_emile.json +++ /dev/null @@ -1,8178 +0,0 @@ -{ - "settings": { - "lat": "50.64514", - "lon": "5.57342", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "rue émile", - "results": [ - "Rue Émile Gérard, Liège", - "Rue Emile Vandervelde, Liège", - "Rue Emile Vandervelde - Rue Sainte-Marguerite, Liège", - "Rue Émile Zola (Laveu), Liège", - "Rue Émile Collard, Liège", - "Rue Emile Vandervelde, Vottem", - "Rue Emile Vandervelde (Vottem), Herstal", - "Rue Émile Verhaeren, Liège", - "Rue Émile Jeanne, Saint-Nicolas", - "Rue Emile Muraille, Herstal", - "Rue Emile Verhaeren, Grâce-Hollogne", - "Rue Emile Vinck, Herstal" - ], - "amenities": [ - { - "name": "Soye Rue Émile Lorent 252", - "lat": "50.44816", - "lon": "4.74122", - "id": 6096184636, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "bench_yes": "yes", - "covered_yes": "yes", - "network": "TECN", - "operator": "TEC" - } - }, - { - "name": "Rue Émile Pirson", - "lat": "50.50419", - "lon": "4.66955", - "id": 147817647, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes" - } - }, - { - "name": "Soye Rue Émile Lorent 252", - "lat": "50.44883", - "lon": "4.74009", - "id": 6096184638, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "network": "TECN", - "operator": "TEC" - } - }, - { - "name": "4b", - "names": { - "fr": "Avenue Gabriel Emile Lebon", - "nl": "Gabriel Emile Lebonlaan" - }, - "lat": "50.82338", - "lon": "4.40886", - "id": 1222411455, - "subType": "lcn_ref", - "type": "transportation", - "additionalInfo": { - "network": "lcn", - "operator": "Brussels Mobility" - } - }, - { - "name": "Liège Avenue Emile Jenissen", - "lat": "50.64078", - "lon": "5.54797", - "id": 6057259982, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "network": "TECL", - "operator": "TEC" - } - }, - { - "name": "Orp-le-Grand Rue Emile Vandervelde", - "lat": "50.70772", - "lon": "4.99284", - "id": 4085539138, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "26", - "network": "TECB", - "operator": "TEC" - } - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.64840", - "lon": "5.54513", - "id": 57311075, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "ref": "N637" - } - }, - { - "name": "Namur Rue Émile Cuvelier", - "names": { - "etymology:wikidata": "Q2997972" - }, - "lat": "50.46461", - "lon": "4.86632", - "id": 3425215930, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "5, 8, 9", - "network": "TECN", - "operator": "TEC" - } - }, - { - "name": "Fleurus Rue Emile Vandervelde", - "lat": "50.47870", - "lon": "4.54611", - "id": 5994274194, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "network": "TECC", - "operator": "TEC" - } - }, - { - "name": "Fleurus Rue Emile Vandervelde", - "lat": "50.47895", - "lon": "4.54617", - "id": 5994274196, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "network": "TECC", - "operator": "TEC" - } - }, - { - "name": "Jezuïetencollege, heden stedelijke Emile Brauschool", - "lat": "51.05209", - "lon": "3.72417", - "id": 5252836298, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "description": "Jezuïetencollege, heden stedelijke Emile Brauschool" - } - }, - { - "name": "Glain Rue Emile Vandervelde", - "lat": "50.64830", - "lon": "5.54829", - "id": 5838175460, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "network": "TECL", - "operator": "TEC" - } - } - ], - "cities": [ - { - "name": "Farciennes", - "names": { - "ru": "Фарсьен" - }, - "lat": "50.42732", - "lon": "4.55304", - "id": 357148969, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde (Pironchamps)", - "lat": "50.42581", - "lon": "4.52991", - "id": 148287 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Dour", - "names": { - "ru": "Дур" - }, - "lat": "50.39788", - "lon": "3.78069", - "id": 477168724, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Estièvenart", - "lat": "50.39535", - "lon": "3.77756", - "id": 120332 - }, - { - "name": "Rue Emile Cornez", - "lat": "50.40150", - "lon": "3.77275", - "id": 122499 - }, - { - "name": "Place Emile Vandervelde", - "lat": "50.39892", - "lon": "3.78561", - "id": 228077 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Wanze", - "names": { - "ru": "Ванз", - "wa": "Wônse", - "fr": "Wanze" - }, - "lat": "50.53326", - "lon": "5.21666", - "id": 353175792, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Rorive", - "lat": "50.54438", - "lon": "5.22288", - "id": 118883 - }, - { - "name": "Rue Emile Vandervelde (Vinalmont)", - "lat": "50.55988", - "lon": "5.23185", - "id": 196957 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Wavre", - "names": { - "ru": "Вавр", - "wa": "Wåve", - "fr": "Wavre", - "nl": "Waver" - }, - "lat": "50.71624", - "lon": "4.60844", - "id": 60284787, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Emile Verhaeren", - "lat": "50.70723", - "lon": "4.63664", - "id": 238410, - "intersectedStreets": [ - { - "name": "Avenue Maupassant", - "lat": "50.70711", - "lon": "4.63584" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gingelom", - "lat": "50.75003", - "lon": "5.13321", - "id": 1736682348, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Beauduinstraat (Jeuk)", - "lat": "50.71964", - "lon": "5.18898", - "id": 201151, - "intersectedStreets": [ - { - "name": "Kasteelstraat (Jeuk)", - "lat": "50.72168", - "lon": "5.18810" - }, - { - "name": "Spoorwegstraat (Jeuk)", - "lat": "50.72168", - "lon": "5.18810" - }, - { - "name": "Kustrijkstraat (Jeuk)", - "lat": "50.72407", - "lon": "5.18711" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Visé", - "names": { - "de": "Weset", - "ru": "Визе", - "wa": "Vizé", - "fr": "Visé", - "nl": "Wezet" - }, - "lat": "50.73366", - "lon": "5.69553", - "id": 79453332, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Verhaeren", - "lat": "50.74042", - "lon": "5.68075", - "id": 236252 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Wauthier-Braine", - "names": { - "fr": "Wauthier-Braine", - "nl": "Woutersbrakel" - }, - "lat": "50.67974", - "lon": "4.30123", - "id": 294066552, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Schampaert (La Cantine)", - "lat": "50.68466", - "lon": "4.29962", - "id": 43680 - }, - { - "name": "Rue Emile Vandervelde (La Cantine)", - "lat": "50.68732", - "lon": "4.30550", - "id": 43683 - } - ], - "matchStreet": 1 - }, - { - "name": "Koksijde", - "names": { - "ru": "Коксейде", - "fr": "Coxyde", - "vls": "Koksyde", - "nl": "Koksijde" - }, - "lat": "51.10642", - "lon": "2.65002", - "id": 720858823, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan (Oostduinkerke)", - "names": { - "alt_name": "Verhaerenlaan (Oostduinkerke)" - }, - "lat": "51.12650", - "lon": "2.69611", - "id": 132769 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sint-Jozef", - "names": { - "fr": "Saint-Joseph", - "vls": "Sint-Jozef", - "nl": "Sint-Jozef" - }, - "lat": "51.22561", - "lon": "3.23163", - "id": 1677380553, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Emile en Dora Rommelaerestraat", - "lat": "51.22929", - "lon": "3.24316", - "id": 132717 - } - ], - "matchStreet": 1 - }, - { - "name": "Guillemins", - "lat": "50.62513", - "lon": "5.57138", - "id": 23620263899, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Avenue Emile Digneffe", - "lat": "50.61993", - "lon": "5.57415", - "id": 188340, - "buildings": [], - "intersectedStreets": [ - { - "name": "Place du Général Leman", - "lat": "50.61993", - "lon": "5.57415" - }, - { - "name": "Rue Ernest Solvay", - "lat": "50.61982", - "lon": "5.57425" - }, - { - "name": "Quai de Rome", - "lat": "50.62054", - "lon": "5.57756" - }, - { - "name": "Rue de Fétinne", - "lat": "50.62054", - "lon": "5.57756" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Gilles - Sint-Gillis", - "names": { - "ru": "Сен-Жиль", - "fr": "Saint-Gilles", - "nl": "Sint-Gillis" - }, - "lat": "50.82674", - "lon": "4.34567", - "id": 26032499, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Feron - Émile Feronstraat", - "names": { - "old_name:fr": "Rue de Constantinople", - "old_name": "Rue de Constantinople - Konstantinopelstraat", - "old_name:nl": "Konstantinopelstraat", - "fr": "Rue Émile Feron", - "nl": "Émile Feronstraat" - }, - "lat": "50.83070", - "lon": "4.33595", - "id": 13792 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Mouscron", - "names": { - "pcd": "Moucron", - "ru": "Мускрон", - "lt": "Mukronas", - "fr": "Mouscron", - "vls": "Meschroên", - "nl": "Moeskroen" - }, - "lat": "50.74333", - "lon": "3.21391", - "id": 539515887, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Cité Émile Vinck", - "lat": "50.72855", - "lon": "3.20155", - "id": 113891 - }, - { - "name": "Rue Émile Zola", - "lat": "50.74942", - "lon": "3.18342", - "id": 105815 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Dilbeek", - "names": { - "ru": "Дилбек" - }, - "lat": "50.84807", - "lon": "4.26626", - "id": 251470517, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Eylenboschstraat", - "lat": "50.83394", - "lon": "4.19261", - "id": 166356 - }, - { - "name": "Emile de Blutslaan", - "lat": "50.86510", - "lon": "4.26488", - "id": 58170 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Baelen", - "names": { - "ru": "Бален", - "wa": "Bailou", - "fr": "Baelen" - }, - "lat": "50.63119", - "lon": "5.97150", - "id": 240115271, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Schmuck", - "lat": "50.63143", - "lon": "5.97678", - "id": 103467 - } - ], - "matchStreet": 1 - }, - { - "name": "Montignies-sur-Sambre", - "lat": "50.40068", - "lon": "4.48036", - "id": 2603284194, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Dutrieux", - "lat": "50.40027", - "lon": "4.48126", - "id": 123422 - }, - { - "name": "Rue Émile Tumelaire", - "lat": "50.40861", - "lon": "4.45315", - "id": 245342 - }, - { - "name": "Place Emile Vandevelde", - "lat": "50.41527", - "lon": "4.46157", - "id": 122634 - } - ], - "matchStreet": 1 - }, - { - "name": "Oupeye", - "names": { - "ru": "Упей", - "wa": "Oûpêye", - "fr": "Oupeye" - }, - "lat": "50.70919", - "lon": "5.64506", - "id": 1690252401, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vinck", - "lat": "50.70865", - "lon": "5.64131", - "id": 117951 - }, - { - "name": "Rue Emile Vandervelde (Vivegnis)", - "lat": "50.70251", - "lon": "5.64957", - "id": 117273 - }, - { - "name": "Rue Emile de Laveleye", - "lat": "50.70558", - "lon": "5.67530", - "id": 190178 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Seraing", - "names": { - "ru": "Серен", - "lt": "Serenas", - "wa": "Serè", - "fr": "Seraing" - }, - "lat": "50.59664", - "lon": "5.50833", - "id": 79443055, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Royer (Jemeppe-Sur-Meuse)", - "lat": "50.61251", - "lon": "5.49261", - "id": 53325 - }, - { - "name": "Rue Émile Zola", - "lat": "50.58117", - "lon": "5.50091", - "id": 34019 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Onhaye", - "names": { - "ru": "Оне", - "wa": "Onhaye", - "fr": "Onhaye" - }, - "lat": "50.24357", - "lon": "4.84087", - "id": 247722706, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Collard", - "lat": "50.23974", - "lon": "4.75824", - "id": 151309 - }, - { - "name": "Rue Emile Toussaint", - "lat": "50.25029", - "lon": "4.78133", - "id": 167850 - } - ], - "matchStreet": 1 - }, - { - "name": "Weerde", - "lat": "50.97228", - "lon": "4.47987", - "id": 270762994, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Verbruggestraat", - "lat": "50.97490", - "lon": "4.47656", - "id": 49036 - } - ], - "matchStreet": 1 - }, - { - "name": "La Louvière", - "names": { - "ru": "Ла-Лувьер" - }, - "lat": "50.47949", - "lon": "4.18528", - "id": 64850883, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Nève", - "lat": "50.47104", - "lon": "4.19873", - "id": 158756 - }, - { - "name": "Rue Emile Cambier", - "lat": "50.45727", - "lon": "4.19678", - "id": 159836 - }, - { - "name": "Rue Emile Tilmant", - "lat": "50.47594", - "lon": "4.21787", - "id": 158867 - }, - { - "name": "Rue Émile Urbain", - "lat": "50.46547", - "lon": "4.16828", - "id": 238032 - }, - { - "name": "Rue Emile Malbecq", - "lat": "50.47704", - "lon": "4.18886", - "id": 82488 - }, - { - "name": "Rue Emile Cornez (Trivières)", - "lat": "50.44985", - "lon": "4.14556", - "id": 159486 - }, - { - "name": "Rue Emile Latteur (Saint-Vaast)", - "lat": "50.45186", - "lon": "4.15521", - "id": 219057 - }, - { - "name": "rue Emile Verhaeren", - "lat": "50.47018", - "lon": "4.17577", - "id": 158681 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Braine-le-Comte", - "names": { - "ru": "Брен-ле-Конт", - "fr": "Braine-Le-Comte", - "nl": "'s-Gravenbrakel" - }, - "lat": "50.61235", - "lon": "4.14251", - "id": 476260354, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Émile Herman", - "lat": "50.60729", - "lon": "4.13861", - "id": 23680 - }, - { - "name": "Rue Emile Heuchon", - "lat": "50.60741", - "lon": "4.14037", - "id": 36681 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Fontenoy", - "lat": "50.56789", - "lon": "3.47337", - "id": 257106680, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde", - "lat": "50.56195", - "lon": "3.47696", - "id": 236155 - } - ], - "matchStreet": 1 - }, - { - "name": "Verviers", - "names": { - "ru": "Вервье", - "lt": "Vervjė", - "wa": "Vervî", - "fr": "Verviers" - }, - "lat": "50.59323", - "lon": "5.86385", - "id": 79451344, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Lelarge", - "lat": "50.58766", - "lon": "5.88348", - "id": 123640 - }, - { - "name": "Avenue Emile Jouret", - "lat": "50.59029", - "lon": "5.88942", - "id": 123665, - "intersectedStreets": [ - { - "name": "Rue de Julien Jardon", - "lat": "50.59029", - "lon": "5.88942" - }, - { - "name": "Avenue Fernand Desonay", - "lat": "50.59013", - "lon": "5.89043" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Faimes", - "names": { - "wa": "Faime", - "fr": "Faimes" - }, - "lat": "50.66525", - "lon": "5.26232", - "id": 734852986, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde (Borlez)", - "lat": "50.63138", - "lon": "5.24486", - "id": 149458 - } - ], - "matchStreet": 1 - }, - { - "name": "Antwerpen", - "enName": "Antwerp", - "names": { - "de": "Antwerpen", - "fi": "Antwerpen", - "ru": "Антверпен", - "pt": "Antuérpia", - "lt": "Antverpenas", - "hr": "Antwerpen", - "lv": "Antverpene", - "wa": "Anverse", - "fr": "Anvers", - "hy": "Անտվերպեն", - "ka": "ანტვერპენი", - "uk": "Антверпен", - "sk": "Antverpy", - "ca": "Anvers", - "sr": "Антверпен", - "kn": "ಆಂಟ್ವೆರ್ಪ್", - "el": "Αμβέρσα", - "it": "Anversa", - "es": "Amberes", - "zh": "安特卫普", - "cs": "Antverpy", - "ar": "أنتويرب", - "la": "Antverpia", - "ja": "アントワープ", - "nds": "Antwarp", - "pl": "Antwerpia", - "he": "אנטוורפן", - "nl": "Antwerpen" - }, - "lat": "51.22111", - "lon": "4.39970", - "id": 1765433658, - "type": "CITY", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan (Linkeroever)", - "lat": "51.22387", - "lon": "4.37848", - "id": 61594 - }, - { - "name": "Emile Dancolaan", - "lat": "51.21936", - "lon": "4.36685", - "id": 206033 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Heysel - Heizel", - "names": { - "fr": "Heysel", - "nl": "Heizel" - }, - "lat": "50.88888", - "lon": "4.34072", - "id": 1866455868, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Rue Emile Wauters - Emile Wautersstraat", - "lat": "50.88866", - "lon": "4.34254", - "id": 247336 - } - ], - "matchStreet": 1 - }, - { - "name": "Nethen", - "lat": "50.78382", - "lon": "4.67550", - "id": 293576951, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.78205", - "lon": "4.69024", - "id": 137436 - } - ], - "matchStreet": 1 - }, - { - "name": "Halluin", - "names": { - "nl": "Halewijn" - }, - "lat": "50.78319", - "lon": "3.12722", - "id": 26692038, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Zola", - "lat": "50.78361", - "lon": "3.12263", - "id": 121895 - }, - { - "name": "Cité Émile Verroye", - "lat": "50.78419", - "lon": "3.13293", - "id": 121914 - }, - { - "name": "rue Emile Bostoen", - "lat": "50.78495", - "lon": "3.13166", - "id": 247260 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Vieille-Maison", - "lat": "50.53932", - "lon": "4.61679", - "id": 642194961, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Rue Emile Pirson", - "lat": "50.53963", - "lon": "4.61565", - "id": 39356 - } - ], - "matchStreet": 1 - }, - { - "name": "Genappe", - "names": { - "ru": "Женап", - "fr": "Genappe", - "nl": "Genepiën" - }, - "lat": "50.61087", - "lon": "4.45107", - "id": 60115919, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Hecq", - "lat": "50.61219", - "lon": "4.46828", - "id": 30825 - }, - { - "name": "Rue Emile Boucqueau", - "lat": "50.61158", - "lon": "4.46599", - "id": 179591 - }, - { - "name": "Rue Emile François", - "lat": "50.64939", - "lon": "4.48094", - "id": 64147 - }, - { - "name": "Rue Émile Marcq", - "lat": "50.61772", - "lon": "4.44925", - "id": 87922 - }, - { - "name": "Rue Emile Vandevandel", - "lat": "50.61272", - "lon": "4.44888", - "id": 43911 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ath", - "names": { - "ru": "Ат", - "fr": "Ath", - "nl": "Aat" - }, - "lat": "50.63114", - "lon": "3.77696", - "id": 33372516, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Carlier (Irchonwelz)", - "lat": "50.61832", - "lon": "3.77217", - "id": 135237 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Corbais", - "names": { - "ru": "Корбе", - "wa": "Côrbåy" - }, - "lat": "50.64565", - "lon": "4.65552", - "id": 293578193, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Francqui", - "lat": "50.65690", - "lon": "4.62379", - "id": 12455, - "buildings": [] - }, - { - "name": "Rue Emile Francqui", - "lat": "50.65896", - "lon": "4.62312", - "id": 14520 - }, - { - "name": "Clos Émile Fabry", - "lat": "50.64845", - "lon": "4.66016", - "id": 81198, - "intersectedStreets": [ - { - "name": "Rue de la Dîme", - "lat": "50.64780", - "lon": "4.65837" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Grand-Hallet", - "lat": "50.69412", - "lon": "5.03406", - "id": 719039029, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Duchesne", - "lat": "50.69487", - "lon": "5.03067", - "id": 22848 - } - ], - "matchStreet": 1 - }, - { - "name": "Quaregnon", - "names": { - "pcd": "Cwargnon", - "ru": "Кареньон", - "fr": "Quaregnon" - }, - "lat": "50.44218", - "lon": "3.86369", - "id": 1144636557, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde (Les Six Chemins)", - "lat": "50.43075", - "lon": "3.86841", - "id": 167416 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Nivelles", - "names": { - "ru": "Нивель", - "fr": "Nivelles", - "nl": "Nijvel" - }, - "lat": "50.59769", - "lon": "4.32359", - "id": 60285677, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.59572", - "lon": "4.33134", - "id": 35277 - }, - { - "name": "Place Émile de Lalieux", - "lat": "50.59849", - "lon": "4.32797", - "id": 76307 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Honnelles", - "names": { - "pcd": "Onele", - "fr": "Honnelles" - }, - "lat": "50.35209", - "lon": "3.73102", - "id": 670209871, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Cornez", - "lat": "50.36936", - "lon": "3.69823", - "id": 172060 - }, - { - "name": "Rue Emile Delgrange", - "lat": "50.35636", - "lon": "3.77730", - "id": 164479 - } - ], - "matchStreet": 1 - }, - { - "name": "Colpach-Haut", - "names": { - "de": "Obercolpach", - "lb": "Uewerkolpech", - "fr": "Colpach-Haut" - }, - "lat": "49.76739", - "lon": "5.81979", - "id": 267038552, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Aline an Émile Mayrischstrooss", - "lat": "49.76605", - "lon": "5.82065", - "id": 23032 - } - ], - "matchStreet": 1 - }, - { - "name": "Huy", - "names": { - "ar": "هوي", - "ru": "Юи", - "bg": "Юи", - "uk": "Юї", - "ja": "ユイ", - "wa": "Hu", - "fa": "اویی", - "fr": "Huy", - "li": "Hoei", - "nl": "Hoei", - "zh": "于伊" - }, - "lat": "50.52154", - "lon": "5.23574", - "id": 60287767, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Cité Émile Vierset", - "lat": "50.52932", - "lon": "5.24544", - "id": 175075, - "intersectedStreets": [ - { - "name": "Rue des Vergiers", - "lat": "50.52850", - "lon": "5.24689" - } - ] - }, - { - "name": "Rue Emile Vandervelde (Gives)", - "lat": "50.50630", - "lon": "5.15381", - "id": 75650 - }, - { - "name": "Rue Emile Delperée", - "lat": "50.52569", - "lon": "5.24541", - "id": 47016 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gussignies", - "lat": "50.33709", - "lon": "3.74125", - "id": 315908694, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Sohier", - "lat": "50.33745", - "lon": "3.74218", - "id": 119435 - } - ], - "matchStreet": 1 - }, - { - "name": "Lodelinsart", - "lat": "50.43186", - "lon": "4.44895", - "id": 674001006, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde", - "lat": "50.42566", - "lon": "4.42751", - "id": 123273 - } - ], - "matchStreet": 1 - }, - { - "name": "Carlsbourg", - "names": { - "ru": "Карльсбур" - }, - "lat": "49.89476", - "lon": "5.08304", - "id": 416323675, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Gardez", - "lat": "49.89426", - "lon": "5.08167", - "id": 182691 - } - ], - "matchStreet": 1 - }, - { - "name": "Schaerbeek - Schaarbeek", - "names": { - "ru": "Схарбек", - "fr": "Schaerbeek", - "nl": "Schaarbeek" - }, - "lat": "50.86761", - "lon": "4.37372", - "id": 66169638, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Square Emile Duployé - Emile Duployésquare", - "names": { - "fr": "Square Emile Duployé", - "nl": "Emile Duployésquare" - }, - "lat": "50.85861", - "lon": "4.37925", - "id": 3201 - }, - { - "name": "Avenue Emile Zola - Emile Zolalaan", - "names": { - "fr": "Avenue Emile Zola", - "nl": "Emile Zolalaan" - }, - "lat": "50.87717", - "lon": "4.38000", - "id": 3385 - }, - { - "name": "Avenue Emile Verhaeren - Emile Verhaerenlaan", - "names": { - "fr": "Avenue Emile Verhaeren", - "nl": "Emile Verhaerenlaan" - }, - "lat": "50.87493", - "lon": "4.37827", - "id": 3443 - }, - { - "name": "Avenue Emile Max - Emile Maxlaan", - "names": { - "fr": "Avenue Emile Max", - "nl": "Emile Maxlaan" - }, - "lat": "50.85170", - "lon": "4.39951", - "id": 2675 - }, - { - "name": "Rue Emile Wittmann - Emile Wittmannstraat", - "names": { - "fr": "Rue Emile Wittmann", - "nl": "Emile Wittmannstraat" - }, - "lat": "50.85478", - "lon": "4.39033", - "id": 3039 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Lambusart", - "names": { - "ru": "Ламбюзар" - }, - "lat": "50.45729", - "lon": "4.55214", - "id": 359135665, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Hautem", - "lat": "50.46283", - "lon": "4.55437", - "id": 128219 - } - ], - "matchStreet": 1 - }, - { - "name": "Nieuwpoort", - "names": { - "ru": "Ньивпорт", - "fr": "Nieuport" - }, - "lat": "51.13039", - "lon": "2.75167", - "id": 1651552938, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan (Nieuwpoort-Bad)", - "lat": "51.14557", - "lon": "2.72343", - "id": 102070 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Houplines", - "lat": "50.69046", - "lon": "2.91041", - "id": 26694926, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Zola", - "lat": "50.69754", - "lon": "2.91324", - "id": 132629 - }, - { - "name": "Rue Émile Verhaeren", - "lat": "50.69593", - "lon": "2.91936", - "id": 132643 - } - ], - "matchStreet": 1 - }, - { - "name": "Trivières", - "names": { - "ru": "Тривьер" - }, - "lat": "50.45174", - "lon": "4.14760", - "id": 1678307480, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Cornez", - "lat": "50.44985", - "lon": "4.14556", - "id": 159487 - } - ], - "matchStreet": 1 - }, - { - "name": "Juprelle", - "names": { - "ru": "Жюпрель", - "wa": "Djouprele", - "fr": "Juprelle" - }, - "lat": "50.71069", - "lon": "5.52906", - "id": 305244882, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Grisard", - "lat": "50.72704", - "lon": "5.50870", - "id": 242688 - } - ], - "matchStreet": 1 - }, - { - "name": "Boussu", - "names": { - "pcd": "Boussu-dlé-Mont", - "ru": "Буссю", - "wa": "Boussu-dlé-Mont", - "fr": "Boussu" - }, - "lat": "50.43313", - "lon": "3.79610", - "id": 476259459, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Hornu)", - "lat": "50.42739", - "lon": "3.83114", - "id": 203654 - }, - { - "name": "Rue Emile Verhaeren (Boussu-Bois)", - "lat": "50.41341", - "lon": "3.79129", - "id": 121818 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Chaudfontaine", - "names": { - "ru": "Шофонтен", - "wa": "Tchôfontinne", - "fr": "Chaudfontaine" - }, - "lat": "50.58479", - "lon": "5.64697", - "id": 360038808, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde (Vaux-sous-Chèvremont)", - "lat": "50.59878", - "lon": "5.63187", - "id": 65468 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Beuzet", - "names": { - "ru": "Бовес", - "wa": "Beuzet", - "fr": "Beuzet", - "nl": "Beuzet" - }, - "lat": "50.53298", - "lon": "4.74815", - "id": 310104730, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Dewez (Ferooz)", - "lat": "50.54048", - "lon": "4.73045", - "id": 62989 - } - ], - "matchStreet": 1 - }, - { - "name": "Halle", - "names": { - "ru": "Халле", - "fr": "Hal", - "nl": "Halle" - }, - "lat": "50.73605", - "lon": "4.23744", - "id": 1677365023, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Dr. Emile Gallemaertstraat", - "lat": "50.74064", - "lon": "4.22903", - "id": 42042 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Serville", - "names": { - "wa": "Serveye" - }, - "lat": "50.25007", - "lon": "4.78066", - "id": 518834700, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Rue Emile Toussaint", - "lat": "50.25028", - "lon": "4.78133", - "id": 167851 - } - ], - "matchStreet": 1 - }, - { - "name": "Châtelet", - "names": { - "ru": "Шатле" - }, - "lat": "50.40461", - "lon": "4.52435", - "id": 64619244, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Hermant", - "lat": "50.38974", - "lon": "4.51598", - "id": 124065 - }, - { - "name": "Rue Saint-François - Rue Émile Vandervelde", - "names": { - "left": "Rue Émile Vandervelde", - "right": "Rue Saint-François" - }, - "lat": "50.43105", - "lon": "4.52036", - "id": 148295 - }, - { - "name": "Rue Émile Vandervelde (Bouffioulx)", - "lat": "50.39502", - "lon": "4.51879", - "id": 123784 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Queue-du-Bois", - "lat": "50.63715", - "lon": "5.67858", - "id": 746916917, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.63814", - "lon": "5.67654", - "id": 104874 - } - ], - "matchStreet": 1 - }, - { - "name": "Woluwe-Saint-Pierre - Sint-Pieters-Woluwe", - "names": { - "ru": "Волюве-Сен-Пьер", - "fr": "Woluwe-Saint-Pierre", - "nl": "Sint-Pieters-Woluwe" - }, - "lat": "50.82925", - "lon": "4.44330", - "id": 66508549, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Gabriel Emile Lebon - Gabriel Emile Lebonlaan", - "lat": "50.82654", - "lon": "4.40603", - "id": 14772 - }, - { - "name": "Avenue Emile Laine - Emile Lainelaan", - "names": { - "fr": "Avenue Emile Laine", - "nl": "Emile Lainelaan" - }, - "lat": "50.82515", - "lon": "4.42507", - "id": 36359 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Soumagne", - "names": { - "ru": "Сумань", - "wa": "Soûmagne", - "fr": "Soumagne" - }, - "lat": "50.61477", - "lon": "5.73995", - "id": 457067470, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Clos Emile Herman", - "lat": "50.65572", - "lon": "5.71647", - "id": 243685, - "intersectedStreets": [ - { - "name": "Rue Joly (Heuseux)", - "lat": "50.65545", - "lon": "5.71727" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Fontaine-l'Évêque", - "names": { - "ru": "Фонтен-л’Эвек" - }, - "lat": "50.41178", - "lon": "4.32462", - "id": 64804585, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Marcq", - "lat": "50.39729", - "lon": "4.33018", - "id": 173806 - }, - { - "name": "Rue Émile Vandervelde (Forchies-la-Marche)", - "lat": "50.43091", - "lon": "4.32445", - "id": 91952 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Beyne-Heusay", - "names": { - "ru": "Бен-Эзе", - "wa": "Binne-Heuzea", - "fr": "Beyne-Heusay" - }, - "lat": "50.62206", - "lon": "5.65341", - "id": 746916916, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Queue-du-Bois)", - "lat": "50.63814", - "lon": "5.67654", - "id": 104873 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Montigny-le-Tilleul", - "names": { - "ru": "Монтиньи-ле-Тийёль" - }, - "lat": "50.37916", - "lon": "4.37968", - "id": 1024116145, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde", - "lat": "50.38083", - "lon": "4.38329", - "id": 122642 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Hensies", - "names": { - "pcd": "Inzî", - "ru": "Анси", - "fr": "Hensies" - }, - "lat": "50.43284", - "lon": "3.68471", - "id": 481030226, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Thulin)", - "lat": "50.42997", - "lon": "3.74215", - "id": 176291 - } - ], - "matchStreet": 1 - }, - { - "name": "De Panne", - "names": { - "ru": "Де-Панне", - "fr": "La Panne", - "nl": "De Panne" - }, - "lat": "51.09883", - "lon": "2.59241", - "id": 79395891, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan", - "lat": "51.09528", - "lon": "2.56979", - "id": 162787 - } - ], - "matchStreet": 1 - }, - { - "name": "Bouffioulx", - "lat": "50.39021", - "lon": "4.51519", - "id": 673961151, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Hermant", - "lat": "50.38972", - "lon": "4.51598", - "id": 124066 - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Nicolas", - "names": { - "ru": "Сен-Никола", - "wa": "Sint-Nicolêye", - "fr": "Saint-Nicolas" - }, - "lat": "50.63053", - "lon": "5.53943", - "id": 469371619, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde (Montegnée)", - "lat": "50.63682", - "lon": "5.51670", - "id": 53314, - "intersectedStreets": [ - { - "name": "Rue François Cloes", - "lat": "50.63694", - "lon": "5.51702" - }, - { - "name": "Rue Xhavée (Montegnée)", - "lat": "50.63706", - "lon": "5.51681" - }, - { - "name": "Rue Chantraine (Montegnée)", - "lat": "50.63655", - "lon": "5.51642" - }, - { - "name": "Rue Fays (Montegnée)", - "lat": "50.63686", - "lon": "5.51705" - } - ] - }, - { - "name": "Rue Émile Jeanne", - "lat": "50.63388", - "lon": "5.51915", - "id": 33528 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ham-sur-Sambre", - "names": { - "wa": "Han-so-Sambe", - "nl": "Ham-sur-Sambre" - }, - "lat": "50.44449", - "lon": "4.67348", - "id": 688355304, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.44396", - "lon": "4.67666", - "id": 136393 - } - ], - "matchStreet": 1 - }, - { - "name": "Tamines", - "names": { - "ru": "Тамин", - "wa": "Tamène", - "nl": "Tamines" - }, - "lat": "50.43410", - "lon": "4.60758", - "id": 482112928, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Duculot", - "lat": "50.43542", - "lon": "4.60885", - "id": 245797 - } - ], - "matchStreet": 1 - }, - { - "name": "Mornimont", - "names": { - "wa": "Mornîmont", - "nl": "Mornimont" - }, - "lat": "50.45552", - "lon": "4.70434", - "id": 688355309, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrefour Emile Stasse", - "lat": "50.44918", - "lon": "4.70290", - "id": 173136, - "intersectedStreets": [ - { - "name": "Rue du Longwez", - "lat": "50.44920", - "lon": "4.70290" - } - ] - }, - { - "name": "Rue Emile Tréfois", - "lat": "50.45629", - "lon": "4.70507", - "id": 200222 - } - ], - "matchStreet": 1 - }, - { - "name": "Jemeppe-sur-Sambre", - "names": { - "ru": "Жемеп-сюр-Самбр", - "wa": "Djimepe-so-Sambe", - "fr": "Jemeppe-sur-Sambre", - "nl": "Jemeppe-sur-Sambre" - }, - "lat": "50.46564", - "lon": "4.66867", - "id": 688355308, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrefour Emile Stasse", - "lat": "50.44917", - "lon": "4.70288", - "id": 173135, - "intersectedStreets": [ - { - "name": "Rue du Longwez", - "lat": "50.44917", - "lon": "4.70288" - } - ] - }, - { - "name": "Rue Emile Vandervelde (Ham-sur-Sambre)", - "lat": "50.44395", - "lon": "4.67666", - "id": 136392 - }, - { - "name": "Rue Emile Matelart (Saint-Martin)", - "lat": "50.50458", - "lon": "4.65080", - "id": 66955 - }, - { - "name": "Rue Emile Tréfois", - "lat": "50.45627", - "lon": "4.70507", - "id": 200221 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Flémalle", - "names": { - "ru": "Флемаль", - "wa": "Flémåle", - "fr": "Flémalle" - }, - "lat": "50.60228", - "lon": "5.45808", - "id": 746110293, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Emile Zola", - "lat": "50.56853", - "lon": "5.45342", - "id": 49266, - "intersectedStreets": [ - { - "name": "Avenue du Gros Chêne", - "lat": "50.56829", - "lon": "5.45325" - }, - { - "name": "Rue Bois des Galants", - "lat": "50.56819", - "lon": "5.45377" - }, - { - "name": "Rue des Penseurs", - "lat": "50.56819", - "lon": "5.45377" - } - ] - }, - { - "name": "Rue Paul-Emile Janson", - "lat": "50.60171", - "lon": "5.47859", - "id": 33226 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.60092", - "lon": "5.47216", - "id": 49620 - }, - { - "name": "Place Emile Vinck", - "lat": "50.60218", - "lon": "5.44673", - "id": 49639, - "intersectedStreets": [ - { - "name": "Avenue de la Chapelle (Flémalle-Haute)", - "lat": "50.60160", - "lon": "5.44546" - }, - { - "name": "Chemin des Maisons", - "lat": "50.60160", - "lon": "5.44546" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Saint-Martin", - "names": { - "wa": "Sint-Mårtén", - "nl": "Saint-Martin" - }, - "lat": "50.50084", - "lon": "4.64726", - "id": 688355307, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Matelart", - "lat": "50.50192", - "lon": "4.64945", - "id": 232330 - } - ], - "matchStreet": 1 - }, - { - "name": "Paliseul", - "names": { - "wa": "Palijhoû", - "fr": "Paliseul" - }, - "lat": "49.90353", - "lon": "5.13491", - "id": 416323008, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Gardez", - "lat": "49.89144", - "lon": "5.08169", - "id": 182678 - } - ], - "matchStreet": 1 - }, - { - "name": "Flémalle-Haute", - "names": { - "ru": "Флемаль-От", - "wa": "Li Hôte Flémåle", - "fr": "Flémalle-Haute" - }, - "lat": "50.60184", - "lon": "5.44746", - "id": 309278555, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Vinck", - "lat": "50.60218", - "lon": "5.44673", - "id": 49640, - "intersectedStreets": [ - { - "name": "Avenue de la Chapelle", - "lat": "50.60160", - "lon": "5.44546" - }, - { - "name": "Chemin des Maisons", - "lat": "50.60160", - "lon": "5.44546" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Lincent", - "names": { - "ru": "Ленсан", - "wa": "Lîssin", - "fr": "Lincent", - "nl": "Lijsem" - }, - "lat": "50.71161", - "lon": "5.03182", - "id": 470229233, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Looze (Pellaines)", - "lat": "50.71582", - "lon": "4.99895", - "id": 225610 - } - ], - "matchStreet": 1 - }, - { - "name": "Waterloo", - "names": { - "ru": "Ватерлоо" - }, - "lat": "50.71736", - "lon": "4.39781", - "id": 130692807, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Émile Theys", - "lat": "50.71709", - "lon": "4.38814", - "id": 35338 - }, - { - "name": "Rue Émile Dury", - "lat": "50.70628", - "lon": "4.37805", - "id": 9738 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Bomal", - "lat": "50.66814", - "lon": "4.87353", - "id": 293436466, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Laurent", - "lat": "50.66652", - "lon": "4.87368", - "id": 232187, - "intersectedStreets": [ - { - "name": "Rue de Laloux", - "lat": "50.66685", - "lon": "4.87426" - }, - { - "name": "Rue de l'Abyme", - "lat": "50.66645", - "lon": "4.87342" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Liège", - "names": { - "de": "Lüttich", - "ru": "Льеж", - "ast": "Liex", - "bg": "Льеж", - "lt": "Lježas", - "lv": "Lježa", - "wa": "Lîdje", - "fr": "Liège", - "fy": "Luik", - "oc": "Lièja", - "uk": "Льєж", - "ca": "Lieja", - "sr": "Лијеж", - "kk": "Льеж", - "ko": "리에주", - "gl": "Liexa", - "mr": "लीज", - "pnb": "لیج", - "el": "Λιέγη", - "eo": "Lieĝo", - "it": "Liegi", - "es": "Lieja", - "zh": "列日", - "cs": "Lutych", - "eu": "Lieja", - "ar": "لييج", - "th": "ลีแยฌ", - "la": "Leodium", - "lb": "Léck", - "ja": "リエージュ", - "fa": "لیژ", - "nds": "Lüttich", - "vls": "Luuk", - "he": "לייז'", - "li": "Luuk", - "nl": "Luik" - }, - "lat": "50.64514", - "lon": "5.57342", - "id": 1689207163, - "type": "CITY", - "listOfStreets": [ - { - "name": "Rue Émile Gérard", - "lat": "50.64807", - "lon": "5.55378", - "id": 30816 - }, - { - "name": "Rue Émile Zola (Laveu)", - "lat": "50.63302", - "lon": "5.55286", - "id": 163988 - }, - { - "name": "Rue Emile Vandervelde - Rue Sainte-Marguerite", - "lat": "50.64814", - "lon": "5.54915", - "id": 242972 - }, - { - "name": "Place Emile Dupont", - "lat": "50.63685", - "lon": "5.57138", - "id": 209271, - "buildings": [], - "intersectedStreets": [ - { - "name": "Rue Eugène Ysaye", - "lat": "50.63632", - "lon": "5.56998" - }, - { - "name": "Rue Rouveroy", - "lat": "50.63666", - "lon": "5.57127" - }, - { - "name": "Rue du Vertbois", - "lat": "50.63745", - "lon": "5.57084" - } - ] - }, - { - "name": "Rue Émile Verhaeren", - "lat": "50.61385", - "lon": "5.58541", - "id": 72063 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.64809", - "lon": "5.55037", - "id": 217495 - }, - { - "name": "Boulevard Emile de Laveleye", - "lat": "50.61904", - "lon": "5.59133", - "id": 32322, - "buildings": [], - "intersectedStreets": [ - { - "name": "Quai des Ardennes", - "lat": "50.61897", - "lon": "5.59133" - }, - { - "name": "Avenue Reine Élisabeth", - "lat": "50.61971", - "lon": "5.59131" - }, - { - "name": "Rue Paul-Joseph Delcloche", - "lat": "50.61846", - "lon": "5.59303" - }, - { - "name": "Rue Stappers", - "lat": "50.62049", - "lon": "5.59120" - }, - { - "name": "Rue de Weltzar", - "lat": "50.62096", - "lon": "5.59110" - }, - { - "name": "Rue de Stavelot", - "lat": "50.62193", - "lon": "5.59058" - }, - { - "name": "Avenue du Luxembourg", - "lat": "50.62242", - "lon": "5.59026" - }, - { - "name": "Quai Mativa", - "lat": "50.62298", - "lon": "5.58108" - }, - { - "name": "Rue des Vennes", - "lat": "50.62388", - "lon": "5.58895" - }, - { - "name": "Rue Joseph Delboeuf", - "lat": "50.62398", - "lon": "5.58846" - }, - { - "name": "Rue de Londres", - "lat": "50.62439", - "lon": "5.58708" - }, - { - "name": "Rue Saint-Vincent (Vennes)", - "lat": "50.62441", - "lon": "5.58614" - }, - { - "name": "Rue de Paris (Vennes)", - "lat": "50.62441", - "lon": "5.58614" - }, - { - "name": "Avenue Albert Mahiels", - "lat": "50.62345", - "lon": "5.58376" - }, - { - "name": "Rue de Verviers (Vennes)", - "lat": "50.62355", - "lon": "5.58391" - }, - { - "name": "Rue de Spa (Vennes)", - "lat": "50.62343", - "lon": "5.58872" - }, - { - "name": "Rue de Fétinne", - "lat": "50.62371", - "lon": "5.58324" - } - ] - }, - { - "name": "Avenue Emile Jenissen", - "lat": "50.64056", - "lon": "5.54822", - "id": 33433, - "intersectedStreets": [ - { - "name": "Rue de Burenville", - "lat": "50.64085", - "lon": "5.54777" - }, - { - "name": "Avenue Olympe Gilbart", - "lat": "50.64056", - "lon": "5.54822" - } - ] - }, - { - "name": "Rue du Couvent - Rue Emile Vandervelde", - "lat": "50.64343", - "lon": "5.65472", - "id": 205563 - }, - { - "name": "Rue Émile Collard", - "lat": "50.62739", - "lon": "5.59498", - "id": 88893 - }, - { - "name": "Avenue Emile Digneffe", - "lat": "50.61993", - "lon": "5.57412", - "id": 188339, - "buildings": [], - "intersectedStreets": [ - { - "name": "Place du Général Leman", - "lat": "50.61993", - "lon": "5.57412" - }, - { - "name": "Rue Ernest Solvay", - "lat": "50.61982", - "lon": "5.57423" - }, - { - "name": "Quai de Rome", - "lat": "50.62054", - "lon": "5.57754" - }, - { - "name": "Rue de Fétinne", - "lat": "50.62054", - "lon": "5.57754" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Grand-Manil", - "names": { - "wa": "Grand-Mayni-dlé-Djiblou", - "nl": "Grand-Manil" - }, - "lat": "50.55692", - "lon": "4.68303", - "id": 301317281, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Somville", - "lat": "50.55672", - "lon": "4.67608", - "id": 66935 - } - ], - "matchStreet": 1 - }, - { - "name": "Limbourg", - "names": { - "de": "Limburg an der Weser", - "uk": "Лімбур", - "wa": "Limbôr", - "it": "Limburgo", - "fr": "Limbourg", - "nl": "Limburg" - }, - "lat": "50.61228", - "lon": "5.94030", - "id": 1690226019, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Colette", - "lat": "50.62151", - "lon": "5.93918", - "id": 104509 - } - ], - "matchStreet": 1 - }, - { - "name": "Seilles", - "names": { - "ru": "Сей", - "wa": "Seye", - "nl": "Seilles" - }, - "lat": "50.49842", - "lon": "5.08055", - "id": 689778689, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Godfrind", - "lat": "50.49403", - "lon": "5.08547", - "id": 238169 - } - ], - "matchStreet": 1 - }, - { - "name": "Leuven", - "enName": "Leuven", - "names": { - "de": "Löwen", - "ru": "Лёвен", - "pt": "Lovaina", - "bg": "Льовен", - "el": "Λέουβεν", - "lt": "Leuvenas", - "it": "Lovanio", - "fr": "Louvain", - "es": "Lovaina", - "zh": "鲁汶", - "cs": "Lovaň", - "eu": "Lovaina", - "ar": "لوفان", - "la": "Lovanium", - "lb": "Léiwen", - "ja": "ルーヴェン", - "sk": "Leuven", - "sr-latn": "Luven", - "he": "לוון", - "ro": "Louvain", - "ca": "Lovaina", - "nl": "Leuven", - "sr": "Левен" - }, - "lat": "50.87920", - "lon": "4.70116", - "id": 1448497912, - "type": "CITY", - "listOfStreets": [ - { - "name": "Emile Mathieustraat", - "lat": "50.86931", - "lon": "4.70114", - "id": 26638, - "buildings": [], - "intersectedStreets": [ - { - "name": "Constantin Meunierstraat (Nieuw Kwartier)", - "lat": "50.86930", - "lon": "4.70097" - }, - { - "name": "De Bayostraat", - "lat": "50.86949", - "lon": "4.70271" - }, - { - "name": "Gerard Vander Lindenstraat", - "lat": "50.86949", - "lon": "4.70271" - }, - { - "name": "J.P. Verhaghenstraat", - "lat": "50.86949", - "lon": "4.70271" - } - ] - }, - { - "name": "Emile Van Arenberghstraat", - "lat": "50.87090", - "lon": "4.70071", - "id": 26647, - "buildings": [], - "intersectedStreets": [ - { - "name": "Hendrik Consciencestraat (Nieuw Kwartier)", - "names": { - "etymology:wikidata": "Q378133 (Nieuw Kwartier)" - }, - "lat": "50.87152", - "lon": "4.70037" - }, - { - "name": "Albert Giraudstraat", - "lat": "50.87090", - "lon": "4.70071" - }, - { - "name": "Constantin Meunierstraat (Nieuw Kwartier)", - "lat": "50.87019", - "lon": "4.70172" - }, - { - "name": "J.P. Verhaghenstraat", - "lat": "50.87019", - "lon": "4.70172" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Frasnes-lez-Buissenal", - "lat": "50.66776", - "lon": "3.61944", - "id": 61961943, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Résidence Émile Lesaffre", - "lat": "50.67330", - "lon": "3.61506", - "id": 104698 - } - ], - "matchStreet": 1 - }, - { - "name": "Vedrin", - "names": { - "ru": "Ведрен", - "wa": "Vedrén", - "fr": "Vedrin" - }, - "lat": "50.50196", - "lon": "4.87424", - "id": 348113363, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Marnach", - "lat": "50.50648", - "lon": "4.86759", - "id": 76931 - } - ], - "matchStreet": 1 - }, - { - "name": "Francorchamps", - "names": { - "ru": "Франкоршан" - }, - "lat": "50.45316", - "lon": "5.95283", - "id": 258600476, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Jamar", - "lat": "50.45480", - "lon": "5.95144", - "id": 222864, - "buildings": [] - }, - { - "name": "Rue Emile Goedert", - "lat": "50.45446", - "lon": "5.95199", - "id": 43728 - } - ], - "matchStreet": 1 - }, - { - "name": "Ways", - "lat": "50.61002", - "lon": "4.46247", - "id": 293583883, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Hecq", - "lat": "50.61221", - "lon": "4.46828", - "id": 30826 - }, - { - "name": "Rue Emile Boucqueau", - "lat": "50.61159", - "lon": "4.46599", - "id": 179592 - }, - { - "name": "Rue Emile François", - "lat": "50.64939", - "lon": "4.48094", - "id": 64148 - }, - { - "name": "Rue Émile Marcq", - "lat": "50.61772", - "lon": "4.44925", - "id": 87923 - } - ], - "matchStreet": 1 - }, - { - "name": "Villers-le-Bouillet", - "names": { - "wa": "Viyé-l'Boulet", - "fr": "Villers-le-Bouillet" - }, - "lat": "50.57503", - "lon": "5.26191", - "id": 734877303, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Docteur Emile Neuville", - "lat": "50.60963", - "lon": "5.24078", - "id": 133166 - } - ], - "matchStreet": 1 - }, - { - "name": "Calonne", - "lat": "50.57832", - "lon": "3.43718", - "id": 668024429, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Royer", - "lat": "50.57686", - "lon": "3.43383", - "id": 81707 - } - ], - "matchStreet": 1 - }, - { - "name": "Aulne", - "lat": "50.36670", - "lon": "4.33252", - "id": 4217285089, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde", - "lat": "50.36683", - "lon": "4.33241", - "id": 13744 - } - ], - "matchStreet": 1 - }, - { - "name": "Woluwe-Saint-Lambert - Sint-Lambrechts-Woluwe", - "names": { - "ru": "Синт-Ламрехтс-Волюве", - "fr": "Woluwe-Saint-Lambert", - "nl": "Sint-Lambrechts-Woluwe" - }, - "lat": "50.84669", - "lon": "4.42848", - "id": 66503288, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Émile Vandervelde - Émile Vanderveldelaan", - "names": { - "fr": "Avenue Émile Vandervelde", - "nl": "Émile Vanderveldelaan" - }, - "lat": "50.84691", - "lon": "4.44088", - "id": 3453 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Colfontaine", - "names": { - "pcd": "Colfontinne", - "ru": "Кольфонтен", - "fr": "Colfontaine" - }, - "lat": "50.40567", - "lon": "3.85139", - "id": 476285157, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Émile Zola", - "lat": "50.41749", - "lon": "3.85938", - "id": 165465 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Mont-Saint-Guibert", - "names": { - "wa": "Mont-Sint-Gubiet", - "fr": "Mont-Saint-Guibert" - }, - "lat": "50.63656", - "lon": "4.61269", - "id": 1684787428, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Francqui", - "lat": "50.65690", - "lon": "4.62376", - "id": 12456, - "buildings": [] - }, - { - "name": "Rue Emile Francqui (Corbais)", - "lat": "50.65896", - "lon": "4.62310", - "id": 14521 - }, - { - "name": "Clos Émile Fabry", - "lat": "50.64845", - "lon": "4.66013", - "id": 81199, - "intersectedStreets": [ - { - "name": "Rue de la Dîme (Corbais)", - "lat": "50.64780", - "lon": "4.65835" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Liers", - "lat": "50.69338", - "lon": "5.56376", - "id": 746914256, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Lerousseau", - "lat": "50.69402", - "lon": "5.56762", - "id": 226389 - } - ], - "matchStreet": 1 - }, - { - "name": "Braine-le-Château", - "names": { - "ru": "Брен-ле-Шато", - "fr": "Braine-le-Château", - "nl": "Kasteelbrakel" - }, - "lat": "50.68279", - "lon": "4.26699", - "id": 253363794, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Schampaert (Wauthier-Braine)", - "lat": "50.68467", - "lon": "4.29962", - "id": 43679 - }, - { - "name": "Rue Emile Vandervelde (Wauthier-Braine)", - "lat": "50.68732", - "lon": "4.30550", - "id": 43682 - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Servais", - "names": { - "wa": "Sint-Serwai", - "fr": "Saint-Servais" - }, - "lat": "50.47787", - "lon": "4.84525", - "id": 685354387, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Melchior", - "lat": "50.47283", - "lon": "4.83909", - "id": 82158 - } - ], - "matchStreet": 1 - }, - { - "name": "Bernissart", - "names": { - "ru": "Бернисар" - }, - "lat": "50.47550", - "lon": "3.65047", - "id": 476258543, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Cité Emile Carlier", - "lat": "50.48119", - "lon": "3.65941", - "id": 165947 - }, - { - "name": "Rue Emile Carlier (Blaton)", - "lat": "50.49776", - "lon": "3.66885", - "id": 14487 - }, - { - "name": "Place Emile Vandervelde (Harchies)", - "lat": "50.47653", - "lon": "3.68988", - "id": 99894 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sint-Denijs-Westrem", - "names": { - "ru": "Синт-Денейс-Вестрем" - }, - "lat": "51.01994", - "lon": "3.66767", - "id": 2428597649, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Andelhofstraat", - "lat": "51.02353", - "lon": "3.67094", - "id": 107334 - } - ], - "matchStreet": 1 - }, - { - "name": "Watermael-Boitsfort - Watermaal-Bosvoorde", - "names": { - "ru": "Ватермаль-Буафор", - "fr": "Watermael-Boitsfort", - "nl": "Watermaal-Bosvoorde" - }, - "lat": "50.79939", - "lon": "4.41582", - "id": 66501221, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Emile Van Becelaere - Emile Van Becelaerelaan", - "names": { - "fr": "Avenue Emile Van Becelaere", - "nl": "Emile Van Becelaerelaan" - }, - "lat": "50.79995", - "lon": "4.40575", - "id": 14039 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Frameries", - "names": { - "ru": "Фрамри" - }, - "lat": "50.40876", - "lon": "3.89055", - "id": 480959936, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Verhaeren (Cité Louis Piérard)", - "lat": "50.39666", - "lon": "3.90251", - "id": 170289 - }, - { - "name": "Rue Émile Vandervelde", - "lat": "50.40457", - "lon": "3.89570", - "id": 170295 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ixelles - Elsene", - "names": { - "ru": "Иксель", - "fr": "Ixelles", - "nl": "Elsene" - }, - "lat": "50.82229", - "lon": "4.38157", - "id": 66498145, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Emile Duray - Emile Duraylaan", - "names": { - "fr": "Avenue Émile Duray", - "nl": "Émile Duraylaan" - }, - "lat": "50.81661", - "lon": "4.37644", - "id": 216093 - }, - { - "name": "Rue Émile Banning - Émile Banningstraat", - "names": { - "fr": "Rue Émile Banning", - "nl": "Émile Banningstraat" - }, - "lat": "50.81856", - "lon": "4.38204", - "id": 4408 - }, - { - "name": "Rue Paul Émile Janson - Paul Émile Jansonstraat", - "names": { - "fr": "Rue Paul Émile Janson", - "nl": "Paul Émile Jansonstraat" - }, - "lat": "50.82715", - "lon": "4.35960", - "id": 14656 - }, - { - "name": "Avenue Émile De Mot - Émile De Motlaan", - "names": { - "fr": "Avenue Émile De Mot", - "nl": "Émile De Motlaan" - }, - "lat": "50.81842", - "lon": "4.37434", - "id": 14662 - }, - { - "name": "Avenue Émile de Beco - Émile de Becolaan", - "names": { - "fr": "Avenue Émile de Beco", - "nl": "Émile de Becolaan" - }, - "lat": "50.82363", - "lon": "4.38043", - "id": 4429 - }, - { - "name": "Rue Èmile Bouilliot - Èmile Bouilliotstraat", - "names": { - "fr": "Rue Émile Bouilliot", - "nl": "Émile Bouilliotstraat" - }, - "lat": "50.81831", - "lon": "4.35483", - "id": 247324 - }, - { - "name": "Rue Émile Claus - Émile Clausstraat", - "names": { - "fr": "Rue Émile Claus", - "nl": "Émile Clausstraat" - }, - "lat": "50.81633", - "lon": "4.37001", - "id": 13970 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sambreville", - "names": { - "ru": "Самбрвиль" - }, - "lat": "50.44098", - "lon": "4.61967", - "id": 482112931, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Duculot", - "lat": "50.43541", - "lon": "4.60887", - "id": 245796 - }, - { - "name": "Rue Émile Vandervelde (Moignelée)", - "lat": "50.44242", - "lon": "4.58203", - "id": 136359 - }, - { - "name": "Rue Émile Zola (Keumiée)", - "lat": "50.46324", - "lon": "4.59050", - "id": 129957 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Vottem", - "names": { - "ru": "Воттем" - }, - "lat": "50.67265", - "lon": "5.58462", - "id": 746914268, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde", - "lat": "50.67292", - "lon": "5.58367", - "id": 202077, - "intersectedStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.67294", - "lon": "5.58367" - } - ] - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.67347", - "lon": "5.58311", - "id": 32523 - } - ], - "matchStreet": 1 - }, - { - "name": "Zaventem", - "names": { - "ru": "Завентем" - }, - "lat": "50.88044", - "lon": "4.47455", - "id": 60166648, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile De Muncklaan", - "lat": "50.87625", - "lon": "4.48416", - "id": 67248 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sint-Amands", - "names": { - "ru": "Синт-Амандс", - "fr": "Saint-Amand" - }, - "lat": "51.05571", - "lon": "4.20182", - "id": 73769421, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verhaerenstraat", - "names": { - "old_name": "Palingstraat", - "etymology:wikidata": "Q193680" - }, - "lat": "51.05816", - "lon": "4.20229", - "id": 15140 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Orp-le-Grand", - "names": { - "fr": "Orp-le-Grand" - }, - "lat": "50.70348", - "lon": "4.99129", - "id": 293416149, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Avenue Emile Vandervelde", - "lat": "50.70560", - "lon": "4.99155", - "id": 205965, - "intersectedStreets": [ - { - "name": "Place du 11e Dragons Français", - "lat": "50.70381", - "lon": "4.99071" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Wihogne", - "lat": "50.72774", - "lon": "5.50640", - "id": 305240961, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Grisard", - "lat": "50.72704", - "lon": "5.50870", - "id": 242689 - } - ], - "matchStreet": 1 - }, - { - "name": "Anderlecht", - "names": { - "ru": "Андерлехт", - "uk": "Андерлехт", - "wa": "Anderlek", - "fr": "Anderlecht", - "li": "Anderlech", - "nl": "Anderlecht" - }, - "lat": "50.83814", - "lon": "4.31235", - "id": 66163274, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Hellebaut - Emile Hellebautstraat", - "names": { - "fr": "Rue Emile Hellebaut", - "nl": "Emile Hellebautstraat" - }, - "lat": "50.84036", - "lon": "4.29834", - "id": 6114 - }, - { - "name": "Square Emile Vandervelde - Emile Vanderveldesquare", - "names": { - "language": "fr - nl", - "fr": "Square Emile Vandervelde", - "nl": "Emile Vanderveldesquare" - }, - "lat": "50.83665", - "lon": "4.31763", - "id": 233781 - }, - { - "name": "Square Émile Vandder Bruggen - Emile Vander Bruggensquare", - "names": { - "fr": "Square Émile Vandder Bruggen", - "nl": "Emile Vander Bruggensquare" - }, - "lat": "50.83875", - "lon": "4.31291", - "id": 31149 - }, - { - "name": "Avenue Émile Gryson - Emile Grysonlaan", - "names": { - "fr": "Avenue Émile Gryson", - "nl": "Emile Grysonlaan" - }, - "lat": "50.81513", - "lon": "4.29417", - "id": 96046 - }, - { - "name": "Rue Emile Versé - Emile Verséstraat", - "names": { - "fr": "Rue Emile Versé", - "nl": "Emile Verséstraat" - }, - "lat": "50.83474", - "lon": "4.29713", - "id": 4959 - }, - { - "name": "Rue Émile Carpentier - Emile Carpentierstraat", - "names": { - "fr": "Rue Émile Carpentier", - "nl": "Emile Carpentierstraat" - }, - "lat": "50.83736", - "lon": "4.31909", - "id": 35758 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Geer", - "names": { - "ru": "Жер" - }, - "lat": "50.66849", - "lon": "5.17106", - "id": 351518028, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Lejeune", - "lat": "50.66932", - "lon": "5.17327", - "id": 229594 - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Georges-sur-Meuse", - "names": { - "wa": "Sint-Djôr-so-Mouze", - "fr": "Saint-Georges-sur-Meuse" - }, - "lat": "50.60007", - "lon": "5.35789", - "id": 258889426, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Delcour", - "lat": "50.59882", - "lon": "5.37440", - "id": 30543 - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Sauveur", - "lat": "50.70618", - "lon": "3.59774", - "id": 672610712, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Deltenre", - "lat": "50.70835", - "lon": "3.59772", - "id": 66048 - } - ], - "matchStreet": 1 - }, - { - "name": "Gerpinnes", - "names": { - "ru": "Жерпинн" - }, - "lat": "50.33782", - "lon": "4.52768", - "id": 331350597, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Genard", - "lat": "50.33990", - "lon": "4.53188", - "id": 145060 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Cité de Saint-Vaast", - "lat": "50.46528", - "lon": "4.16659", - "id": 4543339338, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Rue Émile Urbain", - "lat": "50.46545", - "lon": "4.16828", - "id": 238033 - } - ], - "matchStreet": 1 - }, - { - "name": "Gives", - "lat": "50.50750", - "lon": "5.15452", - "id": 317234977, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.50630", - "lon": "5.15383", - "id": 75651 - } - ], - "matchStreet": 1 - }, - { - "name": "Overijse", - "names": { - "ru": "Оверейсе" - }, - "lat": "50.77292", - "lon": "4.53851", - "id": 362632215, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Carelsstraat", - "lat": "50.77114", - "lon": "4.54023", - "id": 98877, - "buildings": [], - "intersectedStreets": [ - { - "name": "Terhulpensesteenweg", - "lat": "50.77128", - "lon": "4.54107" - }, - { - "name": "Jan-Baptist Dekeyserstraat", - "lat": "50.77109", - "lon": "4.53997" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gozée", - "names": { - "ru": "Гозе" - }, - "lat": "50.33323", - "lon": "4.35155", - "id": 671657349, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde (Aulne)", - "lat": "50.36585", - "lon": "4.33003", - "id": 24229 - } - ], - "matchStreet": 1 - }, - { - "name": "Groot-Bijgaarden", - "names": { - "fr": "Grand-Bigard" - }, - "lat": "50.87071", - "lon": "4.26514", - "id": 251470642, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile de Blutslaan", - "lat": "50.86510", - "lon": "4.26488", - "id": 58171 - } - ], - "matchStreet": 1 - }, - { - "name": "Roux", - "lat": "50.44278", - "lon": "4.39485", - "id": 335460915, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Saint Emile", - "lat": "50.42680", - "lon": "4.40307", - "id": 222517 - }, - { - "name": "Rue Émile Vandervelde", - "lat": "50.43981", - "lon": "4.37539", - "id": 149938 - } - ], - "matchStreet": 1 - }, - { - "name": "Waremme", - "names": { - "ru": "Варем", - "wa": "Wareme", - "fr": "Waremme", - "nl": "Borgworm" - }, - "lat": "50.69769", - "lon": "5.25462", - "id": 79454553, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Emile Vandervelde", - "lat": "50.69662", - "lon": "5.25754", - "id": 69790, - "intersectedStreets": [ - { - "name": "Avenue Guillaume Joachim", - "lat": "50.69662", - "lon": "5.25754" - }, - { - "name": "Rue Ernest Malvoz", - "lat": "50.69566", - "lon": "5.25889" - }, - { - "name": "Rue du Tram", - "lat": "50.69540", - "lon": "5.25953" - }, - { - "name": "Chemin des Hirondelles", - "lat": "50.69540", - "lon": "5.25953" - }, - { - "name": "Rue du Fond d'Or", - "lat": "50.69389", - "lon": "5.26340" - } - ] - }, - { - "name": "Rue Emile Marchoul", - "lat": "50.67932", - "lon": "5.23426", - "id": 142039 - }, - { - "name": "Rue Emile Hallet", - "lat": "50.69644", - "lon": "5.25142", - "id": 151281 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Niel", - "names": { - "ru": "Нил" - }, - "lat": "51.10987", - "lon": "4.33033", - "id": 262508108, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Vanderveldelaan", - "lat": "51.10700", - "lon": "4.32760", - "id": 204779 - }, - { - "name": "Emile Vinckstraat", - "lat": "51.11018", - "lon": "4.33492", - "id": 61081 - } - ], - "matchStreet": 1 - }, - { - "name": "Koekelberg", - "names": { - "ar": "كوكلبرغ", - "ru": "Кукельберг" - }, - "lat": "50.86226", - "lon": "4.32572", - "id": 66192903, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Sergijsels - Emile Sergijselsstraat", - "names": { - "fr": "Rue Emile Sergijsels", - "nl": "Emile Sergijselsstraat" - }, - "lat": "50.86073", - "lon": "4.33230", - "id": 4708 - }, - { - "name": "Avenue Émile Bossaert - Émile Bossaertlaan", - "names": { - "fr": "Avenue Émile Bossaert", - "nl": "Émile Bossaertlaan" - }, - "lat": "50.86502", - "lon": "4.31844", - "id": 4752 - }, - { - "name": "Rue Emile Deroover - Emile Derooverstraat", - "names": { - "fr": "Rue Emile Deroover", - "nl": "Emile Derooverstraat" - }, - "lat": "50.86513", - "lon": "4.31518", - "id": 4771 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Marchin", - "names": { - "ru": "Маршен", - "wa": "Mårcin", - "fr": "Marchin" - }, - "lat": "50.48020", - "lon": "5.22634", - "id": 1884725616, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.47648", - "lon": "5.21368", - "id": 122172 - } - ], - "matchStreet": 1 - }, - { - "name": "Ottignies-Louvain-la-Neuve", - "names": { - "ru": "Оттиньи-Лувен-ла-Нёв" - }, - "lat": "50.66542", - "lon": "4.56742", - "id": 292453525, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Goes (Louvain-la-Neuve)", - "lat": "50.66461", - "lon": "4.61765", - "id": 94547 - }, - { - "name": "Avenue Émile Verhaeren (Louvain-la-Neuve)", - "lat": "50.66147", - "lon": "4.60889", - "id": 94577, - "intersectedStreets": [ - { - "name": "Avenue des Arts (Louvain-la-Neuve)", - "lat": "50.66256", - "lon": "4.60750" - }, - { - "name": "Rue Victor Horta (Louvain-la-Neuve)", - "lat": "50.66256", - "lon": "4.60750" - }, - { - "name": "Rue Achille Chavée (Louvain-la-Neuve)", - "lat": "50.66187", - "lon": "4.60840" - }, - { - "name": "Rue Marie Gevers (Louvain-la-Neuve)", - "lat": "50.66187", - "lon": "4.60840" - }, - { - "name": "Rue Albert Mockel (Louvain-la-Neuve)", - "lat": "50.66140", - "lon": "4.60900" - }, - { - "name": "Parvis de la Cantilène (Louvain-la-Neuve)", - "lat": "50.66160", - "lon": "4.61001" - } - ] - }, - { - "name": "Rue Émile Mathéi", - "lat": "50.68482", - "lon": "4.56971", - "id": 64255 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gosselies", - "names": { - "ru": "Госли", - "ro": "cazare" - }, - "lat": "50.46539", - "lon": "4.43017", - "id": 335461892, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Émile Bertaux", - "lat": "50.46686", - "lon": "4.43161", - "id": 208149 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Pepinster", - "names": { - "wa": "Pepinster", - "fr": "Pepinster" - }, - "lat": "50.56752", - "lon": "5.80370", - "id": 534717923, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Wegnez)", - "lat": "50.57757", - "lon": "5.82593", - "id": 74909 - }, - { - "name": "Rue Émile Fairon", - "lat": "50.56534", - "lon": "5.80997", - "id": 117609 - } - ], - "matchStreet": 1 - }, - { - "name": "Berloz", - "names": { - "wa": "Bierlô", - "fr": "Berloz" - }, - "lat": "50.69774", - "lon": "5.21462", - "id": 734838286, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Muselle", - "lat": "50.70177", - "lon": "5.21074", - "id": 151433 - } - ], - "matchStreet": 1 - }, - { - "name": "Herstal", - "names": { - "ru": "Эрсталь", - "wa": "Hèsta", - "fr": "Herstal" - }, - "lat": "50.67019", - "lon": "5.64039", - "id": 1933469358, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde (Vottem)", - "lat": "50.67292", - "lon": "5.58369", - "id": 202076, - "intersectedStreets": [ - { - "name": "Rue Emile Vandervelde (Vottem)", - "lat": "50.67294", - "lon": "5.58369" - } - ] - }, - { - "name": "Rue Emile Tilman", - "lat": "50.66988", - "lon": "5.63575", - "id": 136537 - }, - { - "name": "Rue Emile Muraille", - "lat": "50.67570", - "lon": "5.61944", - "id": 19991 - }, - { - "name": "Rue Emile Vinck", - "lat": "50.67687", - "lon": "5.61777", - "id": 117284 - }, - { - "name": "Rue Émile Lerousseau (Liers)", - "lat": "50.69761", - "lon": "5.56833", - "id": 32506 - }, - { - "name": "Rue Emile Vandervelde (Vottem)", - "lat": "50.67348", - "lon": "5.58314", - "id": 32522 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Fléron", - "names": { - "ru": "Флерон", - "wa": "Fléron", - "fr": "Fléron" - }, - "lat": "50.61684", - "lon": "5.68321", - "id": 358184078, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandevelde", - "lat": "50.61052", - "lon": "5.66495", - "id": 64913 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Oostende", - "enName": "Ostend", - "names": { - "de": "Ostende", - "ru": "Остенде", - "uk": "Остенде", - "lt": "Ostendė", - "it": "Ostenda", - "fr": "Ostende", - "pl": "Ostenda", - "vls": "Ostende", - "he": "אוסטנדה", - "es": "Ostende", - "nl": "Oostende" - }, - "lat": "51.23032", - "lon": "2.92032", - "id": 1651555409, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Roosestraat", - "lat": "51.20905", - "lon": "2.89129", - "id": 25720 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Knokke", - "names": { - "ru": "Кнокке", - "fr": "Knocke", - "vls": "Knokke-Heist" - }, - "lat": "51.34645", - "lon": "3.28764", - "id": 1395162377, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan (Het Zoute)", - "lat": "51.35296", - "lon": "3.30388", - "id": 162982 - }, - { - "name": "Emile Raespad", - "lat": "51.33845", - "lon": "3.28395", - "id": 222497 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Borlez", - "lat": "50.63298", - "lon": "5.24507", - "id": 734856622, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde", - "lat": "50.63138", - "lon": "5.24486", - "id": 149459 - } - ], - "matchStreet": 1 - }, - { - "name": "Antoing", - "names": { - "ru": "Антуан" - }, - "lat": "50.56591", - "lon": "3.45132", - "id": 1766146864, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde (Fontenoy)", - "lat": "50.56195", - "lon": "3.47696", - "id": 236156 - }, - { - "name": "Rue Emile Royer (Calonne)", - "lat": "50.57686", - "lon": "3.43383", - "id": 81708 - } - ], - "matchStreet": 1 - }, - { - "name": "Les Bons Villers", - "names": { - "ru": "Ле-Бон-Виллер" - }, - "lat": "50.52264", - "lon": "4.47635", - "id": 138133013, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Gossiaux (Villers-Perwin)", - "lat": "50.52373", - "lon": "4.47738", - "id": 182271 - }, - { - "name": "Avenue Emile Stassart", - "lat": "50.50304", - "lon": "4.46519", - "id": 40547 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Jumet", - "lat": "50.44213", - "lon": "4.43502", - "id": 2603357469, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Ruiters", - "lat": "50.45205", - "lon": "4.41494", - "id": 160226 - }, - { - "name": "Rue Émile Strimelle", - "lat": "50.43507", - "lon": "4.42573", - "id": 160335 - } - ], - "matchStreet": 1 - }, - { - "name": "Mellet", - "names": { - "ru": "Мелле" - }, - "lat": "50.50412", - "lon": "4.47626", - "id": 138138122, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Avenue Emile Stassart", - "lat": "50.50303", - "lon": "4.46519", - "id": 40548 - } - ], - "matchStreet": 1 - }, - { - "name": "Villers-Perwin", - "lat": "50.52620", - "lon": "4.47839", - "id": 138133008, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Gossiaux (Les Bons Villers)", - "lat": "50.52373", - "lon": "4.47740", - "id": 182272 - } - ], - "matchStreet": 1 - }, - { - "name": "Namur", - "enName": "Namur", - "names": { - "de": "Namur", - "ru": "Намюр", - "lt": "Namiūras", - "eo": "Namuro", - "wa": "Nameur", - "it": "Namur", - "fr": "Namur", - "es": "Namur", - "zh": "那慕爾", - "ar": "نامور", - "la": "Namurcum", - "lb": "Namouer", - "uk": "Намюр", - "nl": "Namen", - "sr": "Намир" - }, - "lat": "50.46653", - "lon": "4.86619", - "id": 1765500676, - "type": "CITY", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Flawinne)", - "lat": "50.45842", - "lon": "4.80437", - "id": 157799 - }, - { - "name": "Rue Emile Marnach", - "lat": "50.50648", - "lon": "4.86759", - "id": 76930 - }, - { - "name": "Rue Emile Dessenius", - "lat": "50.46167", - "lon": "4.81248", - "id": 72888 - }, - { - "name": "Rue Emile Melchior", - "lat": "50.47283", - "lon": "4.83909", - "id": 82157 - }, - { - "name": "Rue Emile Mazy (Flawinne)", - "lat": "50.45895", - "lon": "4.79390", - "id": 147807 - }, - { - "name": "Rue Émile Cuvelier", - "names": { - "etymology:wikidata": "Q2997972" - }, - "lat": "50.46492", - "lon": "4.86514", - "id": 10017 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Wattrelos", - "lat": "50.70086", - "lon": "3.22226", - "id": 26692462, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Allée Emile Verhaeren", - "lat": "50.70615", - "lon": "3.24101", - "id": 226514 - }, - { - "name": "Rangée Émile Brelle", - "lat": "50.71548", - "lon": "3.20790", - "id": 137707 - }, - { - "name": "Rue Émile Basly", - "lat": "50.70266", - "lon": "3.21674", - "id": 112449 - }, - { - "name": "Rue Émile Zola", - "lat": "50.71085", - "lon": "3.19385", - "id": 203632 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Estinnes", - "lat": "50.39767", - "lon": "4.09758", - "id": 477197902, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Heulers", - "lat": "50.34939", - "lon": "4.11794", - "id": 162196 - } - ], - "matchStreet": 1 - }, - { - "name": "Marche-en-Famenne", - "names": { - "ru": "Марш-ан-Фамен", - "wa": "Måtche-el-Famene", - "fr": "Marche-en-Famenne" - }, - "lat": "50.22408", - "lon": "5.34287", - "id": 30103479, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Herman", - "lat": "50.16806", - "lon": "5.28498", - "id": 156848 - }, - { - "name": "Rue Émile Demelenne", - "lat": "50.23417", - "lon": "5.34292", - "id": 113077 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Mazy", - "names": { - "ru": "Мази", - "wa": "Mazi", - "fr": "Mazy", - "nl": "Mazy" - }, - "lat": "50.51276", - "lon": "4.67451", - "id": 61146471, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Pirson", - "lat": "50.50823", - "lon": "4.67378", - "id": 32208 - } - ], - "matchStreet": 1 - }, - { - "name": "Le Rœulx", - "names": { - "ru": "Рё" - }, - "lat": "50.50340", - "lon": "4.11223", - "id": 77821552, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Mignault)", - "lat": "50.53572", - "lon": "4.16749", - "id": 95629 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.50345", - "lon": "4.10972", - "id": 97740 - } - ], - "matchStreet": 1 - }, - { - "name": "Péruwelz", - "names": { - "ru": "Перювельз" - }, - "lat": "50.50979", - "lon": "3.59088", - "id": 79427177, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Baijot", - "lat": "50.49678", - "lon": "3.60371", - "id": 158665 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Flawinne", - "names": { - "ru": "Флавин", - "wa": "Flawene", - "fr": "Flawinne" - }, - "lat": "50.45660", - "lon": "4.81208", - "id": 685352654, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.45842", - "lon": "4.80435", - "id": 157800 - }, - { - "name": "Rue Emile Dessenius", - "lat": "50.46166", - "lon": "4.81248", - "id": 72889 - }, - { - "name": "Rue Emile Mazy", - "lat": "50.45895", - "lon": "4.79388", - "id": 147808 - } - ], - "matchStreet": 1 - }, - { - "name": "Comblain-au-Pont", - "names": { - "wa": "Comblin-å-Pont", - "fr": "Comblain-au-Pont" - }, - "lat": "50.47570", - "lon": "5.57485", - "id": 611164729, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.47286", - "lon": "5.57914", - "id": 163087 - } - ], - "matchStreet": 1 - }, - { - "name": "Goutroux", - "lat": "50.41286", - "lon": "4.35754", - "id": 672056852, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Moureau", - "lat": "50.41287", - "lon": "4.35713", - "id": 204394 - } - ], - "matchStreet": 1 - }, - { - "name": "Uccle - Ukkel", - "names": { - "ru": "Юккел-Юкль", - "fr": "Uccle", - "nl": "Ukkel" - }, - "lat": "50.80182", - "lon": "4.33724", - "id": 66199982, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Regard - Emile Regardstraat", - "names": { - "fr": "Rue Emile Regard", - "nl": "Emile Regardstraat" - }, - "lat": "50.81250", - "lon": "4.33823", - "id": 14572 - }, - { - "name": "Rue Émile Claus - Émile Clausstraat", - "names": { - "fr": "Rue Émile Claus", - "nl": "Émile Clausstraat" - }, - "lat": "50.81563", - "lon": "4.36741", - "id": 14658 - }, - { - "name": "Rue Emile Lecomte - Emile Lecomtestraat", - "names": { - "fr": "Rue Emile Lecomte", - "nl": "Emile Lecomtestraat" - }, - "lat": "50.81137", - "lon": "4.34413", - "id": 13867 - }, - { - "name": "Place Emile Danco - Emile Dancoplein", - "names": { - "fr": "Place Émile Danco", - "nl": "Émile Dancoplein" - }, - "lat": "50.80058", - "lon": "4.33775", - "id": 14910 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Isnes", - "names": { - "wa": "Les Înes", - "fr": "Isnes", - "nl": "Isnes" - }, - "lat": "50.51052", - "lon": "4.74069", - "id": 310110233, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Marchal", - "lat": "50.50341", - "lon": "4.71610", - "id": 221783 - } - ], - "matchStreet": 1 - }, - { - "name": "Brugge", - "enName": "Bruges", - "names": { - "de": "Brügge", - "ru": "Брюгге", - "sv": "Brygge", - "pt": "Bruges", - "el": "Βρύγη", - "lt": "Briugė", - "eo": "Bruĝo", - "lv": "Brige", - "it": "Bruges", - "fr": "Bruges", - "es": "Brujas", - "zh": "布魯日", - "cs": "Bruggy", - "ar": "بروج", - "la": "Brugae", - "lb": "Bruges", - "sk": "Bruggy", - "pl": "Brugia", - "ca": "Bruges", - "nl": "Brugge", - "tr": "Brüj", - "sr": "Бриж" - }, - "lat": "51.20855", - "lon": "3.22676", - "id": 1651558422, - "type": "CITY", - "listOfStreets": [ - { - "name": "Emile Bethuynelaan", - "lat": "51.16468", - "lon": "3.18908", - "id": 205073 - }, - { - "name": "Emile en Dora Rommelaerestraat", - "lat": "51.22929", - "lon": "3.24313", - "id": 132716 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Bruxelles - Brussel", - "enName": "Brussels", - "names": { - "pt": "Bruxelas", - "hr": "Brisel", - "ht": "Briksèl", - "hu": "Brüsszel", - "yi": "בריסל", - "hy": "Բրյուսել", - "nah": "Brusel", - "pms": "Brussel", - "ia": "Brussel", - "id": "Brussel", - "nap": "Bruxelles", - "scn": "Bruxelles", - "ext": "Brusselas", - "qu": "Brussel", - "af": "Brussel", - "frp": "Brussèles", - "pnb": "برسلز", - "io": "Bruxel", - "is": "Brussel", - "it": "Bruxelles", - "am": "ብሩክሴል", - "an": "Bruselas", - "zh": "布魯塞爾", - "ar": "بروكسل", - "stq": "Brussel", - "ja": "ブリュッセル", - "zh-min-nan": "Brussels", - "ro": "Bruxelles", - "be": "Брусель", - "ru": "Брюссель", - "bg": "Брюксел", - "jv": "Brussel", - "bo": "པུའུ་ལུའུ་སེལ​།", - "br": "Brusel", - "bs": "Brisel", - "arc": "ܒܪܘܟܣܠ", - "sh": "Bruxelles", - "ka": "ბრიუსელი", - "wuu": "布鲁塞尔", - "sk": "Brusel", - "sl": "Bruselj", - "ca": "Brussel·les", - "sq": "Brukseli", - "sr": "Брисел", - "kk": "Бруссел", - "kl": "Bruxelles", - "ce": "Бруссель", - "kn": "ಬ್ರಸೆಲ್ಸ್", - "sv": "Bryssel", - "ko": "브뤼셀", - "sw": "Brussels", - "ku": "Bruksel", - "kv": "Брюссель", - "kw": "Brusselas", - "tpi": "Brussels", - "ta": "பிரசெல்சு", - "cs": "Brusel", - "tg": "Брюссел", - "th": "บรัสเซลส์", - "la": "Bruxellae", - "cy": "Brwsel", - "lb": "Bréissel", - "nds": "Brüssel", - "vls": "Brussel", - "da": "Bruxelles", - "li": "Brussel", - "tr": "Brüksel", - "be-tarask": "Брусэль", - "de": "Brüssel", - "ln": "Bruxelles", - "ast": "Bruxeles", - "rue": "Брусел", - "lt": "Briuselis", - "lv": "Brisele", - "simple": "Brussels", - "lij": "Bruxelles", - "diq": "Bruksel", - "lad": "Bruselas", - "ug": "Bryussél", - "vec": "Borseła", - "uk": "Брюссель", - "zea": "Brussel", - "mg": "Brussel", - "mi": "Parahara", - "ur": "برسلز", - "mk": "Брисел", - "pap": "Brusela", - "vep": "Brüssel'", - "mn": "Брюссель", - "mr": "ब्रसेल्स", - "ms": "Brussels", - "el": "Βρυξέλλες", - "mt": "Brussell", - "tzl": "Brüxell", - "eo": "Bruselo", - "my": "ဘရပ်ဆဲလ်မြို့", - "es": "Bruselas", - "et": "Brüssel", - "eu": "Brusela", - "na": "Brussels", - "vi": "Bruxelles", - "bat-smg": "Briuselis", - "fa": "بروکسل", - "nl": "Brussel", - "nn": "Brussel", - "no": "Brussel", - "fi": "Bryssel", - "yue": "布魯塞爾", - "fo": "Brussel", - "wa": "Brussele", - "fr": "Bruxelles", - "kab": "Bruxelles", - "fy": "Brussel", - "nov": "Bruxelles", - "oc": "Brussèlas", - "crh": "Brüksel", - "ga": "An Bhruiséil", - "ang": "Brysel", - "sah": "Брүссель", - "gd": "A' Bhruiseal", - "os": "Брюссель", - "szl": "Bruksela", - "gl": "Bruxelas", - "gv": "Yn Vrussyl", - "ckb": "برۆکسل", - "pl": "Bruksela", - "sr-latn": "Brisel", - "he": "בריסל" - }, - "lat": "50.84656", - "lon": "4.35170", - "id": 1635651356, - "type": "CITY", - "listOfStreets": [ - { - "name": "Rue Paul Émile Janson - Paul Émile Jansonstraat", - "names": { - "fr": "Rue Paul Émile Janson", - "nl": "Paul Émile Jansonstraat" - }, - "lat": "50.82820", - "lon": "4.36217", - "id": 14608 - }, - { - "name": "Boulevard Emile Jacqmain - Emile Jacqmainlaan", - "names": { - "old_name:fr": "Boulevard de la Senne", - "old_name": "Boulevard de la Senne - Zennelaan", - "old_name:nl": "Zennelaan", - "fr": "Boulevard Emile Jacqmain", - "nl": "Emile Jacqmainlaan" - }, - "lat": "50.85455", - "lon": "4.35417", - "id": 14844 - }, - { - "name": "Avenue Emile Van Ermengem - Emile Van Ermengemlaan", - "lat": "50.89206", - "lon": "4.33132", - "id": 5934 - }, - { - "name": "Rue Emile Wauters - Emile Wautersstraat", - "lat": "50.88702", - "lon": "4.34290", - "id": 5985 - }, - { - "name": "Boulevard Émile Bockstael - Emile Bockstaellaan", - "names": { - "fr": "Boulevard Émile Bockstael", - "nl": "Emile Bockstaellaan" - }, - "lat": "50.87194", - "lon": "4.34466", - "id": 5992 - }, - { - "name": "Rue Émile Delva - Émile Delvastraat", - "lat": "50.88260", - "lon": "4.34142", - "id": 5999 - }, - { - "name": "Place Émile Bockstael - Emile Bockstaelplein", - "names": { - "fr": "Place Émile Bockstael", - "nl": "Emile Bockstaelplein" - }, - "lat": "50.87761", - "lon": "4.34683", - "id": 6065 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Merbes-le-Château", - "lat": "50.32340", - "lon": "4.16448", - "id": 256130286, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Fontaine-Valmont)", - "lat": "50.32034", - "lon": "4.21564", - "id": 224568 - }, - { - "name": "Rue Emile Pourbaix", - "lat": "50.31596", - "lon": "4.21682", - "id": 224570 - } - ], - "matchStreet": 1 - }, - { - "name": "Ernage", - "names": { - "wa": "Ernadje", - "nl": "Ernage" - }, - "lat": "50.59420", - "lon": "4.67400", - "id": 365967231, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Labarre", - "lat": "50.59404", - "lon": "4.66848", - "id": 62537 - } - ], - "matchStreet": 1 - }, - { - "name": "Diest", - "names": { - "ru": "Дист" - }, - "lat": "50.98451", - "lon": "5.05034", - "id": 64670063, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Vanderveldestraat", - "lat": "50.97764", - "lon": "5.05472", - "id": 124265, - "buildings": [], - "intersectedStreets": [ - { - "name": "Kloosterbergstraat", - "lat": "50.97747", - "lon": "5.05448" - }, - { - "name": "Montgommerystraat", - "lat": "50.97826", - "lon": "5.05523" - }, - { - "name": "Bloemenlaan", - "lat": "50.97871", - "lon": "5.05157" - }, - { - "name": "Speelhofstraat", - "lat": "50.97899", - "lon": "5.05032" - }, - { - "name": "Frankenstraat", - "lat": "50.97952", - "lon": "5.04961" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Pironchamps", - "lat": "50.42860", - "lon": "4.52605", - "id": 449218688, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde", - "lat": "50.42859", - "lon": "4.52431", - "id": 236378 - } - ], - "matchStreet": 1 - }, - { - "name": "Jeuk", - "names": { - "ru": "Йёк", - "fr": "Goyer", - "nl": "Jeuk" - }, - "lat": "50.73424", - "lon": "5.20969", - "id": 1484663298, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Beauduinstraat (Klein-Jeuk)", - "lat": "50.71964", - "lon": "5.18898", - "id": 201150, - "intersectedStreets": [ - { - "name": "Kasteelstraat (Klein-Jeuk)", - "lat": "50.72168", - "lon": "5.18810" - }, - { - "name": "Spoorwegstraat (Klein-Jeuk)", - "lat": "50.72168", - "lon": "5.18810" - }, - { - "name": "Kustrijkstraat (Klein-Jeuk)", - "lat": "50.72407", - "lon": "5.18711" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Dinant", - "names": { - "ru": "Динан" - }, - "lat": "50.26081", - "lon": "4.91241", - "id": 2850062184, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Wauthy", - "lat": "50.23241", - "lon": "4.90563", - "id": 242396 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Leernes", - "lat": "50.39744", - "lon": "4.33078", - "id": 427112190, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Marcq", - "lat": "50.39730", - "lon": "4.33018", - "id": 173807 - } - ], - "matchStreet": 1 - }, - { - "name": "Marcinelle", - "lat": "50.39773", - "lon": "4.44425", - "id": 674001446, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avenue Emile Rousseaux", - "lat": "50.40260", - "lon": "4.42674", - "id": 129026 - }, - { - "name": "Square Émile Buisset", - "lat": "50.38316", - "lon": "4.45341", - "id": 130207 - }, - { - "name": "Rue Émile Nonnon", - "lat": "50.40142", - "lon": "4.44266", - "id": 127157 - }, - { - "name": "Rue Émile Vandervelde", - "lat": "50.39180", - "lon": "4.44043", - "id": 140478 - }, - { - "name": "Rue Émile Cliquet", - "lat": "50.39904", - "lon": "4.44820", - "id": 127182 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Jette", - "names": { - "ru": "Жет", - "fr": "Jette", - "nl": "Jette" - }, - "lat": "50.87776", - "lon": "4.32608", - "id": 66513277, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Delva - Émile Delvastraat", - "names": { - "fr": "Rue Émile Delva", - "nl": "Émile Delvastraat" - }, - "lat": "50.87861", - "lon": "4.34252", - "id": 52212 - }, - { - "name": "Avenue Emile Van Ermengem - Emile Van Ermengemlaan", - "names": { - "fr": "Avenue Emile Van Ermengem", - "nl": "Emile Van Ermengemlaan" - }, - "lat": "50.89294", - "lon": "4.32524", - "id": 2586 - }, - { - "name": "Rue Emile Wauters - Emile Wautersstraat", - "names": { - "fr": "Rue Emile Wauters", - "nl": "Emile Wautersstraat" - }, - "lat": "50.88702", - "lon": "4.34288", - "id": 70372 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Manage", - "names": { - "ru": "Манаж" - }, - "lat": "50.50402", - "lon": "4.23555", - "id": 673954341, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Petit-Bois-d'Haine)", - "lat": "50.48205", - "lon": "4.21242", - "id": 158850 - }, - { - "name": "Avenue Emile Herman", - "lat": "50.48448", - "lon": "4.22750", - "id": 98455 - }, - { - "name": "Rue Emile Rousseau", - "lat": "50.48409", - "lon": "4.23098", - "id": 184764 - }, - { - "name": "Chaussée de Jolimont - Avenue Emile Herman", - "lat": "50.47769", - "lon": "4.22336", - "id": 245605 - } - ], - "matchStreet": 1 - }, - { - "name": "Stambruges", - "names": { - "ru": "Стамбрюж" - }, - "lat": "50.50835", - "lon": "3.72025", - "id": 203844147, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Paul-Emile Janson", - "lat": "50.50981", - "lon": "3.71883", - "id": 194950 - } - ], - "matchStreet": 1 - }, - { - "name": "Couillet", - "names": { - "ru": "Куйе" - }, - "lat": "50.39122", - "lon": "4.46862", - "id": 673999413, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde", - "lat": "50.39197", - "lon": "4.46837", - "id": 165791 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Blaton", - "lat": "50.50117", - "lon": "3.66117", - "id": 506142776, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Carlier", - "lat": "50.50109", - "lon": "3.66302", - "id": 194078 - } - ], - "matchStreet": 1 - }, - { - "name": "Gedinne", - "names": { - "ru": "Жедин", - "wa": "Djedene", - "fr": "Gedinne", - "nl": "Gedinne" - }, - "lat": "49.97927", - "lon": "4.93889", - "id": 73813704, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Montreuil", - "lat": "49.99511", - "lon": "4.88739", - "id": 128056 - } - ], - "matchStreet": 1 - }, - { - "name": "La Bifurcation", - "lat": "50.47777", - "lon": "4.22366", - "id": 1799772584, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Chaussée de Jolimont - Avenue Emile Herman", - "lat": "50.47769", - "lon": "4.22336", - "id": 245606 - } - ], - "matchStreet": 1 - }, - { - "name": "Hotton", - "names": { - "ru": "Оттон", - "wa": "Houton", - "fr": "Hotton" - }, - "lat": "50.26880", - "lon": "5.44632", - "id": 292660179, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Parfonry", - "lat": "50.26187", - "lon": "5.43482", - "id": 93151 - } - ], - "matchStreet": 1 - }, - { - "name": "Perwez", - "names": { - "ru": "Первез", - "wa": "Perwé", - "fr": "Perwez", - "nl": "Perwijs" - }, - "lat": "50.62345", - "lon": "4.81347", - "id": 571286635, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Crebeyck", - "lat": "50.62351", - "lon": "4.81705", - "id": 159822 - }, - { - "name": "Rue Emile Masset", - "lat": "50.66123", - "lon": "4.82128", - "id": 90345 - }, - { - "name": "Rue Emile de Brabant", - "lat": "50.62409", - "lon": "4.81448", - "id": 128923 - } - ], - "matchStreet": 1 - }, - { - "name": "Maret", - "lat": "50.71458", - "lon": "4.99367", - "id": 2084148886, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Avenue Emile Vandervelde", - "lat": "50.71393", - "lon": "4.99307", - "id": 135837, - "intersectedStreets": [ - { - "name": "Place de Maret", - "lat": "50.71423", - "lon": "4.99305" - }, - { - "name": "Rue Eugène Malevé", - "lat": "50.71423", - "lon": "4.99305" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Chapelle-lez-Herlaimont", - "names": { - "ru": "Шапель-лез-Эрлемон" - }, - "lat": "50.47133", - "lon": "4.28042", - "id": 348312112, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Duhoux", - "lat": "50.44041", - "lon": "4.30098", - "id": 143585 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.47635", - "lon": "4.28714", - "id": 199968 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Pousset", - "lat": "50.69564", - "lon": "5.30346", - "id": 734893372, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Dans", - "lat": "50.69519", - "lon": "5.30292", - "id": 242744, - "intersectedStreets": [ - { - "name": "Rue de l'Arbre", - "lat": "50.69526", - "lon": "5.30311" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Couvin", - "names": { - "ru": "Кувен", - "wa": "Couvén", - "nl": "Couvin" - }, - "lat": "50.05249", - "lon": "4.49551", - "id": 60561637, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Résidence Emile Donnay", - "lat": "50.04311", - "lon": "4.50246", - "id": 107449 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Mettet", - "names": { - "ru": "Мете", - "wa": "Metet", - "nl": "Mettet" - }, - "lat": "50.32121", - "lon": "4.65850", - "id": 252141952, - "type": "TOWN", - "listOfStreets": [ - { - "name": "rue Emile de Clercq", - "lat": "50.27572", - "lon": "4.65722", - "id": 139160 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Dolhain", - "lat": "50.61971", - "lon": "5.94126", - "id": 207241892, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Colette", - "lat": "50.62151", - "lon": "5.93918", - "id": 104510 - } - ], - "matchStreet": 1 - }, - { - "name": "Remicourt", - "names": { - "ru": "Ремикур", - "wa": "Remicoû", - "fr": "Remicourt" - }, - "lat": "50.68072", - "lon": "5.32672", - "id": 734893368, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Dans", - "lat": "50.69519", - "lon": "5.30292", - "id": 242743, - "intersectedStreets": [ - { - "name": "Rue de l'Arbre (Pousset)", - "lat": "50.69526", - "lon": "5.30311" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Messancy", - "names": { - "de": "Metzig", - "lb": "Miezeg", - "wa": "Messanceye", - "nl": "Messancy" - }, - "lat": "49.59691", - "lon": "5.81694", - "id": 270800544, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Kirsch", - "lat": "49.58565", - "lon": "5.81775", - "id": 225321 - } - ], - "matchStreet": 1 - }, - { - "name": "Rebecq", - "names": { - "fr": "Rebecq" - }, - "lat": "50.66459", - "lon": "4.13554", - "id": 675995339, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Avenue Emile Geerts", - "lat": "50.66048", - "lon": "4.14343", - "id": 69947 - } - ], - "matchStreet": 1 - }, - { - "name": "Comines-Warneton", - "names": { - "pcd": "Comène-Warneuton", - "ru": "Комин-Варнетон", - "fr": "Comines-Warneton", - "nl": "Komen-Waasten" - }, - "lat": "50.76830", - "lon": "3.00013", - "id": 1719301306, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Cauche", - "names": { - "fr": "Emile Cauchestraat" - }, - "lat": "50.75431", - "lon": "2.94603", - "id": 140514 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Rendeux", - "names": { - "ru": "Рандё" - }, - "lat": "50.23305", - "lon": "5.50432", - "id": 697215753, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Dupont", - "lat": "50.23418", - "lon": "5.50254", - "id": 125533 - } - ], - "matchStreet": 1 - }, - { - "name": "Ans", - "names": { - "ru": "Анс" - }, - "lat": "50.66243", - "lon": "5.51906", - "id": 481371644, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Loncin)", - "lat": "50.65930", - "lon": "5.50353", - "id": 69794 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ciney", - "names": { - "ru": "Сине", - "wa": "Cînè", - "fr": "Ciney", - "nl": "Ciney" - }, - "lat": "50.29495", - "lon": "5.09742", - "id": 64666967, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Impasse Émile Romnée", - "lat": "50.31254", - "lon": "5.06431", - "id": 152600, - "intersectedStreets": [ - { - "name": "Rue d'Yvoir (Halloy)", - "lat": "50.31248", - "lon": "5.06435" - } - ] - }, - { - "name": "Place Emile Vandervelde", - "lat": "50.29112", - "lon": "5.09193", - "id": 213270, - "intersectedStreets": [ - { - "name": "Rue Piervenne", - "lat": "50.29153", - "lon": "5.09161" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Hermalle-sous-Argenteau", - "lat": "50.71054", - "lon": "5.68088", - "id": 747888133, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile de Laveleye", - "lat": "50.70408", - "lon": "5.67433", - "id": 242607 - } - ], - "matchStreet": 1 - }, - { - "name": "Amay", - "names": { - "ru": "Аме", - "wa": "Ama", - "fr": "Amay" - }, - "lat": "50.54978", - "lon": "5.32410", - "id": 258880948, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.54795", - "lon": "5.32107", - "id": 47785 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Leuze-en-Hainaut", - "names": { - "ru": "Лёз-ан-Эно" - }, - "lat": "50.59882", - "lon": "3.61673", - "id": 34078889, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Albot", - "lat": "50.62961", - "lon": "3.65310", - "id": 195230 - }, - { - "name": "Rue Emile Fontaine", - "lat": "50.62438", - "lon": "3.63158", - "id": 104184 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.59941", - "lon": "3.61714", - "id": 101230 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Thuin", - "names": { - "ru": "Тюэн" - }, - "lat": "50.33974", - "lon": "4.28705", - "id": 79447645, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Vandervelde (Aulne)", - "lat": "50.36683", - "lon": "4.33241", - "id": 13743 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ittre", - "names": { - "ru": "Итр", - "fr": "Ittre", - "nl": "Itter" - }, - "lat": "50.65020", - "lon": "4.26370", - "id": 156632951, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Montoisy", - "lat": "50.64780", - "lon": "4.25881", - "id": 36262 - } - ], - "matchStreet": 1 - }, - { - "name": "Arlon", - "names": { - "de": "Arel", - "ru": "Арлон", - "la": "Orolaunum", - "lb": "Arel", - "wa": "Årlon", - "fr": "Arlon", - "nl": "Aarlen" - }, - "lat": "49.68276", - "lon": "5.81192", - "id": 63111399, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Tandel (Quatre Vents)", - "lat": "49.69696", - "lon": "5.81016", - "id": 227645 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Stavelot", - "names": { - "de": "Stablo", - "ru": "Ставло", - "wa": "Ståvleu", - "fr": "Stavelot" - }, - "lat": "50.39409", - "lon": "5.93084", - "id": 79445596, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Emile Jamar", - "lat": "50.45480", - "lon": "5.95144", - "id": 222863, - "buildings": [] - }, - { - "name": "Rue Emile Goedert", - "lat": "50.45446", - "lon": "5.95199", - "id": 43727 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Mons", - "names": { - "ar": "مونس", - "de": "Bergen", - "ru": "Монс", - "la": "Montes", - "fr": "Mons", - "nl": "Bergen", - "sr": "Монс" - }, - "lat": "50.45496", - "lon": "3.95197", - "id": 893278148, - "type": "CITY", - "listOfStreets": [ - { - "name": "Rue Emile Limauge", - "lat": "50.47297", - "lon": "3.92139", - "id": 164192 - }, - { - "name": "Rue Emile Blairon", - "lat": "50.40774", - "lon": "4.01100", - "id": 208242 - }, - { - "name": "Rue Émile Vandervelde (Bertaimont)", - "lat": "50.44018", - "lon": "3.94135", - "id": 26027 - }, - { - "name": "Rue Émile Wauquier (Nouvelles)", - "lat": "50.40366", - "lon": "3.96287", - "id": 245331 - }, - { - "name": "Rue Émile Jambe", - "lat": "50.46453", - "lon": "4.04595", - "id": 87736 - }, - { - "name": "Avenue du Gouverneur Émile Cornez", - "lat": "50.44856", - "lon": "3.96207", - "id": 202622 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Thulin", - "names": { - "ru": "Тюлен" - }, - "lat": "50.42929", - "lon": "3.73932", - "id": 1376491703, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.42997", - "lon": "3.74218", - "id": 176292 - } - ], - "matchStreet": 1 - }, - { - "name": "Forest - Vorst", - "names": { - "ru": "Форе-Ворст", - "fr": "Forest", - "nl": "Vorst" - }, - "lat": "50.80914", - "lon": "4.31776", - "id": 66197751, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Square Emile des Grées du Loû - Emile des Grées du Loû Square", - "names": { - "fr": "Square Emile des Grées du Loû", - "nl": "Emile des Grées du Loû Square" - }, - "lat": "50.80530", - "lon": "4.31123", - "id": 7267 - }, - { - "name": "Rue Emile Pathé - Emile Pathéstraat", - "names": { - "fr": "Rue Emile Pathé", - "nl": "Emile Pathéstraat" - }, - "lat": "50.79933", - "lon": "4.30452", - "id": 135409 - }, - { - "name": "Rue Émile Feron - Émile Feronstraat", - "lat": "50.82974", - "lon": "4.33477", - "id": 222734 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Hoeilaart", - "names": { - "ru": "Хуларт", - "fr": "Hoeilaert" - }, - "lat": "50.76748", - "lon": "4.47440", - "id": 252608972, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Vandenbroeckstraat", - "lat": "50.76750", - "lon": "4.47626", - "id": 76849 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Angre", - "names": { - "ru": "Ангр" - }, - "lat": "50.36698", - "lon": "3.69544", - "id": 248076301, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Cornez", - "lat": "50.36827", - "lon": "3.69413", - "id": 172066 - } - ], - "matchStreet": 1 - }, - { - "name": "Habay-la-Neuve", - "names": { - "de": "Neu-Habich", - "lb": "Neihabech", - "wa": "Hâbâ-la-Niëf", - "fr": "Habay-la-Neuve" - }, - "lat": "49.72861", - "lon": "5.65038", - "id": 292129645, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Baudrux", - "names": { - "etymology:wikidata": "Q3588328" - }, - "lat": "49.72792", - "lon": "5.64650", - "id": 12787 - } - ], - "matchStreet": 1 - }, - { - "name": "Quévy", - "lat": "50.36672", - "lon": "3.94390", - "id": 662071665, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Wauquier (Asquillies)", - "lat": "50.40050", - "lon": "3.96312", - "id": 136588 - } - ], - "matchStreet": 1 - }, - { - "name": "Chièvres", - "lat": "50.58798", - "lon": "3.80569", - "id": 64619788, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Dooms", - "lat": "50.58670", - "lon": "3.80520", - "id": 198153 - } - ], - "matchStreet": 1 - }, - { - "name": "Court-Saint-Etienne", - "names": { - "ru": "Кур-Сен-Этьен", - "wa": "Coû-Sint-Stiene" - }, - "lat": "50.64432", - "lon": "4.56857", - "id": 292551547, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Henricot", - "lat": "50.64566", - "lon": "4.56684", - "id": 9739 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Hastière-Lavaux", - "names": { - "ru": "Астьер-Лаво", - "wa": "Li Vå-dlé-Astire" - }, - "lat": "50.21654", - "lon": "4.82424", - "id": 664657228, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Binet", - "lat": "50.21627", - "lon": "4.82517", - "id": 127767, - "buildings": [], - "intersectedStreets": [ - { - "name": "Rue des Vignes", - "lat": "50.21627", - "lon": "4.82517" - }, - { - "name": "Rue Marcel Lespagne", - "lat": "50.21640", - "lon": "4.82476" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Gaillemarde", - "lat": "50.72232", - "lon": "4.44423", - "id": 2508733269, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Rue Emile Semal", - "lat": "50.72241", - "lon": "4.44262", - "id": 61341 - } - ], - "matchStreet": 1 - }, - { - "name": "Braibant", - "names": { - "wa": "Braibant", - "nl": "Braibant" - }, - "lat": "50.31291", - "lon": "5.06296", - "id": 366511807, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Impasse Émile Romnée", - "lat": "50.31254", - "lon": "5.06431", - "id": 152601, - "intersectedStreets": [ - { - "name": "Rue d'Yvoir", - "lat": "50.31248", - "lon": "5.06435" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Lessines", - "names": { - "ru": "Лесин", - "fr": "Lessines", - "nl": "Lessen" - }, - "lat": "50.71230", - "lon": "3.83011", - "id": 31353523, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Ollignies)", - "lat": "50.68658", - "lon": "3.86146", - "id": 37258 - }, - { - "name": "Boulevard Emile Schevenels", - "lat": "50.71260", - "lon": "3.82474", - "id": 28492 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Zemst", - "names": { - "ru": "Земст" - }, - "lat": "50.98421", - "lon": "4.46508", - "id": 270762769, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verbruggestraat", - "lat": "50.97490", - "lon": "4.47656", - "id": 49035 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Dampremy", - "lat": "50.41862", - "lon": "4.43225", - "id": 673999641, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Fourcault", - "names": { - "old_name": "Rue Frison" - }, - "lat": "50.42237", - "lon": "4.43419", - "id": 208181 - } - ], - "matchStreet": 1 - }, - { - "name": "Vilvoorde", - "names": { - "ru": "Вилворде", - "fr": "Vilvorde", - "nl": "Vilvoorde" - }, - "lat": "50.93089", - "lon": "4.43195", - "id": 1677252814, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verhaerenstraat", - "lat": "50.93782", - "lon": "4.43243", - "id": 51153 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sint-Pieters-Leeuw", - "names": { - "ru": "Синт-Питерс-Леув", - "fr": "Leeuw-Saint-Pierre", - "nl": "Sint-Pieters-Leeuw" - }, - "lat": "50.78003", - "lon": "4.24437", - "id": 251471298, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Vandersteenenstraat", - "lat": "50.78189", - "lon": "4.27173", - "id": 46231 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Erquelinnes", - "names": { - "ru": "Эркелин" - }, - "lat": "50.31022", - "lon": "4.12414", - "id": 477193038, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Bosseaux", - "lat": "50.30627", - "lon": "4.15260", - "id": 214086 - }, - { - "name": "Rue Émile Vandervelde (Solre-sur-Sambre)", - "lat": "50.30862", - "lon": "4.15785", - "id": 212044 - }, - { - "name": "Rue Émile-Zola", - "lat": "50.29086", - "lon": "4.11382", - "id": 661 - } - ], - "matchStreet": 1 - }, - { - "name": "Schepdaal", - "names": { - "ru": "Схепдал", - "fr": "Schepdael" - }, - "lat": "50.83486", - "lon": "4.19197", - "id": 251471297, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Eylenboschstraat", - "lat": "50.83394", - "lon": "4.19261", - "id": 166357 - } - ], - "matchStreet": 1 - }, - { - "name": "Grez-Doiceau", - "names": { - "ru": "Грес-Дуасо", - "wa": "Gré", - "fr": "Grez-Doiceau", - "nl": "Graven" - }, - "lat": "50.73862", - "lon": "4.69623", - "id": 292561459, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Nethen)", - "lat": "50.78206", - "lon": "4.69022", - "id": 137435 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Piéton", - "lat": "50.44096", - "lon": "4.29816", - "id": 449287621, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Duhoux", - "lat": "50.44041", - "lon": "4.30098", - "id": 143586 - } - ], - "matchStreet": 1 - }, - { - "name": "Solre-sur-Sambre", - "names": { - "ru": "Сольр-сюр-Самбр" - }, - "lat": "50.30677", - "lon": "4.15584", - "id": 669804720, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Bosseaux", - "lat": "50.30625", - "lon": "4.15262", - "id": 214087 - }, - { - "name": "Rue Émile Vandervelde", - "lat": "50.30861", - "lon": "4.15785", - "id": 212045 - } - ], - "matchStreet": 1 - }, - { - "name": "Menen", - "names": { - "ru": "Менен", - "fr": "Menin", - "vls": "Mjinde" - }, - "lat": "50.79699", - "lon": "3.11565", - "id": 1678309134, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Em. Zolastraat", - "lat": "50.80668", - "lon": "3.10827", - "id": 237572 - }, - { - "name": "Em. Vanderveldestraat", - "lat": "50.80741", - "lon": "3.11544", - "id": 237394 - }, - { - "name": "Em. Vandeveldestraat", - "lat": "50.80726", - "lon": "3.11570", - "id": 178656 - }, - { - "name": "Emile Zolastraat", - "lat": "50.80649", - "lon": "3.10802", - "id": 149312 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "La Cantine", - "lat": "50.68406", - "lon": "4.29746", - "id": 5443456831, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Rue Emile Schampaert", - "lat": "50.68466", - "lon": "4.29962", - "id": 43681 - } - ], - "matchStreet": 1 - }, - { - "name": "Sirault", - "names": { - "ru": "Сиро" - }, - "lat": "50.50606", - "lon": "3.78812", - "id": 189249614, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Lété", - "lat": "50.50407", - "lon": "3.78936", - "id": 9232 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.50506", - "lon": "3.78528", - "id": 9012 - } - ], - "matchStreet": 1 - }, - { - "name": "Ramillies", - "names": { - "ru": "Рамийи" - }, - "lat": "50.63669", - "lon": "4.91490", - "id": 292561468, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Laurent", - "lat": "50.66652", - "lon": "4.87368", - "id": 232186, - "intersectedStreets": [ - { - "name": "Rue de Laloux", - "lat": "50.66685", - "lon": "4.87426" - }, - { - "name": "Rue de L'Abyme", - "lat": "50.66645", - "lon": "4.87342" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Orp-Jauche", - "names": { - "ru": "Орп-Жош", - "wa": "Oû-Djåce", - "fr": "Orp-Jauche" - }, - "lat": "50.70010", - "lon": "4.98899", - "id": 292561469, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Landeut", - "lat": "50.72373", - "lon": "4.96571", - "id": 150104 - }, - { - "name": "Avenue Emile Vandervelde (Maret)", - "lat": "50.71392", - "lon": "4.99309", - "id": 135836, - "intersectedStreets": [ - { - "name": "Place de Maret", - "lat": "50.71422", - "lon": "4.99307" - }, - { - "name": "Rue Eugène Malevé", - "lat": "50.71422", - "lon": "4.99307" - }, - { - "name": "Rue Léon Jacquemin", - "lat": "50.70751", - "lon": "4.99264" - }, - { - "name": "Rue du Bonsopre", - "lat": "50.71243", - "lon": "4.99324" - }, - { - "name": "Place du 11e Dragons Français", - "lat": "50.70381", - "lon": "4.99071" - }, - { - "name": "Rue Sainte-Barbe (Orp-le-Grand)", - "lat": "50.70560", - "lon": "4.99153" - } - ] - }, - { - "name": "Rue Emile Looze (Maret)", - "lat": "50.71415", - "lon": "4.99912", - "id": 135833 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gent", - "enName": "Ghent", - "names": { - "de": "Gent", - "hi": "खेंट", - "be": "Гент", - "ru": "Гент", - "ast": "Gante", - "pt": "Gante", - "bg": "Гент", - "lt": "Gentas", - "lv": "Ģente", - "fr": "Gand", - "ug": "Gant", - "fy": "Gint", - "oc": "Gant", - "ka": "გენტი", - "uk": "Гент", - "ca": "Gant", - "sr": "Гент", - "mn": "Гент", - "ko": "헨트", - "os": "Гент", - "gl": "Gante - Gent", - "mr": "गेंट", - "el": "Γάνδη", - "eo": "Gento", - "it": "Gand", - "my": "ဂင့်မြို့", - "es": "Gante", - "zh": "根特", - "eu": "Gante", - "ar": "غنت", - "na": "Ghent", - "th": "เกนต์", - "la": "Gandavum", - "ja": "ヘント", - "tl": "Gante", - "vo": "Ghent", - "fa": "گنت", - "pl": "Gandawa", - "he": "גנט", - "nl": "Gent" - }, - "lat": "51.05383", - "lon": "3.72501", - "id": 1668655163, - "type": "CITY", - "listOfStreets": [ - { - "name": "Emile Braunplein", - "names": { - "alt_name": "Braunplein" - }, - "lat": "51.05389", - "lon": "3.72445", - "id": 13411 - }, - { - "name": "Emile Clauslaan", - "lat": "51.03656", - "lon": "3.72211", - "id": 174215 - }, - { - "name": "Emile Moysonlaan", - "lat": "51.04872", - "lon": "3.74722", - "id": 193683 - }, - { - "name": "Emile Andelhofstraat", - "lat": "51.02353", - "lon": "3.67094", - "id": 107333 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Louvain-la-Neuve", - "names": { - "de": "Neu-Löwen", - "ru": "Лувен-ла-Нёв" - }, - "lat": "50.66820", - "lon": "4.61288", - "id": 60172442, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Francqui", - "lat": "50.65896", - "lon": "4.62312", - "id": 14519 - }, - { - "name": "Rue Émile Goes (Biéreau)", - "lat": "50.66461", - "lon": "4.61765", - "id": 94546 - }, - { - "name": "Avenue Émile Verhaeren (Bruyères)", - "lat": "50.66147", - "lon": "4.60887", - "id": 94576, - "intersectedStreets": [ - { - "name": "Avenue des Arts (Bruyères)", - "lat": "50.66256", - "lon": "4.60748" - }, - { - "name": "Rue Victor Horta (Bruyères)", - "lat": "50.66256", - "lon": "4.60748" - }, - { - "name": "Rue Achille Chavée (Bruyères)", - "lat": "50.66187", - "lon": "4.60838" - }, - { - "name": "Rue Marie Gevers (Bruyères)", - "lat": "50.66187", - "lon": "4.60838" - }, - { - "name": "Rue Albert Mockel (Bruyères)", - "lat": "50.66140", - "lon": "4.60898" - }, - { - "name": "Parvis de la Cantilène (Bruyères)", - "lat": "50.66160", - "lon": "4.60999" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Thiméon", - "lat": "50.49035", - "lon": "4.42813", - "id": 673982201, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Vandervelde", - "names": { - "alt_name": "Rue Emile Vandervelde" - }, - "lat": "50.48106", - "lon": "4.43007", - "id": 138442 - } - ], - "matchStreet": 1 - }, - { - "name": "Saint-Ghislain", - "names": { - "ru": "Сен-Гилен", - "bg": "Сен Гислен", - "fa": "سن-گیزلن" - }, - "lat": "50.44775", - "lon": "3.81953", - "id": 79435626, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Lenoir", - "lat": "50.50740", - "lon": "3.77146", - "id": 9540 - }, - { - "name": "Rue Emile Lété", - "lat": "50.51858", - "lon": "3.82215", - "id": 177700 - }, - { - "name": "Rue Emile Vandervelde (Sirault)", - "lat": "50.50506", - "lon": "3.78531", - "id": 9011 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sombreffe", - "names": { - "ru": "Сомбреф", - "wa": "Sombrefe", - "nl": "Sombreffe" - }, - "lat": "50.52466", - "lon": "4.60258", - "id": 187197428, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Pirson", - "lat": "50.53964", - "lon": "4.61565", - "id": 39355 - }, - { - "name": "Rue Émile Vandervelde (Ligny)", - "lat": "50.50950", - "lon": "4.56746", - "id": 24483 - } - ], - "matchStreet": 1 - }, - { - "name": "Monceau-sur-Sambre", - "lat": "50.41702", - "lon": "4.38241", - "id": 450191735, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Cité Emile Demoulin", - "lat": "50.42151", - "lon": "4.38084", - "id": 206924 - }, - { - "name": "Rue Émile Constant", - "lat": "50.41615", - "lon": "4.38816", - "id": 160847 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.41590", - "lon": "4.37561", - "id": 212071 - }, - { - "name": "Rue Emile Leclercq", - "lat": "50.41668", - "lon": "4.37161", - "id": 219791 - } - ], - "matchStreet": 1 - }, - { - "name": "Vielsalm", - "names": { - "ru": "Вьельсальм" - }, - "lat": "50.28837", - "lon": "5.91702", - "id": 251707435, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Tromme", - "lat": "50.32363", - "lon": "5.90940", - "id": 20007 - } - ], - "matchStreet": 1 - }, - { - "name": "Marchienne-au-Pont", - "lat": "50.40671", - "lon": "4.39601", - "id": 450191739, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Brunet", - "lat": "50.39479", - "lon": "4.39303", - "id": 207018 - }, - { - "name": "Rue des Bateliers", - "names": { - "old_name": "Rue Émile Vandervelde" - }, - "lat": "50.40809", - "lon": "4.39500", - "id": 207281 - }, - { - "name": "Rue Saint Emile", - "lat": "50.42439", - "lon": "4.40146", - "id": 160353 - }, - { - "name": "Rue Émile Royer", - "lat": "50.42276", - "lon": "4.41992", - "id": 142975 - }, - { - "name": "Rue Émile Gantois", - "lat": "50.42129", - "lon": "4.41455", - "id": 142985 - } - ], - "matchStreet": 1 - }, - { - "name": "Landen", - "names": { - "ru": "Ланден" - }, - "lat": "50.75301", - "lon": "5.08131", - "id": 77802451, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Moyaertslaan", - "lat": "50.74737", - "lon": "5.08620", - "id": 203470, - "intersectedStreets": [ - { - "name": "Ernest Pitonlaan", - "lat": "50.74710", - "lon": "5.08491" - }, - { - "name": "Filips de Goedelaan", - "lat": "50.74737", - "lon": "5.08620" - }, - { - "name": "Philips de Goedelaan", - "lat": "50.74737", - "lon": "5.08620" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Berchem-Sainte-Agathe - Sint-Agatha-Berchem", - "names": { - "ru": "Беркем-Сент-Агат", - "fr": "Berchem-Sainte-Agathe", - "li": "Sint-Agatha-Berchem", - "nl": "Sint-Agatha-Berchem" - }, - "lat": "50.86398", - "lon": "4.29269", - "id": 66194565, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Van Overstraeten - Emile Van Overstraetenstraat", - "names": { - "fr": "Rue Emile Van Overstraeten", - "nl": "Emile Van Overstraetenstraat" - }, - "lat": "50.86218", - "lon": "4.29003", - "id": 4997 - }, - { - "name": "Rue Emile Heylens - Emile Heylensstraat", - "names": { - "fr": "Rue Emile Heylens", - "nl": "Emile Heylensstraat" - }, - "lat": "50.85681", - "lon": "4.29291", - "id": 5001 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Binche", - "names": { - "ru": "Бенш" - }, - "lat": "50.41030", - "lon": "4.16517", - "id": 428181182, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Zola (Péronnes-lez-Binche)", - "lat": "50.43840", - "lon": "4.15277", - "id": 186773 - }, - { - "name": "Rue Emile Vinck (Péronnes-lez-Binche)", - "lat": "50.43954", - "lon": "4.15137", - "id": 159548 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Bois-de-Villers", - "names": { - "wa": "Li Bwès-d'-Vilé" - }, - "lat": "50.38997", - "lon": "4.82338", - "id": 686149534, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Mazy", - "lat": "50.39042", - "lon": "4.80824", - "id": 185944 - }, - { - "name": "Rue Emile Mahaux", - "lat": "50.37429", - "lon": "4.83752", - "id": 186072 - } - ], - "matchStreet": 1 - }, - { - "name": "Boom", - "names": { - "ru": "Бом", - "lt": "Bomas" - }, - "lat": "51.08738", - "lon": "4.36672", - "id": 173252843, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Van Reethstraat", - "lat": "51.10022", - "lon": "4.36734", - "id": 67959 - }, - { - "name": "Emile Vanderveldestraat", - "lat": "51.08684", - "lon": "4.36149", - "id": 25994 - }, - { - "name": "Emile Verhaerenstraat", - "lat": "51.09917", - "lon": "4.37475", - "id": 418 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "La Hulpe", - "names": { - "ru": "Ла-Юльп", - "fr": "La Hulpe", - "nl": "Terhulpen" - }, - "lat": "50.73150", - "lon": "4.47965", - "id": 138160966, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Semal", - "lat": "50.72241", - "lon": "4.44262", - "id": 61340 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Leugnies", - "lat": "50.22464", - "lon": "4.19616", - "id": 668473443, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Damien", - "lat": "50.22574", - "lon": "4.19371", - "id": 236891 - } - ], - "matchStreet": 1 - }, - { - "name": "Ollignies", - "names": { - "ru": "Оллиньи", - "fr": "Ollignies", - "nl": "Woelingen" - }, - "lat": "50.68742", - "lon": "3.85987", - "id": 33540734, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.68656", - "lon": "3.86144", - "id": 37259 - } - ], - "matchStreet": 1 - }, - { - "name": "Hannut", - "names": { - "ru": "Анню", - "wa": "Haneù", - "fr": "Hannut", - "nl": "Hannuit" - }, - "lat": "50.67246", - "lon": "5.07800", - "id": 64817311, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Duchesne", - "lat": "50.69487", - "lon": "5.03067", - "id": 22847 - }, - { - "name": "Rue Emile Roder", - "lat": "50.65424", - "lon": "5.12933", - "id": 141974 - }, - { - "name": "Rue Emile Martin", - "lat": "50.66500", - "lon": "5.07957", - "id": 138950 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Soignies", - "names": { - "de": "Söglingen", - "ru": "Суаньи", - "fr": "Soignies", - "nl": "Zinnik" - }, - "lat": "50.57753", - "lon": "4.07329", - "id": 79443904, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Carrières)", - "lat": "50.57085", - "lon": "4.07908", - "id": 90219 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Awans", - "lat": "50.66697", - "lon": "5.46201", - "id": 260096196, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Paul Emile Janson", - "lat": "50.66370", - "lon": "5.47374", - "id": 32565 - } - ], - "matchStreet": 1 - }, - { - "name": "Grâce-Hollogne", - "names": { - "ru": "Грас-Олонь", - "wa": "Gråce-Hologne", - "fr": "Grâce-Hollogne" - }, - "lat": "50.64496", - "lon": "5.50314", - "id": 746136317, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Verhaeren", - "lat": "50.64134", - "lon": "5.50685", - "id": 137402 - }, - { - "name": "Avenue Emile Vandervelde", - "lat": "50.64817", - "lon": "5.50625", - "id": 82303, - "buildings": [], - "intersectedStreets": [ - { - "name": "Avenue Joseph Wauters", - "lat": "50.64641", - "lon": "5.50630" - }, - { - "name": "Rue Mathieu de Lexhy", - "lat": "50.64817", - "lon": "5.50625" - } - ] - }, - { - "name": "Rue Emile Wiket", - "lat": "50.63685", - "lon": "5.50756", - "id": 33491 - }, - { - "name": "Rue Émile Zola (Grâce-Berleur)", - "lat": "50.63152", - "lon": "5.50366", - "id": 85835 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Auderghem - Oudergem", - "names": { - "ru": "Одергем", - "fr": "Auderghem", - "nl": "Oudergem" - }, - "lat": "50.81566", - "lon": "4.43313", - "id": 66509952, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Steeno - Emile Steenostraat", - "names": { - "fr": "Rue Emile Steeno", - "nl": "Emile Steenostraat" - }, - "lat": "50.81825", - "lon": "4.42961", - "id": 85219 - }, - { - "name": "Rue Emile Idiers - Emile Idiersstraat", - "names": { - "fr": "Rue Émile Idiers", - "nl": "Émile Idiersstraat" - }, - "lat": "50.81685", - "lon": "4.42775", - "id": 14698 - }, - { - "name": "Avenue Emile Laine - Emile Lainelaan", - "names": { - "fr": "Avenue Emile Laine", - "nl": "Emile Lainelaan" - }, - "lat": "50.82567", - "lon": "4.42886", - "id": 242481 - }, - { - "name": "Avenue Gabriel Emile Lebon - Gabriel Emile Lebonlaan", - "names": { - "fr": "Avenue Gabriel Emile Lebon", - "nl": "Gabriel Emile Lebonlaan" - }, - "lat": "50.82135", - "lon": "4.40947", - "id": 2942 - }, - { - "name": "Rue Jules Emile Raymond - Jules Emile Raymondstraat", - "names": { - "fr": "Rue Jules Emile Raymond", - "nl": "Jules Emile Raymondstraat" - }, - "lat": "50.82436", - "lon": "4.40706", - "id": 2943 - }, - { - "name": "Rue Emile Rotiers - Emile Rotiersstraat", - "names": { - "fr": "Rue Emile Rotiers", - "nl": "Emile Rotiersstraat" - }, - "lat": "50.80706", - "lon": "4.43371", - "id": 35715 - }, - { - "name": "Rue Paul Emile Lessire - Paul Emile Lessirestraat", - "names": { - "fr": "Rue Paul Emile Lessire", - "nl": "Paul Emile Lessirestraat" - }, - "lat": "50.80486", - "lon": "4.43676", - "id": 35723 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Grâce-Berleur", - "lat": "50.63233", - "lon": "5.50119", - "id": 746136310, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Zola", - "lat": "50.63152", - "lon": "5.50368", - "id": 85836 - } - ], - "matchStreet": 1 - }, - { - "name": "Fontaine-Valmont", - "lat": "50.32047", - "lon": "4.21396", - "id": 673921851, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.32034", - "lon": "4.21564", - "id": 224569 - } - ], - "matchStreet": 1 - }, - { - "name": "Havré", - "names": { - "ru": "Авре", - "fr": "Havré" - }, - "lat": "50.46435", - "lon": "4.04539", - "id": 480286655, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Jambe", - "lat": "50.46451", - "lon": "4.04593", - "id": 87737 - } - ], - "matchStreet": 1 - }, - { - "name": "Courcelles", - "names": { - "ru": "Курсель" - }, - "lat": "50.46015", - "lon": "4.37634", - "id": 331198493, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Bronchain", - "lat": "50.46448", - "lon": "4.37855", - "id": 146474 - }, - { - "name": "Rue Emile Thilmans", - "lat": "50.44884", - "lon": "4.34926", - "id": 153834 - }, - { - "name": "Rue Émile Duployé", - "lat": "50.46152", - "lon": "4.38764", - "id": 209170 - }, - { - "name": "Rue Émile Vandervelde (Souvret)", - "lat": "50.44548", - "lon": "4.35496", - "id": 209247 - }, - { - "name": "Rue Émile Turlot", - "lat": "50.45805", - "lon": "4.38674", - "id": 131615 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Villers-la-Ville", - "names": { - "ru": "Виллер-ла-Виль" - }, - "lat": "50.57903", - "lon": "4.53242", - "id": 130610211, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Leger", - "lat": "50.57619", - "lon": "4.52744", - "id": 58261 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Charleroi", - "names": { - "ar": "شارلوروا", - "de": "Charleroi", - "ru": "Шарлеруа", - "la": "Caroloregium", - "lt": "Šarlerua", - "wa": "Tchålerwè", - "fr": "Charleroi", - "hu": "Charleroi", - "nl": "Charleroi", - "sr": "Шарлроа" - }, - "lat": "50.41203", - "lon": "4.44363", - "id": 9002746, - "type": "CITY", - "listOfStreets": [ - { - "name": "Boulevard Emile Devreux", - "lat": "50.40749", - "lon": "4.45041", - "id": 240623 - }, - { - "name": "Rue Jules Ruhl", - "names": { - "old_name": "Rue Emile Vandervelde" - }, - "lat": "50.40380", - "lon": "4.40932", - "id": 129009 - }, - { - "name": "Avenue Emile Rousseaux", - "lat": "50.40260", - "lon": "4.42676", - "id": 129025 - }, - { - "name": "Cité Emile Demoulin", - "lat": "50.42149", - "lon": "4.38084", - "id": 206923 - }, - { - "name": "Rue Émile Constant", - "lat": "50.41613", - "lon": "4.38814", - "id": 160846 - }, - { - "name": "Rue Emile Vandervelde (Monceau-sur-Sambre)", - "lat": "50.41589", - "lon": "4.37561", - "id": 212070 - }, - { - "name": "Rue Émile Vandervelde (Lodelinsart)", - "lat": "50.42318", - "lon": "4.45680", - "id": 121979 - }, - { - "name": "Square Émile Buisset", - "lat": "50.38316", - "lon": "4.45341", - "id": 130206 - }, - { - "name": "Rue Emile Brunet", - "lat": "50.39479", - "lon": "4.39303", - "id": 207017 - }, - { - "name": "Rue Émile Nonnon", - "lat": "50.40142", - "lon": "4.44266", - "id": 127156 - }, - { - "name": "Rue Émile Vandervelde (Marcinelle)", - "lat": "50.39180", - "lon": "4.44043", - "id": 140477 - }, - { - "name": "Rue Émile Cliquet", - "lat": "50.39904", - "lon": "4.44820", - "id": 127181 - }, - { - "name": "Place Émile Bertaux", - "lat": "50.46685", - "lon": "4.43161", - "id": 208148 - }, - { - "name": "Rue Emile Fourcault", - "names": { - "old_name": "Rue Frison" - }, - "lat": "50.42237", - "lon": "4.43419", - "id": 208180 - }, - { - "name": "Rue Émile Servais", - "lat": "50.36865", - "lon": "4.40698", - "id": 184629 - }, - { - "name": "Rue des Bateliers (Marchienne-au-Pont)", - "names": { - "old_name": "Rue Émile Vandervelde (Marchienne-au-Pont)" - }, - "lat": "50.40809", - "lon": "4.39500", - "id": 207280 - }, - { - "name": "Rue Émile Vandervelde (Roux)", - "lat": "50.43980", - "lon": "4.37539", - "id": 149937 - }, - { - "name": "Rue Emile Ruiters", - "lat": "50.45205", - "lon": "4.41494", - "id": 160225 - }, - { - "name": "Rue Émile Tumelaire", - "lat": "50.41058", - "lon": "4.44852", - "id": 111096 - }, - { - "name": "Rue Émile Dutrieux", - "lat": "50.40027", - "lon": "4.48126", - "id": 123421 - }, - { - "name": "Place Emile Buisset", - "lat": "50.40651", - "lon": "4.43918", - "id": 223781 - }, - { - "name": "Rue Émile Strimelle", - "lat": "50.43507", - "lon": "4.42573", - "id": 160334 - }, - { - "name": "Rue Saint Emile (Marchienne-au-Pont)", - "lat": "50.42439", - "lon": "4.40146", - "id": 160352 - }, - { - "name": "Place Emile Moureau", - "lat": "50.41287", - "lon": "4.35713", - "id": 204393 - }, - { - "name": "Rue Émile Royer", - "lat": "50.42276", - "lon": "4.41992", - "id": 142974 - }, - { - "name": "Rue Émile Gantois", - "lat": "50.42129", - "lon": "4.41455", - "id": 142984 - }, - { - "name": "Rue Emile Leclercq", - "lat": "50.41667", - "lon": "4.37159", - "id": 219790 - }, - { - "name": "Place Emile Vandevelde", - "lat": "50.41526", - "lon": "4.46159", - "id": 122633 - }, - { - "name": "Rue Émile Thibaut", - "lat": "50.39336", - "lon": "4.40567", - "id": 140119 - }, - { - "name": "Rue Émile Vandervelde (Couillet)", - "lat": "50.39195", - "lon": "4.46837", - "id": 165790 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Morlanwelz", - "names": { - "ru": "Морланве" - }, - "lat": "50.45099", - "lon": "4.25235", - "id": 470539132, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.44815", - "lon": "4.25810", - "id": 143911 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Longdoz", - "lat": "50.63006", - "lon": "5.58065", - "id": 5483428, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Boulevard Emile de Laveleye", - "lat": "50.62324", - "lon": "5.58245", - "id": 32336, - "buildings": [], - "intersectedStreets": [ - { - "name": "Quai Mativa", - "lat": "50.62296", - "lon": "5.58110" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Mont-sur-Marchienne", - "lat": "50.39020", - "lon": "4.40464", - "id": 674001818, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Jules Ruhl", - "names": { - "old_name": "Rue Emile Vandervelde" - }, - "lat": "50.40380", - "lon": "4.40932", - "id": 129010 - }, - { - "name": "Rue Émile Servais", - "lat": "50.36865", - "lon": "4.40698", - "id": 184630 - }, - { - "name": "Rue Émile Thibaut", - "lat": "50.39336", - "lon": "4.40567", - "id": 140120 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Anderlues", - "names": { - "ru": "Андерлю" - }, - "lat": "50.40800", - "lon": "4.26960", - "id": 470539134, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.40499", - "lon": "4.27040", - "id": 142366 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Puhain", - "lat": "50.66048", - "lon": "4.14069", - "id": 3052047966, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Avenue Emile Geerts", - "lat": "50.66049", - "lon": "4.14343", - "id": 69948 - } - ], - "matchStreet": 1 - }, - { - "name": "Fleurus", - "names": { - "ru": "Флёрюс" - }, - "lat": "50.48235", - "lon": "4.55051", - "id": 64802854, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Hautem", - "lat": "50.46282", - "lon": "4.55439", - "id": 128218 - }, - { - "name": "Rue Emile Vandervelde", - "lat": "50.48091", - "lon": "4.54828", - "id": 86932 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Tournai", - "names": { - "ru": "Турне", - "nl": "Doornik" - }, - "lat": "50.60566", - "lon": "3.38782", - "id": 36162975, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Place Paul-Emile Janson", - "lat": "50.60707", - "lon": "3.38933", - "id": 115117 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Beaumont", - "names": { - "ru": "Бомон" - }, - "lat": "50.23553", - "lon": "4.23832", - "id": 64608294, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Culot (Leval-Chaudeville)", - "lat": "50.23679", - "lon": "4.19663", - "id": 164130 - }, - { - "name": "Rue Emile Damien", - "lat": "50.22589", - "lon": "4.19246", - "id": 109463 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Pont-à-Celles", - "names": { - "ru": "Понт-а-Сель" - }, - "lat": "50.51225", - "lon": "4.36174", - "id": 325851346, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Vandervelde (Thiméon)", - "names": { - "alt_name": "Rue Emile Vandervelde (Thiméon)" - }, - "lat": "50.48105", - "lon": "4.43007", - "id": 138441 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Andenne", - "names": { - "ru": "Анден", - "wa": "Andene", - "fr": "Andenne", - "nl": "Andenne" - }, - "lat": "50.49009", - "lon": "5.10439", - "id": 29827642, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Namêche)", - "lat": "50.47495", - "lon": "4.99771", - "id": 214053 - }, - { - "name": "Rue Emile Godfrind", - "lat": "50.49564", - "lon": "5.08858", - "id": 60504 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gembloux", - "names": { - "ru": "Жамблу", - "wa": "Djiblou", - "fr": "Gembloux", - "nl": "Gembloers" - }, - "lat": "50.56055", - "lon": "4.69215", - "id": 60302311, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Émile Labarre", - "lat": "50.59404", - "lon": "4.66848", - "id": 62536 - }, - { - "name": "Rue Émile Somville", - "lat": "50.55672", - "lon": "4.67608", - "id": 66934 - }, - { - "name": "Rue Émile Pirson", - "lat": "50.50821", - "lon": "4.67378", - "id": 32207 - }, - { - "name": "Rue Emile Dewez (Beuzet)", - "lat": "50.54048", - "lon": "4.73045", - "id": 62988 - }, - { - "name": "Rue Emile Marchal", - "lat": "50.50341", - "lon": "4.71610", - "id": 221782 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Nieuwpoort-Bad", - "names": { - "ru": "Ньивпорт-Бад", - "fr": "Nieuport-Bains" - }, - "lat": "51.14781", - "lon": "2.71566", - "id": 61337572, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan", - "lat": "51.14655", - "lon": "2.71811", - "id": 216019 - } - ], - "matchStreet": 1 - }, - { - "name": "Oostduinkerke", - "names": { - "de": "Ostdünkirchen", - "ru": "Остдёйнкерке", - "fr": "Ostdunkerque" - }, - "lat": "51.11563", - "lon": "2.68126", - "id": 720863546, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan", - "names": { - "alt_name": "Verhaerenlaan" - }, - "lat": "51.12650", - "lon": "2.69611", - "id": 132770 - } - ], - "matchStreet": 1 - }, - { - "name": "Sint-Michiels", - "names": { - "fr": "Saint-Michel", - "vls": "Sinte-Machiels" - }, - "lat": "51.18846", - "lon": "3.21116", - "id": 1646090638, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Emile Bethuynelaan", - "lat": "51.16468", - "lon": "3.18908", - "id": 205074 - } - ], - "matchStreet": 1 - }, - { - "name": "Knokke-Heist", - "names": { - "ru": "Кнокке-Хейст", - "fr": "Knocke-Heist", - "vls": "Knokke-Heist" - }, - "lat": "51.33961", - "lon": "3.27021", - "id": 79387375, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Emile Verhaerenlaan (Knokke)", - "lat": "51.35294", - "lon": "3.30388", - "id": 162981 - }, - { - "name": "Emile Raespad", - "lat": "51.33845", - "lon": "3.28395", - "id": 222496 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Floreffe", - "names": { - "ru": "Флореф", - "wa": "Florefe", - "nl": "Floreffe" - }, - "lat": "50.43481", - "lon": "4.75888", - "id": 414028537, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Lessire", - "lat": "50.42733", - "lon": "4.75584", - "id": 221823 - }, - { - "name": "Rue Émile Lorent", - "lat": "50.44791", - "lon": "4.74305", - "id": 93851 - } - ], - "matchStreet": 1 - }, - { - "name": "Limelette", - "names": { - "wa": "Limlete" - }, - "lat": "50.68050", - "lon": "4.57319", - "id": 294064658, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Mathéi", - "lat": "50.68481", - "lon": "4.56971", - "id": 64256 - } - ], - "matchStreet": 1 - }, - { - "name": "Vinalmont", - "names": { - "ru": "Винальмон" - }, - "lat": "50.56275", - "lon": "5.22614", - "id": 725298285, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde", - "lat": "50.55759", - "lon": "5.23247", - "id": 220734 - } - ], - "matchStreet": 1 - }, - { - "name": "Anthée", - "names": { - "wa": "Antêye" - }, - "lat": "50.23953", - "lon": "4.76041", - "id": 348123981, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Emile Collard", - "lat": "50.23974", - "lon": "4.75822", - "id": 151310 - } - ], - "matchStreet": 1 - }, - { - "name": "Belœil", - "names": { - "ru": "Белёй" - }, - "lat": "50.54792", - "lon": "3.73612", - "id": 71013315, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Paul-Emile Janson (Stambruges)", - "lat": "50.50982", - "lon": "3.71883", - "id": 194949 - }, - { - "name": "Rue Emile Carlier (Grandglise)", - "lat": "50.49852", - "lon": "3.70664", - "id": 19932 - }, - { - "name": "Rue Emile Royer (Quevaucamps)", - "lat": "50.53023", - "lon": "3.69550", - "id": 228141 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "La Glanerie", - "names": { - "ru": "Ла-Гланри" - }, - "lat": "50.52984", - "lon": "3.30103", - "id": 661173394, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Clainquart", - "lat": "50.51826", - "lon": "3.29965", - "id": 225871 - } - ], - "matchStreet": 1 - }, - { - "name": "Laeken - Laken", - "names": { - "de": "Laken", - "ru": "Лакен", - "fr": "Laeken", - "nl": "Laken" - }, - "lat": "50.88339", - "lon": "4.34872", - "id": 17428149, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Boulevard Émile Bockstael - Emile Bockstaellaan", - "names": { - "fr": "Boulevard Émile Bockstael", - "nl": "Emile Bockstaellaan" - }, - "lat": "50.87971", - "lon": "4.34777", - "id": 52214 - } - ], - "matchStreet": 1 - }, - { - "name": "Haaltert", - "names": { - "ru": "Халтерт" - }, - "lat": "50.90225", - "lon": "4.00576", - "id": 1630177961, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Burgemeester Emile De Saedeleerstraat", - "lat": "50.89614", - "lon": "3.99982", - "id": 155778 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Nessonvaux", - "names": { - "ru": "Несонво", - "wa": "Nessonvå", - "fr": "Nessonvaux" - }, - "lat": "50.57367", - "lon": "5.73714", - "id": 618759919, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde", - "lat": "50.57363", - "lon": "5.73654", - "id": 162359, - "intersectedStreets": [ - { - "name": "Rue du Général de Gaulle", - "lat": "50.57381", - "lon": "5.73622" - }, - { - "name": "rue du Ruisseau", - "lat": "50.57373", - "lon": "5.73645" - }, - { - "name": "Grand Ventail", - "lat": "50.57386", - "lon": "5.73883" - }, - { - "name": "Rue Bourgmestre Aimé Meunier", - "lat": "50.57386", - "lon": "5.73883" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Profondeville", - "names": { - "ru": "Профондвиль", - "wa": "Parfondveye" - }, - "lat": "50.37765", - "lon": "4.86943", - "id": 265779208, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Mazy (Bois-de-Villers)", - "lat": "50.39044", - "lon": "4.80824", - "id": 185943 - }, - { - "name": "Rue Emile Mahaux", - "lat": "50.37430", - "lon": "4.83750", - "id": 186071 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Rienne", - "names": { - "ru": "Рьен", - "wa": "Riene", - "nl": "Rienne" - }, - "lat": "49.99226", - "lon": "4.88477", - "id": 678992750, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Rue Émile Montreuil", - "lat": "49.99320", - "lon": "4.88578", - "id": 160767 - } - ], - "matchStreet": 1 - }, - { - "name": "Écaussinnes", - "names": { - "ru": "Экоссинн" - }, - "lat": "50.56961", - "lon": "4.17526", - "id": 190299276, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Rue Emile Vandervelde (Cité Pro-Déo)", - "lat": "50.54214", - "lon": "4.17335", - "id": 67705 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Trooz", - "names": { - "ru": "Троз", - "wa": "Li Trô", - "fr": "Trooz" - }, - "lat": "50.57281", - "lon": "5.68836", - "id": 748734269, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Place Emile Vandervelde (Nessonvaux)", - "lat": "50.57363", - "lon": "5.73652", - "id": 162358, - "intersectedStreets": [ - { - "name": "Rue du Général de Gaulle (Nessonvaux)", - "lat": "50.57381", - "lon": "5.73619" - }, - { - "name": "rue du Ruisseau", - "lat": "50.57373", - "lon": "5.73643" - }, - { - "name": "Grand Ventail", - "lat": "50.57386", - "lon": "5.73881" - }, - { - "name": "Rue Bourgmestre Aimé Meunier", - "lat": "50.57386", - "lon": "5.73881" - } - ] - } - ], - "matchStreet": 1 - } - ] -} \ No newline at end of file diff --git a/OsmAnd-java/src/test/resources/search/street_santa_clara.json b/OsmAnd-java/src/test/resources/search/street_santa_clara.json deleted file mode 100644 index 48d7643a62..0000000000 --- a/OsmAnd-java/src/test/resources/search/street_santa_clara.json +++ /dev/null @@ -1,3945 +0,0 @@ -{ - "settings": { - "lat": "41.60200", - "lon": "2.62258", - "radiusLevel": 1, - "totalLimit": -1, - "lang": "", - "transliterateIfMissing": false, - "emptyQueryAllowed": false, - "sortByName": false - }, - "phrase": "santa clara", - "results": [ - "Carrer de Santa Clara, Sant Pol de Mar", - "Santa Clara, Sant Pol de Mar", - "Carrer Santa Clara, Sant Pol de Mar", - "Plaça Santa Clara, Santa Coloma de Farners", - "Carrer del Comte de Santa Clara, Barcelona", - "Carrer del Comte de Santa Clara, la Barceloneta", - "Passatge de Santa Clara, Barcelona", - "Passatge de Santa Clara, Barri Gòtic", - "Baixada de Santa Clara, Barcelona", - "Baixada de Santa Clara, Barri Gòtic", - "Carrer de Santa Clara, Girona", - "Plaça de Santa Clara, Vic", - "Carrer de Santa Clara, Poble Nou", - "Carrer de Santa Clara (Poble Nou), Sant Vicenç dels Horts", - "Carrer Vell de Santa Clara, Manresa", - "Carrer Nou de Santa Clara, Centre Històric", - "Carrer Nou de Santa Clara (Les Escodines), Manresa", - "Carrer de Santa Clara, Masquefa", - "Carrer Santa Clara, Castelló d'Empúries", - "Carrer de Santa Clara, Vilafranca del Penedès", - "Carrer de Santa Clara, Castelló d'Empúries", - "Carrer Clara Campoamor, Santa Coloma de Gramenet" - ], - "amenities": [ - { - "name": "Pastisseria Santa Clara", - "lat": "41.38344", - "lon": "2.17755", - "id": 5954544846, - "subType": "confectionery", - "type": "shop" - }, - { - "name": "Santa Clara del Mullol", - "lat": "42.13905", - "lon": "1.12200", - "id": 865048681, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "building_type_church": "church", - "denomination_catholic": "catholic", - "wikipedia": "http://ca.wikipedia.org/wiki/Santa Clara del Mullol" - } - }, - { - "name": "Santa Clara del Mullol", - "lat": "42.13905", - "lon": "1.12200", - "id": 865048681, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_christian": "christian", - "building_type_church": "church", - "denomination_catholic": "catholic", - "wikipedia": "http://ca.wikipedia.org/wiki/Santa Clara del Mullol" - } - }, - { - "name": "Camping Clarà", - "lat": "41.14908", - "lon": "1.42003", - "id": 8654455984, - "subType": "camp_site", - "type": "tourism", - "additionalInfo": { - "internet_access_type_wlan": "wlan", - "phone": "977643480" - } - }, - { - "name": "Santa Clara / Muralla de Sant Magí", - "lat": "41.34637", - "lon": "1.70142", - "id": 5640608030, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L1", - "operator": "Hispano Igualadina" - } - }, - { - "name": "Santa Clara / Muralla de Sant Magí", - "lat": "41.34637", - "lon": "1.70142", - "id": 5640608030, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L1", - "operator": "Hispano Igualadina" - } - }, - { - "name": "Clarà", - "lat": "41.15131", - "lon": "1.41687", - "id": 8058100256, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "operator": "Autocars del Penedès" - } - }, - { - "name": "Serra d'en Clarà", - "lat": "42.41337", - "lon": "2.97249", - "id": 2483176176, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Jardins de Villa Clara", - "lat": "41.42300", - "lon": "2.18370", - "id": 567550629, - "subType": "park", - "type": "entertainment" - }, - { - "name": "la Vinya de Clarà", - "lat": "42.06712", - "lon": "1.80026", - "id": 740434451, - "subType": "building", - "type": "man_made" - }, - { - "name": "Santa Clara", - "names": { - "ru": "Санта-Клара", - "hu": "Santa Clara" - }, - "lat": "22.40658", - "lon": "-79.96517", - "id": -715772, - "subType": "city", - "type": "administrative", - "additionalInfo": { - "population": "216056" - } - }, - { - "name": "Santa Clara", - "lat": "21.37340", - "lon": "-89.01346", - "id": -625402, - "subType": "town", - "type": "administrative" - }, - { - "name": "Sas - Claramunt", - "lat": "41.43774", - "lon": "2.20424", - "id": 2727197818, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "covered_yes": "yes", - "bench_yes": "yes", - "ref": "13", - "route_bus_ref": "N8, V33", - "operator": "TMB, TUSGSAL" - } - }, - { - "name": "Sas - Claramunt", - "lat": "41.43774", - "lon": "2.20424", - "id": 2727197818, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "covered_yes": "yes", - "bench_yes": "yes", - "ref": "13", - "route_bus_ref": "N8, V33", - "operator": "TMB, TUSGSAL" - } - }, - { - "name": "Enric Clarassó - Collserola", - "lat": "41.41824", - "lon": "2.13394", - "id": 10753200842, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "124", - "operator": "TMB", - "ref": "2446" - } - }, - { - "name": "Castell de Clarà", - "lat": "41.82026", - "lon": "2.08015", - "id": 835556795, - "subType": "castle", - "type": "tourism", - "additionalInfo": { - "wikipedia": "http://ca.wikipedia.org/wiki/Castell de Clarà (Moià)" - } - }, - { - "name": "Castell de Clarà", - "lat": "41.82026", - "lon": "2.08015", - "id": 835556795, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wikipedia": "http://ca.wikipedia.org/wiki/Castell de Clarà (Moià)" - } - }, - { - "name": "Convent de Santa Clara", - "lat": "41.14429", - "lon": "1.09586", - "id": 632415625, - "subType": "place_of_worship", - "type": "tourism" - }, - { - "name": "Convent de Santa Clara", - "lat": "41.14429", - "lon": "1.09586", - "id": 632415625, - "subType": "building", - "type": "man_made" - }, - { - "name": "Riera de Clarà", - "lat": "41.56767", - "lon": "2.39547", - "id": 121597699, - "subType": "stream", - "type": "natural", - "additionalInfo": { - "intermittent": "yes" - } - }, - { - "name": "La Pobla;de Claramunt;Capellades (industrial);La Torre;de Claramunt", - "lat": "41.54382", - "lon": "1.69177", - "id": 3811621392, - "subType": "motorway_junction", - "type": "transportation", - "additionalInfo": { - "operator": "Generalitat de Catalunya" - } - }, - { - "name": "la Torre de Claramunt", - "lat": "41.53529", - "lon": "1.66093", - "id": 2920956646, - "subType": "village", - "type": "administrative", - "additionalInfo": { - "ele": "363", - "population": "1534", - "loc_name": "la Torre Alta" - } - }, - { - "name": "Can Claramunt", - "lat": "41.50662", - "lon": "1.75584", - "id": 730043780, - "subType": "hamlet", - "type": "administrative", - "additionalInfo": { - "ele": "338", - "population": "1284" - } - }, - { - "name": "Portell de Claramunt", - "lat": "42.03669", - "lon": "0.72096", - "id": 3934995340, - "subType": "saddle", - "type": "natural" - }, - { - "name": "Portell de Claramunt", - "lat": "42.03669", - "lon": "0.72096", - "id": 3934995340, - "subType": "mountain_pass", - "type": "transportation" - }, - { - "name": "La Serenitat", - "enName": "The Serenity", - "names": { - "ca": "La Serenitat", - "es": "La Serenidad" - }, - "lat": "41.37051", - "lon": "2.17235", - "id": 8255820054, - "subType": "artwork", - "type": "tourism", - "additionalInfo": { - "artwork_type_sculpture": "sculpture", - "artist_name": "Josep Clarà" - } - }, - { - "name": "Pujada de Santa Clara", - "lat": "40.81249", - "lon": "0.52438", - "id": 293763975, - "subType": "highway_steps", - "type": "transportation" - }, - { - "name": "CAP SANTA CLARA", - "lat": "41.98415", - "lon": "2.82312", - "id": 9695589798, - "subType": "clinic", - "type": "healthcare", - "openingHours": "Mo-Fr 08:00-13:45", - "additionalInfo": { - "wheelchair_yes": "yes", - "opening_hours": "Mo-Fr 08:00-13:45" - } - }, - { - "name": "CAP SANTA CLARA", - "lat": "41.98415", - "lon": "2.82312", - "id": 9695589798, - "subType": "building", - "type": "man_made", - "openingHours": "Mo-Fr 08:00-13:45", - "additionalInfo": { - "wheelchair_yes": "yes", - "opening_hours": "Mo-Fr 08:00-13:45" - } - }, - { - "name": "Clarà", - "lat": "41.98377", - "lon": "1.15425", - "id": 1248480557, - "subType": "isolated_dwelling", - "type": "administrative" - }, - { - "name": "Clarà", - "lat": "41.98377", - "lon": "1.15425", - "id": 1248480557, - "subType": "building", - "type": "man_made" - }, - { - "name": "Riera de Clarà", - "lat": "41.56762", - "lon": "2.39513", - "id": 121597689, - "subType": "stream", - "type": "natural", - "additionalInfo": { - "intermittent": "yes", - "tunnel_waterway": "yes" - } - }, - { - "name": "Riera de Clarà", - "lat": "41.56762", - "lon": "2.39513", - "id": 121597689, - "subType": "tunnel", - "type": "man_made", - "additionalInfo": { - "intermittent": "yes", - "tunnel_waterway": "yes" - } - }, - { - "name": "Roca Clara", - "lat": "42.00205", - "lon": "0.78469", - "id": 2483269388, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Av. Catalana - Clara Campoamor", - "lat": "41.42416", - "lon": "2.22098", - "id": 10508165730, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "ref": "109706", - "route_bus_ref": "B20", - "operator": "Tusgsal" - } - }, - { - "name": "La Pobla;de Claramunt;Capellades (industrial);La Torre;de Claramunt", - "lat": "41.53981", - "lon": "1.69119", - "id": 3811620860, - "subType": "motorway_junction", - "type": "transportation", - "additionalInfo": { - "operator": "Generalitat de Catalunya" - } - }, - { - "name": "lo Camí de Claravalls", - "lat": "41.69330", - "lon": "1.13166", - "id": 4676221044, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Água Clara", - "lat": "-20.43857", - "lon": "-52.87975", - "id": -668935, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "13623" - } - }, - { - "name": "L11 - Santa Clara", - "lat": "41.98301", - "lon": "2.82286", - "id": 1845638164, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "route_bus_ref": "L11", - "operator": "TMG" - } - }, - { - "name": "Plaça de Teresa Claramunt", - "lat": "41.27961", - "lon": "1.98256", - "id": 833025909, - "subType": "garden", - "type": "entertainment" - }, - { - "name": "Monument a Clara Campoamor", - "lat": "41.20150", - "lon": "1.63014", - "id": 4861882840, - "subType": "memorial", - "type": "tourism" - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55458", - "lon": "1.67782", - "id": 1109971453, - "subType": "railway_station", - "type": "transportation", - "additionalInfo": { - "operator": "FGC Ferrocarrils de la Generalitat de Catalunya" - } - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55458", - "lon": "1.67782", - "id": 1109971453, - "subType": "public_transport_station", - "type": "transportation", - "additionalInfo": { - "operator": "FGC Ferrocarrils de la Generalitat de Catalunya" - } - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55458", - "lon": "1.67782", - "id": 1109971453, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "operator": "FGC Ferrocarrils de la Generalitat de Catalunya" - } - }, - { - "name": "Barranc de l'Aigua Clara", - "lat": "42.00002", - "lon": "0.81614", - "id": 464152703, - "subType": "stream", - "type": "natural" - }, - { - "name": "los Claramunts", - "lat": "42.02462", - "lon": "0.69776", - "id": 2483230744, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Cal Claramunt", - "lat": "41.30367", - "lon": "1.64282", - "id": 433901515, - "subType": "residential", - "type": "administrative" - }, - { - "name": "Escola Santa Clara", - "lat": "41.55969", - "lon": "2.08839", - "id": 442494019, - "subType": "school", - "type": "education" - }, - { - "name": "Escola Santa Clara", - "lat": "41.55969", - "lon": "2.08839", - "id": 442494019, - "subType": "building", - "type": "man_made" - }, - { - "name": "Plana de Claravalls", - "lat": "41.68302", - "lon": "1.07932", - "id": 2483359270, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Claramunt", - "lat": "41.55494", - "lon": "1.66915", - "id": 1897419834, - "subType": "survey_point", - "type": "man_made", - "additionalInfo": { - "ele": "460.80", - "note": "This is a point from an official geodetic network. Use it as a reference, but do NOT move it.", - "ref": "39163" - } - }, - { - "name": "Mas Clarà", - "lat": "42.04368", - "lon": "2.78355", - "id": 731046577, - "subType": "building", - "type": "man_made" - }, - { - "name": "Santa Clara", - "lat": "41.40345", - "lon": "2.16128", - "id": 2737036116, - "subType": "bakery", - "type": "shop" - }, - { - "name": "Riera de Clarà", - "lat": "41.55697", - "lon": "2.37290", - "id": 1274625417, - "subType": "stream", - "type": "natural" - }, - { - "name": "Santa Clara", - "lat": "41.72151", - "lon": "1.83532", - "id": 3935268030, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L1" - } - }, - { - "name": "Santa Clara", - "lat": "41.72151", - "lon": "1.83532", - "id": 3935268030, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L1" - } - }, - { - "name": "Riera de Clarà", - "lat": "41.55677", - "lon": "2.37273", - "id": 1274625421, - "subType": "stream", - "type": "natural", - "additionalInfo": { - "tunnel_waterway": "yes" - } - }, - { - "name": "Riera de Clarà", - "lat": "41.55677", - "lon": "2.37273", - "id": 1274625421, - "subType": "tunnel", - "type": "man_made", - "additionalInfo": { - "tunnel_waterway": "yes" - } - }, - { - "name": "Santa Clara de Olimar", - "lat": "-32.92369", - "lon": "-54.94452", - "id": -628542, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "2341" - } - }, - { - "name": "La Fertilitat", - "enName": "The Fertility", - "names": { - "ca": "La Fertilitat", - "es": "La Fertilidad" - }, - "lat": "41.36990", - "lon": "2.17212", - "id": 10612950182, - "subType": "artwork", - "type": "tourism", - "additionalInfo": { - "artist_name": "Josep Clarà" - } - }, - { - "name": "Escola Guillem de Claramunt", - "lat": "41.20296", - "lon": "1.27761", - "id": 525583849, - "subType": "school", - "type": "education" - }, - { - "name": "Torrent de Clarà", - "lat": "42.20050", - "lon": "1.73588", - "id": 385833345, - "subType": "stream", - "type": "natural" - }, - { - "name": "Collada de Clarà", - "lat": "42.01660", - "lon": "1.46380", - "id": 528127750, - "subType": "saddle", - "type": "natural", - "additionalInfo": { - "ele": "880" - } - }, - { - "name": "Collada de Clarà", - "lat": "42.01660", - "lon": "1.46380", - "id": 528127750, - "subType": "mountain_pass", - "type": "transportation", - "additionalInfo": { - "ele": "880" - } - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55458", - "lon": "1.67514", - "id": 4413636960256, - "subType": "village", - "type": "administrative" - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55458", - "lon": "1.67514", - "id": 4413636960256, - "subType": "residential", - "type": "administrative" - }, - { - "name": "CAP Santa Clara", - "lat": "41.98420", - "lon": "2.82297", - "id": 4400118235136, - "subType": "clinic", - "type": "healthcare" - }, - { - "name": "CAP Santa Clara", - "lat": "41.98420", - "lon": "2.82297", - "id": 4400118235136, - "subType": "building", - "type": "man_made" - }, - { - "name": "Claverol / Santa Clara", - "lat": "41.38642", - "lon": "2.01052", - "id": 6861741690, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "e20", - "operator": "Soler i Sauret, Soler i Sauret, S.A." - } - }, - { - "name": "Santa Clara", - "lat": "41.98238", - "lon": "2.82278", - "id": 6879115086, - "subType": "florist", - "type": "shop" - }, - { - "name": "Estany de Clarà", - "lat": "41.14817", - "lon": "1.42067", - "id": 463745197, - "subType": "water", - "type": "natural" - }, - { - "name": "Convent de Santa Clara", - "lat": "42.25891", - "lon": "3.07639", - "id": 4413972850688, - "subType": "monument", - "type": "tourism" - }, - { - "name": "Convent de Santa Clara", - "lat": "42.25891", - "lon": "3.07639", - "id": 4413972850688, - "subType": "building", - "type": "man_made" - }, - { - "name": "Claverol / Santa Clara", - "lat": "41.38644", - "lon": "2.01056", - "id": 11175822636, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "e20", - "operator": "Soler i Sauret" - } - }, - { - "name": "Claverol / Santa Clara", - "lat": "41.38644", - "lon": "2.01056", - "id": 11175822636, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "e20", - "operator": "Soler i Sauret" - } - }, - { - "name": "Plaça de Clara Campoamor", - "lat": "41.20141", - "lon": "1.63029", - "id": 410285817, - "subType": "park", - "type": "entertainment" - }, - { - "name": "Clarà", - "lat": "41.15118", - "lon": "1.41700", - "id": 8058100254, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "operator": "Autocars del Penedès" - } - }, - { - "name": "Santa Clara", - "lat": "41.73371", - "lon": "2.95099", - "id": 11732311074, - "subType": "cafe", - "type": "sustenance" - }, - { - "name": "Casa Clara", - "lat": "41.45725", - "lon": "2.25224", - "id": 187813925, - "subType": "building", - "type": "man_made" - }, - { - "name": "Parcel·les Clarasó", - "lat": "41.14796", - "lon": "1.09232", - "id": 803598451, - "subType": "residential", - "type": "administrative" - }, - { - "name": "Rosa Leveroni - Teresa Claramunt", - "lat": "41.38594", - "lon": "2.05929", - "id": 10829545194, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L30", - "operator": "Rosanbus", - "ref": "109953" - } - }, - { - "name": "Sas - Claramunt", - "lat": "41.43774", - "lon": "2.20415", - "id": 10510567904, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_yes": "yes", - "bench_yes": "yes", - "ref": "13", - "route_bus_ref": "V33", - "operator": "TMB" - } - }, - { - "name": "Pont de Clarà", - "lat": "42.06679", - "lon": "1.79620", - "id": 716008887, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bridge_car": "yes", - "route_bus_ref": "777", - "ref": "C-26" - } - }, - { - "name": "L11 - Santa Clara", - "lat": "41.98503", - "lon": "2.82342", - "id": 1404566956, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "tactile_paving_no": "no", - "bench_no": "no", - "route_bus_ref": "L11", - "operator": "TMG" - } - }, - { - "name": "Clarà", - "lat": "42.34992", - "lon": "3.12125", - "id": 2483196000, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Plaça del Claramunt", - "lat": "41.57170", - "lon": "1.64291", - "id": 1053371799, - "subType": "park", - "type": "entertainment" - }, - { - "name": "Casa Clara", - "lat": "42.25887", - "lon": "3.07606", - "id": 3419684236, - "subType": "guest_house", - "type": "tourism" - }, - { - "name": "Ca la Clara", - "lat": "41.39185", - "lon": "1.67001", - "id": 8283628062, - "subType": "isolated_dwelling", - "type": "administrative" - }, - { - "name": "Clara-Hilda-Felsen", - "lat": "50.14099", - "lon": "8.38184", - "id": -168805, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Plans de Can Claramunt", - "lat": "41.53155", - "lon": "1.89094", - "id": 2483099238, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Passatge de Mossén Félix Clara", - "lat": "41.23632", - "lon": "1.81004", - "id": 476380099, - "subType": "highway_steps", - "type": "transportation" - }, - { - "name": "Escultor Clarà", - "lat": "41.44922", - "lon": "2.22662", - "id": 747927549, - "subType": "parking", - "type": "transportation", - "additionalInfo": { - "operator": "Engestur" - } - }, - { - "name": "Biblioteca Clarà", - "lat": "41.39977", - "lon": "2.12959", - "id": 339649943, - "subType": "library", - "type": "education", - "openingHours": "Mo-Tu 15:30-20:30; We-Th 10:00-14:00, 15:30-20:30; Fr 15:30-20:30; Sa 10:00-14:00", - "additionalInfo": { - "opening_hours": "Mo-Tu 15:30-20:30; We-Th 10:00-14:00, 15:30-20:30; Fr 15:30-20:30; Sa 10:00-14:00", - "website": "http://www.barcelona.cat/bibclara", - "phone": "+34932801547", - "email": "b.barcelona.cl@diba.cat" - } - }, - { - "name": "Juan Rodríguez Clara", - "lat": "17.99275", - "lon": "-95.40399", - "id": -649830, - "subType": "town", - "type": "administrative" - }, - { - "name": "Pujada de Santa Clara", - "lat": "40.81243", - "lon": "0.52430", - "id": 293754605, - "subType": "highway_steps", - "type": "transportation" - }, - { - "name": "Castell de Claravalls", - "lat": "41.70273", - "lon": "1.12633", - "id": 4654764994, - "subType": "castle", - "type": "tourism" - }, - { - "name": "Camí de Can Claramunt", - "lat": "41.30515", - "lon": "1.64327", - "id": 304550037, - "subType": "bridge", - "type": "man_made", - "additionalInfo": { - "bicycle_yes": "yes", - "bridge_car": "yes" - } - }, - { - "name": "Claramunt", - "lat": "42.17865", - "lon": "0.78269", - "id": 1803024068, - "subType": "village", - "type": "administrative", - "additionalInfo": { - "website": "http://www.ajuntamentdetremp.cat/ca/viure-a-tremp/nuclis-agregats/claramunt", - "ele": "1095", - "population": "1", - "wikipedia": "http://ca.wikipedia.org/wiki/Claramunt" - } - }, - { - "name": "Plaça Beatriu de Claramunt", - "lat": "41.22341", - "lon": "1.71415", - "id": 238406017, - "subType": "square", - "type": "man_made", - "additionalInfo": { - "lit_yes": "yes" - } - }, - { - "name": "Biblioteca Clarà", - "lat": "41.39967", - "lon": "2.12967", - "id": 339649929, - "subType": "building", - "type": "man_made" - }, - { - "name": "Claravalls", - "lat": "41.70230", - "lon": "1.12676", - "id": 4654765000, - "subType": "village", - "type": "administrative", - "additionalInfo": { - "website": "http://www.tarrega.cat/m_claravalls.html", - "population": "149", - "wikipedia": "http://ca.wikipedia.org/wiki/Claravalls" - } - }, - { - "name": "Av. de la Roureda - Escultor Clarà", - "lat": "41.31998", - "lon": "2.00782", - "id": 10450149214, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L86, N14", - "operator": "Mohn", - "ref": "104769" - } - }, - { - "name": "Sant Andreu de Clarà", - "lat": "42.00152", - "lon": "1.45356", - "id": 627599319, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "denomination_roman_catholic": "roman_catholic" - } - }, - { - "name": "Sant Andreu de Clarà", - "lat": "42.00152", - "lon": "1.45356", - "id": 627599319, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_christian": "christian", - "denomination_roman_catholic": "roman_catholic" - } - }, - { - "name": "Monestir de Santa Clara", - "lat": "42.26054", - "lon": "3.04780", - "id": 1058163091, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "denomination_catholic": "catholic", - "website": "http://www.clarissesfortia.cat/" - } - }, - { - "name": "Monestir de Santa Clara", - "lat": "42.26054", - "lon": "3.04780", - "id": 1058163091, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_christian": "christian", - "denomination_catholic": "catholic", - "website": "http://www.clarissesfortia.cat/" - } - }, - { - "name": "Masia de Clara", - "lat": "41.99348", - "lon": "0.77533", - "id": 6794112822, - "subType": "isolated_dwelling", - "type": "administrative" - }, - { - "name": "Sas - Claramunt", - "lat": "41.43769", - "lon": "2.20417", - "id": 10318316416, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "N8, 60", - "operator": "TMB, TUSGSAL", - "ref": "13" - } - }, - { - "name": "Fruites Claramunt", - "lat": "41.23362", - "lon": "1.73809", - "id": 8593845122, - "subType": "greengrocer", - "type": "shop", - "additionalInfo": { - "website": "http://www.fruitesclaramunt.com", - "phone": "938932704", - "email": "gerencia@fruitesclaramunt.com" - } - }, - { - "name": "Águas Claras", - "lat": "-15.84199", - "lon": "-48.02813", - "id": -695185, - "subType": "city", - "type": "administrative", - "additionalInfo": { - "population": "135685" - } - }, - { - "name": "Puig Clarà", - "lat": "42.13279", - "lon": "2.73828", - "id": 6418222344, - "subType": "peak", - "type": "natural", - "additionalInfo": { - "ele": "315", - "wikipedia": "http://ca.wikipedia.org/wiki/Puig Clarà" - } - }, - { - "name": "Riera de Clarà", - "lat": "41.56343", - "lon": "2.38547", - "id": 401272355, - "subType": "stream", - "type": "natural" - }, - { - "name": "Puig Clarà (Panoràmica del Pirineu)", - "lat": "42.13286", - "lon": "2.73828", - "id": 6418222342, - "subType": "viewpoint", - "type": "tourism" - }, - { - "name": "Puig Clarà (Panoràmica de l'Estany)", - "lat": "42.13262", - "lon": "2.73871", - "id": 6418222340, - "subType": "viewpoint", - "type": "tourism" - }, - { - "name": "Castell de Claramunt", - "lat": "41.55502", - "lon": "1.66924", - "id": 526389675, - "subType": "castle", - "type": "tourism", - "additionalInfo": { - "wikipedia": "http://ca.wikipedia.org/wiki/Castell de Claramunt" - } - }, - { - "name": "Castell de Claramunt", - "lat": "41.55502", - "lon": "1.66924", - "id": 526389675, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "wikipedia": "http://ca.wikipedia.org/wiki/Castell de Claramunt" - } - }, - { - "name": "Xiringuito Clara", - "lat": "41.11885", - "lon": "1.27422", - "id": 1722045680, - "subType": "bar", - "type": "sustenance" - }, - { - "name": "Pl. Santa Clara", - "lat": "41.93107", - "lon": "2.25542", - "id": 6442740362, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_yes": "yes", - "bench_yes": "yes", - "route_bus_ref": "L-1, L-2, L3, L8", - "operator": "Sagalés" - } - }, - { - "name": "Av. Catalana - Clara Campoamor", - "lat": "41.42434", - "lon": "2.22087", - "id": 11219586540, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "ref": "109700", - "route_bus_ref": "B20", - "operator": "Tusgsal" - } - }, - { - "name": "Av. Catalana - Clara Campoamor", - "lat": "41.42434", - "lon": "2.22087", - "id": 11219586540, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "ref": "109700", - "route_bus_ref": "B20", - "operator": "Tusgsal" - } - }, - { - "name": "Clarassó", - "lat": "41.14754", - "lon": "1.09185", - "id": 6797558650, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L20", - "operator": "Reus Transport", - "ref": "32" - } - }, - { - "name": "Clarassó", - "lat": "41.14754", - "lon": "1.09185", - "id": 6797558650, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L20", - "operator": "Reus Transport", - "ref": "32" - } - }, - { - "name": "Serra d'en Clarà", - "lat": "41.29833", - "lon": "1.11417", - "id": 2483582362, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Av. Catalana - Clara Campoamor", - "lat": "41.42421", - "lon": "2.22102", - "id": 11194748624, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "ref": "109706", - "route_bus_ref": "B20", - "operator": "Tusgsal" - } - }, - { - "name": "Av. Catalana - Clara Campoamor", - "lat": "41.42421", - "lon": "2.22102", - "id": 11194748624, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "ref": "109706", - "route_bus_ref": "B20", - "operator": "Tusgsal" - } - }, - { - "name": "Restaurant Santa Clara", - "lat": "42.05465", - "lon": "3.20520", - "id": 6547212138, - "subType": "restaurant", - "type": "sustenance", - "additionalInfo": { - "cuisine_regional": "regional" - } - }, - { - "name": "Clarà", - "lat": "42.11861", - "lon": "2.12013", - "id": 11086621508, - "subType": "historic_ruins", - "type": "tourism" - }, - { - "name": "Apartaments Rosa Clara", - "lat": "41.70132", - "lon": "2.84823", - "id": 8424184200, - "subType": "guest_house", - "type": "tourism" - }, - { - "name": "Carrer Nou de Santa Clara", - "lat": "40.81219", - "lon": "0.52340", - "id": 293754645, - "subType": "highway_steps", - "type": "transportation" - }, - { - "name": "Hostal Santa Clara", - "lat": "42.05473", - "lon": "3.20522", - "id": 641447779, - "subType": "guest_house", - "type": "tourism", - "additionalInfo": { - "internet_access_fee_no": "no", - "internet_access_type_wlan": "wlan", - "website": "http://www.hostalsantaclara.com/" - } - }, - { - "name": "Hostal Santa Clara", - "lat": "42.05473", - "lon": "3.20522", - "id": 641447779, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "internet_access_fee_no": "no", - "internet_access_type_wlan": "wlan", - "website": "http://www.hostalsantaclara.com/" - } - }, - { - "name": "Clarà", - "lat": "42.00280", - "lon": "1.45721", - "id": 3352724304, - "subType": "hamlet", - "type": "administrative", - "additionalInfo": { - "wikipedia": "http://ca.wikipedia.org/wiki/Clarà (Castellar de la Ribera)" - } - }, - { - "name": "Molí de Clarà", - "lat": "42.11685", - "lon": "2.11622", - "id": 11086126678, - "subType": "building", - "type": "man_made" - }, - { - "name": "Clot de Claravalls", - "lat": "41.70515", - "lon": "1.14762", - "id": 4675833070, - "subType": "locality", - "type": "administrative" - }, - { - "name": "M. Clara Pujadas i Gil", - "lat": "41.44168", - "lon": "2.22111", - "id": 5903020870, - "subType": "pharmacy", - "type": "healthcare", - "openingHours": "Mo-Fr 09:00-14:00,16:30-20:30;Sa 09:00-14:00", - "additionalInfo": { - "wheelchair_limited": "limited", - "opening_hours": "Mo-Fr 09:00-14:00,16:30-20:30;Sa 09:00-14:00", - "phone": "+34933882482", - "wheelchair_description": "Porta no adaptada" - } - }, - { - "name": "Monestir de Santa Clara", - "lat": "41.72034", - "lon": "1.83555", - "id": 4404046389248, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "denomination_catholic": "catholic" - } - }, - { - "name": "Monestir de Santa Clara", - "lat": "41.72034", - "lon": "1.83555", - "id": 4404046389248, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_christian": "christian", - "denomination_catholic": "catholic" - } - }, - { - "name": "Balma Clara", - "lat": "41.64691", - "lon": "2.02335", - "id": 3527915368, - "subType": "cave_entrance", - "type": "natural" - }, - { - "name": "Iglesia de San Sadurní de Clará", - "names": { - "ca": "Església de Sant Serni de Clarà", - "es": "Iglesia de San Sadurní de Clará" - }, - "lat": "42.06500", - "lon": "1.80122", - "id": 1184780863, - "subType": "place_of_worship", - "type": "tourism", - "additionalInfo": { - "religion_christian": "christian", - "denomination_roman_catholic": "roman_catholic", - "wikipedia": "http://es.wikipedia.org/wiki/Es:Iglesia_de_San_Sadurní_de_Clará" - } - }, - { - "name": "Iglesia de San Sadurní de Clará", - "names": { - "ca": "Església de Sant Serni de Clarà", - "es": "Iglesia de San Sadurní de Clará" - }, - "lat": "42.06500", - "lon": "1.80122", - "id": 1184780863, - "subType": "building", - "type": "man_made", - "additionalInfo": { - "religion_christian": "christian", - "denomination_roman_catholic": "roman_catholic", - "wikipedia": "http://es.wikipedia.org/wiki/Es:Iglesia_de_San_Sadurní_de_Clará" - } - }, - { - "name": "Mas Clarà", - "lat": "41.98880", - "lon": "2.79967", - "id": 4400107862016, - "subType": "building", - "type": "man_made" - }, - { - "name": "Plaça de Teresa Claramunt", - "lat": "41.36288", - "lon": "2.13974", - "id": 562546723, - "subType": "park", - "type": "entertainment" - }, - { - "name": "Riera de Clarà", - "lat": "41.55540", - "lon": "2.36700", - "id": 457500271, - "subType": "stream", - "type": "natural" - }, - { - "name": "Claravalls", - "lat": "41.70268", - "lon": "1.12573", - "id": 447769179, - "subType": "residential", - "type": "administrative" - }, - { - "name": "Ateneu Carme Claramunt", - "lat": "41.44236", - "lon": "2.22598", - "id": 7112179200, - "subType": "political_party", - "type": "office", - "additionalInfo": { - "wheelchair_no": "no" - } - }, - { - "name": "Av. Catalana - Clara Campoamor", - "lat": "41.42437", - "lon": "2.22093", - "id": 10508165732, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "covered_no": "no", - "bench_no": "no", - "ref": "109700", - "route_bus_ref": "B20", - "operator": "Tusgsal" - } - }, - { - "name": "Mare de Déu del Port - Pl Teresa Claramunt", - "lat": "41.36228", - "lon": "2.13952", - "id": 10686664968, - "subType": "public_transport_platform", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "125", - "operator": "TMB", - "ref": "2493" - } - }, - { - "name": "Clara", - "names": { - "ru": "Клара", - "ga": "Clóirtheach" - }, - "lat": "53.34251", - "lon": "-7.61389", - "id": -695482, - "subType": "town", - "type": "administrative", - "additionalInfo": { - "population": "3242" - } - }, - { - "name": "Plaça de la Mare Santa Clara", - "lat": "41.61315", - "lon": "0.62223", - "id": 673912799, - "subType": "square", - "type": "man_made" - }, - { - "name": "Panteón Silva Pérez y Antonio Leal Da Rosa", - "names": { - "es": "Panteón Silva Pérez y Antonio Leal Da Rosa" - }, - "lat": "41.35270", - "lon": "2.15235", - "id": 9767364056, - "subType": "memorial", - "type": "tourism", - "additionalInfo": { - "architecture_modern": "modern", - "architect_name": "Leandre Albareda i Petit; Enric Clarasó i Daudí" - } - }, - { - "name": "La Sínia de Santa Clara", - "lat": "41.72186", - "lon": "1.83470", - "id": 8135269918, - "subType": "cafe", - "type": "sustenance" - }, - { - "name": "Av. Navarra - Av. Clarasó", - "lat": "41.23141", - "lon": "1.78897", - "id": 4912393974, - "subType": "bus_stop", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L2", - "operator": "TCC" - } - }, - { - "name": "Av. Navarra - Av. Clarasó", - "lat": "41.23141", - "lon": "1.78897", - "id": 4912393974, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "route_bus_ref": "L2", - "operator": "TCC" - } - }, - { - "name": "La Deessa", - "enName": "The Goddess", - "names": { - "it": "La Dea", - "fr": "La Déesse", - "pdc": "Die Göttin", - "ca": "La Deessa", - "es": "La Diosa" - }, - "lat": "41.38644", - "lon": "2.17010", - "id": 10809276276, - "subType": "artwork", - "type": "tourism", - "additionalInfo": { - "artwork_type_sculpture": "sculpture", - "start_date": "1927", - "artist_name": "Josep Clarà i Ayats", - "alt_name": "L'enigma" - } - }, - { - "name": "Panteón Lluisa Denís i Reverter y Santiago Rusiñol", - "names": { - "es": "Panteón Lluisa Denís i Reverter y Santiago Rusiñol" - }, - "lat": "41.35275", - "lon": "2.15197", - "id": 9767364054, - "subType": "memorial", - "type": "tourism", - "additionalInfo": { - "architect_name": "Enric Clarasó i Daudí; Miquel Font\"" - } - }, - { - "name": "345 - Pl. Teresa de Claramunt", - "lat": "41.36312", - "lon": "2.13976", - "id": 7719459490, - "subType": "bicycle_rental", - "type": "service", - "additionalInfo": { - "ele": "48", - "ref": "345", - "capacity": "31", - "operator": "Clear Channel", - "network": "bicing" - } - }, - { - "name": "Clarà", - "lat": "42.12143", - "lon": "1.05763", - "id": 2483255490, - "subType": "locality", - "type": "administrative" - }, - { - "name": "Pla de Clarà", - "lat": "42.13981", - "lon": "1.88411", - "id": 2483106502, - "subType": "locality", - "type": "administrative" - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55519", - "lon": "1.67473", - "id": 2920956126, - "subType": "village", - "type": "administrative", - "additionalInfo": { - "website": "http://www.lapobladeclaramunt.cat", - "ele": "265", - "population": "2295", - "wikipedia": "http://ca.wikipedia.org/wiki/La Pobla de Claramunt" - } - }, - { - "name": "la Pobla de Claramunt", - "lat": "41.55465", - "lon": "1.67790", - "id": 781818710, - "subType": "public_transport_stop_position", - "type": "transportation", - "additionalInfo": { - "route_train_ref": "R6, R60", - "operator": "FGC Ferrocarrils de la Generalitat de Catalunya" - } - }, - { - "name": "Cementiri de la Pobla de Claramunt", - "lat": "41.56495", - "lon": "1.66977", - "id": 467279127, - "subType": "grave_yard", - "type": "tourism" - }, - { - "name": "Santa Maria del Castell de Claramunt", - "lat": "41.55487", - "lon": "1.66960", - "id": 526389869, - "subType": "historic_ruins", - "type": "tourism" - }, - { - "name": "Santa Maria del Castell de Claramunt", - "lat": "41.55487", - "lon": "1.66960", - "id": 526389869, - "subType": "building", - "type": "man_made" - }, - { - "name": "Plaça de Santa Clara", - "lat": "41.93107", - "lon": "2.25546", - "id": 92686665, - "subType": "square", - "type": "man_made" - }, - { - "name": "Plaça de Clara Campoamor", - "lat": "41.62731", - "lon": "0.63287", - "id": 672301789, - "subType": "square", - "type": "man_made" - }, - { - "name": "Santa Clara", - "lat": "13.70230", - "lon": "-88.72792", - "id": -639707, - "subType": "town", - "type": "administrative" - }, - { - "name": "Càmping Clarà", - "lat": "41.14895", - "lon": "1.41998", - "id": 463775793, - "subType": "camp_site", - "type": "tourism" - }, - { - "name": "Riera de Clarà", - "lat": "42.04000", - "lon": "1.82551", - "id": 568585721, - "subType": "stream", - "type": "natural" - }, - { - "name": "Passatge de Santa Clara", - "lat": "41.38389", - "lon": "2.17735", - "id": 109689429, - "subType": "tunnel", - "type": "man_made", - "additionalInfo": { - "access_private": "private", - "tunnel_pedestrian": "yes" - } - }, - { - "name": "Josep Clarà", - "lat": "41.35363", - "lon": "2.15429", - "id": 4696518130, - "subType": "memorial", - "type": "tourism" - } - ], - "cities": [ - { - "name": "Sant Quintí de Mediona", - "lat": "41.46279", - "lon": "1.66522", - "id": 387428854, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer de Clara Campoamor", - "lat": "41.46545", - "lon": "1.66245", - "id": 83553, - "intersectedStreets": [ - { - "name": "Carrer de la Cova", - "lat": "41.46545", - "lon": "1.66245" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "la Barceloneta", - "names": { - "ru": "Барселонета" - }, - "lat": "41.38066", - "lon": "2.18993", - "id": 1433944928, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Carrer del Comte de Santa Clara", - "lat": "41.37831", - "lon": "2.18928", - "id": 13101 - } - ], - "matchStreet": 1 - }, - { - "name": "Cambrils", - "lat": "41.06794", - "lon": "1.06576", - "id": 1470838172, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Josep Clarà", - "lat": "41.08060", - "lon": "1.09483", - "id": 68695 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "la Bisbal d'Empordà", - "lat": "41.95987", - "lon": "3.03961", - "id": 1470838432, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer Josep Vila Clara", - "lat": "41.95585", - "lon": "3.04461", - "id": 60290, - "intersectedStreets": [ - { - "name": "Avinguda de Josep Irla", - "lat": "41.95675", - "lon": "3.04429" - }, - { - "name": "Carrer de Ramon Muntaner", - "lat": "41.95587", - "lon": "3.04461" - }, - { - "name": "Camí de Guardiola", - "lat": "41.95501", - "lon": "3.04491" - } - ] - }, - { - "name": "Carrer Mas Clara", - "lat": "41.96522", - "lon": "3.03965", - "id": 82833, - "intersectedStreets": [ - { - "name": "Carrer Agustí Font", - "lat": "41.96468", - "lon": "3.03847" - }, - { - "name": "Carrer Paral·lel", - "lat": "41.96468", - "lon": "3.03847" - }, - { - "name": "Carrer Jofre el Pilós", - "lat": "41.96522", - "lon": "3.03965" - }, - { - "name": "Carrer Jaume II", - "lat": "41.96568", - "lon": "3.04057" - }, - { - "name": "Carretera Castell d'Empordà", - "lat": "41.96568", - "lon": "3.04057" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sitges", - "lat": "41.23667", - "lon": "1.82281", - "id": 1470839456, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Passatge de Mossèn Fèlix Clarà", - "lat": "41.23587", - "lon": "1.80989", - "id": 3637, - "buildings": [], - "intersectedStreets": [ - { - "name": "Carrer d'en Pau Barrabeig", - "lat": "41.23567", - "lon": "1.80995" - }, - { - "name": "Carrer de la Carreta", - "lat": "41.23562", - "lon": "1.81013" - }, - { - "name": "Carrer Major", - "lat": "41.23633", - "lon": "1.81004" - }, - { - "name": "Carrer de l'Hort de Can Falç", - "lat": "41.23612", - "lon": "1.80993" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Montbau", - "lat": "41.43190", - "lon": "2.14160", - "id": 3170159053, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Carrer de Clarà Ayats", - "lat": "41.43085", - "lon": "2.14128", - "id": 73840, - "buildings": [], - "intersectedStreets": [ - { - "name": "Carrer de Roig i Solé", - "lat": "41.43087", - "lon": "2.14094" - }, - { - "name": "Carrer de la Pintura", - "lat": "41.43085", - "lon": "2.14128" - }, - { - "name": "Carrer de la Música", - "lat": "41.43176", - "lon": "2.14167" - }, - { - "name": "Carrer de la Poesia", - "lat": "41.43254", - "lon": "2.14203" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Lliçà d'Amunt", - "lat": "41.61049", - "lon": "2.23971", - "id": 395368558, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer de Josep Clarà (Ca l'Esteper)", - "lat": "41.61095", - "lon": "2.22164", - "id": 33511, - "intersectedStreets": [ - { - "name": "Carrer de Frederic Marès (Ca l'Esteper)", - "lat": "41.61057", - "lon": "2.22136" - }, - { - "name": "Carrer de Marià Fortuny (Ca l'Esteper)", - "lat": "41.61196", - "lon": "2.22297" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Girona", - "names": { - "be": "Херона", - "ru": "Жирона", - "ko": "지로나", - "pt": "Gerunda", - "gl": "Xirona", - "el": "Ζιρόνα", - "lt": "Cherona", - "fr": "Gérone", - "an": "Chirona", - "es": "Gerona", - "zh": "赫罗纳", - "eu": "Girona", - "ar": "جرندة", - "uk": "Жірона", - "ja": "ジローナ", - "fa": "خرنا", - "he": "ז'ירונה", - "ca": "Girona", - "nl": "Gerona", - "sr": "Ђирона" - }, - "lat": "41.97930", - "lon": "2.81995", - "id": 30894545, - "type": "CITY", - "listOfStreets": [ - { - "name": "Carrer de Josep Clarà i Ayats", - "names": { - "ca": "Carrer de Josep Clarà i Ayats" - }, - "lat": "41.97162", - "lon": "2.82853", - "id": 8256, - "buildings": [], - "intersectedStreets": [ - { - "name": "Carrer de Carles de Bolós", - "names": { - "ca": "Carrer de Carles de Bolós" - }, - "lat": "41.97168", - "lon": "2.82846" - }, - { - "name": "Carrer de Joan Coromines i Vigneaux (Disseminat de Montilivi)", - "names": { - "ca": "Carrer de Joan Coromines i Vigneaux (Disseminat de Montilivi)" - }, - "lat": "41.97168", - "lon": "2.82846" - } - ] - }, - { - "name": "Carrer de Santa Clara", - "names": { - "ca": "Carrer de Santa Clara" - }, - "lat": "41.98495", - "lon": "2.82336", - "id": 586 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Roquetes", - "names": { - "ca": "Roquetes", - "es": "Roquetas" - }, - "lat": "40.82037", - "lon": "0.50344", - "id": 1460477958, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer Santa Clara", - "lat": "40.82056", - "lon": "0.50520", - "id": 11644 - } - ], - "matchStreet": 1 - }, - { - "name": "Palafrugell", - "lat": "41.91837", - "lon": "3.16198", - "id": 1470838631, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Josep Clarà (Tamariu)", - "lat": "41.91745", - "lon": "3.20432", - "id": 69144, - "intersectedStreets": [ - { - "name": "Carrer de Berruguete", - "lat": "41.91750", - "lon": "3.20427" - }, - { - "name": "Carrer de Carles Buïgas (Tamariu)", - "lat": "41.91750", - "lon": "3.20427" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Esparreguera", - "lat": "41.54065", - "lon": "1.86924", - "id": 1460478465, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Josep Clarà", - "lat": "41.52710", - "lon": "1.84793", - "id": 111053, - "intersectedStreets": [ - { - "name": "Carrer de Carles Buïgas", - "lat": "41.52803", - "lon": "1.84725" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sant Just Desvern", - "names": { - "es": "San Justo Desvern" - }, - "lat": "41.38158", - "lon": "2.07506", - "id": 1470838887, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Clara Campoamor", - "lat": "41.38657", - "lon": "2.06114", - "id": 73250, - "intersectedStreets": [ - { - "name": "Carrer de Rosa Leveroni", - "lat": "41.38657", - "lon": "2.06114" - }, - { - "name": "carrer d'Emília Guàrdia", - "lat": "41.38657", - "lon": "2.06114" - }, - { - "name": "Passeig del Camí de Can Gelabert", - "lat": "41.38581", - "lon": "2.06163" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Santa Coloma de Gramenet", - "names": { - "ru": "Санта-Колома-де-Граменет" - }, - "lat": "41.45156", - "lon": "2.20834", - "id": 346353020, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer Clara Campoamor", - "lat": "41.45813", - "lon": "2.19546", - "id": 113362 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Tarragona", - "names": { - "be": "Тарагона", - "ru": "Таррагона", - "ko": "타라고나", - "el": "Ταρραγόνα", - "lt": "Taragona", - "fr": "Tarragone", - "es": "Tarragona", - "zh": "塔拉戈纳", - "ar": "طراغونة", - "la": "Tarraco", - "uk": "Таррагона", - "ja": "タラゴナ", - "fa": "تاراگونا", - "he": "טרגונה", - "sr": "Тарагона" - }, - "lat": "41.11724", - "lon": "1.25461", - "id": 152377920, - "type": "CITY", - "listOfStreets": [ - { - "name": "Carrer de Clara Campoamor Rodríguez", - "lat": "41.13584", - "lon": "1.29675", - "id": 38178 - }, - { - "name": "Carrer de Santa Clara", - "lat": "41.11554", - "lon": "1.25678", - "id": 16454 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Viladecans", - "lat": "41.31631", - "lon": "2.01560", - "id": 2375518653, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de l'Escultor Clarà", - "lat": "41.31940", - "lon": "2.00788", - "id": 41627, - "intersectedStreets": [ - { - "name": "Avinguda Roureda", - "lat": "41.31970", - "lon": "2.00749" - }, - { - "name": "Carrer Joaquim Mir", - "lat": "41.31940", - "lon": "2.00788" - }, - { - "name": "Carrer Pere Sala", - "lat": "41.31908", - "lon": "2.00827" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Ca l'Esteper", - "lat": "41.61069", - "lon": "2.22201", - "id": 926958321, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Carrer de Josep Clarà", - "lat": "41.61097", - "lon": "2.22164", - "id": 33512, - "intersectedStreets": [ - { - "name": "Carrer de Frederic Marès", - "lat": "41.61058", - "lon": "2.22136" - }, - { - "name": "Carrer de Marià Fortuny", - "lat": "41.61198", - "lon": "2.22297" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Tàrrega", - "names": { - "es": "Tárrega" - }, - "lat": "41.64728", - "lon": "1.14090", - "id": 1470839515, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "41.64622", - "lon": "1.13550", - "id": 40000 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Santa Coloma de Farners", - "lat": "41.86031", - "lon": "2.66590", - "id": 1470839251, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Plaça Santa Clara", - "lat": "41.86809", - "lon": "2.65985", - "id": 22434 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Tortosa", - "lat": "40.81102", - "lon": "0.52093", - "id": 1470839509, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "40.81201", - "lon": "0.52355", - "id": 11129 - }, - { - "name": "Carrer Nou de Santa Clara", - "lat": "40.81220", - "lon": "0.52365", - "id": 11130 - }, - { - "name": "Pujada de Santa Clara", - "lat": "40.81243", - "lon": "0.52430", - "id": 54874 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Cardedeu", - "names": { - "ar": "كارديديو", - "uk": "Кардазеу", - "el": "Καρδεδέου" - }, - "lat": "41.63851", - "lon": "2.35584", - "id": 1470838185, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer del Escultor Clarà", - "lat": "41.64439", - "lon": "2.35545", - "id": 46009, - "intersectedStreets": [ - { - "name": "Passeig Font dels Oms", - "lat": "41.64450", - "lon": "2.35502" - }, - { - "name": "Carrer de la Penya", - "lat": "41.64439", - "lon": "2.35545" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sant Vicenç dels Horts", - "lat": "41.39342", - "lon": "2.00994", - "id": 1470839216, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara (Poble Nou)", - "lat": "41.38636", - "lon": "2.01183", - "id": 52370 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "l'Aldea", - "lat": "40.74451", - "lon": "0.61882", - "id": 4642519995, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Raval de Clara", - "lat": "40.75054", - "lon": "0.62440", - "id": 10707 - } - ], - "matchStreet": 1 - }, - { - "name": "Reus", - "names": { - "ru": "Реус", - "uk": "Реус", - "el": "Ρέους", - "lt": "Reusas" - }, - "lat": "41.15555", - "lon": "1.10762", - "id": 152377926, - "type": "CITY", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "41.15378", - "lon": "1.11140", - "id": 88423 - }, - { - "name": "Carrer de l'advocada Clara Campoamor", - "lat": "41.14903", - "lon": "1.09717", - "id": 34460 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Torredembarra", - "lat": "41.14615", - "lon": "1.39595", - "id": 1460478559, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Avinguda de Clarà", - "lat": "41.15148", - "lon": "1.41867", - "id": 90162 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Badalona", - "names": { - "kk": "Бадалона", - "be": "Бадалона", - "ru": "Бадалона", - "ko": "바달로나", - "bg": "Бадалона", - "el": "Μπαδαλόνα", - "sa": "बाडालोना", - "zh": "巴达洛纳", - "ar": "بادالونا", - "hy": "Բադալոնա", - "th": "บาดาโลนา", - "ka": "ბადალონა", - "uk": "Бадалона", - "ja": "バダロナ", - "fa": "بادالونا", - "sr": "Бадалона" - }, - "lat": "41.44935", - "lon": "2.24825", - "id": 52228684, - "type": "CITY", - "listOfStreets": [ - { - "name": "carrer de l'Escultor Clarà", - "lat": "41.44884", - "lon": "2.22741", - "id": 28836, - "intersectedStreets": [ - { - "name": "carrer de l'Estrella", - "lat": "41.44869", - "lon": "2.22550" - }, - { - "name": "carrer del General Moragues", - "lat": "41.44869", - "lon": "2.22550" - }, - { - "name": "carrer del Cid Campeador", - "lat": "41.44852", - "lon": "2.22857" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Garraf", - "lat": "41.25274", - "lon": "1.90248", - "id": 5025041121, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Passatge de Mossèn Fèlix Clarà", - "lat": "41.23587", - "lon": "1.80989", - "id": 3638, - "buildings": [], - "intersectedStreets": [ - { - "name": "Carrer d'en Pau Barrabeig", - "lat": "41.23567", - "lon": "1.80995" - }, - { - "name": "Carrer de la Carreta", - "lat": "41.23562", - "lon": "1.81013" - }, - { - "name": "Carrer Major (Sitges)", - "lat": "41.23633", - "lon": "1.81004" - }, - { - "name": "Carrer de l'Hort de Can Falç", - "lat": "41.23612", - "lon": "1.80993" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Terrassa", - "names": { - "ar": "تاراسا", - "ru": "Террасса", - "el": "Τεράσα", - "lt": "Terasa", - "ca": "Terrassa", - "es": "Tarrasa", - "sr": "Тараса" - }, - "lat": "41.56973", - "lon": "2.01320", - "id": 288139569, - "type": "CITY", - "listOfStreets": [ - { - "name": "Carrer de l'Escultor Clarà (La Maurina)", - "lat": "41.56165", - "lon": "1.99511", - "id": 23480, - "intersectedStreets": [ - { - "name": "Carrer de Felip II (La Maurina)", - "lat": "41.56139", - "lon": "1.99488" - }, - { - "name": "Carrer d'Orà", - "lat": "41.56139", - "lon": "1.99488" - }, - { - "name": "Carrer de Gandia", - "lat": "41.56279", - "lon": "1.99524" - } - ] - }, - { - "name": "Carrer de Clara Campoamor (Can Roca)", - "lat": "41.58287", - "lon": "2.01108", - "id": 15310, - "intersectedStreets": [ - { - "name": "Carrer de Sabadell (Pla del Bon Aire)", - "lat": "41.58263", - "lon": "2.01157" - }, - { - "name": "Carrer de l'Estatut (Can Roca)", - "lat": "41.58263", - "lon": "2.01157" - }, - { - "name": "Passatge de Mercè Rodoreda", - "lat": "41.58287", - "lon": "2.01108" - }, - { - "name": "Carrer de Ferran Casablancas (Can Roca)", - "lat": "41.58301", - "lon": "2.01078" - }, - { - "name": "Carrer d'Anna Frank (Can Roca)", - "lat": "41.58340", - "lon": "2.00998" - } - ] - }, - { - "name": "Carrer de la poetessa Clarà", - "lat": "41.57231", - "lon": "2.02453", - "id": 23007, - "intersectedStreets": [ - { - "name": "Avinguda de Jaume I (Ègara)", - "lat": "41.57150", - "lon": "2.02256" - }, - { - "name": "Carrer de Prat de la Riba (Sant Pere Nord)", - "lat": "41.57150", - "lon": "2.02256" - }, - { - "name": "Carrer de Girona (Sant Pere Nord)", - "lat": "41.57223", - "lon": "2.02352" - }, - { - "name": "Carrer de Josep Maria Palau (Sant Pere Nord)", - "lat": "41.57224", - "lon": "2.02376" - }, - { - "name": "Carrer de Pompeu Fabra (Can Tusell)", - "lat": "41.57234", - "lon": "2.02472" - }, - { - "name": "Carrer del pintor Huguet", - "lat": "41.57234", - "lon": "2.02472" - }, - { - "name": "Carrer de Miguel Palomares", - "lat": "41.57237", - "lon": "2.02511" - }, - { - "name": "Carrer del Doctor Ferran (Sant Pere Nord)", - "lat": "41.57174", - "lon": "2.02271" - }, - { - "name": "Carrer de Provença (Can Tusell)", - "lat": "41.57250", - "lon": "2.02552" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Poble Nou", - "lat": "41.38736", - "lon": "2.01179", - "id": 3179930069, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "41.38636", - "lon": "2.01185", - "id": 52371 - } - ], - "matchStreet": 1 - }, - { - "name": "Sant Pol de Mar", - "names": { - "ca": "Sant Pol de Mar", - "es": "San Pol de Mar" - }, - "lat": "41.60302", - "lon": "2.62380", - "id": 571251818, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Santa Clara", - "lat": "41.60197", - "lon": "2.62189", - "id": 10520 - }, - { - "name": "Carrer Santa Clara", - "lat": "41.60294", - "lon": "2.62316", - "id": 43715 - }, - { - "name": "Carrer de Santa Clara", - "lat": "41.60221", - "lon": "2.62241", - "id": 43725 - } - ], - "matchStreet": 1 - }, - { - "name": "el Catllar", - "lat": "41.17479", - "lon": "1.32559", - "id": 886148666, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Camí del Mas de Clarà", - "lat": "41.15447", - "lon": "1.31885", - "id": 80732 - } - ], - "matchStreet": 1 - }, - { - "name": "Lleida", - "names": { - "ar": "لاردة", - "ru": "Ллейда", - "el": "Λιέιδα", - "lt": "Lerida", - "fr": "Lérida", - "ca": "Lleida", - "es": "Lérida", - "sr": "Љеида" - }, - "lat": "41.61476", - "lon": "0.62678", - "id": 124083658, - "type": "CITY", - "listOfStreets": [ - { - "name": "Plaça de Clara Campoamor", - "lat": "41.62731", - "lon": "0.63285", - "id": 102127 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Gavà", - "lat": "41.30509", - "lon": "2.00631", - "id": 1470838298, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Clara Campoamor", - "lat": "41.30860", - "lon": "1.98805", - "id": 14336, - "intersectedStreets": [ - { - "name": "Carrer de Montserrat Roig", - "lat": "41.30899", - "lon": "1.98657" - }, - { - "name": "Rambla Pompeu Fabra", - "names": { - "ca": "rambla Pompeu Fabra" - }, - "lat": "41.30868", - "lon": "1.99097" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Moià", - "lat": "41.81304", - "lon": "2.09783", - "id": 269726056, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer del Castell de Clarà", - "lat": "41.81331", - "lon": "2.08854", - "id": 34334, - "intersectedStreets": [ - { - "name": "Carrer de Jacint Icart", - "lat": "41.81375", - "lon": "2.08770" - }, - { - "name": "Carrer de Sant Andreu", - "lat": "41.81278", - "lon": "2.08929" - }, - { - "name": "Carrer de Sant Pere", - "lat": "41.81278", - "lon": "2.08929" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Cabrera de Mar", - "lat": "41.52770", - "lon": "2.39251", - "id": 523051419, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "carrer de Clarà", - "lat": "41.52795", - "lon": "2.39953", - "id": 68176, - "intersectedStreets": [ - { - "name": "carrer de Sant Sebastià", - "lat": "41.52839", - "lon": "2.40019" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Vilafant", - "lat": "42.25153", - "lon": "2.94180", - "id": 1460478326, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer de les Closes d'en Clarà", - "lat": "42.25254", - "lon": "2.95376", - "id": 37851, - "intersectedStreets": [ - { - "name": "Carretera de les Forques", - "lat": "42.25247", - "lon": "2.95380" - }, - { - "name": "Avinguda de Maria Torres", - "lat": "42.25285", - "lon": "2.95511" - }, - { - "name": "Cami del Puig Martí", - "lat": "42.25285", - "lon": "2.95511" - }, - { - "name": "Carrer de la Muga", - "lat": "42.25265", - "lon": "2.95412" - }, - { - "name": "Avinguda de les Mèlies", - "lat": "42.25239", - "lon": "2.95077" - }, - { - "name": "Carrer Anyet", - "lat": "42.25243", - "lon": "2.95092" - }, - { - "name": "Carrer Llierca", - "lat": "42.25257", - "lon": "2.95172" - }, - { - "name": "Carrer Arnera", - "lat": "42.25257", - "lon": "2.95255" - }, - { - "name": "Carrer del Fluvià", - "lat": "42.25257", - "lon": "2.95339" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Manresa", - "names": { - "ru": "Манреса", - "ja": "マンレザ" - }, - "lat": "41.72890", - "lon": "1.82867", - "id": 1470838508, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer Vell de Santa Clara", - "lat": "41.72146", - "lon": "1.83283", - "id": 92484 - }, - { - "name": "Carrer Nou de Santa Clara (Les Escodines)", - "lat": "41.72235", - "lon": "1.83070", - "id": 74567 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "les Peces", - "lat": "41.25500", - "lon": "1.50148", - "id": 388127073, - "type": "HAMLET", - "listOfStreets": [ - { - "name": "Carrer Josep Clarà", - "lat": "41.25371", - "lon": "1.50272", - "id": 73976 - } - ], - "matchStreet": 1 - }, - { - "name": "Vic", - "enName": "Vic", - "names": { - "ca": "Vic", - "es": "Vic", - "zh": "比克" - }, - "lat": "41.93020", - "lon": "2.25460", - "id": 1470839536, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer del Molí d'en Clarà", - "lat": "41.91336", - "lon": "2.22297", - "id": 64436, - "intersectedStreets": [ - { - "name": "Carrer del 2 de Novembre de 1930", - "lat": "41.91294", - "lon": "2.22321" - }, - { - "name": "Carrer d'Antoni Vila i Benet", - "lat": "41.91336", - "lon": "2.22297" - }, - { - "name": "Carrer de l'Ermita de Sant Sebastià", - "lat": "41.91379", - "lon": "2.22269" - } - ] - }, - { - "name": "Plaça de Santa Clara", - "lat": "41.93107", - "lon": "2.25546", - "id": 27214 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sant Llorenç Savall", - "lat": "41.67947", - "lon": "2.05796", - "id": 540818296, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer Josep Clara", - "lat": "41.68389", - "lon": "2.05298", - "id": 41474, - "intersectedStreets": [ - { - "name": "Avinguda de Sant Llorenç", - "lat": "41.68294", - "lon": "2.05296" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Barcelona", - "names": { - "de": "Barcelona", - "hi": "बार्सॆलोना", - "be": "Барселона", - "kn": "ಬಾರ್ಸೆಲೋನಾ", - "ru": "Барселона", - "pt": "Barcelona", - "el": "Βαρκελώνη", - "lt": "Barselona", - "it": "Barcellona", - "fr": "Barcelone", - "es": "Barcelona", - "zh": "巴塞罗那", - "eu": "Bartzelona", - "ar": "برشلونة", - "oc": "Barcelona", - "uk": "Барселона", - "ja": "バルセロナ", - "ckb": "بارسێلۆنا", - "ca": "Barcelona", - "sr": "Барселона" - }, - "lat": "41.38289", - "lon": "2.17744", - "id": 152364165, - "type": "CITY", - "listOfStreets": [ - { - "name": "Carrer de Clarà Ayats", - "lat": "41.43085", - "lon": "2.14128", - "id": 73839, - "buildings": [], - "intersectedStreets": [ - { - "name": "Carrer de Roig i Solé", - "lat": "41.43087", - "lon": "2.14094" - }, - { - "name": "Carrer de la Pintura", - "lat": "41.43085", - "lon": "2.14128" - }, - { - "name": "Carrer de la Música (Montbau)", - "lat": "41.43176", - "lon": "2.14167" - }, - { - "name": "Carrer de la Poesia (Montbau)", - "lat": "41.43254", - "lon": "2.14203" - } - ] - }, - { - "name": "Passatge de Santa Clara", - "lat": "41.38386", - "lon": "2.17744", - "id": 29833 - }, - { - "name": "Carrer del Comte de Santa Clara", - "lat": "41.37831", - "lon": "2.18930", - "id": 13100 - }, - { - "name": "Baixada de Santa Clara", - "lat": "41.38381", - "lon": "2.17731", - "id": 2733 - }, - { - "name": "Carrer de Clara Zetkin", - "lat": "41.42394", - "lon": "2.19173", - "id": 95176, - "intersectedStreets": [ - { - "name": "Carrer Gran de la Sagrera", - "names": { - "alt_name": "Carrer de la Sagrera" - }, - "lat": "41.42394", - "lon": "2.19109" - }, - { - "name": "Carrer de Martí Molins", - "lat": "41.42394", - "lon": "2.19109" - }, - { - "name": "Carrer de Berenguer de Palou (la Sagrera)", - "lat": "41.42394", - "lon": "2.19173" - }, - { - "name": "Carrer del Pont del Treball Digne (Sant Martí de Provençals)", - "lat": "41.42394", - "lon": "2.19173" - } - ] - }, - { - "name": "Carrer de Clarà", - "lat": "41.44683", - "lon": "2.19926", - "id": 27484, - "intersectedStreets": [ - { - "name": "Carrer de Campins (Baró de Viver)", - "lat": "41.44720", - "lon": "2.19903" - }, - { - "name": "Carrer de Clariana (Baró de Viver)", - "lat": "41.44683", - "lon": "2.19926" - }, - { - "name": "Carrer de Quito", - "lat": "41.44617", - "lon": "2.19965" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Vilafranca del Penedès", - "names": { - "ca": "Vilafranca del Penedès", - "es": "Villafranca del Panadés" - }, - "lat": "41.34639", - "lon": "1.69951", - "id": 1470839547, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "41.34637", - "lon": "1.70142", - "id": 94174 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Alella", - "names": { - "ru": "Алелья", - "ca": "Alella", - "es": "Alella" - }, - "lat": "41.49529", - "lon": "2.29428", - "id": 523051389, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "riera Coma Clara", - "lat": "41.50716", - "lon": "2.29975", - "id": 67640, - "intersectedStreets": [ - { - "name": "avinguda de Sant Mateu", - "lat": "41.50422", - "lon": "2.29730" - }, - { - "name": "Carretera de Granollers al Masnou", - "lat": "41.50315", - "lon": "2.29524" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "el Prat de Llobregat", - "names": { - "ru": "Эль-Прат-де-Льобрегат", - "ca": "el Prat de Llobregat", - "es": "El Prat de Llobregat" - }, - "lat": "41.32464", - "lon": "2.09526", - "id": 1470838266, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Passatge de Clara Campoamor", - "lat": "41.31949", - "lon": "2.09474", - "id": 95379, - "intersectedStreets": [ - { - "name": "Avinguda de l'Onze de Setembre", - "lat": "41.31956", - "lon": "2.09470" - }, - { - "name": "Carrer de Jaume Codina (les Cases de La Seda)", - "lat": "41.31895", - "lon": "2.09502" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Argentona", - "lat": "41.55543", - "lon": "2.40028", - "id": 1470838014, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de la Riera de Clarà", - "lat": "41.56730", - "lon": "2.39326", - "id": 30303 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Arenys de Mar", - "lat": "41.57971", - "lon": "2.54915", - "id": 1470838013, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer Sta. Clara", - "lat": "41.58398", - "lon": "2.54647", - "id": 47937, - "intersectedStreets": [ - { - "name": "Riera de Pare Fita", - "lat": "41.58406", - "lon": "2.54698" - }, - { - "name": "Pujada de Lourdes", - "names": { - "alt_name": "Pujada de Lourdes" - }, - "lat": "41.58487", - "lon": "2.54516" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "el Vendrell", - "names": { - "ca": "el Vendrell" - }, - "lat": "41.21997", - "lon": "1.53487", - "id": 1470838269, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer Josep Clarà", - "lat": "41.18406", - "lon": "1.53461", - "id": 42024 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "la Sagrera", - "lat": "41.42375", - "lon": "2.18958", - "id": 2875927736, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Carrer de Clara Zetkin", - "lat": "41.42395", - "lon": "2.19173", - "id": 95177, - "intersectedStreets": [ - { - "name": "Carrer Gran de la Sagrera", - "names": { - "alt_name": "Carrer de la Sagrera" - }, - "lat": "41.42397", - "lon": "2.19109" - }, - { - "name": "Carrer de Martí Molins", - "lat": "41.42397", - "lon": "2.19109" - }, - { - "name": "Carrer de Berenguer de Palou", - "lat": "41.42397", - "lon": "2.19173" - }, - { - "name": "Carrer del Pont del Treball Digne", - "lat": "41.42397", - "lon": "2.19173" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Castelló d'Empuries", - "lat": "42.25973", - "lon": "3.07411", - "id": 1949049715, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara (Castelló d'Empúries)", - "lat": "42.25630", - "lon": "3.07744", - "id": 1505 - }, - { - "name": "Carrer Santa Clara (Castelló d'Empúries)", - "lat": "42.25503", - "lon": "3.07317", - "id": 17837 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Olot", - "lat": "42.18222", - "lon": "2.48903", - "id": 1470838619, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Plaça de Clarà", - "lat": "42.18109", - "lon": "2.48503", - "id": 115438, - "intersectedStreets": [ - { - "name": "Carrer del Pare Roca", - "lat": "42.18109", - "lon": "2.48503" - }, - { - "name": "Carrer del Pintor Galwey", - "lat": "42.18109", - "lon": "2.48503" - }, - { - "name": "Avinguda dels Reis Catòlics (Malagrida)", - "lat": "42.18023", - "lon": "2.48428" - }, - { - "name": "Carrer de la Verge de Fàtima (Desemparats)", - "lat": "42.18023", - "lon": "2.48428" - }, - { - "name": "Carrer de l'Escultor Josep Clarà", - "lat": "42.18023", - "lon": "2.48428" - } - ] - }, - { - "name": "Carrer de l'Escultor Josep Clarà", - "lat": "42.18010", - "lon": "2.48454", - "id": 115439, - "intersectedStreets": [ - { - "name": "Avinguda dels Reis Catòlics (Malagrida)", - "lat": "42.18023", - "lon": "2.48428" - }, - { - "name": "Carrer de la Verge de Fàtima (Desemparats)", - "lat": "42.18023", - "lon": "2.48428" - }, - { - "name": "Plaça de Clarà", - "lat": "42.18023", - "lon": "2.48428" - }, - { - "name": "Eix Diagonal (Malagrida)", - "names": { - "es": "eje diagonal (Malagrida)" - }, - "lat": "42.17985", - "lon": "2.48510" - }, - { - "name": "Carrer del Bisbe Vilanova", - "lat": "42.17985", - "lon": "2.48510" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Casserres", - "names": { - "es": "Casserres" - }, - "lat": "42.01382", - "lon": "1.84304", - "id": 303713456, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer Riera de Clarà", - "lat": "42.01364", - "lon": "1.83839", - "id": 27572, - "intersectedStreets": [ - { - "name": "carrer Bisbe Comelles", - "lat": "42.01329", - "lon": "1.83843" - }, - { - "name": "Carrer de Sant Rafel", - "lat": "42.01364", - "lon": "1.83839" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Malgrat de Mar", - "lat": "41.64592", - "lon": "2.74141", - "id": 1460478645, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer de l'Escultor Clarà", - "lat": "41.64515", - "lon": "2.73362", - "id": 85646, - "intersectedStreets": [ - { - "name": "Avinguda dels Països Catalans", - "lat": "41.64418", - "lon": "2.73021" - }, - { - "name": "Carrer d'Enric Borràs", - "lat": "41.64446", - "lon": "2.73111" - }, - { - "name": "Carrer de Joan Esquena i Torró", - "lat": "41.64455", - "lon": "2.73150" - }, - { - "name": "Carrer de Manuel de Falla", - "lat": "41.64487", - "lon": "2.73266" - }, - { - "name": "Avinguda de la Costa Brava", - "lat": "41.64523", - "lon": "2.73508" - }, - { - "name": "Avinguda de la Verge de Montserrat", - "lat": "41.64523", - "lon": "2.73508" - } - ] - } - ], - "matchStreet": 1 - }, - { - "name": "Berga", - "lat": "42.10114", - "lon": "1.84547", - "id": 1470838103, - "type": "TOWN", - "listOfStreets": [ - { - "name": "Pont de Clarà", - "lat": "42.06680", - "lon": "1.79620", - "id": 103909 - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Sant Cugat del Vallès", - "names": { - "es": "San Cugat del Vallés" - }, - "lat": "41.47285", - "lon": "2.08178", - "id": 1470838828, - "type": "TOWN", - "listOfStreets": [ - { - "name": "carrer de Josep Clarà", - "lat": "41.47341", - "lon": "2.07253", - "id": 47376, - "intersectedStreets": [ - { - "name": "Carrer de Domènec Oristrell", - "lat": "41.47304", - "lon": "2.07208" - }, - { - "name": "Carrer de Manel Farrés", - "lat": "41.47341", - "lon": "2.07253" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Barri Gòtic", - "enName": "Gothic Quarter", - "names": { - "de": "Gotisches Viertel", - "ru": "Готический квартал", - "uk": "Готичний квартал", - "he": "הרובע הגותי", - "es": "Barrio Gótico" - }, - "lat": "41.38339", - "lon": "2.17690", - "id": 1433947776, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Passatge de Santa Clara", - "lat": "41.38384", - "lon": "2.17742", - "id": 29834 - }, - { - "name": "Baixada de Santa Clara", - "lat": "41.38381", - "lon": "2.17729", - "id": 2734 - } - ], - "matchStreet": 1 - }, - { - "name": "Sant Adrià de Besòs", - "names": { - "ca": "Sant Adrià de Besòs", - "es": "San Adrián de Besós" - }, - "lat": "41.43048", - "lon": "2.21827", - "id": 1470838823, - "type": "TOWN", - "listOfStreets": [ - { - "name": "carrer de Clara Campoamor", - "lat": "41.42384", - "lon": "2.21958", - "id": 37759, - "intersectedStreets": [ - { - "name": "Ronda del Barcelonés", - "lat": "41.42344", - "lon": "2.21900" - }, - { - "name": "Carrer de Vicenç Ferrer (la Catalana)", - "lat": "41.42384", - "lon": "2.21958" - }, - { - "name": "Avinguda de la Catalana", - "lat": "41.42453", - "lon": "2.22050" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Masquefa", - "lat": "41.50263", - "lon": "1.81107", - "id": 1460478685, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "41.49762", - "lon": "1.81457", - "id": 48462 - } - ], - "matchStreet": 1 - }, - { - "name": "Albinyana", - "lat": "41.24547", - "lon": "1.48674", - "id": 395228508, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer Josep Clarà (les Peces)", - "lat": "41.25373", - "lon": "1.50272", - "id": 73975 - } - ], - "matchStreet": 1 - }, - { - "name": "l'Hospitalet de Llobregat", - "names": { - "ru": "Оспиталет-де-Льобрегат", - "el": "Οσπιταλέτ ντε Λιοβρεγάτ", - "ca": "l'Hospitalet de Llobregat", - "es": "Hospitalet de Llobregat", - "sr": "Лоспиталет де Љобрегат" - }, - "lat": "41.35986", - "lon": "2.09978", - "id": 939880925, - "type": "CITY", - "listOfStreets": [ - { - "name": "Carrer de Clara Campoamor (la Torrassa)", - "lat": "41.36687", - "lon": "2.12330", - "id": 92544, - "intersectedStreets": [ - { - "name": "Carrer de Santa Eulàlia", - "lat": "41.36657", - "lon": "2.12341" - }, - { - "name": "Carrer d'Àngel Guimerà (Santa Eulàlia)", - "lat": "41.36657", - "lon": "2.12341" - }, - { - "name": "Passatge de Salvadors", - "lat": "41.36752", - "lon": "2.12304" - } - ] - }, - { - "name": "Carrer de Clara Campoamor (el Gornal)", - "lat": "41.35671", - "lon": "2.11513", - "id": 36260, - "intersectedStreets": [ - { - "name": "Travessia Industrial", - "lat": "41.35819", - "lon": "2.11397" - }, - { - "name": "Carrer de Colom (el Gornal)", - "lat": "41.35768", - "lon": "2.11437" - }, - { - "name": "Carrer de Caterina Albert (el Gornal)", - "lat": "41.35671", - "lon": "2.11513" - }, - { - "name": "Avinguda d'Amèrica", - "lat": "41.35666", - "lon": "2.11517" - } - ] - } - ], - "init": 1, - "matchStreet": 1 - }, - { - "name": "Castelló d'Empúries", - "names": { - "es": "Castellón de Ampurias" - }, - "lat": "42.25910", - "lon": "3.07465", - "id": 130118172, - "type": "VILLAGE", - "listOfStreets": [ - { - "name": "Carrer de Santa Clara", - "lat": "42.25630", - "lon": "3.07744", - "id": 1506 - }, - { - "name": "Carrer Santa Clara", - "lat": "42.25503", - "lon": "3.07317", - "id": 17838 - } - ], - "matchStreet": 1 - }, - { - "name": "Centre Històric", - "lat": "41.72340", - "lon": "1.82701", - "id": 4356132667, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Carrer Nou de Santa Clara", - "lat": "41.72235", - "lon": "1.83073", - "id": 74569 - } - ], - "matchStreet": 1 - }, - { - "name": "La Maurina", - "lat": "41.56081", - "lon": "1.99582", - "id": 3427894669, - "type": "SUBURB", - "listOfStreets": [ - { - "name": "Carrer de l'Escultor Clarà", - "lat": "41.56163", - "lon": "1.99511", - "id": 23481, - "intersectedStreets": [ - { - "name": "Carrer de Felip II", - "lat": "41.56137", - "lon": "1.99488" - }, - { - "name": "Carrer d'Orà", - "lat": "41.56137", - "lon": "1.99488" - }, - { - "name": "Carrer de Gandia", - "lat": "41.56277", - "lon": "1.99524" - } - ] - } - ], - "matchStreet": 1 - } - ] -} \ No newline at end of file diff --git a/OsmAnd-telegram/AndroidManifest.xml b/OsmAnd-telegram/AndroidManifest.xml index 7b2a96c236..73e2e856ca 100644 --- a/OsmAnd-telegram/AndroidManifest.xml +++ b/OsmAnd-telegram/AndroidManifest.xml @@ -20,7 +20,7 @@ android:screenOrientation="unspecified" android:supportsRtl="true" android:theme="@style/AppTheme"> - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd-telegram/res/layout/fragement_settings_dialog.xml b/OsmAnd-telegram/res/layout/fragement_settings_dialog.xml index 928ad6f319..1c5738a313 100644 --- a/OsmAnd-telegram/res/layout/fragement_settings_dialog.xml +++ b/OsmAnd-telegram/res/layout/fragement_settings_dialog.xml @@ -447,6 +447,50 @@ + + + + + + + + + + + + + + diff --git a/OsmAnd-telegram/res/layout/item_description_long.xml b/OsmAnd-telegram/res/layout/item_description_long.xml new file mode 100644 index 0000000000..6face5220f --- /dev/null +++ b/OsmAnd-telegram/res/layout/item_description_long.xml @@ -0,0 +1,18 @@ + + diff --git a/OsmAnd-telegram/res/values-ar/strings.xml b/OsmAnd-telegram/res/values-ar/strings.xml index 03d5de2dc8..1fb4149e0b 100644 --- a/OsmAnd-telegram/res/values-ar/strings.xml +++ b/OsmAnd-telegram/res/values-ar/strings.xml @@ -67,7 +67,7 @@ تطبيق مفعل الوحدات والأشكال - اختيار الوحدات: كم، ميل، ميل بحري.. إلخ. + اختيار الوحدات: كم، ميل، ميلٌ بحري.. إلخ. وحدات الطول آخر تحديث من تيليجرام: %1$s الرد الأخير:٪ 1 $ s diff --git a/OsmAnd-telegram/res/values-be/strings.xml b/OsmAnd-telegram/res/values-be/strings.xml index 47b4a67654..e1c5661a33 100644 --- a/OsmAnd-telegram/res/values-be/strings.xml +++ b/OsmAnd-telegram/res/values-be/strings.xml @@ -30,7 +30,7 @@ Яшчэ не знойдзена Пераадправіць звесткі аб месцазнаходжанні Апошняе даступнае месца - "Статус абмену " + Статус абмену Абмен: %1$s Уключана Статус @@ -64,7 +64,7 @@ Як выключыць назіральнік OsmAnd праз Telegram Як выключыць назіральнік OsmAnd праз Тэлеграм Падлучаны акаўнт - Рахунак + Акаўнт у %1$s Абраць версію OsmAnd, якую OsmAnd Tracker будзе выкарыстоўваць для адлюстравання пазіцыі. Злучэнне з OsmAnd @@ -75,7 +75,7 @@ Вызначыць мінімальны інтэрвал для абмену інфармацыяй аб месцазнаходжанні. Адправіць маё месцазнаходжанне Пазіцыя - "Час абмену " + Час абмену Сыходзіць Абмен уключаны (выключыць) Выключыць абмен @@ -85,7 +85,7 @@ Рэгістрацыя ў Telegram Для абмену вам неабходны акаўнт Тэлеграм. Калі ласка, ўсталюйце Тэлеграм і наладзьце акаўнт. - Пасля гэтага вы зможаце выкарыстоўваць дадатак. + Пасля гэтага вы зможаце выкарыстоўваць праграму. Усе Выкл Вам неабходна мець акаўнт Тэлеграм і нумар тэлефона @@ -125,7 +125,7 @@ Працягнуць Скасаваць Налады - Дадатак не мае дазволу на доступ да даных аб месцазнаходжанні. + Праграма не мае дазволу на доступ да даных аб месцазнаходжанні. Калі ласка, ўключыце \"Месцазнаходжанне\" ў сістэмных наладах Абярыце аднаго пастаўшчыка месцазнаходжання, каб падзяліцца сваім месцазнаходжаннем. Фонавы рэжым @@ -168,9 +168,7 @@ г хвіл сек - - Назіральнік OsmAnd Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.
-
Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.
+ Назіральнік OsmAnd Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.

Праграма выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.
Маё месцазнаходжанне Зараз дзейнічае Адправіць месцазнаходжанне як @@ -202,7 +200,7 @@ Уключыць маніторынг, каб захоўваць пункты месцазнаходжання ў гісторыі. Назіральнік OsmAnd Telegram - Telegram (дадатак для ліставання) выкарыстоўваецца для зносін паміж людзьмі. + Telegram (праграма для ліставання) выкарыстоўваецца для зносін паміж людзьмі. Назіральнік OsmAnd - адзін з кліентаў для адкрытай платформы Telegram. Вашыя кантакты могуць выкарыстоўваць іншы кліент. Націскаючы \"Працягнуць\" вы пагаджаецеся з палітыкай прыватнасці Telegram і OsmAnd. Ухваліць @@ -246,10 +244,10 @@ Даныя для абранага дня адсутнічаюць Няма даных Канец - Пачатак + Запусціць назіральнік Ужыць Абраць час для паказу - Пачатак - дата завяршэння + Дата пачатку - дата завяршэння Захаваныя паведамленні Абярыце часавы пояс, каб паказваць ваш час у паведамленнях. Часавы пояс diff --git a/OsmAnd-telegram/res/values-br/strings.xml b/OsmAnd-telegram/res/values-br/strings.xml new file mode 100644 index 0000000000..3fceee27e4 --- /dev/null +++ b/OsmAnd-telegram/res/values-br/strings.xml @@ -0,0 +1,7 @@ + + + Kinniget + Distreiñ da OsmAnd + %1$e \'zo + FAZI + \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-da/strings.xml b/OsmAnd-telegram/res/values-da/strings.xml index 7ed4c1644b..a6e077e7f8 100644 --- a/OsmAnd-telegram/res/values-da/strings.xml +++ b/OsmAnd-telegram/res/values-da/strings.xml @@ -20,7 +20,7 @@ Tilføj enhed Del placering som Kontakter og grupper som der deles placering med. - "Bekræft log af OsmAnd Tracker, der kan ikke deles placering eller se placering af andre\?" + "Bekræft log af OsmAnd Tracker, der kan ikke deles placering eller se placering af andre\?" Log ud af OsmAnd Tracker\? Navn Efter afstand diff --git a/OsmAnd-telegram/res/values-de/strings.xml b/OsmAnd-telegram/res/values-de/strings.xml index 9b4b7776df..8c12570da5 100644 --- a/OsmAnd-telegram/res/values-de/strings.xml +++ b/OsmAnd-telegram/res/values-de/strings.xml @@ -18,7 +18,7 @@ Standort teilen als Kontakte und Gruppen, die ihren Standort mit Ihnen teilen. Aus OsmAnd Tracker abmelden\? - "Name " + Name Nach Entfernung Nach Namen Nach Gruppe @@ -44,7 +44,7 @@ Meinen Standort senden Position OsmAnd öffnen - "Live " + Live Registrierung in Telegram Sie benötigen ein Telegram-Konto, um die Standortfreigabe nutzen zu können. Bitte installieren Sie Telegram und richten Sie ein Konto ein. @@ -124,7 +124,7 @@ Warten auf Antwort von Telegram Sende Standort Startet - Positioniere..… + Positionierung … Verbindung zum Internet Akkuoptimierungseinstellungen, um die Standortfreigabe zu stabilisieren. Telegram-Passwort @@ -151,9 +151,7 @@ Standort freigeben Wählen Sie einen der Standortanbieter aus, um Ihren Standort freizugeben. Standort teilen - - OsmAnd Tracker ermöglicht es Ihnen, Ihren Standort zu teilen und den anderer in OsmAnd zu sehen.
-
Die App verwendet die API von Telegram, also benötigen Sie ein Telegram-Konto.
+ OsmAnd Tracker ermöglicht es Ihnen, Ihren Standort zu teilen und den anderer in OsmAnd zu sehen.

Die App verwendet die API von Telegram, also benötigen Sie ein Telegram-Konto.
Wählen Sie einen Namen, den Sie noch nicht benutzt haben %1$s hinzugefügt. Hinzufügen @@ -182,7 +180,7 @@ Überwachung deaktiviert Zeit in Bewegung Durchschnittliche Höhe - Durchschnittliche Geschwindigkeit + Durchschnittsgeschwindigkeit In OsmAnd anzeigen Endzeit Startzeit diff --git a/OsmAnd-telegram/res/values-es-rUS/strings.xml b/OsmAnd-telegram/res/values-es-rUS/strings.xml index 7ebaf91070..86bfb79310 100644 --- a/OsmAnd-telegram/res/values-es-rUS/strings.xml +++ b/OsmAnd-telegram/res/values-es-rUS/strings.xml @@ -206,7 +206,7 @@ Aspecto Mostrar puntos GPS Muestra la cantidad de puntos GPS recibidos y enviados. - Aplicar + Aceptar La línea de tiempo es una función disponible ahora de forma gratuita. Desactivar la monitorización Grabación de ubicación activada diff --git a/OsmAnd-telegram/res/values-et/strings.xml b/OsmAnd-telegram/res/values-et/strings.xml index 126490e593..0ddb7950a7 100644 --- a/OsmAnd-telegram/res/values-et/strings.xml +++ b/OsmAnd-telegram/res/values-et/strings.xml @@ -267,4 +267,8 @@ Viimane vastus: %1$s tagasi %1$s tagasi ERR + Ekspordi + Logcati puhver + Vaata ja jaga rakenduse detailseid logisid + Saada ettekanne \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-eu/strings.xml b/OsmAnd-telegram/res/values-eu/strings.xml index 2f2ec29c63..1aa22910d7 100644 --- a/OsmAnd-telegram/res/values-eu/strings.xml +++ b/OsmAnd-telegram/res/values-eu/strings.xml @@ -77,7 +77,7 @@ Atzera Partekatu kokapena Erakutsi mapan - OsmAnd Online GPS Tracker + OsmAnd lineako GPS aztarnaria Telefono zenbakia Telefono zenbakia formatu internazionalean Pasahitza @@ -100,7 +100,7 @@ Distantzia Partekatu kokapena Partekatzen kokapena - OsmAnd Tracker zebitzua + OsmAnd aztarnaria zerbitzua OsmAnd logoa OsmAnd doako edo ordainpeko bertsioa instalatu behar duzu lehenik Instalatu OsmAnd @@ -199,18 +199,18 @@ Bufferraren puntuak gordetzeko gehieneko denbora Bufferraren iraungitze-denbora Iradokita - OsmAnd Tracker-en egoera + OsmAnd aztarnariaren egoera Atzera OsmAnd-era Azken erantzuna: %1$s Telegram-en azken eguneraketa duela %1$s Azken erantzuna duela %1$s duela %1$s - OsmAnd Tracker-ri esker, kokapena partekatu dezakezu eta besteena OsmAnd-en ikus.

Aplikazioak Telegram APIa erabiltzen du eta, beraz, Telegram kontua behar duzu.
+ OsmAnd aztarnaria-ri esker, kokapena partekatu dezakezu eta besteena OsmAnd-en ikus.

Aplikazioak Telegram APIa erabiltzen du eta, beraz, Telegram kontua behar duzu.
Sartu zure Telegram-eko telefono zenbakia nazioarteko formatuan - OsmAnd Tracker atzeko planoan exekutatzen da pantaila itzalita dagoenean. + OsmAnd aztarnaria atzeko planoan exekutatzen da pantaila itzalita dagoenean. Hautatu kokapen-hornitzaileetako bat zure kokapena partekatzeko. Aplikazioak ez du kokapena atzitzeko baimenik. - "Telegramek kode bat bidali dizu OsmAnd-ek zure kontuan saioa hasteko." + Telegramek kode bat bidali dizu OsmAnd-ek zure kontuan saioa hasteko. Bilaketa: Taldea edo kontaktua Hautatu kokapena partekatzeko kontaktuak eta taldeak. Ezarri denbora @@ -232,22 +232,22 @@ Ezarri kokapena partekatzeko gutxieneko tartea. Ez da mugitzen Kontaktu bat mugitu zen azken aldia. - Ezkutatu denbora jakin batean mugitu ez diren kontaktuak + Ezkutatu denbora jakin batean mugitu ez diren kontaktuak. OsmAnd konexioa - Aukeratu OsmAnd Tracker-ek posizioak bistaratzeko erabiliko duen OsmAnd bertsioa. + Aukeratu OsmAnd aztarnariak posizioak bistaratzeko erabiliko duen OsmAnd bertsioa. %1$s-n - Nola itzali OsmAnd Tracker Telegram-etik - Nola itzali OsmAnd Tracker Telegram-etik - Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd Tracker saioa atalera. - "Konektatu Internetera Telegram saioa behar bezala amaiatzeko." + Nola itzali OsmAnd aztarnaria Telegram-etik + Nola itzali OsmAnd aztarnaria Telegram-etik + Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd aztarnariaren saioa atalera. + Konektatu Internetera Telegram saioa behar bezala amaiatzeko. Azken erantzuna Kokapena partekatzea itzaltzen du hautatutako txat guztietan (%1$d). Hautatu kontaktuak mapan bistaratzeko OsmAnd bertsioa. Taldearen arabera Izenaren arabera Distantziaren arabera - Amaitu OsmAnd Tracker saioa\? - Ziur zaude OsmAnd Tracker saioa amaitu nahi duzula\? Ezingo duzu kokapena partekatu edo besteen kokapena ikusi + Amaitu OsmAnd aztarnariaren saioa\? + Ziur zaude OsmAnd aztarnariaren saioa amaitu nahi duzula\? Ezingo duzu kokapena partekatu edo besteen kokapena ikusi Zurekin kokapena partekatzen duten kontaktuak eta taldeak. Partekatzen:% 1 $ s Partekatze egoera @@ -255,7 +255,7 @@ Oraindik ez da aurkitu Oraindik ez da bidali Atzeko planoan partekatzea - Itzali bateriaren optimizazioa OsmAnd Trackerrentzat, bat-batean itzali ez dadin bigarren planoan dagoela. + Itzali bateriaren optimizazioa OsmAnd aztarnariarentzat, bat-batean itzali ez dadin bigarren planoan dagoela. Bigarren planoko lana Aldatu bateriaren optimizazio ezarpenak kokapena partekatzea egonkortzeko. Telegram-en erantzunaren zain @@ -265,6 +265,6 @@ Hainbat gailu Telegram kontu bakarrera konektatu nahi badituzu, gailu desberdinak erabili behar dituzu kokapena partekatzeko. Telegrama bezeroan gailuaren IDa sortu eta ikusi dezakezu %1$s txat bota erabiliz. % 2 $ s \"Jarraitu\" sakatuz, Telegram eta OsmAnd pribatutasun-politiken baldintzak onartzen dituzu. - OsmAnd tracker-ek Telegram plataforma irekia erabiltzen duten bezeroetako bat da. Zure kontaktuek Telegram-eko beste edozein bezero erabil dezakete. + OsmAnd aztarnariak Telegram plataforma irekia erabiltzen duten bezeroetako bat da. Zure kontaktuek Telegram-eko beste edozein bezero erabil dezakete. Telegram-eko azken eguneratzea: %1$s \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-fa/strings.xml b/OsmAnd-telegram/res/values-fa/strings.xml index 824443b2c5..13e67eef49 100644 --- a/OsmAnd-telegram/res/values-fa/strings.xml +++ b/OsmAnd-telegram/res/values-fa/strings.xml @@ -38,8 +38,8 @@ yd ft mi - ک‌م - متر + km + m nmi min/m min/km @@ -73,4 +73,9 @@ یکاهای طول را تغییر دهید. یکاهای طول ظاهر + آخرین پاسخ: %1$s پیش + آخرین به‌روزرسانی تلگرام: %1$s پیش + آخرین پاسخ: %1$s + آخرین به‌روزرسانی تلگرام: %1$s + خطا \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-fr/strings.xml b/OsmAnd-telegram/res/values-fr/strings.xml index e010baf46b..4b9d45edfb 100644 --- a/OsmAnd-telegram/res/values-fr/strings.xml +++ b/OsmAnd-telegram/res/values-fr/strings.xml @@ -248,4 +248,27 @@ Partager la position Afficher sur la carte Vous avez besoin d\'un compte Telegram enregistré et d\'un numéro de téléphone + OsmAnd Online GPS Tracker + Sélectionnez l’un des services de localisation pour partager votre position. + OsmAnd Tracker vous permet de partager votre position et voir celle des autres dans OsmAnd.

Cette application utilise l\'API de Telegram, et donc vous avez besoin d\'un compte Telegram.
+ Vous avez besoin d\'installer la version gratuite ou payante d\'OsmAnd d\'abord + OsmAnd Tracker s\'exécute en arrière-plan, écran éteint. + Merci d\'activer la géolocalisation dans les paramètres du système + Numéro de téléphone au format international + Numéro de téléphone + Recherche : groupe ou contact + Sélectionner les contacts et les groupes avec lesquels vous souhaitez partager votre position. + Définir l\'heure + Heure visible par tous + Rendre l\'heure visible par tous + Définir l\'intervalle minimum pour partager sa position. + La dernière fois qu\'un contact s\'est déplacé. + Cacher les contacts qui ne se sont pas déplacés depuis un temps donné. + Définissez l\'heure à laquelle les contacts et groupes sélectionnés verront votre position en temps réel. + OsmAnd connect + depuis + Buffer Logcat + Vérifier et partager les logs détaillés de l\'application + Exporter + Envoyer le rapport \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-gl/strings.xml b/OsmAnd-telegram/res/values-gl/strings.xml index c7d9f4cb4e..e9e462d42a 100644 --- a/OsmAnd-telegram/res/values-gl/strings.xml +++ b/OsmAnd-telegram/res/values-gl/strings.xml @@ -90,12 +90,12 @@ Estase a iniciar Estase a ubicar… Estase a conectar á Internet - Desactiva-la optimización da batería para o OsmAnd Tracker de xeito que non se desconecte de xeito súbito cando esté no segundo plano. + Desactivar a optimización da batería para o OsmAnd Tracker de xeito que non se desconecte de xeito súbito cando estea no segundo plano. Conéctate á Internet para pecha-la sesión no Telegram de xeito correcto. Para revoga-lo acceso á ubicación compartillada. Abre o Telegram, vai cara ós «Axustes → Privacidade e Seguranza → Sesións» e pecha a sesión do OsmAnd Tracker. De que xeito desactivar o rastrexador do OsmAnd (OsmAnd Tracker) dende o Telegram De que xeito desactivar o rastrexador do OsmAnd (OsmAnd Tracker) dende o Telegram - Escolle a versión do OsmAnd na cal o rastrexador do OsmAnd (OsmAnd Tracker) empregará para amosa-las ubicacións. + Escolle a versión do OsmAnd na cal o OsmAnd Tracker empregará para amosar as posicións. Conectar ó OsmAnd Agocha-los contactos que non se moveron nun tempo determinado. A última vez que un contacto se moveu. @@ -195,7 +195,7 @@ Telegram O Telegram (a aplicación de mensaxaría) emprégase para conectar e comunicar ás persoas. O rastrexador do OsmAnd (OsmAnd tracker) é un dos clientes que emprega a plataforma aberta do Telegram. Os teus contactos poden empregar calquera outro cliente do Telegram. - Ó premer en continuar, aceptas as Políticas de Privacidade do Telegram e do OsmAnd. + Ó premer en \"Continuar\", aceptas as condicións do Telegram e as políticas de privacidade do OsmAnd. Aceptar Política de privacidade do Telegram Política de privacidade do OsmAnd @@ -216,4 +216,56 @@ Procura en tódolos teus grupos e contactos. Escribe o nome do contacto ou do grupo Procurar + Estado do Rastrexador do OsmAnd + Suxerido + Voltar ó OsmAnd + hai %1$s + Última resposta: hai %1$s + Última actualización dende o Telegram: hai %1$s + Última resposta: %1$s + Última actualización dende o Telegram: %1$s + ERR + Traxectoria + Altitude + Precisión + Enderezo + Privacidade + Proxy + Axustes do proxy + Desconectado + Conectado + Tipo de proxy + Activar + Conexión + Servidor + Porto + Credenciais + Nome de usuario + Contrasinal + Chave + Axustes de GPX + Filtro: sen rexistro por embaixo da velocidade escollida + Velocidade mínima de rexistro + Filtro: sen registro a menos que se acade a precisión + Precisión mínima de rexistro + Filtro: distancia mínima para rexistrar un novo punto + Distancia mínima de rexistro + Escoller + Sen datos + Non temos datos recollidos para o día escollido + Data de comezo — Fin + Escoller a hora para a visualización + Aplicar + Comezo + Fin + Mensaxes gardadas + Unidade de velocidade + Definir unidade de velocidade. + Unidades de lonxitude + Mudar as unidades de lonxitude. + Unidades e formatos + Fuso horario + Escolle a zona horaria que desexas amosar nas mensaxes de localización. + Tempo de caducidade do búfer + Tempo máximo para almacenar puntos no búfer \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-he/strings.xml b/OsmAnd-telegram/res/values-he/strings.xml index 99c18d4cb2..65da2f52a1 100644 --- a/OsmAnd-telegram/res/values-he/strings.xml +++ b/OsmAnd-telegram/res/values-he/strings.xml @@ -268,4 +268,8 @@ תגובה אחרונה: לפני %1$s לפני %1$s שגיאה + ייצוא + מכלא Logcat + בדיקה ושיתוף יומני תיעוד מפורטים של היישומים + שליחת דיווח \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-hu/strings.xml b/OsmAnd-telegram/res/values-hu/strings.xml index a187276fc1..95d655b5cb 100644 --- a/OsmAnd-telegram/res/values-hu/strings.xml +++ b/OsmAnd-telegram/res/values-hu/strings.xml @@ -267,4 +267,9 @@ Utolsó frissítés a Telegramtól: %1$s Utolsó válasz: %1$s Ennyivel ezelőtt: %1$s + HIBA + Exportálás + Logcat-puffer (hibanapló) + Az alkalmazás részletes naplóinak ellenőrzése és megosztása + Jelentés küldése \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-hy/strings.xml b/OsmAnd-telegram/res/values-hy/strings.xml new file mode 100644 index 0000000000..26b960e890 --- /dev/null +++ b/OsmAnd-telegram/res/values-hy/strings.xml @@ -0,0 +1,110 @@ + + + Որոնել կոնտակտներ + Կողմնորոշում + Բարձրություն + Ճշգրտություն + Ուղղություն + Գաղտնիության + Պրոկսի + Proxy Կարգավորումներ + Անջատված է + Միացված է + Proxy տեսակը + Միացնել + Կապ + Սերվեր + Պորտ + Հավատարմագրման տվյալներ + Օգտագործողի անունը + Գաղտնաբառ + Բանալի + GPX կարգավորումներ + Ֆիլտր՝ չգրանցել, քանի դեռ չի հասել անհրաժեշտ արագությանը + Նվազագույն գրանցման արագությունը + Ֆիլտր՝ չգրանցել, քանի դեռ չի հասել անհրաժեշտ ճշգրտությանը + Նվազագույն գրանցման ճշգրտությունը + Ֆիլտր՝ նոր կետի գրանցման համար անհրաժեշտ նվազագույն հեռավորությունը + Նվազագույն գրանցման հեռավորությունը + Ընտրել + Տվյալներ չկա + Ընտրված օրվա համար հավաքագրված տվյալներ չկան + Սկզբ - Ավարտ ամսաթիվը + Ընտրեք ժամանակ ցուցադրելու համար + Կիրառել + Սկիզբ + Վերջ + Պահպանված հաղորդագրությունները + Արագության չափման միավոր + Ընտրեք արագության չափման միավորը: + Հեռավորության չափման միավոր + Փոխել հեռավորության չափման միավորը։ + Չափման միավորներ և ձեւաչափեր + Ժամային գոտին + Ընտրեք ժամային գոտին, որպեսզի ցույց տա ձեր գտնվելու վայրը հաղորդագրություններում: + Բուֆերի ավարտման ժամկետը + Կետերի առավելագույն պահպանման ժամանակը բուֆերում + OsmAnd Tracker- ի կարգավիճակը + Առաջարկվում է + Վերադառնալ OsmAnd + %1$s առաջ + Վերջին պատասխանը՝ %1$s առաջ + Վերջին թարմացումը Telegram- ից՝ %1$s առաջ + Վերջին պատասխանը՝ %1$s + Վերջին թարմացումը Telegram- ից.%1$s + ՍԽԱԼ + Telegram (հաղորդագրությունների մենեջեր) օգտագործվում է մարդկանց հետ շփվելու և հաղորդակցվելու համար: + Telegram + OsmAnd Թրեկեր + Միացրեք մոնիտորինգը բոլոր վայրերը պատմության մեջ պահպանելու համար։ + Գտնվելու վայրի արձանագրումը միացված է + Անջատել մոնիտորինգը + Ժամանակացույցն այժմ անվճար է: + Մղոններ/մետր + Ծովային մղոն + Կիլոմետր/մետր + Մղոններ/յարդեր + Մղոններ/ֆուտ + Րոպե մղոն + Րոպե կիլոմետր + Մետր վայրկյանում + Մղոն ժամում + Կիլոմետր ժամում + մղ/ժ + կմ/ժ + մ/վ + րոպե/կմ + րոպե/մ + նմ + մ + կմ + մղ + ֆուտ + յարդ + Ֆոնային ռեժիմ + Կարգավորումներ + Չեղարկել + Շարունակել + Վերադառնալ + ՈՒղարկել + Տեղադրել + Անջատել + Բոլորը + Փակել + Ելք + Դասակարգել + Անուն + Պահպանել + Անջատել + Կարգավիճակ + Միացված է + Թաքցնել + Ավելացնել + Քարտեզ + Միջին արագությունը + Միջին բարձրություն + Թարմացնել + Տեսակ + OK + Որոնում + \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-it/strings.xml b/OsmAnd-telegram/res/values-it/strings.xml index 4a5b4218f4..15986c05a0 100644 --- a/OsmAnd-telegram/res/values-it/strings.xml +++ b/OsmAnd-telegram/res/values-it/strings.xml @@ -196,7 +196,7 @@ Telegram Telegram (l\'applicazione di messaggistica) viene usato per connettersi e comunicare con le persone. Il tracker OsmAnd è uno dei client utilizzati dalla piattaforma aperta Telegram. I tuoi contatti possono usare un qualsiasi cliente Telegram. - Cliccando continua tu sottoscrivi le condizioni di Privacy di Telegram e quelle di OsmAnd. + Cliccando \"Continua\" tu sottoscrivi le condizioni di privacy di Telegram e quelle di OsmAnd. Accettazione Come funziona Informativa sulla privacy di Telegram @@ -257,4 +257,12 @@ Fuso orario Unità di misura della velocità Torna a OsmAnd + Stato di OsmAnd Tracker + Suggerito + %1$s fa + Ultima risposta: %1$s fa + Ultimo aggiornamento da Telegram: %1$s fa + Ultima risposta: %1$s + Ultimo aggiornamento da Telegram: %1$s + ERR \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-ja/strings.xml b/OsmAnd-telegram/res/values-ja/strings.xml index 1c15afa46d..1829c1fcc9 100644 --- a/OsmAnd-telegram/res/values-ja/strings.xml +++ b/OsmAnd-telegram/res/values-ja/strings.xml @@ -219,10 +219,10 @@ 国際形式でTelegramを利用する端末の電話番号を入力してください(日本の場合+81を先頭につけて電話番号最初の0を除いた番号を入力) ようこそ ヤード - フィート - マイル - キロメートル - メートル + ft + mi + km + m 海里 min/m min/km diff --git a/OsmAnd-telegram/res/values-kab/strings.xml b/OsmAnd-telegram/res/values-kab/strings.xml index 3b16250899..781494918a 100644 --- a/OsmAnd-telegram/res/values-kab/strings.xml +++ b/OsmAnd-telegram/res/values-kab/strings.xml @@ -70,7 +70,7 @@ Iznan yettwaskelsen Tayunt n urured Ad isbadu tayunt n urured. - Tayunin n umeccaq + Tayunin n teɣzef Beddel tayunt n uktili n umeccaq. Tayunin d yimasalen Fren izḍi usrig ara d-tsekneḍ deg yiznan-ik n usideg. @@ -137,7 +137,7 @@ Agraw Dernier temps de réponse aya - Tufɣa + Tuffɣa Smizzwer S yisem Bḍu adɣar diff --git a/OsmAnd-telegram/res/values-pl/strings.xml b/OsmAnd-telegram/res/values-pl/strings.xml index 426e4ad507..22e12de229 100644 --- a/OsmAnd-telegram/res/values-pl/strings.xml +++ b/OsmAnd-telegram/res/values-pl/strings.xml @@ -142,9 +142,7 @@ h min sek - - Nadajnik OsmAnd pozwala Ci udostępniać swoją lokalizację i widzieć ją w OsmAnd.
-
Aplikacja używa API Telegram, a więc potrzebujesz konta Telegram.
+ Nadajnik OsmAnd pozwala Ci udostępniać swoją lokalizację i widzieć ją w OsmAnd.

Aplikacja używa API Telegram, a więc potrzebujesz konta Telegram.
Moja lokalizacja Na żywo Wybierz nazwę, której jeszcze nie używasz diff --git a/OsmAnd-telegram/res/values-pt-rBR/strings.xml b/OsmAnd-telegram/res/values-pt-rBR/strings.xml index 58839b5cb8..d792f9748f 100644 --- a/OsmAnd-telegram/res/values-pt-rBR/strings.xml +++ b/OsmAnd-telegram/res/values-pt-rBR/strings.xml @@ -26,7 +26,7 @@ Posicionando… Conectando-se à Internet Altere as configurações de otimização da bateria para estabilizar o compartilhamento de local. - "Funcionamento em segundo plano " + Funcionamento em segundo plano Desative a otimização da bateria do OsmAnd Tracker para que ele não seja desligado repentinamente quando estiver em segundo plano. Compartilhando em segundo plano Vá para as configurações @@ -72,7 +72,7 @@ Conta no %1$s Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições. - "Conectar OsmAnd " + Conectar OsmAnd Ocultar contatos que não foram movidos em um determinado momento. Histórico de localização A última vez que um contato foi movido. @@ -102,7 +102,7 @@ %1$d m %1$d h Instalar - Enviar + Compartilhe Voltar Hora visível para todos Defina a hora em que seus contatos e grupos selecionados verão sua localização em tempo real. @@ -173,9 +173,7 @@ h min seg - - OsmAnd Tracker permite que você compartilhe sua localização e veja a dos outros no OsmAnd.
-
O aplicativo usa a API Telegram e você precisa de uma conta Telegram.
+ OsmAnd Tracker permite que você compartilhe sua localização e veja a dos outros no OsmAnd.

O aplicativo usa a API Telegram e você precisa de uma conta Telegram.
Minha localização Ao vivo agora Monitoramento está ativado @@ -186,13 +184,13 @@ Mostrar no OsmAnd Data final Data de início - "Linha do tempo " + Linha do tempo enviado (%1$d em buffer) - "%1$d pontos " + %1$d pontos Data Coletado Pontos de GPS - "Enviar " + Enviar Por favor, atualize o OsmAnd para ver os dados no mapa Atualizar Telegram @@ -201,7 +199,7 @@ Ao clicar em \"Continuar\", você concorda com as condições da política de privacidade do Telegram- e OsmAnd. Aceitar Política de privacidade do Telegram - "Política de privacidade do OsmAnd " + Política de privacidade do OsmAnd Como funciona Pontos GPX recebidos: %1$s Aparência @@ -269,4 +267,8 @@ Última resposta: %1$s atrás %1$s atrás ERR + Exportar + Buffer de Logcat + Verifique e compartilhe registros detalhados do aplicativo + Enviar o relatório \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-pt-rPT/strings.xml b/OsmAnd-telegram/res/values-pt-rPT/strings.xml index 1d32c5f8b3..6cbbce3ee6 100644 --- a/OsmAnd-telegram/res/values-pt-rPT/strings.xml +++ b/OsmAnd-telegram/res/values-pt-rPT/strings.xml @@ -2,7 +2,7 @@ Posicionando… Milhas náuticas por hora (nó) - Você precisa instalar a versão gratuita ou paga do OsmAnd primeiro + Precisa instalar a versão gratuita ou paga do OsmAnd primeiro Telegram Entrar Data de início - fim @@ -10,7 +10,7 @@ Por favor, ligue \"Localização\" nas configurações do sistema Sem dados enviando localização - Selecione os contatos e grupos com os quais você deseja compartilhar sua localização. + Selecione os contactos e grupos com os quais deseja compartilhar sua localização. Aguardando resposta do Telegram Conta conectada Política de privacidade do OsmAnd @@ -25,15 +25,15 @@ Bate-papos ativos Minutos por quilômetro Funcionamento em segundo plano - Ocultar contatos que não foram movidos em um determinado momento. + Ocultar contactos que não foram movidos num determinado momento. Configurações de GPX Digite o nome do contato ou do grupo min/m - Senha do telegrama + Palavra-passe do telegrama Última localização atualizada: Parado Mostrar quantidade de pontos de GPS coletados e enviados. - Você precisa de uma conta e número de telefone registrados no Telegram + Precisa de uma conta e número de telefone registados no Telegram Filtro: sem registro abaixo da velocidade selecionada Ordenar por Enviado @@ -42,7 +42,7 @@ Enviado e atualizado com sucesso Escolha como as mensagens com sua localização serão exibidas. Conexão - Se você deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar sua localização. + Se deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar a sua localização. Palavra-passe Autorização Selecionar @@ -51,7 +51,7 @@ Robô Altitude média Data de início - Contatos e grupos compartilhando o local para você. + Contatos e grupos compartilhando o local consigo. Todos Pontos GPX recebidos: %1$s Aparência @@ -59,7 +59,7 @@ Pela distância Desativar o compartilhamento de local Coletado - Escolha um nome que você ainda não usou + Escolha um nome que ainda não usou Adicionar Mostrar utilitadoes no mapa Digite o código de autenticação @@ -71,7 +71,7 @@ Conectar OsmAnd Por favor, instale o Telegram e configure uma conta. Quilômetros por hora - Senha + Palavra-passe Distância mínima de registro Gravar Iniciar @@ -81,8 +81,8 @@ Conectado m O compartilhamento está ativado (desativado) - Eu não tenho conta Telegram - Você precisa de uma conta do Telegram para usar o compartilhamento de local. + Não tenho uma conta do Telegram + Precisa de uma conta do Telegram para usar o compartilhamento de local. Desativar todo o compartilhamento Status de compartilhamento Fim @@ -92,11 +92,11 @@ Mais tarde Minha localização Instalar OsmAnd - Telegrama (o aplicativo de mensagens) é usado para conectar e se comunicar com as pessoas. + Telegram (a app de mensagens) é usado para conectar e comunicar com as pessoas. Não é possível enviar para bate-papo do Telegram: Ainda não enviado %1$d pontos - OsmAnd Tracker permite que partilhe a sua localização e veja a dos outros no OsmAnd.

O app usa a API Telegram e você precisa de uma conta do Telegram.
+ OsmAnd Tracker permite que partilhe a sua localização e veja a dos outros no OsmAnd.

O app usa a API Telegram e precisa de uma conta do Telegram.
Filtro: distância mínima para registrar um novo ponto O nome do aparelho não pode estar vazio yd @@ -108,7 +108,7 @@ Expira Enviar localização como Sair - O aplicativo não tem permissão para acessar os dados de localização. + A app não tem permissão para acessar os dados de localização. Milhas por hora Pode criar e visualizar o ID do aparelho no cliente de telegrama usando o bot de bate-papo %1$s. %2$s Voltar @@ -152,7 +152,7 @@ %1$d h %2$d m Nome do aparelho muito longo Pontos de GPS - Ative o monitoramento para salvar todos os locais no histórico. + Ative o monitoramento para gravar todos os locais no histórico. Mostrar no mapa Enviar minha localização Compartilhar localização como @@ -160,7 +160,7 @@ mph Minutos por milha Última atualização do Telegram - Tem certeza de que deseja sair do OsmAnd Tracker para que você não possa compartilhar o local ou ver a localização de outras pessoas\? + Tem certeza de que deseja sair do OsmAnd Tracker para que não possa compartilhar o local ou ver a localização de outras pessoas\? Servidor Metros por segundo Compartilhamento: %1$s @@ -199,7 +199,7 @@ Por favor, insira o número de telefone do seu Telegram em formato internacional Definir tempo visível para todos Número de telefone - Ao clicar em \"Continuar\" você concorda com as condições da política de privacidade do Telegram e OsmAnd. + Ao clicar em \"Continuar\" concorda com as condições da política de privacidade do Telegram e OsmAnd. Milhas/pés Monitoramento está ativado Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições. @@ -208,7 +208,7 @@ Velocidade média Situação km/h - Então você pode usar este aplicativo. + Então pode usar esta app. Configurações Vá para as configurações Uma faixa GPX é salva automaticamente durante a navegação. diff --git a/OsmAnd-telegram/res/values-pt/strings.xml b/OsmAnd-telegram/res/values-pt/strings.xml index fe4559ac9c..21dfc6b4e9 100644 --- a/OsmAnd-telegram/res/values-pt/strings.xml +++ b/OsmAnd-telegram/res/values-pt/strings.xml @@ -57,10 +57,10 @@ Linha do tempo é um recurso disponível agora gratuitamente. Desativar monitoramento Gravação de localização ativada - Ative o monitoramento para salvar todos os locais no histórico. - Telegrama (o aplicativo de mensagens) é usado para conectar e se comunicar com as pessoas. + Ative o monitoramento para gravar todos os locais no histórico. + Telegram (a app de mensagens) é usado para conectar e comunicar com as pessoas. OsmAnd tracker é um dos clientes que usam a Plataforma aberta do Telegram . Seus contatos podem usar qualquer outro cliente Telegram. - Ao clicar em \"Continuar\" você concorda com as condições da política de privacidade do Telegram e OsmAnd. + Ao clicar em \"Continuar\" concorda com as condições da política de privacidade do Telegram e OsmAnd. Aceitar Política de privacidade do Telegram Política de privacidade do OsmAnd @@ -82,7 +82,7 @@ Escolha como as mensagens com sua localização serão exibidas. Mapa e texto Última atualização do Telegram - Escolha um nome que você ainda não usou + Escolha um nome que ainda não usou %1$s adicionado. Não foi possível adicionar novo aparelho Nomeie seu novo aparelho no máximo 200 símbolos. @@ -90,7 +90,7 @@ O nome do aparelho não pode estar vazio Nome do aparelho Pode criar e visualizar o ID do aparelho no cliente de telegrama usando o bot de bate-papo %1$s. %2$s - Se você deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar sua localização. + Se deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar a sua localização. Última localização atualizada: Enviado e atualizado com sucesso Não é possível enviar para bate-papo do Telegram: @@ -108,7 +108,7 @@ Ainda não encontrado Reenvie o local Última localização disponível - Status de compartilhamento + Estado de compartilhamento Compartilhamento: %1$s Ativado Sem conexão GPS @@ -117,8 +117,8 @@ Gravar Adicionar aparelho Compartilhar localização como - Contatos e grupos compartilhando o local para você. - Tem certeza de que deseja sair do OsmAnd Tracker para que você não possa compartilhar o local ou ver a localização de outras pessoas\? + Contatos e grupos compartilhando o local consigo. + Tem certeza de que deseja sair do OsmAnd Tracker para que não possa compartilhar o local ou ver a localização de outras pessoas\? Sair do OsmAnd Tracker\? Nome Pela distância @@ -144,7 +144,7 @@ no %1$s Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições. Conectar OsmAnd - Ocultar contatos que não foram movidos em um determinado momento. + Ocultar contactos que não foram movidos num determinado momento. Histórico de localização A última vez que um contato foi movido. Parado @@ -159,13 +159,13 @@ Vivo Robô Registro no Telegram - Você precisa de uma conta do Telegram para usar o compartilhamento de local. + Precisa de uma conta do Telegram para usar o compartilhamento de local. Por favor, instale o Telegram e configure uma conta. - Então você pode usar este aplicativo. + Então pode usar esta app. Todos Desligado - Você precisa de uma conta e número de telefone registrados no Telegram - Eu não tenho conta Telegram + Precisa de uma conta e número de telefone registados no Telegram + Não tenho uma conta do Telegram Digite o número de telefone Digite o código de autenticação Definir tempo visível para todos @@ -173,12 +173,12 @@ %1$d m %1$d h Instalar - Partilhar + Compartilhar Voltar Hora visível para todos Defina a hora em que seus contatos e grupos selecionados verão sua localização em tempo real. Definir tempo - Selecione os contatos e grupos com os quais você deseja compartilhar sua localização. + Selecione os contactos e grupos com os quais deseja compartilhar sua localização. Pesquisa: Grupo ou contato Compartilhar localização Mostrar no mapa @@ -190,7 +190,7 @@ Código de Autenticação Uma faixa GPX é salva automaticamente durante a navegação. Digite a palavra-passe - Senha do telegrama + Palavra-passe do telegrama Entrar Sair Iniciando @@ -201,7 +201,7 @@ Continuar Cancelar Configurações - O aplicativo não tem permissão para acessar os dados de localização. + A app não tem permissão para acessar os dados de localização. Por favor, ligue \"Localização\" nas configurações do sistema Selecione um dos provedores de localização para compartilhar sua localização. Modo de fundo @@ -211,7 +211,7 @@ Compartilhando localização Serviço OsmAnd Tracker Logotipo do OsmAnd - Você precisa instalar a versão gratuita ou paga do OsmAnd primeiro + Precisa instalar a versão gratuita ou paga do OsmAnd primeiro Instalar OsmAnd Mostrar utilitadoes no mapa Bate-papos ativos @@ -244,16 +244,15 @@ h min seg - O OsmAnd Tracker permite que partilhe sua localização e veja a dos outros no OsmAnd.
-
O app usa a API Telegram e você precisa de uma conta da Telegram.
+ OsmAnd Tracker permite que partilhe a sua localização e veja a dos outros no OsmAnd.

O app usa a API Telegram e precisa de uma conta do Telegram.
Minha localização Ao vivo agora Cronologia Mensagens gravadas - Selecione o fuso horário para mostrar nas suas mensagens de localização. + Selecione o fuso horário a mostrar nas suas mensagens de localização. Fuso horário Unidades e formatos - Alterar unidade de medida de distância. + Alterar a unidade de medida de distância. Unidades de comprimento Definir unidade de velocidade. Unidade de velocidade diff --git a/OsmAnd-telegram/res/values-ru/strings.xml b/OsmAnd-telegram/res/values-ru/strings.xml index d14aa28fee..e12c0245b5 100644 --- a/OsmAnd-telegram/res/values-ru/strings.xml +++ b/OsmAnd-telegram/res/values-ru/strings.xml @@ -2,7 +2,7 @@ Хронология теперь доступна бесплатно. Запись местоположений включена - Telegram (менеджер сообщений) используется для связи и общения с людьми. + Telegram (мессенджер) используется для связи и общения с людьми. OsmAnd Tracker является одним из клиентов, использующих открытую платформу Telegram. Ваши контакты могут использовать любой другой клиент Telegram. Нажимая \"Продолжить\", вы соглашаетесь с условиями политики конфиденциальности Telegram и OsmAnd. Включите мониторинг, чтобы сохранять все местоположения в истории. @@ -75,7 +75,7 @@ По расстоянию По имени По группе - Сортировать + Сортировка Сортировать по Отстановить все Выход @@ -106,7 +106,7 @@ Последнее обновление локации: Успешно отправлено и обновлено Невозможно отправить Telegram чаты: - Ожидание ответа от Telegram + Ожидание ответа Telegram Поиск GPS… Подключение к Интернету Измените настройки оптимизации батареи, чтобы обеспечить стабильную отправку местоположения. @@ -122,7 +122,7 @@ Выберите версию OsmAnd которую OsmAnd Tracker использует для отображения положений на карте. OsmAnd подключение Связанная учетная запись - Учетная запись + Учётная запись Начать отправку локации Вам необходимо сначала установить бесплатную или платную версию OsmAnd Как отключить OsmAnd Tracker от Telegram @@ -137,7 +137,7 @@ Последнее местоположение Статус отправки Трансляция: %1$s - Включён + Включено Статус Отсутствует GPS Отсутствует интернет @@ -156,7 +156,7 @@ Политика конфиденциальности Telegram Политика конфиденциальности OsmAnd Получено точек GPX: %1$s - Вид + Внешний вид Показать количество собранных и отправленных точек GPS. Обновите OsmAnd для просмотра данных на карте Обновить @@ -166,8 +166,8 @@ Собрано Точки GPS Отправлено - Мониторинг включен - Мониторинг отключен + Мониторинг включён + Мониторинг отключён Время в движении Средняя высота Средняя скорость @@ -211,7 +211,7 @@ Хронология Искать контакты Поиск среди всех ваших групп и контактов. - Введите контакт или название группы + Имя контакта или название группы Поиск Направление Точность @@ -220,8 +220,8 @@ Сервер Соединение Тип прокси - Соединено - Разъединено + Подключено + Отключено Настройки прокси Прокси Настройки GPX @@ -233,7 +233,7 @@ миля миль/ч Высота - Ориентация + Пеленг Ключ Пароль Имя пользователя @@ -246,7 +246,7 @@ Минимальная скорость регистрации Фильтр: не регистрировать, пока не достигнута необходимая скорость Конец - Начало + Старт Выберите время для отображения Сохраненные сообщения Выберите часовой пояс, чтобы показывать время вашего местоположения в сообщениях. @@ -267,4 +267,8 @@ Последнее обновление от Telegram: %1$s назад Последний ответ: %1$s Последнее обновление от Telegram: %1$s + Экспорт + Буфер Logcat + Проверьте и поделитесь подробными журналами приложения + Отправить отчёт \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-sr/strings.xml b/OsmAnd-telegram/res/values-sr/strings.xml index 99bbc1ced0..52c261dbe5 100644 --- a/OsmAnd-telegram/res/values-sr/strings.xml +++ b/OsmAnd-telegram/res/values-sr/strings.xml @@ -53,4 +53,218 @@ Мерне јединице & форматирања Промени јединице за дужину. Јединице дужине + Изглед + Временска линија + Уживо сада + Моја локација + ОсмАнд Пратиоц омогућава вам да делите своју локацију и видите локацију других у ОсмАнду.

Апликација користи Телеграм АПИ, па вам је потребан Телеграм налог.
+ сек + мин + ч + Наутичких миља на сат (чворови) + нми/ч + Добродошли + Унесите ваш телефонски број Телеграма у међународном формату + Ауторизација + Активна ћаскања + Прикажите кориснике на мапи + Инсталирајте ОсмАнд + Прво морате инсталирати бесплатну или плаћену верзију ОсмАнда + Лого ОсмАнда + Услуга ОсмАнд Пратиоца + Дељење локације + Дели локацију + Растојање + ОсмАнд Пратиоц ради у позадини са искљученим екраном. + Изаберите једног од добављача локације да би делити вашу локацију. + Укључите „Локацију“ у системским подешавањима + Апликацији недостаје дозвола за приступ подацима о локацији. + Нисте пријављени + Укључити „Локацију“\? + Затварање + Одјављивање + Покретање + Одјавити се + Пријавите се + Телеграм лозинка + Унесите лозинку + Телеграм вам је послао код за ОсмАнд ради пријаве на ваш налог. + Валидациони код + Унесите код + Лозинка + Број телефона у међународном формату + Број телефона + ОсмАнд Онлајн ГПС Пратиоц + Прикажи на мапи + Дели локацију + Претражите: Групу или контакт + Изаберите контакте и групе са којима желите да делите локацију. + Подесите време + Подесите време за који ће изабрани контакти и групе видети вашу локацију у реалном времену. + Видљиво време за све + %1$ ч + %1$ м + %1$ ч %2$ м + Подесите видљиво време за све + Унесите код за валидацију + Унесите број телефона + Немам Телеграм налог + Потребан вам је регистровани Телеграм налог и број телефона + Тада можете да користите ову апликацију. + Инсталирајте Телеграм и отворите налог. + За дељење локације потребан вам је Телеграм налог. + Регистрација у Телеграму + Бот + Уживо + Отвори ОсмАнд + Искључите дељење локације + Дељење је укључено (искључите) + Истиче + Време дељења + Позиција + Пошаљи моју локацију + Подесите минимални интервал за дељење локације. + Непомичан + Последњи пут када се контакт померио. + Историја локације + Сакријте контакте који се нису померили у датом времену. + Османд веза + Одаберите верзију ОсмАнда коју ОсмАнд пратиоц користи за приказивање позиција. + у %1$ + Налог + Повезани налог + Како искључити ОсмАнд пратиоца из Телеграма + Како искључити ОсмАнд пратиоца из Телеграма + Да бисте опозвали приступ дељењу локације. Отворите Телеграм, идите на Подешавања → Приватност и безбедност → Сесије и прекинете сесију ОсмАнд пратиоца. + Повежите се на Интернет како бисте се правилно одјавили из Телеграма. + Група + Последњи одговор + пре + Искључи све + Онемогући свако дељење + Искључује дељење локације према свим изабраним чатовима (%1$). + Изаберите верзију ОсмАнда коју желите да користите + Изаберите верзију ОсмАнда где ће се контакти приказати на мапи. + Сортирај по + По групи + По имену + По удаљености + Одјавити се са ОсмАнд пратиоца\? + Јесте ли сигурни да се желите одјавити са ОсмАнд пратиоца тако да не можете да делите локацију или видите локацију других\? + Контакти и групе деле локацију вама. + Дељење локације као + Додајте уређај + Нема интернет конекције + Нема ГПС везе + Дељење: %1$ + Дељење статуса + Последња доступна локација + Поново пошаљи локацију + Још није пронађено + Још није послато + Касније + Иди на Подешавања + Дељење у позадини + Искључите оптимизацију батерије за ОсмАнд пратилац тако да се не искључи изненада кад је у позадини. + Рад у позадини + Промените подешавања за оптимизацију батерије да бисте стабилизовали дељење локације. + Повезивање са Интернетом + Позиционирање… + Покретање + Локација се шаље + Чека се одговор из Телеграма + Није могуће послати у Телеграм четове: + Успешно послато и ажурирано + Последња ажурирана локација: + Ако желите да повежете више уређаја са једним налогом телеграма, требате користити други уређај да би делили вашу локацију. + Можете да креирате и видите ИД уређаја у телеграм клијенту користећи %1$ чат бот. %2$ + Име уређаја + Име уређаја не може бити празно + Име уређаја предуго + Именујте ваш нови уређај са максимално 200 симбола. + Није могуће додати нови уређај + %1$ додато. + Изаберите име које нисте већ користили + Последње ажурирање од Телеграма + Мапа и текст + Текст + Одаберите како ће изгледати поруке са вашом локацијом. + Пошаљи локацију као + Почетни датум + Крајњи датум + Прикажи у ОсмАнду + Време кретања + Праћење је онемогућено + Праћење је омогућено + Послато + ГПС тачке + Прикупљено + Датум + %1$ тачака + послато (%1$ у баферу) + Ажурирајте ОсмАнд да бисте видели податке на мапи + Прикажи количину прикупљених и послатих ГПС тачака. + Покажи ГПС тачке + Примљене ГПКС тачке: %1$ + Како ради + ОсмАнд политика приватности + Политика приватности Телеграма + Прихвати + Кликом на „Настави“ прихватате услове политике приватности Телеграма и ОсмАнда. + ОсмАнд пратилац је један од клијената који користе отворену платформу Телеграм. Ваши контакти могу да користе било који други Телеграм клијент. + Телеграм (апликација за размену порука) користи се за повезивање и комуникацију са људима. + Телеграм + OsmAnd пратилац + Омогућите праћење да бисте сачували све локације у историји. + Снимање локације омогућено + Онемогућите праћење + Временска линија је функција која је сада доступна бесплатно. + Унесите име контакта или групе + Претрага по свим вашим групама и контактима. + Претрага контакта + Усмерење + Прецизност + Смер + Приватност + Прокси + Подешавања проксија + Прекинут + Повезан + Тип проксија + Веза + Сервер + Порт + Акредитиви + Корисничко име + Лозинка + Кључ + GPX подешавања + Филтер: нема записивања испод одабране брзине + Минимална брзина записивања + Филтер: Нема записа док се не достигне ова тачност + Минимална тачност евидентирања + Филтер: минимална удаљеност за евидентирање нове тачке + Минимална удаљеност евидентирања + Нема података + Немамо прикупљене податке за изабрани дан + Почетни — Крајњи датум + Изаберите време за приказ + Почетак + Крај + Сачуване поруке + Јединица брзине + Дефинишите јединицу брзине. + Временска зона + Изаберите временску зону која ће се приказати у порукама локације. + Време истека бафера + Максимално време за складиштење тачака у бафер + Статус Трагача ОсмАнда + Предложено + Повратак на ОсмАнд + Пре %1$ + Последњи одговор: пре %1$ + Последње ажурирање из Телеграма: пре %1$ + Последњи одговор: %1$ + Последње ажурирање из Телеграма: %1$ + Грешка
\ No newline at end of file diff --git a/OsmAnd-telegram/res/values-sv/strings.xml b/OsmAnd-telegram/res/values-sv/strings.xml new file mode 100644 index 0000000000..d5705b8e2d --- /dev/null +++ b/OsmAnd-telegram/res/values-sv/strings.xml @@ -0,0 +1,4 @@ + + + Senaste uppdatering från Telegram: %1$s + \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-tr/strings.xml b/OsmAnd-telegram/res/values-tr/strings.xml index a459a73acf..87ba56717d 100644 --- a/OsmAnd-telegram/res/values-tr/strings.xml +++ b/OsmAnd-telegram/res/values-tr/strings.xml @@ -60,11 +60,11 @@ Başlangıç — Bitiş tarihi Seçilen gün için toplanan veri yok Veri yok - Minimum kayıt mesafesi - Filtre: yeni bir nokta kaydetmek için minimum mesafe - Minimum kayıt hassasiyeti - Filtre: hassasiyete ulaşılmadığı sürece kaydetme yok - Minimum kayıt hızı + Asgari kayıt mesafesi + Filtre: yeni bir nokta kaydetmek için asgari mesafe + Asgari kayıt doğruluğu + Filtre: bu doğruluğa ulaşılmadıkça kaydetme yok + Asgari kayıt hızı Filtre: seçili hızın altında kaydetme yok GPX ayarları Anahtar @@ -81,7 +81,7 @@ Proxy Gizlilik Yön - Hassaslık + Hassasiyet Kişileri ara Tüm gruplarınızda ve kişilerinizde arayın. Kişi veya grup adı yazın @@ -103,7 +103,7 @@ GPS noktalarını göster Toplanan ve gönderilen GPS noktalarının miktarını göster. Verileri haritada görüntülemek için lütfen OsmAnd\'ı güncelleyin - Konum açısı + Kerteriz gönderilen (%1$d arabellekte) %1$d nokta Tarih @@ -182,7 +182,7 @@ Konum geçmişi Bir kişinin en son hareket ettiği zaman. Hareket etmiyor - Konum paylaşımı için minimum aralığı ayarlayın. + Konum paylaşımı için en küçük aralığı ayarlayın. Konumumu gönder Konum Paylaşım zamanı @@ -256,7 +256,7 @@ Uzunluk birimleri Hız birimini tanımlayın. Hız birimi - Noktaların arabellekte saklanacağı maksimum süre + Noktaların arabellekte saklanacağı azami süre Arabellek zaman aşım süresi Önerilen OsmAnd Tracker durumu @@ -267,4 +267,8 @@ Son cevap: %1$s önce %1$s önce HATA + Dışa aktar + Logcat tamponu + Uygulamanın ayrıntılı günlük kayıtlarına göz atın ve paylaşın + Rapor gönder \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-uk/strings.xml b/OsmAnd-telegram/res/values-uk/strings.xml index 28e088080f..e370c05360 100644 --- a/OsmAnd-telegram/res/values-uk/strings.xml +++ b/OsmAnd-telegram/res/values-uk/strings.xml @@ -118,7 +118,7 @@ Налаштування Застосунок не має дозволу до отримання даних позиціювання. Будь ласка, увімкніть «Позиціювання» у системних налаштуваннях - Фоновий режим + Режим тла OsmAnd Tracker працює у фоновому режимі з вимкненим екраном. Відстань Поділитися позицією @@ -251,7 +251,7 @@ Збережені повідомлення Оберіть часовий пояс щоб відобразити повідомлення у вашому розташуванні. Часовий пояс - Одиниця вимірювання та формати + Одиниці виміру й формати Одиниці вимірювання довжини Змінити одиницю вимірювання відстані. Визначити одиницю швидкості. @@ -267,4 +267,8 @@ Остання відповідь: %1$s тому %1$s тому ПМЛК + Експорт + Буфер logcat + Переглянути та надіслати докладний журнал застосунку + Надіслати звіт \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-zh-rTW/strings.xml b/OsmAnd-telegram/res/values-zh-rTW/strings.xml index f1f06a0daa..7739c65184 100644 --- a/OsmAnd-telegram/res/values-zh-rTW/strings.xml +++ b/OsmAnd-telegram/res/values-zh-rTW/strings.xml @@ -270,4 +270,8 @@ 最後回應:%1$s 前 %1$s 前 ERR + 傳送報告 + 匯出 + Logcat 緩衝 + 檢查及分享應用程式的詳細紀錄 \ No newline at end of file diff --git a/OsmAnd-telegram/res/values/dimens.xml b/OsmAnd-telegram/res/values/dimens.xml index 7f4942dc3e..60976ff822 100644 --- a/OsmAnd-telegram/res/values/dimens.xml +++ b/OsmAnd-telegram/res/values/dimens.xml @@ -27,6 +27,7 @@ 89dp 48dp + 44dp 42dp 56dp diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index 2b5eca334e..8bccf957ce 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,5 +1,9 @@ + Send report + Check and share detailed logs of the app + Logcat buffer + Export ERR Last update from Telegram: %1$s Last response: %1$s diff --git a/OsmAnd-telegram/src/net/osmand/aidl/map/SetMapLocationParams.java b/OsmAnd-telegram/src/net/osmand/aidl/map/SetMapLocationParams.java index 929c817d9d..7feea74d20 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/map/SetMapLocationParams.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/map/SetMapLocationParams.java @@ -8,12 +8,15 @@ public class SetMapLocationParams implements Parcelable { private double latitude; private double longitude; private int zoom; - private boolean animated; + private float rotation; - public SetMapLocationParams(double latitude, double longitude, int zoom, boolean animated) { + private boolean animated; + + public SetMapLocationParams(double latitude, double longitude, int zoom, float rotation, boolean animated) { this.latitude = latitude; this.longitude = longitude; this.zoom = zoom; + this.rotation = rotation; this.animated = animated; } @@ -44,6 +47,10 @@ public class SetMapLocationParams implements Parcelable { return zoom; } + public float getRotation() { + return rotation; + } + public boolean isAnimated() { return animated; } @@ -53,6 +60,7 @@ public class SetMapLocationParams implements Parcelable { out.writeDouble(longitude); out.writeInt(zoom); out.writeByte((byte) (animated ? 1 : 0)); + out.writeFloat(rotation); } private void readFromParcel(Parcel in) { @@ -60,6 +68,7 @@ public class SetMapLocationParams implements Parcelable { longitude = in.readDouble(); zoom = in.readInt(); animated = in.readByte() != 0; + rotation = in.readFloat(); } public int describeContents() { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt index ee6bbb29d4..b6927dc610 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt @@ -3,16 +3,20 @@ package net.osmand.telegram import android.app.Application import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.net.ConnectivityManager import android.net.NetworkInfo import android.os.Build import android.os.Handler +import net.osmand.PlatformUtil +import net.osmand.telegram.ui.TrackerLogcatActivity import net.osmand.telegram.helpers.* import net.osmand.telegram.helpers.OsmandAidlHelper.OsmandHelperListener import net.osmand.telegram.helpers.OsmandAidlHelper.UpdatesListener import net.osmand.telegram.notifications.NotificationHelper import net.osmand.telegram.utils.AndroidUtils import net.osmand.telegram.utils.UiUtils +import java.io.File class TelegramApplication : Application() { @@ -200,4 +204,33 @@ class TelegramApplication : Application() { fun runInUIThread(action: (() -> Unit), delay: Long) { uiHandler.postDelayed(action, delay) } + + fun sendCrashLog(file: File) { + val intent = Intent(Intent.ACTION_SEND) + intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("crash@osmand.net")) + intent.putExtra(Intent.EXTRA_STREAM, AndroidUtils.getUriForFile(this, file)) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + intent.type = "vnd.android.cursor.dir/email" + intent.putExtra(Intent.EXTRA_SUBJECT, "OsmAnd bug") + val text = StringBuilder() + text.append("\nDevice : ").append(Build.DEVICE) + text.append("\nBrand : ").append(Build.BRAND) + text.append("\nModel : ").append(Build.MODEL) + text.append("\nProduct : ").append(Build.PRODUCT) + text.append("\nBuild : ").append(Build.DISPLAY) + text.append("\nVersion : ").append(Build.VERSION.RELEASE) + text.append("\nApp : ").append(getString(R.string.app_name_short)) + try { + val info = packageManager.getPackageInfo(packageName, 0) + if (info != null) { + text.append("\nApk Version : ").append(info.versionName).append(" ").append(info.versionCode) + } + } catch (e: PackageManager.NameNotFoundException) { + PlatformUtil.getLog(TrackerLogcatActivity::class.java).error("", e) + } + intent.putExtra(Intent.EXTRA_TEXT, text.toString()) + val chooserIntent = Intent.createChooser(intent, getString(R.string.send_report)) + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(chooserIntent) + } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt index d8ec28a9c0..042fb03d11 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt @@ -540,14 +540,24 @@ class TelegramSettings(private val app: TelegramApplication) { if (initTime && initSending) { initializing = true } else { + var waitingTimeError = false val maxWaitingTime = WAITING_TDLIB_TIME * MAX_MESSAGES_IN_TDLIB_PER_CHAT * max(1, chatsCount) - val textSharingError = !shareInfo.lastTextMessageHandled && currentTime - shareInfo.lastSendTextMessageTime > maxWaitingTime - val mapSharingError = !shareInfo.lastMapMessageHandled && currentTime - shareInfo.lastSendMapMessageTime > maxWaitingTime - if (shareInfo.hasSharingError - || (shareTypeValue == SHARE_TYPE_MAP_AND_TEXT && (textSharingError || mapSharingError)) - || textSharingError && (shareTypeValue == SHARE_TYPE_TEXT) - || mapSharingError && (shareTypeValue == SHARE_TYPE_MAP) - ) { + val textSharingWaitingTime = currentTime - shareInfo.lastSendTextMessageTime + val mapSharingWaitingTime = currentTime - shareInfo.lastSendMapMessageTime + val textSharingError = !shareInfo.lastTextMessageHandled && textSharingWaitingTime > maxWaitingTime + val mapSharingError = !shareInfo.lastMapMessageHandled && mapSharingWaitingTime > maxWaitingTime + if ((shareTypeValue == SHARE_TYPE_MAP_AND_TEXT && (textSharingError || mapSharingError)) + || textSharingError && (shareTypeValue == SHARE_TYPE_TEXT) + || mapSharingError && (shareTypeValue == SHARE_TYPE_MAP)) { + waitingTimeError = true + log.debug("Send chats error for share type \"$shareTypeValue\"" + + "\nMax waiting time: ${maxWaitingTime}s" + + "\nLast text message handled: ${shareInfo.lastTextMessageHandled}" + + "\nText sharing waiting time: ${textSharingWaitingTime}s" + + "\nLast map message handled: ${shareInfo.lastMapMessageHandled}" + + "\nMap sharing waiting time: ${mapSharingWaitingTime}s") + } + if (shareInfo.hasSharingError || waitingTimeError) { sendChatsErrors = true locationTime = max(shareInfo.lastTextSuccessfulSendTime, shareInfo.lastMapSuccessfulSendTime) chatsIds.add(shareInfo.chatId) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt index dd93c294db..338b81c48f 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt @@ -939,7 +939,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { if (mIOsmAndAidlInterface != null) { try { return mIOsmAndAidlInterface!!.setMapLocation( - SetMapLocationParams(latitude, longitude, zoom, animated)) + SetMapLocationParams(latitude, longitude, zoom, Float.NaN, animated)) } catch (e: RemoteException) { e.printStackTrace() } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index e4d5188a2b..704a797af2 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -776,6 +776,7 @@ class TelegramHelper private constructor() { client?.send(TdApi.CreatePrivateChat(userId, false)) { obj -> when (obj.constructor) { TdApi.Error.CONSTRUCTOR -> { + log.debug("createPrivateChatWithUser ERROR $obj") val error = obj as TdApi.Error if (error.code != IGNORED_ERROR_CODE) { shareInfo.hasSharingError = true @@ -969,7 +970,7 @@ class TelegramHelper private constructor() { val messageType = if (isBot) MESSAGE_TYPE_BOT else MESSAGE_TYPE_TEXT when (obj.constructor) { TdApi.Error.CONSTRUCTOR -> { - log.debug("handleTextLocationMessageUpdate - ERROR") + log.debug("handleTextLocationMessageUpdate - ERROR $obj") val error = obj as TdApi.Error if (error.code != IGNORED_ERROR_CODE) { shareInfo.hasSharingError = true diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt index a5bf5993e9..447275815e 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt @@ -213,6 +213,12 @@ class SettingsDialogFragment : BaseDialogFragment() { DisconnectTelegramBottomSheet.showInstance(childFragmentManager) } + mainView.findViewById(R.id.logcat_row).setOnClickListener { + val intent = Intent(activity, TrackerLogcatActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + app.startActivity(intent) + } + return mainView } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/TrackerLogcatActivity.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/TrackerLogcatActivity.kt new file mode 100644 index 0000000000..ee62ab4407 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/TrackerLogcatActivity.kt @@ -0,0 +1,271 @@ +package net.osmand.telegram.ui + +import android.os.AsyncTask +import android.os.Bundle +import android.view.* +import android.widget.ProgressBar +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import net.osmand.PlatformUtil +import net.osmand.telegram.R +import net.osmand.telegram.TelegramApplication +import java.io.* +import java.lang.ref.WeakReference +import java.util.* + +class TrackerLogcatActivity : AppCompatActivity() { + private var logcatAsyncTask: LogcatAsyncTask? = null + private val logs: MutableList = ArrayList() + private var adapter: LogcatAdapter? = null + private val LEVELS = arrayOf("D", "I", "W", "E") + private var filterLevel = 1 + private lateinit var recyclerView: RecyclerView + + override fun onCreate(savedInstanceState: Bundle?) { + val app: TelegramApplication = getApplication() as TelegramApplication + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_tracker_logcat) + + val toolbar = findViewById(R.id.toolbar).apply { + navigationIcon = app.uiUtils.getThemedIcon(R.drawable.ic_arrow_back) + setNavigationOnClickListener { onBackPressed() } + } + setSupportActionBar(toolbar) + setupIntermediateProgressBar() + + adapter = LogcatAdapter() + recyclerView = findViewById(R.id.recycler_view) as RecyclerView + recyclerView!!.layoutManager = LinearLayoutManager(this) + recyclerView!!.adapter = adapter + } + + protected fun setupIntermediateProgressBar() { + val progressBar = ProgressBar(this) + progressBar.visibility = View.GONE + progressBar.isIndeterminate = true + val supportActionBar = supportActionBar + if (supportActionBar != null) { + supportActionBar.setDisplayShowCustomEnabled(true) + supportActionBar.customView = progressBar + setSupportProgressBarIndeterminateVisibility(false) + } + } + + override fun setSupportProgressBarIndeterminateVisibility(visible: Boolean) { + val supportActionBar = supportActionBar + if (supportActionBar != null) { + supportActionBar.customView.visibility = if (visible) View.VISIBLE else View.GONE + } + } + + override fun onResume() { + super.onResume() + startLogcatAsyncTask() + } + + override fun onPause() { + super.onPause() + stopLogcatAsyncTask() + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + val app: TelegramApplication = applicationContext as TelegramApplication + val share: MenuItem = menu.add(0, SHARE_ID, 0, R.string.shared_string_export) + share.icon = app.uiUtils.getThemedIcon(R.drawable.ic_action_share) + share.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) + val level = menu.add(0, LEVEL_ID, 0, "") + level.title = getFilterLevel() + level.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) + return super.onCreateOptionsMenu(menu) + } + + private fun getFilterLevel(): String { + return "*:" + LEVELS[filterLevel] + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + val itemId = item.itemId + when (itemId) { + android.R.id.home -> { + finish() + return true + } + LEVEL_ID -> { + filterLevel++ + if (filterLevel >= LEVELS.size) { + filterLevel = 0 + } + item.title = getFilterLevel() + stopLogcatAsyncTask() + logs.clear() + adapter!!.notifyDataSetChanged() + startLogcatAsyncTask() + return true + } + SHARE_ID -> { + startSaveLogsAsyncTask() + return true + } + } + return false + } + + private fun startSaveLogsAsyncTask() { + val saveLogsAsyncTask = SaveLogsAsyncTask(this, logs) + saveLogsAsyncTask.execute() + } + + private fun startLogcatAsyncTask() { + logcatAsyncTask = LogcatAsyncTask(this, getFilterLevel()) + logcatAsyncTask!!.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) + } + + private fun stopLogcatAsyncTask() { + if (logcatAsyncTask != null && logcatAsyncTask!!.status == AsyncTask.Status.RUNNING) { + logcatAsyncTask!!.cancel(false) + logcatAsyncTask!!.stopLogging() + } + } + + private inner class LogcatAdapter : RecyclerView.Adapter() { + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(viewGroup.context) + val itemView = inflater.inflate(R.layout.item_description_long, viewGroup, false) as TextView + itemView.gravity = Gravity.CENTER_VERTICAL + return LogViewHolder(itemView) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is LogViewHolder) { + val log = getLog(position) + holder.logTextView.text = log + } + } + + override fun getItemCount(): Int { + return logs.size + } + + private fun getLog(position: Int): String { + return logs[position] + } + + private inner class LogViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTextView: TextView = itemView.findViewById(R.id.description) + } + } + + class SaveLogsAsyncTask internal constructor(logcatActivity: TrackerLogcatActivity, logs: Collection) : AsyncTask() { + private val logcatActivity: WeakReference + private val logs: Collection + + override fun onPreExecute() { + val activity = logcatActivity.get() + activity?.setSupportProgressBarIndeterminateVisibility(true) + } + + override fun doInBackground(vararg voids: Void?): File { + val app: TelegramApplication = logcatActivity.get()?.applicationContext as TelegramApplication + val file = File(app.getExternalFilesDir(null), LOGCAT_PATH) + try { + if (file.exists()) { + file.delete() + } + val stringBuilder = StringBuilder() + for (log in logs) { + stringBuilder.append(log) + stringBuilder.append("\n") + } + if (file.parentFile.canWrite()) { + val writer = BufferedWriter(FileWriter(file, true)) + writer.write(stringBuilder.toString()) + writer.close() + } + } catch (e: Exception) { + log.error(e) + } + return file + } + + override fun onPostExecute(file: File?) { + val activity = logcatActivity.get() + if (activity != null && file != null) { + val app: TelegramApplication = activity.applicationContext as TelegramApplication + activity.setSupportProgressBarIndeterminateVisibility(false) + app.sendCrashLog(file) + } + } + + init { + this.logcatActivity = WeakReference(logcatActivity) + this.logs = logs + } + } + + class LogcatAsyncTask internal constructor(logcatActivity: TrackerLogcatActivity?, filterLevel: String) : AsyncTask() { + private var processLogcat: Process? = null + private val logcatActivity: WeakReference + private val filterLevel: String + + override fun doInBackground(vararg voids: Void?): Void? { + try { + val filter = android.os.Process.myPid().toString() + val command = arrayOf("logcat", filterLevel, "--pid=$filter", "-T", MAX_BUFFER_LOG.toString()) + processLogcat = Runtime.getRuntime().exec(command) + val bufferedReader = BufferedReader(InputStreamReader(processLogcat?.inputStream)) + var line: String? + while (bufferedReader.readLine().also { line = it } != null && logcatActivity.get() != null) { + if (isCancelled) { + break + } + publishProgress(line) + } + stopLogging() + } catch (e: IOException) { // ignore + } catch (e: Exception) { + log.error(e) + } + return null + } + + override fun onProgressUpdate(vararg values: String?) { + if (values.size > 0 && !isCancelled) { + val activity = logcatActivity.get() + if (activity != null) { + val autoscroll = !activity.recyclerView!!.canScrollVertically(1) + for (s in values) { + if (s != null) { + activity.logs.add(s) + } + } + activity.adapter!!.notifyDataSetChanged() + if (autoscroll) { + activity.recyclerView!!.scrollToPosition(activity.logs.size - 1) + } + } + } + } + + fun stopLogging() { + if (processLogcat != null) { + processLogcat!!.destroy() + } + } + + init { + this.logcatActivity = WeakReference(logcatActivity) + this.filterLevel = filterLevel + } + } + + companion object { + private const val LOGCAT_PATH = "logcat.log" + private const val MAX_BUFFER_LOG = 10000 + private const val SHARE_ID = 0 + private const val LEVEL_ID = 1 + private val log = PlatformUtil.getLog(TrackerLogcatActivity::class.java) + } +} diff --git a/OsmAnd/.gitignore b/OsmAnd/.gitignore index e3071e5fbf..8bfbd5b688 100644 --- a/OsmAnd/.gitignore +++ b/OsmAnd/.gitignore @@ -13,10 +13,13 @@ libs/it.unibo.alice.tuprolog-tuprolog-3.2.1.jar libs/commons-codec-commons-codec-1.11.jar libs/OsmAndCore_android-0.1-SNAPSHOT.jar +# Huawei libs/huawei-*.jar huaweidrmlib/ HwDRM_SDK_* drm_strings.xml +agconnect-services.json +OsmAndHms.jks # copy_widget_icons.sh res/drawable-large/map_* diff --git a/OsmAnd/AndroidManifest-freehuawei.xml b/OsmAnd/AndroidManifest-freehuawei.xml index e96bb7fe47..c557d5fe2a 100644 --- a/OsmAnd/AndroidManifest-freehuawei.xml +++ b/OsmAnd/AndroidManifest-freehuawei.xml @@ -2,24 +2,31 @@ - - - - + + + + + + + + - + tools:replace="android:authorities" + android:authorities="net.osmand.huawei.fileprovider"/> - \ No newline at end of file diff --git a/OsmAnd/AndroidManifest-huawei.xml b/OsmAnd/AndroidManifest-huawei.xml deleted file mode 100644 index bc847980cd..0000000000 --- a/OsmAnd/AndroidManifest-huawei.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index 95599f2c0e..2c6d6b6463 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -371,6 +371,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -393,6 +459,12 @@ + + + + + +
@@ -482,6 +554,13 @@ + + + + + + + @@ -949,6 +1028,7 @@ android:process="net.osmand.plus" android:label="@string/process_navigation_service" android:name="net.osmand.plus.NavigationService" + android:foregroundServiceType="location" android:stopWithTask="false"> diff --git a/OsmAnd/assets/bundled_assets.xml b/OsmAnd/assets/bundled_assets.xml index e27ff76cd7..30d1422d0f 100644 --- a/OsmAnd/assets/bundled_assets.xml +++ b/OsmAnd/assets/bundled_assets.xml @@ -50,6 +50,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index 6bebf5f67b..2775f1a2c2 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -22,8 +22,8 @@ task printc { } android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 29 + buildToolsVersion "29.0.3" // compileNdkVersion "android-ndk-r17b" signingConfigs { @@ -40,15 +40,24 @@ android { keyAlias "osmand" keyPassword System.getenv("OSMAND_APK_PASSWORD") } + + publishingHuawei { + storeFile file("/var/lib/jenkins/osmand_hw_key") + storePassword System.getenv("OSMAND_HW_APK_PASSWORD") + keyAlias "osmand" + keyPassword System.getenv("OSMAND_HW_APK_PASSWORD") + v1SigningEnabled true + v2SigningEnabled true + } } defaultConfig { minSdkVersion System.getenv("MIN_SDK_VERSION") ? System.getenv("MIN_SDK_VERSION").toInteger() : 15 targetSdkVersion 28 - versionCode 370 + versionCode 390 versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode multiDexEnabled true - versionName "3.7.0" + versionName "3.9.0" versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName // Stops the Gradle plugin’s automatic rasterization of vectors @@ -107,19 +116,26 @@ android { debug { manifest.srcFile "AndroidManifest-debug.xml" } + full { + java.srcDirs = ["src-google"] + } + fulldev { + java.srcDirs = ["src-google"] + } free { + java.srcDirs = ["src-google"] manifest.srcFile "AndroidManifest-free.xml" } freedev { + java.srcDirs = ["src-google"] manifest.srcFile "AndroidManifest-freedev.xml" } freecustom { + java.srcDirs = ["src-google"] manifest.srcFile "AndroidManifest-freecustom.xml" } - huawei { - manifest.srcFile "AndroidManifest-huawei.xml" - } freehuawei { + java.srcDirs = ["src-huawei"] manifest.srcFile "AndroidManifest-freehuawei.xml" } @@ -185,21 +201,16 @@ android { dimension "version" applicationId "net.osmand.plus" } - fulldev { - dimension "version" - applicationId "net.osmand.plus" - resConfig "en" - //resConfigs "xxhdpi", "nodpi" - } - huawei { + fulldev { dimension "version" - applicationId "net.osmand.plus.huawei" + applicationId "net.osmand.plus" + resConfig "en" + // resConfigs "xxhdpi", "nodpi" } freehuawei { dimension "version" applicationId "net.osmand.huawei" } - // CoreVersion legacy { dimension "coreversion" @@ -219,7 +230,11 @@ android { signingConfig signingConfigs.development } release { - signingConfig signingConfigs.publishing + if (gradle.startParameter.taskNames.toString().contains("huawei")) { + signingConfig signingConfigs.publishingHuawei + } else { + signingConfig signingConfigs.publishing + } } } @@ -276,46 +291,6 @@ task downloadWorldMiniBasemap { } } -task downloadHuaweiDrmZip { - doLast { - ant.get(src: 'https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/HwDRM_SDK_2.5.2.300_ADT.zip', dest: 'HwDRM_SDK_2.5.2.300_ADT.zip', skipexisting: 'true') - ant.unzip(src: 'HwDRM_SDK_2.5.2.300_ADT.zip', dest: 'huaweidrmlib/') - } -} - -task copyHuaweiDrmLibs(type: Copy) { - dependsOn downloadHuaweiDrmZip - from "huaweidrmlib/HwDRM_SDK_2.5.2.300_ADT/libs" - into "libs" -} - -task copyHuaweiDrmValues(type: Copy) { - dependsOn downloadHuaweiDrmZip - from "huaweidrmlib/HwDRM_SDK_2.5.2.300_ADT/res" - into "res" -} - -task downloadPrebuiltHuaweiDrm { - dependsOn copyHuaweiDrmLibs, copyHuaweiDrmValues -} - -task cleanHuaweiDrmLibs(type: Delete) { - delete "huaweidrmlib" - delete fileTree("libs").matching { - include "**/huawei-*.jar" - } -} - -task cleanHuaweiDrmValues(type: Delete) { - delete fileTree("res").matching { - include "**/drm_strings.xml" - } -} - -task cleanPrebuiltHuaweiDrm { - dependsOn cleanHuaweiDrmLibs, cleanHuaweiDrmValues -} - task collectVoiceAssets(type: Sync) { from "../../resources/voice" into "assets/voice" @@ -397,8 +372,6 @@ task copyLargePOIIcons(type: Sync) { } } - - task copyWidgetIconsXhdpi(type: Sync) { from "res/drawable-xxhdpi/" into "res/drawable-large-xhdpi/" @@ -444,15 +417,6 @@ task collectExternalResources { copyWidgetIconsXhdpi, copyPoiCategories, downloadWorldMiniBasemap - - Gradle gradle = getGradle() - String tskReqStr = gradle.getStartParameter().getTaskRequests().toString().toLowerCase() - // Use Drm SDK only for huawei build - if (tskReqStr.contains("huawei")) { - dependsOn downloadPrebuiltHuaweiDrm - } else { - dependsOn cleanPrebuiltHuaweiDrm - } } // Legacy core build @@ -503,10 +467,16 @@ task cleanupDuplicatesInCore() { file("libs/x86_64/libc++_shared.so").renameTo(file("libc++/x86_64/libc++_shared.so")) } } + afterEvaluate { android.applicationVariants.all { variant -> variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore) } + Gradle gradle = getGradle() + String tskReqStr = gradle.getStartParameter().getTaskRequests().toString().toLowerCase() + if (tskReqStr.contains("huawei")) { + apply plugin: 'com.huawei.agconnect' + } } task appStart(type: Exec) { @@ -516,15 +486,14 @@ task appStart(type: Exec) { // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' } - dependencies { implementation project(path: ':OsmAnd-java', configuration: 'android') implementation project(':OsmAnd-api') implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'com.google.android.material:material:1.2.0-alpha06' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') @@ -563,7 +532,7 @@ dependencies { implementation ("com.github.HITGIF:TextFieldBoxes:1.4.5"){ exclude group: 'com.android.support' } + implementation 'com.jaredrummler:colorpicker:1.1.0' - huaweiImplementation files('libs/huawei-android-drm_v2.5.2.300.jar') - freehuaweiImplementation files('libs/huawei-android-drm_v2.5.2.300.jar') + freehuaweiImplementation 'com.huawei.hms:iap:5.0.2.300' } diff --git a/OsmAnd/res/anim/slide_in_right.xml b/OsmAnd/res/anim/slide_in_right.xml new file mode 100644 index 0000000000..a58a25ac16 --- /dev/null +++ b/OsmAnd/res/anim/slide_in_right.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/anim/slide_out_right.xml b/OsmAnd/res/anim/slide_out_right.xml new file mode 100644 index 0000000000..7bc5c5a50b --- /dev/null +++ b/OsmAnd/res/anim/slide_out_right.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_bottom.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_bottom.png new file mode 100644 index 0000000000..2799253200 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_bottom.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_bottom_small.png new file mode 100644 index 0000000000..8d51cd30ed Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_bottom_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_center.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_center.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_bg_point_circle_center.png rename to OsmAnd/res/drawable-hdpi/ic_bg_point_circle_center.png diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_center_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_center_small.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_bg_point_circle_center_small.png rename to OsmAnd/res/drawable-hdpi/ic_bg_point_circle_center_small.png diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png new file mode 100644 index 0000000000..d36fb08fe1 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png new file mode 100644 index 0000000000..0ef9642381 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..3c9399bf3e Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..f91e3dd324 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..5129540170 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..44732ca907 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..f968e14194 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..4ac04f094b Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_bottom.png new file mode 100644 index 0000000000..920e1bd3a6 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_bottom.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_bottom_small.png new file mode 100644 index 0000000000..905bdce355 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_bottom_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_center.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_center.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_bg_point_octagon_center.png rename to OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_center.png diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_center_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_center_small.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_bg_point_octagon_center_small.png rename to OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_center_small.png diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png new file mode 100644 index 0000000000..3b51758a24 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png new file mode 100644 index 0000000000..323c5981ef Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_bottom.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_bottom.png new file mode 100644 index 0000000000..255fac9c22 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_bottom.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_bottom_small.png new file mode 100644 index 0000000000..66b60f2f93 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_bottom_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_square_center.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_center.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_bg_point_square_center.png rename to OsmAnd/res/drawable-hdpi/ic_bg_point_square_center.png diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_square_center_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_center_small.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_bg_point_square_center_small.png rename to OsmAnd/res/drawable-hdpi/ic_bg_point_square_center_small.png diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png new file mode 100644 index 0000000000..76f7ec7ea2 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png new file mode 100644 index 0000000000..02d6d253d0 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_pin_avoid_road.png b/OsmAnd/res/drawable-hdpi/ic_pin_avoid_road.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_pin_avoid_road.png rename to OsmAnd/res/drawable-hdpi/ic_pin_avoid_road.png diff --git a/OsmAnd/res/drawable-hdpi/map_white_favorite_shield.png b/OsmAnd/res/drawable-hdpi/ic_white_favorite_shield.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_white_favorite_shield.png rename to OsmAnd/res/drawable-hdpi/ic_white_favorite_shield.png diff --git a/OsmAnd/res/drawable-hdpi/map_white_shield_small.png b/OsmAnd/res/drawable-hdpi/ic_white_shield_small.png similarity index 100% rename from OsmAnd/res/drawable-hdpi/map_white_shield_small.png rename to OsmAnd/res/drawable-hdpi/ic_white_shield_small.png diff --git a/OsmAnd/res/drawable-hdpi/image_text_openstreetmap.png b/OsmAnd/res/drawable-hdpi/image_text_openstreetmap.png deleted file mode 100755 index 97baccaa34..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/image_text_openstreetmap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/image_text_osmand.png b/OsmAnd/res/drawable-hdpi/image_text_osmand.png deleted file mode 100644 index a26b0faa2e..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/image_text_osmand.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/image_text_osmand_inapp.png b/OsmAnd/res/drawable-hdpi/image_text_osmand_inapp.png deleted file mode 100644 index 43866889c8..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/image_text_osmand_inapp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-hdpi/image_text_osmand_osmlive.png deleted file mode 100644 index f48103258b..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/image_text_osmand_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/image_text_osmand_plus.png b/OsmAnd/res/drawable-hdpi/image_text_osmand_plus.png deleted file mode 100644 index 4d8e665d1b..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/image_text_osmand_plus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-hdpi/image_text_osmand_plus_osmlive.png deleted file mode 100644 index 6adccd5a60..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/image_text_osmand_plus_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom.png b/OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom.png deleted file mode 100644 index c8bc0aa788..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom_small.png deleted file mode 100644 index 2410b26ff6..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_top.png b/OsmAnd/res/drawable-hdpi/map_bg_point_circle_top.png deleted file mode 100644 index b615c7f238..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_top_small.png b/OsmAnd/res/drawable-hdpi/map_bg_point_circle_top_small.png deleted file mode 100644 index 2809823cf3..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_circle_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_bottom.png deleted file mode 100644 index 28e7300687..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_bottom_small.png deleted file mode 100644 index 39d52a353e..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_top.png b/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_top.png deleted file mode 100644 index a65fd59720..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_top_small.png deleted file mode 100644 index 734414193b..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_octagon_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom.png b/OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom.png deleted file mode 100644 index 5461a024ba..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom_small.png deleted file mode 100644 index 8ded1dd9a7..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_square_top.png b/OsmAnd/res/drawable-hdpi/map_bg_point_square_top.png deleted file mode 100644 index f8bbe4588b..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_square_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_bg_point_square_top_small.png b/OsmAnd/res/drawable-hdpi/map_bg_point_square_top_small.png deleted file mode 100644 index 9a4a3ccbed..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_bg_point_square_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass.png b/OsmAnd/res/drawable-hdpi/map_compass.png deleted file mode 100644 index e852a4db1d..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_bearing.png b/OsmAnd/res/drawable-hdpi/map_compass_bearing.png deleted file mode 100644 index 525fec8476..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-hdpi/map_compass_bearing_white.png deleted file mode 100644 index dff3bbb54a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_niu.png b/OsmAnd/res/drawable-hdpi/map_compass_niu.png deleted file mode 100644 index 3ae3157990..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_niu_template.png b/OsmAnd/res/drawable-hdpi/map_compass_niu_template.png deleted file mode 100644 index 1297b4378c..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_niu_template.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-hdpi/map_compass_niu_white.png deleted file mode 100644 index 6f91322c2a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_niu_white_template.png b/OsmAnd/res/drawable-hdpi/map_compass_niu_white_template.png deleted file mode 100644 index 9b0a2cbc3a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_niu_white_template.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_compass_white.png b/OsmAnd/res/drawable-hdpi/map_compass_white.png deleted file mode 100644 index 347709b624..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_dashboard.png b/OsmAnd/res/drawable-hdpi/map_dashboard.png deleted file mode 100644 index 04f8e5559a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_dashboard.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_directions.png b/OsmAnd/res/drawable-hdpi/map_directions.png deleted file mode 100644 index ad3e3daaa3..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_directions.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_down.png b/OsmAnd/res/drawable-hdpi/map_down.png deleted file mode 100644 index 776da36efd..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_down.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_drawer.png b/OsmAnd/res/drawable-hdpi/map_drawer.png deleted file mode 100644 index e99ca193e6..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_drawer.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_favorite.png b/OsmAnd/res/drawable-hdpi/map_favorite.png deleted file mode 100644 index e8307094fa..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_favorite.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_layer_dark.png b/OsmAnd/res/drawable-hdpi/map_layer_dark.png deleted file mode 100644 index 58b508506e..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_layer_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_layer_night.png b/OsmAnd/res/drawable-hdpi/map_layer_night.png deleted file mode 100644 index c77e9f2bab..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_layer_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_marker_point_14dp.png b/OsmAnd/res/drawable-hdpi/map_marker_point_14dp.png deleted file mode 100644 index 7f4e9e7012..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_marker_point_14dp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_note_audio.png b/OsmAnd/res/drawable-hdpi/map_note_audio.png deleted file mode 100644 index ec824f1f5a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_note_audio.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_note_photo.png b/OsmAnd/res/drawable-hdpi/map_note_photo.png deleted file mode 100644 index a586bcdd95..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_note_photo.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_note_small.png b/OsmAnd/res/drawable-hdpi/map_note_small.png deleted file mode 100644 index d6ef5c7895..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_note_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_note_video.png b/OsmAnd/res/drawable-hdpi/map_note_video.png deleted file mode 100644 index 48066ca5c1..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_note_video.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_osm_resolved.png b/OsmAnd/res/drawable-hdpi/map_osm_resolved.png deleted file mode 100644 index a2fd06e3f5..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_osm_resolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_osm_resolved_small.png b/OsmAnd/res/drawable-hdpi/map_osm_resolved_small.png deleted file mode 100644 index b34a4af881..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_osm_resolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_osm_unresolved.png b/OsmAnd/res/drawable-hdpi/map_osm_unresolved.png deleted file mode 100644 index d590a5283a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_osm_unresolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_osm_unresolved_small.png b/OsmAnd/res/drawable-hdpi/map_osm_unresolved_small.png deleted file mode 100644 index 92dc738c0a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_osm_unresolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_overflow_menu_white.png b/OsmAnd/res/drawable-hdpi/map_overflow_menu_white.png deleted file mode 100644 index 275193e115..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_overflow_menu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_pin_destination.png b/OsmAnd/res/drawable-hdpi/map_pin_destination.png deleted file mode 100644 index 56ef29b090..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_pin_destination.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_pin_origin.png b/OsmAnd/res/drawable-hdpi/map_pin_origin.png deleted file mode 100644 index fe5a345d51..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_pin_origin.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_pin_poi.png b/OsmAnd/res/drawable-hdpi/map_pin_poi.png deleted file mode 100644 index 1d6a8d412b..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_pin_poi.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_pin_poi_small.png b/OsmAnd/res/drawable-hdpi/map_pin_poi_small.png deleted file mode 100644 index 65242db619..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_pin_poi_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_poi_parking_pos_limit.png b/OsmAnd/res/drawable-hdpi/map_poi_parking_pos_limit.png deleted file mode 100644 index c70b63da12..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_poi_parking_pos_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_poi_parking_pos_no_limit.png b/OsmAnd/res/drawable-hdpi/map_poi_parking_pos_no_limit.png deleted file mode 100644 index cb01e5bc3e..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_poi_parking_pos_no_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_search_dark.png b/OsmAnd/res/drawable-hdpi/map_search_dark.png deleted file mode 100644 index 6d13bd3992..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_search_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_search_night.png b/OsmAnd/res/drawable-hdpi/map_search_night.png deleted file mode 100644 index 3a11b7f50a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_search_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_shield_marker_point_color.png b/OsmAnd/res/drawable-hdpi/map_shield_marker_point_color.png deleted file mode 100644 index d450f26b27..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_shield_marker_point_color.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_shield_marker_point_shadow.png b/OsmAnd/res/drawable-hdpi/map_shield_marker_point_shadow.png deleted file mode 100644 index 5a532cf41c..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_shield_marker_point_shadow.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_shield_marker_point_stroke.png b/OsmAnd/res/drawable-hdpi/map_shield_marker_point_stroke.png deleted file mode 100644 index 5398836fea..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_shield_marker_point_stroke.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_shield_tap.png b/OsmAnd/res/drawable-hdpi/map_shield_tap.png deleted file mode 100644 index af3bb145ff..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_shield_tap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_shield_tap_small.png b/OsmAnd/res/drawable-hdpi/map_shield_tap_small.png deleted file mode 100644 index e089b51a75..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_shield_tap_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_small_group.png b/OsmAnd/res/drawable-hdpi/map_small_group.png deleted file mode 100644 index 1ca12287f9..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_small_group.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_start_navigation.png b/OsmAnd/res/drawable-hdpi/map_start_navigation.png deleted file mode 100644 index 9ab5382df1..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_start_navigation.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_track_point_finish.png b/OsmAnd/res/drawable-hdpi/map_track_point_finish.png new file mode 100644 index 0000000000..a8e9b15847 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/map_track_point_finish.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_track_point_start.png b/OsmAnd/res/drawable-hdpi/map_track_point_start.png new file mode 100644 index 0000000000..da998f22e2 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/map_track_point_start.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_track_point_start_finish.png b/OsmAnd/res/drawable-hdpi/map_track_point_start_finish.png new file mode 100644 index 0000000000..70115e1cb9 Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/map_track_point_start_finish.png differ diff --git a/OsmAnd/res/drawable-hdpi/map_transport_stop_bg.png b/OsmAnd/res/drawable-hdpi/map_transport_stop_bg.png deleted file mode 100644 index 18fda5981f..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_transport_stop_bg.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_transport_stop_bus.png b/OsmAnd/res/drawable-hdpi/map_transport_stop_bus.png deleted file mode 100644 index 8692bac467..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_transport_stop_bus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_transport_stop_small.png b/OsmAnd/res/drawable-hdpi/map_transport_stop_small.png deleted file mode 100644 index b7988c4652..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_transport_stop_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_transport_stop_tram.png b/OsmAnd/res/drawable-hdpi/map_transport_stop_tram.png deleted file mode 100644 index 9eeb78c258..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_transport_stop_tram.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward.png b/OsmAnd/res/drawable-hdpi/map_turn_forward.png deleted file mode 100644 index 39eff5a3ff..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_keep_right.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_keep_right.png deleted file mode 100644 index 930a6ed29a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_keep_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_keep_right_small.png deleted file mode 100644 index 4f061a8f65..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_right_turn.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_right_turn.png deleted file mode 100644 index 132513feb9..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_right_turn_small.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_right_turn_small.png deleted file mode 100644 index a8c31c4d63..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_slight_right_turn.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_slight_right_turn.png deleted file mode 100644 index 61e2369dd5..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_slight_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_slight_right_turn_small.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_slight_right_turn_small.png deleted file mode 100644 index 0423af6252..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_slight_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_small.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_small.png deleted file mode 100644 index 4d8d5d6220..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_turn_sharp.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_turn_sharp.png deleted file mode 100644 index 08cc5042a7..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_turn_sharp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_turn_sharp_small.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_turn_sharp_small.png deleted file mode 100644 index 4d2072a5dd..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_turn_sharp_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_uturn_right.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_uturn_right.png deleted file mode 100644 index bdb4615100..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_forward_uturn_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_forward_uturn_right_small.png deleted file mode 100644 index 371d917de1..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_forward_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_keep_right.png b/OsmAnd/res/drawable-hdpi/map_turn_keep_right.png deleted file mode 100644 index 53bf1bbd5a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_keep_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_keep_right_small.png deleted file mode 100644 index f99dc29a3a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_right.png b/OsmAnd/res/drawable-hdpi/map_turn_right.png deleted file mode 100644 index ebec78a249..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_right2.png b/OsmAnd/res/drawable-hdpi/map_turn_right2.png deleted file mode 100644 index d6430b5a27..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_right2.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_right2_small.png b/OsmAnd/res/drawable-hdpi/map_turn_right2_small.png deleted file mode 100644 index 03f80cd255..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_right2_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_right_small.png deleted file mode 100644 index 53e123a4b0..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_sharp_right.png b/OsmAnd/res/drawable-hdpi/map_turn_sharp_right.png deleted file mode 100644 index c2bb82a6cf..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_sharp_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_sharp_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_sharp_right_small.png deleted file mode 100644 index 4cb21fabd2..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_sharp_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_slight_right.png b/OsmAnd/res/drawable-hdpi/map_turn_slight_right.png deleted file mode 100644 index 9e1697651e..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_slight_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_slight_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_slight_right_small.png deleted file mode 100644 index c560ff67d6..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_slight_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_uturn.png b/OsmAnd/res/drawable-hdpi/map_turn_uturn.png deleted file mode 100644 index 7731d4de0f..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_uturn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_uturn_right.png b/OsmAnd/res/drawable-hdpi/map_turn_uturn_right.png deleted file mode 100644 index e592adb980..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_uturn_right_small.png b/OsmAnd/res/drawable-hdpi/map_turn_uturn_right_small.png deleted file mode 100644 index c83264f13c..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_turn_uturn_small.png b/OsmAnd/res/drawable-hdpi/map_turn_uturn_small.png deleted file mode 100644 index bb3725e373..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_turn_uturn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_up.png b/OsmAnd/res/drawable-hdpi/map_up.png deleted file mode 100644 index 552b50fa4f..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_up.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_white_orange_poi_shield.png b/OsmAnd/res/drawable-hdpi/map_white_orange_poi_shield.png deleted file mode 100644 index 2f80b35243..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_white_orange_poi_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_white_orange_poi_shield_small.png b/OsmAnd/res/drawable-hdpi/map_white_orange_poi_shield_small.png deleted file mode 100644 index 65558478b7..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_white_orange_poi_shield_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_white_shield.png b/OsmAnd/res/drawable-hdpi/map_white_shield.png deleted file mode 100644 index 382d257cbc..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_white_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_widget_compass_ruller_day.png b/OsmAnd/res/drawable-hdpi/map_widget_compass_ruller_day.png deleted file mode 100644 index e2b29ec083..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_widget_compass_ruller_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_widget_compass_ruller_location_day.png b/OsmAnd/res/drawable-hdpi/map_widget_compass_ruller_location_day.png deleted file mode 100644 index ac2ecee872..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_widget_compass_ruller_location_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_world_globe_dark.png b/OsmAnd/res/drawable-hdpi/map_world_globe_dark.png deleted file mode 100644 index 0acdc07e7a..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_world_globe_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_zoom_in_night.png b/OsmAnd/res/drawable-hdpi/map_zoom_in_night.png deleted file mode 100644 index 8b72e3b86e..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_zoom_in_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/map_zoom_out_night.png b/OsmAnd/res/drawable-hdpi/map_zoom_out_night.png deleted file mode 100644 index 2528efec53..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/map_zoom_out_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-hdpi/warnings_speed_limit_ca.png b/OsmAnd/res/drawable-hdpi/warnings_speed_limit_ca.png new file mode 100644 index 0000000000..987c7c4b3f Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/warnings_speed_limit_ca.png differ diff --git a/OsmAnd/res/drawable-large/warnings_speed_limit_ca.png b/OsmAnd/res/drawable-large/warnings_speed_limit_ca.png new file mode 100644 index 0000000000..987c7c4b3f Binary files /dev/null and b/OsmAnd/res/drawable-large/warnings_speed_limit_ca.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_bottom.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_bottom.png new file mode 100644 index 0000000000..282ddb3a9f Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_bottom.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_bottom_small.png new file mode 100644 index 0000000000..5670be0d89 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_bottom_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_center.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_center.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_bg_point_circle_center.png rename to OsmAnd/res/drawable-mdpi/ic_bg_point_circle_center.png diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_center_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_center_small.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_bg_point_circle_center_small.png rename to OsmAnd/res/drawable-mdpi/ic_bg_point_circle_center_small.png diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png new file mode 100644 index 0000000000..60a7749e57 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png new file mode 100644 index 0000000000..67b6398406 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..96a5ef7fa7 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..5d61d42fea Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..df0bbaddfe Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..b916e0e73a Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..f52f622e9c Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..a268192785 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_bottom.png new file mode 100644 index 0000000000..b7d4ec1812 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_bottom.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_bottom_small.png new file mode 100644 index 0000000000..803e5053be Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_bottom_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_center.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_center.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_bg_point_octagon_center.png rename to OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_center.png diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_center_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_center_small.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_bg_point_octagon_center_small.png rename to OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_center_small.png diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png new file mode 100644 index 0000000000..2a673dc01e Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png new file mode 100644 index 0000000000..30b1a327de Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_bottom.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_bottom.png new file mode 100644 index 0000000000..406613f2b6 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_bottom.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_bottom_small.png new file mode 100644 index 0000000000..c22f46f2be Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_bottom_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_square_center.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_center.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_bg_point_square_center.png rename to OsmAnd/res/drawable-mdpi/ic_bg_point_square_center.png diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_square_center_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_center_small.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_bg_point_square_center_small.png rename to OsmAnd/res/drawable-mdpi/ic_bg_point_square_center_small.png diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png new file mode 100644 index 0000000000..ee2ce66822 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png new file mode 100644 index 0000000000..9f7a960cad Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_pin_avoid_road.png b/OsmAnd/res/drawable-mdpi/ic_pin_avoid_road.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_pin_avoid_road.png rename to OsmAnd/res/drawable-mdpi/ic_pin_avoid_road.png diff --git a/OsmAnd/res/drawable-mdpi/map_white_favorite_shield.png b/OsmAnd/res/drawable-mdpi/ic_white_favorite_shield.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_white_favorite_shield.png rename to OsmAnd/res/drawable-mdpi/ic_white_favorite_shield.png diff --git a/OsmAnd/res/drawable-mdpi/map_white_shield_small.png b/OsmAnd/res/drawable-mdpi/ic_white_shield_small.png similarity index 100% rename from OsmAnd/res/drawable-mdpi/map_white_shield_small.png rename to OsmAnd/res/drawable-mdpi/ic_white_shield_small.png diff --git a/OsmAnd/res/drawable-mdpi/image_text_openstreetmap.png b/OsmAnd/res/drawable-mdpi/image_text_openstreetmap.png deleted file mode 100755 index df76dd0088..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/image_text_openstreetmap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand.png b/OsmAnd/res/drawable-mdpi/image_text_osmand.png deleted file mode 100644 index a841937deb..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/image_text_osmand.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand_inapp.png b/OsmAnd/res/drawable-mdpi/image_text_osmand_inapp.png deleted file mode 100644 index 470f1cb49f..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/image_text_osmand_inapp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-mdpi/image_text_osmand_osmlive.png deleted file mode 100644 index fcd0191440..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/image_text_osmand_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand_plus.png b/OsmAnd/res/drawable-mdpi/image_text_osmand_plus.png deleted file mode 100644 index 16b7a91f45..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/image_text_osmand_plus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-mdpi/image_text_osmand_plus_osmlive.png deleted file mode 100644 index c4a80b7a2b..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/image_text_osmand_plus_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom.png b/OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom.png deleted file mode 100644 index 010df788d2..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom_small.png deleted file mode 100644 index 2901029e51..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_top.png b/OsmAnd/res/drawable-mdpi/map_bg_point_circle_top.png deleted file mode 100644 index cb5600c796..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_top_small.png b/OsmAnd/res/drawable-mdpi/map_bg_point_circle_top_small.png deleted file mode 100644 index bde62f99ea..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_circle_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_bottom.png deleted file mode 100644 index 5f65385c11..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_bottom_small.png deleted file mode 100644 index 7c37a02792..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_top.png b/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_top.png deleted file mode 100644 index f99116ef61..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_top_small.png deleted file mode 100644 index 421431696b..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_octagon_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom.png b/OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom.png deleted file mode 100644 index ecdb05f937..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom_small.png deleted file mode 100644 index 78315138e1..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_square_top.png b/OsmAnd/res/drawable-mdpi/map_bg_point_square_top.png deleted file mode 100644 index e93346d3d3..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_square_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_bg_point_square_top_small.png b/OsmAnd/res/drawable-mdpi/map_bg_point_square_top_small.png deleted file mode 100644 index 71ea46aee0..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_bg_point_square_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass.png b/OsmAnd/res/drawable-mdpi/map_compass.png deleted file mode 100644 index 82ee8e66f6..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_bearing.png b/OsmAnd/res/drawable-mdpi/map_compass_bearing.png deleted file mode 100644 index 4617da83fa..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-mdpi/map_compass_bearing_white.png deleted file mode 100644 index 680be485dd..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_niu.png b/OsmAnd/res/drawable-mdpi/map_compass_niu.png deleted file mode 100644 index 5207161498..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-mdpi/map_compass_niu_white.png deleted file mode 100644 index e88b091f95..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_compass_white.png b/OsmAnd/res/drawable-mdpi/map_compass_white.png deleted file mode 100644 index c7adab646f..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_dashboard.png b/OsmAnd/res/drawable-mdpi/map_dashboard.png deleted file mode 100644 index 80b5433066..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_dashboard.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_directions.png b/OsmAnd/res/drawable-mdpi/map_directions.png deleted file mode 100644 index 4dd4a94c35..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_directions.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_down.png b/OsmAnd/res/drawable-mdpi/map_down.png deleted file mode 100644 index e6007468dd..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_down.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_drawer.png b/OsmAnd/res/drawable-mdpi/map_drawer.png deleted file mode 100644 index 80409f3676..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_drawer.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_favorite.png b/OsmAnd/res/drawable-mdpi/map_favorite.png deleted file mode 100644 index 5de8988a7b..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_favorite.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_layer_dark.png b/OsmAnd/res/drawable-mdpi/map_layer_dark.png deleted file mode 100644 index 27ff0e31ea..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_layer_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_layer_night.png b/OsmAnd/res/drawable-mdpi/map_layer_night.png deleted file mode 100644 index 1323348606..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_layer_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_marker_point_14dp.png b/OsmAnd/res/drawable-mdpi/map_marker_point_14dp.png deleted file mode 100644 index fe8e107614..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_marker_point_14dp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_note_audio.png b/OsmAnd/res/drawable-mdpi/map_note_audio.png deleted file mode 100644 index c74bbab0e1..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_note_audio.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_note_photo.png b/OsmAnd/res/drawable-mdpi/map_note_photo.png deleted file mode 100644 index a6f06ef560..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_note_photo.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_note_small.png b/OsmAnd/res/drawable-mdpi/map_note_small.png deleted file mode 100644 index 48e778db2d..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_note_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_note_video.png b/OsmAnd/res/drawable-mdpi/map_note_video.png deleted file mode 100644 index f0429b740c..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_note_video.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_osm_resolved.png b/OsmAnd/res/drawable-mdpi/map_osm_resolved.png deleted file mode 100644 index 5d3e53b875..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_osm_resolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_osm_resolved_small.png b/OsmAnd/res/drawable-mdpi/map_osm_resolved_small.png deleted file mode 100644 index 0ba3a764e0..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_osm_resolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_osm_unresolved.png b/OsmAnd/res/drawable-mdpi/map_osm_unresolved.png deleted file mode 100644 index 02c0dbb338..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_osm_unresolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_osm_unresolved_small.png b/OsmAnd/res/drawable-mdpi/map_osm_unresolved_small.png deleted file mode 100644 index 865d16ee14..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_osm_unresolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_overflow_menu_white.png b/OsmAnd/res/drawable-mdpi/map_overflow_menu_white.png deleted file mode 100644 index 280a7d376b..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_overflow_menu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_pin_destination.png b/OsmAnd/res/drawable-mdpi/map_pin_destination.png deleted file mode 100644 index bf1c5801e4..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_pin_destination.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_pin_origin.png b/OsmAnd/res/drawable-mdpi/map_pin_origin.png deleted file mode 100644 index 2b63c5e272..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_pin_origin.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_pin_poi.png b/OsmAnd/res/drawable-mdpi/map_pin_poi.png deleted file mode 100644 index eae4ed951a..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_pin_poi.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_pin_poi_small.png b/OsmAnd/res/drawable-mdpi/map_pin_poi_small.png deleted file mode 100644 index b9ee787477..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_pin_poi_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_poi_parking_pos_limit.png b/OsmAnd/res/drawable-mdpi/map_poi_parking_pos_limit.png deleted file mode 100644 index 46013b1025..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_poi_parking_pos_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_poi_parking_pos_no_limit.png b/OsmAnd/res/drawable-mdpi/map_poi_parking_pos_no_limit.png deleted file mode 100644 index 1563bbeb47..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_poi_parking_pos_no_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_search_dark.png b/OsmAnd/res/drawable-mdpi/map_search_dark.png deleted file mode 100644 index 57ec156449..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_search_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_search_night.png b/OsmAnd/res/drawable-mdpi/map_search_night.png deleted file mode 100644 index e7c322565e..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_search_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_shield_marker_point_color.png b/OsmAnd/res/drawable-mdpi/map_shield_marker_point_color.png deleted file mode 100644 index a1064e4a72..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_shield_marker_point_color.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_shield_marker_point_shadow.png b/OsmAnd/res/drawable-mdpi/map_shield_marker_point_shadow.png deleted file mode 100644 index d0f07acc69..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_shield_marker_point_shadow.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_shield_marker_point_stroke.png b/OsmAnd/res/drawable-mdpi/map_shield_marker_point_stroke.png deleted file mode 100644 index cb183db658..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_shield_marker_point_stroke.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_shield_tap.png b/OsmAnd/res/drawable-mdpi/map_shield_tap.png deleted file mode 100644 index def29aa671..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_shield_tap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_shield_tap_small.png b/OsmAnd/res/drawable-mdpi/map_shield_tap_small.png deleted file mode 100644 index eabca2da74..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_shield_tap_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_small_group.png b/OsmAnd/res/drawable-mdpi/map_small_group.png deleted file mode 100644 index 0e35fadf79..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_small_group.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_start_navigation.png b/OsmAnd/res/drawable-mdpi/map_start_navigation.png deleted file mode 100644 index 226a412587..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_start_navigation.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_track_point_finish.png b/OsmAnd/res/drawable-mdpi/map_track_point_finish.png new file mode 100644 index 0000000000..ecf9d612ea Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/map_track_point_finish.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_track_point_start.png b/OsmAnd/res/drawable-mdpi/map_track_point_start.png new file mode 100644 index 0000000000..e1dde0d633 Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/map_track_point_start.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_track_point_start_finish.png b/OsmAnd/res/drawable-mdpi/map_track_point_start_finish.png new file mode 100644 index 0000000000..1507b94ead Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/map_track_point_start_finish.png differ diff --git a/OsmAnd/res/drawable-mdpi/map_transport_stop_bg.png b/OsmAnd/res/drawable-mdpi/map_transport_stop_bg.png deleted file mode 100644 index 95b0e8bf47..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_transport_stop_bg.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_transport_stop_bus.png b/OsmAnd/res/drawable-mdpi/map_transport_stop_bus.png deleted file mode 100644 index 3968b969fb..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_transport_stop_bus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_transport_stop_small.png b/OsmAnd/res/drawable-mdpi/map_transport_stop_small.png deleted file mode 100644 index c98e19bb2d..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_transport_stop_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_transport_stop_tram.png b/OsmAnd/res/drawable-mdpi/map_transport_stop_tram.png deleted file mode 100644 index 2baf5ff167..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_transport_stop_tram.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward.png b/OsmAnd/res/drawable-mdpi/map_turn_forward.png deleted file mode 100644 index bdf4c96ff4..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_keep_right.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_keep_right.png deleted file mode 100644 index a2a0f3d7b8..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_keep_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_keep_right_small.png deleted file mode 100644 index 8a339f920c..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_right_turn.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_right_turn.png deleted file mode 100644 index baeeca9271..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_right_turn_small.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_right_turn_small.png deleted file mode 100644 index fb3fdbefa4..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_slight_right_turn.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_slight_right_turn.png deleted file mode 100644 index 452ecefdec..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_slight_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_slight_right_turn_small.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_slight_right_turn_small.png deleted file mode 100644 index dfc000e52d..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_slight_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_small.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_small.png deleted file mode 100644 index d70eace6b7..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_turn_sharp.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_turn_sharp.png deleted file mode 100644 index 1f11c2004f..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_turn_sharp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_turn_sharp_small.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_turn_sharp_small.png deleted file mode 100644 index ed6c1c4cbb..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_turn_sharp_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_uturn_right.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_uturn_right.png deleted file mode 100644 index c5d5f24f36..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_forward_uturn_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_forward_uturn_right_small.png deleted file mode 100644 index a2a5cfff46..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_forward_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_keep_right.png b/OsmAnd/res/drawable-mdpi/map_turn_keep_right.png deleted file mode 100644 index 6775427dd6..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_keep_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_keep_right_small.png deleted file mode 100644 index 57a11ac3be..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_right.png b/OsmAnd/res/drawable-mdpi/map_turn_right.png deleted file mode 100644 index cf5e5f0243..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_right2.png b/OsmAnd/res/drawable-mdpi/map_turn_right2.png deleted file mode 100644 index 594b8c6b8b..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_right2.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_right2_small.png b/OsmAnd/res/drawable-mdpi/map_turn_right2_small.png deleted file mode 100644 index 61f149e592..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_right2_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_right_small.png deleted file mode 100644 index 095a3362be..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_sharp_right.png b/OsmAnd/res/drawable-mdpi/map_turn_sharp_right.png deleted file mode 100644 index 26a5fdeda2..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_sharp_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_sharp_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_sharp_right_small.png deleted file mode 100644 index 36ac46e5e9..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_sharp_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_slight_right.png b/OsmAnd/res/drawable-mdpi/map_turn_slight_right.png deleted file mode 100644 index 45db48c507..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_slight_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_slight_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_slight_right_small.png deleted file mode 100644 index d738f28bc3..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_slight_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_uturn.png b/OsmAnd/res/drawable-mdpi/map_turn_uturn.png deleted file mode 100644 index e8f4a529e2..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_uturn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_uturn_right.png b/OsmAnd/res/drawable-mdpi/map_turn_uturn_right.png deleted file mode 100644 index c1e4ddc1d4..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_uturn_right_small.png b/OsmAnd/res/drawable-mdpi/map_turn_uturn_right_small.png deleted file mode 100644 index d09f550e37..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_turn_uturn_small.png b/OsmAnd/res/drawable-mdpi/map_turn_uturn_small.png deleted file mode 100644 index badcad0df2..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_turn_uturn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_up.png b/OsmAnd/res/drawable-mdpi/map_up.png deleted file mode 100644 index 013722c6b4..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_up.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_white_orange_poi_shield.png b/OsmAnd/res/drawable-mdpi/map_white_orange_poi_shield.png deleted file mode 100644 index b953bd5a38..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_white_orange_poi_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_white_orange_poi_shield_small.png b/OsmAnd/res/drawable-mdpi/map_white_orange_poi_shield_small.png deleted file mode 100644 index c832fda288..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_white_orange_poi_shield_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_white_shield.png b/OsmAnd/res/drawable-mdpi/map_white_shield.png deleted file mode 100644 index 82150d4f93..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_white_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_widget_compass_ruller_day.png b/OsmAnd/res/drawable-mdpi/map_widget_compass_ruller_day.png deleted file mode 100644 index 986f3c1582..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_widget_compass_ruller_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_widget_compass_ruller_location_day.png b/OsmAnd/res/drawable-mdpi/map_widget_compass_ruller_location_day.png deleted file mode 100644 index 411e1078b5..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_widget_compass_ruller_location_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_zoom_in_night.png b/OsmAnd/res/drawable-mdpi/map_zoom_in_night.png deleted file mode 100644 index 1006512c2b..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_zoom_in_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/map_zoom_out_night.png b/OsmAnd/res/drawable-mdpi/map_zoom_out_night.png deleted file mode 100644 index fcae67a6e3..0000000000 Binary files a/OsmAnd/res/drawable-mdpi/map_zoom_out_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-mdpi/warnings_speed_limit_ca.png b/OsmAnd/res/drawable-mdpi/warnings_speed_limit_ca.png new file mode 100644 index 0000000000..06b987009b Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/warnings_speed_limit_ca.png differ diff --git a/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free.xml b/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free.xml index b3d6f99388..31032dc8b4 100644 --- a/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free.xml +++ b/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free.xml @@ -1,10 +1,10 @@ - + \ No newline at end of file diff --git a/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free_dev.xml b/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free_dev.xml index b3d6f99388..31032dc8b4 100644 --- a/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free_dev.xml +++ b/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_free_dev.xml @@ -1,10 +1,10 @@ - + \ No newline at end of file diff --git a/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_plus.xml b/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_plus.xml index 1dc65ed611..ced630b3ad 100644 --- a/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_plus.xml +++ b/OsmAnd/res/drawable-sw600dp-v21/first_splash_screen_plus.xml @@ -1,10 +1,10 @@ - + \ No newline at end of file diff --git a/OsmAnd/res/drawable-sw600dp/first_splash_screen_free.xml b/OsmAnd/res/drawable-sw600dp/first_splash_screen_free.xml index 20d4cde2ea..aae2c9955e 100644 --- a/OsmAnd/res/drawable-sw600dp/first_splash_screen_free.xml +++ b/OsmAnd/res/drawable-sw600dp/first_splash_screen_free.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/OsmAnd/res/drawable-sw600dp/first_splash_screen_free_dev.xml b/OsmAnd/res/drawable-sw600dp/first_splash_screen_free_dev.xml index 20d4cde2ea..aae2c9955e 100644 --- a/OsmAnd/res/drawable-sw600dp/first_splash_screen_free_dev.xml +++ b/OsmAnd/res/drawable-sw600dp/first_splash_screen_free_dev.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/OsmAnd/res/drawable-sw600dp/first_splash_screen_plus.xml b/OsmAnd/res/drawable-sw600dp/first_splash_screen_plus.xml index 20d4cde2ea..aae2c9955e 100644 --- a/OsmAnd/res/drawable-sw600dp/first_splash_screen_plus.xml +++ b/OsmAnd/res/drawable-sw600dp/first_splash_screen_plus.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/OsmAnd/res/drawable-v21/purchase_dialog_outline_btn_bg_dark.xml b/OsmAnd/res/drawable-v21/purchase_dialog_outline_btn_bg_dark.xml new file mode 100644 index 0000000000..e0e60ea3ad --- /dev/null +++ b/OsmAnd/res/drawable-v21/purchase_dialog_outline_btn_bg_dark.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable-v21/purchase_dialog_outline_btn_bg_light.xml b/OsmAnd/res/drawable-v21/purchase_dialog_outline_btn_bg_light.xml new file mode 100644 index 0000000000..a607fc4dce --- /dev/null +++ b/OsmAnd/res/drawable-v21/purchase_dialog_outline_btn_bg_light.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_bottom.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_bottom.png new file mode 100644 index 0000000000..71ac3129ba Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_bottom.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_bottom_small.png new file mode 100644 index 0000000000..1e4d48b65e Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_center.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_center.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_bg_point_circle_center.png rename to OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_center.png diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_center_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_bg_point_circle_center_small.png rename to OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_center_small.png diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png new file mode 100644 index 0000000000..12dbd1759c Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png new file mode 100644 index 0000000000..2602b8b38d Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..d57b33db0b Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..752c7bbca5 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..77d10f16e8 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..a69d014d6d Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..e5ed5773ce Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..1db52d031d Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_bottom.png new file mode 100644 index 0000000000..5815ae8f51 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_bottom.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_bottom_small.png new file mode 100644 index 0000000000..3a6073fc24 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_center.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_center.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_center.png rename to OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_center.png diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_center_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_center_small.png rename to OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_center_small.png diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png new file mode 100644 index 0000000000..c15422ecb1 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png new file mode 100644 index 0000000000..229b918d75 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_bottom.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_bottom.png new file mode 100644 index 0000000000..b9769373f1 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_bottom.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_bottom_small.png new file mode 100644 index 0000000000..173aa4dca9 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_center.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_center.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_bg_point_square_center.png rename to OsmAnd/res/drawable-xhdpi/ic_bg_point_square_center.png diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_center_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_bg_point_square_center_small.png rename to OsmAnd/res/drawable-xhdpi/ic_bg_point_square_center_small.png diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png new file mode 100644 index 0000000000..052388a276 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png new file mode 100644 index 0000000000..422129d4f5 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_pin_avoid_road.png b/OsmAnd/res/drawable-xhdpi/ic_pin_avoid_road.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_pin_avoid_road.png rename to OsmAnd/res/drawable-xhdpi/ic_pin_avoid_road.png diff --git a/OsmAnd/res/drawable-xhdpi/map_white_favorite_shield.png b/OsmAnd/res/drawable-xhdpi/ic_white_favorite_shield.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_white_favorite_shield.png rename to OsmAnd/res/drawable-xhdpi/ic_white_favorite_shield.png diff --git a/OsmAnd/res/drawable-xhdpi/map_white_shield_small.png b/OsmAnd/res/drawable-xhdpi/ic_white_shield_small.png similarity index 100% rename from OsmAnd/res/drawable-xhdpi/map_white_shield_small.png rename to OsmAnd/res/drawable-xhdpi/ic_white_shield_small.png diff --git a/OsmAnd/res/drawable-xhdpi/image_text_openstreetmap.png b/OsmAnd/res/drawable-xhdpi/image_text_openstreetmap.png deleted file mode 100755 index bdd6389e15..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/image_text_openstreetmap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/image_text_osmand.png b/OsmAnd/res/drawable-xhdpi/image_text_osmand.png deleted file mode 100644 index c03b0e1574..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/image_text_osmand.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/image_text_osmand_inapp.png b/OsmAnd/res/drawable-xhdpi/image_text_osmand_inapp.png deleted file mode 100644 index 1ffb1674d8..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/image_text_osmand_inapp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-xhdpi/image_text_osmand_osmlive.png deleted file mode 100644 index 350ca9c70f..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/image_text_osmand_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/image_text_osmand_plus.png b/OsmAnd/res/drawable-xhdpi/image_text_osmand_plus.png deleted file mode 100644 index 41fb71a2d1..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/image_text_osmand_plus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-xhdpi/image_text_osmand_plus_osmlive.png deleted file mode 100644 index f1ed21bb04..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/image_text_osmand_plus_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom.png deleted file mode 100644 index 9dc55ad532..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom_small.png deleted file mode 100644 index bdbc9a0317..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top.png deleted file mode 100644 index b5eb13fbe8..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top_small.png deleted file mode 100644 index 924a6c0f0d..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_bottom.png deleted file mode 100644 index 376c2bc6e3..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_bottom_small.png deleted file mode 100644 index 3f8493f171..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_top.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_top.png deleted file mode 100644 index 9d42a43c6e..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_top_small.png deleted file mode 100644 index 673a722517..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_octagon_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom.png deleted file mode 100644 index 90350dfa1d..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom_small.png deleted file mode 100644 index 9d546d2d3f..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_top.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_square_top.png deleted file mode 100644 index 19c2217e26..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_top_small.png b/OsmAnd/res/drawable-xhdpi/map_bg_point_square_top_small.png deleted file mode 100644 index 2bfbf6896e..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_bg_point_square_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass.png b/OsmAnd/res/drawable-xhdpi/map_compass.png deleted file mode 100644 index d953bc4d09..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_bearing.png b/OsmAnd/res/drawable-xhdpi/map_compass_bearing.png deleted file mode 100644 index ef302192a3..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-xhdpi/map_compass_bearing_white.png deleted file mode 100644 index d8d2dd9fa7..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_niu.png b/OsmAnd/res/drawable-xhdpi/map_compass_niu.png deleted file mode 100644 index 05f8351357..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-xhdpi/map_compass_niu_white.png deleted file mode 100644 index b77d248b8e..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_compass_white.png b/OsmAnd/res/drawable-xhdpi/map_compass_white.png deleted file mode 100644 index 63c1221700..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_dashboard.png b/OsmAnd/res/drawable-xhdpi/map_dashboard.png deleted file mode 100644 index c2bbe0b7b9..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_dashboard.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_directions.png b/OsmAnd/res/drawable-xhdpi/map_directions.png deleted file mode 100644 index 734cce8e61..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_directions.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_down.png b/OsmAnd/res/drawable-xhdpi/map_down.png deleted file mode 100644 index da5293026b..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_down.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_drawer.png b/OsmAnd/res/drawable-xhdpi/map_drawer.png deleted file mode 100644 index c3b6da6636..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_drawer.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_favorite.png b/OsmAnd/res/drawable-xhdpi/map_favorite.png deleted file mode 100644 index e2e02d791e..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_favorite.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_layer_dark.png b/OsmAnd/res/drawable-xhdpi/map_layer_dark.png deleted file mode 100644 index 2b89f03e66..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_layer_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_layer_night.png b/OsmAnd/res/drawable-xhdpi/map_layer_night.png deleted file mode 100644 index d4e8a5868d..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_layer_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_marker_point_14dp.png b/OsmAnd/res/drawable-xhdpi/map_marker_point_14dp.png deleted file mode 100644 index e72ed6198a..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_marker_point_14dp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_note_audio.png b/OsmAnd/res/drawable-xhdpi/map_note_audio.png deleted file mode 100644 index 237069e0da..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_note_audio.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_note_photo.png b/OsmAnd/res/drawable-xhdpi/map_note_photo.png deleted file mode 100644 index 365a9a5b60..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_note_photo.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_note_small.png b/OsmAnd/res/drawable-xhdpi/map_note_small.png deleted file mode 100644 index 5d1d0b5347..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_note_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_note_video.png b/OsmAnd/res/drawable-xhdpi/map_note_video.png deleted file mode 100644 index a5f9dba5d9..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_note_video.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_osm_resolved.png b/OsmAnd/res/drawable-xhdpi/map_osm_resolved.png deleted file mode 100644 index 5850ea0466..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_osm_resolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_osm_resolved_small.png b/OsmAnd/res/drawable-xhdpi/map_osm_resolved_small.png deleted file mode 100644 index cabf5388ea..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_osm_resolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_osm_unresolved.png b/OsmAnd/res/drawable-xhdpi/map_osm_unresolved.png deleted file mode 100644 index 4475cda0ab..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_osm_unresolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_osm_unresolved_small.png b/OsmAnd/res/drawable-xhdpi/map_osm_unresolved_small.png deleted file mode 100644 index 4038709e71..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_osm_unresolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_overflow_menu_white.png b/OsmAnd/res/drawable-xhdpi/map_overflow_menu_white.png deleted file mode 100644 index e716e1f098..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_overflow_menu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_pin_destination.png b/OsmAnd/res/drawable-xhdpi/map_pin_destination.png deleted file mode 100644 index abb6ac89f8..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_pin_destination.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_pin_origin.png b/OsmAnd/res/drawable-xhdpi/map_pin_origin.png deleted file mode 100644 index d3e53732ff..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_pin_origin.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_pin_poi.png b/OsmAnd/res/drawable-xhdpi/map_pin_poi.png deleted file mode 100644 index 1f218bdca1..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_pin_poi.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_pin_poi_small.png b/OsmAnd/res/drawable-xhdpi/map_pin_poi_small.png deleted file mode 100644 index 287964f5d6..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_pin_poi_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_poi_parking_pos_limit.png b/OsmAnd/res/drawable-xhdpi/map_poi_parking_pos_limit.png deleted file mode 100644 index d99ba8bf57..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_poi_parking_pos_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_poi_parking_pos_no_limit.png b/OsmAnd/res/drawable-xhdpi/map_poi_parking_pos_no_limit.png deleted file mode 100644 index b98f1f18fa..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_poi_parking_pos_no_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_search_dark.png b/OsmAnd/res/drawable-xhdpi/map_search_dark.png deleted file mode 100644 index 45170ec8cb..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_search_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_search_night.png b/OsmAnd/res/drawable-xhdpi/map_search_night.png deleted file mode 100644 index d208cd96bf..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_search_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_color.png b/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_color.png deleted file mode 100644 index c16e77acfa..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_color.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_shadow.png b/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_shadow.png deleted file mode 100644 index 03c2ac4cb8..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_shadow.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_stroke.png b/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_stroke.png deleted file mode 100644 index a580882ce0..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_shield_marker_point_stroke.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_shield_tap.png b/OsmAnd/res/drawable-xhdpi/map_shield_tap.png deleted file mode 100644 index 7b85789e81..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_shield_tap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_shield_tap_small.png b/OsmAnd/res/drawable-xhdpi/map_shield_tap_small.png deleted file mode 100644 index 1b4bd21bf5..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_shield_tap_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_small_group.png b/OsmAnd/res/drawable-xhdpi/map_small_group.png deleted file mode 100644 index a440f345c7..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_small_group.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_start_navigation.png b/OsmAnd/res/drawable-xhdpi/map_start_navigation.png deleted file mode 100644 index 3e784bf91e..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_start_navigation.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_track_point_finish.png b/OsmAnd/res/drawable-xhdpi/map_track_point_finish.png new file mode 100644 index 0000000000..d8f8a36d30 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/map_track_point_finish.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_track_point_start.png b/OsmAnd/res/drawable-xhdpi/map_track_point_start.png new file mode 100644 index 0000000000..7718b5e03a Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/map_track_point_start.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_track_point_start_finish.png b/OsmAnd/res/drawable-xhdpi/map_track_point_start_finish.png new file mode 100644 index 0000000000..1637e27c6e Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/map_track_point_start_finish.png differ diff --git a/OsmAnd/res/drawable-xhdpi/map_transport_stop_bg.png b/OsmAnd/res/drawable-xhdpi/map_transport_stop_bg.png deleted file mode 100644 index a7a0333ef9..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_transport_stop_bg.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_transport_stop_bus.png b/OsmAnd/res/drawable-xhdpi/map_transport_stop_bus.png deleted file mode 100644 index e2dd0ea9c9..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_transport_stop_bus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_transport_stop_small.png b/OsmAnd/res/drawable-xhdpi/map_transport_stop_small.png deleted file mode 100644 index 493d859b3b..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_transport_stop_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_transport_stop_tram.png b/OsmAnd/res/drawable-xhdpi/map_transport_stop_tram.png deleted file mode 100644 index 5bc8cb3c81..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_transport_stop_tram.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward.png deleted file mode 100644 index 0a222d0a11..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_keep_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_keep_right.png deleted file mode 100644 index 5c290d7707..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_keep_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_keep_right_small.png deleted file mode 100644 index 38ad7adaf4..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_right_turn.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_right_turn.png deleted file mode 100644 index 7756a121f4..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_right_turn_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_right_turn_small.png deleted file mode 100644 index 1b90789e77..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_slight_right_turn.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_slight_right_turn.png deleted file mode 100644 index 97de9a60fe..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_slight_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_slight_right_turn_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_slight_right_turn_small.png deleted file mode 100644 index 81a4cbfa68..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_slight_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_small.png deleted file mode 100644 index b014067f03..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_turn_sharp.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_turn_sharp.png deleted file mode 100644 index f3482f0c23..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_turn_sharp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_turn_sharp_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_turn_sharp_small.png deleted file mode 100644 index 27bfb349b9..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_turn_sharp_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_uturn_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_uturn_right.png deleted file mode 100644 index d259fdbe3d..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_forward_uturn_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_forward_uturn_right_small.png deleted file mode 100644 index a65c919bd2..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_forward_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_keep_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_keep_right.png deleted file mode 100644 index 7277425cc1..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_keep_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_keep_right_small.png deleted file mode 100644 index 54247bcc25..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_right.png deleted file mode 100644 index 84b2fe9948..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_right2.png b/OsmAnd/res/drawable-xhdpi/map_turn_right2.png deleted file mode 100644 index 28faea75f1..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_right2.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_right2_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_right2_small.png deleted file mode 100644 index 873a8779f8..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_right2_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_right_small.png deleted file mode 100644 index 8d344bcfc3..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_sharp_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_sharp_right.png deleted file mode 100644 index 8c8876b63f..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_sharp_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_sharp_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_sharp_right_small.png deleted file mode 100644 index cd0b8f8439..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_sharp_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_slight_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_slight_right.png deleted file mode 100644 index ca38c26726..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_slight_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_slight_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_slight_right_small.png deleted file mode 100644 index e130b53d6f..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_slight_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_uturn.png b/OsmAnd/res/drawable-xhdpi/map_turn_uturn.png deleted file mode 100644 index 0f758155e0..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_uturn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_uturn_right.png b/OsmAnd/res/drawable-xhdpi/map_turn_uturn_right.png deleted file mode 100644 index 0870146a93..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_uturn_right_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_uturn_right_small.png deleted file mode 100644 index 957fec2df7..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_turn_uturn_small.png b/OsmAnd/res/drawable-xhdpi/map_turn_uturn_small.png deleted file mode 100644 index c3e50eca92..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_turn_uturn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_up.png b/OsmAnd/res/drawable-xhdpi/map_up.png deleted file mode 100644 index 8d15fd75b6..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_up.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_white_orange_poi_shield.png b/OsmAnd/res/drawable-xhdpi/map_white_orange_poi_shield.png deleted file mode 100644 index 606b1af8a6..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_white_orange_poi_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_white_orange_poi_shield_small.png b/OsmAnd/res/drawable-xhdpi/map_white_orange_poi_shield_small.png deleted file mode 100644 index 59a9d8360a..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_white_orange_poi_shield_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_white_shield.png b/OsmAnd/res/drawable-xhdpi/map_white_shield.png deleted file mode 100644 index 48878cc1e6..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_white_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_widget_compass_ruller_day.png b/OsmAnd/res/drawable-xhdpi/map_widget_compass_ruller_day.png deleted file mode 100644 index 3581492366..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_widget_compass_ruller_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_widget_compass_ruller_location_day.png b/OsmAnd/res/drawable-xhdpi/map_widget_compass_ruller_location_day.png deleted file mode 100644 index e7258a79ef..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_widget_compass_ruller_location_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_world_globe_dark.png b/OsmAnd/res/drawable-xhdpi/map_world_globe_dark.png deleted file mode 100644 index 0255f1b883..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_world_globe_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_zoom_in_night.png b/OsmAnd/res/drawable-xhdpi/map_zoom_in_night.png deleted file mode 100644 index 768ff0ad90..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_zoom_in_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/map_zoom_out_night.png b/OsmAnd/res/drawable-xhdpi/map_zoom_out_night.png deleted file mode 100644 index a573adee77..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/map_zoom_out_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/warnings_speed_limit_ca.png b/OsmAnd/res/drawable-xhdpi/warnings_speed_limit_ca.png new file mode 100644 index 0000000000..65ea1e7632 Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/warnings_speed_limit_ca.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_bottom.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_bottom.png new file mode 100644 index 0000000000..99ab3103c7 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_bottom.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_bottom_small.png new file mode 100644 index 0000000000..95d5ecead0 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_center.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_center.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_center.png rename to OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_center.png diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_center_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_center_small.png rename to OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_center_small.png diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png new file mode 100644 index 0000000000..20f5771f6f Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png new file mode 100644 index 0000000000..0d2ec3b548 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..daf34de9d8 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..5736f0c108 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..296e09de63 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..a17ea9bdef Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..0c5f7b291e Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..ba93ed3bf4 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_bottom.png new file mode 100644 index 0000000000..685f8bd34d Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_bottom.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_bottom_small.png new file mode 100644 index 0000000000..cf14b7f4a3 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_center.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_center.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_center.png rename to OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_center.png diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_center_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_center_small.png rename to OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_center_small.png diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png new file mode 100644 index 0000000000..afe65a2748 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png new file mode 100644 index 0000000000..4c0e82c247 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_bottom.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_bottom.png new file mode 100644 index 0000000000..ecd2bb984b Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_bottom.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_bottom_small.png new file mode 100644 index 0000000000..b336a9fcd0 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_center.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_center.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_bg_point_square_center.png rename to OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_center.png diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_center_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_bg_point_square_center_small.png rename to OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_center_small.png diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png new file mode 100644 index 0000000000..167d461b1d Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png new file mode 100644 index 0000000000..23649eb031 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_avoid_road.png b/OsmAnd/res/drawable-xxhdpi/ic_pin_avoid_road.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_pin_avoid_road.png rename to OsmAnd/res/drawable-xxhdpi/ic_pin_avoid_road.png diff --git a/OsmAnd/res/drawable-xxhdpi/map_white_favorite_shield.png b/OsmAnd/res/drawable-xxhdpi/ic_white_favorite_shield.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_white_favorite_shield.png rename to OsmAnd/res/drawable-xxhdpi/ic_white_favorite_shield.png diff --git a/OsmAnd/res/drawable-xxhdpi/map_white_shield_small.png b/OsmAnd/res/drawable-xxhdpi/ic_white_shield_small.png similarity index 100% rename from OsmAnd/res/drawable-xxhdpi/map_white_shield_small.png rename to OsmAnd/res/drawable-xxhdpi/ic_white_shield_small.png diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_openstreetmap.png b/OsmAnd/res/drawable-xxhdpi/image_text_openstreetmap.png deleted file mode 100755 index 53db5506cf..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/image_text_openstreetmap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand.png deleted file mode 100644 index 69a0ce8383..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/image_text_osmand.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_inapp.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand_inapp.png deleted file mode 100644 index 0439d756c0..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_inapp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand_osmlive.png deleted file mode 100644 index 0d5b99b738..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus.png deleted file mode 100644 index 724321f1ed..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus_osmlive.png deleted file mode 100644 index 85e2130f7f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom.png deleted file mode 100644 index 346039664c..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom_small.png deleted file mode 100644 index 00d5be06f5..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top.png deleted file mode 100644 index fe261a17ca..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top_small.png deleted file mode 100644 index 985bfa329e..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_bottom.png deleted file mode 100644 index 73eff57876..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_bottom_small.png deleted file mode 100644 index 308568bcd4..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_top.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_top.png deleted file mode 100644 index 1a99ecac96..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_top_small.png deleted file mode 100644 index 61387a7e84..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_octagon_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom.png deleted file mode 100644 index 92558b6823..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom_small.png deleted file mode 100644 index 43be98cae9..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top.png deleted file mode 100644 index 89f3c26163..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top_small.png b/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top_small.png deleted file mode 100644 index c291eef12e..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass.png b/OsmAnd/res/drawable-xxhdpi/map_compass.png deleted file mode 100644 index f6ab0bcc4f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing.png b/OsmAnd/res/drawable-xxhdpi/map_compass_bearing.png deleted file mode 100644 index 639449d194..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing_white.png b/OsmAnd/res/drawable-xxhdpi/map_compass_bearing_white.png deleted file mode 100644 index ec3ad49afd..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_bearing_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_niu.png b/OsmAnd/res/drawable-xxhdpi/map_compass_niu.png deleted file mode 100644 index 1e039c7f47..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_niu.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_niu_white.png b/OsmAnd/res/drawable-xxhdpi/map_compass_niu_white.png deleted file mode 100644 index e1452ce13f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_niu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_compass_white.png b/OsmAnd/res/drawable-xxhdpi/map_compass_white.png deleted file mode 100644 index b10a7c7aea..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_compass_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_dashboard.png b/OsmAnd/res/drawable-xxhdpi/map_dashboard.png deleted file mode 100644 index 7d6afc7e4b..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_dashboard.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_directions.png b/OsmAnd/res/drawable-xxhdpi/map_directions.png deleted file mode 100644 index 9897a755db..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_directions.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_down.png b/OsmAnd/res/drawable-xxhdpi/map_down.png deleted file mode 100644 index 6bba29c99b..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_down.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_drawer.png b/OsmAnd/res/drawable-xxhdpi/map_drawer.png deleted file mode 100644 index b007054f4e..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_drawer.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_favorite.png b/OsmAnd/res/drawable-xxhdpi/map_favorite.png deleted file mode 100644 index 682fff7b51..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_favorite.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_layer_dark.png b/OsmAnd/res/drawable-xxhdpi/map_layer_dark.png deleted file mode 100644 index 9bcf3d451a..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_layer_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_layer_night.png b/OsmAnd/res/drawable-xxhdpi/map_layer_night.png deleted file mode 100644 index 9f8429d3d3..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_layer_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_marker_point_14dp.png b/OsmAnd/res/drawable-xxhdpi/map_marker_point_14dp.png deleted file mode 100644 index 73899ce1b3..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_marker_point_14dp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_note_audio.png b/OsmAnd/res/drawable-xxhdpi/map_note_audio.png deleted file mode 100644 index f00aa9a3b4..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_note_audio.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_note_photo.png b/OsmAnd/res/drawable-xxhdpi/map_note_photo.png deleted file mode 100644 index 8a2a815188..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_note_photo.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_note_small.png b/OsmAnd/res/drawable-xxhdpi/map_note_small.png deleted file mode 100644 index 36f1170503..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_note_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_note_video.png b/OsmAnd/res/drawable-xxhdpi/map_note_video.png deleted file mode 100644 index 8f09403f52..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_note_video.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_osm_resolved.png b/OsmAnd/res/drawable-xxhdpi/map_osm_resolved.png deleted file mode 100644 index 3f016cf216..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_osm_resolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_osm_resolved_small.png b/OsmAnd/res/drawable-xxhdpi/map_osm_resolved_small.png deleted file mode 100644 index 15a0b462e2..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_osm_resolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_osm_unresolved.png b/OsmAnd/res/drawable-xxhdpi/map_osm_unresolved.png deleted file mode 100644 index dd70e4bfbb..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_osm_unresolved.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_osm_unresolved_small.png b/OsmAnd/res/drawable-xxhdpi/map_osm_unresolved_small.png deleted file mode 100644 index d9afeef173..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_osm_unresolved_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_overflow_menu_white.png b/OsmAnd/res/drawable-xxhdpi/map_overflow_menu_white.png deleted file mode 100644 index 7d02de5140..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_overflow_menu_white.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_destination.png b/OsmAnd/res/drawable-xxhdpi/map_pin_destination.png deleted file mode 100644 index 10adc01c2f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_pin_destination.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_origin.png b/OsmAnd/res/drawable-xxhdpi/map_pin_origin.png deleted file mode 100644 index a234377be6..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_pin_origin.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_poi.png b/OsmAnd/res/drawable-xxhdpi/map_pin_poi.png deleted file mode 100644 index cd2a444309..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_pin_poi.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_poi_small.png b/OsmAnd/res/drawable-xxhdpi/map_pin_poi_small.png deleted file mode 100644 index 9a335a91c6..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_pin_poi_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_poi_parking_pos_limit.png b/OsmAnd/res/drawable-xxhdpi/map_poi_parking_pos_limit.png deleted file mode 100644 index 894d41feb6..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_poi_parking_pos_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_poi_parking_pos_no_limit.png b/OsmAnd/res/drawable-xxhdpi/map_poi_parking_pos_no_limit.png deleted file mode 100644 index 3a19aa5bac..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_poi_parking_pos_no_limit.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_search_dark.png b/OsmAnd/res/drawable-xxhdpi/map_search_dark.png deleted file mode 100644 index afcada973c..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_search_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_search_night.png b/OsmAnd/res/drawable-xxhdpi/map_search_night.png deleted file mode 100644 index 2859244cb1..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_search_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_color.png b/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_color.png deleted file mode 100644 index fd1834ef5d..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_color.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_shadow.png b/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_shadow.png deleted file mode 100644 index 63fe9aca4a..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_shadow.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_stroke.png b/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_stroke.png deleted file mode 100644 index aa7810c72c..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_shield_marker_point_stroke.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_shield_tap.png b/OsmAnd/res/drawable-xxhdpi/map_shield_tap.png deleted file mode 100644 index 0f7657642a..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_shield_tap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_shield_tap_small.png b/OsmAnd/res/drawable-xxhdpi/map_shield_tap_small.png deleted file mode 100644 index c3b83581c1..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_shield_tap_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_small_group.png b/OsmAnd/res/drawable-xxhdpi/map_small_group.png deleted file mode 100644 index 7c4b45d02e..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_small_group.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_start_navigation.png b/OsmAnd/res/drawable-xxhdpi/map_start_navigation.png deleted file mode 100644 index ee62bbac20..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_start_navigation.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_track_point_finish.png b/OsmAnd/res/drawable-xxhdpi/map_track_point_finish.png new file mode 100644 index 0000000000..81704f2ed4 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/map_track_point_finish.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_track_point_start.png b/OsmAnd/res/drawable-xxhdpi/map_track_point_start.png new file mode 100644 index 0000000000..75d6bf5362 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/map_track_point_start.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_track_point_start_finish.png b/OsmAnd/res/drawable-xxhdpi/map_track_point_start_finish.png new file mode 100644 index 0000000000..63bea3579f Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/map_track_point_start_finish.png differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_bg.png b/OsmAnd/res/drawable-xxhdpi/map_transport_stop_bg.png deleted file mode 100644 index 1679401d7b..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_bg.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_bus.png b/OsmAnd/res/drawable-xxhdpi/map_transport_stop_bus.png deleted file mode 100644 index 5d1636ae9e..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_bus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_small.png b/OsmAnd/res/drawable-xxhdpi/map_transport_stop_small.png deleted file mode 100644 index 33a327e22f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_tram.png b/OsmAnd/res/drawable-xxhdpi/map_transport_stop_tram.png deleted file mode 100644 index 327e5250d2..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_transport_stop_tram.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward.png deleted file mode 100644 index c1015b73dd..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_keep_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_keep_right.png deleted file mode 100644 index b4ce1ee92f..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_keep_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_keep_right_small.png deleted file mode 100644 index 7ee6716151..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_right_turn.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_right_turn.png deleted file mode 100644 index 0435ded215..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_right_turn_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_right_turn_small.png deleted file mode 100644 index a744e9f595..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_slight_right_turn.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_slight_right_turn.png deleted file mode 100644 index 9ecc92c619..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_slight_right_turn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_slight_right_turn_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_slight_right_turn_small.png deleted file mode 100644 index a44916e491..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_slight_right_turn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_small.png deleted file mode 100644 index dafb941c83..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_turn_sharp.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_turn_sharp.png deleted file mode 100644 index 06d941c1ba..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_turn_sharp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_turn_sharp_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_turn_sharp_small.png deleted file mode 100644 index b9d34a95e5..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_turn_sharp_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_uturn_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_uturn_right.png deleted file mode 100644 index 62fc53f569..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_uturn_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_forward_uturn_right_small.png deleted file mode 100644 index ace2fed237..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_forward_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_keep_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_keep_right.png deleted file mode 100644 index 503cf38469..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_keep_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_keep_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_keep_right_small.png deleted file mode 100644 index c488b8170b..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_keep_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_right.png deleted file mode 100644 index 2a7f0fff53..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_right2.png b/OsmAnd/res/drawable-xxhdpi/map_turn_right2.png deleted file mode 100644 index 87a839262d..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_right2.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_right2_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_right2_small.png deleted file mode 100644 index 6a1ed801bd..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_right2_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_right_small.png deleted file mode 100644 index cfa7d81925..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_sharp_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_sharp_right.png deleted file mode 100644 index bf0582845e..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_sharp_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_sharp_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_sharp_right_small.png deleted file mode 100644 index 96bdcad4ea..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_sharp_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_slight_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_slight_right.png deleted file mode 100644 index 357ed538b8..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_slight_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_slight_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_slight_right_small.png deleted file mode 100644 index 8debf40f17..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_slight_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn.png b/OsmAnd/res/drawable-xxhdpi/map_turn_uturn.png deleted file mode 100644 index c645cb9158..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_right.png b/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_right.png deleted file mode 100644 index 018ce214e6..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_right.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_right_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_right_small.png deleted file mode 100644 index 2ba8b92d76..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_right_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_small.png b/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_small.png deleted file mode 100644 index 41e2bf50c9..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_turn_uturn_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_up.png b/OsmAnd/res/drawable-xxhdpi/map_up.png deleted file mode 100644 index 75c65ca5ff..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_up.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_white_orange_poi_shield.png b/OsmAnd/res/drawable-xxhdpi/map_white_orange_poi_shield.png deleted file mode 100644 index fd74fb4a1d..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_white_orange_poi_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_white_orange_poi_shield_small.png b/OsmAnd/res/drawable-xxhdpi/map_white_orange_poi_shield_small.png deleted file mode 100644 index de66729794..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_white_orange_poi_shield_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_white_shield.png b/OsmAnd/res/drawable-xxhdpi/map_white_shield.png deleted file mode 100644 index eba1522750..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_white_shield.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_widget_compass_ruller_day.png b/OsmAnd/res/drawable-xxhdpi/map_widget_compass_ruller_day.png deleted file mode 100644 index 89c82b29ce..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_widget_compass_ruller_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_widget_compass_ruller_location_day.png b/OsmAnd/res/drawable-xxhdpi/map_widget_compass_ruller_location_day.png deleted file mode 100644 index 1b86292f0c..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_widget_compass_ruller_location_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_world_globe_dark.png b/OsmAnd/res/drawable-xxhdpi/map_world_globe_dark.png deleted file mode 100644 index 97d6b3b781..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_world_globe_dark.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_zoom_in_night.png b/OsmAnd/res/drawable-xxhdpi/map_zoom_in_night.png deleted file mode 100644 index b891b736e5..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_zoom_in_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/map_zoom_out_night.png b/OsmAnd/res/drawable-xxhdpi/map_zoom_out_night.png deleted file mode 100644 index 7e14714a9c..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/map_zoom_out_night.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/warnings_speed_limit_ca.png b/OsmAnd/res/drawable-xxhdpi/warnings_speed_limit_ca.png new file mode 100644 index 0000000000..3dd5e83cd7 Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/warnings_speed_limit_ca.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_bottom.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_bottom.png new file mode 100644 index 0000000000..6302f8bf25 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_bottom.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_bottom_small.png new file mode 100644 index 0000000000..a1c18ebbb0 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_center.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_center.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_center.png rename to OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_center.png diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_center_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_center_small.png rename to OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_center_small.png diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png new file mode 100644 index 0000000000..6202ce2692 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png new file mode 100644 index 0000000000..07ee7683af Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_circle_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom.png new file mode 100644 index 0000000000..0823b74a20 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom_small.png new file mode 100644 index 0000000000..95b7cf6d4a Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center.png new file mode 100644 index 0000000000..a4734e15d3 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center_small.png new file mode 100644 index 0000000000..bae7db9bc6 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_center_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top.png new file mode 100644 index 0000000000..63fa61faa6 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top_small.png new file mode 100644 index 0000000000..3b31a920b8 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_comment_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_bottom.png new file mode 100644 index 0000000000..035381636e Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_bottom.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_bottom_small.png new file mode 100644 index 0000000000..2e8f2cefb1 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_center.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_center.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_center.png rename to OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_center.png diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_center_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_center_small.png rename to OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_center_small.png diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png new file mode 100644 index 0000000000..ca446bd684 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png new file mode 100644 index 0000000000..1818905ac0 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_octagon_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_bottom.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_bottom.png new file mode 100644 index 0000000000..a5f4246d86 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_bottom.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_bottom_small.png new file mode 100644 index 0000000000..0551a490ce Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_bottom_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_center.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_center.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_center.png rename to OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_center.png diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_center_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_center_small.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_center_small.png rename to OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_center_small.png diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png new file mode 100644 index 0000000000..03e8bb2f12 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png new file mode 100644 index 0000000000..4638a93611 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/ic_bg_point_square_top_small.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_pin_avoid_road.png b/OsmAnd/res/drawable-xxxhdpi/ic_pin_avoid_road.png similarity index 100% rename from OsmAnd/res/drawable-xxxhdpi/map_pin_avoid_road.png rename to OsmAnd/res/drawable-xxxhdpi/ic_pin_avoid_road.png diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_openstreetmap.png b/OsmAnd/res/drawable-xxxhdpi/image_text_openstreetmap.png deleted file mode 100755 index 5638c2f5b4..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/image_text_openstreetmap.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand.png b/OsmAnd/res/drawable-xxxhdpi/image_text_osmand.png deleted file mode 100644 index 828bcf45e8..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_inapp.png b/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_inapp.png deleted file mode 100644 index 326fde6a1d..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_inapp.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_osmlive.png deleted file mode 100644 index c9f2bc7c75..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_plus.png b/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_plus.png deleted file mode 100644 index 1201d0ece8..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_plus.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_plus_osmlive.png deleted file mode 100644 index f0300264bd..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_plus_osmlive.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom.png deleted file mode 100644 index d2cdcc280d..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom_small.png deleted file mode 100644 index 297e59a778..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top.png deleted file mode 100644 index f8ac0e7d5f..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top_small.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top_small.png deleted file mode 100644 index 0180214981..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_bottom.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_bottom.png deleted file mode 100644 index 8a50fc173c..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_bottom_small.png deleted file mode 100644 index 1793b619e4..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_top.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_top.png deleted file mode 100644 index ac7c4f2b2a..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_top_small.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_top_small.png deleted file mode 100644 index 7a26915c60..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_octagon_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom.png deleted file mode 100644 index f7b81b3e83..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom_small.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom_small.png deleted file mode 100644 index fb0a74bbec..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top.png deleted file mode 100644 index 4e4941781d..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top_small.png b/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top_small.png deleted file mode 100644 index 5f8a6d7cc7..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top_small.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_track_point_finish.png b/OsmAnd/res/drawable-xxxhdpi/map_track_point_finish.png new file mode 100644 index 0000000000..04691cc75e Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/map_track_point_finish.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_track_point_start.png b/OsmAnd/res/drawable-xxxhdpi/map_track_point_start.png new file mode 100644 index 0000000000..62145a8812 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/map_track_point_start.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_track_point_start_finish.png b/OsmAnd/res/drawable-xxxhdpi/map_track_point_start_finish.png new file mode 100644 index 0000000000..3961e655cc Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/map_track_point_start_finish.png differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_widget_compass_ruller_day.png b/OsmAnd/res/drawable-xxxhdpi/map_widget_compass_ruller_day.png deleted file mode 100644 index 4b2714ce58..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_widget_compass_ruller_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/map_widget_compass_ruller_location_day.png b/OsmAnd/res/drawable-xxxhdpi/map_widget_compass_ruller_location_day.png deleted file mode 100644 index 1e461a55e8..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/map_widget_compass_ruller_location_day.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/warnings_speed_limit_ca.png b/OsmAnd/res/drawable-xxxhdpi/warnings_speed_limit_ca.png new file mode 100644 index 0000000000..e06fded052 Binary files /dev/null and b/OsmAnd/res/drawable-xxxhdpi/warnings_speed_limit_ca.png differ diff --git a/OsmAnd/res/drawable/bg_dash_line_dark.xml b/OsmAnd/res/drawable/bg_dash_line_dark.xml new file mode 100644 index 0000000000..ac1547e5af --- /dev/null +++ b/OsmAnd/res/drawable/bg_dash_line_dark.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/OsmAnd/res/drawable/bg_dash_line_light.xml b/OsmAnd/res/drawable/bg_dash_line_light.xml new file mode 100644 index 0000000000..508cf2e78f --- /dev/null +++ b/OsmAnd/res/drawable/bg_dash_line_light.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/OsmAnd/res/drawable/bg_point_comment.xml b/OsmAnd/res/drawable/bg_point_comment.xml new file mode 100644 index 0000000000..0ededd23e1 --- /dev/null +++ b/OsmAnd/res/drawable/bg_point_comment.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml new file mode 100644 index 0000000000..1322edb6cb --- /dev/null +++ b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml new file mode 100644 index 0000000000..cfc0b32c50 --- /dev/null +++ b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/first_splash_screen_free.xml b/OsmAnd/res/drawable/first_splash_screen_free.xml index b3d6f99388..4a413970b5 100644 --- a/OsmAnd/res/drawable/first_splash_screen_free.xml +++ b/OsmAnd/res/drawable/first_splash_screen_free.xml @@ -1,7 +1,7 @@ - + - + - + + + + diff --git a/OsmAnd/res/drawable/ic_action_altitude_range.xml b/OsmAnd/res/drawable/ic_action_altitude_range.xml new file mode 100644 index 0000000000..0df55f2ca1 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_altitude_range.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_analyze_intervals.xml b/OsmAnd/res/drawable/ic_action_analyze_intervals.xml new file mode 100644 index 0000000000..9d7567b31a --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_analyze_intervals.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_apk.xml b/OsmAnd/res/drawable/ic_action_apk.xml new file mode 100644 index 0000000000..21da34bd79 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_apk.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_bug_dark.xml b/OsmAnd/res/drawable/ic_action_bug_dark.xml deleted file mode 100644 index fe7b8af253..0000000000 --- a/OsmAnd/res/drawable/ic_action_bug_dark.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/OsmAnd/res/drawable/ic_action_cancel.xml b/OsmAnd/res/drawable/ic_action_cancel.xml index d82458bb25..92eb882146 100644 --- a/OsmAnd/res/drawable/ic_action_cancel.xml +++ b/OsmAnd/res/drawable/ic_action_cancel.xml @@ -4,15 +4,13 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M8.2929,8.2929C8.6834,7.9024 9.3166,7.9024 9.7071,8.2929L12,10.5858L14.2929,8.2929C14.6834,7.9024 15.3166,7.9024 15.7071,8.2929C16.0976,8.6834 16.0976,9.3166 15.7071,9.7071L13.4142,12L15.7071,14.2929C16.0976,14.6834 16.0976,15.3166 15.7071,15.7071C15.3166,16.0976 14.6834,16.0976 14.2929,15.7071L12,13.4142L9.7071,15.7071C9.3166,16.0976 8.6834,16.0976 8.2929,15.7071C7.9024,15.3166 7.9024,14.6834 8.2929,14.2929L10.5858,12L8.2929,9.7071C7.9024,9.3166 7.9024,8.6834 8.2929,8.2929Z" + android:fillColor="#ffffff" + android:fillType="evenOdd"/> diff --git a/OsmAnd/res/drawable/ic_action_delete_item.xml b/OsmAnd/res/drawable/ic_action_delete_item.xml new file mode 100644 index 0000000000..7ef403c609 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_delete_item.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_description_16.xml b/OsmAnd/res/drawable/ic_action_description_16.xml new file mode 100644 index 0000000000..285731fc0d --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_description_16.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_direction_arrow.xml b/OsmAnd/res/drawable/ic_action_direction_arrow.xml new file mode 100644 index 0000000000..49bec48f22 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_direction_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_enduro_motorcycle.xml b/OsmAnd/res/drawable/ic_action_enduro_motorcycle.xml new file mode 100644 index 0000000000..ce8f40ad06 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_enduro_motorcycle.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_external_link.xml b/OsmAnd/res/drawable/ic_action_external_link.xml new file mode 100644 index 0000000000..b445171abc --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_external_link.xml @@ -0,0 +1,14 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_go_cart.xml b/OsmAnd/res/drawable/ic_action_go_cart.xml new file mode 100644 index 0000000000..3b3f321cea --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_go_cart.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_height_limit.xml b/OsmAnd/res/drawable/ic_action_height_limit.xml index f364b4e0ee..fb32da1462 100644 --- a/OsmAnd/res/drawable/ic_action_height_limit.xml +++ b/OsmAnd/res/drawable/ic_action_height_limit.xml @@ -7,7 +7,7 @@ android:pathData="M6,2L12,6L18,2H6Z" android:fillColor="#ffffff"/> + + + diff --git a/OsmAnd/res/drawable/ic_action_inline_skates.xml b/OsmAnd/res/drawable/ic_action_inline_skates.xml new file mode 100644 index 0000000000..1d597ad389 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_inline_skates.xml @@ -0,0 +1,15 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_laptop.xml b/OsmAnd/res/drawable/ic_action_laptop.xml new file mode 100644 index 0000000000..c11bf0f8eb --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_laptop.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_length_limit.xml b/OsmAnd/res/drawable/ic_action_length_limit.xml new file mode 100644 index 0000000000..5540a97b66 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_length_limit.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_location_16.xml b/OsmAnd/res/drawable/ic_action_location_16.xml new file mode 100644 index 0000000000..aac95d6959 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_location_16.xml @@ -0,0 +1,14 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_minimal_distance.xml b/OsmAnd/res/drawable/ic_action_minimal_distance.xml index e46c3e9a61..a4c37214d9 100644 --- a/OsmAnd/res/drawable/ic_action_minimal_distance.xml +++ b/OsmAnd/res/drawable/ic_action_minimal_distance.xml @@ -4,17 +4,17 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M12,15L9.1325,15.9559C9.0447,15.9851 8.9529,16 8.8604,16H8.809C8.3622,16 8,15.6378 8,15.191C8,15.0654 8.0292,14.9415 8.0854,14.8292L11.2764,8.4472C11.4134,8.1731 11.6936,8 12,8C12.3064,8 12.5866,8.1732 12.7236,8.4472L15.9146,14.8292C15.9708,14.9415 16,15.0654 16,15.191C16,15.6378 15.6378,16 15.191,16H15.1396C15.0471,16 14.9553,15.9851 14.8675,15.9559L12,15Z" + android:fillColor="#ffffff"/> + android:pathData="M9,2C9,0.8954 9.8954,0 11,0H13C14.1046,0 15,0.8954 15,2V22C15,23.1046 14.1046,24 13,24H11C9.8954,24 9,23.1046 9,22V2Z" + android:strokeAlpha="0.2" + android:fillColor="#ffffff" + android:fillAlpha="0.2"/> diff --git a/OsmAnd/res/drawable/ic_action_motor_scooter.xml b/OsmAnd/res/drawable/ic_action_motor_scooter.xml new file mode 100644 index 0000000000..a8a0cf4551 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_motor_scooter.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml b/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml index 2bf23aff89..a89713cff8 100644 --- a/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml +++ b/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/OsmAnd/res/drawable/ic_action_navigation_skip_destination.xml b/OsmAnd/res/drawable/ic_action_navigation_skip_destination.xml new file mode 100644 index 0000000000..144dfbbc0f --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_navigation_skip_destination.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_notification_navigation.xml b/OsmAnd/res/drawable/ic_action_notification_navigation.xml new file mode 100644 index 0000000000..1901192493 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_notification_navigation.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_osm_note.xml b/OsmAnd/res/drawable/ic_action_osm_note.xml new file mode 100644 index 0000000000..1383ea2d4a --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_osm_note.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_osm_note_add.xml b/OsmAnd/res/drawable/ic_action_osm_note_add.xml new file mode 100644 index 0000000000..882367bafa --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_osm_note_add.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_osm_note_resolved.xml b/OsmAnd/res/drawable/ic_action_osm_note_resolved.xml new file mode 100644 index 0000000000..55005f950a --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_osm_note_resolved.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_osm_note_unresolved.xml b/OsmAnd/res/drawable/ic_action_osm_note_unresolved.xml new file mode 100644 index 0000000000..da16955a0f --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_osm_note_unresolved.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_power_button.xml b/OsmAnd/res/drawable/ic_action_power_button.xml new file mode 100644 index 0000000000..6e88c236a6 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_power_button.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_remove.xml b/OsmAnd/res/drawable/ic_action_remove.xml index 47ec79b234..c12e46d25f 100644 --- a/OsmAnd/res/drawable/ic_action_remove.xml +++ b/OsmAnd/res/drawable/ic_action_remove.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> + + + diff --git a/OsmAnd/res/drawable/ic_action_save_as_new_file.xml b/OsmAnd/res/drawable/ic_action_save_as_new_file.xml new file mode 100644 index 0000000000..9457316943 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_save_as_new_file.xml @@ -0,0 +1,15 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_save_complete.xml b/OsmAnd/res/drawable/ic_action_save_complete.xml new file mode 100644 index 0000000000..5ca6381e21 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_save_complete.xml @@ -0,0 +1,15 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_save_to_file.xml b/OsmAnd/res/drawable/ic_action_save_to_file.xml index eeaa54ca2e..ddf1e32c0d 100644 --- a/OsmAnd/res/drawable/ic_action_save_to_file.xml +++ b/OsmAnd/res/drawable/ic_action_save_to_file.xml @@ -4,14 +4,12 @@ android:viewportWidth="24" android:viewportHeight="24"> - + android:pathData="M4,4C4,2.8954 4.8954,2 6,2H14V6C14,7.1046 14.8954,8 16,8H20V20C20,21.1046 19.1046,22 18,22H6C4.8954,22 4,21.1046 4,20V4ZM11,9H13V14H15L12,18L9,14H11V9Z" + android:fillColor="#ffffff" + android:fillType="evenOdd"/> diff --git a/OsmAnd/res/drawable/ic_action_search_16.xml b/OsmAnd/res/drawable/ic_action_search_16.xml new file mode 100644 index 0000000000..fa4d5b9648 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_search_16.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_sort_by_name_ascending.xml b/OsmAnd/res/drawable/ic_action_sort_by_name_ascending.xml new file mode 100644 index 0000000000..07406ae2c7 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_sort_by_name_ascending.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_sort_by_name_descending.xml b/OsmAnd/res/drawable/ic_action_sort_by_name_descending.xml new file mode 100644 index 0000000000..04cd095335 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_sort_by_name_descending.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_bold_color.xml b/OsmAnd/res/drawable/ic_action_track_line_bold_color.xml new file mode 100644 index 0000000000..81499eb9ac --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_bold_color.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_bold_direction.xml b/OsmAnd/res/drawable/ic_action_track_line_bold_direction.xml new file mode 100644 index 0000000000..846c926133 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_bold_direction.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_bold_stroke.xml b/OsmAnd/res/drawable/ic_action_track_line_bold_stroke.xml new file mode 100644 index 0000000000..5a6928aa3b --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_bold_stroke.xml @@ -0,0 +1,12 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_bold_transparency.xml b/OsmAnd/res/drawable/ic_action_track_line_bold_transparency.xml new file mode 100644 index 0000000000..5e258ace22 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_bold_transparency.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_medium_color.xml b/OsmAnd/res/drawable/ic_action_track_line_medium_color.xml new file mode 100644 index 0000000000..5427c312d9 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_medium_color.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_medium_direction.xml b/OsmAnd/res/drawable/ic_action_track_line_medium_direction.xml new file mode 100644 index 0000000000..846c926133 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_medium_direction.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_medium_stroke.xml b/OsmAnd/res/drawable/ic_action_track_line_medium_stroke.xml new file mode 100644 index 0000000000..4bd70cfc68 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_medium_stroke.xml @@ -0,0 +1,12 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_medium_transparency.xml b/OsmAnd/res/drawable/ic_action_track_line_medium_transparency.xml new file mode 100644 index 0000000000..9b29a98b83 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_medium_transparency.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_thin_color.xml b/OsmAnd/res/drawable/ic_action_track_line_thin_color.xml new file mode 100644 index 0000000000..89bab2e721 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_thin_color.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_thin_direction.xml b/OsmAnd/res/drawable/ic_action_track_line_thin_direction.xml new file mode 100644 index 0000000000..3da2fecfa6 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_thin_direction.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_thin_stroke.xml b/OsmAnd/res/drawable/ic_action_track_line_thin_stroke.xml new file mode 100644 index 0000000000..1ad8af14ea --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_thin_stroke.xml @@ -0,0 +1,12 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_track_line_thin_transparency.xml b/OsmAnd/res/drawable/ic_action_track_line_thin_transparency.xml new file mode 100644 index 0000000000..8b007ae519 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_track_line_thin_transparency.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_trash_basket_16.xml b/OsmAnd/res/drawable/ic_action_trash_basket_16.xml new file mode 100644 index 0000000000..6f3b6f2979 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_trash_basket_16.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_trim_left.xml b/OsmAnd/res/drawable/ic_action_trim_left.xml new file mode 100644 index 0000000000..74b91e92e1 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_trim_left.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_trim_right.xml b/OsmAnd/res/drawable/ic_action_trim_right.xml new file mode 100644 index 0000000000..f9bc488218 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_trim_right.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_undo.xml b/OsmAnd/res/drawable/ic_action_undo.xml index ed22d5c219..8aa62911e4 100644 --- a/OsmAnd/res/drawable/ic_action_undo.xml +++ b/OsmAnd/res/drawable/ic_action_undo.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> + + + diff --git a/OsmAnd/res/drawable/ic_action_wheelchair_forward.xml b/OsmAnd/res/drawable/ic_action_wheelchair_forward.xml new file mode 100644 index 0000000000..96bf7169a8 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_wheelchair_forward.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_width_limit.xml b/OsmAnd/res/drawable/ic_action_width_limit.xml index c46203c241..aa0bf717b6 100644 --- a/OsmAnd/res/drawable/ic_action_width_limit.xml +++ b/OsmAnd/res/drawable/ic_action_width_limit.xml @@ -7,9 +7,9 @@ android:pathData="M2,18L6,12L2,6V18Z" android:fillColor="#ffffff"/> diff --git a/OsmAnd/res/drawable/ic_action_zoom_volume_buttons.xml b/OsmAnd/res/drawable/ic_action_zoom_volume_buttons.xml new file mode 100644 index 0000000000..8f8315658b --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_zoom_volume_buttons.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_actions_menu.xml b/OsmAnd/res/drawable/ic_actions_menu.xml new file mode 100644 index 0000000000..4658db069c --- /dev/null +++ b/OsmAnd/res/drawable/ic_actions_menu.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_bg_transparency.xml b/OsmAnd/res/drawable/ic_bg_transparency.xml new file mode 100644 index 0000000000..d59af2c5b0 --- /dev/null +++ b/OsmAnd/res/drawable/ic_bg_transparency.xml @@ -0,0 +1,13 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_compass.xml b/OsmAnd/res/drawable/ic_compass.xml new file mode 100644 index 0000000000..03cf8d94db --- /dev/null +++ b/OsmAnd/res/drawable/ic_compass.xml @@ -0,0 +1,13 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_compass_bearing.xml b/OsmAnd/res/drawable/ic_compass_bearing.xml new file mode 100644 index 0000000000..46be57b5d8 --- /dev/null +++ b/OsmAnd/res/drawable/ic_compass_bearing.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_compass_bearing_white.xml b/OsmAnd/res/drawable/ic_compass_bearing_white.xml new file mode 100644 index 0000000000..46be57b5d8 --- /dev/null +++ b/OsmAnd/res/drawable/ic_compass_bearing_white.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_compass_niu.xml b/OsmAnd/res/drawable/ic_compass_niu.xml new file mode 100644 index 0000000000..90bb87a71b --- /dev/null +++ b/OsmAnd/res/drawable/ic_compass_niu.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_compass_niu_white.xml b/OsmAnd/res/drawable/ic_compass_niu_white.xml new file mode 100644 index 0000000000..4e75ed5fa0 --- /dev/null +++ b/OsmAnd/res/drawable/ic_compass_niu_white.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_compass_white.xml b/OsmAnd/res/drawable/ic_compass_white.xml new file mode 100644 index 0000000000..db5bdd12d6 --- /dev/null +++ b/OsmAnd/res/drawable/ic_compass_white.xml @@ -0,0 +1,13 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_dashboard_dark.xml b/OsmAnd/res/drawable/ic_dashboard.xml similarity index 93% rename from OsmAnd/res/drawable/ic_dashboard_dark.xml rename to OsmAnd/res/drawable/ic_dashboard.xml index 7b95603a20..3c225990ad 100644 --- a/OsmAnd/res/drawable/ic_dashboard_dark.xml +++ b/OsmAnd/res/drawable/ic_dashboard.xml @@ -5,6 +5,6 @@ android:viewportHeight="24"> diff --git a/OsmAnd/res/drawable/map_my_location.xml b/OsmAnd/res/drawable/ic_my_location.xml similarity index 100% rename from OsmAnd/res/drawable/map_my_location.xml rename to OsmAnd/res/drawable/ic_my_location.xml diff --git a/OsmAnd/res/drawable/map_quick_action.xml b/OsmAnd/res/drawable/ic_quick_action.xml similarity index 100% rename from OsmAnd/res/drawable/map_quick_action.xml rename to OsmAnd/res/drawable/ic_quick_action.xml diff --git a/OsmAnd/res/drawable/map_zoom_in.xml b/OsmAnd/res/drawable/ic_zoom_in.xml similarity index 88% rename from OsmAnd/res/drawable/map_zoom_in.xml rename to OsmAnd/res/drawable/ic_zoom_in.xml index 6b6cbf883d..2d130aad07 100644 --- a/OsmAnd/res/drawable/map_zoom_in.xml +++ b/OsmAnd/res/drawable/ic_zoom_in.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="#ffffff"/> diff --git a/OsmAnd/res/drawable/map_zoom_out.xml b/OsmAnd/res/drawable/ic_zoom_out.xml similarity index 87% rename from OsmAnd/res/drawable/map_zoom_out.xml rename to OsmAnd/res/drawable/ic_zoom_out.xml index 89851264ff..530679803b 100644 --- a/OsmAnd/res/drawable/map_zoom_out.xml +++ b/OsmAnd/res/drawable/ic_zoom_out.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:fillColor="#ffffff"/> diff --git a/OsmAnd/res/drawable/image_text_openstreetmap.xml b/OsmAnd/res/drawable/image_text_openstreetmap.xml new file mode 100644 index 0000000000..6568560c89 --- /dev/null +++ b/OsmAnd/res/drawable/image_text_openstreetmap.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/image_text_osmand.xml b/OsmAnd/res/drawable/image_text_osmand.xml new file mode 100644 index 0000000000..d45ee03ff4 --- /dev/null +++ b/OsmAnd/res/drawable/image_text_osmand.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/image_text_osmand_inapp.xml b/OsmAnd/res/drawable/image_text_osmand_inapp.xml new file mode 100644 index 0000000000..3dbf7111cd --- /dev/null +++ b/OsmAnd/res/drawable/image_text_osmand_inapp.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/image_text_osmand_osmlive.xml b/OsmAnd/res/drawable/image_text_osmand_osmlive.xml new file mode 100644 index 0000000000..8817caa693 --- /dev/null +++ b/OsmAnd/res/drawable/image_text_osmand_osmlive.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/image_text_osmand_plus.xml b/OsmAnd/res/drawable/image_text_osmand_plus.xml new file mode 100644 index 0000000000..8f0fdb8590 --- /dev/null +++ b/OsmAnd/res/drawable/image_text_osmand_plus.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/image_text_osmand_plus_osmlive.xml b/OsmAnd/res/drawable/image_text_osmand_plus_osmlive.xml new file mode 100644 index 0000000000..5bbd341dec --- /dev/null +++ b/OsmAnd/res/drawable/image_text_osmand_plus_osmlive.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_feature_purchased.xml b/OsmAnd/res/drawable/img_feature_purchased.xml index e82f078224..d734fd179d 100644 --- a/OsmAnd/res/drawable/img_feature_purchased.xml +++ b/OsmAnd/res/drawable/img_feature_purchased.xml @@ -1,19 +1,14 @@ - + - - - - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/img_help_height_limit_day.xml b/OsmAnd/res/drawable/img_help_height_limit_day.xml index 0942266946..7ebcfcdf23 100644 --- a/OsmAnd/res/drawable/img_help_height_limit_day.xml +++ b/OsmAnd/res/drawable/img_help_height_limit_day.xml @@ -46,11 +46,11 @@ android:fillType="evenOdd"/> + android:fillColor="#212121"/> + android:pathData="M46,32L46,40H54V32H58V52H54V44H46L46,52H42V32H46Z" + android:fillColor="#212121"/> + android:fillColor="#212121"/> diff --git a/OsmAnd/res/drawable/img_help_height_limit_night.xml b/OsmAnd/res/drawable/img_help_height_limit_night.xml index 158ba010c0..e309d4d370 100644 --- a/OsmAnd/res/drawable/img_help_height_limit_night.xml +++ b/OsmAnd/res/drawable/img_help_height_limit_night.xml @@ -46,11 +46,11 @@ android:fillType="evenOdd"/> + android:fillColor="#212121"/> + android:pathData="M46,32L46,40H54V32H58V52H54V44H46L46,52H42V32H46Z" + android:fillColor="#212121"/> + android:fillColor="#212121"/> diff --git a/OsmAnd/res/drawable/img_help_length_limit_day.xml b/OsmAnd/res/drawable/img_help_length_limit_day.xml new file mode 100644 index 0000000000..bf1d51b975 --- /dev/null +++ b/OsmAnd/res/drawable/img_help_length_limit_day.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_help_length_limit_night.xml b/OsmAnd/res/drawable/img_help_length_limit_night.xml new file mode 100644 index 0000000000..2537c47fa5 --- /dev/null +++ b/OsmAnd/res/drawable/img_help_length_limit_night.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_help_vessel_height_day.xml b/OsmAnd/res/drawable/img_help_vessel_height_day.xml new file mode 100644 index 0000000000..e8706295c9 --- /dev/null +++ b/OsmAnd/res/drawable/img_help_vessel_height_day.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_help_vessel_height_night.xml b/OsmAnd/res/drawable/img_help_vessel_height_night.xml new file mode 100644 index 0000000000..d0decd17a9 --- /dev/null +++ b/OsmAnd/res/drawable/img_help_vessel_height_night.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_help_vessel_width_day.xml b/OsmAnd/res/drawable/img_help_vessel_width_day.xml new file mode 100644 index 0000000000..4d45ee3bf2 --- /dev/null +++ b/OsmAnd/res/drawable/img_help_vessel_width_day.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_help_vessel_width_night.xml b/OsmAnd/res/drawable/img_help_vessel_width_night.xml new file mode 100644 index 0000000000..70db48f32e --- /dev/null +++ b/OsmAnd/res/drawable/img_help_vessel_width_night.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/img_help_weight_limit_day.xml b/OsmAnd/res/drawable/img_help_weight_limit_day.xml index 0c69c5b2ec..a9d50aa338 100644 --- a/OsmAnd/res/drawable/img_help_weight_limit_day.xml +++ b/OsmAnd/res/drawable/img_help_weight_limit_day.xml @@ -27,9 +27,18 @@ android:fillColor="#EE5622" android:fillType="evenOdd"/> + android:pathData="M264,48C264,46.895 264.895,46 266,46H268C269.105,46 270,46.895 270,48V56C270,57.105 269.105,58 268,58H266C264.895,58 264,57.105 264,56V48Z" + android:fillColor="#212121"/> + android:pathData="M278,49C278,48.448 278.448,48 279,48H281C281.552,48 282,48.448 282,49V55C282,55.552 281.552,56 281,56H279C278.448,56 278,55.552 278,55V49Z" + android:fillColor="#212121"/> + + + diff --git a/OsmAnd/res/drawable/img_help_weight_limit_night.xml b/OsmAnd/res/drawable/img_help_weight_limit_night.xml index d055d5802c..49eba6ebcb 100644 --- a/OsmAnd/res/drawable/img_help_weight_limit_night.xml +++ b/OsmAnd/res/drawable/img_help_weight_limit_night.xml @@ -27,9 +27,18 @@ android:fillColor="#EE5622" android:fillType="evenOdd"/> + android:pathData="M264,48C264,46.895 264.895,46 266,46H268C269.105,46 270,46.895 270,48V56C270,57.105 269.105,58 268,58H266C264.895,58 264,57.105 264,56V48Z" + android:fillColor="#212121"/> + android:pathData="M278,49C278,48.448 278.448,48 279,48H281C281.552,48 282,48.448 282,49V55C282,55.552 281.552,56 281,56H279C278.448,56 278,55.552 278,55V49Z" + android:fillColor="#212121"/> + + + diff --git a/OsmAnd/res/drawable/img_help_width_limit_day.xml b/OsmAnd/res/drawable/img_help_width_limit_day.xml index a33a1fb476..0beda557d7 100644 --- a/OsmAnd/res/drawable/img_help_width_limit_day.xml +++ b/OsmAnd/res/drawable/img_help_width_limit_day.xml @@ -32,7 +32,7 @@ android:fillColor="#237BFF" android:fillType="evenOdd"/> @@ -44,12 +44,12 @@ android:fillColor="#EE5622" android:fillType="evenOdd"/> + android:pathData="M260,54L268,42L260,30V54Z" + android:fillColor="#212121"/> + android:pathData="M300,54L292,42L300,30V54Z" + android:fillColor="#212121"/> + android:pathData="M274,32L276,42L278,32H282L284,42L286,32H290L286,52H282L280,42L278,52H274L270,32H274Z" + android:fillColor="#212121"/> diff --git a/OsmAnd/res/drawable/img_help_width_limit_night.xml b/OsmAnd/res/drawable/img_help_width_limit_night.xml index 223a83ab78..2fa1992913 100644 --- a/OsmAnd/res/drawable/img_help_width_limit_night.xml +++ b/OsmAnd/res/drawable/img_help_width_limit_night.xml @@ -44,12 +44,12 @@ android:fillColor="#EE5622" android:fillType="evenOdd"/> + android:pathData="M260,54L268,42L260,30V54Z" + android:fillColor="#212121"/> + android:pathData="M300,54L292,42L300,30V54Z" + android:fillColor="#212121"/> + android:pathData="M274,32L276,42L278,32H282L284,42L286,32H290L286,52H282L280,42L278,52H274L270,32H274Z" + android:fillColor="#212121"/> diff --git a/OsmAnd/res/drawable/img_speed_camera_warning.xml b/OsmAnd/res/drawable/img_speed_camera_warning.xml index aa5fb3bb5d..1b532148f6 100644 --- a/OsmAnd/res/drawable/img_speed_camera_warning.xml +++ b/OsmAnd/res/drawable/img_speed_camera_warning.xml @@ -1,15 +1,42 @@ - - - - - - - - - - + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_dark.xml b/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_dark.xml index 3a35b91f36..90df5478f3 100644 --- a/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_dark.xml +++ b/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_dark.xml @@ -1,8 +1,16 @@ - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_light.xml b/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_light.xml index 8116459637..ee1573b3f1 100644 --- a/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_light.xml +++ b/OsmAnd/res/drawable/purchase_dialog_outline_btn_bg_light.xml @@ -1,8 +1,16 @@ - - - - - + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/radio_button_center.xml b/OsmAnd/res/drawable/radio_button_center.xml new file mode 100644 index 0000000000..1c1304d0fc --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_center.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_center_dark.xml b/OsmAnd/res/drawable/radio_button_center_dark.xml new file mode 100644 index 0000000000..ee16a54e4a --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_center_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_center_light.xml b/OsmAnd/res/drawable/radio_button_center_light.xml new file mode 100644 index 0000000000..0ced063668 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_center_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_left.xml b/OsmAnd/res/drawable/radio_button_left.xml new file mode 100644 index 0000000000..838a3f4929 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_left.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_left_dark.xml b/OsmAnd/res/drawable/radio_button_left_dark.xml new file mode 100644 index 0000000000..235fe1c07a --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_left_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_left_light.xml b/OsmAnd/res/drawable/radio_button_left_light.xml new file mode 100644 index 0000000000..bb311906e4 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_left_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_center.xml b/OsmAnd/res/drawable/radio_button_regular_center.xml new file mode 100644 index 0000000000..e0cca408c5 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_center.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_center_dark.xml b/OsmAnd/res/drawable/radio_button_regular_center_dark.xml new file mode 100644 index 0000000000..f169338f05 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_center_dark.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_center_light.xml b/OsmAnd/res/drawable/radio_button_regular_center_light.xml new file mode 100644 index 0000000000..e0cca408c5 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_center_light.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_left.xml b/OsmAnd/res/drawable/radio_button_regular_left.xml new file mode 100644 index 0000000000..4a983673da --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_left.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_left_dark.xml b/OsmAnd/res/drawable/radio_button_regular_left_dark.xml new file mode 100644 index 0000000000..b841d52e72 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_left_dark.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_left_light.xml b/OsmAnd/res/drawable/radio_button_regular_left_light.xml new file mode 100644 index 0000000000..4a983673da --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_left_light.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_right.xml b/OsmAnd/res/drawable/radio_button_regular_right.xml new file mode 100644 index 0000000000..e2186a923b --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_right.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_right_dark.xml b/OsmAnd/res/drawable/radio_button_regular_right_dark.xml new file mode 100644 index 0000000000..4a54d73f04 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_right_dark.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_regular_right_light.xml b/OsmAnd/res/drawable/radio_button_regular_right_light.xml new file mode 100644 index 0000000000..e2186a923b --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_regular_right_light.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_right.xml b/OsmAnd/res/drawable/radio_button_right.xml new file mode 100644 index 0000000000..7c227b1319 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_right.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_right_dark.xml b/OsmAnd/res/drawable/radio_button_right_dark.xml new file mode 100644 index 0000000000..a699007a3a --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_right_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_right_light.xml b/OsmAnd/res/drawable/radio_button_right_light.xml new file mode 100644 index 0000000000..c875e76957 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_right_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_center.xml b/OsmAnd/res/drawable/radio_button_selected_center.xml new file mode 100644 index 0000000000..e429400abe --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_center.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_center_dark.xml b/OsmAnd/res/drawable/radio_button_selected_center_dark.xml new file mode 100644 index 0000000000..19757beaaf --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_center_dark.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_center_light.xml b/OsmAnd/res/drawable/radio_button_selected_center_light.xml new file mode 100644 index 0000000000..3f9db228c5 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_center_light.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_left.xml b/OsmAnd/res/drawable/radio_button_selected_left.xml new file mode 100644 index 0000000000..a96a06f544 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_left.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_left_dark.xml b/OsmAnd/res/drawable/radio_button_selected_left_dark.xml new file mode 100644 index 0000000000..e3477f5844 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_left_dark.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_left_light.xml b/OsmAnd/res/drawable/radio_button_selected_left_light.xml new file mode 100644 index 0000000000..08dd317994 --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_left_light.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_right.xml b/OsmAnd/res/drawable/radio_button_selected_right.xml new file mode 100644 index 0000000000..ffb60d307b --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_right.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_right_dark.xml b/OsmAnd/res/drawable/radio_button_selected_right_dark.xml new file mode 100644 index 0000000000..d535b6215f --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_right_dark.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_button_selected_right_light.xml b/OsmAnd/res/drawable/radio_button_selected_right_light.xml new file mode 100644 index 0000000000..0473c0140c --- /dev/null +++ b/OsmAnd/res/drawable/radio_button_selected_right_light.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_flat_text_selector.xml b/OsmAnd/res/drawable/radio_flat_text_selector.xml new file mode 100644 index 0000000000..359b2777c6 --- /dev/null +++ b/OsmAnd/res/drawable/radio_flat_text_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_flat_text_selector_dark.xml b/OsmAnd/res/drawable/radio_flat_text_selector_dark.xml new file mode 100644 index 0000000000..119f4989b8 --- /dev/null +++ b/OsmAnd/res/drawable/radio_flat_text_selector_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/radio_flat_text_selector_light.xml b/OsmAnd/res/drawable/radio_flat_text_selector_light.xml new file mode 100644 index 0000000000..359b2777c6 --- /dev/null +++ b/OsmAnd/res/drawable/radio_flat_text_selector_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/ripple_solid_dark_18dp.xml b/OsmAnd/res/drawable/ripple_solid_dark_18dp.xml new file mode 100644 index 0000000000..a214350483 --- /dev/null +++ b/OsmAnd/res/drawable/ripple_solid_dark_18dp.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/ripple_solid_light_18dp.xml b/OsmAnd/res/drawable/ripple_solid_light_18dp.xml new file mode 100644 index 0000000000..f7b1e3f1ef --- /dev/null +++ b/OsmAnd/res/drawable/ripple_solid_light_18dp.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/travel_card_download_icon.xml b/OsmAnd/res/drawable/travel_card_download_icon.xml index c50a41b2c6..b0c24733ff 100644 --- a/OsmAnd/res/drawable/travel_card_download_icon.xml +++ b/OsmAnd/res/drawable/travel_card_download_icon.xml @@ -10,5 +10,8 @@ + android:top="4dp" + android:bottom="4dp" + android:left="4dp" + android:right="4dp" /> diff --git a/OsmAnd/res/drawable/travel_card_update_icon.xml b/OsmAnd/res/drawable/travel_card_update_icon.xml index 9648d8b88f..19ce5f2ed2 100644 --- a/OsmAnd/res/drawable/travel_card_update_icon.xml +++ b/OsmAnd/res/drawable/travel_card_update_icon.xml @@ -10,5 +10,8 @@ + android:top="4dp" + android:bottom="4dp" + android:left="4dp" + android:right="4dp" /> diff --git a/OsmAnd/res/drawable/widget_fps_day.xml b/OsmAnd/res/drawable/widget_fps_day.xml new file mode 100644 index 0000000000..53524499ca --- /dev/null +++ b/OsmAnd/res/drawable/widget_fps_day.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/OsmAnd/res/drawable/widget_fps_night.xml b/OsmAnd/res/drawable/widget_fps_night.xml new file mode 100644 index 0000000000..4e3836ec82 --- /dev/null +++ b/OsmAnd/res/drawable/widget_fps_night.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/OsmAnd/res/drawable/wikivoyage_search_history_placeholder.xml b/OsmAnd/res/drawable/wikivoyage_search_history_placeholder.xml index e19bdcc293..8fd9d1ba9b 100644 --- a/OsmAnd/res/drawable/wikivoyage_search_history_placeholder.xml +++ b/OsmAnd/res/drawable/wikivoyage_search_history_placeholder.xml @@ -1,23 +1,12 @@ - - - - - - + + android:top="2dp" /> - - - + \ No newline at end of file diff --git a/OsmAnd/res/drawable/wikivoyage_search_placeholder.xml b/OsmAnd/res/drawable/wikivoyage_search_placeholder.xml index 356e581f1d..727c4f99a9 100644 --- a/OsmAnd/res/drawable/wikivoyage_search_placeholder.xml +++ b/OsmAnd/res/drawable/wikivoyage_search_placeholder.xml @@ -2,22 +2,20 @@ - + + android:height="28dp" /> + + android:tint="@color/icon_color_default_light" + android:top="2dp" /> - - - + \ No newline at end of file diff --git a/OsmAnd/res/layout-land/add_gpx_point_bottom_sheet.xml b/OsmAnd/res/layout-land/add_gpx_point_bottom_sheet.xml index a6c60491b9..1494750470 100644 --- a/OsmAnd/res/layout-land/add_gpx_point_bottom_sheet.xml +++ b/OsmAnd/res/layout-land/add_gpx_point_bottom_sheet.xml @@ -34,8 +34,8 @@ android:layout_marginRight="@dimen/content_padding" android:layout_marginTop="@dimen/content_padding" android:text="@string/waypoint_one" - android:layout_marginEnd="@dimen/content_padding" - android:layout_marginStart="@dimen/content_padding" /> + android:layout_marginEnd="@dimen/content_padding" + android:layout_marginStart="@dimen/content_padding" /> + android:layout_marginEnd="@dimen/content_padding" + android:layout_marginStart="@dimen/content_padding" /> @@ -68,5 +68,5 @@ android:layout_marginRight="@dimen/content_padding" android:layout_gravity="center_vertical" android:text="@string/shared_string_cancel" - android:layout_marginEnd="@dimen/content_padding" /> + android:layout_marginEnd="@dimen/content_padding" /> \ No newline at end of file diff --git a/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml b/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml index 3a8d430f27..940317d3bb 100644 --- a/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml +++ b/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml @@ -1,6 +1,5 @@ - + android:layout_height="@dimen/dashboard_map_toolbar" + android:padding="0dp"> + android:layout_width="@dimen/toolbar_height" + android:layout_height="@dimen/toolbar_height" + android:contentDescription="@string/access_shared_string_navigate_up" + osmand:srcCompat="@drawable/ic_arrow_back" /> + osmand:typeface="@string/font_roboto_medium" + tools:textColor="@color/color_white" /> + android:paddingStart="@dimen/content_padding" + android:paddingEnd="@dimen/content_padding" /> @@ -92,7 +91,7 @@ android:layout_height="match_parent" android:layout_gravity="end" android:scaleType="fitXY" - osmand:srcCompat="@drawable/bg_shadow_quick_input_left"/> + osmand:srcCompat="@drawable/bg_shadow_quick_input_left" /> @@ -108,7 +107,7 @@ android:layout_height="match_parent" android:layout_gravity="start" android:scaleType="fitXY" - osmand:srcCompat="@drawable/bg_shadow_quick_input_right"/> + osmand:srcCompat="@drawable/bg_shadow_quick_input_right" /> diff --git a/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml b/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml index 4ada3b137b..580849ddbd 100644 --- a/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml +++ b/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml @@ -19,10 +19,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/dashboard_map_toolbar" android:minHeight="@dimen/dashboard_map_toolbar" - app:contentInsetLeft="54dp" - app:contentInsetStart="54dp" - app:contentInsetRight="0dp" - app:contentInsetEnd="0dp"> + android:padding="0dp"> - + android:clickable="true" + android:focusable="true"> + tools:visibility="visible" /> + tools:text="724 m," /> + android:layout_alignRight="@id/up_down_button" + android:layout_marginTop="@dimen/bottom_sheet_title_padding_bottom" + android:textAppearance="@style/TextAppearance.ListItemCategoryTitle" + tools:text="points: 3" /> + android:layout_below="@id/measurement_points_text_view" + android:layout_alignStart="@+id/measurement_distance_text_view" + android:layout_alignLeft="@+id/measurement_distance_text_view" + android:maxLines="1" + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_desc_text_size" + tools:text=" – 700 m" /> - + android:layout_weight="0.55" + android:padding="@dimen/content_padding_half"> - + - - - - + android:layout_centerInParent="true"> - - - - -