Compare commits

..

1 commit
master ... r3.6

Author SHA1 Message Date
Victor Shcherb
8cedb28efa Fix exit info 2020-03-18 15:25:15 +01:00
5740 changed files with 145721 additions and 252503 deletions

View file

@ -1,16 +0,0 @@
---
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!
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑

View file

@ -1,18 +0,0 @@
---
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.

View file

@ -1,72 +0,0 @@
---
name: "\U0001F6A9 Routing report"
about: Report a routing issue in OsmAnd
---
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
Oh hi there! 😄
To expedite issue processing please search open and closed issues before submitting a new one.
Existing issues often contain information about workarounds, resolution, or progress updates.
GitHub is our main development tool for our developers. There are hundreds of requests a month and there are relatively 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 just 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.
Please be sure to read our [FAQ](https://osmand.net/help-online) before creating an issue here.
The best way to get help about an OsmAnd issue is to create a valid and detailed issue.
Please give us the following information so that we can try to **reproduce** your issue:
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
# 🐞 routing report
### Routing engine
<!-- Which routing provider was used? (please tick the proper box [x]) -->
- [ ] OsmAnd's in-app offline routing
- [ ] Any online routing provider (YOURS, OpenRouteService, OSRM, etc.)
### Routing Profile
<!-- What routing profile is chosen in the OsmAnd app? (car, bike, pedestrian, fastest or shortest, etc.) -->
### Start and end points
<!-- Please specify (as exactly as possible) the start and endpoint of your route by telling us the city and street name so that we can find it via the in-app address search easily.
Also, a permalink from [openstreetmap.org](https://www.openstreetmap.org/) can be helpful. -->
### Actual and expected routes
<!-- Tell us your expected routing and how OsmAnd routes, or add screenshots here. -->
### Is this a regression?
<!-- Did this behavior use to work in the previous version? -->
<!-- ✍️--> Yes, the previous version in which this bug was not present was: ....
## 🌍 Your Environment
**OsmAnd Version:**
<pre><code>
<!-- paste version below -->
<!-- ✍️-->
</code></pre>
**Device and Android/iOS version:**
**Maps used (online or offline):**
<!-- Please tick the correct box [x] (or both) -->
- [ ] Offline maps offered within the OsmAnd app for download.
<!-- 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. -->
- [ ] Online (tile / raster) maps <!-- Please name it -->
**Anything else relevant?**

View file

@ -1,34 +0,0 @@
---
name: "\U0001F680 Feature request"
about: Suggest a feature for OsmAnd
---
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
Oh hi there! 😄
To expedite issue processing please search open and closed issues before submitting a new one.
Existing issues often contain information about workarounds, resolution, or progress updates.
GitHub is our main development tool for our developers. There are hundreds of requests a month and there are relatively 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 just a brief message.
Comments on the closed issues are also sent to all developers, so you definitely will be heard.
However, there is no guarantee that a developer will pick up the issue to work on it.
Please be sure to read our [FAQ](https://osmand.net/help-online) before creating an issue here.
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
# 🚀 feature request
### Description
<!-- ✍️ A clear and concise description of the feature... -->
### 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?

View file

@ -1,4 +0,0 @@
contact_links:
- name: Outdated FAQ
url: https://groups.google.com/forum/#!forum/osmand
about: Fix wrong or outdated FAQ on the forum instead

View file

@ -1,10 +0,0 @@
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

7
.gitignore vendored
View file

@ -16,14 +16,9 @@ OsmAndCore_*.aar
*.iml *.iml
.settings .settings
.idea .idea
**/.project .project
**/.classpath
out/ out/
# Huawei
agconnect-services.json
OsmAndHms.jks
# Android Studio # Android Studio
/.idea /.idea
*.iml *.iml

View file

@ -1,7 +1,7 @@
### Credits to all major contributors / developers: ### 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 Major contributors /developers listed here https://github.com/osmandapp/osmandapp.github.io/blob/master/website/help/about.html#L8
### Other Pull requests ### Other Pull requests
Copyright © All authors of translations and pull requests can be found in the commit history: Copyright © All authors of translations and pull requests could be found in commits history:
- Translations are under special “contributor” name weblate - 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

26
ISSUE_TEMPLATE.md Normal file
View file

@ -0,0 +1,26 @@
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.

70
LICENSE
View file

@ -1,11 +1,11 @@
OsmAnd OSM Automated Navigation Directions navigation software based on OpenStreetMap. OsmAnd OSM Automated Navigation Directions navigation software based on OpenStreetMap.
Copyright © 20102020 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714, BTW 854627704B01). Copyright © 20102018 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 for some third-party libraries and resources. 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 uses a proprietary license. ATTENTION: please be aware that some artwork has proprietary license.
Main AUTHORS (more detailed list in AUTHORS.md): Main AUTHORS (more detailed list in AUTHORS):
Victor Shcherb all parts of the project, originator Victor Shcherb all parts of the project, originator
Alexey Pelykh rendering and core parts Alexey Pelykh rendering and core parts
Hardy Mueller main parts of the project, mostly rendering, UI interaction design 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): * 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
- https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java - https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java
- https://github.com/osmandapp/OsmAnd-core/tree/legacy_core - https://github.com/osmandapp/Osmand-core/tree/legacy_core
- https://github.com/osmandapp/OsmAnd-core - https://github.com/osmandapp/Osmand-core/
- https://github.com/osmandapp/OsmAnd-misc - https://github.com/osmandapp/OsmAnd-misc
- https://github.com/osmandapp/OsmAnd-tools - https://github.com/osmandapp/OsmAnd-tools
- https://github.com/osmandapp/OsmAnd-resources - https://github.com/osmandapp/OsmAnd-resources
* 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/) * UI Design and UX work, such as layout, icons is covered by CC-BY-NC-ND
- https://github.com/osmandapp/Osmand/tree/master/OsmAnd/res and others - https://github.com/osmandapp/Osmand/tree/master/OsmAnd/res and others
Restriction to UI/UX CC-BY-NC-ND: 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) * 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 - 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) - 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 * Integration with Qt library in (https://github.com/osmandapp/Osmand-core/) - dynamic linking
- LGPL (https://www.qt.io/terms-conditions/) - LGPL (http://www.qt.io/qt-licensing-terms/)
* Map icons and their derived primitives are covered by a proprietary license: * Map icons and their derived primitives are covered by proprietary license:
- © icons8.com (https://github.com/osmandapp/OsmAnd-resources/tree/master/icons/svg/icons8) - © icons8.com (https://github.com/osmandapp/OsmAnd-resources/tree/master/icons/svg/icons8)
* Generated voice files from TTS files are covered by a proprietary license: * Generated voice files from TTS files are covered by proprietary license:
- Voice files (https://github.com/osmandapp/OsmAnd-resources/tree/master/voice) - Voice files (https://github.com/osmandapp/OsmAnd-resources/tree/master/voice)
* Fonts (https://github.com/osmandapp/OsmAnd-resources/tree/master/rendering_styles/fonts) * Fonts (https://github.com/osmandapp/OsmAnd-resources/tree/master/rendering_styles/fonts)
- Google Fonts (Apache License 2.0) - Google Fonts (Apache License 2)
* Map icons (Mapnik): * Map icons (Mapnik):
- Open-SVG-Map-Icons - Public Domain - Open-SVG-Map-Icons - Public Domain
@ -65,27 +65,49 @@
- SherlockBar - Apache License - https://github.com/osmandapp/Osmand/tree/master/SherlockBar (https://github.com/JakeWharton/ActionBarSherlock/blob/master/LICENSE.txt) - SherlockBar - Apache License - https://github.com/osmandapp/Osmand/tree/master/SherlockBar (https://github.com/JakeWharton/ActionBarSherlock/blob/master/LICENSE.txt)
* Patched libraries: * Patched libraries:
- 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) - 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)
- Jpeg - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/jpeg) - 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) - Skia - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/skia)
- android-openmap-framework - (https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/src/main/java/com/jwetherell/openmap/common) - ZLib - (https://github.com/osmandapp/OsmAnd-core/tree/legacy_core/externals/zlib)
- 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): * 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 - gnu-trove-osmand.jar GNU trove - LGPL
- icu4j-49_1_patched.jar - ICU license (https://home.unicode.org/basic-info/projects/#/icu/icu/trunk/license.html) - 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/)
* Pull-requests and translations: * Pull-requests and translations:
- All pull requests are accepted under MIT License (most honorable contributors are mentioned in AUTHORS list). - 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
* Special tools for new rendering (GPLv3) * Special tools for new rendering (GPLv3)
- https://github.com/osmandapp/OsmAnd-tools - 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
* OSM data * OSM data 2014
- Extracts - https://github.com/osmandapp/OsmAnd-misc/tree/master/osm-planet/osm-data - Extracts - https://github.com/osmandapp/OsmAnd-misc/blob/master/osm-planet/osm-data/
* Data files * Data files
- Country boundaries - https://github.com/osmandapp/OsmAnd-misc/tree/master/osm-planet/polygons © by Geofabrik - data free to use - 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
* Subway icons * Subway icons
- Moscow: Art Lebedev Studio (http://www.artlebedev.ru/everything/metro/logo/) [Public domain], undefined - Moscow: Art Lebedev Studio (http://www.artlebedev.ru/everything/metro/logo/) [Public domain], undefined
@ -97,7 +119,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 - 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 - 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 - 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 - 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 - 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 - 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
@ -130,7 +152,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 - 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 * Depth maps
- The GEBCO_2020 Grid, www.gebco.net - The GEBCO_2014 Grid, version 20150318, www.gebco.net
- U.S. Bureau of Ocean Energy Management (24 may 2017,12m per pixel) - 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. - 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. - 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.

View file

@ -1,11 +1,12 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'ivy-publish'
apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.github.dcendents.android-maven'
group = 'com.github.osmandapp.osmand'
version = '2.0.0'
android { android {
compileSdkVersion 28 compileSdkVersion 27
buildToolsVersion "28.0.3" buildToolsVersion "27.0.3"
defaultConfig { defaultConfig {
minSdkVersion 14 minSdkVersion 14
@ -25,36 +26,9 @@ android {
} }
} }
afterEvaluate {
publishing {
repositories {
ivy {
url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./"
}
}
publications {
release(IvyPublication) {
// Applies the component for the release build variant.
from components.release
organisation = 'net.osmand'
module = 'android-aidl-lib'
revision = 'master-snapshot'
}
debug(IvyPublication) {
// Applies the component for the release build variant.
from components.debug
organisation = 'net.osmand'
module = 'android-aidl-lib'
revision = 'master-snapshot'
}
}
}
}
dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:support-annotations:28.0.0' implementation 'com.android.support:support-annotations:27.1.1'
} }
task sourcesJar(type: Jar) { task sourcesJar(type: Jar) {
@ -64,4 +38,4 @@ task sourcesJar(type: Jar) {
artifacts { artifacts {
archives sourcesJar archives sourcesJar
} }

View file

@ -51,9 +51,4 @@ interface IOsmAndAidlCallback {
* Callback for {@link IOsmAndAidlInterface} registerForVoiceRouterMessages() method. * Callback for {@link IOsmAndAidlInterface} registerForVoiceRouterMessages() method.
*/ */
void onVoiceRouterNotify(in OnVoiceNavigationParams params); void onVoiceRouterNotify(in OnVoiceNavigationParams params);
/**
* Callback for {@link IOsmAndAidlInterface} registerForKeyEvents() method.
*/
void onKeyEvent(in KeyEvent params);
} }

View file

@ -2,7 +2,6 @@ package net.osmand.aidlapi;
import net.osmand.aidlapi.map.ALatLon; import net.osmand.aidlapi.map.ALatLon;
import net.osmand.aidlapi.map.SetMapLocationParams; import net.osmand.aidlapi.map.SetMapLocationParams;
import net.osmand.aidlapi.map.SetLocationParams;
import net.osmand.aidlapi.favorite.group.AFavoriteGroup; import net.osmand.aidlapi.favorite.group.AFavoriteGroup;
import net.osmand.aidlapi.favorite.group.AddFavoriteGroupParams; import net.osmand.aidlapi.favorite.group.AddFavoriteGroupParams;
@ -21,8 +20,6 @@ import net.osmand.aidlapi.mapmarker.UpdateMapMarkerParams;
import net.osmand.aidlapi.calculateroute.CalculateRouteParams; import net.osmand.aidlapi.calculateroute.CalculateRouteParams;
import net.osmand.aidlapi.profile.ExportProfileParams;
import net.osmand.aidlapi.gpx.ImportGpxParams; import net.osmand.aidlapi.gpx.ImportGpxParams;
import net.osmand.aidlapi.gpx.ShowGpxParams; import net.osmand.aidlapi.gpx.ShowGpxParams;
import net.osmand.aidlapi.gpx.StartGpxRecordingParams; import net.osmand.aidlapi.gpx.StartGpxRecordingParams;
@ -77,10 +74,6 @@ import net.osmand.aidlapi.customization.OsmandSettingsParams;
import net.osmand.aidlapi.customization.OsmandSettingsInfoParams; import net.osmand.aidlapi.customization.OsmandSettingsInfoParams;
import net.osmand.aidlapi.customization.CustomizationInfoParams; import net.osmand.aidlapi.customization.CustomizationInfoParams;
import net.osmand.aidlapi.customization.ProfileSettingsParams; import net.osmand.aidlapi.customization.ProfileSettingsParams;
import net.osmand.aidlapi.customization.MapMarginsParams;
import net.osmand.aidlapi.customization.CustomPluginParams;
import net.osmand.aidlapi.customization.SelectProfileParams;
import net.osmand.aidlapi.customization.AProfile;
import net.osmand.aidlapi.gpx.AGpxFile; import net.osmand.aidlapi.gpx.AGpxFile;
import net.osmand.aidlapi.gpx.AGpxFileDetails; import net.osmand.aidlapi.gpx.AGpxFileDetails;
@ -93,9 +86,6 @@ import net.osmand.aidlapi.copyfile.CopyFileParams;
import net.osmand.aidlapi.navigation.ANavigationUpdateParams; import net.osmand.aidlapi.navigation.ANavigationUpdateParams;
import net.osmand.aidlapi.navigation.ANavigationVoiceRouterMessageParams; import net.osmand.aidlapi.navigation.ANavigationVoiceRouterMessageParams;
import net.osmand.aidlapi.navigation.ABlockedRoad;
import net.osmand.aidlapi.navigation.AddBlockedRoadParams;
import net.osmand.aidlapi.navigation.RemoveBlockedRoadParams;
import net.osmand.aidlapi.contextmenu.ContextMenuButtonsParams; import net.osmand.aidlapi.contextmenu.ContextMenuButtonsParams;
import net.osmand.aidlapi.contextmenu.UpdateContextMenuButtonsParams; import net.osmand.aidlapi.contextmenu.UpdateContextMenuButtonsParams;
@ -103,17 +93,6 @@ import net.osmand.aidlapi.contextmenu.RemoveContextMenuButtonsParams;
import net.osmand.aidlapi.mapmarker.RemoveMapMarkersParams; 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!!! // NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface { interface IOsmAndAidlInterface {
@ -838,10 +817,10 @@ interface IOsmAndAidlInterface {
* *
*/ */
boolean setCustomization(in CustomizationInfoParams params); boolean setCustomization(in CustomizationInfoParams params);
/** /**
* Method to register for Voice Router voice messages during navigation. Notifies user about voice messages. * Method to register for Voice Router voice messages during navigation. Notifies user about voice messages.
* *
* @params subscribeToUpdates (boolean) - boolean flag to subscribe or unsubscribe from messages * @params subscribeToUpdates (boolean) - boolean flag to subscribe or unsubscribe from messages
* @params callbackId (long) - id of callback, needed to unsubscribe from messages * @params callbackId (long) - id of callback, needed to unsubscribe from messages
* @params callback (IOsmAndAidlCallback) - callback to notify user on voice message * @params callback (IOsmAndAidlCallback) - callback to notify user on voice message
@ -855,53 +834,4 @@ interface IOsmAndAidlInterface {
boolean removeAllActiveMapMarkers(in RemoveMapMarkersParams params); boolean removeAllActiveMapMarkers(in RemoveMapMarkersParams params);
boolean importProfile(in ProfileSettingsParams params); boolean importProfile(in ProfileSettingsParams params);
boolean executeQuickAction(in QuickActionParams params);
boolean getQuickActionsInfo(out List<QuickActionInfoParams> 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<Integer>) - list of requested key events
*/
long registerForKeyEvents(in AKeyEventsParams params, IOsmAndAidlCallback callback);
AppInfoParams getAppInfo();
boolean setMapMargins(in MapMarginsParams params);
boolean exportProfile(in ExportProfileParams params);
/**
* Is any fragment open.
*/
boolean isFragmentOpen();
/**
* Is contect menu open.
*/
boolean isMenuOpen();
int getPluginVersion(in CustomPluginParams params);
boolean selectProfile(in SelectProfileParams params);
boolean getProfiles(out List<AProfile> profiles);
boolean getBlockedRoads(out List<ABlockedRoad> blockedRoads);
boolean addRoadBlock(in AddBlockedRoadParams params);
boolean removeRoadBlock(in RemoveBlockedRoadParams params);
boolean setLocation(in SetLocationParams params);
} }

View file

@ -4,14 +4,11 @@ public interface OsmAndCustomizationConstants {
// Navigation Drawer: // Navigation Drawer:
String DRAWER_ITEM_ID_SCHEME = "drawer.action."; 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_DASHBOARD_ID = DRAWER_ITEM_ID_SCHEME + "dashboard";
String DRAWER_MAP_MARKERS_ID = DRAWER_ITEM_ID_SCHEME + "map_markers"; String DRAWER_MAP_MARKERS_ID = DRAWER_ITEM_ID_SCHEME + "map_markers";
String DRAWER_MY_PLACES_ID = DRAWER_ITEM_ID_SCHEME + "my_places"; String DRAWER_MY_PLACES_ID = DRAWER_ITEM_ID_SCHEME + "my_places";
String DRAWER_SEARCH_ID = DRAWER_ITEM_ID_SCHEME + "search"; String DRAWER_SEARCH_ID = DRAWER_ITEM_ID_SCHEME + "search";
String DRAWER_DIRECTIONS_ID = DRAWER_ITEM_ID_SCHEME + "directions"; String DRAWER_DIRECTIONS_ID = DRAWER_ITEM_ID_SCHEME + "directions";
String DRAWER_TRIP_RECORDING_ID = DRAWER_ITEM_ID_SCHEME + "trip_recording";
String DRAWER_CONFIGURE_MAP_ID = DRAWER_ITEM_ID_SCHEME + "configure_map"; String DRAWER_CONFIGURE_MAP_ID = DRAWER_ITEM_ID_SCHEME + "configure_map";
String DRAWER_DOWNLOAD_MAPS_ID = DRAWER_ITEM_ID_SCHEME + "download_maps"; String DRAWER_DOWNLOAD_MAPS_ID = DRAWER_ITEM_ID_SCHEME + "download_maps";
String DRAWER_OSMAND_LIVE_ID = DRAWER_ITEM_ID_SCHEME + "osmand_live"; String DRAWER_OSMAND_LIVE_ID = DRAWER_ITEM_ID_SCHEME + "osmand_live";
@ -38,7 +35,6 @@ public interface OsmAndCustomizationConstants {
String POI_OVERLAY_LABELS_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay_labels"; String POI_OVERLAY_LABELS_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay_labels";
String TRANSPORT_ID = SHOW_ITEMS_ID_SCHEME + "transport"; String TRANSPORT_ID = SHOW_ITEMS_ID_SCHEME + "transport";
String GPX_FILES_ID = SHOW_ITEMS_ID_SCHEME + "gpx_files"; String GPX_FILES_ID = SHOW_ITEMS_ID_SCHEME + "gpx_files";
String WIKIPEDIA_ID = SHOW_ITEMS_ID_SCHEME + "wikipedia";
String MAP_MARKERS_ID = SHOW_ITEMS_ID_SCHEME + "map_markers"; String MAP_MARKERS_ID = SHOW_ITEMS_ID_SCHEME + "map_markers";
String MAP_SOURCE_ID = SHOW_ITEMS_ID_SCHEME + "map_source"; String MAP_SOURCE_ID = SHOW_ITEMS_ID_SCHEME + "map_source";
String RECORDING_LAYER = SHOW_ITEMS_ID_SCHEME + "recording_layer"; String RECORDING_LAYER = SHOW_ITEMS_ID_SCHEME + "recording_layer";
@ -48,7 +44,7 @@ public interface OsmAndCustomizationConstants {
String OVERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "overlay_map"; String OVERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "overlay_map";
String UNDERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "underlay_map"; String UNDERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "underlay_map";
String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines"; String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines";
String TERRAIN = SHOW_ITEMS_ID_SCHEME + "terrain"; String HILLSHADE_LAYER = SHOW_ITEMS_ID_SCHEME + "hillshade_layer";
String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category"; String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category";
String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style"; String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style";
@ -57,6 +53,7 @@ public interface OsmAndCustomizationConstants {
String ROAD_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "road_style"; String ROAD_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "road_style";
String TEXT_SIZE_ID = RENDERING_ITEMS_ID_SCHEME + "text_size"; String TEXT_SIZE_ID = RENDERING_ITEMS_ID_SCHEME + "text_size";
String MAP_LANGUAGE_ID = RENDERING_ITEMS_ID_SCHEME + "map_language"; String MAP_LANGUAGE_ID = RENDERING_ITEMS_ID_SCHEME + "map_language";
String TRANSPORT_RENDERING_ID = RENDERING_ITEMS_ID_SCHEME + "transport";
String DETAILS_ID = RENDERING_ITEMS_ID_SCHEME + "details"; String DETAILS_ID = RENDERING_ITEMS_ID_SCHEME + "details";
String HIDE_ID = RENDERING_ITEMS_ID_SCHEME + "hide"; String HIDE_ID = RENDERING_ITEMS_ID_SCHEME + "hide";
String ROUTES_ID = RENDERING_ITEMS_ID_SCHEME + "routes"; String ROUTES_ID = RENDERING_ITEMS_ID_SCHEME + "routes";
@ -74,10 +71,6 @@ public interface OsmAndCustomizationConstants {
//Map Context Menu Actions: //Map Context Menu Actions:
String MAP_CONTEXT_MENU_ACTIONS = "point.actions."; String MAP_CONTEXT_MENU_ACTIONS = "point.actions.";
String MAP_CONTEXT_MENU_ADD_ID = MAP_CONTEXT_MENU_ACTIONS + "add";
String MAP_CONTEXT_MENU_MARKER_ID = MAP_CONTEXT_MENU_ACTIONS + "marker";
String MAP_CONTEXT_MENU_SHARE_ID = MAP_CONTEXT_MENU_ACTIONS + "share";
String MAP_CONTEXT_MENU_MORE_ID = MAP_CONTEXT_MENU_ACTIONS + "more";
String MAP_CONTEXT_MENU_DIRECTIONS_FROM_ID = MAP_CONTEXT_MENU_ACTIONS + "directions_from"; String MAP_CONTEXT_MENU_DIRECTIONS_FROM_ID = MAP_CONTEXT_MENU_ACTIONS + "directions_from";
String MAP_CONTEXT_MENU_SEARCH_NEARBY = MAP_CONTEXT_MENU_ACTIONS + "search_nearby"; String MAP_CONTEXT_MENU_SEARCH_NEARBY = MAP_CONTEXT_MENU_ACTIONS + "search_nearby";
String MAP_CONTEXT_MENU_CHANGE_MARKER_POSITION = MAP_CONTEXT_MENU_ACTIONS + "change_m_position"; String MAP_CONTEXT_MENU_CHANGE_MARKER_POSITION = MAP_CONTEXT_MENU_ACTIONS + "change_m_position";
@ -93,9 +86,6 @@ public interface OsmAndCustomizationConstants {
String MAP_CONTEXT_MENU_CREATE_POI = MAP_CONTEXT_MENU_ACTIONS + "create_poi"; String MAP_CONTEXT_MENU_CREATE_POI = MAP_CONTEXT_MENU_ACTIONS + "create_poi";
String MAP_CONTEXT_MENU_MODIFY_OSM_NOTE = MAP_CONTEXT_MENU_ACTIONS + "modify_osm_note"; String MAP_CONTEXT_MENU_MODIFY_OSM_NOTE = MAP_CONTEXT_MENU_ACTIONS + "modify_osm_note";
String MAP_CONTEXT_MENU_OPEN_OSM_NOTE = MAP_CONTEXT_MENU_ACTIONS + "open_osm_note"; String MAP_CONTEXT_MENU_OPEN_OSM_NOTE = MAP_CONTEXT_MENU_ACTIONS + "open_osm_note";
String MAP_CONTEXT_MENU_AUDIO_NOTE = MAP_CONTEXT_MENU_ACTIONS + "audio_note";
String MAP_CONTEXT_MENU_VIDEO_NOTE = MAP_CONTEXT_MENU_ACTIONS + "video_note";
String MAP_CONTEXT_MENU_PHOTO_NOTE = MAP_CONTEXT_MENU_ACTIONS + "photo_note";
//Plug-in's IDs: //Plug-in's IDs:
String PLUGIN_OSMAND_MONITOR = "osmand.monitoring"; String PLUGIN_OSMAND_MONITOR = "osmand.monitoring";

View file

@ -2,28 +2,18 @@ package net.osmand.aidlapi.copyfile;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;
public class CopyFileParams extends 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 String fileName;
private byte[] filePartData; private byte[] filePartData;
private long startTime; private long startTime;
private boolean done; private boolean done;
public CopyFileParams(@NonNull String destinationDir, @NonNull String fileName, @NonNull byte[] filePartData, public CopyFileParams(@NonNull String fileName, @NonNull byte[] filePartData, long startTime, boolean done) {
long startTime, boolean done) {
this.destinationDir = destinationDir;
this.fileName = fileName; this.fileName = fileName;
this.filePartData = filePartData; this.filePartData = filePartData;
this.startTime = startTime; this.startTime = startTime;
@ -46,10 +36,6 @@ public class CopyFileParams extends AidlParams {
} }
}; };
public String getDestinationDir() {
return destinationDir;
}
public String getFileName() { public String getFileName() {
return fileName; return fileName;
} }
@ -68,26 +54,23 @@ public class CopyFileParams extends AidlParams {
@Override @Override
public void writeToBundle(Bundle bundle) { public void writeToBundle(Bundle bundle) {
bundle.putString(DESTINATION_DIR_KEY, destinationDir); bundle.putString("fileName", fileName);
bundle.putString(FILE_NAME_KEY, fileName); bundle.putByteArray("filePartData", filePartData);
bundle.putByteArray(FILE_PART_DATA_KEY, filePartData); bundle.putLong("startTime", startTime);
bundle.putLong(START_TIME_KEY, startTime); bundle.putBoolean("done", done);
bundle.putBoolean(DONE_KEY, done);
} }
@Override @Override
protected void readFromBundle(Bundle bundle) { protected void readFromBundle(Bundle bundle) {
destinationDir = bundle.getString(DESTINATION_DIR_KEY); fileName = bundle.getString("fileName");
fileName = bundle.getString(FILE_NAME_KEY); filePartData = bundle.getByteArray("filePartData");
filePartData = bundle.getByteArray(FILE_PART_DATA_KEY); startTime = bundle.getLong("startTime");
startTime = bundle.getLong(START_TIME_KEY); done = bundle.getBoolean("done");
done = bundle.getBoolean(DONE_KEY);
} }
@Override @Override
public String toString() { public String toString() {
return "CopyFileParams {" + return "CopyFileParams {" +
" destinationDir=" + destinationDir +
" fileName=" + fileName + " fileName=" + fileName +
", filePartData size=" + filePartData.length + ", filePartData size=" + filePartData.length +
", startTime=" + startTime + ", startTime=" + startTime +

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.customization;
parcelable AProfile;

View file

@ -1,129 +0,0 @@
package net.osmand.aidlapi.customization;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class AProfile extends AidlParams {
public static final String PROFILE_ID_KEY = "profile_id";
public static final String USER_PROFILE_NAME_KEY = "user_profile_name";
public static final String PARENT_KEY = "parent";
public static final String ICON_NAME_KEY = "icon_name";
public static final String ICON_COLOR_KEY = "icon_color";
public static final String ROUTING_PROFILE_KEY = "routing_profile";
public static final String ROUTE_SERVICE_KEY = "route_service";
public static final String LOC_ICON_KEY = "loc_icon";
public static final String NAV_ICON_KEY = "nav_icon";
public static final String ORDER_KEY = "order";
private String appModeKey;
private String userProfileName;
private String parent;
private String iconName;
private String iconColor;
private String routingProfile;
private String routeService;
private String locIcon;
private String navIcon;
private int order = -1;
public AProfile(String appModeKey, String userProfileName, String parent, String iconName, String iconColor,
String routingProfile, String routeService, String locIcon, String navIcon, int order) {
this.appModeKey = appModeKey;
this.userProfileName = userProfileName;
this.parent = parent;
this.iconName = iconName;
this.iconColor = iconColor;
this.routingProfile = routingProfile;
this.routeService = routeService;
this.locIcon = locIcon;
this.navIcon = navIcon;
this.order = order;
}
public AProfile(Parcel in) {
readFromParcel(in);
}
public static final Creator<AProfile> CREATOR = new Creator<AProfile>() {
@Override
public AProfile createFromParcel(Parcel in) {
return new AProfile(in);
}
@Override
public AProfile[] newArray(int size) {
return new AProfile[size];
}
};
public String getStringKey() {
return appModeKey;
}
public String getUserProfileName() {
return userProfileName;
}
public String getParent() {
return parent;
}
public String getIconName() {
return iconName;
}
public String getIconColor() {
return iconColor;
}
public String getRoutingProfile() {
return routingProfile;
}
public String getRouteService() {
return routeService;
}
public String getLocIcon() {
return locIcon;
}
public String getNavIcon() {
return navIcon;
}
public int getOrder() {
return order;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putString(PROFILE_ID_KEY, appModeKey);
bundle.putString(USER_PROFILE_NAME_KEY, userProfileName);
bundle.putString(PARENT_KEY, parent);
bundle.putString(ICON_NAME_KEY, iconName);
bundle.putString(ICON_COLOR_KEY, iconColor);
bundle.putString(ROUTING_PROFILE_KEY, routingProfile);
bundle.putString(ROUTE_SERVICE_KEY, routeService);
bundle.putString(LOC_ICON_KEY, locIcon);
bundle.putString(NAV_ICON_KEY, navIcon);
bundle.putInt(ORDER_KEY, order);
}
@Override
protected void readFromBundle(Bundle bundle) {
appModeKey = bundle.getString(PROFILE_ID_KEY);
userProfileName = bundle.getString(USER_PROFILE_NAME_KEY);
parent = bundle.getString(PARENT_KEY);
iconName = bundle.getString(ICON_NAME_KEY);
iconColor = bundle.getString(ICON_COLOR_KEY);
routingProfile = bundle.getString(ROUTING_PROFILE_KEY);
routeService = bundle.getString(ROUTE_SERVICE_KEY);
locIcon = bundle.getString(LOC_ICON_KEY);
navIcon = bundle.getString(NAV_ICON_KEY);
order = bundle.getInt(ORDER_KEY);
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.customization;
parcelable CustomPluginParams;

View file

@ -1,48 +0,0 @@
package net.osmand.aidlapi.customization;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class CustomPluginParams extends AidlParams {
public static final String PLUGIN_ID_KEY = "plugin_id";
private String pluginId;
public CustomPluginParams(String pluginId) {
this.pluginId = pluginId;
}
public CustomPluginParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<CustomPluginParams> CREATOR = new Creator<CustomPluginParams>() {
@Override
public CustomPluginParams createFromParcel(Parcel in) {
return new CustomPluginParams(in);
}
@Override
public CustomPluginParams[] newArray(int size) {
return new CustomPluginParams[size];
}
};
public String getPluginId() {
return pluginId;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putString(PLUGIN_ID_KEY, pluginId);
}
@Override
protected void readFromBundle(Bundle bundle) {
pluginId = bundle.getString(PLUGIN_ID_KEY);
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.customization;
parcelable MapMarginsParams;

View file

@ -1,90 +0,0 @@
package net.osmand.aidlapi.customization;
import android.os.Bundle;
import android.os.Parcel;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams;
import java.util.ArrayList;
import java.util.List;
public class MapMarginsParams extends AidlParams {
public static final String LEFT_MARGIN_KEY = "leftMargin";
public static final String TOP_MARGIN_KEY = "topMargin";
public static final String RIGHT_MARGIN_KEY = "rightMargin";
public static final String BOTTOM_MARGIN_KEY = "bottomMargin";
public static final String APP_MODES_KEYS_KEY = "appModesKeys";
private ArrayList<String> appModesKeys = new ArrayList<>();
private int leftMargin;
private int topMargin;
private int rightMargin;
private int bottomMargin;
public MapMarginsParams(int leftMargin, int topMargin, int rightMargin, int bottomMargin,
@Nullable List<String> appModesKeys) {
if (appModesKeys != null) {
this.appModesKeys.addAll(appModesKeys);
}
this.leftMargin = leftMargin;
this.topMargin = topMargin;
this.rightMargin = rightMargin;
this.bottomMargin = bottomMargin;
}
public MapMarginsParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<MapMarginsParams> CREATOR = new Creator<MapMarginsParams>() {
@Override
public MapMarginsParams createFromParcel(Parcel in) {
return new MapMarginsParams(in);
}
@Override
public MapMarginsParams[] newArray(int size) {
return new MapMarginsParams[size];
}
};
public List<String> getAppModesKeys() {
return appModesKeys;
}
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.putInt(LEFT_MARGIN_KEY, leftMargin);
bundle.putInt(TOP_MARGIN_KEY, topMargin);
bundle.putInt(RIGHT_MARGIN_KEY, rightMargin);
bundle.putInt(BOTTOM_MARGIN_KEY, bottomMargin);
bundle.putStringArrayList(APP_MODES_KEYS_KEY, appModesKeys);
}
@Override
protected void readFromBundle(Bundle bundle) {
leftMargin = bundle.getInt(LEFT_MARGIN_KEY);
topMargin = bundle.getInt(TOP_MARGIN_KEY);
rightMargin = bundle.getInt(RIGHT_MARGIN_KEY);
bottomMargin = bundle.getInt(BOTTOM_MARGIN_KEY);
appModesKeys = bundle.getStringArrayList(APP_MODES_KEYS_KEY);
}
}

View file

@ -2,8 +2,7 @@ package net.osmand.aidlapi.customization;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -2,9 +2,8 @@ package net.osmand.aidlapi.customization;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull; import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -5,42 +5,17 @@ import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;
import net.osmand.aidlapi.profile.AExportSettingsType;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.aidlapi.profile.ExportProfileParams.SETTINGS_TYPE_KEY;
public class ProfileSettingsParams extends AidlParams { public class ProfileSettingsParams extends AidlParams {
public static final String VERSION_KEY = "version";
public static final String REPLACE_KEY = "replace";
public static final String SILENT_IMPORT_KEY = "silentImport";
public static final String LATEST_CHANGES_KEY = "latestChanges";
public static final String PROFILE_SETTINGS_URI_KEY = "profileSettingsUri";
private Uri profileSettingsUri; private Uri profileSettingsUri;
private String latestChanges; private String latestChanges;
private int version; private int version;
private List<String> settingsTypeKeyList = new ArrayList<>();
private boolean silent;
private boolean replace;
public ProfileSettingsParams(Uri profileSettingsUri, List<AExportSettingsType> settingsTypeList, boolean replace, public ProfileSettingsParams(Uri profileSettingsUri, String latestChanges, int version) {
boolean silent, String latestChanges, int version) {
this.profileSettingsUri = profileSettingsUri; this.profileSettingsUri = profileSettingsUri;
for (AExportSettingsType settingsType : settingsTypeList) {
settingsTypeKeyList.add(settingsType.name());
}
this.replace = replace;
this.latestChanges = latestChanges; this.latestChanges = latestChanges;
this.version = version; this.version = version;
this.silent = silent;
}
public ProfileSettingsParams(Uri profileSettingsUri, List<AExportSettingsType> settingsTypeList,
boolean replace, String latestChanges, int version) {
this(profileSettingsUri, settingsTypeList, replace, false, latestChanges, version);
} }
public ProfileSettingsParams(Parcel in) { public ProfileSettingsParams(Parcel in) {
@ -71,35 +46,17 @@ public class ProfileSettingsParams extends AidlParams {
return profileSettingsUri; return profileSettingsUri;
} }
public List<String> getSettingsTypeKeys() {
return settingsTypeKeyList;
}
public boolean isReplace() {
return replace;
}
public boolean isSilent() {
return silent;
}
@Override @Override
public void writeToBundle(Bundle bundle) { public void writeToBundle(Bundle bundle) {
bundle.putInt(VERSION_KEY, version); bundle.putInt("version", version);
bundle.putString(LATEST_CHANGES_KEY, latestChanges); bundle.putString("latestChanges", latestChanges);
bundle.putParcelable(PROFILE_SETTINGS_URI_KEY, profileSettingsUri); bundle.putParcelable("profileSettingsUri", profileSettingsUri);
bundle.putStringArrayList(SETTINGS_TYPE_KEY, new ArrayList<>(settingsTypeKeyList));
bundle.putBoolean(REPLACE_KEY, replace);
bundle.putBoolean(SILENT_IMPORT_KEY, silent);
} }
@Override @Override
protected void readFromBundle(Bundle bundle) { protected void readFromBundle(Bundle bundle) {
version = bundle.getInt(VERSION_KEY); version = bundle.getInt("version");
latestChanges = bundle.getString(LATEST_CHANGES_KEY); latestChanges = bundle.getString("latestChanges");
profileSettingsUri = bundle.getParcelable(PROFILE_SETTINGS_URI_KEY); profileSettingsUri = bundle.getParcelable("profileSettingsUri");
settingsTypeKeyList = bundle.getStringArrayList(SETTINGS_TYPE_KEY);
replace = bundle.getBoolean(REPLACE_KEY);
silent = bundle.getBoolean(SILENT_IMPORT_KEY);
} }
} }

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.customization;
parcelable SelectProfileParams;

View file

@ -1,47 +0,0 @@
package net.osmand.aidlapi.customization;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class SelectProfileParams extends AidlParams {
public static final String PROFILE_ID_KEY = "profile_id";
private String appModeKey;
public SelectProfileParams(String appModeKey) {
this.appModeKey = appModeKey;
}
public SelectProfileParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<SelectProfileParams> CREATOR = new Creator<SelectProfileParams>() {
@Override
public SelectProfileParams createFromParcel(Parcel in) {
return new SelectProfileParams(in);
}
@Override
public SelectProfileParams[] newArray(int size) {
return new SelectProfileParams[size];
}
};
public String getAppModeKey() {
return appModeKey;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putString(PROFILE_ID_KEY, appModeKey);
}
@Override
protected void readFromBundle(Bundle bundle) {
appModeKey = bundle.getString(PROFILE_ID_KEY);
}
}

View file

@ -2,8 +2,7 @@ package net.osmand.aidlapi.customization;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -1,2 +0,0 @@
package net.osmand.aidlapi.events;
parcelable AKeyEventsParams;

View file

@ -1,73 +0,0 @@
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<Integer> keyEventList;
public AKeyEventsParams() {
}
protected AKeyEventsParams(Parcel in) {
readFromParcel(in);
}
public static final Parcelable.Creator<AKeyEventsParams> CREATOR = new Parcelable.Creator<AKeyEventsParams>() {
@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<Integer> keyEventList) {
this.keyEventList = keyEventList;
}
public ArrayList<Integer> 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);
}
}

View file

@ -11,18 +11,16 @@ public class AFavorite extends AidlParams {
private double lon; private double lon;
private String name; private String name;
private String description; private String description;
private String address;
private String category; private String category;
private String color; private String color;
private boolean visible; private boolean visible;
public AFavorite(double lat, double lon, String name, String description, String address, public AFavorite(double lat, double lon, String name, String description,
String category, String color, boolean visible) { String category, String color, boolean visible) {
this.lat = lat; this.lat = lat;
this.lon = lon; this.lon = lon;
this.name = name; this.name = name;
this.description = description; this.description = description;
this.address = address;
this.category = category; this.category = category;
this.color = color; this.color = color;
this.visible = visible; this.visible = visible;
@ -60,8 +58,6 @@ public class AFavorite extends AidlParams {
return description; return description;
} }
public String getAddress() { return address; }
public String getCategory() { public String getCategory() {
return category; return category;
} }
@ -80,7 +76,6 @@ public class AFavorite extends AidlParams {
bundle.putDouble("lon", lon); bundle.putDouble("lon", lon);
bundle.putString("name", name); bundle.putString("name", name);
bundle.putString("description", description); bundle.putString("description", description);
bundle.putString("address", address);
bundle.putString("category", category); bundle.putString("category", category);
bundle.putString("color", color); bundle.putString("color", color);
bundle.putBoolean("visible", visible); bundle.putBoolean("visible", visible);
@ -92,7 +87,6 @@ public class AFavorite extends AidlParams {
lon = bundle.getDouble("lon"); lon = bundle.getDouble("lon");
name = bundle.getString("name"); name = bundle.getString("name");
description = bundle.getString("description"); description = bundle.getString("description");
address = bundle.getString("address");
category = bundle.getString("category"); category = bundle.getString("category");
color = bundle.getString("color"); color = bundle.getString("color");
visible = bundle.getBoolean("visible"); visible = bundle.getBoolean("visible");

View file

@ -3,8 +3,7 @@ package net.osmand.aidlapi.gpx;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -2,9 +2,8 @@ package net.osmand.aidlapi.gpx;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull; import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -2,9 +2,8 @@ package net.osmand.aidlapi.gpx;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull; import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.info;
parcelable AppInfoParams;

View file

@ -1,95 +0,0 @@
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<AppInfoParams> CREATOR = new Creator<AppInfoParams>() {
@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");
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.lock;
parcelable SetLockStateParams;

View file

@ -1,45 +0,0 @@
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<SetLockStateParams> CREATOR = new Creator<SetLockStateParams>() {
@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");
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.map;
parcelable ALocation;

View file

@ -1,226 +0,0 @@
package net.osmand.aidlapi.map;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import net.osmand.aidlapi.AidlParams;
public class ALocation extends AidlParams {
private double latitude = 0.0;
private double longitude = 0.0;
private long time = 0;
private boolean hasAltitude = false;
private double altitude = 0.0f;
private boolean hasSpeed = false;
private float speed = 0.0f;
private boolean hasBearing = false;
private float bearing = 0.0f;
private boolean hasAccuracy = false;
private float accuracy = 0.0f;
private boolean hasVerticalAccuracy = false;
private float verticalAccuracy = 0.0f;
private ALocation() {
}
public ALocation(double latitude, double longitude, long time, boolean hasAltitude, double altitude,
boolean hasSpeed, float speed, boolean hasBearing, float bearing,
boolean hasAccuracy, float accuracy, boolean hasVerticalAccuracy, float verticalAccuracy) {
this.latitude = latitude;
this.longitude = longitude;
this.time = time;
this.hasAltitude = hasAltitude;
this.altitude = altitude;
this.hasSpeed = hasSpeed;
this.speed = speed;
this.hasBearing = hasBearing;
this.bearing = bearing;
this.hasAccuracy = hasAccuracy;
this.accuracy = accuracy;
this.hasVerticalAccuracy = hasVerticalAccuracy;
this.verticalAccuracy = verticalAccuracy;
}
public ALocation(Parcel in) {
readFromParcel(in);
}
public static final Parcelable.Creator<ALocation> CREATOR = new Parcelable.Creator<ALocation>() {
@Override
public ALocation createFromParcel(Parcel in) {
return new ALocation(in);
}
@Override
public ALocation[] newArray(int size) {
return new ALocation[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
public long getTime() {
return time;
}
public boolean hasAltitude() {
return hasAltitude;
}
public double getAltitude() {
return altitude;
}
public boolean hasSpeed() {
return hasSpeed;
}
public float getSpeed() {
return speed;
}
public boolean hasBearing() {
return hasBearing;
}
public float getBearing() {
return bearing;
}
public boolean hasAccuracy() {
return hasAccuracy;
}
public float getAccuracy() {
return accuracy;
}
public boolean hasVerticalAccuracy() {
return hasVerticalAccuracy;
}
public float getVerticalAccuracy() {
return verticalAccuracy;
}
@Override
protected void writeToBundle(Bundle bundle) {
bundle.putDouble("latitude", latitude);
bundle.putDouble("longitude", longitude);
bundle.putLong("time", time);
bundle.putBoolean("hasAltitude", hasAltitude);
bundle.putDouble("altitude", altitude);
bundle.putBoolean("hasSpeed", hasSpeed);
bundle.putFloat("speed", speed);
bundle.putBoolean("hasBearing", hasBearing);
bundle.putFloat("bearing", bearing);
bundle.putBoolean("hasAccuracy", hasAccuracy);
bundle.putFloat("accuracy", accuracy);
bundle.putBoolean("hasVerticalAccuracy", hasVerticalAccuracy);
bundle.putFloat("verticalAccuracy", verticalAccuracy);
}
@Override
protected void readFromBundle(Bundle bundle) {
latitude = bundle.getDouble("latitude");
longitude = bundle.getDouble("longitude");
time = bundle.getLong("time");
hasAltitude = bundle.getBoolean("hasAltitude");
altitude = bundle.getDouble("altitude");
hasSpeed = bundle.getBoolean("hasSpeed");
speed = bundle.getFloat("speed");
hasBearing = bundle.getBoolean("hasBearing");
bearing = bundle.getFloat("bearing");
hasAccuracy = bundle.getBoolean("hasAccuracy");
accuracy = bundle.getFloat("accuracy");
hasVerticalAccuracy = bundle.getBoolean("hasVerticalAccuracy");
verticalAccuracy = bundle.getFloat("verticalAccuracy");
}
public static Builder builder() {
return new ALocation().new Builder();
}
public class Builder {
private Builder() {
}
public Builder setLatitude(double latitude) {
ALocation.this.latitude = latitude;
return this;
}
public Builder setLongitude(double longitude) {
ALocation.this.longitude = longitude;
return this;
}
public Builder setTime(long time) {
ALocation.this.time = time;
return this;
}
public Builder hasAltitude(boolean hasAltitude) {
ALocation.this.hasAltitude = hasAltitude;
return this;
}
public Builder setAltitude(float altitude) {
ALocation.this.altitude = altitude;
return this;
}
public Builder hasSpeed(boolean hasSpeed) {
ALocation.this.hasSpeed = hasSpeed;
return this;
}
public Builder setSpeed(float speed) {
ALocation.this.speed = speed;
return this;
}
public Builder hasBearing(boolean hasBearing) {
ALocation.this.hasBearing = hasBearing;
return this;
}
public Builder setBearing(float bearing) {
ALocation.this.bearing = bearing;
return this;
}
public Builder hasAccuracy(boolean hasAccuracy) {
ALocation.this.hasAccuracy = hasAccuracy;
return this;
}
public Builder setAccuracy(float accuracy) {
ALocation.this.accuracy = accuracy;
return this;
}
public Builder hasVerticalAccuracy(boolean hasVerticalAccuracy) {
ALocation.this.hasVerticalAccuracy = hasVerticalAccuracy;
return this;
}
public Builder setVerticalAccuracy(float verticalAccuracy) {
ALocation.this.verticalAccuracy = verticalAccuracy;
return this;
}
public ALocation build() {
return ALocation.this;
}
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.map;
parcelable SetLocationParams;

View file

@ -1,54 +0,0 @@
package net.osmand.aidlapi.map;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class SetLocationParams extends AidlParams {
private ALocation location;
private long timeToNotUseOtherGPS;
public SetLocationParams(ALocation location, long timeToNotUseOtherGPS) {
this.location = location;
this.timeToNotUseOtherGPS = timeToNotUseOtherGPS;
}
public SetLocationParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<SetLocationParams> CREATOR = new Creator<SetLocationParams>() {
@Override
public SetLocationParams createFromParcel(Parcel in) {
return new SetLocationParams(in);
}
@Override
public SetLocationParams[] newArray(int size) {
return new SetLocationParams[size];
}
};
public ALocation getLocation() {
return location;
}
public long getTimeToNotUseOtherGPS() {
return timeToNotUseOtherGPS;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putParcelable("location", location);
bundle.putLong("timeToNotUseOtherGPS", timeToNotUseOtherGPS);
}
@Override
protected void readFromBundle(Bundle bundle) {
bundle.setClassLoader(ALocation.class.getClassLoader());
location = bundle.getParcelable("location");
timeToNotUseOtherGPS = bundle.getLong("timeToNotUseOtherGPS");
}
}

View file

@ -10,14 +10,12 @@ public class SetMapLocationParams extends AidlParams {
private double latitude; private double latitude;
private double longitude; private double longitude;
private int zoom; private int zoom;
private float rotation;
private boolean animated; private boolean animated;
public SetMapLocationParams(double latitude, double longitude, int zoom, float rotation, boolean animated) { public SetMapLocationParams(double latitude, double longitude, int zoom, boolean animated) {
this.latitude = latitude; this.latitude = latitude;
this.longitude = longitude; this.longitude = longitude;
this.zoom = zoom; this.zoom = zoom;
this.rotation = rotation;
this.animated = animated; this.animated = animated;
} }
@ -49,10 +47,6 @@ public class SetMapLocationParams extends AidlParams {
return zoom; return zoom;
} }
public float getRotation() {
return rotation;
}
public boolean isAnimated() { public boolean isAnimated() {
return animated; return animated;
} }
@ -62,7 +56,6 @@ public class SetMapLocationParams extends AidlParams {
bundle.putDouble("latitude", latitude); bundle.putDouble("latitude", latitude);
bundle.putDouble("longitude", longitude); bundle.putDouble("longitude", longitude);
bundle.putInt("zoom", zoom); bundle.putInt("zoom", zoom);
bundle.putFloat("rotation", rotation);
bundle.putBoolean("animated", animated); bundle.putBoolean("animated", animated);
} }
@ -71,7 +64,6 @@ public class SetMapLocationParams extends AidlParams {
latitude = bundle.getDouble("latitude"); latitude = bundle.getDouble("latitude");
longitude = bundle.getDouble("longitude"); longitude = bundle.getDouble("longitude");
zoom = bundle.getInt("zoom"); zoom = bundle.getInt("zoom");
rotation = bundle.getFloat("rotation");
animated = bundle.getBoolean("animated"); animated = bundle.getBoolean("animated");
} }
} }

View file

@ -2,9 +2,8 @@ package net.osmand.aidlapi.navdrawer;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull; import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -2,9 +2,8 @@ package net.osmand.aidlapi.navdrawer;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull; import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -2,9 +2,8 @@ package net.osmand.aidlapi.navdrawer;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull; import android.support.annotation.Nullable;
import androidx.annotation.Nullable;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -2,8 +2,7 @@ package net.osmand.aidlapi.navdrawer;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.navigation;
parcelable ABlockedRoad;

View file

@ -1,85 +0,0 @@
package net.osmand.aidlapi.navigation;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class ABlockedRoad extends AidlParams {
private long roadId;
private double latitude;
private double longitude;
private double direction;
private String name;
private String appModeKey;
public ABlockedRoad(long roadId, double latitude, double longitude, double direction, String name, String appModeKey) {
this.roadId = roadId;
this.latitude = latitude;
this.longitude = longitude;
this.direction = direction;
this.name = name;
this.appModeKey = appModeKey;
}
protected ABlockedRoad(Parcel in) {
readFromParcel(in);
}
public static final Creator<ABlockedRoad> CREATOR = new Creator<ABlockedRoad>() {
@Override
public ABlockedRoad createFromParcel(Parcel in) {
return new ABlockedRoad(in);
}
@Override
public ABlockedRoad[] newArray(int size) {
return new ABlockedRoad[size];
}
};
public long getRoadId() {
return roadId;
}
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
public double getDirection() {
return direction;
}
public String getName() {
return name;
}
public String getAppModeKey() {
return appModeKey;
}
@Override
protected void readFromBundle(Bundle bundle) {
roadId = bundle.getLong("roadId");
latitude = bundle.getDouble("latitude");
longitude = bundle.getDouble("longitude");
direction = bundle.getDouble("direction");
name = bundle.getString("name");
appModeKey = bundle.getString("appModeKey");
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putLong("roadId", roadId);
bundle.putDouble("latitude", latitude);
bundle.putDouble("longitude", longitude);
bundle.putDouble("direction", direction);
bundle.putString("name", name);
bundle.putString("appModeKey", appModeKey);
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.navigation;
parcelable AddBlockedRoadParams;

View file

@ -1,46 +0,0 @@
package net.osmand.aidlapi.navigation;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class AddBlockedRoadParams extends AidlParams {
private ABlockedRoad blockedRoad;
public AddBlockedRoadParams(ABlockedRoad blockedRoad) {
this.blockedRoad = blockedRoad;
}
public AddBlockedRoadParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<AddBlockedRoadParams> CREATOR = new Creator<AddBlockedRoadParams>() {
@Override
public AddBlockedRoadParams createFromParcel(Parcel in) {
return new AddBlockedRoadParams(in);
}
@Override
public AddBlockedRoadParams[] newArray(int size) {
return new AddBlockedRoadParams[size];
}
};
public ABlockedRoad getBlockedRoad() {
return blockedRoad;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putParcelable("blockedRoad", blockedRoad);
}
@Override
protected void readFromBundle(Bundle bundle) {
bundle.setClassLoader(ABlockedRoad.class.getClassLoader());
blockedRoad = bundle.getParcelable("blockedRoad");
}
}

View file

@ -11,18 +11,15 @@ public class NavigateGpxParams extends AidlParams {
private String data; private String data;
private Uri uri; private Uri uri;
private boolean force; private boolean force;
private boolean needLocationPermission;
public NavigateGpxParams(String data, boolean force, boolean needLocationPermission) { public NavigateGpxParams(String data, boolean force) {
this.data = data; this.data = data;
this.force = force; this.force = force;
this.needLocationPermission = needLocationPermission;
} }
public NavigateGpxParams(Uri uri, boolean force, boolean needLocationPermission) { public NavigateGpxParams(Uri uri, boolean force) {
this.uri = uri; this.uri = uri;
this.force = force; this.force = force;
this.needLocationPermission = needLocationPermission;
} }
public NavigateGpxParams(Parcel in) { public NavigateGpxParams(Parcel in) {
@ -53,16 +50,11 @@ public class NavigateGpxParams extends AidlParams {
return force; return force;
} }
public boolean isNeedLocationPermission() {
return needLocationPermission;
}
@Override @Override
public void writeToBundle(Bundle bundle) { public void writeToBundle(Bundle bundle) {
bundle.putString("data", data); bundle.putString("data", data);
bundle.putParcelable("uri", uri); bundle.putParcelable("uri", uri);
bundle.putBoolean("force", force); bundle.putBoolean("force", force);
bundle.putBoolean("needLocationPermission", needLocationPermission);
} }
@Override @Override
@ -70,6 +62,5 @@ public class NavigateGpxParams extends AidlParams {
data = bundle.getString("data"); data = bundle.getString("data");
uri = bundle.getParcelable("uri"); uri = bundle.getParcelable("uri");
force = bundle.getBoolean("force"); force = bundle.getBoolean("force");
needLocationPermission = bundle.getBoolean("needLocationPermission");
} }
} }

View file

@ -17,10 +17,8 @@ public class NavigateParams extends AidlParams {
private double destLon; private double destLon;
private boolean force; private boolean force;
private boolean needLocationPermission;
public NavigateParams(String startName, double startLat, double startLon, String destName, double destLat, public NavigateParams(String startName, double startLat, double startLon, String destName, double destLat, double destLon, String profile, boolean force) {
double destLon, String profile, boolean force, boolean needLocationPermission) {
this.startName = startName; this.startName = startName;
this.startLat = startLat; this.startLat = startLat;
this.startLon = startLon; this.startLon = startLon;
@ -29,7 +27,6 @@ public class NavigateParams extends AidlParams {
this.destLon = destLon; this.destLon = destLon;
this.profile = profile; this.profile = profile;
this.force = force; this.force = force;
this.needLocationPermission = needLocationPermission;
} }
public NavigateParams(Parcel in) { public NavigateParams(Parcel in) {
@ -80,10 +77,6 @@ public class NavigateParams extends AidlParams {
return force; return force;
} }
public boolean isNeedLocationPermission() {
return needLocationPermission;
}
@Override @Override
public void writeToBundle(Bundle bundle) { public void writeToBundle(Bundle bundle) {
bundle.putString("startName", startName); bundle.putString("startName", startName);
@ -94,7 +87,6 @@ public class NavigateParams extends AidlParams {
bundle.putDouble("destLon", destLon); bundle.putDouble("destLon", destLon);
bundle.putString("profile", profile); bundle.putString("profile", profile);
bundle.putBoolean("force", force); bundle.putBoolean("force", force);
bundle.putBoolean("needLocationPermission", needLocationPermission);
} }
@Override @Override
@ -107,6 +99,5 @@ public class NavigateParams extends AidlParams {
destLon = bundle.getDouble("destLon"); destLon = bundle.getDouble("destLon");
profile = bundle.getString("profile"); profile = bundle.getString("profile");
force = bundle.getBoolean("force"); force = bundle.getBoolean("force");
needLocationPermission = bundle.getBoolean("needLocationPermission");
} }
} }

View file

@ -17,11 +17,10 @@ public class NavigateSearchParams extends AidlParams {
private double searchLon; private double searchLon;
private boolean force; private boolean force;
private boolean needLocationPermission;
public NavigateSearchParams(String startName, double startLat, double startLon, public NavigateSearchParams(String startName, double startLat, double startLon,
String searchQuery, double searchLat, double searchLon, String searchQuery, double searchLat, double searchLon,
String profile, boolean force, boolean needLocationPermission) { String profile, boolean force) {
this.startName = startName; this.startName = startName;
this.startLat = startLat; this.startLat = startLat;
this.startLon = startLon; this.startLon = startLon;
@ -30,7 +29,6 @@ public class NavigateSearchParams extends AidlParams {
this.searchLon = searchLon; this.searchLon = searchLon;
this.profile = profile; this.profile = profile;
this.force = force; this.force = force;
this.needLocationPermission = needLocationPermission;
} }
public NavigateSearchParams(Parcel in) { public NavigateSearchParams(Parcel in) {
@ -81,10 +79,6 @@ public class NavigateSearchParams extends AidlParams {
return force; return force;
} }
public boolean isNeedLocationPermission() {
return needLocationPermission;
}
@Override @Override
public void writeToBundle(Bundle bundle) { public void writeToBundle(Bundle bundle) {
bundle.putString("startName", startName); bundle.putString("startName", startName);
@ -95,7 +89,6 @@ public class NavigateSearchParams extends AidlParams {
bundle.putBoolean("force", force); bundle.putBoolean("force", force);
bundle.putDouble("searchLat", searchLat); bundle.putDouble("searchLat", searchLat);
bundle.putDouble("searchLon", searchLon); bundle.putDouble("searchLon", searchLon);
bundle.putBoolean("needLocationPermission", needLocationPermission);
} }
@Override @Override
@ -108,6 +101,5 @@ public class NavigateSearchParams extends AidlParams {
force = bundle.getBoolean("force"); force = bundle.getBoolean("force");
searchLat = bundle.getDouble("searchLat"); searchLat = bundle.getDouble("searchLat");
searchLon = bundle.getDouble("searchLon"); searchLon = bundle.getDouble("searchLon");
needLocationPermission = bundle.getBoolean("needLocationPermission");
} }
} }

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.navigation;
parcelable RemoveBlockedRoadParams;

View file

@ -1,46 +0,0 @@
package net.osmand.aidlapi.navigation;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class RemoveBlockedRoadParams extends AidlParams {
private ABlockedRoad blockedRoad;
public RemoveBlockedRoadParams(ABlockedRoad blockedRoad) {
this.blockedRoad = blockedRoad;
}
public RemoveBlockedRoadParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<RemoveBlockedRoadParams> CREATOR = new Creator<RemoveBlockedRoadParams>() {
@Override
public RemoveBlockedRoadParams createFromParcel(Parcel in) {
return new RemoveBlockedRoadParams(in);
}
@Override
public RemoveBlockedRoadParams[] newArray(int size) {
return new RemoveBlockedRoadParams[size];
}
};
public ABlockedRoad getBlockedRoad() {
return blockedRoad;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putParcelable("blockedRoad", blockedRoad);
}
@Override
protected void readFromBundle(Bundle bundle) {
bundle.setClassLoader(ABlockedRoad.class.getClassLoader());
blockedRoad = bundle.getParcelable("blockedRoad");
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.profile;
parcelable AExportSettingsType;

View file

@ -1,11 +0,0 @@
package net.osmand.aidlapi.profile;
public enum AExportSettingsType {
PROFILE,
QUICK_ACTIONS,
POI_TYPES,
MAP_SOURCES,
CUSTOM_RENDER_STYLE,
CUSTOM_ROUTING,
AVOID_ROADS;
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.profile;
parcelable ExportProfileParams;

View file

@ -1,61 +0,0 @@
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<String> settingsTypeKeyList = new ArrayList<>();
public ExportProfileParams(String profile, ArrayList<AExportSettingsType> settingsTypeList) {
this.profile = profile;
for (AExportSettingsType settingsType : settingsTypeList) {
settingsTypeKeyList.add(settingsType.name());
}
}
public ExportProfileParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<ExportProfileParams> CREATOR = new Creator<ExportProfileParams>() {
@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<String> 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);
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.quickaction;
parcelable QuickActionInfoParams;

View file

@ -1,69 +0,0 @@
package net.osmand.aidlapi.quickaction;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class QuickActionInfoParams extends AidlParams {
private int actionId;
private String name;
private String actionType;
private String params;
public QuickActionInfoParams(int actionId, String name, String actionType, String params) {
this.actionId = actionId;
this.name = name;
this.actionType = actionType;
this.params = params;
}
public QuickActionInfoParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<QuickActionInfoParams> CREATOR = new Creator<QuickActionInfoParams>() {
@Override
public QuickActionInfoParams createFromParcel(Parcel in) {
return new QuickActionInfoParams(in);
}
@Override
public QuickActionInfoParams[] newArray(int size) {
return new QuickActionInfoParams[size];
}
};
public int getActionId() {
return actionId;
}
public String getName() {
return name;
}
public String getActionType() {
return actionType;
}
public String getParams() {
return params;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putInt("actionId", actionId);
bundle.putString("name", name);
bundle.putString("actionType", actionType);
bundle.putString("params", params);
}
@Override
protected void readFromBundle(Bundle bundle) {
actionId = bundle.getInt("actionNumber");
name = bundle.getString("name");
actionType = bundle.getString("actionType");
params = bundle.getString("params");
}
}

View file

@ -1,3 +0,0 @@
package net.osmand.aidlapi.quickaction;
parcelable QuickActionParams;

View file

@ -1,45 +0,0 @@
package net.osmand.aidlapi.quickaction;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
public class QuickActionParams extends AidlParams {
private int actionNumber;
public QuickActionParams(int actionNumber) {
this.actionNumber = actionNumber;
}
public QuickActionParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<QuickActionParams> CREATOR = new Creator<QuickActionParams>() {
@Override
public QuickActionParams createFromParcel(Parcel in) {
return new QuickActionParams(in);
}
@Override
public QuickActionParams[] newArray(int size) {
return new QuickActionParams[size];
}
};
public int getActionNumber() {
return actionNumber;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putInt("actionNumber", actionNumber);
}
@Override
protected void readFromBundle(Bundle bundle) {
actionNumber = bundle.getInt("actionNumber");
}
}

View file

@ -2,8 +2,7 @@ package net.osmand.aidlapi.tiles;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.NonNull;
import androidx.annotation.NonNull;
import net.osmand.aidlapi.AidlParams; import net.osmand.aidlapi.AidlParams;

Binary file not shown.

BIN
OsmAnd-java/OsmAnd-core.jar Normal file

Binary file not shown.

View file

@ -1,7 +1,6 @@
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
apply plugin: 'ivy-publish'
configurations { configurations {
android android
} }
@ -44,7 +43,6 @@ task collectTestResources(type: Copy) {
into "src/test/resources/" into "src/test/resources/"
from("../../resources/test-resources") { from("../../resources/test-resources") {
include "*" include "*"
include "/search/*"
} }
from("../../resources/poi") { from("../../resources/poi") {
include "poi_types.xml" include "poi_types.xml"
@ -86,22 +84,12 @@ artifacts {
} }
publishing { publishing {
repositories {
ivy {
url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./"
}
}
publications { publications {
maven(MavenPublication) { maven(MavenPublication) {
artifactId "osmand-base" artifactId "osmand-base"
from components.java from components.java
} }
ivyJava(IvyPublication) { }
artifact androidJar {
classifier 'android'
}
}
}
} }
dependencies { dependencies {
@ -115,9 +103,6 @@ dependencies {
implementation 'com.moparisthebest:junidecode:0.1.1' implementation 'com.moparisthebest:junidecode:0.1.1'
implementation 'com.vividsolutions:jts-core:1.14.0' implementation 'com.vividsolutions:jts-core:1.14.0'
implementation 'com.google.openlocationcode:openlocationcode:1.0.4' implementation 'com.google.openlocationcode:openlocationcode:1.0.4'
implementation ('com.github.scribejava:scribejava-apis:7.1.1') {
exclude group: "com.fasterxml.jackson.core"
}
// turn off for now // turn off for now
//implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0' //implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0'
implementation 'net.sf.kxml:kxml2:2.1.8' implementation 'net.sf.kxml:kxml2:2.1.8'

View file

@ -800,7 +800,7 @@ public abstract class ByteString implements Iterable<Byte> {
// Copy the information we need into local variables so as to hold // Copy the information we need into local variables so as to hold
// the lock for as short a time as possible. // the lock for as short a time as possible.
cachedFlushBuffers = cachedFlushBuffers =
flushedBuffers.toArray(new ByteString[0]); flushedBuffers.toArray(new ByteString[flushedBuffers.size()]);
cachedBuffer = buffer; cachedBuffer = buffer;
cachedBufferPos = bufferPos; cachedBufferPos = bufferPos;
} }

View file

@ -242,7 +242,8 @@ final class FieldSet<FieldDescriptorType extends
// Wrap the contents in a new list so that the caller cannot change // Wrap the contents in a new list so that the caller cannot change
// the list's contents after setting it. // the list's contents after setting it.
final List newList = new ArrayList((List) value); final List newList = new ArrayList();
newList.addAll((List) value);
for (final Object element : newList) { for (final Object element : newList) {
verifyType(descriptor.getLiteType(), element); verifyType(descriptor.getLiteType(), element);
} }

View file

@ -14,11 +14,6 @@
package com.jwetherell.openmap.common; package com.jwetherell.openmap.common;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
public class MGRSPoint extends ZonedUTMPoint { public class MGRSPoint extends ZonedUTMPoint {
/** /**
@ -109,15 +104,6 @@ public class MGRSPoint extends ZonedUTMPoint {
* an UPPERCASE coordinate string is expected. * an UPPERCASE coordinate string is expected.
*/ */
protected void decode(String mgrsString) throws NumberFormatException { protected void decode(String mgrsString) throws NumberFormatException {
if (mgrsString.contains(" ")) {
String[] parts = mgrsString.split(" ");
StringBuilder s = new StringBuilder();
for (String i : parts) {
s.append(i);
}
mgrsString = s.toString();
}
if (mgrsString == null || mgrsString.length() == 0) { if (mgrsString == null || mgrsString.length() == 0) {
throw new NumberFormatException("MGRSPoint coverting from nothing"); throw new NumberFormatException("MGRSPoint coverting from nothing");
} }
@ -647,96 +633,6 @@ public class MGRSPoint extends ZonedUTMPoint {
return twoLetter; return twoLetter;
} }
public String toFlavoredString() {
try {
List<String> all = new ArrayList<>();
for (int i = 0; i <= mgrs.length(); i++) {
if (Character.isAlphabetic(mgrs.charAt(i))){
all.add(mgrs.substring(0,i+1));
all.add(mgrs.substring(i+1,i+3));
String remains = mgrs.substring(i+3);
all.add(remains.substring(0,remains.length()/2));
all.add(remains.substring(remains.length()/2));
break;
}
}
StringBuilder os = new StringBuilder();
for(String part: all){
if (os.length() > 0) os.append(" ");
os.append(part);
}
return os.toString();
}catch (Exception e){
return mgrs;
}
}
public String toFlavoredString(int accuracy) {
try {
List<String> all = new ArrayList<>();
for (int i = 0; i <= mgrs.length(); i++) {
if (Character.isAlphabetic(mgrs.charAt(i))){
all.add(mgrs.substring(0,i+1));
all.add(mgrs.substring(i+1,i+3));
String remains = mgrs.substring(i+3);
int easting = Integer.parseInt(remains.substring(0,remains.length()/2));
int northing = Integer.parseInt(remains.substring(remains.length()/2));
double resolution = Math.pow(10, getAccuracy() - accuracy);
long roundedEasting = Math.round(easting/resolution);
long roundedNorthing = Math.round(northing/resolution);
int eastShift = 0;
int northShift = 0;
if (roundedEasting == resolution*10){
roundedEasting = 0L;
eastShift = 1;
}
if (roundedNorthing == resolution*10){
roundedNorthing = 0L;
northShift = 1;
}
if (eastShift != 0 || northShift != 0){
all.set(1, shiftChar(all.get(1), eastShift, northShift));
String zero = "";
}
all.add(String.format(Locale.US,"%0" + accuracy + "d", roundedEasting));
all.add(String.format(Locale.US,"%0" + accuracy + "d", roundedNorthing));
break;
}
}
StringBuilder os = new StringBuilder();
for(String part: all){
if (os.length() > 0) os.append(" ");
os.append(part);
}
return os.toString();
}catch (Exception e){
return toFlavoredString();
}
}
private static String shiftChar(String chars, int east, int north){
ArrayList<Character> keys = new ArrayList<Character>(
Arrays.asList('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'));
StringBuilder s = new StringBuilder();
if (east != 0){
int idx = keys.indexOf(chars.charAt(0));
idx += east;
if (idx >= keys.size()) idx -= keys.size();
if (idx < 0) idx += keys.size();
s.append(keys.get(idx));
}else s.append(chars.charAt(0));
if (north != 0){
int idx = keys.indexOf(chars.charAt(1));
idx += north;
if (idx >= keys.size()) idx -= keys.size();
if (idx < 0) idx += keys.size();
s.append(keys.get(idx));
}else s.append(chars.charAt(1));
return s.toString();
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

View file

@ -345,6 +345,7 @@ public final class JtsAdapter {
for(int i = 0; i < geom.getNumGeometries(); ++i) { for(int i = 0; i < geom.getNumGeometries(); ++i) {
final Polygon nextPoly = (Polygon) geom.getGeometryN(i); final Polygon nextPoly = (Polygon) geom.getGeometryN(i);
final List<Integer> nextPolyGeom = new ArrayList<>();
boolean valid = true; boolean valid = true;
// Add exterior ring // Add exterior ring
@ -361,7 +362,7 @@ public final class JtsAdapter {
CoordinateArrays.reverse(exteriorRing.getCoordinates()); CoordinateArrays.reverse(exteriorRing.getCoordinates());
} }
final List<Integer> nextPolyGeom = new ArrayList<>(linesToGeomCmds(exteriorRing, mvtClosePath, cursor, 2)); nextPolyGeom.addAll(linesToGeomCmds(exteriorRing, mvtClosePath, cursor, 2));
// Add interior rings // Add interior rings

View file

@ -322,7 +322,7 @@ public final class MvtReader {
geoms.add(geomFactory.createLineString(nextCoordSeq)); geoms.add(geomFactory.createLineString(nextCoordSeq));
} }
return geoms.size() == 1 ? geoms.get(0) : geomFactory.createMultiLineString(geoms.toArray(new LineString[0])); return geoms.size() == 1 ? geoms.get(0) : geomFactory.createMultiLineString(geoms.toArray(new LineString[geoms.size()]));
} }
/** /**
@ -450,7 +450,7 @@ public final class MvtReader {
return polygons.get(0); return polygons.get(0);
} else { } else {
return geomFactory.createMultiPolygon(polygons.toArray(new Polygon[0])); return geomFactory.createMultiPolygon(polygons.toArray(new Polygon[polygons.size()]));
} }
} }
@ -512,7 +512,7 @@ public final class MvtReader {
if (area > 0d) { if (area > 0d) {
if (outerPoly != null) { if (outerPoly != null) {
polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[0]))); polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[holes.size()])));
holes.clear(); holes.clear();
} }
@ -533,7 +533,7 @@ public final class MvtReader {
if (outerPoly != null) { if (outerPoly != null) {
holes.toArray(); holes.toArray();
polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[0]))); polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[holes.size()])));
} }
return polygons; return polygons;
@ -569,7 +569,7 @@ public final class MvtReader {
if (outerPoly == null || (outerArea < 0 == area < 0)) { if (outerPoly == null || (outerArea < 0 == area < 0)) {
if (outerPoly != null) { if (outerPoly != null) {
polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[0]))); polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[holes.size()])));
holes.clear(); holes.clear();
} }
@ -590,7 +590,7 @@ public final class MvtReader {
if (outerPoly != null) { if (outerPoly != null) {
holes.toArray(); holes.toArray();
polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[0]))); polygons.add(geomFactory.createPolygon(outerPoly, holes.toArray(new LinearRing[holes.size()])));
} }
return polygons; return polygons;

View file

@ -17,34 +17,19 @@ public class CollatorStringMatcher implements StringMatcher {
private final String part; private final String part;
public static enum StringMatcherMode { public static enum StringMatcherMode {
// tests only first word as base starts with part
CHECK_ONLY_STARTS_WITH, CHECK_ONLY_STARTS_WITH,
// tests all words (split by space) and one of word should start with a given part
CHECK_STARTS_FROM_SPACE, 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, 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, CHECK_EQUALS_FROM_SPACE,
// simple collator contains in any part of the base
CHECK_CONTAINS, CHECK_CONTAINS,
// simple collator equals CHECK_ONLY_STARTS_WITH_TRIM,
CHECK_EQUALS, CHECK_EQUALS,
} }
public CollatorStringMatcher(String part, StringMatcherMode mode) { public CollatorStringMatcher(String part, StringMatcherMode mode) {
this.collator = OsmAndCollator.primaryCollator(); this.collator = OsmAndCollator.primaryCollator();
part = simplifyStringAndAlignChars(part); this.part = part.toLowerCase(Locale.getDefault());
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; this.mode = mode;
} }
public Collator getCollator() { public Collator getCollator() {
@ -57,20 +42,22 @@ public class CollatorStringMatcher implements StringMatcher {
} }
public static boolean cmatches(Collator collator, String fullName, String part, StringMatcherMode mode){ public static boolean cmatches(Collator collator, String base, String part, StringMatcherMode mode){
switch (mode) { switch (mode) {
case CHECK_CONTAINS: case CHECK_CONTAINS:
return ccontains(collator, fullName, part); return ccontains(collator, base, part);
case CHECK_EQUALS_FROM_SPACE: case CHECK_EQUALS_FROM_SPACE:
return cstartsWith(collator, fullName, part, true, true, true); return cstartsWith(collator, base, part, true, true, true, false);
case CHECK_STARTS_FROM_SPACE: case CHECK_STARTS_FROM_SPACE:
return cstartsWith(collator, fullName, part, true, true, false); return cstartsWith(collator, base, part, true, true, false, false);
case CHECK_STARTS_FROM_SPACE_NOT_BEGINNING: case CHECK_STARTS_FROM_SPACE_NOT_BEGINNING:
return cstartsWith(collator, fullName, part, false, true, false); return cstartsWith(collator, base, part, false, true, false, false);
case CHECK_ONLY_STARTS_WITH: case CHECK_ONLY_STARTS_WITH:
return cstartsWith(collator, fullName, part, true, false, false); return cstartsWith(collator, base, part, true, false, false, false);
case CHECK_ONLY_STARTS_WITH_TRIM:
return cstartsWith(collator, base, part, true, false, false, true);
case CHECK_EQUALS: case CHECK_EQUALS:
return cstartsWith(collator, fullName, part, false, false, true); return cstartsWith(collator, base, part, false, false, true, false);
} }
return false; return false;
} }
@ -129,19 +116,25 @@ public class CollatorStringMatcher implements StringMatcher {
* Special check try to find as well in the middle of name * Special check try to find as well in the middle of name
* *
* @param collator * @param collator
* @param fullText * @param searchInParam
* @param theStart * @param theStart
* @param trim - trim theStart to searchInParam length if searchInParam non empty
* @return true if searchIn starts with token * @return true if searchIn starts with token
*/ */
public static boolean cstartsWith(Collator collator, String fullTextP, String theStart, public static boolean cstartsWith(Collator collator, String searchInParam, String theStart,
boolean checkBeginning, boolean checkSpaces, boolean equals) { boolean checkBeginning, boolean checkSpaces, boolean equals, boolean trim) {
String searchIn = simplifyStringAndAlignChars(fullTextP); String searchIn = searchInParam.toLowerCase(Locale.getDefault());
if (trim && searchIn.length() > 0) {
searchIn += " ";
}
int searchInLength = searchIn.length(); int searchInLength = searchIn.length();
if (trim && searchInLength > 0 && theStart.length() > searchInLength) {
theStart = theStart.substring(0, searchInLength);
}
int startLength = theStart.length(); int startLength = theStart.length();
if (startLength == 0) { if (startLength == 0) {
return true; return true;
} }
// this is not correct because of Auhofstrasse != Auhofstraße
if (startLength > searchInLength) { if (startLength > searchInLength) {
return false; return false;
} }
@ -163,8 +156,7 @@ public class CollatorStringMatcher implements StringMatcher {
if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) { if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) {
if (collator.equals(searchIn.substring(i, i + startLength), theStart)) { if (collator.equals(searchIn.substring(i, i + startLength), theStart)) {
if(equals) { if(equals) {
if(i + startLength == searchInLength || if(i + startLength == searchInLength || isSpace(searchIn.charAt(i + startLength))) {
isSpace(searchIn.charAt(i + startLength))) {
return true; return true;
} }
} else { } else {
@ -180,17 +172,7 @@ public class CollatorStringMatcher implements StringMatcher {
return false; 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){ private static boolean isSpace(char c){
return !Character.isLetter(c) && !Character.isDigit(c); return !Character.isLetter(c) && !Character.isDigit(c);
} }
} }

View file

@ -1,12 +1,7 @@
package net.osmand; 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.data.QuadRect;
import net.osmand.router.RouteColorize.ColorizationType;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -46,23 +41,16 @@ import java.util.Stack;
import java.util.TimeZone; import java.util.TimeZone;
public class GPXUtilities { public class GPXUtilities {
public final static Log log = PlatformUtil.getLog(GPXUtilities.class); public final static Log log = PlatformUtil.getLog(GPXUtilities.class);
private static final String ICON_NAME_EXTENSION = "icon"; private static final String ICON_NAME_EXTENSION = "icon";
private static final String DEFAULT_ICON_NAME = "special_star"; 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 GAP_PROFILE_TYPE = "gap";
private static final String TRKPT_INDEX_EXTENSION = "trkpt_idx";
public final static String GPX_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; //$NON-NLS-1$ 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$ private final static String GPX_TIME_FORMAT_MILLIS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; //$NON-NLS-1$
private final static NumberFormat latLonFormat = new DecimalFormat("0.00#####", new DecimalFormatSymbols( private final static NumberFormat latLonFormat = new DecimalFormat("0.00#####", new DecimalFormatSymbols(
new Locale("EN", "US"))); new Locale("EN", "US")));
// speed, ele, hdop private final static NumberFormat decimalFormat = new DecimalFormat("#.###", new DecimalFormatSymbols(
private final static NumberFormat decimalFormat = new DecimalFormat("#.#", new DecimalFormatSymbols(
new Locale("EN", "US"))); new Locale("EN", "US")));
public enum GPXColor { public enum GPXColor {
@ -73,7 +61,6 @@ public class GPXUtilities {
WHITE(0xFFFFFFFF), WHITE(0xFFFFFFFF),
RED(0xFFFF0000), RED(0xFFFF0000),
GREEN(0xFF00FF00), GREEN(0xFF00FF00),
DARKGREEN(0xFF006400),
BLUE(0xFF0000FF), BLUE(0xFF0000FF),
YELLOW(0xFFFFFF00), YELLOW(0xFFFFFF00),
CYAN(0xFF00FFFF), CYAN(0xFF00FFFF),
@ -107,17 +94,8 @@ public class GPXUtilities {
} }
} }
public interface GPXExtensionsWriter {
public void writeExtensions(XmlSerializer serializer);
}
public interface GPXExtensionsReader {
public boolean readExtensions(GPXFile res, XmlPullParser parser) throws Exception;
}
public static class GPXExtensions { public static class GPXExtensions {
Map<String, String> extensions = null; Map<String, String> extensions = null;
GPXExtensionsWriter extensionsWriter = null;
public Map<String, String> getExtensionsToRead() { public Map<String, String> getExtensionsToRead() {
if (extensions == null) { if (extensions == null) {
@ -126,28 +104,6 @@ public class GPXUtilities {
return extensions; return extensions;
} }
public Map<String, String> getExtensionsToWrite() {
if (extensions == null) {
extensions = new LinkedHashMap<>();
}
return extensions;
}
public void copyExtensions(GPXExtensions e) {
Map<String, String> extensionsToRead = e.getExtensionsToRead();
if (!extensionsToRead.isEmpty()) {
getExtensionsToWrite().putAll(extensionsToRead);
}
}
public GPXExtensionsWriter getExtensionsWriter() {
return extensionsWriter;
}
public void setExtensionsWriter(GPXExtensionsWriter extensionsWriter) {
this.extensionsWriter = extensionsWriter;
}
public int getColor(int defColor) { public int getColor(int defColor) {
String clrValue = null; String clrValue = null;
if (extensions != null) { if (extensions != null) {
@ -173,11 +129,18 @@ public class GPXUtilities {
getExtensionsToWrite().remove("color"); getExtensionsToWrite().remove("color");
} }
protected int parseColor(String colorString, int defColor) { public Map<String, String> getExtensionsToWrite() {
if (extensions == null) {
extensions = new LinkedHashMap<>();
}
return extensions;
}
private int parseColor(String colorString, int defColor) {
if (!Algorithms.isEmpty(colorString)) { if (!Algorithms.isEmpty(colorString)) {
if (colorString.charAt(0) == '#') { if (colorString.charAt(0) == '#') {
long color = Long.parseLong(colorString.substring(1), 16); long color = Long.parseLong(colorString.substring(1), 16);
if (colorString.length() <= 7) { if (colorString.length() == 7) {
color |= 0x00000000ff000000; color |= 0x00000000ff000000;
} else if (colorString.length() != 9) { } else if (colorString.length() != 9) {
return defColor; return defColor;
@ -228,9 +191,6 @@ public class GPXUtilities {
public double hdop = Double.NaN; public double hdop = Double.NaN;
public float heading = Float.NaN; public float heading = Float.NaN;
public boolean deleted = false; public boolean deleted = false;
public int speedColor = 0;
public int altitudeColor = 0;
public int slopeColor = 0;
public int colourARGB = 0; // point colour (used for altitude/speed colouring) public int colourARGB = 0; // point colour (used for altitude/speed colouring)
public double distance = 0.0; // cumulative distance, if in a track public double distance = 0.0; // cumulative distance, if in a track
@ -253,9 +213,6 @@ public class GPXUtilities {
this.hdop = wptPt.hdop; this.hdop = wptPt.hdop;
this.heading = wptPt.heading; this.heading = wptPt.heading;
this.deleted = wptPt.deleted; this.deleted = wptPt.deleted;
this.speedColor = wptPt.speedColor;
this.altitudeColor = wptPt.altitudeColor;
this.slopeColor = wptPt.slopeColor;
this.colourARGB = wptPt.colourARGB; this.colourARGB = wptPt.colourARGB;
this.distance = wptPt.distance; this.distance = wptPt.distance;
} }
@ -303,10 +260,6 @@ public class GPXUtilities {
} }
public String getIconName() { public String getIconName() {
return getExtensionsToRead().get(ICON_NAME_EXTENSION);
}
public String getIconNameOrDefault() {
String iconName = getExtensionsToRead().get(ICON_NAME_EXTENSION); String iconName = getExtensionsToRead().get(ICON_NAME_EXTENSION);
if (iconName == null) { if (iconName == null) {
iconName = DEFAULT_ICON_NAME; iconName = DEFAULT_ICON_NAME;
@ -318,72 +271,6 @@ public class GPXUtilities {
getExtensionsToWrite().put(ICON_NAME_EXTENSION, iconName); getExtensionsToWrite().put(ICON_NAME_EXTENSION, iconName);
} }
public int getColor(ColorizationType type) {
if (type == ColorizationType.SPEED) {
return speedColor;
} else if (type == ColorizationType.ELEVATION) {
return altitudeColor;
} else {
return slopeColor;
}
}
public void setColor(ColorizationType type, int color) {
if (type == ColorizationType.SPEED) {
speedColor = color;
} else if (type == ColorizationType.ELEVATION) {
altitudeColor = color;
} else if (type == ColorizationType.SLOPE) {
slopeColor = color;
}
}
public String getBackgroundType() {
return getExtensionsToRead().get(BACKGROUND_TYPE_EXTENSION);
}
public void setBackgroundType(String backType) {
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 boolean hasProfile() {
String profileType = getProfileType();
return profileType != null && !GAP_PROFILE_TYPE.equals(profileType);
}
public boolean isGap() {
String profileType = getProfileType();
return GAP_PROFILE_TYPE.equals(profileType);
}
public void setGap() {
setProfileType(GAP_PROFILE_TYPE);
}
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 @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
@ -418,16 +305,11 @@ public class GPXUtilities {
public static class TrkSegment extends GPXExtensions { public static class TrkSegment extends GPXExtensions {
public boolean generalSegment = false; public boolean generalSegment = false;
public List<WptPt> points = new ArrayList<>(); public List<WptPt> points = new ArrayList<>();
public Object renderer; public Object renderer;
public List<RouteSegment> routeSegments = new ArrayList<>();
public List<RouteType> routeTypes = new ArrayList<>();
public boolean hasRoute() {
return !routeSegments.isEmpty() && !routeTypes.isEmpty();
}
public List<GPXTrackAnalysis> splitByDistance(double meters, boolean joinSegments) { public List<GPXTrackAnalysis> splitByDistance(double meters, boolean joinSegments) {
return split(getDistanceMetric(), getTimeSplit(), meters, joinSegments); return split(getDistanceMetric(), getTimeSplit(), meters, joinSegments);
@ -442,6 +324,7 @@ public class GPXUtilities {
splitSegment(metric, secondaryMetric, metricLimit, splitSegments, this, joinSegments); splitSegment(metric, secondaryMetric, metricLimit, splitSegments, this, joinSegments);
return convert(splitSegments); return convert(splitSegments);
} }
} }
public static class Track extends GPXExtensions { public static class Track extends GPXExtensions {
@ -477,10 +360,6 @@ public class GPXUtilities {
public String getArticleLang() { public String getArticleLang() {
return getExtensionsToRead().get("article_lang"); return getExtensionsToRead().get("article_lang");
} }
public String getDescription() {
return getExtensionsToRead().get("desc");
}
} }
public static class Author extends GPXExtensions { public static class Author extends GPXExtensions {
@ -502,65 +381,6 @@ public class GPXUtilities {
public double maxlon; 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 static class GPXTrackAnalysis {
public float totalDistance = 0; public float totalDistance = 0;
public float totalDistanceWithoutGaps = 0; public float totalDistanceWithoutGaps = 0;
@ -1081,6 +901,7 @@ public class GPXUtilities {
sp = new SplitSegment(segment, k - 1, cf); sp = new SplitSegment(segment, k - 1, cf);
currentMetricEnd += metricLimit; currentMetricEnd += metricLimit;
prev = sp.get(0);
} }
total += currentSegment; total += currentSegment;
} }
@ -1105,33 +926,6 @@ public class GPXUtilities {
return ls; return ls;
} }
public static QuadRect calculateBounds(List<WptPt> 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 QuadRect calculateTrackBounds(List<TrkSegment> segments) {
QuadRect trackBounds = new QuadRect(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY,
Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
for (TrkSegment segment : segments) {
updateBounds(trackBounds, segment.points, 0);
}
return trackBounds;
}
public static void updateBounds(QuadRect trackBounds, List<WptPt> 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 static class GPXFile extends GPXExtensions {
public String author; public String author;
public Metadata metadata; public Metadata metadata;
@ -1165,10 +959,6 @@ public class GPXUtilities {
} }
} }
public boolean hasRoute() {
return getNonEmptyTrkSegments(true).size() > 0;
}
public List<WptPt> getPoints() { public List<WptPt> getPoints() {
return Collections.unmodifiableList(points); return Collections.unmodifiableList(points);
} }
@ -1276,7 +1066,7 @@ public class GPXUtilities {
GPXTrackAnalysis g = new GPXTrackAnalysis(); GPXTrackAnalysis g = new GPXTrackAnalysis();
g.wptPoints = points.size(); g.wptPoints = points.size();
g.wptCategoryNames = getWaypointCategories(true); g.wptCategoryNames = getWaypointCategories(true);
List<SplitSegment> splitSegments = new ArrayList<>(); List<SplitSegment> splitSegments = new ArrayList<GPXUtilities.SplitSegment>();
for (int i = 0; i < tracks.size(); i++) { for (int i = 0; i < tracks.size(); i++) {
Track subtrack = tracks.get(i); Track subtrack = tracks.get(i);
for (TrkSegment segment : subtrack.segments) { for (TrkSegment segment : subtrack.segments) {
@ -1288,14 +1078,10 @@ public class GPXUtilities {
} }
} }
} }
g.prepareInformation(fileTimestamp, splitSegments.toArray(new SplitSegment[0])); g.prepareInformation(fileTimestamp, splitSegments.toArray(new SplitSegment[splitSegments.size()]));
return g; return g;
} }
public boolean containsRoutePoint(WptPt point) {
return getRoutePoints().contains(point);
}
public List<WptPt> getRoutePoints() { public List<WptPt> getRoutePoints() {
List<WptPt> points = new ArrayList<>(); List<WptPt> points = new ArrayList<>();
for (int i = 0; i < routes.size(); i++) { for (int i = 0; i < routes.size(); i++) {
@ -1305,15 +1091,6 @@ public class GPXUtilities {
return points; return points;
} }
public List<WptPt> getRoutePoints(int routeIndex) {
List<WptPt> points = new ArrayList<>();
if (routes.size() > routeIndex) {
Route rt = routes.get(routeIndex);
points.addAll(rt.points);
}
return points;
}
public boolean hasRtePt() { public boolean hasRtePt() {
for (Route r : routes) { for (Route r : routes) {
if (r.points.size() > 0) { if (r.points.size() > 0) {
@ -1339,11 +1116,6 @@ public class GPXUtilities {
} }
public WptPt addWptPt(double lat, double lon, long time, String description, String name, String category, int color) { public WptPt addWptPt(double lat, double lon, long time, String description, String name, String category, int color) {
return addWptPt(lat, lon, time, description, name, category, color, null, null);
}
public WptPt addWptPt(double lat, double lon, long time, String description, String name, String category,
int color, String iconName, String backgroundType) {
double latAdjusted = Double.parseDouble(latLonFormat.format(lat)); double latAdjusted = Double.parseDouble(latLonFormat.format(lat));
double lonAdjusted = Double.parseDouble(latLonFormat.format(lon)); double lonAdjusted = Double.parseDouble(latLonFormat.format(lon));
final WptPt pt = new WptPt(latAdjusted, lonAdjusted, time, Double.NaN, 0, Double.NaN); final WptPt pt = new WptPt(latAdjusted, lonAdjusted, time, Double.NaN, 0, Double.NaN);
@ -1353,12 +1125,6 @@ public class GPXUtilities {
if (color != 0) { if (color != 0) {
pt.setColor(color); pt.setColor(color);
} }
if (iconName != null) {
pt.setIconName(iconName);
}
if (backgroundType != null) {
pt.setBackgroundType(backgroundType);
}
points.add(pt); points.add(pt);
@ -1389,18 +1155,6 @@ public class GPXUtilities {
return pt; return pt;
} }
public List<TrkSegment> getNonEmptyTrkSegments(boolean routesOnly) {
List<TrkSegment> segments = new ArrayList<>();
for (Track t : tracks) {
for (TrkSegment s : t.segments) {
if (!s.generalSegment && s.points.size() > 0 && (!routesOnly || s.hasRoute())) {
segments.add(s);
}
}
}
return segments;
}
public void addTrkSegment(List<WptPt> points) { public void addTrkSegment(List<WptPt> points) {
removeGeneralTrackIfExists(); removeGeneralTrackIfExists();
@ -1437,8 +1191,8 @@ public class GPXUtilities {
return false; return false;
} }
public void addRoutePoints(List<WptPt> points, boolean addRoute) { public void addRoutePoints(List<WptPt> points) {
if (routes.size() == 0 || addRoute) { if (routes.size() == 0) {
Route route = new Route(); Route route = new Route();
routes.add(route); routes.add(route);
} }
@ -1456,13 +1210,7 @@ public class GPXUtilities {
modifiedTime = System.currentTimeMillis(); modifiedTime = System.currentTimeMillis();
} }
public void updateWptPt(WptPt pt, double lat, double lon, long time, String description, String name, String category, public void updateWptPt(WptPt pt, double lat, double lon, long time, String description, String name, String category, int color) {
int color) {
updateWptPt(pt, lat, lon, System.currentTimeMillis(), description, name, category, color, null, null);
}
public void updateWptPt(WptPt pt, double lat, double lon, long time, String description, String name, String category,
int color, String iconName, String backgroundType) {
int index = points.indexOf(pt); int index = points.indexOf(pt);
double latAdjusted = Double.parseDouble(latLonFormat.format(lat)); double latAdjusted = Double.parseDouble(latLonFormat.format(lat));
double lonAdjusted = Double.parseDouble(latLonFormat.format(lon)); double lonAdjusted = Double.parseDouble(latLonFormat.format(lon));
@ -1475,12 +1223,6 @@ public class GPXUtilities {
if (color != 0) { if (color != 0) {
pt.setColor(color); pt.setColor(color);
} }
if (iconName != null) {
pt.setIconName(iconName);
}
if (backgroundType != null) {
pt.setBackgroundType(backgroundType);
}
if (index != -1) { if (index != -1) {
points.set(index, pt); points.set(index, pt);
@ -1680,7 +1422,7 @@ public class GPXUtilities {
bottom = Math.min(bottom, p.getLatitude()); bottom = Math.min(bottom, p.getLatitude());
} }
} }
for (Route route : routes) { for (GPXUtilities.Route route : routes) {
for (WptPt p : route.points) { for (WptPt p : route.points) {
if (left == 0 && right == 0) { if (left == 0 && right == 0) {
left = p.getLongitude(); left = p.getLongitude();
@ -1697,102 +1439,11 @@ public class GPXUtilities {
} }
return new QuadRect(left, top, right, bottom); return new QuadRect(left, top, right, bottom);
} }
public int[] getGradientScaleColor(String gradientScaleType) {
String clrValue = null;
if (extensions != null) {
clrValue = extensions.get(gradientScaleType);
}
return Algorithms.stringToGradientPalette(clrValue);
}
public void setGradientScaleColor(String gradientScaleType, int[] gradientScalePalette) {
getExtensionsToWrite().put(gradientScaleType, Algorithms.gradientPaletteToString(gradientScalePalette));
}
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) { public static String asString(GPXFile file) {
final Writer writer = new StringWriter(); final Writer writer = new StringWriter();
writeGpx(writer, file); GPXUtilities.writeGpx(writer, file);
return writer.toString(); return writer.toString();
} }
@ -1835,7 +1486,6 @@ public class GPXUtilities {
serializer.attribute(null, "creator", file.author); //$NON-NLS-1$ serializer.attribute(null, "creator", file.author); //$NON-NLS-1$
} }
serializer.attribute(null, "xmlns", "http://www.topografix.com/GPX/1/1"); //$NON-NLS-1$ //$NON-NLS-2$ serializer.attribute(null, "xmlns", "http://www.topografix.com/GPX/1/1"); //$NON-NLS-1$ //$NON-NLS-2$
serializer.attribute(null, "xmlns:osmand", "https://osmand.net");
serializer.attribute(null, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); serializer.attribute(null, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
serializer.attribute(null, "xsi:schemaLocation", serializer.attribute(null, "xsi:schemaLocation",
"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"); "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd");
@ -1867,10 +1517,24 @@ public class GPXUtilities {
} }
serializer.endTag(null, "metadata"); serializer.endTag(null, "metadata");
for (WptPt l : file.points) {
serializer.startTag(null, "wpt"); //$NON-NLS-1$ for (Track track : file.tracks) {
writeWpt(format, serializer, l); if (!track.generalTrack) {
serializer.endTag(null, "wpt"); //$NON-NLS-1$ serializer.startTag(null, "trk"); //$NON-NLS-1$
writeNotNullText(serializer, "name", track.name);
writeNotNullText(serializer, "desc", track.desc);
for (TrkSegment segment : track.segments) {
serializer.startTag(null, "trkseg"); //$NON-NLS-1$
for (WptPt p : segment.points) {
serializer.startTag(null, "trkpt"); //$NON-NLS-1$
writeWpt(format, serializer, p);
serializer.endTag(null, "trkpt"); //$NON-NLS-1$
}
serializer.endTag(null, "trkseg"); //$NON-NLS-1$
}
writeExtensions(serializer, track);
serializer.endTag(null, "trk"); //$NON-NLS-1$
}
} }
for (Route track : file.routes) { for (Route track : file.routes) {
@ -1887,25 +1551,10 @@ public class GPXUtilities {
serializer.endTag(null, "rte"); //$NON-NLS-1$ serializer.endTag(null, "rte"); //$NON-NLS-1$
} }
for (Track track : file.tracks) { for (WptPt l : file.points) {
if (!track.generalTrack) { serializer.startTag(null, "wpt"); //$NON-NLS-1$
serializer.startTag(null, "trk"); //$NON-NLS-1$ writeWpt(format, serializer, l);
writeNotNullText(serializer, "name", track.name); serializer.endTag(null, "wpt"); //$NON-NLS-1$
writeNotNullText(serializer, "desc", track.desc);
for (TrkSegment segment : track.segments) {
serializer.startTag(null, "trkseg"); //$NON-NLS-1$
for (WptPt p : segment.points) {
serializer.startTag(null, "trkpt"); //$NON-NLS-1$
writeWpt(format, serializer, p);
serializer.endTag(null, "trkpt"); //$NON-NLS-1$
}
assignRouteExtensionWriter(segment);
writeExtensions(serializer, segment);
serializer.endTag(null, "trkseg"); //$NON-NLS-1$
}
writeExtensions(serializer, track);
serializer.endTag(null, "trk"); //$NON-NLS-1$
}
} }
writeExtensions(serializer, file); writeExtensions(serializer, file);
@ -1920,29 +1569,6 @@ public class GPXUtilities {
return null; return null;
} }
private static void assignRouteExtensionWriter(final TrkSegment segment) {
if (segment.hasRoute() && segment.getExtensionsWriter() == null) {
segment.setExtensionsWriter(new GPXExtensionsWriter() {
@Override
public void writeExtensions(XmlSerializer serializer) {
StringBundle bundle = new StringBundle();
List<StringBundle> segmentsBundle = new ArrayList<>();
for (RouteSegment segment : segment.routeSegments) {
segmentsBundle.add(segment.toStringBundle());
}
bundle.putBundleList("route", "segment", segmentsBundle);
List<StringBundle> typesBundle = new ArrayList<>();
for (RouteType routeType : segment.routeTypes) {
typesBundle.add(routeType.toStringBundle());
}
bundle.putBundleList("types", "type", typesBundle);
StringBundleWriter bundleWriter = new StringBundleXmlWriter(bundle, serializer);
bundleWriter.writeBundle();
}
});
}
}
private static String getFilename(String path) { private static String getFilename(String path) {
if(path != null) { if(path != null) {
int i = path.lastIndexOf('/'); int i = path.lastIndexOf('/');
@ -1974,20 +1600,10 @@ public class GPXUtilities {
} }
private static void writeExtensions(XmlSerializer serializer, GPXExtensions p) throws IOException { private static void writeExtensions(XmlSerializer serializer, GPXExtensions p) throws IOException {
writeExtensions(serializer, p.getExtensionsToRead(), p); if (!p.getExtensionsToRead().isEmpty()) {
}
private static void writeExtensions(XmlSerializer serializer, Map<String, String> extensions, GPXExtensions p) throws IOException {
GPXExtensionsWriter extensionsWriter = p.getExtensionsWriter();
if (!extensions.isEmpty() || extensionsWriter != null) {
serializer.startTag(null, "extensions"); serializer.startTag(null, "extensions");
if (!extensions.isEmpty()) { for (Entry<String, String> s : p.getExtensionsToRead().entrySet()) {
for (Entry<String, String> s : extensions.entrySet()) { writeNotNullText(serializer, s.getKey(), s.getValue());
writeNotNullText(serializer,"osmand:" + s.getKey(), s.getValue());
}
}
if (extensionsWriter != null) {
extensionsWriter.writeExtensions(serializer);
} }
serializer.endTag(null, "extensions"); serializer.endTag(null, "extensions");
} }
@ -2019,20 +1635,7 @@ public class GPXUtilities {
if (!Float.isNaN(p.heading)) { if (!Float.isNaN(p.heading)) {
p.getExtensionsToWrite().put("heading", String.valueOf(Math.round(p.heading))); p.getExtensionsToWrite().put("heading", String.valueOf(Math.round(p.heading)));
} }
Map<String, String> extensions = p.getExtensionsToRead(); writeExtensions(serializer, p);
if (!"rtept".equals(serializer.getName())) {
// Leave "profile" and "trkpt" tags for rtept only
extensions.remove(PROFILE_TYPE_EXTENSION);
extensions.remove(TRKPT_INDEX_EXTENSION);
writeExtensions(serializer, extensions, p);
} else {
// Remove "gap" profile
String profile = extensions.get(PROFILE_TYPE_EXTENSION);
if (GAP_PROFILE_TYPE.equals(profile)) {
extensions.remove(PROFILE_TYPE_EXTENSION);
}
writeExtensions(serializer, p);
}
} }
private static void writeAuthor(XmlSerializer serializer, Author author) throws IOException { private static void writeAuthor(XmlSerializer serializer, Author author) throws IOException {
@ -2176,7 +1779,7 @@ public class GPXUtilities {
} }
public static GPXFile loadGPXFile(InputStream f) { public static GPXFile loadGPXFile(InputStream f) {
GPXFile gpxFile = new GPXFile(null); GPXFile res = new GPXFile(null);
SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US); SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC")); format.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat formatMillis = new SimpleDateFormat(GPX_TIME_FORMAT_MILLIS, Locale.US); SimpleDateFormat formatMillis = new SimpleDateFormat(GPX_TIME_FORMAT_MILLIS, Locale.US);
@ -2188,33 +1791,16 @@ public class GPXUtilities {
TrkSegment routeTrackSegment = new TrkSegment(); TrkSegment routeTrackSegment = new TrkSegment();
routeTrack.segments.add(routeTrackSegment); routeTrack.segments.add(routeTrackSegment);
Stack<GPXExtensions> parserState = new Stack<>(); Stack<GPXExtensions> parserState = new Stack<>();
TrkSegment firstSegment = null;
boolean extensionReadMode = false; boolean extensionReadMode = false;
boolean routePointExtension = false; boolean routePointExtension = false;
List<RouteSegment> routeSegments = new ArrayList<>(); parserState.push(res);
List<RouteType> routeTypes = new ArrayList<>();
boolean routeExtension = false;
boolean typesExtension = false;
parserState.push(gpxFile);
int tok; int tok;
while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (tok == XmlPullParser.START_TAG) { if (tok == XmlPullParser.START_TAG) {
GPXExtensions parse = parserState.peek(); GPXExtensions parse = parserState.peek();
String tag = parser.getName(); String tag = parser.getName();
if (extensionReadMode && parse != null && !routePointExtension) { if (extensionReadMode && parse != null && !routePointExtension) {
String tagName = tag.toLowerCase(); switch (tag.toLowerCase()) {
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);
}
}
switch (tagName) {
case "routepointextension": case "routepointextension":
routePointExtension = true; routePointExtension = true;
if (parse instanceof WptPt) { if (parse instanceof WptPt) {
@ -2222,14 +1808,6 @@ public class GPXUtilities {
} }
break; break;
case "route":
routeExtension = true;
break;
case "types":
typesExtension = true;
break;
default: default:
Map<String, String> values = readTextMap(parser, tag); Map<String, String> values = readTextMap(parser, tag);
if (values.size() > 0) { if (values.size() > 0) {
@ -2352,21 +1930,14 @@ public class GPXUtilities {
} else if (parse instanceof Track) { } else if (parse instanceof Track) {
if (tag.equals("name")) { if (tag.equals("name")) {
((Track) parse).name = readText(parser, "name"); ((Track) parse).name = readText(parser, "name");
} else if (tag.equals("desc")) { }
if (tag.equals("desc")) {
((Track) parse).desc = readText(parser, "desc"); ((Track) parse).desc = readText(parser, "desc");
} else if (tag.equals("trkseg")) { }
if (tag.equals("trkseg")) {
TrkSegment trkSeg = new TrkSegment(); TrkSegment trkSeg = new TrkSegment();
((Track) parse).segments.add(trkSeg); ((Track) parse).segments.add(trkSeg);
parserState.push(trkSeg); parserState.push(trkSeg);
} else if (tag.equals("trkpt") || tag.equals("rpt")) {
WptPt wptPt = parseWptAttributes(parser);
int size = ((Track) parse).segments.size();
if (size == 0) {
((Track) parse).segments.add(new TrkSegment());
size++;
}
((Track) parse).segments.get(size - 1).points.add(wptPt);
parserState.push(wptPt);
} }
} else if (parse instanceof TrkSegment) { } else if (parse instanceof TrkSegment) {
if (tag.equals("trkpt") || tag.equals("rpt")) { if (tag.equals("trkpt") || tag.equals("rpt")) {
@ -2405,10 +1976,8 @@ public class GPXUtilities {
} else if (tag.equals("speed")) { } else if (tag.equals("speed")) {
try { try {
String value = readText(parser, "speed"); String value = readText(parser, "speed");
if (!Algorithms.isEmpty(value)) { ((WptPt) parse).speed = Float.parseFloat(value);
((WptPt) parse).speed = Float.parseFloat(value); parse.getExtensionsToWrite().put("speed", value);
parse.getExtensionsToWrite().put("speed", value);
}
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
} }
} else if (tag.equals("link")) { } else if (tag.equals("link")) {
@ -2452,14 +2021,6 @@ public class GPXUtilities {
if (parse != null && tag.equals("extensions")) { if (parse != null && tag.equals("extensions")) {
extensionReadMode = false; extensionReadMode = false;
} }
if (extensionReadMode && tag.equals("route")) {
routeExtension = false;
continue;
}
if (extensionReadMode && tag.equals("types")) {
typesExtension = false;
continue;
}
if (tag.equals("metadata")) { if (tag.equals("metadata")) {
Object pop = parserState.pop(); Object pop = parserState.pop();
@ -2493,16 +2054,6 @@ public class GPXUtilities {
assert pop instanceof Route; assert pop instanceof Route;
} else if (tag.equals("trkseg")) { } else if (tag.equals("trkseg")) {
Object pop = parserState.pop(); Object pop = parserState.pop();
if (pop instanceof TrkSegment) {
TrkSegment segment = (TrkSegment) pop;
segment.routeSegments = routeSegments;
segment.routeTypes = routeTypes;
routeSegments = new ArrayList<>();
routeTypes = new ArrayList<>();
if (firstSegment == null) {
firstSegment = segment;
}
}
assert pop instanceof TrkSegment; assert pop instanceof TrkSegment;
} else if (tag.equals("rpt")) { } else if (tag.equals("rpt")) {
Object pop = parserState.pop(); Object pop = parserState.pop();
@ -2511,18 +2062,13 @@ public class GPXUtilities {
} }
} }
if (!routeTrackSegment.points.isEmpty()) { if (!routeTrackSegment.points.isEmpty()) {
gpxFile.tracks.add(routeTrack); res.tracks.add(routeTrack);
} }
if (!routeSegments.isEmpty() && !routeTypes.isEmpty() && firstSegment != null) {
firstSegment.routeSegments = routeSegments;
firstSegment.routeTypes = routeTypes;
}
gpxFile.addGeneralTrack();
} catch (Exception e) { } catch (Exception e) {
gpxFile.error = e; res.error = e;
log.error("Error reading gpx", e); //$NON-NLS-1$ log.error("Error reading gpx", e); //$NON-NLS-1$
} }
return gpxFile; return res;
} }
private static Reader getUTF8Reader(InputStream f) throws IOException { private static Reader getUTF8Reader(InputStream f) throws IOException {
@ -2552,27 +2098,6 @@ public class GPXUtilities {
return wpt; 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) { private static Bounds parseBoundsAttributes(XmlPullParser parser) {
Bounds bounds = new Bounds(); Bounds bounds = new Bounds();
try { try {
@ -2590,7 +2115,7 @@ public class GPXUtilities {
if (maxlat == null) { if (maxlat == null) {
maxlat = parser.getAttributeValue("", "maxLat"); maxlat = parser.getAttributeValue("", "maxLat");
} }
if (maxlon == null) { if (maxlat == null) {
maxlon = parser.getAttributeValue("", "maxLon"); maxlon = parser.getAttributeValue("", "maxLon");
} }
@ -2611,7 +2136,7 @@ public class GPXUtilities {
} }
return bounds; return bounds;
} }
public static void mergeGPXFileInto(GPXFile to, GPXFile from) { public static void mergeGPXFileInto(GPXFile to, GPXFile from) {
if (from == null) { if (from == null) {
return; return;
@ -2632,4 +2157,4 @@ public class GPXUtilities {
to.error = from.error; to.error = from.error;
} }
} }
} }

View file

@ -45,7 +45,7 @@ public interface IProgress {
public boolean isInterrupted() {return false;} public boolean isInterrupted() {return false;}
@Override @Override
public boolean isIndeterminate() {return true;} public boolean isIndeterminate() {return false;}
@Override @Override
public void finishTask() {} public void finishTask() {}

View file

@ -14,25 +14,23 @@ public class IndexConstants {
public static final String TEMP_SOURCE_TO_LOAD = "temp"; public static final String TEMP_SOURCE_TO_LOAD = "temp";
public static final String POI_INDEX_EXT = ".poi.odb"; //$NON-NLS-1$ public static final String POI_INDEX_EXT = ".poi.odb"; //$NON-NLS-1$
public static final String ZIP_EXT = ".zip"; //$NON-NLS-1$
public static final String BINARY_MAP_INDEX_EXT = ".obf"; //$NON-NLS-1$ public static final String BINARY_MAP_INDEX_EXT = ".obf"; //$NON-NLS-1$
public static final String BINARY_MAP_INDEX_EXT_ZIP = ".obf.zip"; //$NON-NLS-1$ public static final String BINARY_MAP_INDEX_EXT_ZIP = ".obf.zip"; //$NON-NLS-1$
public static final String BINARY_WIKIVOYAGE_MAP_INDEX_EXT = ".sqlite"; //$NON-NLS-1$ public static final String BINARY_WIKIVOYAGE_MAP_INDEX_EXT = ".sqlite"; //$NON-NLS-1$
public static final String BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT = ".travel.obf"; //$NON-NLS-1$
public static final String BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT_ZIP = ".travel.obf.zip"; //$NON-NLS-1$
public static final String BINARY_WIKI_MAP_INDEX_EXT = ".wiki.obf"; //$NON-NLS-1$ public static final String BINARY_WIKI_MAP_INDEX_EXT = ".wiki.obf"; //$NON-NLS-1$
public static final String BINARY_WIKI_MAP_INDEX_EXT_ZIP = ".wiki.obf.zip"; //$NON-NLS-1$ public static final String BINARY_WIKI_MAP_INDEX_EXT_ZIP = ".wiki.obf.zip"; //$NON-NLS-1$
public static final String BINARY_ROAD_MAP_INDEX_EXT = ".road.obf"; //$NON-NLS-1$ public static final String BINARY_ROAD_MAP_INDEX_EXT = ".road.obf"; //$NON-NLS-1$
public static final String BINARY_ROAD_MAP_INDEX_EXT_ZIP = ".road.obf.zip"; //$NON-NLS-1$ public static final String BINARY_ROAD_MAP_INDEX_EXT_ZIP = ".road.obf.zip"; //$NON-NLS-1$
public static final String BINARY_SRTM_MAP_INDEX_EXT = ".srtm.obf"; //$NON-NLS-1$ public static final String BINARY_SRTM_MAP_INDEX_EXT = ".srtm.obf"; //$NON-NLS-1$
public static final String BINARY_SRTM_FEET_MAP_INDEX_EXT = ".srtmf.obf"; //$NON-NLS-1$
public static final String BINARY_SRTM_MAP_INDEX_EXT_ZIP = ".srtm.obf.zip"; //$NON-NLS-1$ public static final String BINARY_SRTM_MAP_INDEX_EXT_ZIP = ".srtm.obf.zip"; //$NON-NLS-1$
public static final String BINARY_SRTM_FEET_MAP_INDEX_EXT_ZIP = ".srtmf.obf.zip"; //$NON-NLS-1$
public static final String EXTRA_EXT = ".extra"; public static final String EXTRA_EXT = ".extra";
public static final String EXTRA_ZIP_EXT = ".extra.zip"; 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 GEN_LOG_EXT = ".gen.log"; //$NON-NLS-1$
public static final String VOICE_INDEX_EXT_ZIP = ".voice.zip"; //$NON-NLS-1$ public static final String VOICE_INDEX_EXT_ZIP = ".voice.zip"; //$NON-NLS-1$
@ -47,12 +45,7 @@ public class IndexConstants {
public static final String ROUTING_FILE_EXT = ".xml"; public static final String ROUTING_FILE_EXT = ".xml";
public static final String RENDERER_INDEX_EXT = ".render.xml"; //$NON-NLS-1$ public static final String RENDERER_INDEX_EXT = ".render.xml"; //$NON-NLS-1$
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 final static String POI_TABLE = "poi"; //$NON-NLS-1$
public static final String INDEX_DOWNLOAD_DOMAIN = "download.osmand.net"; public static final String INDEX_DOWNLOAD_DOMAIN = "download.osmand.net";
@ -76,11 +69,8 @@ public class IndexConstants {
public static final String FONT_INDEX_DIR = "fonts/"; //$NON-NLS-1$ public static final String FONT_INDEX_DIR = "fonts/"; //$NON-NLS-1$
public static final String VOICE_INDEX_DIR = "voice/"; //$NON-NLS-1$ public static final String VOICE_INDEX_DIR = "voice/"; //$NON-NLS-1$
public static final String RENDERERS_DIR = "rendering/"; //$NON-NLS-1$ public static final String RENDERERS_DIR = "rendering/"; //$NON-NLS-1$
public static final String ROUTING_XML_FILE = "routing.xml"; public static final String ROUTING_XML_FILE= "routing.xml";
public static final String SETTINGS_DIR = "settings/"; //$NON-NLS-1$ public static final String SETTINGS_DIR = "settings/"; //$NON-NLS-1$
public static final String TEMP_DIR = "temp/"; public static final String TEMP_DIR = "temp/";
public static final String ROUTING_PROFILES_DIR = "routing/"; public static final String ROUTING_PROFILES_DIR = "routing/";
public static final String PLUGINS_DIR = "plugins/";
public static final String VOICE_PROVIDER_SUFFIX = "-tts";
} }

View file

@ -15,7 +15,6 @@ public class LocationConvert {
public static final int FORMAT_SECONDS = 2; public static final int FORMAT_SECONDS = 2;
public static final int UTM_FORMAT = 3; public static final int UTM_FORMAT = 3;
public static final int OLC_FORMAT = 4; public static final int OLC_FORMAT = 4;
public static final int MGRS_FORMAT = 5;
private static final char DELIM = ':'; private static final char DELIM = ':';
private static final char DELIMITER_DEGREES = '°'; private static final char DELIMITER_DEGREES = '°';
private static final char DELIMITER_MINUTES = ''; private static final char DELIMITER_MINUTES = '';

View file

@ -1,159 +0,0 @@
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<LatLon> latLonList;
private List<Location> locationList;
private List<WptPt> 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<LatLon>) locations);
size = locations.size();
break;
case LOCATION_TYPE_LOCATION:
locationList = new ArrayList<>((List<Location>) locations);
size = locations.size();
break;
case LOCATION_TYPE_WPTPT:
wptPtList = new ArrayList<>((List<WptPt>) 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 <T> List<T> getList(int locationType) {
List<T> 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<LatLon> getLatLonList() {
if (this.locationType == LOCATION_TYPE_LATLON) {
return latLonList;
} else {
return getList(LOCATION_TYPE_LATLON);
}
}
public List<WptPt> getWptPtList() {
if (this.locationType == LOCATION_TYPE_WPTPT) {
return wptPtList;
} else {
return getList(LOCATION_TYPE_WPTPT);
}
}
public List<Location> 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));
}
}
}

View file

@ -25,11 +25,10 @@ import net.osmand.data.MapObject;
import net.osmand.data.QuadRect; import net.osmand.data.QuadRect;
import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRuleSearchRequest;
import net.osmand.render.RenderingRulesStorage; import net.osmand.render.RenderingRulesStorage;
import net.osmand.router.NativeTransportRoutingResult; import net.osmand.router.PrecalculatedRouteDirection;
import net.osmand.router.RouteCalculationProgress; import net.osmand.router.RouteCalculationProgress;
import net.osmand.router.RouteSegmentResult; import net.osmand.router.RouteSegmentResult;
import net.osmand.router.RoutingContext; import net.osmand.router.RoutingConfiguration;
import net.osmand.router.TransportRoutingConfiguration;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -129,15 +128,12 @@ public class NativeLibrary {
return closeBinaryMapFile(filePath); return closeBinaryMapFile(filePath);
} }
public NativeTransportRoutingResult[] runNativePTRouting(int sx31, int sy31, int ex31, int ey31, public RouteSegmentResult[] runNativeRouting(int sx31, int sy31, int ex31, int ey31, RoutingConfiguration config,
TransportRoutingConfiguration cfg, RouteCalculationProgress progress) { RouteRegion[] regions, RouteCalculationProgress progress, PrecalculatedRouteDirection precalculatedRouteDirection,
return nativeTransportRouting(new int[] { sx31, sy31, ex31, ey31 }, cfg, progress); boolean basemap, boolean publicTransport, boolean startTransportStop, boolean targetTransportStop) {
}
public RouteSegmentResult[] runNativeRouting(RoutingContext c, RouteRegion[] regions, boolean basemap) {
// config.router.printRules(System.out); // config.router.printRules(System.out);
return nativeRouting(c, c.config.initialDirection == null ? -360 : c.config.initialDirection.floatValue(), return nativeRouting(new int[] { sx31, sy31, ex31, ey31 }, config, config.initialDirection == null ? -360 : config.initialDirection.floatValue(),
regions, basemap); regions, progress, precalculatedRouteDirection, basemap, publicTransport, startTransportStop, targetTransportStop);
} }
@ -153,18 +149,16 @@ public class NativeLibrary {
protected static native NativeRouteSearchResult loadRoutingData(RouteRegion reg, String regName, int regfp, RouteSubregion subreg, protected static native NativeRouteSearchResult loadRoutingData(RouteRegion reg, String regName, int regfp, RouteSubregion subreg,
boolean loadObjects); boolean loadObjects);
public static native void deleteNativeRoutingContext(long handle);
protected static native void deleteRenderingContextHandle(long handle); protected static native void deleteRenderingContextHandle(long handle);
protected static native void deleteRouteSearchResult(long searchResultHandle); protected static native void deleteRouteSearchResult(long searchResultHandle);
protected static native RouteDataObject[] getRouteDataObjects(RouteRegion reg, long rs, int x31, int y31); protected static native RouteDataObject[] getRouteDataObjects(RouteRegion reg, long rs, int x31, int y31);
protected static native RouteSegmentResult[] nativeRouting(RoutingContext c, float initDirection, RouteRegion[] regions, boolean basemap); protected static native RouteSegmentResult[] nativeRouting(int[] coordinates, RoutingConfiguration r,
float initDirection, RouteRegion[] regions, RouteCalculationProgress progress,
protected static native NativeTransportRoutingResult[] nativeTransportRouting(int[] coordinates, TransportRoutingConfiguration cfg, PrecalculatedRouteDirection precalculatedRouteDirection, boolean basemap,
RouteCalculationProgress progress); boolean publicTransport, boolean startTransportStop, boolean targetTransportStop);
protected static native void deleteSearchResult(long searchResultHandle); protected static native void deleteSearchResult(long searchResultHandle);
@ -350,7 +344,6 @@ public class NativeLibrary {
FileInputStream fis = new FileInputStream(f); FileInputStream fis = new FileInputStream(f);
Algorithms.streamCopy(fis, ous); Algorithms.streamCopy(fis, ous);
fis.close(); fis.close();
System.out.println("FONT " + name);
initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"), initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"),
name.toLowerCase().contains("italic")); name.toLowerCase().contains("italic"));
} catch (IOException e) { } catch (IOException e) {

View file

@ -38,5 +38,4 @@ public class OsmAndCollator {
} }
}; };
} }
} }

View file

@ -1,23 +1,20 @@
package net.osmand; package net.osmand;
import java.text.ParseException; import java.text.ParseException;
import java.util.Calendar;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class Period { public class Period {
public enum PeriodUnit { public enum PeriodUnit {
YEAR("Y", Calendar.YEAR), YEAR("Y"),
MONTH("M", Calendar.MONTH), MONTH("M"),
WEEK("W", Calendar.WEEK_OF_YEAR), WEEK("W"),
DAY("D", Calendar.DATE); DAY("D");
private String unitStr; private String unitStr;
private int calendarIdx;
PeriodUnit(String unitStr, int calendarIdx) { PeriodUnit(String unitStr) {
this.calendarIdx = calendarIdx;
this.unitStr = unitStr; this.unitStr = unitStr;
} }
@ -25,10 +22,6 @@ public class Period {
return unitStr; return unitStr;
} }
public int getCalendarIdx() {
return calendarIdx;
}
public double getMonthsValue() { public double getMonthsValue() {
switch (this) { switch (this) {
case YEAR: case YEAR:

View file

@ -23,9 +23,7 @@ public class PlatformUtil {
} }
public static XmlPullParser newXMLPullParser() throws XmlPullParserException{ public static XmlPullParser newXMLPullParser() throws XmlPullParserException{
org.kxml2.io.KXmlParser xmlParser = new org.kxml2.io.KXmlParser(); return new org.kxml2.io.KXmlParser();
xmlParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
return xmlParser;
} }
public static XmlSerializer newSerializer() { public static XmlSerializer newSerializer() {

View file

@ -1,7 +1,6 @@
package net.osmand; package net.osmand;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -20,67 +19,61 @@ public class Reshaper {
return ""; return "";
} }
} }
public static String reshape(String s) { public static String reshape(String s) {
// if(true) {
// return s;
// }
try { try {
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK);
ArabicShaping.LENGTH_GROW_SHRINK);
//printSplit("B", s);
try { try {
s = as.shape(s); s = as.shape(s);
} catch (ArabicShapingException e) { } catch (ArabicShapingException e) {
LOG.error(e.getMessage(), e); LOG.error(e.getMessage(), e);
} }
//printSplit("A", s);
Bidi line = new Bidi(s.length(), s.length()); 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(); byte direction = line.getDirection();
if (direction != Bidi.MIXED) { if (direction != Bidi.MIXED) {
// unidirectional // unidirectional
if (line.isLeftToRight()) { if(line.isLeftToRight()) {
return s; return s;
} else { } else {
char[] chs = new char[s.length()]; char[] chs = new char[s.length()];
for(int i = 0; i< chs.length ; i++) { 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); return new String(chs);
} }
} else { } else {
// mixed-directional // // mixed-directional
// System.out.println(s);
// printSplit("Split", s);
int count = line.countRuns(); 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(); StringBuilder res = new StringBuilder();
// iterate over both directional and style runs // iterate over both directional and style runs
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
StringBuilder runs = new StringBuilder();
BidiRun run = line.getVisualRun(i); BidiRun run = line.getVisualRun(i);
boolean ltr = run.getDirection() == Bidi.LTR;
int start = run.getStart(); int st = run.getStart();
int limit = run.getLimit(); int e = run.getLimit();
int begin = ltr ? start : limit - 1; int j = run.getDirection() == Bidi.LTR ? st : e - 1;
int end = ltr ? limit : start - 1; int l = run.getDirection() == Bidi.LTR ? e : st - 1;
int ind = begin; boolean plus = run.getDirection() == Bidi.LTR;
while (ind != end) { while (j != l) {
char ch = s.charAt(ind); res.append(s.charAt(j));
if (!ltr) { if (plus) {
ch = mirror(ch); j++;
}
res.append(ch);
runs.append(ch);
if (ltr) {
ind++;
} else { } else {
ind--; j--;
} }
} }
printSplit(run.getDirection() + " " + run.getEmbeddingLevel(), runs.toString());
} }
return res.toString(); return res.toString();
} }
@ -90,77 +83,24 @@ public class Reshaper {
} }
} }
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) { 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));
}
test2(); 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();
} }
public static void test2() { private static void test2() {
String s = "گچ پژ نمکی باللغة العربي"; String s = "گچ پژ نمکی باللغة العربي";
String reshape = reshape(s); String reshape = reshape(s);
String expected1 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ";
String expected2 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ یکﻤﻧ ژپ چگ"; if (!reshape.equals("ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ")) {
check(s, reshape, expected1); throw new IllegalArgumentException("BUG!!!");
} }
public static void test4() {
String s = "Abc (123)";
check(s, reshape(s), s);
} }
} }

View file

@ -106,11 +106,9 @@ public class TspAnt {
// Allocates all memory. // Allocates all memory.
// Adds 1 to edge lengths to ensure no zero length edges. // Adds 1 to edge lengths to ensure no zero length edges.
public TspAnt readGraph(List<LatLon> intermediates, LatLon start, LatLon end) { public TspAnt readGraph(List<LatLon> intermediates, LatLon start, LatLon end) {
boolean keepEndPoint = end != null; boolean keepEndPoint = end != null;
List<LatLon> l = new ArrayList<LatLon>(); List<LatLon> l = new ArrayList<LatLon>();
if (start != null) { l.add(start);
l.add(start);
}
l.addAll(intermediates); l.addAll(intermediates);
if (keepEndPoint) { if (keepEndPoint) {
l.add(end); l.add(end);

View file

@ -68,7 +68,7 @@ public class TspHeldKarp {
} }
break; break;
} }
System.err.print("."); System.err.printf(".");
PriorityQueue<Node> children = new PriorityQueue<Node>(11, new NodeComparator()); PriorityQueue<Node> children = new PriorityQueue<Node>(11, new NodeComparator());
children.add(exclude(currentNode, i, currentNode.parent[i])); children.add(exclude(currentNode, i, currentNode.parent[i]));
for (int j = 0; j < n; j++) { for (int j = 0; j < n; j++) {

View file

@ -8,7 +8,6 @@ import gnu.trove.set.hash.TIntHashSet;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -222,7 +221,7 @@ public class BinaryMapAddressReaderAdapter {
int fp = codedIS.getTotalBytesRead(); int fp = codedIS.getTotalBytesRead();
int length = codedIS.readRawVarint32(); int length = codedIS.readRawVarint32();
int oldLimit = codedIS.pushLimit(length); int oldLimit = codedIS.pushLimit(length);
City c = readCityHeader(resultMatcher, new DefaultCityMatcher(matcher), fp, additionalTagsTable); City c = readCityHeader(new DefaultCityMatcher(matcher), fp, additionalTagsTable);
if (c != null) { if (c != null) {
if (resultMatcher == null || resultMatcher.publish(c)) { if (resultMatcher == null || resultMatcher.publish(c)) {
cities.add(c); cities.add(c);
@ -257,7 +256,6 @@ public class BinaryMapAddressReaderAdapter {
int oldLimit = codedIS.pushLimit(length); int oldLimit = codedIS.pushLimit(length);
readStreet(s, null, false, x >> 7, y >> 7, city.isPostcode() ? city.getName() : null, readStreet(s, null, false, x >> 7, y >> 7, city.isPostcode() ? city.getName() : null,
attributeTagsTable); attributeTagsTable);
publishRawData(resultMatcher, s);
if (resultMatcher == null || resultMatcher.publish(s)) { if (resultMatcher == null || resultMatcher.publish(s)) {
city.registerStreet(s); city.registerStreet(s);
} }
@ -305,7 +303,7 @@ public class BinaryMapAddressReaderAdapter {
} }
} }
protected City readCityHeader(SearchRequest<? super City> resultMatcher, CityMatcher matcher, int filePointer, List<String> additionalTagsTable) throws IOException { protected City readCityHeader(CityMatcher matcher, int filePointer, List<String> additionalTagsTable) throws IOException {
int x = 0; int x = 0;
int y = 0; int y = 0;
City c = null; City c = null;
@ -315,7 +313,6 @@ public class BinaryMapAddressReaderAdapter {
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);
switch (tag) { switch (tag) {
case 0: case 0:
publishRawData(resultMatcher, c);
return (matcher == null || matcher.matches(c)) ? c : null; return (matcher == null || matcher.matches(c)) ? c : null;
case OsmandOdb.CityIndex.CITY_TYPE_FIELD_NUMBER: case OsmandOdb.CityIndex.CITY_TYPE_FIELD_NUMBER:
int type = codedIS.readUInt32(); int type = codedIS.readUInt32();
@ -448,7 +445,6 @@ public class BinaryMapAddressReaderAdapter {
if (loadBuildingsAndIntersected) { if (loadBuildingsAndIntersected) {
int oldLimit = codedIS.pushLimit(length); int oldLimit = codedIS.pushLimit(length);
Building b = readBuilding(offset, x, y, additionalTagsTable); Building b = readBuilding(offset, x, y, additionalTagsTable);
publishRawData(buildingsMatcher, b);
if (postcodeFilter == null || postcodeFilter.equalsIgnoreCase(b.getPostcode())) { if (postcodeFilter == null || postcodeFilter.equalsIgnoreCase(b.getPostcode())) {
if (buildingsMatcher == null || buildingsMatcher.publish(b)) { if (buildingsMatcher == null || buildingsMatcher.publish(b)) {
s.addBuilding(b); s.addBuilding(b);
@ -628,9 +624,7 @@ public class BinaryMapAddressReaderAdapter {
indexOffset = codedIS.getTotalBytesRead(); indexOffset = codedIS.getTotalBytesRead();
int oldLimit = codedIS.pushLimit(length); int oldLimit = codedIS.pushLimit(length);
// here offsets are sorted by distance // here offsets are sorted by distance
TIntArrayList charsList = new TIntArrayList(); map.readIndexedStringTable(stringMatcher.getCollator(), req.nameQuery, "", loffsets, 0);
charsList.add(0);
map.readIndexedStringTable(stringMatcher.getCollator(), Collections.singletonList(req.nameQuery), "", Collections.singletonList(loffsets), charsList);
codedIS.popLimit(oldLimit); codedIS.popLimit(oldLimit);
break; break;
case OsmAndAddressNameIndexData.ATOM_FIELD_NUMBER: case OsmAndAddressNameIndexData.ATOM_FIELD_NUMBER:
@ -694,7 +688,7 @@ public class BinaryMapAddressReaderAdapter {
codedIS.seek(contOffset); codedIS.seek(contOffset);
int len = codedIS.readRawVarint32(); int len = codedIS.readRawVarint32();
int old = codedIS.pushLimit(len); int old = codedIS.pushLimit(len);
obj = readCityHeader(req, null, contOffset, reg.attributeTagsTable); obj = readCityHeader(null, contOffset, reg.attributeTagsTable);
codedIS.popLimit(old); codedIS.popLimit(old);
} }
if (obj != null) { if (obj != null) {
@ -707,7 +701,6 @@ public class BinaryMapAddressReaderAdapter {
readStreet(s, null, false, MapUtils.get31TileNumberX(l.getLongitude()) >> 7, readStreet(s, null, false, MapUtils.get31TileNumberX(l.getLongitude()) >> 7,
MapUtils.get31TileNumberY(l.getLatitude()) >> 7, obj.isPostcode() ? obj.getName() : null, MapUtils.get31TileNumberY(l.getLatitude()) >> 7, obj.isPostcode() ? obj.getName() : null,
reg.attributeTagsTable); reg.attributeTagsTable);
publishRawData(req, s);
boolean matches = stringMatcher.matches(s.getName()); boolean matches = stringMatcher.matches(s.getName());
if (!matches) { if (!matches) {
for (String n : s.getAllNames()) { for (String n : s.getAllNames()) {
@ -734,8 +727,7 @@ public class BinaryMapAddressReaderAdapter {
codedIS.seek(offset); codedIS.seek(offset);
int len = codedIS.readRawVarint32(); int len = codedIS.readRawVarint32();
int old = codedIS.pushLimit(len); int old = codedIS.pushLimit(len);
City obj = readCityHeader(req, cityPostcodeMatcher, list.get(j), reg.attributeTagsTable); City obj = readCityHeader(cityPostcodeMatcher, list.get(j), reg.attributeTagsTable);
publishRawData(req, obj);
if (obj != null && !published.contains(offset)) { if (obj != null && !published.contains(offset)) {
req.publish(obj); req.publish(obj);
published.add(offset); published.add(offset);
@ -813,9 +805,4 @@ public class BinaryMapAddressReaderAdapter {
} }
} }
private <T> void publishRawData(SearchRequest<T> resultMatcher, T obj) {
if (resultMatcher != null && obj != null) {
resultMatcher.collectRawData(obj);
}
}
} }

View file

@ -109,7 +109,7 @@ public class BinaryMapDataObject {
} }
public boolean containsAdditionalType(int cachedType) { public boolean containsAdditionalType(int cachedType) {
if (cachedType != -1 && additionalTypes != null) { if (cachedType != -1) {
for (int i = 0; i < additionalTypes.length; i++) { for (int i = 0; i < additionalTypes.length; i++) {
if (additionalTypes[i] == cachedType) { if (additionalTypes[i] == cachedType) {
return true; return true;

View file

@ -3,7 +3,6 @@ package net.osmand.binary;
import com.google.protobuf.CodedInputStream; import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream; import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.WireFormat; import com.google.protobuf.WireFormat;
import net.osmand.Collator; import net.osmand.Collator;
@ -27,7 +26,6 @@ import net.osmand.binary.OsmandOdb.OsmAndMapIndex.MapRootLevel;
import net.osmand.data.Amenity; import net.osmand.data.Amenity;
import net.osmand.data.Building; import net.osmand.data.Building;
import net.osmand.data.City; import net.osmand.data.City;
import net.osmand.data.IncompleteTransportRoute;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.MapObject; import net.osmand.data.MapObject;
import net.osmand.data.Street; import net.osmand.data.Street;
@ -83,7 +81,7 @@ public class BinaryMapIndexReader {
public final static int TRANSPORT_STOP_ZOOM = 24; public final static int TRANSPORT_STOP_ZOOM = 24;
public static final int SHIFT_COORDINATES = 5; public static final int SHIFT_COORDINATES = 5;
public static final int LABEL_ZOOM_ENCODE = 31 - SHIFT_COORDINATES; public static final int LABEL_ZOOM_ENCODE = 26;
private final static Log log = PlatformUtil.getLog(BinaryMapIndexReader.class); private final static Log log = PlatformUtil.getLog(BinaryMapIndexReader.class);
public static boolean READ_STATS = false; public static boolean READ_STATS = false;
public static final SearchPoiTypeFilter ACCEPT_ALL_POI_TYPE_FILTER = new SearchPoiTypeFilter() { public static final SearchPoiTypeFilter ACCEPT_ALL_POI_TYPE_FILTER = new SearchPoiTypeFilter() {
@ -111,8 +109,7 @@ public class BinaryMapIndexReader {
/*private*/ List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>(); /*private*/ List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>();
/*private*/ List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>(); /*private*/ List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>();
/*private*/ List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>(); /*private*/ List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>();
TLongObjectHashMap<IncompleteTransportRoute> incompleteTransportRoutes = null;
protected CodedInputStream codedIS; protected CodedInputStream codedIS;
private final BinaryMapTransportReaderAdapter transportAdapter; private final BinaryMapTransportReaderAdapter transportAdapter;
@ -431,10 +428,7 @@ public class BinaryMapIndexReader {
if (ls.endsWith("_2")) { if (ls.endsWith("_2")) {
ls = ls.substring(0, ls.length() - "_2".length()); ls = ls.substring(0, ls.length() - "_2".length());
} }
if (ls.lastIndexOf('_') != -1) { return ls.substring(0, ls.lastIndexOf('_')).replace('_', ' ');
ls = ls.substring(0, ls.lastIndexOf('_')).replace('_', ' ');
}
return ls;
} }
} }
@ -496,7 +490,7 @@ public class BinaryMapIndexReader {
} }
} }
Iterator<Entry<TransportIndex, TIntArrayList>> it = groupPoints.entrySet().iterator(); Iterator<Entry<TransportIndex, TIntArrayList>> it = groupPoints.entrySet().iterator();
while (it.hasNext()) { if (it.hasNext()) {
Entry<TransportIndex, TIntArrayList> e = it.next(); Entry<TransportIndex, TIntArrayList> e = it.next();
TransportIndex ind = e.getKey(); TransportIndex ind = e.getKey();
TIntArrayList pointers = e.getValue(); TIntArrayList pointers = e.getValue();
@ -511,7 +505,7 @@ public class BinaryMapIndexReader {
finishInit.add(transportRoute); finishInit.add(transportRoute);
} }
TIntObjectHashMap<String> indexedStringTable = transportAdapter.initializeStringTable(ind, stringTable); TIntObjectHashMap<String> indexedStringTable = transportAdapter.initializeStringTable(ind, stringTable);
for (TransportRoute transportRoute : finishInit) { for(TransportRoute transportRoute : finishInit ) {
transportAdapter.initializeNames(false, transportRoute, indexedStringTable); transportAdapter.initializeNames(false, transportRoute, indexedStringTable);
} }
@ -696,7 +690,6 @@ public class BinaryMapIndexReader {
private void readMapIndex(MapIndex index, boolean onlyInitEncodingRules) throws IOException { private void readMapIndex(MapIndex index, boolean onlyInitEncodingRules) throws IOException {
int defaultId = 1; int defaultId = 1;
int oldLimit; int oldLimit;
int encodingRulesSize = 0;
while (true) { while (true) {
int t = codedIS.readTag(); int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);
@ -713,14 +706,10 @@ public class BinaryMapIndexReader {
break; break;
case OsmandOdb.OsmAndMapIndex.RULES_FIELD_NUMBER : case OsmandOdb.OsmAndMapIndex.RULES_FIELD_NUMBER :
if (onlyInitEncodingRules) { if (onlyInitEncodingRules) {
if(encodingRulesSize == 0) {
encodingRulesSize = codedIS.getTotalBytesRead();
}
int len = codedIS.readInt32(); int len = codedIS.readInt32();
oldLimit = codedIS.pushLimit(len); oldLimit = codedIS.pushLimit(len);
readMapEncodingRule(index, defaultId++); readMapEncodingRule(index, defaultId++);
codedIS.popLimit(oldLimit); codedIS.popLimit(oldLimit);
index.encodingRulesSizeBytes = (codedIS.getTotalBytesRead() - encodingRulesSize);
} else { } else {
skipUnknownField(t); skipUnknownField(t);
} }
@ -1318,12 +1307,6 @@ public class BinaryMapIndexReader {
poiAdapter.initCategories(poiIndex); poiAdapter.initCategories(poiIndex);
} }
public void initCategories() throws IOException {
for (PoiRegion poiIndex : poiIndexes) {
poiAdapter.initCategories(poiIndex);
}
}
public List<Amenity> searchPoiByName(SearchRequest<Amenity> req) throws IOException { public List<Amenity> searchPoiByName(SearchRequest<Amenity> req) throws IOException {
if (req.nameQuery == null || req.nameQuery.length() == 0) { if (req.nameQuery == null || req.nameQuery.length() == 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
@ -1429,7 +1412,7 @@ public class BinaryMapIndexReader {
return addressIndexes; return addressIndexes;
} }
public List<PoiRegion> getPoiIndexes() { protected List<PoiRegion> getPoiIndexes() {
return poiIndexes; return poiIndexes;
} }
@ -1462,14 +1445,8 @@ public class BinaryMapIndexReader {
public static <T> SearchRequest<T> buildAddressByNameRequest(ResultMatcher<T> resultMatcher, String nameRequest, public static <T> SearchRequest<T> buildAddressByNameRequest(ResultMatcher<T> resultMatcher, String nameRequest,
StringMatcherMode matcherMode) { StringMatcherMode matcherMode) {
return buildAddressByNameRequest(resultMatcher, null, nameRequest, matcherMode);
}
public static <T> SearchRequest<T> buildAddressByNameRequest(ResultMatcher<T> resultMatcher, ResultMatcher<T> rawDataCollector, String nameRequest,
StringMatcherMode matcherMode) {
SearchRequest<T> request = new SearchRequest<T>(); SearchRequest<T> request = new SearchRequest<T>();
request.resultMatcher = resultMatcher; request.resultMatcher = resultMatcher;
request.rawDataCollector = rawDataCollector;
request.nameQuery = nameRequest.trim(); request.nameQuery = nameRequest.trim();
request.matcherMode = matcherMode; request.matcherMode = matcherMode;
return request; return request;
@ -1538,20 +1515,9 @@ public class BinaryMapIndexReader {
return request; return request;
} }
public static SearchRequest<Amenity> buildSearchPoiRequest(LatLon latLon, int radius, int zoom, public static SearchRequest<RouteDataObject> buildSearchRouteRequest(int sleft, int sright, int stop, int sbottom,
SearchPoiTypeFilter poiTypeFilter, ResultMatcher<RouteDataObject> matcher){
ResultMatcher<Amenity> matcher) {
SearchRequest<Amenity> request = new SearchRequest<>();
request.setBBoxRadius(latLon.getLatitude(), latLon.getLongitude(), radius);
request.zoom = zoom;
request.poiTypeFilter = poiTypeFilter;
request.resultMatcher = matcher;
return request;
}
public static SearchRequest<RouteDataObject> buildSearchRouteRequest(int sleft, int sright, int stop, int sbottom,
ResultMatcher<RouteDataObject> matcher) {
SearchRequest<RouteDataObject> request = new SearchRequest<RouteDataObject>(); SearchRequest<RouteDataObject> request = new SearchRequest<RouteDataObject>();
request.left = sleft; request.left = sleft;
request.right = sright; request.right = sright;
@ -1564,14 +1530,6 @@ public class BinaryMapIndexReader {
public static SearchRequest<Amenity> buildSearchPoiRequest(int x, int y, String nameFilter, int sleft, int sright, int stop, int sbottom, ResultMatcher<Amenity> resultMatcher) { public static SearchRequest<Amenity> buildSearchPoiRequest(int x, int y, String nameFilter, int sleft, int sright, int stop, int sbottom, ResultMatcher<Amenity> resultMatcher) {
return buildSearchPoiRequest(x, y, nameFilter, sleft, sright, stop, sbottom, resultMatcher, null);
}
public static SearchRequest<Amenity> buildSearchPoiRequest(int x, int y, String nameFilter, int sleft, int sright, int stop, int sbottom, ResultMatcher<Amenity> resultMatcher, ResultMatcher<Amenity> rawDataCollector) {
return buildSearchPoiRequest(x, y, nameFilter, sleft, sright, stop, sbottom, null, resultMatcher, null);
}
public static SearchRequest<Amenity> buildSearchPoiRequest(int x, int y, String nameFilter, int sleft, int sright, int stop, int sbottom, SearchPoiTypeFilter poiTypeFilter, ResultMatcher<Amenity> resultMatcher, ResultMatcher<Amenity> rawDataCollector) {
SearchRequest<Amenity> request = new SearchRequest<Amenity>(); SearchRequest<Amenity> request = new SearchRequest<Amenity>();
request.x = x; request.x = x;
request.y = y; request.y = y;
@ -1579,9 +1537,7 @@ public class BinaryMapIndexReader {
request.right = sright; request.right = sright;
request.top = stop; request.top = stop;
request.bottom = sbottom; request.bottom = sbottom;
request.poiTypeFilter = poiTypeFilter;
request.resultMatcher = resultMatcher; request.resultMatcher = resultMatcher;
request.rawDataCollector = rawDataCollector;
request.nameQuery = nameFilter.trim(); request.nameQuery = nameFilter.trim();
return request; return request;
} }
@ -1666,7 +1622,6 @@ public class BinaryMapIndexReader {
private boolean ocean = false; private boolean ocean = false;
private ResultMatcher<T> resultMatcher; private ResultMatcher<T> resultMatcher;
private ResultMatcher<T> rawDataCollector;
// 31 zoom tiles // 31 zoom tiles
// common variables // common variables
@ -1727,12 +1682,13 @@ public class BinaryMapIndexReader {
double half16t = MapUtils.getDistance(lat, MapUtils.getLongitudeFromTile(16, ((int) dx) + 0.5), double half16t = MapUtils.getDistance(lat, MapUtils.getLongitudeFromTile(16, ((int) dx) + 0.5),
lat, MapUtils.getLongitudeFromTile(16, (int) dx)); lat, MapUtils.getLongitudeFromTile(16, (int) dx));
double cf31 = ((double) radiusMeters / (half16t * 2)) * (1 << 15); double cf31 = ((double) radiusMeters / (half16t * 2)) * (1 << 15);
y = MapUtils.get31TileNumberY(lat); int y31 = MapUtils.get31TileNumberY(lat);
x = MapUtils.get31TileNumberX(lon); int x31 = MapUtils.get31TileNumberX(lon);
left = (int) (x - cf31); left = (int) (x31 - cf31);
right = (int) (x + cf31); right = (int) (x31 + cf31);
top = (int) (y - cf31); top = (int) (y31 - cf31);
bottom = (int) (y + cf31); bottom = (int) (y31 + cf31);
} }
public boolean publish(T obj) { public boolean publish(T obj) {
@ -1743,12 +1699,6 @@ public class BinaryMapIndexReader {
return false; return false;
} }
public void collectRawData(T obj) {
if (rawDataCollector != null) {
rawDataCollector.publish(obj);
}
}
protected void publishOceanTile(boolean ocean) { protected void publishOceanTile(boolean ocean) {
if (ocean) { if (ocean) {
this.ocean = true; this.ocean = true;
@ -1769,10 +1719,6 @@ public class BinaryMapIndexReader {
return limit != -1 && searchResults.size() > limit; return limit != -1 && searchResults.size() > limit;
} }
public void setLimit(int limit) {
this.limit = limit;
}
public boolean isCancelled() { public boolean isCancelled() {
if (this.interrupted) { if (this.interrupted) {
return interrupted; return interrupted;
@ -1853,13 +1799,10 @@ public class BinaryMapIndexReader {
public int onewayReverseAttribute = -1; public int onewayReverseAttribute = -1;
public TIntHashSet positiveLayers = new TIntHashSet(2); public TIntHashSet positiveLayers = new TIntHashSet(2);
public TIntHashSet negativeLayers = new TIntHashSet(2); public TIntHashSet negativeLayers = new TIntHashSet(2);
public int encodingRulesSizeBytes;
// to speed up comparision // to speed up comparision
private MapIndex referenceMapIndex; private MapIndex referenceMapIndex;
public Integer getRule(String t, String v) { public Integer getRule(String t, String v) {
Map<String, Integer> m = encodingRules.get(t); Map<String, Integer> m = encodingRules.get(t);
if (m != null) { if (m != null) {
@ -2161,9 +2104,9 @@ public class BinaryMapIndexReader {
private static boolean testAddressSearch = false; private static boolean testAddressSearch = false;
private static boolean testAddressSearchName = false; private static boolean testAddressSearchName = false;
private static boolean testAddressJustifySearch = false; private static boolean testAddressJustifySearch = false;
private static boolean testPoiSearch = true; private static boolean testPoiSearch = false;
private static boolean testPoiSearchOnPath = false; private static boolean testPoiSearchOnPath = false;
private static boolean testTransportSearch = false; private static boolean testTransportSearch = true;
private static int sleft = MapUtils.get31TileNumberX(27.55079); private static int sleft = MapUtils.get31TileNumberX(27.55079);
private static int sright = MapUtils.get31TileNumberX(27.55317); private static int sright = MapUtils.get31TileNumberX(27.55317);
@ -2177,7 +2120,7 @@ public class BinaryMapIndexReader {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
File fl = new File(System.getProperty("maps") + "/Synthetic_test_rendering.obf"); File fl = new File(System.getProperty("maps") + "/Synthetic_test_rendering.obf");
fl = new File(System.getProperty("maps") +"/Wikivoyage.obf__"); fl = new File("/home/madwasp79/OsmAnd-maps/Poly_center2.obf");
RandomAccessFile raf = new RandomAccessFile(fl, "r"); RandomAccessFile raf = new RandomAccessFile(fl, "r");
@ -2325,7 +2268,7 @@ public class BinaryMapIndexReader {
private static void testPoiSearchByName(BinaryMapIndexReader reader) throws IOException { private static void testPoiSearchByName(BinaryMapIndexReader reader) throws IOException {
println("Searching by name..."); println("Searching by name...");
SearchRequest<Amenity> req = buildSearchPoiRequest(0, 0, "central ukraine", SearchRequest<Amenity> req = buildSearchPoiRequest(0, 0, "Art",
0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, null); 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, null);
reader.searchPoiByName(req); reader.searchPoiByName(req);
@ -2385,72 +2328,54 @@ public class BinaryMapIndexReader {
} }
void readIndexedStringTable(Collator instance, List<String> queries, String prefix, List<TIntArrayList> listOffsets, TIntArrayList matchedCharacters) throws IOException { int readIndexedStringTable(Collator instance, String query, String prefix, TIntArrayList list, int charMatches) throws IOException {
String key = null; String key = null;
boolean[] matched = new boolean[matchedCharacters.size()];
boolean shouldWeReadSubtable = false;
while (true) { while (true) {
int t = codedIS.readTag(); int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);
switch (tag) { switch (tag) {
case 0: case 0:
return; return charMatches;
case OsmandOdb.IndexedStringTable.KEY_FIELD_NUMBER : case OsmandOdb.IndexedStringTable.KEY_FIELD_NUMBER :
key = codedIS.readString(); key = codedIS.readString();
if (prefix.length() > 0) { if(prefix.length() > 0){
key = prefix + key; key = prefix + key;
} }
shouldWeReadSubtable = false; // check query is part of key (the best matching)
for (int i = 0; i < queries.size(); i++) { if(CollatorStringMatcher.cmatches(instance, key, query, StringMatcherMode.CHECK_ONLY_STARTS_WITH)){
int charMatches = matchedCharacters.get(i); if(query.length() >= charMatches){
String query = queries.get(i); if(query.length() > charMatches){
matched[i] = false; charMatches = query.length();
if (query == null) { list.clear();
continue;
}
// check query is part of key (the best matching)
if (CollatorStringMatcher.cmatches(instance, key, query, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
if (query.length() >= charMatches) {
if (query.length() > charMatches) {
matchedCharacters.set(i, query.length());
listOffsets.get(i).clear();
}
matched[i] = true;
}
// check key is part of query
} else if (CollatorStringMatcher.cmatches(instance, query, key, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
if (key.length() >= charMatches) {
if (key.length() > charMatches) {
matchedCharacters.set(i, key.length());
listOffsets.get(i).clear();
}
matched[i] = true;
} }
} else {
key = null;
} }
shouldWeReadSubtable |= matched[i]; // check key is part of query
} else if (CollatorStringMatcher.cmatches(instance, query, key, StringMatcherMode.CHECK_ONLY_STARTS_WITH)) {
if (key.length() >= charMatches) {
if (key.length() > charMatches) {
charMatches = key.length();
list.clear();
}
} else {
key = null;
}
} else {
key = null;
} }
break; break;
case OsmandOdb.IndexedStringTable.VAL_FIELD_NUMBER : case OsmandOdb.IndexedStringTable.VAL_FIELD_NUMBER :
int val = readInt(); int val = readInt();
for (int i = 0; i < queries.size(); i++) { if (key != null) {
if (matched[i]) { list.add(val);
listOffsets.get(i).add(val);
}
} }
break; break;
case OsmandOdb.IndexedStringTable.SUBTABLES_FIELD_NUMBER : case OsmandOdb.IndexedStringTable.SUBTABLES_FIELD_NUMBER :
int len = codedIS.readRawVarint32(); int len = codedIS.readRawVarint32();
int oldLim = codedIS.pushLimit(len); int oldLim = codedIS.pushLimit(len);
if (shouldWeReadSubtable && key != null) { if (key != null) {
List<String> subqueries = new ArrayList<>(queries); charMatches = readIndexedStringTable(instance, query, key, list, charMatches);
// reset query so we don't search what was not matched
for(int i = 0; i < queries.size(); i++) {
if(!matched[i]) {
subqueries.set(i, null);
}
}
readIndexedStringTable(instance, subqueries, key, listOffsets, matchedCharacters);
} else { } else {
codedIS.skipRawBytes(codedIS.getBytesUntilLimit()); codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
} }
@ -2538,9 +2463,8 @@ public class BinaryMapIndexReader {
} }
} }
} }
for (Entry<MapObject, Street> entry : resMap.entrySet()) { for (MapObject e : resMap.keySet()) {
MapObject e = entry.getKey(); Street s = resMap.get(e);
Street s = entry.getValue();
if (e instanceof Building && MapUtils.getDistance(e.getLocation(), lat, lon) < 40) { if (e instanceof Building && MapUtils.getDistance(e.getLocation(), lat, lon) < 40) {
Building b = (Building) e; Building b = (Building) e;
System.out.println(b.getName() + " " + s); System.out.println(b.getName() + " " + s);
@ -2701,20 +2625,5 @@ public class BinaryMapIndexReader {
} }
} }
public TLongObjectHashMap<IncompleteTransportRoute> getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException {
if (incompleteTransportRoutes == null) {
incompleteTransportRoutes = new TLongObjectHashMap<>();
for (TransportIndex ti : transportIndexes) {
if (ti.incompleteRoutesLength > 0) {
codedIS.seek(ti.incompleteRoutesOffset);
int oldLimit = codedIS.pushLimit(ti.incompleteRoutesLength);
transportAdapter.readIncompleteRoutesList(incompleteTransportRoutes, ti.filePointer);
codedIS.popLimit(oldLimit);
}
}
}
return incompleteTransportRoutes;
}
} }

View file

@ -1,21 +1,19 @@
package net.osmand.binary; package net.osmand.binary;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.map.hash.TIntLongHashMap;
import gnu.trove.set.hash.TLongHashSet;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.logging.Log;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.map.hash.TIntLongHashMap;
import gnu.trove.set.hash.TLongHashSet;
import net.osmand.Collator; import net.osmand.Collator;
import net.osmand.CollatorStringMatcher; import net.osmand.CollatorStringMatcher;
import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.CollatorStringMatcher.StringMatcherMode;
@ -30,6 +28,11 @@ import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiCategory;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat;
public class BinaryMapPoiReaderAdapter { public class BinaryMapPoiReaderAdapter {
private static final Log LOG = PlatformUtil.getLog(BinaryMapPoiReaderAdapter.class); private static final Log LOG = PlatformUtil.getLog(BinaryMapPoiReaderAdapter.class);
@ -37,12 +40,7 @@ public class BinaryMapPoiReaderAdapter {
private static final int CATEGORY_MASK = (1 << SHIFT_BITS_CATEGORY) - 1; private static final int CATEGORY_MASK = (1 << SHIFT_BITS_CATEGORY) - 1;
private static final int ZOOM_TO_SKIP_FILTER_READ = 6; private static final int ZOOM_TO_SKIP_FILTER_READ = 6;
private static final int ZOOM_TO_SKIP_FILTER = 3; private static final int ZOOM_TO_SKIP_FILTER = 3;
private static final int BUCKET_SEARCH_BY_NAME = 15; // should be bigger 100? private static final int BUCKET_SEARCH_BY_NAME = 5;
private static final int BASE_POI_SHIFT = SHIFT_BITS_CATEGORY;// 7
private static final int FINAL_POI_SHIFT = BinaryMapIndexReader.SHIFT_COORDINATES;// 5
private static final int BASE_POI_ZOOM = 31 - BASE_POI_SHIFT;// 24 zoom
private static final int FINAL_POI_ZOOM = 31 - FINAL_POI_SHIFT;// 26 zoom
public static class PoiSubType { public static class PoiSubType {
public boolean text; public boolean text;
@ -226,7 +224,7 @@ public class BinaryMapPoiReaderAdapter {
case OsmandOdb.OsmAndCategoryTable.CATEGORY_FIELD_NUMBER: case OsmandOdb.OsmAndCategoryTable.CATEGORY_FIELD_NUMBER:
String cat = codedIS.readString().intern(); String cat = codedIS.readString().intern();
region.categories.add(cat); region.categories.add(cat);
region.categoriesType.add(poiTypes.getPoiCategoryByName(cat.toLowerCase(), true)); region.categoriesType.add(poiTypes.getPoiCategoryByName(cat.toLowerCase()));
region.subcategories.add(new ArrayList<String>()); region.subcategories.add(new ArrayList<String>());
break; break;
case OsmandOdb.OsmAndCategoryTable.SUBCATEGORIES_FIELD_NUMBER: case OsmandOdb.OsmAndCategoryTable.SUBCATEGORIES_FIELD_NUMBER:
@ -336,7 +334,7 @@ public class BinaryMapPoiReaderAdapter {
}); });
int p = BUCKET_SEARCH_BY_NAME * 3; int p = BUCKET_SEARCH_BY_NAME * 3;
if (p < offKeys.length) { if (p < offKeys.length) {
for (int i = p + BUCKET_SEARCH_BY_NAME;; i += BUCKET_SEARCH_BY_NAME) { for (int i = p + BUCKET_SEARCH_BY_NAME; ; i += BUCKET_SEARCH_BY_NAME) {
if (i > offKeys.length) { if (i > offKeys.length) {
Arrays.sort(offKeys, p, offKeys.length); Arrays.sort(offKeys, p, offKeys.length);
break; break;
@ -348,6 +346,7 @@ public class BinaryMapPoiReaderAdapter {
} }
} }
LOG.info("Searched poi structure in " + (System.currentTimeMillis() - time) + LOG.info("Searched poi structure in " + (System.currentTimeMillis() - time) +
"ms. Found " + offKeys.length + " subtrees"); "ms. Found " + offKeys.length + " subtrees");
for (int j = 0; j < offKeys.length; j++) { for (int j = 0; j < offKeys.length; j++) {
@ -373,8 +372,7 @@ public class BinaryMapPoiReaderAdapter {
private TIntLongHashMap readPoiNameIndex(Collator instance, String query, SearchRequest<Amenity> req) throws IOException { private TIntLongHashMap readPoiNameIndex(Collator instance, String query, SearchRequest<Amenity> req) throws IOException {
TIntLongHashMap offsets = new TIntLongHashMap(); TIntLongHashMap offsets = new TIntLongHashMap();
List<TIntArrayList> listOffsets = null; TIntArrayList dataOffsets = null;
List<TIntLongHashMap> listOfSepOffsets = new ArrayList<TIntLongHashMap>();
int offset = 0; int offset = 0;
while (true) { while (true) {
int t = codedIS.readTag(); int t = codedIS.readTag();
@ -385,51 +383,24 @@ public class BinaryMapPoiReaderAdapter {
case OsmandOdb.OsmAndPoiNameIndex.TABLE_FIELD_NUMBER: { case OsmandOdb.OsmAndPoiNameIndex.TABLE_FIELD_NUMBER: {
int length = readInt(); int length = readInt();
int oldLimit = codedIS.pushLimit(length); int oldLimit = codedIS.pushLimit(length);
dataOffsets = new TIntArrayList();
offset = codedIS.getTotalBytesRead(); offset = codedIS.getTotalBytesRead();
List<String> queries = new ArrayList<>(); map.readIndexedStringTable(instance, query, "", dataOffsets, 0);
for (String word : query.split(" ")) {
if (word.trim().length() > 0) {
queries.add(word.trim());
}
}
TIntArrayList charsList = new TIntArrayList(queries.size());
listOffsets = new ArrayList<TIntArrayList>(queries.size());
while(listOffsets.size() < queries.size()) {
charsList.add(0);
listOffsets.add(new TIntArrayList());
}
map.readIndexedStringTable(instance, queries, "", listOffsets, charsList);
codedIS.popLimit(oldLimit); codedIS.popLimit(oldLimit);
break; break;
} }
case OsmandOdb.OsmAndPoiNameIndex.DATA_FIELD_NUMBER: { case OsmandOdb.OsmAndPoiNameIndex.DATA_FIELD_NUMBER: {
if (listOffsets != null) { if (dataOffsets != null) {
for (TIntArrayList dataOffsets : listOffsets) { dataOffsets.sort(); // 1104125
TIntLongHashMap offsetMap = new TIntLongHashMap(); for (int i = 0; i < dataOffsets.size(); i++) {
listOfSepOffsets.add(offsetMap); codedIS.seek(dataOffsets.get(i) + offset);
dataOffsets.sort(); // 1104125 int len = codedIS.readRawVarint32();
for (int i = 0; i < dataOffsets.size(); i++) { int oldLim = codedIS.pushLimit(len);
codedIS.seek(dataOffsets.get(i) + offset); readPoiNameIndexData(offsets, req);
int len = codedIS.readRawVarint32(); codedIS.popLimit(oldLim);
int oldLim = codedIS.pushLimit(len); if (req.isCancelled()) {
readPoiNameIndexData(offsetMap, req); codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
codedIS.popLimit(oldLim); return offsets;
if (req.isCancelled()) {
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
return offsets;
}
}
}
}
if (listOfSepOffsets.size() > 0) {
offsets.putAll(listOfSepOffsets.get(0));
for (int j = 1; j < listOfSepOffsets.size(); j++) {
TIntLongHashMap mp = listOfSepOffsets.get(j);
// offsets.retainAll(mp); -- calculate intresection of mp & offsets
for (int chKey : offsets.keys()) {
if (!mp.containsKey(chKey)) {
offsets.remove(chKey);
}
} }
} }
} }
@ -605,12 +576,13 @@ public class BinaryMapPoiReaderAdapter {
} }
} }
if (!matches) { if (!matches) {
for (String key : am.getAdditionalInfoKeys()) { Map<String, String> lt = am.getAdditionalInfo();
if(!key.contains("_name") && for (Entry<String, String> e : lt.entrySet()) {
!key.equals("brand")) { if(!e.getKey().contains("_name") &&
!e.getKey().equals("brand")) {
continue; continue;
} }
matches = matcher.matches(am.getAdditionalInfo(key)); matches = matcher.matches(e.getValue());
if (matches) { if (matches) {
break; break;
} }
@ -618,7 +590,6 @@ public class BinaryMapPoiReaderAdapter {
} }
} }
if (matches) { if (matches) {
req.collectRawData(am);
req.publish(am); req.publish(am);
} }
} }
@ -665,7 +636,6 @@ public class BinaryMapPoiReaderAdapter {
int yp = (int) MapUtils.getTileNumberY(zSkip, am.getLocation().getLatitude()); int yp = (int) MapUtils.getTileNumberY(zSkip, am.getLocation().getLatitude());
long valSkip = (((long) xp) << zSkip) | yp; long valSkip = (((long) xp) << zSkip) | yp;
if (!toSkip.contains(valSkip)) { if (!toSkip.contains(valSkip)) {
req.collectRawData(am);
boolean publish = req.publish(am); boolean publish = req.publish(am);
if (publish) { if (publish) {
read = true; read = true;
@ -676,7 +646,6 @@ public class BinaryMapPoiReaderAdapter {
return read; return read;
} }
} else { } else {
req.collectRawData(am);
if (req.publish(am)) { if (req.publish(am)) {
read = true; read = true;
} }
@ -719,8 +688,6 @@ public class BinaryMapPoiReaderAdapter {
Amenity am = null; Amenity am = null;
int x = 0; int x = 0;
int y = 0; int y = 0;
int precisionXY = 0;
boolean hasLocation = false;
StringBuilder retValue = new StringBuilder(); StringBuilder retValue = new StringBuilder();
PoiCategory amenityType = null; PoiCategory amenityType = null;
LinkedList<String> textTags = null; LinkedList<String> textTags = null;
@ -747,22 +714,12 @@ public class BinaryMapPoiReaderAdapter {
am.setRoutePoint(arp); am.setRoutePoint(arp);
} }
} }
if (hasLocation) {
if (precisionXY != 0) {
int[] xy = MapUtils.calculateFinalXYFromBaseAndPrecisionXY(BASE_POI_ZOOM, FINAL_POI_ZOOM, precisionXY, x >> BASE_POI_SHIFT, y >> BASE_POI_SHIFT, true);
int x31 = xy[0] << FINAL_POI_SHIFT;
int y31 = xy[1] << FINAL_POI_SHIFT;
am.setLocation(MapUtils.get31LatitudeY(y31), MapUtils.get31LongitudeX(x31));
} else {
am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
}
}
return am; return am;
case OsmandOdb.OsmAndPoiBoxDataAtom.DX_FIELD_NUMBER: case OsmandOdb.OsmAndPoiBoxDataAtom.DX_FIELD_NUMBER:
x = (codedIS.readSInt32() + (px << (BASE_POI_ZOOM - zoom))) << BASE_POI_SHIFT; x = (codedIS.readSInt32() + (px << (24 - zoom))) << 7;
break; break;
case OsmandOdb.OsmAndPoiBoxDataAtom.DY_FIELD_NUMBER: case OsmandOdb.OsmAndPoiBoxDataAtom.DY_FIELD_NUMBER:
y = (codedIS.readSInt32() + (py << (BASE_POI_ZOOM - zoom))) << BASE_POI_SHIFT; y = (codedIS.readSInt32() + (py << (24 - zoom))) << 7;
req.numberOfVisitedObjects++; req.numberOfVisitedObjects++;
if (checkBounds) { if (checkBounds) {
if (left31 > x || right31 < x || top31 > y || bottom31 < y) { if (left31 > x || right31 < x || top31 > y || bottom31 < y) {
@ -771,8 +728,7 @@ public class BinaryMapPoiReaderAdapter {
} }
} }
am = new Amenity(); am = new Amenity();
hasLocation = true; am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
//am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x)); // set precise coordinates
break; break;
case OsmandOdb.OsmAndPoiBoxDataAtom.SUBCATEGORIES_FIELD_NUMBER: case OsmandOdb.OsmAndPoiBoxDataAtom.SUBCATEGORIES_FIELD_NUMBER:
int subtypev = codedIS.readUInt32(); int subtypev = codedIS.readUInt32();
@ -813,8 +769,7 @@ public class BinaryMapPoiReaderAdapter {
} }
} }
subtype = poiTypes.replaceDeprecatedSubtype(type, subtype); subtype = poiTypes.replaceDeprecatedSubtype(type, subtype);
boolean isForbidden = poiTypes.isTypeForbidden(subtype); if (req.poiTypeFilter == null || req.poiTypeFilter.accept(type, subtype)) {
if (!isForbidden && (req.poiTypeFilter == null || req.poiTypeFilter.accept(type, subtype))) {
if (amenityType == null) { if (amenityType == null) {
amenityType = type; amenityType = type;
am.setSubType(subtype); am.setSubType(subtype);
@ -845,11 +800,6 @@ public class BinaryMapPoiReaderAdapter {
case OsmandOdb.OsmAndPoiBoxDataAtom.NOTE_FIELD_NUMBER: case OsmandOdb.OsmAndPoiBoxDataAtom.NOTE_FIELD_NUMBER:
am.setDescription(codedIS.readString()); am.setDescription(codedIS.readString());
break; break;
case OsmandOdb.OsmAndPoiBoxDataAtom.PRECISIONXY_FIELD_NUMBER:
if (hasLocation) {
precisionXY = codedIS.readInt32();
}
break;
default: default:
skipUnknownField(t); skipUnknownField(t);
break; break;
@ -858,6 +808,7 @@ public class BinaryMapPoiReaderAdapter {
} }
private boolean checkCategories(SearchRequest<Amenity> req, PoiRegion region) throws IOException { private boolean checkCategories(SearchRequest<Amenity> req, PoiRegion region) throws IOException {
StringBuilder subType = new StringBuilder();
while (true) { while (true) {
int t = codedIS.readTag(); int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);

View file

@ -1,8 +1,19 @@
package net.osmand.binary; package net.osmand.binary;
import com.google.protobuf.CodedInputStream; import gnu.trove.iterator.TLongObjectIterator;
import com.google.protobuf.InvalidProtocolBufferException; import gnu.trove.list.array.TIntArrayList;
import com.google.protobuf.WireFormat; import gnu.trove.list.array.TLongArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
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 net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.ResultMatcher; import net.osmand.ResultMatcher;
@ -14,51 +25,27 @@ import net.osmand.binary.OsmandOdb.OsmAndRoutingIndex.RouteEncodingRule;
import net.osmand.binary.OsmandOdb.RestrictionData; import net.osmand.binary.OsmandOdb.RestrictionData;
import net.osmand.binary.OsmandOdb.RouteData; import net.osmand.binary.OsmandOdb.RouteData;
import net.osmand.binary.RouteDataObject.RestrictionInfo; import net.osmand.binary.RouteDataObject.RestrictionInfo;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import net.osmand.util.OpeningHoursParser; import net.osmand.util.OpeningHoursParser;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import java.io.IOException; import com.google.protobuf.CodedInputStream;
import java.util.ArrayList; import com.google.protobuf.InvalidProtocolBufferException;
import java.util.Calendar; import com.google.protobuf.WireFormat;
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 { public class BinaryMapRouteReaderAdapter {
protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class); protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class);
private static final int SHIFT_COORDINATES = 4; private static final int SHIFT_COORDINATES = 4;
private static class RouteTypeCondition implements StringExternalizable<RouteDataBundle> { private static class RouteTypeCondition {
String condition = ""; String condition = "";
OpeningHoursParser.OpeningHours hours = null; OpeningHoursParser.OpeningHours hours = null;
String value; String value;
int ruleid; int ruleid;
@Override
public void writeToBundle(RouteDataBundle bundle) {
bundle.putString("c", condition);
bundle.putString("v", value);
bundle.putInt("id", ruleid);
}
@Override
public void readFromBundle(RouteDataBundle bundle) {
}
} }
public static class RouteTypeRule implements StringExternalizable<RouteDataBundle> { public static class RouteTypeRule {
private final static int ACCESS = 1; private final static int ACCESS = 1;
private final static int ONEWAY = 2; private final static int ONEWAY = 2;
private final static int HIGHWAY_TYPE = 3; private final static int HIGHWAY_TYPE = 3;
@ -67,26 +54,23 @@ public class BinaryMapRouteReaderAdapter {
public final static int TRAFFIC_SIGNALS = 6; public final static int TRAFFIC_SIGNALS = 6;
public final static int RAILWAY_CROSSING = 7; public final static int RAILWAY_CROSSING = 7;
private final static int LANES = 8; private final static int LANES = 8;
private String t; private final String t;
private String v; private final String v;
private int intValue; private int intValue;
private float floatValue; private float floatValue;
private int type; private int type;
private List<RouteTypeCondition> conditions = null; private List<RouteTypeCondition> conditions = null;
private int forward; private int forward;
public RouteTypeRule() {
}
public RouteTypeRule(String t, String v) { public RouteTypeRule(String t, String v) {
this.t = t.intern(); this.t = t.intern();
if ("true".equals(v)) { if("true".equals(v)) {
v = "yes"; v = "yes";
} }
if ("false".equals(v)) { if("false".equals(v)) {
v = "no"; v = "no";
} }
this.v = v == null ? null : v.intern(); this.v = v == null? null : v.intern();
try { try {
analyze(); analyze();
} catch(RuntimeException e) { } catch(RuntimeException e) {
@ -95,52 +79,6 @@ public class BinaryMapRouteReaderAdapter {
} }
} }
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((t == null) ? 0 : t.hashCode());
result = prime * result + ((v == null) ? 0 : v.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
RouteTypeRule other = (RouteTypeRule) obj;
return Algorithms.objectEquals(other.t, t) && Algorithms.objectEquals(other.v, v);
}
@Override
public void writeToBundle(RouteDataBundle bundle) {
bundle.putString("t", t);
if (v != null) {
bundle.putString("v", v);
}
}
@Override
public void readFromBundle(RouteDataBundle bundle) {
t = bundle.getString("t", null);
v = bundle.getString("v", null);
try {
analyze();
} catch(RuntimeException e) {
System.err.println("Error analyzing tag/value = " + t + "/" +v);
throw e;
}
}
@Override
public String toString() {
return t + "=" + v;
}
public int isForward() { public int isForward() {
return forward; return forward;
} }
@ -172,7 +110,7 @@ public class BinaryMapRouteReaderAdapter {
} }
return tag; return tag;
} }
public int onewayDirection(){ public int onewayDirection(){
if(type == ONEWAY){ if(type == ONEWAY){
return intValue; return intValue;
@ -293,29 +231,20 @@ public class BinaryMapRouteReaderAdapter {
public static class RouteRegion extends BinaryIndexPart { public static class RouteRegion extends BinaryIndexPart {
public int regionsRead; public int regionsRead;
public List<RouteTypeRule> routeEncodingRules = new ArrayList<BinaryMapRouteReaderAdapter.RouteTypeRule>(); public List<RouteTypeRule> routeEncodingRules = new ArrayList<BinaryMapRouteReaderAdapter.RouteTypeRule>();
public int routeEncodingRulesBytes = 0;
public Map<String, Integer> decodingRules = null; public Map<String, Integer> decodingRules = null;
List<RouteSubregion> subregions = new ArrayList<RouteSubregion>(); List<RouteSubregion> subregions = new ArrayList<RouteSubregion>();
List<RouteSubregion> basesubregions = new ArrayList<RouteSubregion>(); List<RouteSubregion> basesubregions = new ArrayList<RouteSubregion>();
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 stopMinor = -1;
public int giveWaySign = -1;
int nameTypeRule = -1; int nameTypeRule = -1;
int refTypeRule = -1; int refTypeRule = -1;
int destinationTypeRule = -1; int destinationTypeRule = -1;
int destinationRefTypeRule = -1; int destinationRefTypeRule = -1;
private RouteRegion referenceRouteRegion; private RouteRegion referenceRouteRegion;
public String getPartName() { public String getPartName() {
return "Routing"; return "Routing";
} }
public int getFieldNumber() { public int getFieldNumber() {
return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER; return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER;
@ -336,15 +265,7 @@ public class BinaryMapRouteReaderAdapter {
} }
return -1; return -1;
} }
public int getNameTypeRule() {
return nameTypeRule;
}
public int getRefTypeRule() {
return refTypeRule;
}
public RouteTypeRule quickGetEncodingRule(int id) { public RouteTypeRule quickGetEncodingRule(int id) {
return routeEncodingRules.get(id); return routeEncodingRules.get(id);
} }
@ -363,30 +284,9 @@ public class BinaryMapRouteReaderAdapter {
destinationTypeRule = id; destinationTypeRule = id;
} else if (tags.equals("destination:ref") || tags.equals("destination:ref:forward") || tags.equals("destination:ref:backward")) { } else if (tags.equals("destination:ref") || tags.equals("destination:ref:forward") || tags.equals("destination:ref:backward")) {
destinationRefTypeRule = id; destinationRefTypeRule = id;
} else if (tags.equals("highway") && val.equals("traffic_signals")){
trafficSignals = id;
} else if (tags.equals("stop") && val.equals("minor")) {
stopMinor = 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() { public void completeRouteEncodingRules() {
for(int i = 0; i < routeEncodingRules.size(); i++) { for(int i = 0; i < routeEncodingRules.size(); i++) {
RouteTypeRule rtr = routeEncodingRules.get(i); RouteTypeRule rtr = routeEncodingRules.get(i);
@ -577,7 +477,7 @@ public class BinaryMapRouteReaderAdapter {
public int shiftToData; public int shiftToData;
public List<RouteSubregion> subregions = null; public List<RouteSubregion> subregions = null;
public List<RouteDataObject> dataObjects = null; public List<RouteDataObject> dataObjects = null;
public int getEstimatedSize(){ public int getEstimatedSize(){
int shallow = 7 * INT_SIZE + 4*3; int shallow = 7 * INT_SIZE + 4*3;
if (subregions != null) { if (subregions != null) {
@ -619,7 +519,6 @@ public class BinaryMapRouteReaderAdapter {
protected void readRouteIndex(RouteRegion region) throws IOException { protected void readRouteIndex(RouteRegion region) throws IOException {
int routeEncodingRule = 1; int routeEncodingRule = 1;
int routeEncodingRulesSize = 0;
while(true){ while(true){
int t = codedIS.readTag(); int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);
@ -632,13 +531,10 @@ public class BinaryMapRouteReaderAdapter {
break; break;
case OsmandOdb.OsmAndRoutingIndex.RULES_FIELD_NUMBER: { case OsmandOdb.OsmAndRoutingIndex.RULES_FIELD_NUMBER: {
int len = codedIS.readInt32(); int len = codedIS.readInt32();
if(routeEncodingRulesSize == 0) {
routeEncodingRulesSize = codedIS.getTotalBytesRead();
}
int oldLimit = codedIS.pushLimit(len); int oldLimit = codedIS.pushLimit(len);
readRouteEncodingRule(region, routeEncodingRule++); readRouteEncodingRule(region, routeEncodingRule++);
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
codedIS.popLimit(oldLimit); codedIS.popLimit(oldLimit);
region.routeEncodingRulesBytes = codedIS.getTotalBytesRead() - routeEncodingRulesSize;
} break; } break;
case OsmandOdb.OsmAndRoutingIndex.ROOTBOXES_FIELD_NUMBER : case OsmandOdb.OsmAndRoutingIndex.ROOTBOXES_FIELD_NUMBER :
case OsmandOdb.OsmAndRoutingIndex.BASEMAPBOXES_FIELD_NUMBER :{ case OsmandOdb.OsmAndRoutingIndex.BASEMAPBOXES_FIELD_NUMBER :{

View file

@ -9,9 +9,7 @@ import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat; import com.google.protobuf.WireFormat;
import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
import net.osmand.data.IncompleteTransportRoute;
import net.osmand.data.TransportSchedule; import net.osmand.data.TransportSchedule;
import net.osmand.data.TransportStop; import net.osmand.data.TransportStop;
import net.osmand.data.TransportStopExit; import net.osmand.data.TransportStopExit;
@ -45,8 +43,6 @@ public class BinaryMapTransportReaderAdapter {
int stopsFileOffset = 0; int stopsFileOffset = 0;
int stopsFileLength = 0; int stopsFileLength = 0;
int incompleteRoutesOffset = 0;
int incompleteRoutesLength = 0;
public String getPartName() { public String getPartName() {
return "Transport"; return "Transport";
@ -71,7 +67,7 @@ public class BinaryMapTransportReaderAdapter {
public int getBottom() { public int getBottom() {
return bottom; return bottom;
} }
IndexStringTable stringTable = null; IndexStringTable stringTable = null;
} }
@ -112,19 +108,12 @@ public class BinaryMapTransportReaderAdapter {
ind.stringTable = st; ind.stringTable = st;
codedIS.seek(st.length + st.fileOffset); codedIS.seek(st.length + st.fileOffset);
break; break;
case OsmandOdb.OsmAndTransportIndex.INCOMPLETEROUTES_FIELD_NUMBER :
ind.incompleteRoutesLength = codedIS.readRawVarint32();
ind.incompleteRoutesOffset = codedIS.getTotalBytesRead();
codedIS.seek(ind.incompleteRoutesLength + ind.incompleteRoutesOffset);
break;
default: default:
skipUnknownField(t); skipUnknownField(t);
break; break;
} }
} }
} }
private void readTransportBounds(TransportIndex ind) throws IOException { private void readTransportBounds(TransportIndex ind) throws IOException {
while(true){ while(true){
@ -251,81 +240,6 @@ public class BinaryMapTransportReaderAdapter {
return ((char) i)+""; return ((char) i)+"";
} }
public void readIncompleteRoutesList(TLongObjectHashMap<net.osmand.data.IncompleteTransportRoute> incompleteRoutes, int transportIndexStart) throws IOException {
boolean end = false;
while (!end) {
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);
switch (tag) {
case 0:
end = true;
break;
case OsmandOdb.IncompleteTransportRoutes.ROUTES_FIELD_NUMBER:
int l = codedIS.readRawVarint32();
int olds = codedIS.pushLimit(l);
net.osmand.data.IncompleteTransportRoute ir = readIncompleteRoute(transportIndexStart);
net.osmand.data.IncompleteTransportRoute itr = incompleteRoutes.get(ir.getRouteId());
if(itr != null) {
itr.setNextLinkedRoute(ir);
} else {
incompleteRoutes.put(ir.getRouteId(), ir);
}
codedIS.popLimit(olds);
break;
default:
skipUnknownField(t);
break;
}
}
}
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){
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);
switch (tag) {
case 0:
end = true;
break;
case OsmandOdb.IncompleteTransportRoute.ID_FIELD_NUMBER :
dataObject.setRouteId(codedIS.readUInt64());
break;
case OsmandOdb.IncompleteTransportRoute.ROUTEREF_FIELD_NUMBER :
int delta = codedIS.readRawVarint32();
if (delta > transportIndexStart) {
dataObject.setRouteOffset(delta);
} else {
dataObject.setRouteOffset(transportIndexStart + delta);
}
break;
case OsmandOdb.IncompleteTransportRoute.OPERATOR_FIELD_NUMBER :
skipUnknownField(t);
// dataObject.setOperator(regStr(stringTable));
break;
case OsmandOdb.IncompleteTransportRoute.REF_FIELD_NUMBER :
skipUnknownField(t);
// dataObject.setRef(regStr(stringTable));
break;
case OsmandOdb.IncompleteTransportRoute.TYPE_FIELD_NUMBER :
skipUnknownField(t);
// dataObject.setType(regStr(stringTable));
break;
case OsmandOdb.IncompleteTransportRoute.MISSINGSTOPS_FIELD_NUMBER :
// dataObject.getMissingStops().add(codedIS.readSInt32()); //skip for now
skipUnknownField(t);
break;
default:
skipUnknownField(t);
break;
}
}
return dataObject;
}
public net.osmand.data.TransportRoute getTransportRoute(int filePointer, TIntObjectHashMap<String> stringTable, public net.osmand.data.TransportRoute getTransportRoute(int filePointer, TIntObjectHashMap<String> stringTable,
boolean onlyDescription) throws IOException { boolean onlyDescription) throws IOException {
codedIS.seek(filePointer); codedIS.seek(filePointer);
@ -480,6 +394,7 @@ public class BinaryMapTransportReaderAdapter {
codedIS.seek(ind.stringTable.fileOffset); codedIS.seek(ind.stringTable.fileOffset);
int oldLimit = codedIS.pushLimit(ind.stringTable.length); int oldLimit = codedIS.pushLimit(ind.stringTable.length);
int current = 0; int current = 0;
int i = 0;
while (codedIS.getBytesUntilLimit() > 0) { while (codedIS.getBytesUntilLimit() > 0) {
int t = codedIS.readTag(); int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t); int tag = WireFormat.getTagFieldNumber(t);
@ -550,6 +465,8 @@ public class BinaryMapTransportReaderAdapter {
s.setName(stringTable.get(e.getKey().charAt(0)), stringTable.get(e.getValue().charAt(0))); s.setName(stringTable.get(e.getKey().charAt(0)), stringTable.get(e.getValue().charAt(0)));
} }
} }
private TransportStop readTransportRouteStop(int[] dx, int[] dy, long did, TIntObjectHashMap<String> stringTable, private TransportStop readTransportRouteStop(int[] dx, int[] dy, long did, TIntObjectHashMap<String> stringTable,
int filePointer) throws IOException { int filePointer) throws IOException {
@ -720,4 +637,6 @@ public class BinaryMapTransportReaderAdapter {
} }
} }
} }
} }

View file

@ -1,5 +1,11 @@
package net.osmand.binary; package net.osmand.binary;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapAddressReaderAdapter.AddressRegion; import net.osmand.binary.BinaryMapAddressReaderAdapter.AddressRegion;
import net.osmand.binary.BinaryMapAddressReaderAdapter.CitiesBlock; import net.osmand.binary.BinaryMapAddressReaderAdapter.CitiesBlock;
@ -20,53 +26,46 @@ import net.osmand.binary.OsmandIndex.PoiPart;
import net.osmand.binary.OsmandIndex.RoutingPart; import net.osmand.binary.OsmandIndex.RoutingPart;
import net.osmand.binary.OsmandIndex.RoutingSubregion; import net.osmand.binary.OsmandIndex.RoutingSubregion;
import net.osmand.binary.OsmandIndex.TransportPart; import net.osmand.binary.OsmandIndex.TransportPart;
import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
public class CachedOsmandIndexes { public class CachedOsmandIndexes {
private OsmAndStoredIndex storedIndex; private OsmAndStoredIndex storedIndex;
private OsmAndStoredIndex.Builder storedIndexBuilder; private OsmAndStoredIndex.Builder storedIndexBuilder;
private Log log = PlatformUtil.getLog(CachedOsmandIndexes.class); private Log log = PlatformUtil.getLog(CachedOsmandIndexes.class);
private boolean hasChanged = true; private boolean hasChanged = true;
public static final int VERSION = 2; public static final int VERSION = 2;
public void addToCache(BinaryMapIndexReader reader, File f) { public void addToCache(BinaryMapIndexReader reader, File f) {
hasChanged = true; hasChanged = true;
if (storedIndexBuilder == null) { if(storedIndexBuilder == null) {
storedIndexBuilder = OsmandIndex.OsmAndStoredIndex.newBuilder(); storedIndexBuilder = OsmandIndex.OsmAndStoredIndex.newBuilder();
storedIndexBuilder.setVersion(VERSION); storedIndexBuilder.setVersion(VERSION);
storedIndexBuilder.setDateCreated(System.currentTimeMillis()); storedIndexBuilder.setDateCreated(System.currentTimeMillis());
if (storedIndex != null) { if(storedIndex != null) {
for (FileIndex ex : storedIndex.getFileIndexList()) { for(FileIndex ex : storedIndex.getFileIndexList()) {
if (!ex.getFileName().equals(f.getName())) { storedIndexBuilder.addFileIndex(ex);
storedIndexBuilder.addFileIndex(ex);
}
} }
} }
} }
FileIndex.Builder fileIndex = OsmandIndex.FileIndex.newBuilder(); FileIndex.Builder fileIndex = OsmandIndex.FileIndex.newBuilder();
long d = reader.getDateCreated(); long d = reader.getDateCreated();
fileIndex.setDateModified(d == 0 ? f.lastModified() : d); fileIndex.setDateModified(d== 0?f.lastModified() : d);
fileIndex.setSize(f.length()); fileIndex.setSize(f.length());
fileIndex.setVersion(reader.getVersion()); fileIndex.setVersion(reader.getVersion());
fileIndex.setFileName(f.getName()); fileIndex.setFileName(f.getName());
for (MapIndex index : reader.getMapIndexes()) { for(MapIndex index : reader.getMapIndexes()) {
MapPart.Builder map = OsmandIndex.MapPart.newBuilder(); MapPart.Builder map = OsmandIndex.MapPart.newBuilder();
map.setSize(index.getLength()); map.setSize(index.getLength());
map.setOffset(index.getFilePointer()); map.setOffset(index.getFilePointer());
if (index.getName() != null) { if(index.getName() != null) {
map.setName(index.getName()); map.setName(index.getName());
} }
for (MapRoot mr : index.getRoots()) { for(MapRoot mr : index.getRoots() ) {
MapLevel.Builder lev = OsmandIndex.MapLevel.newBuilder(); MapLevel.Builder lev = OsmandIndex.MapLevel.newBuilder();
lev.setSize(mr.length); lev.setSize(mr.length);
lev.setOffset(mr.filePointer); lev.setOffset(mr.filePointer);
@ -80,36 +79,36 @@ public class CachedOsmandIndexes {
} }
fileIndex.addMapIndex(map); fileIndex.addMapIndex(map);
} }
for (AddressRegion index : reader.getAddressIndexes()) { for(AddressRegion index : reader.getAddressIndexes()) {
AddressPart.Builder addr = OsmandIndex.AddressPart.newBuilder(); AddressPart.Builder addr = OsmandIndex.AddressPart.newBuilder();
addr.setSize(index.getLength()); addr.setSize(index.getLength());
addr.setOffset(index.getFilePointer()); addr.setOffset(index.getFilePointer());
if (index.getName() != null) { if(index.getName() != null) {
addr.setName(index.getName()); addr.setName(index.getName());
} }
if (index.getEnName() != null) { if(index.getEnName() != null) {
addr.setNameEn(index.getEnName()); addr.setNameEn(index.getEnName());
} }
addr.setIndexNameOffset(index.getIndexNameOffset()); addr.setIndexNameOffset(index.getIndexNameOffset());
for (CitiesBlock mr : index.getCities()) { for(CitiesBlock mr : index.getCities() ) {
CityBlock.Builder cblock = OsmandIndex.CityBlock.newBuilder(); CityBlock.Builder cblock = OsmandIndex.CityBlock.newBuilder();
cblock.setSize(mr.length); cblock.setSize(mr.length);
cblock.setOffset(mr.filePointer); cblock.setOffset(mr.filePointer);
cblock.setType(mr.type); cblock.setType(mr.type);
addr.addCities(cblock); addr.addCities(cblock);
} }
for (String s : index.getAttributeTagsTable()) { for(String s : index.getAttributeTagsTable()) {
addr.addAdditionalTags(s); addr.addAdditionalTags(s);
} }
fileIndex.addAddressIndex(addr); fileIndex.addAddressIndex(addr);
} }
for (PoiRegion index : reader.getPoiIndexes()) { for(PoiRegion index : reader.getPoiIndexes()) {
PoiPart.Builder poi = OsmandIndex.PoiPart.newBuilder(); PoiPart.Builder poi = OsmandIndex.PoiPart.newBuilder();
poi.setSize(index.getLength()); poi.setSize(index.getLength());
poi.setOffset(index.getFilePointer()); poi.setOffset(index.getFilePointer());
if (index.getName() != null) { if(index.getName() != null) {
poi.setName(index.getName()); poi.setName(index.getName());
} }
poi.setLeft(index.left31); poi.setLeft(index.left31);
@ -118,12 +117,12 @@ public class CachedOsmandIndexes {
poi.setBottom(index.bottom31); poi.setBottom(index.bottom31);
fileIndex.addPoiIndex(poi.build()); fileIndex.addPoiIndex(poi.build());
} }
for (TransportIndex index : reader.getTransportIndexes()) { for(TransportIndex index : reader.getTransportIndexes()) {
TransportPart.Builder transport = OsmandIndex.TransportPart.newBuilder(); TransportPart.Builder transport = OsmandIndex.TransportPart.newBuilder();
transport.setSize(index.getLength()); transport.setSize(index.getLength());
transport.setOffset(index.getFilePointer()); transport.setOffset(index.getFilePointer());
if (index.getName() != null) { if(index.getName() != null) {
transport.setName(index.getName()); transport.setName(index.getName());
} }
transport.setLeft(index.getLeft()); transport.setLeft(index.getLeft());
@ -132,33 +131,29 @@ public class CachedOsmandIndexes {
transport.setBottom(index.getBottom()); transport.setBottom(index.getBottom());
transport.setStopsTableLength(index.stopsFileLength); transport.setStopsTableLength(index.stopsFileLength);
transport.setStopsTableOffset(index.stopsFileOffset); transport.setStopsTableOffset(index.stopsFileOffset);
// if(index.incompleteRoutesLength > 0) {
transport.setIncompleteRoutesLength(index.incompleteRoutesLength);
transport.setIncompleteRoutesOffset(index.incompleteRoutesOffset);
// }
transport.setStringTableLength(index.stringTable.length); transport.setStringTableLength(index.stringTable.length);
transport.setStringTableOffset(index.stringTable.fileOffset); transport.setStringTableOffset(index.stringTable.fileOffset);
fileIndex.addTransportIndex(transport); fileIndex.addTransportIndex(transport);
} }
for (RouteRegion index : reader.getRoutingIndexes()) { for(RouteRegion index : reader.getRoutingIndexes()) {
RoutingPart.Builder routing = OsmandIndex.RoutingPart.newBuilder(); RoutingPart.Builder routing = OsmandIndex.RoutingPart.newBuilder();
routing.setSize(index.getLength()); routing.setSize(index.getLength());
routing.setOffset(index.getFilePointer()); routing.setOffset(index.getFilePointer());
if (index.getName() != null) { if(index.getName() != null) {
routing.setName(index.getName()); routing.setName(index.getName());
} }
for (RouteSubregion sub : index.getSubregions()) { for(RouteSubregion sub : index.getSubregions()) {
addRouteSubregion(routing, sub, false); addRouteSubregion(routing, sub, false);
} }
for (RouteSubregion sub : index.getBaseSubregions()) { for(RouteSubregion sub : index.getBaseSubregions()) {
addRouteSubregion(routing, sub, true); addRouteSubregion(routing, sub, true);
} }
fileIndex.addRoutingIndex(routing); fileIndex.addRoutingIndex(routing);
} }
storedIndexBuilder.addFileIndex(fileIndex); storedIndexBuilder.addFileIndex(fileIndex);
} }
private void addRouteSubregion(RoutingPart.Builder routing, RouteSubregion sub, boolean base) { private void addRouteSubregion(RoutingPart.Builder routing, RouteSubregion sub, boolean base) {
@ -173,11 +168,11 @@ public class CachedOsmandIndexes {
rpart.setShifToData(sub.shiftToData); rpart.setShifToData(sub.shiftToData);
routing.addSubregions(rpart); routing.addSubregions(rpart);
} }
public BinaryMapIndexReader getReader(File f, boolean useStoredIndex) throws IOException { public BinaryMapIndexReader getReader(File f) throws IOException {
RandomAccessFile mf = new RandomAccessFile(f.getPath(), "r"); RandomAccessFile mf = new RandomAccessFile(f.getPath(), "r");
FileIndex found = null; FileIndex found = null;
if (storedIndex != null && useStoredIndex) { if (storedIndex != null) {
for (int i = 0; i < storedIndex.getFileIndexCount(); i++) { for (int i = 0; i < storedIndex.getFileIndexCount(); i++) {
FileIndex fi = storedIndex.getFileIndex(i); FileIndex fi = storedIndex.getFileIndex(i);
if (f.length() == fi.getSize() && f.getName().equals(fi.getFileName())) { if (f.length() == fi.getSize() && f.getName().equals(fi.getFileName())) {
@ -193,26 +188,26 @@ public class CachedOsmandIndexes {
reader = new BinaryMapIndexReader(mf, f); reader = new BinaryMapIndexReader(mf, f);
addToCache(reader, f); addToCache(reader, f);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Initializing db " + f.getAbsolutePath() + " " + (System.currentTimeMillis() - val) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ log.debug("Initializing db " + f.getAbsolutePath() + " " + (System.currentTimeMillis() - val ) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
} else { } else {
reader = initFileIndex(found, mf, f); reader = initFileIndex(found, mf, f);
} }
return reader; return reader;
} }
private BinaryMapIndexReader initFileIndex(FileIndex found, RandomAccessFile mf, File f) throws IOException { private BinaryMapIndexReader initFileIndex(FileIndex found, RandomAccessFile mf, File f) throws IOException {
BinaryMapIndexReader reader = new BinaryMapIndexReader(mf, f, false); BinaryMapIndexReader reader = new BinaryMapIndexReader(mf, f, false);
reader.version = found.getVersion(); reader.version = found.getVersion();
reader.dateCreated = found.getDateModified(); reader.dateCreated = found.getDateModified();
for (MapPart index : found.getMapIndexList()) { for(MapPart index : found.getMapIndexList()) {
MapIndex mi = new MapIndex(); MapIndex mi = new MapIndex();
mi.length = (int) index.getSize(); mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset(); mi.filePointer = (int) index.getOffset();
mi.name = index.getName(); mi.name = index.getName();
for (MapLevel mr : index.getLevelsList()) { for(MapLevel mr : index.getLevelsList()) {
MapRoot root = new MapRoot(); MapRoot root = new MapRoot();
root.length = (int) mr.getSize(); root.length = (int) mr.getSize();
root.filePointer = (int) mr.getOffset(); root.filePointer = (int) mr.getOffset();
@ -228,27 +223,29 @@ public class CachedOsmandIndexes {
reader.indexes.add(mi); reader.indexes.add(mi);
reader.basemap = reader.basemap || mi.isBaseMap(); reader.basemap = reader.basemap || mi.isBaseMap();
} }
for (AddressPart index : found.getAddressIndexList()) { for(AddressPart index : found.getAddressIndexList()) {
AddressRegion mi = new AddressRegion(); AddressRegion mi = new AddressRegion();
mi.length = (int) index.getSize(); mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset(); mi.filePointer = (int) index.getOffset();
mi.name = index.getName(); mi.name = index.getName();
mi.enName = index.getNameEn(); mi.enName = index.getNameEn();
mi.indexNameOffset = index.getIndexNameOffset(); mi.indexNameOffset = index.getIndexNameOffset();
for (CityBlock mr : index.getCitiesList()) { for(CityBlock mr : index.getCitiesList() ) {
CitiesBlock cblock = new CitiesBlock(); CitiesBlock cblock = new CitiesBlock();
cblock.length = (int) mr.getSize(); cblock.length = (int) mr.getSize();
cblock.filePointer = (int) mr.getOffset(); cblock.filePointer = (int) mr.getOffset();
cblock.type = mr.getType(); cblock.type = mr.getType();
mi.cities.add(cblock); mi.cities.add(cblock);
} }
mi.attributeTagsTable.addAll(index.getAdditionalTagsList()); for(String s : index.getAdditionalTagsList()) {
mi.attributeTagsTable.add(s);
}
reader.addressIndexes.add(mi); reader.addressIndexes.add(mi);
reader.indexes.add(mi); reader.indexes.add(mi);
} }
for (PoiPart index : found.getPoiIndexList()) { for(PoiPart index : found.getPoiIndexList()) {
PoiRegion mi = new PoiRegion(); PoiRegion mi = new PoiRegion();
mi.length = (int) index.getSize(); mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset(); mi.filePointer = (int) index.getOffset();
@ -260,34 +257,32 @@ public class CachedOsmandIndexes {
reader.poiIndexes.add(mi); reader.poiIndexes.add(mi);
reader.indexes.add(mi); reader.indexes.add(mi);
} }
for (TransportPart index : found.getTransportIndexList()) { for(TransportPart index : found.getTransportIndexList()) {
TransportIndex mi = new TransportIndex(); TransportIndex mi = new TransportIndex();
mi.length = (int) index.getSize(); mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset(); mi.filePointer = (int) index.getOffset();
mi.name = index.getName(); mi.name = index.getName();
mi.left = index.getLeft(); mi.left = index.getLeft();
mi.right = index.getRight(); mi.right =index.getRight();
mi.top = index.getTop(); mi.top = index.getTop();
mi.bottom = index.getBottom(); mi.bottom = index.getBottom();
mi.stopsFileLength = index.getStopsTableLength(); mi.stopsFileLength = index.getStopsTableLength();
mi.stopsFileOffset = index.getStopsTableOffset(); mi.stopsFileOffset = index.getStopsTableOffset();
mi.incompleteRoutesLength = index.getIncompleteRoutesLength();
mi.incompleteRoutesOffset = index.getIncompleteRoutesOffset();
mi.stringTable = new IndexStringTable(); mi.stringTable = new IndexStringTable();
mi.stringTable.fileOffset = index.getStringTableOffset(); mi.stringTable.fileOffset = index.getStringTableOffset();
mi.stringTable.length = index.getStringTableLength(); mi.stringTable.length = index.getStringTableLength();
reader.transportIndexes.add(mi); reader.transportIndexes.add(mi);
reader.indexes.add(mi); reader.indexes.add(mi);
} }
for (RoutingPart index : found.getRoutingIndexList()) { for(RoutingPart index : found.getRoutingIndexList()) {
RouteRegion mi = new RouteRegion(); RouteRegion mi = new RouteRegion();
mi.length = (int) index.getSize(); mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset(); mi.filePointer = (int) index.getOffset();
mi.name = index.getName(); mi.name = index.getName();
for (RoutingSubregion mr : index.getSubregionsList()) { for(RoutingSubregion mr : index.getSubregionsList()) {
RouteSubregion sub = new RouteSubregion(mi); RouteSubregion sub = new RouteSubregion(mi);
sub.length = (int) mr.getSize(); sub.length = (int) mr.getSize();
sub.filePointer = (int) mr.getOffset(); sub.filePointer = (int) mr.getOffset();
@ -296,7 +291,7 @@ public class CachedOsmandIndexes {
sub.top = mr.getTop(); sub.top = mr.getTop();
sub.bottom = mr.getBottom(); sub.bottom = mr.getBottom();
sub.shiftToData = mr.getShifToData(); sub.shiftToData = mr.getShifToData();
if (mr.getBasemap()) { if(mr.getBasemap()) {
mi.basesubregions.add(sub); mi.basesubregions.add(sub);
} else { } else {
mi.subregions.add(sub); mi.subregions.add(sub);
@ -305,7 +300,7 @@ public class CachedOsmandIndexes {
reader.routingIndexes.add(mi); reader.routingIndexes.add(mi);
reader.indexes.add(mi); reader.indexes.add(mi);
} }
return reader; return reader;
} }
@ -315,7 +310,7 @@ public class CachedOsmandIndexes {
try { try {
storedIndex = OsmandIndex.OsmAndStoredIndex.newBuilder().mergeFrom(is).build(); storedIndex = OsmandIndex.OsmAndStoredIndex.newBuilder().mergeFrom(is).build();
hasChanged = false; hasChanged = false;
if (storedIndex.getVersion() != version) { if(storedIndex.getVersion() != version){
storedIndex = null; storedIndex = null;
} }
} finally { } finally {
@ -323,7 +318,7 @@ public class CachedOsmandIndexes {
} }
log.info("Initialize cache " + (System.currentTimeMillis() - time)); log.info("Initialize cache " + (System.currentTimeMillis() - time));
} }
public void writeToFile(File f) throws IOException { public void writeToFile(File f) throws IOException {
if (hasChanged) { if (hasChanged) {
FileOutputStream outputStream = new FileOutputStream(f); FileOutputStream outputStream = new FileOutputStream(f);

View file

@ -13,6 +13,10 @@ public class CommonWords {
frequentlyUsedWordsDictionary.put(string, frequentlyUsedWordsDictionary.size()); frequentlyUsedWordsDictionary.put(string, frequentlyUsedWordsDictionary.size());
} }
public static int getCommon(String name) { public static int getCommon(String name) {
// if(true) {
// // not ready for old versions yet
// return -1;
// }
Integer i = commonWordsDictionary.get(name); Integer i = commonWordsDictionary.get(name);
return i == null ? -1 : i.intValue(); return i == null ? -1 : i.intValue();
} }
@ -24,15 +28,7 @@ public class CommonWords {
public static int getCommonSearch(String name) { public static int getCommonSearch(String name) {
Integer i = commonWordsDictionary.get(name); Integer i = commonWordsDictionary.get(name);
// higher means better for search return i == null ? getFrequentlyUsed(name) : i.intValue() + frequentlyUsedWordsDictionary.size();
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) { public static int getCommonGeocoding(String name) {
@ -764,7 +760,6 @@ public class CommonWords {
addFrequentlyUsed("martiri"); addFrequentlyUsed("martiri");
addFrequentlyUsed("verdi"); addFrequentlyUsed("verdi");
addFrequentlyUsed("augusta"); addFrequentlyUsed("augusta");
addFrequentlyUsed("neuburger");
@ -844,7 +839,6 @@ public class CommonWords {
addCommon("van"); addCommon("van");
addCommon("road"); addCommon("road");
addCommon("street"); addCommon("street");
addCommon("sector");
addCommon("drive"); addCommon("drive");
addCommon("avenue"); addCommon("avenue");
addCommon("rue"); addCommon("rue");

View file

@ -4,7 +4,6 @@ import net.osmand.PlatformUtil;
import net.osmand.ResultMatcher; import net.osmand.ResultMatcher;
import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.CollatorStringMatcher.StringMatcherMode;
import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.data.Building; import net.osmand.data.Building;
import net.osmand.data.City; import net.osmand.data.City;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
@ -24,11 +23,9 @@ import java.text.Collator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import gnu.trove.set.hash.TLongHashSet; import gnu.trove.set.hash.TLongHashSet;
@ -43,7 +40,7 @@ public class GeocodingUtilities {
public static final float STOP_SEARCHING_STREET_WITH_MULTIPLIER_RADIUS = 250; 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 float STOP_SEARCHING_STREET_WITHOUT_MULTIPLIER_RADIUS = 400;
public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 45000; public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 15000;
public static final float DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME = 1000; public static final float DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME = 1000;
public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f; public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f;
@ -145,12 +142,15 @@ public class GeocodingUtilities {
RoutePlannerFrontEnd rp = new RoutePlannerFrontEnd(); RoutePlannerFrontEnd rp = new RoutePlannerFrontEnd();
List<GeocodingResult> lst = new ArrayList<GeocodingUtilities.GeocodingResult>(); List<GeocodingResult> lst = new ArrayList<GeocodingUtilities.GeocodingResult>();
List<RouteSegmentPoint> listR = new ArrayList<BinaryRoutePlanner.RouteSegmentPoint>(); List<RouteSegmentPoint> listR = new ArrayList<BinaryRoutePlanner.RouteSegmentPoint>();
// we allow duplications to search in both files for boundary regions rp.findRouteSegment(lat, lon, ctx, listR);
rp.findRouteSegment(lat, lon, ctx, listR, false, true);
double distSquare = 0; double distSquare = 0;
Map<String, List<RouteRegion>> streetNames = new HashMap<>(); TLongHashSet set = new TLongHashSet();
Set<String> streetNames = new HashSet<String>();
for (RouteSegmentPoint p : listR) { for (RouteSegmentPoint p : listR) {
RouteDataObject road = p.getRoad(); RouteDataObject road = p.getRoad();
if (!set.add(road.getId())) {
continue;
}
// System.out.println(road.toString() + " " + Math.sqrt(p.distSquare)); // System.out.println(road.toString() + " " + Math.sqrt(p.distSquare));
String name = Algorithms.isEmpty(road.getName()) ? road.getRef("", false, true) : road.getName(); String name = Algorithms.isEmpty(road.getName()) ? road.getRef("", false, true) : road.getName();
if (allowEmptyNames || !Algorithms.isEmpty(name)) { if (allowEmptyNames || !Algorithms.isEmpty(name)) {
@ -164,13 +164,7 @@ public class GeocodingUtilities {
sr.connectionPoint = new LatLon(MapUtils.get31LatitudeY(p.preciseY), MapUtils.get31LongitudeX(p.preciseX)); sr.connectionPoint = new LatLon(MapUtils.get31LatitudeY(p.preciseY), MapUtils.get31LongitudeX(p.preciseX));
sr.regionFP = road.region.getFilePointer(); sr.regionFP = road.region.getFilePointer();
sr.regionLen = road.region.getLength(); sr.regionLen = road.region.getLength();
List<RouteRegion> plst = streetNames.get(sr.streetName); if (streetNames.add(sr.streetName)) {
if (plst == null) {
plst = new ArrayList<BinaryMapRouteReaderAdapter.RouteRegion>();
streetNames.put(sr.streetName, plst);
}
if (!plst.contains(road.region)) {
plst.add(road.region);
lst.add(sr); lst.add(sr);
} }
} }
@ -282,12 +276,10 @@ public class GeocodingUtilities {
} else { } else {
Collections.sort(streetsList, DISTANCE_COMPARATOR); Collections.sort(streetsList, DISTANCE_COMPARATOR);
double streetDistance = 0; double streetDistance = 0;
boolean isBuildingFound = knownMinBuildingDistance > 0;
for (GeocodingResult street : streetsList) { for (GeocodingResult street : streetsList) {
if (streetDistance == 0) { if (streetDistance == 0) {
streetDistance = street.getDistance(); streetDistance = street.getDistance();
} else if (streetDistance > 0 && street.getDistance() > streetDistance + DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME && } else if (street.getDistance() > streetDistance + DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME) {
isBuildingFound) {
continue; continue;
} }
street.connectionPoint = road.connectionPoint; street.connectionPoint = road.connectionPoint;
@ -298,7 +290,6 @@ public class GeocodingUtilities {
if (knownMinBuildingDistance == 0) { if (knownMinBuildingDistance == 0) {
GeocodingResult firstBld = it.next(); GeocodingResult firstBld = it.next();
knownMinBuildingDistance = firstBld.getDistance(); knownMinBuildingDistance = firstBld.getDistance();
isBuildingFound = true;
res.add(firstBld); res.add(firstBld);
} }
while (it.hasNext()) { while (it.hasNext()) {
@ -317,50 +308,6 @@ public class GeocodingUtilities {
return res; return res;
} }
public void filterDuplicateRegionResults(final List<GeocodingResult> 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<GeocodingResult> loadStreetBuildings(final GeocodingResult road, BinaryMapIndexReader reader, private List<GeocodingResult> loadStreetBuildings(final GeocodingResult road, BinaryMapIndexReader reader,
GeocodingResult street) throws IOException { GeocodingResult street) throws IOException {
final List<GeocodingResult> streetBuildings = new ArrayList<GeocodingResult>(); final List<GeocodingResult> streetBuildings = new ArrayList<GeocodingResult>();

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,26 +0,0 @@
package net.osmand.binary;
import net.osmand.router.RouteDataResources;
public class RouteDataBundle extends StringBundle {
private RouteDataResources resources;
public RouteDataBundle(RouteDataResources resources) {
this.resources = resources;
}
public RouteDataBundle(RouteDataResources resources, StringBundle bundle) {
super(bundle.getMap());
this.resources = resources;
}
@Override
public StringBundle newInstance() {
return new RouteDataBundle(resources);
}
public RouteDataResources getResources() {
return resources;
}
}

View file

@ -1,26 +1,24 @@
package net.osmand.binary; 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.data.LatLon;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import net.osmand.util.TransliterationHelper;
import org.apache.commons.logging.Log; import gnu.trove.map.hash.TIntObjectHashMap;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Arrays; import java.util.Arrays;
import gnu.trove.map.hash.TIntObjectHashMap; import net.osmand.Location;
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;
public class RouteDataObject { public class RouteDataObject {
/*private */static final int RESTRICTION_SHIFT = 3; /*private */static final int RESTRICTION_SHIFT = 3;
/*private */static final int RESTRICTION_MASK = 7; /*private */static final int RESTRICTION_MASK = 7;
public static int HEIGHT_UNDEFINED = -80000; public static int HEIGHT_UNDEFINED = -80000;
public final RouteRegion region; public final RouteRegion region;
// all these arrays supposed to be immutable! // all these arrays supposed to be immutable!
// These fields accessible from C++ // These fields accessible from C++
@ -38,13 +36,11 @@ public class RouteDataObject {
public int[] nameIds; public int[] nameIds;
// mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2 // mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2
public float[] heightDistanceArray = null; public float[] heightDistanceArray = null;
public float heightByCurrentLocation = Float.NaN;
private static final Log LOG = PlatformUtil.getLog(RouteDataObject.class);
public RouteDataObject(RouteRegion region) { public RouteDataObject(RouteRegion region) {
this.region = region; this.region = region;
} }
public RouteDataObject(RouteRegion region, int[] nameIds, String[] nameValues) { public RouteDataObject(RouteRegion region, int[] nameIds, String[] nameValues) {
this.region = region; this.region = region;
this.nameIds = nameIds; this.nameIds = nameIds;
@ -62,7 +58,6 @@ public class RouteDataObject {
this.pointsY = copy.pointsY; this.pointsY = copy.pointsY;
this.types = copy.types; this.types = copy.types;
this.names = copy.names; this.names = copy.names;
this.nameIds = copy.nameIds;
this.restrictions = copy.restrictions; this.restrictions = copy.restrictions;
this.restrictionsVia = copy.restrictionsVia; this.restrictionsVia = copy.restrictionsVia;
this.pointTypes = copy.pointTypes; this.pointTypes = copy.pointTypes;
@ -70,7 +65,7 @@ public class RouteDataObject {
this.pointNameTypes = copy.pointNameTypes; this.pointNameTypes = copy.pointNameTypes;
this.id = copy.id; this.id = copy.id;
} }
public boolean compareRoute(RouteDataObject thatObj) { public boolean compareRoute(RouteDataObject thatObj) {
if (this.id == thatObj.id if (this.id == thatObj.id
&& Arrays.equals(this.pointsX, thatObj.pointsX) && Arrays.equals(this.pointsX, thatObj.pointsX)
@ -81,11 +76,11 @@ public class RouteDataObject {
if (thatObj.region == null) { if (thatObj.region == null) {
throw new IllegalStateException("Illegal routing object: " + thatObj.id); throw new IllegalStateException("Illegal routing object: " + thatObj.id);
} }
boolean equals = true; boolean equals = true;
equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions); equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions);
equals = equals && Arrays.equals(this.restrictionsVia, thatObj.restrictionsVia); equals = equals && Arrays.equals(this.restrictionsVia, thatObj.restrictionsVia);
if (equals) { if (equals) {
if (this.types == null || thatObj.types == null) { if (this.types == null || thatObj.types == null) {
equals = this.types == thatObj.types; equals = this.types == thatObj.types;
@ -127,7 +122,7 @@ public class RouteDataObject {
equals = this.pointTypes[i] == thatObj.pointTypes[i]; equals = this.pointTypes[i] == thatObj.pointTypes[i];
} else if (pointTypes[i].length != thatObj.pointTypes[i].length) { } else if (pointTypes[i].length != thatObj.pointTypes[i].length) {
equals = false; equals = false;
} else { } else {
for (int j = 0; j < this.pointTypes[i].length && equals; j++) { for (int j = 0; j < this.pointTypes[i].length && equals; j++) {
String thisTag = region.routeEncodingRules.get(pointTypes[i][j]).getTag(); String thisTag = region.routeEncodingRules.get(pointTypes[i][j]).getTag();
String thisValue = region.routeEncodingRules.get(pointTypes[i][j]).getValue(); String thisValue = region.routeEncodingRules.get(pointTypes[i][j]).getValue();
@ -150,7 +145,7 @@ public class RouteDataObject {
equals = this.pointNameTypes[i] == thatObj.pointNameTypes[i]; equals = this.pointNameTypes[i] == thatObj.pointNameTypes[i];
} else if (pointNameTypes[i].length != thatObj.pointNameTypes[i].length) { } else if (pointNameTypes[i].length != thatObj.pointNameTypes[i].length) {
equals = false; equals = false;
} else { } else {
for (int j = 0; j < this.pointNameTypes[i].length && equals; j++) { for (int j = 0; j < this.pointNameTypes[i].length && equals; j++) {
String thisTag = region.routeEncodingRules.get(pointNameTypes[i][j]).getTag(); String thisTag = region.routeEncodingRules.get(pointNameTypes[i][j]).getTag();
String thisValue = pointNames[i][j]; String thisValue = pointNames[i][j];
@ -166,84 +161,66 @@ public class RouteDataObject {
} }
return false; return false;
} }
public float[] calculateHeightArray() { public float[] calculateHeightArray() {
return calculateHeightArray(null); if(heightDistanceArray != null) {
}
public float[] calculateHeightArray(LatLon currentLocation) {
if (heightDistanceArray != null) {
return heightDistanceArray; return heightDistanceArray;
} }
int startHeight = Algorithms.parseIntSilently(getValue("osmand_ele_start"), HEIGHT_UNDEFINED); int startHeight = Algorithms.parseIntSilently(getValue("osmand_ele_start"), HEIGHT_UNDEFINED);
int endHeight = Algorithms.parseIntSilently(getValue("osmand_ele_end"), startHeight); int endHeight = Algorithms.parseIntSilently(getValue("osmand_ele_end"), startHeight);
if (startHeight == HEIGHT_UNDEFINED) { if(startHeight == HEIGHT_UNDEFINED) {
heightDistanceArray = new float[0]; heightDistanceArray = new float[0];
return heightDistanceArray; return heightDistanceArray;
} }
heightDistanceArray = new float[2 * getPointsLength()]; heightDistanceArray = new float[2*getPointsLength()];
double plon = 0; double plon = 0;
double plat = 0; double plat = 0;
float prevHeight = startHeight; float prevHeight = startHeight;
heightByCurrentLocation = Float.NaN; for(int k = 0; k < getPointsLength(); k++) {
double prevDistance = 0;
for (int k = 0; k < getPointsLength(); k++) {
double lon = MapUtils.get31LongitudeX(getPoint31XTile(k)); double lon = MapUtils.get31LongitudeX(getPoint31XTile(k));
double lat = MapUtils.get31LatitudeY(getPoint31YTile(k)); double lat = MapUtils.get31LatitudeY(getPoint31YTile(k));
if (k > 0) { if(k > 0) {
double dd = MapUtils.getDistance(plat, plon, lat, lon); double dd = MapUtils.getDistance(plat, plon, lat, lon);
float height = HEIGHT_UNDEFINED; float height = HEIGHT_UNDEFINED;
if (k == getPointsLength() - 1) { if(k == getPointsLength() - 1) {
height = endHeight; height = endHeight;
} else { } else {
String asc = getValue(k, "osmand_ele_asc"); String asc = getValue(k, "osmand_ele_asc");
if (asc != null && asc.length() > 0) { if(asc != null && asc.length() > 0) {
height = (prevHeight + Float.parseFloat(asc)); height = (prevHeight + Float.parseFloat(asc));
} else { } else {
String desc = getValue(k, "osmand_ele_desc"); String desc = getValue(k, "osmand_ele_desc");
if (desc != null && desc.length() > 0) { if(desc != null && desc.length() > 0) {
height = (prevHeight - Float.parseFloat(desc)); height = (prevHeight - Float.parseFloat(desc));
} }
} }
} }
heightDistanceArray[2 * k] = (float) dd; heightDistanceArray[2*k] = (float) dd;
heightDistanceArray[2 * k + 1] = height; heightDistanceArray[2*k+1] = height;
if(height != HEIGHT_UNDEFINED) {
if (currentLocation != null) {
double distance = MapUtils.getDistance(currentLocation, lat, lon);
if (height != HEIGHT_UNDEFINED && distance < prevDistance) {
prevDistance = distance;
heightByCurrentLocation = height;
}
}
if (height != HEIGHT_UNDEFINED) {
// interpolate undefined // interpolate undefined
double totalDistance = dd; double totalDistance = dd;
int startUndefined = k; int startUndefined = k;
while (startUndefined - 1 >= 0 && heightDistanceArray[2 * (startUndefined - 1) + 1] == HEIGHT_UNDEFINED) { while(startUndefined - 1 >= 0 && heightDistanceArray[2*(startUndefined - 1)+1] == HEIGHT_UNDEFINED) {
startUndefined--; startUndefined --;
totalDistance += heightDistanceArray[2 * (startUndefined)]; totalDistance += heightDistanceArray[2*(startUndefined)];
} }
if (totalDistance > 0) { if(totalDistance > 0) {
double angle = (height - prevHeight) / totalDistance; double angle = (height - prevHeight) / totalDistance;
for (int j = startUndefined; j < k; j++) { for(int j = startUndefined; j < k; j++) {
heightDistanceArray[2 * j + 1] = (float) ((heightDistanceArray[2 * j] * angle) + heightDistanceArray[2 * j - 1]); heightDistanceArray[2*j+1] = (float) ((heightDistanceArray[2*j] * angle) + heightDistanceArray[2*j-1]);
} }
} }
prevHeight = height; prevHeight = height;
} }
} else { } else {
heightDistanceArray[0] = 0; heightDistanceArray[0] = 0;
heightDistanceArray[1] = startHeight; heightDistanceArray[1] = startHeight;
} }
plat = lat; plat = lat;
plon = lon; plon = lon;
if (currentLocation != null) {
prevDistance = MapUtils.getDistance(currentLocation, plat, plon);
}
} }
return heightDistanceArray; return heightDistanceArray;
} }
@ -251,46 +228,46 @@ public class RouteDataObject {
public long getId() { public long getId() {
return id; return id;
} }
public String getName() { public String getName(){
if (names != null) { if(names != null ) {
return names.get(region.nameTypeRule); return names.get(region.nameTypeRule);
} }
return null; return null;
} }
public String getName(String lang){
public String getName(String lang) {
return getName(lang, false); return getName(lang, false);
} }
public String getName(String lang, boolean transliterate) { public String getName(String lang, boolean transliterate){
if (names != null) { if(names != null ) {
if (Algorithms.isEmpty(lang)) { if(Algorithms.isEmpty(lang)) {
return names.get(region.nameTypeRule); return names.get(region.nameTypeRule);
} }
int[] kt = names.keys(); int[] kt = names.keys();
for (int i = 0; i < kt.length; i++) { for(int i = 0 ; i < kt.length; i++) {
int k = kt[i]; int k = kt[i];
if (region.routeEncodingRules.size() > k) { if(region.routeEncodingRules.size() > k) {
if (("name:" + lang).equals(region.routeEncodingRules.get(k).getTag())) { if(("name:"+lang).equals(region.routeEncodingRules.get(k).getTag())) {
return names.get(k); return names.get(k);
} }
} }
} }
String nmDef = names.get(region.nameTypeRule); String nmDef = names.get(region.nameTypeRule);
if (transliterate && nmDef != null && nmDef.length() > 0) { if(transliterate && nmDef != null && nmDef.length() > 0) {
return TransliterationHelper.transliterate(nmDef); return TransliterationHelper.transliterate(nmDef);
} }
return nmDef; return nmDef;
} }
return null; return null;
} }
public int[] getNameIds() { public int[] getNameIds() {
return nameIds; return nameIds;
} }
public TIntObjectHashMap<String> getNames() { public TIntObjectHashMap<String> getNames() {
return names; return names;
} }
@ -300,20 +277,20 @@ public class RouteDataObject {
// return getDestinationRef(direction); // return getDestinationRef(direction);
//} //}
if (names != null) { if (names != null) {
if (Algorithms.isEmpty(lang)) { if(Algorithms.isEmpty(lang)) {
return names.get(region.refTypeRule); return names.get(region.refTypeRule);
} }
int[] kt = names.keys(); int[] kt = names.keys();
for (int i = 0; i < kt.length; i++) { for(int i = 0 ; i < kt.length; i++) {
int k = kt[i]; int k = kt[i];
if (region.routeEncodingRules.size() > k) { if(region.routeEncodingRules.size() > k) {
if (("ref:" + lang).equals(region.routeEncodingRules.get(k).getTag())) { if(("ref:"+lang).equals(region.routeEncodingRules.get(k).getTag())) {
return names.get(k); return names.get(k);
} }
} }
} }
String refDefault = names.get(region.refTypeRule); String refDefault = names.get(region.refTypeRule);
if (transliterate && refDefault != null && refDefault.length() > 0) { if(transliterate && refDefault != null && refDefault.length() > 0) {
return TransliterationHelper.transliterate(refDefault); return TransliterationHelper.transliterate(refDefault);
} }
return refDefault; return refDefault;
@ -328,13 +305,13 @@ public class RouteDataObject {
String refTagDefault = "destination:ref"; String refTagDefault = "destination:ref";
String refDefault = null; String refDefault = null;
for (int i = 0; i < kt.length; i++) { for(int i = 0 ; i < kt.length; i++) {
int k = kt[i]; int k = kt[i];
if (region.routeEncodingRules.size() > k) { if(region.routeEncodingRules.size() > k) {
if (refTag.equals(region.routeEncodingRules.get(k).getTag())) { if(refTag.equals(region.routeEncodingRules.get(k).getTag())) {
return names.get(k); return names.get(k);
} }
if (refTagDefault.equals(region.routeEncodingRules.get(k).getTag())) { if(refTagDefault.equals(region.routeEncodingRules.get(k).getTag())) {
refDefault = names.get(k); refDefault = names.get(k);
} }
} }
@ -347,12 +324,12 @@ public class RouteDataObject {
return null; return null;
} }
public String getDestinationName(String lang, boolean transliterate, boolean direction) { public String getDestinationName(String lang, boolean transliterate, boolean direction){
//Issue #3289: Treat destination:ref like a destination, not like a ref //Issue #3289: Treat destination:ref like a destination, not like a ref
String destRef = ((getDestinationRef(direction) == null) || getDestinationRef(direction).equals(getRef(lang, transliterate, direction))) ? "" : getDestinationRef(direction); String destRef = ((getDestinationRef(direction) == null) || getDestinationRef(direction).equals(getRef(lang, transliterate, direction))) ? "" : getDestinationRef(direction);
String destRef1 = Algorithms.isEmpty(destRef) ? "" : destRef + ", "; String destRef1 = ("".equals(destRef)) ? "" : destRef + ", ";
if (names != null) { if(names != null) {
int[] kt = names.keys(); int[] kt = names.keys();
// Issue #3181: Parse destination keys in this order: // Issue #3181: Parse destination keys in this order:
@ -362,39 +339,39 @@ public class RouteDataObject {
// destination // destination
String destinationTagLangFB = "destination:lang:XX"; String destinationTagLangFB = "destination:lang:XX";
if (!Algorithms.isEmpty(lang)) { if(!Algorithms.isEmpty(lang)) {
destinationTagLangFB = (direction == true) ? "destination:lang:" + lang + ":forward" : "destination:lang:" + lang + ":backward"; destinationTagLangFB = (direction == true) ? "destination:lang:" + lang + ":forward" : "destination:lang:" + lang + ":backward";
} }
String destinationTagFB = (direction == true) ? "destination:forward" : "destination:backward"; String destinationTagFB = (direction == true) ? "destination:forward" : "destination:backward";
String destinationTagLang = "destination:lang:XX"; String destinationTagLang = "destination:lang:XX";
if (!Algorithms.isEmpty(lang)) { if(!Algorithms.isEmpty(lang)) {
destinationTagLang = "destination:lang:" + lang; destinationTagLang = "destination:lang:" + lang;
} }
String destinationTagDefault = "destination"; String destinationTagDefault = "destination";
String destinationDefault = null; String destinationDefault = null;
for (int i = 0; i < kt.length; i++) { for(int i = 0 ; i < kt.length; i++) {
int k = kt[i]; int k = kt[i];
if (region.routeEncodingRules.size() > k) { if(region.routeEncodingRules.size() > k) {
if (!Algorithms.isEmpty(lang) && destinationTagLangFB.equals(region.routeEncodingRules.get(k).getTag())) { if(!Algorithms.isEmpty(lang) && destinationTagLangFB.equals(region.routeEncodingRules.get(k).getTag())) {
return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(names.get(k)) : names.get(k)); return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(names.get(k)) : names.get(k));
} }
if (destinationTagFB.equals(region.routeEncodingRules.get(k).getTag())) { if(destinationTagFB.equals(region.routeEncodingRules.get(k).getTag())) {
return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(names.get(k)) : names.get(k)); return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(names.get(k)) : names.get(k));
} }
if (!Algorithms.isEmpty(lang) && destinationTagLang.equals(region.routeEncodingRules.get(k).getTag())) { if(!Algorithms.isEmpty(lang) && destinationTagLang.equals(region.routeEncodingRules.get(k).getTag())) {
return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(names.get(k)) : names.get(k)); return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(names.get(k)) : names.get(k));
} }
if (destinationTagDefault.equals(region.routeEncodingRules.get(k).getTag())) { if(destinationTagDefault.equals(region.routeEncodingRules.get(k).getTag())) {
destinationDefault = names.get(k); destinationDefault = names.get(k);
} }
} }
} }
if (destinationDefault != null) { if(destinationDefault != null) {
return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(destinationDefault) : destinationDefault); return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(destinationDefault) : destinationDefault);
} }
} }
return Algorithms.isEmpty(destRef) ? null : destRef; return "".equals(destRef) ? null : destRef;
} }
public int getPoint31XTile(int i) { public int getPoint31XTile(int i) {
@ -416,54 +393,47 @@ public class RouteDataObject {
public int getRestrictionType(int i) { public int getRestrictionType(int i) {
return (int) (restrictions[i] & RESTRICTION_MASK); return (int) (restrictions[i] & RESTRICTION_MASK);
} }
public RestrictionInfo getRestrictionInfo(int k) { public RestrictionInfo getRestrictionInfo(int k) {
RestrictionInfo ri = new RestrictionInfo(); RestrictionInfo ri = new RestrictionInfo();
ri.toWay = getRestrictionId(k); ri.toWay = getRestrictionId(k);
ri.type = getRestrictionType(k); ri.type = getRestrictionType(k);
if (restrictionsVia != null && k < restrictionsVia.length) { if(restrictionsVia != null && k < restrictionsVia.length) {
ri.viaWay = restrictionsVia[k]; ri.viaWay = restrictionsVia[k];
} }
return ri; return ri;
} }
public long getRestrictionVia(int i) { public long getRestrictionVia(int i) {
if (restrictionsVia != null && restrictionsVia.length > i) { if(restrictionsVia != null && restrictionsVia.length > i) {
return restrictionsVia[i]; return restrictionsVia[i];
} }
return 0; return 0;
} }
public long getRestrictionId(int i) { public long getRestrictionId(int i) {
return restrictions[i] >> RESTRICTION_SHIFT; return restrictions[i] >> RESTRICTION_SHIFT;
} }
public boolean hasPointTypes() { public boolean hasPointTypes() {
return pointTypes != null; return pointTypes != null;
} }
public boolean hasPointNames() { public boolean hasPointNames() {
return pointNames != null; return pointNames != null;
} }
public void insert(int pos, int x31, int y31) { public void insert(int pos, int x31, int y31) {
int[] opointsX = pointsX; int[] opointsX = pointsX;
int[] opointsY = pointsY; int[] opointsY = pointsY;
int[][] opointTypes = pointTypes; int[][] opointTypes = pointTypes;
String[][] opointNames = pointNames;
int[][] opointNameTypes = pointNameTypes;
pointsX = new int[pointsX.length + 1]; pointsX = new int[pointsX.length + 1];
pointsY = new int[pointsY.length + 1]; pointsY = new int[pointsY.length + 1];
boolean insTypes = this.pointTypes != null && this.pointTypes.length > pos; boolean insTypes = this.pointTypes != null && this.pointTypes.length > pos;
boolean insNames = this.pointNames != null && this.pointNames.length > pos;
if (insTypes) { if (insTypes) {
pointTypes = new int[opointTypes.length + 1][]; pointTypes = new int[opointTypes.length + 1][];
} }
if (insNames) {
pointNames = new String[opointNames.length + 1][];
pointNameTypes = new int[opointNameTypes.length + 1][];
}
int i = 0; int i = 0;
for (; i < pos; i++) { for (; i < pos; i++) {
pointsX[i] = opointsX[i]; pointsX[i] = opointsX[i];
@ -471,42 +441,28 @@ public class RouteDataObject {
if (insTypes) { if (insTypes) {
pointTypes[i] = opointTypes[i]; pointTypes[i] = opointTypes[i];
} }
if (insNames) {
pointNames[i] = opointNames[i];
pointNameTypes[i] = opointNameTypes[i];
}
} }
pointsX[i] = x31; pointsX[i] = x31;
pointsY[i] = y31; pointsY[i] = y31;
if (insTypes) { if (insTypes) {
pointTypes[i] = null; pointTypes[i] = null;
} }
if (insNames) {
pointNames[i] = null;
pointNameTypes[i] = null;
}
for (i = i + 1; i < pointsX.length; i++) { for (i = i + 1; i < pointsX.length; i++) {
pointsX[i] = opointsX[i - 1]; pointsX[i] = opointsX[i - 1];
pointsY[i] = opointsY[i - 1]; pointsY[i] = opointsY[i - 1];
if (insTypes && i < pointTypes.length) { if (insTypes && i < pointTypes.length) {
pointTypes[i] = opointTypes[i - 1]; 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];
}
} }
} }
public String[] getPointNames(int ind) { public String[] getPointNames(int ind) {
if (pointNames == null || ind >= pointNames.length) { if (pointNames == null || ind >= pointNames.length) {
return null; return null;
} }
return pointNames[ind]; return pointNames[ind];
} }
public int[] getPointNameTypes(int ind) { public int[] getPointNameTypes(int ind) {
if (pointNameTypes == null || ind >= pointNameTypes.length) { if (pointNameTypes == null || ind >= pointNameTypes.length) {
return null; return null;
@ -521,28 +477,10 @@ public class RouteDataObject {
return pointTypes[ind]; return pointTypes[ind];
} }
public void removePointType(int ind, int type) {
if (pointTypes != null || ind < pointTypes.length) {
int[] typesArr = pointTypes[ind];
for (int i = 0; i < typesArr.length; i++) {
if (typesArr[i] == type) {
int[] result = new int[typesArr.length - 1];
System.arraycopy(typesArr, 0, result, 0, i);
if (typesArr.length != i) {
System.arraycopy(typesArr, i + 1, result, i, typesArr.length - 1 - i);
pointTypes[ind] = result;
break;
}
}
}
}
}
public int[] getTypes() { public int[] getTypes() {
return types; return types;
} }
public void processConditionalTags(long conditionalTime) { public void processConditionalTags(long conditionalTime) {
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
@ -584,7 +522,7 @@ public class RouteDataObject {
String nonCondTag = rtr.getTag(); String nonCondTag = rtr.getTag();
int ks; int ks;
for (ks = 0; ks < pointTypes[i].length; ks++) { for (ks = 0; ks < pointTypes[i].length; ks++) {
RouteTypeRule toReplace = region.quickGetEncodingRule(pointTypes[i][ks]); RouteTypeRule toReplace = region.quickGetEncodingRule(pointTypes[i][j]);
if (toReplace != null && toReplace.getTag().contentEquals(nonCondTag)) { if (toReplace != null && toReplace.getTag().contentEquals(nonCondTag)) {
break; break;
} }
@ -629,7 +567,7 @@ public class RouteDataObject {
} }
public static float parseSpeed(String v, float def) { public static float parseSpeed(String v, float def) {
if (v.equals("none")) { if(v.equals("none")) {
return RouteDataObject.NONE_MAX_SPEED; return RouteDataObject.NONE_MAX_SPEED;
} else { } else {
int i = Algorithms.findFirstNumberEndIndex(v); int i = Algorithms.findFirstNumberEndIndex(v);
@ -644,7 +582,7 @@ public class RouteDataObject {
} }
return def; return def;
} }
public static float parseLength(String v, float def) { public static float parseLength(String v, float def) {
float f = 0; float f = 0;
// 14'10" 14 - inches, 10 feet // 14'10" 14 - inches, 10 feet
@ -653,21 +591,21 @@ public class RouteDataObject {
f += Float.parseFloat(v.substring(0, i)); f += Float.parseFloat(v.substring(0, i));
String pref = v.substring(i, v.length()).trim(); String pref = v.substring(i, v.length()).trim();
float add = 0; float add = 0;
for (int ik = 0; ik < pref.length(); ik++) { for(int ik = 0; ik < pref.length(); ik++) {
if (Algorithms.isDigit(pref.charAt(ik)) || pref.charAt(ik) == '.' || pref.charAt(ik) == '-') { if(Algorithms.isDigit(pref.charAt(ik)) || pref.charAt(ik) == '.' || pref.charAt(ik) == '-') {
int first = Algorithms.findFirstNumberEndIndex(pref.substring(ik)); int first = Algorithms.findFirstNumberEndIndex(pref.substring(ik));
if (first != -1) { if(first != -1) {
add = parseLength(pref.substring(ik), 0); add = parseLength(pref.substring(ik), 0);
pref = pref.substring(0, ik); pref = pref.substring(0, ik);
} }
break; break;
} }
} }
if (pref.contains("km")) { if(pref.contains("km")) {
f *= 1000; f *= 1000;
} }
if (pref.contains("\"") || pref.contains("in")) { if(pref.contains("\"") || pref.contains("in")) {
f *= 0.0254; f *= 0.0254;
} else if (pref.contains("\'") || pref.contains("ft") || pref.contains("feet")) { } else if (pref.contains("\'") || pref.contains("ft") || pref.contains("feet")) {
// foot to meters // foot to meters
f *= 0.3048; f *= 0.3048;
@ -680,7 +618,7 @@ public class RouteDataObject {
} }
return def; return def;
} }
public static float parseWeightInTon(String v, float def) { public static float parseWeightInTon(String v, float def) {
int i = Algorithms.findFirstNumberEndIndex(v); int i = Algorithms.findFirstNumberEndIndex(v);
if (i > 0) { if (i > 0) {
@ -693,7 +631,7 @@ public class RouteDataObject {
} }
return def; return def;
} }
public boolean loop() { public boolean loop() {
return pointsX[0] == pointsX[pointsX.length - 1] && pointsY[0] == pointsY[pointsY.length - 1]; return pointsX[0] == pointsX[pointsX.length - 1] && pointsY[0] == pointsY[pointsY.length - 1];
} }
@ -712,27 +650,27 @@ public class RouteDataObject {
return false; return false;
} }
public boolean roundabout() { public boolean roundabout(){
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for(int i=0; i<sz; i++) {
RouteTypeRule r = region.quickGetEncodingRule(types[i]); RouteTypeRule r = region.quickGetEncodingRule(types[i]);
if (r.roundabout()) { if(r.roundabout()) {
return true; return true;
} else if (r.onewayDirection() != 0 && loop()) { } else if(r.onewayDirection() != 0 && loop()) {
return true; return true;
} }
} }
return false; return false;
} }
public boolean tunnel() { public boolean tunnel(){
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for(int i=0; i<sz; i++) {
RouteTypeRule r = region.quickGetEncodingRule(types[i]); RouteTypeRule r = region.quickGetEncodingRule(types[i]);
if (r.getTag().equals("tunnel") && r.getValue().equals("yes")) { if(r.getTag().equals("tunnel") && r.getValue().equals("yes")) {
return true; return true;
} }
if (r.getTag().equals("layer") && r.getValue().equals("-1")) { if(r.getTag().equals("layer") && r.getValue().equals("-1")) {
return true; return true;
} }
} }
@ -816,7 +754,7 @@ public class RouteDataObject {
} }
return 0; return 0;
} }
public String getRoute() { public String getRoute() {
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
@ -865,7 +803,7 @@ public class RouteDataObject {
} }
return null; return null;
} }
public String getValue(int pnt, String tag) { public String getValue(int pnt, String tag) {
if (pointTypes != null && pnt < pointTypes.length && pointTypes[pnt] != null) { if (pointTypes != null && pnt < pointTypes.length && pointTypes[pnt] != null) {
for (int i = 0; i < pointTypes[pnt].length; i++) { for (int i = 0; i < pointTypes[pnt].length; i++) {
@ -885,7 +823,7 @@ public class RouteDataObject {
} }
return null; return null;
} }
public static String getHighway(int[] types, RouteRegion region) { public static String getHighway(int[] types, RouteRegion region) {
String highway = null; String highway = null;
int sz = types.length; int sz = types.length;
@ -898,7 +836,7 @@ public class RouteDataObject {
} }
return highway; return highway;
} }
public int getLanes() { public int getLanes() {
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
@ -910,7 +848,7 @@ public class RouteDataObject {
} }
return -1; return -1;
} }
public double directionRoute(int startPoint, boolean plus) { public double directionRoute(int startPoint, boolean plus) {
// same goes to C++ // same goes to C++
// Victor : the problem to put more than 5 meters that BinaryRoutePlanner will treat // Victor : the problem to put more than 5 meters that BinaryRoutePlanner will treat
@ -921,13 +859,13 @@ public class RouteDataObject {
public boolean bearingVsRouteDirection(Location loc) { public boolean bearingVsRouteDirection(Location loc) {
boolean direction = true; boolean direction = true;
if (loc != null && loc.hasBearing()) { if(loc != null && loc.hasBearing()) {
double diff = MapUtils.alignAngleDifference(directionRoute(0, true) - loc.getBearing() / 180f * Math.PI); double diff = MapUtils.alignAngleDifference(directionRoute(0, true) - loc.getBearing() / 180f * Math.PI);
direction = Math.abs(diff) < Math.PI / 2f; direction = Math.abs(diff) < Math.PI / 2f;
} }
return direction; return direction;
} }
public boolean isRoadDeleted() { public boolean isRoadDeleted() {
int[] pt = getTypes(); int[] pt = getTypes();
int sz = pt.length; int sz = pt.length;
@ -971,19 +909,19 @@ public class RouteDataObject {
} }
public double distance(int startPoint, int endPoint) { public double distance(int startPoint, int endPoint) {
if (startPoint > endPoint) { if(startPoint > endPoint) {
int k = endPoint; int k = endPoint;
endPoint = startPoint; endPoint = startPoint;
startPoint = k; startPoint = k;
} }
double d = 0; double d = 0;
for (int k = startPoint; k < endPoint && k < getPointsLength() - 1; k++) { for(int k = startPoint; k < endPoint && k < getPointsLength() -1; k++) {
int x = getPoint31XTile(k); int x = getPoint31XTile(k);
int y = getPoint31YTile(k); int y = getPoint31YTile(k);
int kx = getPoint31XTile(k + 1); int kx = getPoint31XTile(k + 1);
int ky = getPoint31YTile(k + 1); int ky = getPoint31YTile(k + 1);
d += simplifyDistance(kx, ky, x, y); d += simplifyDistance(kx, ky, x, y);
} }
return d; return d;
} }
@ -1013,43 +951,43 @@ public class RouteDataObject {
// translate into meters // translate into meters
total += simplifyDistance(x, y, px, py); total += simplifyDistance(x, y, px, py);
} while (total < dist); } while (total < dist);
return -Math.atan2(x - px, y - py); return -Math.atan2( x - px, y - py );
} }
private double simplifyDistance(int x, int y, int px, int py) { private double simplifyDistance(int x, int y, int px, int py) {
return Math.abs(px - x) * 0.011d + Math.abs(py - y) * 0.01863d; return Math.abs(px - x) * 0.011d + Math.abs(py - y) * 0.01863d;
} }
private static void assertTrueLength(String vl, float exp) { private static void assertTrueLength(String vl, float exp){
float dest = parseLength(vl, 0); float dest = parseLength(vl, 0);
if (exp != dest) { if(exp != dest) {
System.err.println("FAIL " + vl + " " + dest); System.err.println("FAIL " + vl + " " + dest);
} else { } else {
System.out.println("OK " + vl); System.out.println("OK " + vl);
} }
} }
public static void main(String[] args) { public static void main(String[] args) {
assertTrueLength("10 km", 10000); assertTrueLength("10 km", 10000);
assertTrueLength("0.01 km", 10); assertTrueLength("0.01 km", 10);
assertTrueLength("0.01 km 10 m", 20); assertTrueLength("0.01 km 10 m", 20);
assertTrueLength("10 m", 10); assertTrueLength("10 m", 10);
assertTrueLength("10m", 10); assertTrueLength("10m", 10);
assertTrueLength("3.4 m", 3.4f); assertTrueLength("3.4 m", 3.4f);
assertTrueLength("3.40 m", 3.4f); assertTrueLength("3.40 m", 3.4f);
assertTrueLength("10 m 10m", 20); assertTrueLength("10 m 10m", 20);
assertTrueLength("14'10\"", 4.5212f); assertTrueLength("14'10\"", 4.5212f);
assertTrueLength("14.5'", 4.4196f); assertTrueLength("14.5'", 4.4196f);
assertTrueLength("14.5 ft", 4.4196f); assertTrueLength("14.5 ft", 4.4196f);
assertTrueLength("14'0\"", 4.2672f); assertTrueLength("14'0\"", 4.2672f);
assertTrueLength("15ft", 4.572f); assertTrueLength("15ft", 4.572f);
assertTrueLength("15 ft 1 in", 4.5974f); assertTrueLength("15 ft 1 in", 4.5974f);
assertTrueLength("4.1 metres", 4.1f); assertTrueLength("4.1 metres", 4.1f);
assertTrueLength("14'0''", 4.2672f); assertTrueLength("14'0''", 4.2672f);
assertTrueLength("14 feet", 4.2672f); assertTrueLength("14 feet", 4.2672f);
assertTrueLength("14 mile", 22530.76f); assertTrueLength("14 mile", 22530.76f);
assertTrueLength("14 cm", 0.14f); assertTrueLength("14 cm", 0.14f);
// float badValue = -1; // float badValue = -1;
// assertTrueLength("none", badValue); // assertTrueLength("none", badValue);
// assertTrueLength("m 4.1", badValue); // assertTrueLength("m 4.1", badValue);
@ -1074,28 +1012,18 @@ public class RouteDataObject {
return MessageFormat.format("Road id {0} name {1} ref {2}", (getId() / 64) + "", name == null ? "" : name, return MessageFormat.format("Road id {0} name {1} ref {2}", (getId() / 64) + "", name == null ? "" : name,
rf == null ? "" : rf); rf == null ? "" : rf);
} }
public boolean hasNameTagStartsWith(String tagStartsWith) {
for (int nm = 0; nameIds != null && nm < nameIds.length; nm++) {
RouteTypeRule rtr = region.quickGetEncodingRule(nameIds[nm]);
if (rtr != null && rtr.getTag().startsWith(tagStartsWith)) {
return true;
}
}
return false;
}
public static class RestrictionInfo { public static class RestrictionInfo {
public int type; public int type;
public long toWay; public long toWay;
public long viaWay; public long viaWay;
public RestrictionInfo next; // optional to simulate linked list public RestrictionInfo next; // optional to simulate linked list
public int length() { public int length() {
if (next == null) { if(next == null) {
return 1; return 1;
} }
return next.length() + 1; return next.length() + 1;
} }
} }
@ -1103,19 +1031,21 @@ public class RouteDataObject {
public void setRestriction(int k, long to, int type, long viaWay) { public void setRestriction(int k, long to, int type, long viaWay) {
long valto = (to << RouteDataObject.RESTRICTION_SHIFT) | ((long) type & RouteDataObject.RESTRICTION_MASK); long valto = (to << RouteDataObject.RESTRICTION_SHIFT) | ((long) type & RouteDataObject.RESTRICTION_MASK);
restrictions[k] = valto; restrictions[k] = valto;
if (viaWay != 0) { if(viaWay != 0) {
setRestrictionVia(k, viaWay); setRestrictionVia(k, viaWay);
} }
} }
public void setRestrictionVia(int k, long viaWay) { public void setRestrictionVia(int k, long viaWay) {
if (restrictionsVia != null) { if(restrictionsVia != null) {
long[] nrestrictionsVia = new long[Math.max(k + 1, restrictions.length)]; long[] nrestrictionsVia = new long[Math.max(k + 1, restrictions.length)];
System.arraycopy(restrictions, 0, nrestrictionsVia, 0, restrictions.length); System.arraycopy(restrictions, 0, nrestrictionsVia, 0, restrictions.length);
restrictionsVia = nrestrictionsVia; restrictionsVia = nrestrictionsVia;
} else { } else {
restrictionsVia = new long[k + 1]; restrictionsVia = new long[k + 1];
} }
restrictionsVia[k] = viaWay; restrictionsVia[k] = viaWay;
} }
} }

View file

@ -1,426 +0,0 @@
package net.osmand.binary;
import net.osmand.util.Algorithms;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import gnu.trove.iterator.TIntObjectIterator;
import gnu.trove.map.hash.TIntObjectHashMap;
public class StringBundle {
private static final DecimalFormat TWO_DIGITS_FORMATTER = new DecimalFormat("#.##");
private static final DecimalFormat THREE_DIGITS_FORMATTER = new DecimalFormat("#.###");
private static final DecimalFormat FOUR_DIGITS_FORMATTER = new DecimalFormat("#.####");
private static final DecimalFormat FIVE_DIGITS_FORMATTER = new DecimalFormat("#.#####");
private static final DecimalFormat SIX_DIGITS_FORMATTER = new DecimalFormat("#.######");
private Map<String, Item<?>> map = new LinkedHashMap<>();
public enum ItemType {
STRING,
LIST,
MAP
}
public StringBundle() {
}
protected StringBundle(Map<String, Item<?>> map) {
this.map = map;
}
public StringBundle newInstance() {
return new StringBundle();
}
public static abstract class Item<T> {
private String name;
private ItemType type;
private T value;
private Item(String name, ItemType type, T value) {
this.name = name;
this.type = type;
this.value = value;
}
public String getName() {
return name;
}
public ItemType getType() {
return type;
}
public T getValue() {
return value;
}
}
public static class StringItem extends Item<String> {
private StringItem(String name, String value) {
super(name, ItemType.STRING, value);
}
private StringItem(String name, int value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private StringItem(String name, long value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private StringItem(String name, float value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private StringItem(String name, float value, int maxDigits) {
super(name, ItemType.STRING, getFormattedValue(value, maxDigits));
}
private StringItem(String name, boolean value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private static String getFormattedValue(float value, int maxDigits) {
DecimalFormat formatter = null;
if (maxDigits == 2) {
formatter = TWO_DIGITS_FORMATTER;
} else if (maxDigits == 3) {
formatter = THREE_DIGITS_FORMATTER;
} else if (maxDigits == 4) {
formatter = FOUR_DIGITS_FORMATTER;
} else if (maxDigits == 5) {
formatter = FIVE_DIGITS_FORMATTER;
} else if (maxDigits == 6) {
formatter = SIX_DIGITS_FORMATTER;
}
return formatter != null ? formatter.format(value) : String.valueOf(value);
}
private int asInt(int defaultValue) {
try {
return Integer.parseInt(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private long asLong(long defaultValue) {
try {
return Long.parseLong(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private float asFloat(float defaultValue) {
try {
return Float.parseFloat(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private boolean asBoolean(boolean defaultValue) {
try {
return Boolean.parseBoolean(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private int[] asIntArray(int[] defaultValue) {
try {
return stringToIntArray(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private int[][] asIntIntArray(int[][] defaultValue) {
try {
return stringToIntIntArray(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
}
public static class StringListItem extends Item<List<Item<?>>> {
private StringListItem(String name, List<Item<?>> list) {
super(name, ItemType.LIST, list);
}
}
public static class StringMapItem extends Item<Map<String, Item<?>>> {
private StringMapItem(String name, Map<String, Item<?>> map) {
super(name, ItemType.MAP, map);
}
}
public static class StringBundleItem extends StringMapItem {
private StringBundleItem(String name, StringBundle bundle) {
super(name, bundle.map);
}
}
public Map<String, Item<?>> getMap() {
return Collections.unmodifiableMap(map);
}
public Item<?> getItem(String key) {
return map.get(key);
}
public void putInt(String key, int value) {
map.put(key, new StringItem(key, value));
}
public int getInt(String key, int defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asInt(defaultValue) : defaultValue;
}
public void putLong(String key, long value) {
map.put(key, new StringItem(key, value));
}
public long getLong(String key, long defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asLong(defaultValue) : defaultValue;
}
public void putFloat(String key, float value) {
map.put(key, new StringItem(key, value));
}
public void putFloat(String key, float value, int maxDigits) {
map.put(key, new StringItem(key, value, maxDigits));
}
public float getFloat(String key, float defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asFloat(defaultValue) : defaultValue;
}
public void putBoolean(String key, boolean value) {
map.put(key, new StringItem(key, value));
}
public boolean getBoolean(String key, boolean defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asBoolean(defaultValue) : defaultValue;
}
public void putString(String key, String value) {
if (value != null) {
map.put(key, new StringItem(key, value));
}
}
public String getString(String key, String defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).getValue() : defaultValue;
}
public void putBundleList(String key, String itemName, List<StringBundle> list) {
if (list != null) {
List<Item<?>> itemList = new ArrayList<>();
for (StringBundle bundle : list) {
itemList.add(new StringBundleItem(itemName, bundle));
}
map.put(key, new StringListItem(key, itemList));
}
}
public void putBundle(String key, StringBundle bundle) {
map.put(key, new StringBundleItem(key, bundle));
}
public void putArray(String key, int[] array) {
if (array != null) {
map.put(key, new StringItem(key, intArrayToString(array)));
}
}
public int[] getIntArray(String key, int[] defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asIntArray(defaultValue) : defaultValue;
}
public void putArray(String key, int[][] array) {
if (array != null) {
map.put(key, new StringItem(key, intIntArrayToString(array)));
}
}
public int[][] getIntIntArray(String key, int[][] defaultValue) {
Item<?> item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asIntIntArray(defaultValue) : defaultValue;
}
public void putArray(String key, long[] array) {
if (array != null) {
map.put(key, new StringItem(key, longArrayToString(array)));
}
}
public void putArray(String key, float[] array) {
if (array != null) {
map.put(key, new StringItem(key, floatArrayToString(array)));
}
}
public <T> void putMap(String key, TIntObjectHashMap<T> map) {
if (map != null) {
StringBundle bundle = newInstance();
TIntObjectIterator<T> it = map.iterator();
while (it.hasNext()) {
it.advance();
int k = it.key();
T v = it.value();
bundle.putString(String.valueOf(k), String.valueOf(v));
}
this.map.put(key, new StringBundleItem(key, bundle));
}
}
public <K, V> void putMap(String key, Map<K, V> map) {
if (map != null) {
StringBundle bundle = newInstance();
for (Entry<K, V> entry : map.entrySet()) {
bundle.putString(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
this.map.put(key, new StringBundleItem(key, bundle));
}
}
private static String intArrayToString(int[] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (int value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
private static int[] stringToIntArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(",");
int[] res = new int[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Integer.parseInt(items[i]);
}
return res;
}
private static String longArrayToString(long[] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (long value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
private static long[] stringToLongArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(",");
long[] res = new long[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Integer.parseInt(items[i]);
}
return res;
}
private static String floatArrayToString(float[] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (float value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
private static float[] stringToFloatArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(",");
float[] res = new float[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Float.parseFloat(items[i]);
}
return res;
}
private static String intIntArrayToString(int[][] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < a.length; i++) {
if (i > 0) {
b.append(";");
}
int[] arr = a[i];
if (arr != null && arr.length > 0) {
b.append(intArrayToString(arr));
}
}
return b.toString();
}
private static int[][] stringToIntIntArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(";");
int[][] res = new int[items.length][];
for (int i = 0; i < items.length; i++) {
String item = items[i];
if (Algorithms.isEmpty(item)) {
res[i] = null;
} else {
String[] subItems = item.split(",");
res[i] = new int[subItems.length];
for (int k = 0; k < subItems.length; k++) {
res[i][k] = Integer.parseInt(subItems[k]);
}
}
}
return res;
}
}

View file

@ -1,12 +0,0 @@
package net.osmand.binary;
public abstract class StringBundleReader {
private StringBundle bundle = new StringBundle();
public StringBundle getBundle() {
return bundle;
}
public abstract void readBundle();
}

Some files were not shown because too many files have changed in this diff Show more