Compare commits
70 commits
master
...
android_ht
Author | SHA1 | Date | |
---|---|---|---|
|
419edcac29 | ||
|
b5a24dc23b | ||
|
9a35b70773 | ||
|
31a3ec3b05 | ||
|
dcc05f7129 | ||
|
e070f5be94 | ||
|
b708f8e6ff | ||
|
65e8328a0c | ||
|
1d3849ef4d | ||
|
98f0823bbb | ||
|
ff236c7d81 | ||
|
d62a92b5e8 | ||
|
c914e18fc1 | ||
|
1b85b5a732 | ||
|
ad82cd419f | ||
|
9d37cff564 | ||
|
d0c6270a00 | ||
|
6c86997d2c | ||
|
2cd4e23463 | ||
|
576e70a606 | ||
|
ce2b0eacbf | ||
|
2851fd38cd | ||
|
463679afd3 | ||
|
ad444aadaf | ||
|
2442759d07 | ||
|
b779b8b61f | ||
|
f34b1fdf11 | ||
|
a92bac55f7 | ||
|
96653b3749 | ||
|
ee54d374ff | ||
|
2b9db97fb7 | ||
|
b3cb492558 | ||
|
08ab7a6613 | ||
|
150e769709 | ||
|
485ee88a13 | ||
|
aeff02d633 | ||
|
b4d4e79b6a | ||
|
cdde9f3960 | ||
|
23b871ee22 | ||
|
7ae7f45c48 | ||
|
cb9c141c64 | ||
|
9ed5eb95c7 | ||
|
aa1932e3d2 | ||
|
fbeba45ada | ||
|
9fc7d9ef26 | ||
|
96ad964beb | ||
|
920241a043 | ||
|
8505f67d68 | ||
|
8dd5bda3fc | ||
|
9112d4a34f | ||
|
edb3aede9e | ||
|
a7633b2031 | ||
|
fef6f93621 | ||
|
9823461435 | ||
|
d1451e9889 | ||
|
c436b1dcb8 | ||
|
b846969e49 | ||
|
2f1707167c | ||
|
656a316f87 | ||
|
c81e5a88ae | ||
|
2869cae3a0 | ||
|
1f8dbb7694 | ||
|
71c895c81e | ||
|
40bc660320 | ||
|
c0c07b95c2 | ||
|
065755d5b2 | ||
|
8f4b8c8349 | ||
|
3ad4e5fc71 | ||
|
409aa0574a | ||
|
c2395016f9 |
1772 changed files with 71540 additions and 129491 deletions
18
.github/ISSUE_TEMPLATE/2-bug-report.md
vendored
18
.github/ISSUE_TEMPLATE/2-bug-report.md
vendored
|
@ -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.
|
12
.github/ISSUE_TEMPLATE/2-faq-report.md
vendored
Normal file
12
.github/ISSUE_TEMPLATE/2-faq-report.md
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
name: "📚 Outdated FAQ"
|
||||
about: Report an issue in FAQ
|
||||
|
||||
---
|
||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
||||
|
||||
Please do not file FAQ issues on the GitHub issues tracker.
|
||||
|
||||
Instead use the [Google group](https://groups.google.com/forum/#!forum/osmand) to fix wrong or outdated FAQ.
|
||||
|
||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
69
.github/ISSUE_TEMPLATE/3-bug-report.md
vendored
Normal file
69
.github/ISSUE_TEMPLATE/3-bug-report.md
vendored
Normal file
|
@ -0,0 +1,69 @@
|
|||
---
|
||||
name: "\U0001F41E Bug report"
|
||||
about: Report a bug 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:
|
||||
|
||||
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
|
||||
|
||||
# 🐞 bug report
|
||||
|
||||
### 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: ....
|
||||
|
||||
|
||||
### Description
|
||||
|
||||
<!-- ✍️--> A clear and concise description of the problem...
|
||||
|
||||
|
||||
## 🔬 Minimal Reproduction
|
||||
<!--
|
||||
If the bug is reproducible, please describe steps below:
|
||||
-->
|
||||
<!-- ✍️--> 1. Open app, and click on ...
|
||||
|
||||
## 🔥 Exception or Error
|
||||
<pre><code>
|
||||
<!-- If the issue is accompanied by an exception or an error, please share it below: -->
|
||||
<!-- ✍️-->
|
||||
|
||||
</code></pre>
|
||||
|
||||
|
||||
## 🌍 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?**
|
|
@ -2,7 +2,6 @@
|
|||
name: "\U0001F6A9 Routing report"
|
||||
about: Report a routing issue in OsmAnd
|
||||
---
|
||||
|
||||
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
||||
|
||||
Oh hi there! 😄
|
||||
|
@ -27,12 +26,10 @@ Please give us the following information so that we can try to **reproduce** you
|
|||
### 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
|
||||
|
@ -41,7 +38,6 @@ Please give us the following information so that we can try to **reproduce** you
|
|||
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?
|
||||
|
@ -49,10 +45,9 @@ Also, a permalink from [openstreetmap.org](https://www.openstreetmap.org/) can b
|
|||
<!-- Did this behavior use to work in the previous version? -->
|
||||
<!-- ✍️--> Yes, the previous version in which this bug was not present was: ....
|
||||
|
||||
## 🌍 Your Environment
|
||||
## 🌍 Your Environment
|
||||
|
||||
**OsmAnd Version:**
|
||||
|
||||
<pre><code>
|
||||
<!-- paste version below -->
|
||||
<!-- ✍️-->
|
||||
|
@ -62,11 +57,10 @@ Also, a permalink from [openstreetmap.org](https://www.openstreetmap.org/) can b
|
|||
**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. -->
|
||||
- [ ] 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?**
|
|
@ -1,18 +1,18 @@
|
|||
---
|
||||
name: "\U0001F680 Feature request"
|
||||
about: Suggest a feature for OsmAnd
|
||||
---
|
||||
|
||||
---
|
||||
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
||||
|
||||
Oh hi there! 😄
|
||||
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.
|
||||
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.
|
||||
|
@ -22,13 +22,12 @@ Please be sure to read our [FAQ](https://osmand.net/help-online) before creating
|
|||
# 🚀 feature request
|
||||
|
||||
### Description
|
||||
<!-- ✍️--> A clear and concise description of the problem or missing capability...
|
||||
|
||||
<!-- ✍️ 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
|
||||
|
||||
### Describe alternatives you've considered
|
||||
<!-- ✍️--> Have you considered any alternative solutions or workarounds?
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -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
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -16,14 +16,9 @@ OsmAndCore_*.aar
|
|||
*.iml
|
||||
.settings
|
||||
.idea
|
||||
**/.project
|
||||
**/.classpath
|
||||
.project
|
||||
out/
|
||||
|
||||
# Huawei
|
||||
agconnect-services.json
|
||||
OsmAndHms.jks
|
||||
|
||||
# Android Studio
|
||||
/.idea
|
||||
*.iml
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
apply plugin: 'com.android.library'
|
||||
apply plugin: 'ivy-publish'
|
||||
apply plugin: 'com.github.dcendents.android-maven'
|
||||
|
||||
group = 'com.github.osmandapp.osmand'
|
||||
version = '2.0.0'
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
|
@ -25,33 +26,6 @@ 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 {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation 'com.android.support:support-annotations:28.0.0'
|
||||
|
@ -64,4 +38,4 @@ task sourcesJar(type: Jar) {
|
|||
|
||||
artifacts {
|
||||
archives sourcesJar
|
||||
}
|
||||
}
|
|
@ -2,7 +2,6 @@ package net.osmand.aidlapi;
|
|||
|
||||
import net.osmand.aidlapi.map.ALatLon;
|
||||
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.AddFavoriteGroupParams;
|
||||
|
@ -21,8 +20,6 @@ import net.osmand.aidlapi.mapmarker.UpdateMapMarkerParams;
|
|||
|
||||
import net.osmand.aidlapi.calculateroute.CalculateRouteParams;
|
||||
|
||||
import net.osmand.aidlapi.profile.ExportProfileParams;
|
||||
|
||||
import net.osmand.aidlapi.gpx.ImportGpxParams;
|
||||
import net.osmand.aidlapi.gpx.ShowGpxParams;
|
||||
import net.osmand.aidlapi.gpx.StartGpxRecordingParams;
|
||||
|
@ -78,9 +75,6 @@ import net.osmand.aidlapi.customization.OsmandSettingsInfoParams;
|
|||
import net.osmand.aidlapi.customization.CustomizationInfoParams;
|
||||
import net.osmand.aidlapi.customization.ProfileSettingsParams;
|
||||
import net.osmand.aidlapi.customization.MapMarginsParams;
|
||||
import net.osmand.aidlapi.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.AGpxFileDetails;
|
||||
|
@ -93,9 +87,6 @@ import net.osmand.aidlapi.copyfile.CopyFileParams;
|
|||
|
||||
import net.osmand.aidlapi.navigation.ANavigationUpdateParams;
|
||||
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.UpdateContextMenuButtonsParams;
|
||||
|
@ -112,8 +103,6 @@ import net.osmand.aidlapi.events.AKeyEventsParams;
|
|||
|
||||
import net.osmand.aidlapi.info.AppInfoParams;
|
||||
|
||||
import net.osmand.aidlapi.profile.ExportProfileParams;
|
||||
|
||||
// NOTE: Add new methods at the end of file!!!
|
||||
|
||||
interface IOsmAndAidlInterface {
|
||||
|
@ -878,30 +867,4 @@ interface IOsmAndAidlInterface {
|
|||
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);
|
||||
}
|
|
@ -4,14 +4,12 @@ public interface OsmAndCustomizationConstants {
|
|||
|
||||
// Navigation Drawer:
|
||||
String DRAWER_ITEM_ID_SCHEME = "drawer.action.";
|
||||
String DRAWER_SWITCH_PROFILE_ID = DRAWER_ITEM_ID_SCHEME + "switch_profile";
|
||||
String DRAWER_CONFIGURE_PROFILE_ID = DRAWER_ITEM_ID_SCHEME + "configure_profile";
|
||||
String DRAWER_DASHBOARD_ID = DRAWER_ITEM_ID_SCHEME + "dashboard";
|
||||
String DRAWER_MAP_MARKERS_ID = DRAWER_ITEM_ID_SCHEME + "map_markers";
|
||||
String DRAWER_MY_PLACES_ID = DRAWER_ITEM_ID_SCHEME + "my_places";
|
||||
String DRAWER_SEARCH_ID = DRAWER_ITEM_ID_SCHEME + "search";
|
||||
String DRAWER_WEBSERVER_ID = DRAWER_ITEM_ID_SCHEME + "server";
|
||||
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_DOWNLOAD_MAPS_ID = DRAWER_ITEM_ID_SCHEME + "download_maps";
|
||||
String DRAWER_OSMAND_LIVE_ID = DRAWER_ITEM_ID_SCHEME + "osmand_live";
|
||||
|
|
|
@ -9,21 +9,12 @@ import net.osmand.aidlapi.AidlParams;
|
|||
|
||||
public class CopyFileParams extends AidlParams {
|
||||
|
||||
public static final String DESTINATION_DIR_KEY = "destinationDir";
|
||||
public static final String FILE_NAME_KEY = "fileName";
|
||||
public static final String FILE_PART_DATA_KEY = "filePartData";
|
||||
public static final String START_TIME_KEY = "startTime";
|
||||
public static final String DONE_KEY = "done";
|
||||
private String destinationDir;
|
||||
private String fileName;
|
||||
private byte[] filePartData;
|
||||
private long startTime;
|
||||
private boolean done;
|
||||
|
||||
public CopyFileParams(@NonNull String destinationDir, @NonNull String fileName, @NonNull byte[] filePartData,
|
||||
long startTime, boolean done) {
|
||||
|
||||
this.destinationDir = destinationDir;
|
||||
public CopyFileParams(@NonNull String fileName, @NonNull byte[] filePartData, long startTime, boolean done) {
|
||||
this.fileName = fileName;
|
||||
this.filePartData = filePartData;
|
||||
this.startTime = startTime;
|
||||
|
@ -46,10 +37,6 @@ public class CopyFileParams extends AidlParams {
|
|||
}
|
||||
};
|
||||
|
||||
public String getDestinationDir() {
|
||||
return destinationDir;
|
||||
}
|
||||
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
@ -68,26 +55,23 @@ public class CopyFileParams extends AidlParams {
|
|||
|
||||
@Override
|
||||
public void writeToBundle(Bundle bundle) {
|
||||
bundle.putString(DESTINATION_DIR_KEY, destinationDir);
|
||||
bundle.putString(FILE_NAME_KEY, fileName);
|
||||
bundle.putByteArray(FILE_PART_DATA_KEY, filePartData);
|
||||
bundle.putLong(START_TIME_KEY, startTime);
|
||||
bundle.putBoolean(DONE_KEY, done);
|
||||
bundle.putString("fileName", fileName);
|
||||
bundle.putByteArray("filePartData", filePartData);
|
||||
bundle.putLong("startTime", startTime);
|
||||
bundle.putBoolean("done", done);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readFromBundle(Bundle bundle) {
|
||||
destinationDir = bundle.getString(DESTINATION_DIR_KEY);
|
||||
fileName = bundle.getString(FILE_NAME_KEY);
|
||||
filePartData = bundle.getByteArray(FILE_PART_DATA_KEY);
|
||||
startTime = bundle.getLong(START_TIME_KEY);
|
||||
done = bundle.getBoolean(DONE_KEY);
|
||||
fileName = bundle.getString("fileName");
|
||||
filePartData = bundle.getByteArray("filePartData");
|
||||
startTime = bundle.getLong("startTime");
|
||||
done = bundle.getBoolean("done");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CopyFileParams {" +
|
||||
" destinationDir=" + destinationDir +
|
||||
" fileName=" + fileName +
|
||||
", filePartData size=" + filePartData.length +
|
||||
", startTime=" + startTime +
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.customization;
|
||||
|
||||
parcelable AProfile;
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.customization;
|
||||
|
||||
parcelable CustomPluginParams;
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -3,31 +3,18 @@ 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 String appModeKey;
|
||||
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);
|
||||
}
|
||||
public MapMarginsParams(String appModeKey, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
|
||||
this.appModeKey = appModeKey;
|
||||
this.leftMargin = leftMargin;
|
||||
this.topMargin = topMargin;
|
||||
this.rightMargin = rightMargin;
|
||||
|
@ -50,8 +37,8 @@ public class MapMarginsParams extends AidlParams {
|
|||
}
|
||||
};
|
||||
|
||||
public List<String> getAppModesKeys() {
|
||||
return appModesKeys;
|
||||
public String getAppModeKey() {
|
||||
return appModeKey;
|
||||
}
|
||||
|
||||
public int getLeftMargin() {
|
||||
|
@ -72,19 +59,19 @@ public class MapMarginsParams extends AidlParams {
|
|||
|
||||
@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);
|
||||
bundle.putString("appModeKey", appModeKey);
|
||||
bundle.putInt("leftMargin", leftMargin);
|
||||
bundle.putInt("topMargin", topMargin);
|
||||
bundle.putInt("rightMargin", rightMargin);
|
||||
bundle.putInt("bottomMargin", bottomMargin);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readFromBundle(Bundle bundle) {
|
||||
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);
|
||||
appModeKey = bundle.getString("appModeKey");
|
||||
leftMargin = bundle.getInt("leftMargin");
|
||||
topMargin = bundle.getInt("topMargin");
|
||||
rightMargin = bundle.getInt("rightMargin");
|
||||
bottomMargin = bundle.getInt("bottomMargin");
|
||||
}
|
||||
}
|
|
@ -5,42 +5,17 @@ import android.os.Bundle;
|
|||
import android.os.Parcel;
|
||||
|
||||
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 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 String latestChanges;
|
||||
private int version;
|
||||
private List<String> settingsTypeKeyList = new ArrayList<>();
|
||||
private boolean silent;
|
||||
private boolean replace;
|
||||
|
||||
public ProfileSettingsParams(Uri profileSettingsUri, List<AExportSettingsType> settingsTypeList, boolean replace,
|
||||
boolean silent, String latestChanges, int version) {
|
||||
public ProfileSettingsParams(Uri profileSettingsUri, String latestChanges, int version) {
|
||||
this.profileSettingsUri = profileSettingsUri;
|
||||
for (AExportSettingsType settingsType : settingsTypeList) {
|
||||
settingsTypeKeyList.add(settingsType.name());
|
||||
}
|
||||
this.replace = replace;
|
||||
this.latestChanges = latestChanges;
|
||||
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) {
|
||||
|
@ -71,35 +46,17 @@ public class ProfileSettingsParams extends AidlParams {
|
|||
return profileSettingsUri;
|
||||
}
|
||||
|
||||
public List<String> getSettingsTypeKeys() {
|
||||
return settingsTypeKeyList;
|
||||
}
|
||||
|
||||
public boolean isReplace() {
|
||||
return replace;
|
||||
}
|
||||
|
||||
public boolean isSilent() {
|
||||
return silent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToBundle(Bundle bundle) {
|
||||
bundle.putInt(VERSION_KEY, version);
|
||||
bundle.putString(LATEST_CHANGES_KEY, latestChanges);
|
||||
bundle.putParcelable(PROFILE_SETTINGS_URI_KEY, profileSettingsUri);
|
||||
bundle.putStringArrayList(SETTINGS_TYPE_KEY, new ArrayList<>(settingsTypeKeyList));
|
||||
bundle.putBoolean(REPLACE_KEY, replace);
|
||||
bundle.putBoolean(SILENT_IMPORT_KEY, silent);
|
||||
bundle.putInt("version", version);
|
||||
bundle.putString("latestChanges", latestChanges);
|
||||
bundle.putParcelable("profileSettingsUri", profileSettingsUri);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readFromBundle(Bundle bundle) {
|
||||
version = bundle.getInt(VERSION_KEY);
|
||||
latestChanges = bundle.getString(LATEST_CHANGES_KEY);
|
||||
profileSettingsUri = bundle.getParcelable(PROFILE_SETTINGS_URI_KEY);
|
||||
settingsTypeKeyList = bundle.getStringArrayList(SETTINGS_TYPE_KEY);
|
||||
replace = bundle.getBoolean(REPLACE_KEY);
|
||||
silent = bundle.getBoolean(SILENT_IMPORT_KEY);
|
||||
version = bundle.getInt("version");
|
||||
latestChanges = bundle.getString("latestChanges");
|
||||
profileSettingsUri = bundle.getParcelable("profileSettingsUri");
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.customization;
|
||||
|
||||
parcelable SelectProfileParams;
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.map;
|
||||
|
||||
parcelable ALocation;
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.map;
|
||||
|
||||
parcelable SetLocationParams;
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.navigation;
|
||||
|
||||
parcelable ABlockedRoad;
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.navigation;
|
||||
|
||||
parcelable AddBlockedRoadParams;
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -11,18 +11,15 @@ public class NavigateGpxParams extends AidlParams {
|
|||
private String data;
|
||||
private Uri uri;
|
||||
private boolean force;
|
||||
private boolean needLocationPermission;
|
||||
|
||||
public NavigateGpxParams(String data, boolean force, boolean needLocationPermission) {
|
||||
public NavigateGpxParams(String data, boolean force) {
|
||||
this.data = data;
|
||||
this.force = force;
|
||||
this.needLocationPermission = needLocationPermission;
|
||||
}
|
||||
|
||||
public NavigateGpxParams(Uri uri, boolean force, boolean needLocationPermission) {
|
||||
public NavigateGpxParams(Uri uri, boolean force) {
|
||||
this.uri = uri;
|
||||
this.force = force;
|
||||
this.needLocationPermission = needLocationPermission;
|
||||
}
|
||||
|
||||
public NavigateGpxParams(Parcel in) {
|
||||
|
@ -53,16 +50,11 @@ public class NavigateGpxParams extends AidlParams {
|
|||
return force;
|
||||
}
|
||||
|
||||
public boolean isNeedLocationPermission() {
|
||||
return needLocationPermission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToBundle(Bundle bundle) {
|
||||
bundle.putString("data", data);
|
||||
bundle.putParcelable("uri", uri);
|
||||
bundle.putBoolean("force", force);
|
||||
bundle.putBoolean("needLocationPermission", needLocationPermission);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -70,6 +62,5 @@ public class NavigateGpxParams extends AidlParams {
|
|||
data = bundle.getString("data");
|
||||
uri = bundle.getParcelable("uri");
|
||||
force = bundle.getBoolean("force");
|
||||
needLocationPermission = bundle.getBoolean("needLocationPermission");
|
||||
}
|
||||
}
|
|
@ -17,10 +17,8 @@ public class NavigateParams extends AidlParams {
|
|||
private double destLon;
|
||||
|
||||
private boolean force;
|
||||
private boolean needLocationPermission;
|
||||
|
||||
public NavigateParams(String startName, double startLat, double startLon, String destName, double destLat,
|
||||
double destLon, String profile, boolean force, boolean needLocationPermission) {
|
||||
public NavigateParams(String startName, double startLat, double startLon, String destName, double destLat, double destLon, String profile, boolean force) {
|
||||
this.startName = startName;
|
||||
this.startLat = startLat;
|
||||
this.startLon = startLon;
|
||||
|
@ -29,7 +27,6 @@ public class NavigateParams extends AidlParams {
|
|||
this.destLon = destLon;
|
||||
this.profile = profile;
|
||||
this.force = force;
|
||||
this.needLocationPermission = needLocationPermission;
|
||||
}
|
||||
|
||||
public NavigateParams(Parcel in) {
|
||||
|
@ -80,10 +77,6 @@ public class NavigateParams extends AidlParams {
|
|||
return force;
|
||||
}
|
||||
|
||||
public boolean isNeedLocationPermission() {
|
||||
return needLocationPermission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToBundle(Bundle bundle) {
|
||||
bundle.putString("startName", startName);
|
||||
|
@ -94,7 +87,6 @@ public class NavigateParams extends AidlParams {
|
|||
bundle.putDouble("destLon", destLon);
|
||||
bundle.putString("profile", profile);
|
||||
bundle.putBoolean("force", force);
|
||||
bundle.putBoolean("needLocationPermission", needLocationPermission);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -107,6 +99,5 @@ public class NavigateParams extends AidlParams {
|
|||
destLon = bundle.getDouble("destLon");
|
||||
profile = bundle.getString("profile");
|
||||
force = bundle.getBoolean("force");
|
||||
needLocationPermission = bundle.getBoolean("needLocationPermission");
|
||||
}
|
||||
}
|
|
@ -17,11 +17,10 @@ public class NavigateSearchParams extends AidlParams {
|
|||
private double searchLon;
|
||||
|
||||
private boolean force;
|
||||
private boolean needLocationPermission;
|
||||
|
||||
public NavigateSearchParams(String startName, double startLat, double startLon,
|
||||
String searchQuery, double searchLat, double searchLon,
|
||||
String profile, boolean force, boolean needLocationPermission) {
|
||||
String searchQuery, double searchLat, double searchLon,
|
||||
String profile, boolean force) {
|
||||
this.startName = startName;
|
||||
this.startLat = startLat;
|
||||
this.startLon = startLon;
|
||||
|
@ -30,7 +29,6 @@ public class NavigateSearchParams extends AidlParams {
|
|||
this.searchLon = searchLon;
|
||||
this.profile = profile;
|
||||
this.force = force;
|
||||
this.needLocationPermission = needLocationPermission;
|
||||
}
|
||||
|
||||
public NavigateSearchParams(Parcel in) {
|
||||
|
@ -81,10 +79,6 @@ public class NavigateSearchParams extends AidlParams {
|
|||
return force;
|
||||
}
|
||||
|
||||
public boolean isNeedLocationPermission() {
|
||||
return needLocationPermission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToBundle(Bundle bundle) {
|
||||
bundle.putString("startName", startName);
|
||||
|
@ -95,7 +89,6 @@ public class NavigateSearchParams extends AidlParams {
|
|||
bundle.putBoolean("force", force);
|
||||
bundle.putDouble("searchLat", searchLat);
|
||||
bundle.putDouble("searchLon", searchLon);
|
||||
bundle.putBoolean("needLocationPermission", needLocationPermission);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -108,6 +101,5 @@ public class NavigateSearchParams extends AidlParams {
|
|||
force = bundle.getBoolean("force");
|
||||
searchLat = bundle.getDouble("searchLat");
|
||||
searchLon = bundle.getDouble("searchLon");
|
||||
needLocationPermission = bundle.getBoolean("needLocationPermission");
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.navigation;
|
||||
|
||||
parcelable RemoveBlockedRoadParams;
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.profile;
|
||||
|
||||
parcelable AExportSettingsType;
|
|
@ -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;
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package net.osmand.aidlapi.profile;
|
||||
|
||||
parcelable ExportProfileParams;
|
|
@ -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);
|
||||
}
|
||||
}
|
BIN
OsmAnd-java/OsmAnd-core-android.jar
Normal file
BIN
OsmAnd-java/OsmAnd-core-android.jar
Normal file
Binary file not shown.
BIN
OsmAnd-java/OsmAnd-core.jar
Normal file
BIN
OsmAnd-java/OsmAnd-core.jar
Normal file
Binary file not shown.
|
@ -1,7 +1,6 @@
|
|||
apply plugin: 'java'
|
||||
apply plugin: 'maven-publish'
|
||||
apply plugin: 'ivy-publish'
|
||||
|
||||
|
||||
configurations {
|
||||
android
|
||||
}
|
||||
|
@ -86,22 +85,12 @@ artifacts {
|
|||
}
|
||||
|
||||
publishing {
|
||||
repositories {
|
||||
ivy {
|
||||
url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./"
|
||||
}
|
||||
}
|
||||
publications {
|
||||
maven(MavenPublication) {
|
||||
artifactId "osmand-base"
|
||||
from components.java
|
||||
}
|
||||
ivyJava(IvyPublication) {
|
||||
artifact androidJar {
|
||||
classifier 'android'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
@ -115,9 +104,6 @@ dependencies {
|
|||
implementation 'com.moparisthebest:junidecode:0.1.1'
|
||||
implementation 'com.vividsolutions:jts-core:1.14.0'
|
||||
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
|
||||
//implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0'
|
||||
implementation 'net.sf.kxml:kxml2:2.1.8'
|
||||
|
|
|
@ -800,7 +800,7 @@ public abstract class ByteString implements Iterable<Byte> {
|
|||
// Copy the information we need into local variables so as to hold
|
||||
// the lock for as short a time as possible.
|
||||
cachedFlushBuffers =
|
||||
flushedBuffers.toArray(new ByteString[0]);
|
||||
flushedBuffers.toArray(new ByteString[flushedBuffers.size()]);
|
||||
cachedBuffer = buffer;
|
||||
cachedBufferPos = bufferPos;
|
||||
}
|
||||
|
|
|
@ -242,7 +242,8 @@ final class FieldSet<FieldDescriptorType extends
|
|||
|
||||
// Wrap the contents in a new list so that the caller cannot change
|
||||
// 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) {
|
||||
verifyType(descriptor.getLiteType(), element);
|
||||
}
|
||||
|
|
|
@ -14,11 +14,6 @@
|
|||
|
||||
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 {
|
||||
|
||||
/**
|
||||
|
@ -109,15 +104,6 @@ public class MGRSPoint extends ZonedUTMPoint {
|
|||
* an UPPERCASE coordinate string is expected.
|
||||
*/
|
||||
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) {
|
||||
throw new NumberFormatException("MGRSPoint coverting from nothing");
|
||||
}
|
||||
|
@ -647,96 +633,6 @@ public class MGRSPoint extends ZonedUTMPoint {
|
|||
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}
|
||||
*/
|
||||
|
|
|
@ -345,6 +345,7 @@ public final class JtsAdapter {
|
|||
for(int i = 0; i < geom.getNumGeometries(); ++i) {
|
||||
|
||||
final Polygon nextPoly = (Polygon) geom.getGeometryN(i);
|
||||
final List<Integer> nextPolyGeom = new ArrayList<>();
|
||||
boolean valid = true;
|
||||
|
||||
// Add exterior ring
|
||||
|
@ -361,7 +362,7 @@ public final class JtsAdapter {
|
|||
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
|
||||
|
|
|
@ -322,7 +322,7 @@ public final class MvtReader {
|
|||
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);
|
||||
|
||||
} 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 (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();
|
||||
}
|
||||
|
||||
|
@ -533,7 +533,7 @@ public final class MvtReader {
|
|||
|
||||
if (outerPoly != null) {
|
||||
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;
|
||||
|
@ -569,7 +569,7 @@ public final class MvtReader {
|
|||
|
||||
if (outerPoly == null || (outerArea < 0 == area < 0)) {
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -590,7 +590,7 @@ public final class MvtReader {
|
|||
|
||||
if (outerPoly != null) {
|
||||
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;
|
||||
|
|
|
@ -6,7 +6,6 @@ import net.osmand.binary.StringBundle;
|
|||
import net.osmand.binary.StringBundleWriter;
|
||||
import net.osmand.binary.StringBundleXmlWriter;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.router.RouteColorize.ColorizationType;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
@ -53,16 +52,14 @@ public class GPXUtilities {
|
|||
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 NumberFormat latLonFormat = new DecimalFormat("0.00#####", new DecimalFormatSymbols(
|
||||
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")));
|
||||
|
||||
public enum GPXColor {
|
||||
|
@ -73,7 +70,6 @@ public class GPXUtilities {
|
|||
WHITE(0xFFFFFFFF),
|
||||
RED(0xFFFF0000),
|
||||
GREEN(0xFF00FF00),
|
||||
DARKGREEN(0xFF006400),
|
||||
BLUE(0xFF0000FF),
|
||||
YELLOW(0xFFFFFF00),
|
||||
CYAN(0xFF00FFFF),
|
||||
|
@ -228,9 +224,6 @@ public class GPXUtilities {
|
|||
public double hdop = Double.NaN;
|
||||
public float heading = Float.NaN;
|
||||
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 double distance = 0.0; // cumulative distance, if in a track
|
||||
|
||||
|
@ -253,9 +246,6 @@ public class GPXUtilities {
|
|||
this.hdop = wptPt.hdop;
|
||||
this.heading = wptPt.heading;
|
||||
this.deleted = wptPt.deleted;
|
||||
this.speedColor = wptPt.speedColor;
|
||||
this.altitudeColor = wptPt.altitudeColor;
|
||||
this.slopeColor = wptPt.slopeColor;
|
||||
this.colourARGB = wptPt.colourARGB;
|
||||
this.distance = wptPt.distance;
|
||||
}
|
||||
|
@ -318,26 +308,6 @@ public class GPXUtilities {
|
|||
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);
|
||||
}
|
||||
|
@ -354,20 +324,6 @@ public class GPXUtilities {
|
|||
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);
|
||||
}
|
||||
|
@ -418,16 +374,11 @@ public class GPXUtilities {
|
|||
|
||||
public static class TrkSegment extends GPXExtensions {
|
||||
public boolean generalSegment = false;
|
||||
|
||||
public List<WptPt> points = new ArrayList<>();
|
||||
|
||||
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) {
|
||||
return split(getDistanceMetric(), getTimeSplit(), meters, joinSegments);
|
||||
|
@ -442,6 +393,7 @@ public class GPXUtilities {
|
|||
splitSegment(metric, secondaryMetric, metricLimit, splitSegments, this, joinSegments);
|
||||
return convert(splitSegments);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Track extends GPXExtensions {
|
||||
|
@ -477,10 +429,6 @@ public class GPXUtilities {
|
|||
public String getArticleLang() {
|
||||
return getExtensionsToRead().get("article_lang");
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return getExtensionsToRead().get("desc");
|
||||
}
|
||||
}
|
||||
|
||||
public static class Author extends GPXExtensions {
|
||||
|
@ -1113,15 +1061,6 @@ public class GPXUtilities {
|
|||
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);
|
||||
|
@ -1139,6 +1078,9 @@ public class GPXUtilities {
|
|||
private List<WptPt> points = new ArrayList<>();
|
||||
public List<Route> routes = new ArrayList<>();
|
||||
|
||||
public List<RouteSegment> routeSegments = new ArrayList<>();
|
||||
public List<RouteType> routeTypes = new ArrayList<>();
|
||||
|
||||
public Exception error = null;
|
||||
public String path = "";
|
||||
public boolean showCurrentTrack;
|
||||
|
@ -1166,7 +1108,7 @@ public class GPXUtilities {
|
|||
}
|
||||
|
||||
public boolean hasRoute() {
|
||||
return getNonEmptyTrkSegments(true).size() > 0;
|
||||
return !routeSegments.isEmpty() && !routeTypes.isEmpty();
|
||||
}
|
||||
|
||||
public List<WptPt> getPoints() {
|
||||
|
@ -1276,7 +1218,7 @@ public class GPXUtilities {
|
|||
GPXTrackAnalysis g = new GPXTrackAnalysis();
|
||||
g.wptPoints = points.size();
|
||||
g.wptCategoryNames = getWaypointCategories(true);
|
||||
List<SplitSegment> splitSegments = new ArrayList<>();
|
||||
List<SplitSegment> splitSegments = new ArrayList<GPXUtilities.SplitSegment>();
|
||||
for (int i = 0; i < tracks.size(); i++) {
|
||||
Track subtrack = tracks.get(i);
|
||||
for (TrkSegment segment : subtrack.segments) {
|
||||
|
@ -1288,14 +1230,10 @@ public class GPXUtilities {
|
|||
}
|
||||
}
|
||||
}
|
||||
g.prepareInformation(fileTimestamp, splitSegments.toArray(new SplitSegment[0]));
|
||||
g.prepareInformation(fileTimestamp, splitSegments.toArray(new SplitSegment[splitSegments.size()]));
|
||||
return g;
|
||||
}
|
||||
|
||||
public boolean containsRoutePoint(WptPt point) {
|
||||
return getRoutePoints().contains(point);
|
||||
}
|
||||
|
||||
public List<WptPt> getRoutePoints() {
|
||||
List<WptPt> points = new ArrayList<>();
|
||||
for (int i = 0; i < routes.size(); i++) {
|
||||
|
@ -1305,15 +1243,6 @@ public class GPXUtilities {
|
|||
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() {
|
||||
for (Route r : routes) {
|
||||
if (r.points.size() > 0) {
|
||||
|
@ -1389,16 +1318,15 @@ public class GPXUtilities {
|
|||
return pt;
|
||||
}
|
||||
|
||||
public List<TrkSegment> getNonEmptyTrkSegments(boolean routesOnly) {
|
||||
List<TrkSegment> segments = new ArrayList<>();
|
||||
for (Track t : tracks) {
|
||||
public TrkSegment getNonEmptyTrkSegment() {
|
||||
for (GPXUtilities.Track t : tracks) {
|
||||
for (TrkSegment s : t.segments) {
|
||||
if (!s.generalSegment && s.points.size() > 0 && (!routesOnly || s.hasRoute())) {
|
||||
segments.add(s);
|
||||
if (s.points.size() > 0) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
}
|
||||
return segments;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addTrkSegment(List<WptPt> points) {
|
||||
|
@ -1437,8 +1365,8 @@ public class GPXUtilities {
|
|||
return false;
|
||||
}
|
||||
|
||||
public void addRoutePoints(List<WptPt> points, boolean addRoute) {
|
||||
if (routes.size() == 0 || addRoute) {
|
||||
public void addRoutePoints(List<WptPt> points) {
|
||||
if (routes.size() == 0) {
|
||||
Route route = new Route();
|
||||
routes.add(route);
|
||||
}
|
||||
|
@ -1680,7 +1608,7 @@ public class GPXUtilities {
|
|||
bottom = Math.min(bottom, p.getLatitude());
|
||||
}
|
||||
}
|
||||
for (Route route : routes) {
|
||||
for (GPXUtilities.Route route : routes) {
|
||||
for (WptPt p : route.points) {
|
||||
if (left == 0 && right == 0) {
|
||||
left = p.getLongitude();
|
||||
|
@ -1698,16 +1626,16 @@ public class GPXUtilities {
|
|||
return new QuadRect(left, top, right, bottom);
|
||||
}
|
||||
|
||||
public int[] getGradientScaleColor(String gradientScaleType) {
|
||||
public int getGradientScaleColor(String gradientScaleType, int defColor) {
|
||||
String clrValue = null;
|
||||
if (extensions != null) {
|
||||
clrValue = extensions.get(gradientScaleType);
|
||||
}
|
||||
return Algorithms.stringToGradientPalette(clrValue);
|
||||
return parseColor(clrValue, defColor);
|
||||
}
|
||||
|
||||
public void setGradientScaleColor(String gradientScaleType, int[] gradientScalePalette) {
|
||||
getExtensionsToWrite().put(gradientScaleType, Algorithms.gradientPaletteToString(gradientScalePalette));
|
||||
public void setGradientScaleColor(String gradientScaleType, int gradientScaleColor) {
|
||||
getExtensionsToWrite().put(gradientScaleType, Algorithms.colorToString(gradientScaleColor));
|
||||
}
|
||||
|
||||
public String getGradientScaleType() {
|
||||
|
@ -1792,7 +1720,7 @@ public class GPXUtilities {
|
|||
|
||||
public static String asString(GPXFile file) {
|
||||
final Writer writer = new StringWriter();
|
||||
writeGpx(writer, file);
|
||||
GPXUtilities.writeGpx(writer, file);
|
||||
return writer.toString();
|
||||
}
|
||||
|
||||
|
@ -1835,7 +1763,6 @@ public class GPXUtilities {
|
|||
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:osmand", "https://osmand.net");
|
||||
serializer.attribute(null, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
|
||||
serializer.attribute(null, "xsi:schemaLocation",
|
||||
"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd");
|
||||
|
@ -1867,10 +1794,24 @@ public class GPXUtilities {
|
|||
}
|
||||
serializer.endTag(null, "metadata");
|
||||
|
||||
for (WptPt l : file.points) {
|
||||
serializer.startTag(null, "wpt"); //$NON-NLS-1$
|
||||
writeWpt(format, serializer, l);
|
||||
serializer.endTag(null, "wpt"); //$NON-NLS-1$
|
||||
|
||||
for (Track track : file.tracks) {
|
||||
if (!track.generalTrack) {
|
||||
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) {
|
||||
|
@ -1887,27 +1828,13 @@ public class GPXUtilities {
|
|||
serializer.endTag(null, "rte"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
for (Track track : file.tracks) {
|
||||
if (!track.generalTrack) {
|
||||
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$
|
||||
}
|
||||
assignRouteExtensionWriter(segment);
|
||||
writeExtensions(serializer, segment);
|
||||
serializer.endTag(null, "trkseg"); //$NON-NLS-1$
|
||||
}
|
||||
writeExtensions(serializer, track);
|
||||
serializer.endTag(null, "trk"); //$NON-NLS-1$
|
||||
}
|
||||
for (WptPt l : file.points) {
|
||||
serializer.startTag(null, "wpt"); //$NON-NLS-1$
|
||||
writeWpt(format, serializer, l);
|
||||
serializer.endTag(null, "wpt"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
assignRouteExtensionWriter(file);
|
||||
writeExtensions(serializer, file);
|
||||
|
||||
serializer.endTag(null, "gpx"); //$NON-NLS-1$
|
||||
|
@ -1920,19 +1847,19 @@ public class GPXUtilities {
|
|||
return null;
|
||||
}
|
||||
|
||||
private static void assignRouteExtensionWriter(final TrkSegment segment) {
|
||||
if (segment.hasRoute() && segment.getExtensionsWriter() == null) {
|
||||
segment.setExtensionsWriter(new GPXExtensionsWriter() {
|
||||
private static void assignRouteExtensionWriter(final GPXFile gpxFile) {
|
||||
if (gpxFile.hasRoute() && gpxFile.getExtensionsWriter() == null) {
|
||||
gpxFile.setExtensionsWriter(new GPXExtensionsWriter() {
|
||||
@Override
|
||||
public void writeExtensions(XmlSerializer serializer) {
|
||||
StringBundle bundle = new StringBundle();
|
||||
List<StringBundle> segmentsBundle = new ArrayList<>();
|
||||
for (RouteSegment segment : segment.routeSegments) {
|
||||
for (RouteSegment segment : gpxFile.routeSegments) {
|
||||
segmentsBundle.add(segment.toStringBundle());
|
||||
}
|
||||
bundle.putBundleList("route", "segment", segmentsBundle);
|
||||
List<StringBundle> typesBundle = new ArrayList<>();
|
||||
for (RouteType routeType : segment.routeTypes) {
|
||||
for (RouteType routeType : gpxFile.routeTypes) {
|
||||
typesBundle.add(routeType.toStringBundle());
|
||||
}
|
||||
bundle.putBundleList("types", "type", typesBundle);
|
||||
|
@ -1974,16 +1901,13 @@ public class GPXUtilities {
|
|||
}
|
||||
|
||||
private static void writeExtensions(XmlSerializer serializer, GPXExtensions p) throws IOException {
|
||||
writeExtensions(serializer, p.getExtensionsToRead(), p);
|
||||
}
|
||||
|
||||
private static void writeExtensions(XmlSerializer serializer, Map<String, String> extensions, GPXExtensions p) throws IOException {
|
||||
Map<String, String> extensionsToRead = p.getExtensionsToRead();
|
||||
GPXExtensionsWriter extensionsWriter = p.getExtensionsWriter();
|
||||
if (!extensions.isEmpty() || extensionsWriter != null) {
|
||||
if (!extensionsToRead.isEmpty() || extensionsWriter != null) {
|
||||
serializer.startTag(null, "extensions");
|
||||
if (!extensions.isEmpty()) {
|
||||
for (Entry<String, String> s : extensions.entrySet()) {
|
||||
writeNotNullText(serializer,"osmand:" + s.getKey(), s.getValue());
|
||||
if (!extensionsToRead.isEmpty()) {
|
||||
for (Entry<String, String> s : extensionsToRead.entrySet()) {
|
||||
writeNotNullText(serializer, s.getKey(), s.getValue());
|
||||
}
|
||||
}
|
||||
if (extensionsWriter != null) {
|
||||
|
@ -2019,20 +1943,7 @@ public class GPXUtilities {
|
|||
if (!Float.isNaN(p.heading)) {
|
||||
p.getExtensionsToWrite().put("heading", String.valueOf(Math.round(p.heading)));
|
||||
}
|
||||
Map<String, String> extensions = p.getExtensionsToRead();
|
||||
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);
|
||||
}
|
||||
writeExtensions(serializer, p);
|
||||
}
|
||||
|
||||
private static void writeAuthor(XmlSerializer serializer, Author author) throws IOException {
|
||||
|
@ -2188,11 +2099,10 @@ public class GPXUtilities {
|
|||
TrkSegment routeTrackSegment = new TrkSegment();
|
||||
routeTrack.segments.add(routeTrackSegment);
|
||||
Stack<GPXExtensions> parserState = new Stack<>();
|
||||
TrkSegment firstSegment = null;
|
||||
boolean extensionReadMode = false;
|
||||
boolean routePointExtension = false;
|
||||
List<RouteSegment> routeSegments = new ArrayList<>();
|
||||
List<RouteType> routeTypes = new ArrayList<>();
|
||||
List<RouteSegment> routeSegments = gpxFile.routeSegments;
|
||||
List<RouteType> routeTypes = gpxFile.routeTypes;
|
||||
boolean routeExtension = false;
|
||||
boolean typesExtension = false;
|
||||
parserState.push(gpxFile);
|
||||
|
@ -2493,16 +2403,6 @@ public class GPXUtilities {
|
|||
assert pop instanceof Route;
|
||||
} else if (tag.equals("trkseg")) {
|
||||
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;
|
||||
} else if (tag.equals("rpt")) {
|
||||
Object pop = parserState.pop();
|
||||
|
@ -2513,11 +2413,6 @@ public class GPXUtilities {
|
|||
if (!routeTrackSegment.points.isEmpty()) {
|
||||
gpxFile.tracks.add(routeTrack);
|
||||
}
|
||||
if (!routeSegments.isEmpty() && !routeTypes.isEmpty() && firstSegment != null) {
|
||||
firstSegment.routeSegments = routeSegments;
|
||||
firstSegment.routeTypes = routeTypes;
|
||||
}
|
||||
gpxFile.addGeneralTrack();
|
||||
} catch (Exception e) {
|
||||
gpxFile.error = e;
|
||||
log.error("Error reading gpx", e); //$NON-NLS-1$
|
||||
|
@ -2590,7 +2485,7 @@ public class GPXUtilities {
|
|||
if (maxlat == null) {
|
||||
maxlat = parser.getAttributeValue("", "maxLat");
|
||||
}
|
||||
if (maxlon == null) {
|
||||
if (maxlat == null) {
|
||||
maxlon = parser.getAttributeValue("", "maxLon");
|
||||
}
|
||||
|
||||
|
@ -2632,4 +2527,4 @@ public class GPXUtilities {
|
|||
to.error = from.error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -45,7 +45,7 @@ public interface IProgress {
|
|||
public boolean isInterrupted() {return false;}
|
||||
|
||||
@Override
|
||||
public boolean isIndeterminate() {return true;}
|
||||
public boolean isIndeterminate() {return false;}
|
||||
|
||||
@Override
|
||||
public void finishTask() {}
|
||||
|
|
|
@ -14,22 +14,17 @@ public class IndexConstants {
|
|||
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 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_ZIP = ".obf.zip"; //$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_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_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_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_FEET_MAP_INDEX_EXT_ZIP = ".srtmf.obf.zip"; //$NON-NLS-1$
|
||||
public static final String EXTRA_EXT = ".extra";
|
||||
public static final String EXTRA_ZIP_EXT = ".extra.zip";
|
||||
|
||||
|
@ -50,9 +45,6 @@ public class IndexConstants {
|
|||
|
||||
public static final String GPX_FILE_EXT = ".gpx"; //$NON-NLS-1$
|
||||
|
||||
public static final String WPT_CHART_FILE_EXT = ".wpt.chart";
|
||||
public static final String SQLITE_CHART_FILE_EXT = ".3d.chart";
|
||||
|
||||
public final static String POI_TABLE = "poi"; //$NON-NLS-1$
|
||||
|
||||
public static final String INDEX_DOWNLOAD_DOMAIN = "download.osmand.net";
|
||||
|
@ -76,11 +68,9 @@ public class IndexConstants {
|
|||
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 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 TEMP_DIR = "temp/";
|
||||
public static final String ROUTING_PROFILES_DIR = "routing/";
|
||||
public static final String PLUGINS_DIR = "plugins/";
|
||||
|
||||
public static final String VOICE_PROVIDER_SUFFIX = "-tts";
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@ public class LocationConvert {
|
|||
public static final int FORMAT_SECONDS = 2;
|
||||
public static final int UTM_FORMAT = 3;
|
||||
public static final int OLC_FORMAT = 4;
|
||||
public static final int MGRS_FORMAT = 5;
|
||||
private static final char DELIM = ':';
|
||||
private static final char DELIMITER_DEGREES = '°';
|
||||
private static final char DELIMITER_MINUTES = '′';
|
||||
|
|
|
@ -1,23 +1,20 @@
|
|||
package net.osmand;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.util.Calendar;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class Period {
|
||||
|
||||
public enum PeriodUnit {
|
||||
YEAR("Y", Calendar.YEAR),
|
||||
MONTH("M", Calendar.MONTH),
|
||||
WEEK("W", Calendar.WEEK_OF_YEAR),
|
||||
DAY("D", Calendar.DATE);
|
||||
YEAR("Y"),
|
||||
MONTH("M"),
|
||||
WEEK("W"),
|
||||
DAY("D");
|
||||
|
||||
private String unitStr;
|
||||
private int calendarIdx;
|
||||
|
||||
PeriodUnit(String unitStr, int calendarIdx) {
|
||||
this.calendarIdx = calendarIdx;
|
||||
PeriodUnit(String unitStr) {
|
||||
this.unitStr = unitStr;
|
||||
}
|
||||
|
||||
|
@ -25,10 +22,6 @@ public class Period {
|
|||
return unitStr;
|
||||
}
|
||||
|
||||
public int getCalendarIdx() {
|
||||
return calendarIdx;
|
||||
}
|
||||
|
||||
public double getMonthsValue() {
|
||||
switch (this) {
|
||||
case YEAR:
|
||||
|
|
|
@ -23,9 +23,7 @@ public class PlatformUtil {
|
|||
}
|
||||
|
||||
public static XmlPullParser newXMLPullParser() throws XmlPullParserException{
|
||||
org.kxml2.io.KXmlParser xmlParser = new org.kxml2.io.KXmlParser();
|
||||
xmlParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
return xmlParser;
|
||||
return new org.kxml2.io.KXmlParser();
|
||||
}
|
||||
|
||||
public static XmlSerializer newSerializer() {
|
||||
|
|
|
@ -106,11 +106,9 @@ public class TspAnt {
|
|||
// Allocates all memory.
|
||||
// Adds 1 to edge lengths to ensure no zero length edges.
|
||||
public TspAnt readGraph(List<LatLon> intermediates, LatLon start, LatLon end) {
|
||||
boolean keepEndPoint = end != null;
|
||||
List<LatLon> l = new ArrayList<LatLon>();
|
||||
if (start != null) {
|
||||
l.add(start);
|
||||
}
|
||||
boolean keepEndPoint = end != null;
|
||||
List<LatLon> l = new ArrayList<LatLon>();
|
||||
l.add(start);
|
||||
l.addAll(intermediates);
|
||||
if (keepEndPoint) {
|
||||
l.add(end);
|
||||
|
|
|
@ -68,7 +68,7 @@ public class TspHeldKarp {
|
|||
}
|
||||
break;
|
||||
}
|
||||
System.err.print(".");
|
||||
System.err.printf(".");
|
||||
PriorityQueue<Node> children = new PriorityQueue<Node>(11, new NodeComparator());
|
||||
children.add(exclude(currentNode, i, currentNode.parent[i]));
|
||||
for (int j = 0; j < n; j++) {
|
||||
|
|
|
@ -8,7 +8,6 @@ import gnu.trove.set.hash.TIntHashSet;
|
|||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -628,9 +627,7 @@ public class BinaryMapAddressReaderAdapter {
|
|||
indexOffset = codedIS.getTotalBytesRead();
|
||||
int oldLimit = codedIS.pushLimit(length);
|
||||
// here offsets are sorted by distance
|
||||
TIntArrayList charsList = new TIntArrayList();
|
||||
charsList.add(0);
|
||||
map.readIndexedStringTable(stringMatcher.getCollator(), Collections.singletonList(req.nameQuery), "", Collections.singletonList(loffsets), charsList);
|
||||
map.readIndexedStringTable(stringMatcher.getCollator(), req.nameQuery, "", loffsets, 0);
|
||||
codedIS.popLimit(oldLimit);
|
||||
break;
|
||||
case OsmAndAddressNameIndexData.ATOM_FIELD_NUMBER:
|
||||
|
|
|
@ -83,7 +83,7 @@ public class BinaryMapIndexReader {
|
|||
|
||||
public final static int TRANSPORT_STOP_ZOOM = 24;
|
||||
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);
|
||||
public static boolean READ_STATS = false;
|
||||
public static final SearchPoiTypeFilter ACCEPT_ALL_POI_TYPE_FILTER = new SearchPoiTypeFilter() {
|
||||
|
@ -1538,20 +1538,9 @@ public class BinaryMapIndexReader {
|
|||
|
||||
return request;
|
||||
}
|
||||
|
||||
public static SearchRequest<Amenity> buildSearchPoiRequest(LatLon latLon, int radius, int zoom,
|
||||
SearchPoiTypeFilter poiTypeFilter,
|
||||
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) {
|
||||
|
||||
public static SearchRequest<RouteDataObject> buildSearchRouteRequest(int sleft, int sright, int stop, int sbottom,
|
||||
ResultMatcher<RouteDataObject> matcher){
|
||||
SearchRequest<RouteDataObject> request = new SearchRequest<RouteDataObject>();
|
||||
request.left = sleft;
|
||||
request.right = sright;
|
||||
|
@ -1568,10 +1557,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, 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>();
|
||||
request.x = x;
|
||||
request.y = y;
|
||||
|
@ -1579,7 +1564,6 @@ public class BinaryMapIndexReader {
|
|||
request.right = sright;
|
||||
request.top = stop;
|
||||
request.bottom = sbottom;
|
||||
request.poiTypeFilter = poiTypeFilter;
|
||||
request.resultMatcher = resultMatcher;
|
||||
request.rawDataCollector = rawDataCollector;
|
||||
request.nameQuery = nameFilter.trim();
|
||||
|
@ -1727,12 +1711,13 @@ public class BinaryMapIndexReader {
|
|||
double half16t = MapUtils.getDistance(lat, MapUtils.getLongitudeFromTile(16, ((int) dx) + 0.5),
|
||||
lat, MapUtils.getLongitudeFromTile(16, (int) dx));
|
||||
double cf31 = ((double) radiusMeters / (half16t * 2)) * (1 << 15);
|
||||
y = MapUtils.get31TileNumberY(lat);
|
||||
x = MapUtils.get31TileNumberX(lon);
|
||||
left = (int) (x - cf31);
|
||||
right = (int) (x + cf31);
|
||||
top = (int) (y - cf31);
|
||||
bottom = (int) (y + cf31);
|
||||
int y31 = MapUtils.get31TileNumberY(lat);
|
||||
int x31 = MapUtils.get31TileNumberX(lon);
|
||||
left = (int) (x31 - cf31);
|
||||
right = (int) (x31 + cf31);
|
||||
top = (int) (y31 - cf31);
|
||||
bottom = (int) (y31 + cf31);
|
||||
|
||||
}
|
||||
|
||||
public boolean publish(T obj) {
|
||||
|
@ -1769,10 +1754,6 @@ public class BinaryMapIndexReader {
|
|||
return limit != -1 && searchResults.size() > limit;
|
||||
}
|
||||
|
||||
public void setLimit(int limit) {
|
||||
this.limit = limit;
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
if (this.interrupted) {
|
||||
return interrupted;
|
||||
|
@ -2161,9 +2142,9 @@ public class BinaryMapIndexReader {
|
|||
private static boolean testAddressSearch = false;
|
||||
private static boolean testAddressSearchName = false;
|
||||
private static boolean testAddressJustifySearch = false;
|
||||
private static boolean testPoiSearch = true;
|
||||
private static boolean testPoiSearch = 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 sright = MapUtils.get31TileNumberX(27.55317);
|
||||
|
@ -2177,7 +2158,7 @@ public class BinaryMapIndexReader {
|
|||
|
||||
public static void main(String[] args) throws IOException {
|
||||
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");
|
||||
|
||||
|
@ -2325,7 +2306,7 @@ public class BinaryMapIndexReader {
|
|||
|
||||
private static void testPoiSearchByName(BinaryMapIndexReader reader) throws IOException {
|
||||
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);
|
||||
|
||||
reader.searchPoiByName(req);
|
||||
|
@ -2385,72 +2366,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;
|
||||
boolean[] matched = new boolean[matchedCharacters.size()];
|
||||
boolean shouldWeReadSubtable = false;
|
||||
while (true) {
|
||||
int t = codedIS.readTag();
|
||||
int tag = WireFormat.getTagFieldNumber(t);
|
||||
switch (tag) {
|
||||
case 0:
|
||||
return;
|
||||
return charMatches;
|
||||
case OsmandOdb.IndexedStringTable.KEY_FIELD_NUMBER :
|
||||
key = codedIS.readString();
|
||||
if (prefix.length() > 0) {
|
||||
if(prefix.length() > 0){
|
||||
key = prefix + key;
|
||||
}
|
||||
shouldWeReadSubtable = false;
|
||||
for (int i = 0; i < queries.size(); i++) {
|
||||
int charMatches = matchedCharacters.get(i);
|
||||
String query = queries.get(i);
|
||||
matched[i] = false;
|
||||
if (query == null) {
|
||||
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;
|
||||
// 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){
|
||||
charMatches = query.length();
|
||||
list.clear();
|
||||
}
|
||||
} 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;
|
||||
case OsmandOdb.IndexedStringTable.VAL_FIELD_NUMBER :
|
||||
int val = readInt();
|
||||
for (int i = 0; i < queries.size(); i++) {
|
||||
if (matched[i]) {
|
||||
listOffsets.get(i).add(val);
|
||||
}
|
||||
if (key != null) {
|
||||
list.add(val);
|
||||
}
|
||||
break;
|
||||
case OsmandOdb.IndexedStringTable.SUBTABLES_FIELD_NUMBER :
|
||||
int len = codedIS.readRawVarint32();
|
||||
int oldLim = codedIS.pushLimit(len);
|
||||
if (shouldWeReadSubtable && key != null) {
|
||||
List<String> subqueries = new ArrayList<>(queries);
|
||||
// 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);
|
||||
if (key != null) {
|
||||
charMatches = readIndexedStringTable(instance, query, key, list, charMatches);
|
||||
} else {
|
||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
||||
}
|
||||
|
@ -2538,9 +2501,8 @@ public class BinaryMapIndexReader {
|
|||
}
|
||||
}
|
||||
}
|
||||
for (Entry<MapObject, Street> entry : resMap.entrySet()) {
|
||||
MapObject e = entry.getKey();
|
||||
Street s = entry.getValue();
|
||||
for (MapObject e : resMap.keySet()) {
|
||||
Street s = resMap.get(e);
|
||||
if (e instanceof Building && MapUtils.getDistance(e.getLocation(), lat, lon) < 40) {
|
||||
Building b = (Building) e;
|
||||
System.out.println(b.getName() + " " + s);
|
||||
|
|
|
@ -1,21 +1,19 @@
|
|||
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.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedList;
|
||||
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.CollatorStringMatcher;
|
||||
import net.osmand.CollatorStringMatcher.StringMatcherMode;
|
||||
|
@ -30,6 +28,11 @@ import net.osmand.osm.MapPoiTypes;
|
|||
import net.osmand.osm.PoiCategory;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import com.google.protobuf.CodedInputStream;
|
||||
import com.google.protobuf.WireFormat;
|
||||
|
||||
public class BinaryMapPoiReaderAdapter {
|
||||
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 ZOOM_TO_SKIP_FILTER_READ = 6;
|
||||
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 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
|
||||
|
||||
private static final int BUCKET_SEARCH_BY_NAME = 5;
|
||||
|
||||
public static class PoiSubType {
|
||||
public boolean text;
|
||||
|
@ -336,7 +334,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
});
|
||||
int p = BUCKET_SEARCH_BY_NAME * 3;
|
||||
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) {
|
||||
Arrays.sort(offKeys, p, offKeys.length);
|
||||
break;
|
||||
|
@ -348,6 +346,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
LOG.info("Searched poi structure in " + (System.currentTimeMillis() - time) +
|
||||
"ms. Found " + offKeys.length + " subtrees");
|
||||
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 {
|
||||
TIntLongHashMap offsets = new TIntLongHashMap();
|
||||
List<TIntArrayList> listOffsets = null;
|
||||
List<TIntLongHashMap> listOfSepOffsets = new ArrayList<TIntLongHashMap>();
|
||||
TIntArrayList dataOffsets = null;
|
||||
int offset = 0;
|
||||
while (true) {
|
||||
int t = codedIS.readTag();
|
||||
|
@ -385,51 +383,24 @@ public class BinaryMapPoiReaderAdapter {
|
|||
case OsmandOdb.OsmAndPoiNameIndex.TABLE_FIELD_NUMBER: {
|
||||
int length = readInt();
|
||||
int oldLimit = codedIS.pushLimit(length);
|
||||
dataOffsets = new TIntArrayList();
|
||||
offset = codedIS.getTotalBytesRead();
|
||||
List<String> queries = new ArrayList<>();
|
||||
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);
|
||||
map.readIndexedStringTable(instance, query, "", dataOffsets, 0);
|
||||
codedIS.popLimit(oldLimit);
|
||||
break;
|
||||
}
|
||||
case OsmandOdb.OsmAndPoiNameIndex.DATA_FIELD_NUMBER: {
|
||||
if (listOffsets != null) {
|
||||
for (TIntArrayList dataOffsets : listOffsets) {
|
||||
TIntLongHashMap offsetMap = new TIntLongHashMap();
|
||||
listOfSepOffsets.add(offsetMap);
|
||||
dataOffsets.sort(); // 1104125
|
||||
for (int i = 0; i < dataOffsets.size(); i++) {
|
||||
codedIS.seek(dataOffsets.get(i) + offset);
|
||||
int len = codedIS.readRawVarint32();
|
||||
int oldLim = codedIS.pushLimit(len);
|
||||
readPoiNameIndexData(offsetMap, req);
|
||||
codedIS.popLimit(oldLim);
|
||||
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);
|
||||
}
|
||||
if (dataOffsets != null) {
|
||||
dataOffsets.sort(); // 1104125
|
||||
for (int i = 0; i < dataOffsets.size(); i++) {
|
||||
codedIS.seek(dataOffsets.get(i) + offset);
|
||||
int len = codedIS.readRawVarint32();
|
||||
int oldLim = codedIS.pushLimit(len);
|
||||
readPoiNameIndexData(offsets, req);
|
||||
codedIS.popLimit(oldLim);
|
||||
if (req.isCancelled()) {
|
||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
||||
return offsets;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -605,12 +576,13 @@ public class BinaryMapPoiReaderAdapter {
|
|||
}
|
||||
}
|
||||
if (!matches) {
|
||||
for (String key : am.getAdditionalInfoKeys()) {
|
||||
if(!key.contains("_name") &&
|
||||
!key.equals("brand")) {
|
||||
Map<String, String> lt = am.getAdditionalInfo();
|
||||
for (Entry<String, String> e : lt.entrySet()) {
|
||||
if(!e.getKey().contains("_name") &&
|
||||
!e.getKey().equals("brand")) {
|
||||
continue;
|
||||
}
|
||||
matches = matcher.matches(am.getAdditionalInfo(key));
|
||||
matches = matcher.matches(e.getValue());
|
||||
if (matches) {
|
||||
break;
|
||||
}
|
||||
|
@ -719,8 +691,6 @@ public class BinaryMapPoiReaderAdapter {
|
|||
Amenity am = null;
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int precisionXY = 0;
|
||||
boolean hasLocation = false;
|
||||
StringBuilder retValue = new StringBuilder();
|
||||
PoiCategory amenityType = null;
|
||||
LinkedList<String> textTags = null;
|
||||
|
@ -747,22 +717,12 @@ public class BinaryMapPoiReaderAdapter {
|
|||
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;
|
||||
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;
|
||||
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++;
|
||||
if (checkBounds) {
|
||||
if (left31 > x || right31 < x || top31 > y || bottom31 < y) {
|
||||
|
@ -771,8 +731,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
}
|
||||
}
|
||||
am = new Amenity();
|
||||
hasLocation = true;
|
||||
//am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x)); // set precise coordinates
|
||||
am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBoxDataAtom.SUBCATEGORIES_FIELD_NUMBER:
|
||||
int subtypev = codedIS.readUInt32();
|
||||
|
@ -845,11 +804,6 @@ public class BinaryMapPoiReaderAdapter {
|
|||
case OsmandOdb.OsmAndPoiBoxDataAtom.NOTE_FIELD_NUMBER:
|
||||
am.setDescription(codedIS.readString());
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBoxDataAtom.PRECISIONXY_FIELD_NUMBER:
|
||||
if (hasLocation) {
|
||||
precisionXY = codedIS.readInt32();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
skipUnknownField(t);
|
||||
break;
|
||||
|
@ -858,6 +812,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
}
|
||||
|
||||
private boolean checkCategories(SearchRequest<Amenity> req, PoiRegion region) throws IOException {
|
||||
StringBuilder subType = new StringBuilder();
|
||||
while (true) {
|
||||
int t = codedIS.readTag();
|
||||
int tag = WireFormat.getTagFieldNumber(t);
|
||||
|
|
|
@ -1,9 +1,25 @@
|
|||
package net.osmand.binary;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import com.google.protobuf.CodedInputStream;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.google.protobuf.WireFormat;
|
||||
|
||||
import gnu.trove.iterator.TLongObjectIterator;
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import gnu.trove.list.array.TLongArrayList;
|
||||
import gnu.trove.map.hash.TIntObjectHashMap;
|
||||
import gnu.trove.map.hash.TLongObjectHashMap;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.ResultMatcher;
|
||||
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
||||
|
@ -18,23 +34,6 @@ import net.osmand.util.Algorithms;
|
|||
import net.osmand.util.MapUtils;
|
||||
import net.osmand.util.OpeningHoursParser;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import gnu.trove.iterator.TLongObjectIterator;
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import gnu.trove.list.array.TLongArrayList;
|
||||
import gnu.trove.map.hash.TIntObjectHashMap;
|
||||
import gnu.trove.map.hash.TLongObjectHashMap;
|
||||
|
||||
public class BinaryMapRouteReaderAdapter {
|
||||
protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class);
|
||||
private static final int SHIFT_COORDINATES = 4;
|
||||
|
@ -304,7 +303,6 @@ public class BinaryMapRouteReaderAdapter {
|
|||
public int directionTrafficSignalsBackward = -1;
|
||||
public int trafficSignals = -1;
|
||||
public int stopSign = -1;
|
||||
public int stopMinor = -1;
|
||||
public int giveWaySign = -1;
|
||||
|
||||
int nameTypeRule = -1;
|
||||
|
@ -365,8 +363,6 @@ public class BinaryMapRouteReaderAdapter {
|
|||
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")){
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
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.binary.BinaryMapAddressReaderAdapter.AddressRegion;
|
||||
import net.osmand.binary.BinaryMapAddressReaderAdapter.CitiesBlock;
|
||||
|
@ -23,50 +29,42 @@ import net.osmand.binary.OsmandIndex.TransportPart;
|
|||
|
||||
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 {
|
||||
|
||||
|
||||
private OsmAndStoredIndex storedIndex;
|
||||
private OsmAndStoredIndex.Builder storedIndexBuilder;
|
||||
private Log log = PlatformUtil.getLog(CachedOsmandIndexes.class);
|
||||
private boolean hasChanged = true;
|
||||
|
||||
|
||||
public static final int VERSION = 2;
|
||||
|
||||
public void addToCache(BinaryMapIndexReader reader, File f) {
|
||||
hasChanged = true;
|
||||
if (storedIndexBuilder == null) {
|
||||
if(storedIndexBuilder == null) {
|
||||
storedIndexBuilder = OsmandIndex.OsmAndStoredIndex.newBuilder();
|
||||
storedIndexBuilder.setVersion(VERSION);
|
||||
storedIndexBuilder.setDateCreated(System.currentTimeMillis());
|
||||
if (storedIndex != null) {
|
||||
for (FileIndex ex : storedIndex.getFileIndexList()) {
|
||||
if (!ex.getFileName().equals(f.getName())) {
|
||||
storedIndexBuilder.addFileIndex(ex);
|
||||
}
|
||||
if(storedIndex != null) {
|
||||
for(FileIndex ex : storedIndex.getFileIndexList()) {
|
||||
storedIndexBuilder.addFileIndex(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FileIndex.Builder fileIndex = OsmandIndex.FileIndex.newBuilder();
|
||||
long d = reader.getDateCreated();
|
||||
fileIndex.setDateModified(d == 0 ? f.lastModified() : d);
|
||||
fileIndex.setDateModified(d== 0?f.lastModified() : d);
|
||||
fileIndex.setSize(f.length());
|
||||
fileIndex.setVersion(reader.getVersion());
|
||||
fileIndex.setFileName(f.getName());
|
||||
for (MapIndex index : reader.getMapIndexes()) {
|
||||
for(MapIndex index : reader.getMapIndexes()) {
|
||||
MapPart.Builder map = OsmandIndex.MapPart.newBuilder();
|
||||
map.setSize(index.getLength());
|
||||
map.setOffset(index.getFilePointer());
|
||||
if (index.getName() != null) {
|
||||
if(index.getName() != null) {
|
||||
map.setName(index.getName());
|
||||
}
|
||||
for (MapRoot mr : index.getRoots()) {
|
||||
for(MapRoot mr : index.getRoots() ) {
|
||||
MapLevel.Builder lev = OsmandIndex.MapLevel.newBuilder();
|
||||
lev.setSize(mr.length);
|
||||
lev.setOffset(mr.filePointer);
|
||||
|
@ -80,36 +78,36 @@ public class CachedOsmandIndexes {
|
|||
}
|
||||
fileIndex.addMapIndex(map);
|
||||
}
|
||||
|
||||
for (AddressRegion index : reader.getAddressIndexes()) {
|
||||
|
||||
for(AddressRegion index : reader.getAddressIndexes()) {
|
||||
AddressPart.Builder addr = OsmandIndex.AddressPart.newBuilder();
|
||||
addr.setSize(index.getLength());
|
||||
addr.setOffset(index.getFilePointer());
|
||||
if (index.getName() != null) {
|
||||
if(index.getName() != null) {
|
||||
addr.setName(index.getName());
|
||||
}
|
||||
if (index.getEnName() != null) {
|
||||
if(index.getEnName() != null) {
|
||||
addr.setNameEn(index.getEnName());
|
||||
}
|
||||
addr.setIndexNameOffset(index.getIndexNameOffset());
|
||||
for (CitiesBlock mr : index.getCities()) {
|
||||
for(CitiesBlock mr : index.getCities() ) {
|
||||
CityBlock.Builder cblock = OsmandIndex.CityBlock.newBuilder();
|
||||
cblock.setSize(mr.length);
|
||||
cblock.setOffset(mr.filePointer);
|
||||
cblock.setType(mr.type);
|
||||
addr.addCities(cblock);
|
||||
}
|
||||
for (String s : index.getAttributeTagsTable()) {
|
||||
for(String s : index.getAttributeTagsTable()) {
|
||||
addr.addAdditionalTags(s);
|
||||
}
|
||||
fileIndex.addAddressIndex(addr);
|
||||
}
|
||||
|
||||
for (PoiRegion index : reader.getPoiIndexes()) {
|
||||
|
||||
for(PoiRegion index : reader.getPoiIndexes()) {
|
||||
PoiPart.Builder poi = OsmandIndex.PoiPart.newBuilder();
|
||||
poi.setSize(index.getLength());
|
||||
poi.setOffset(index.getFilePointer());
|
||||
if (index.getName() != null) {
|
||||
if(index.getName() != null) {
|
||||
poi.setName(index.getName());
|
||||
}
|
||||
poi.setLeft(index.left31);
|
||||
|
@ -118,12 +116,12 @@ public class CachedOsmandIndexes {
|
|||
poi.setBottom(index.bottom31);
|
||||
fileIndex.addPoiIndex(poi.build());
|
||||
}
|
||||
|
||||
for (TransportIndex index : reader.getTransportIndexes()) {
|
||||
|
||||
for(TransportIndex index : reader.getTransportIndexes()) {
|
||||
TransportPart.Builder transport = OsmandIndex.TransportPart.newBuilder();
|
||||
transport.setSize(index.getLength());
|
||||
transport.setOffset(index.getFilePointer());
|
||||
if (index.getName() != null) {
|
||||
if(index.getName() != null) {
|
||||
transport.setName(index.getName());
|
||||
}
|
||||
transport.setLeft(index.getLeft());
|
||||
|
@ -132,33 +130,33 @@ public class CachedOsmandIndexes {
|
|||
transport.setBottom(index.getBottom());
|
||||
transport.setStopsTableLength(index.stopsFileLength);
|
||||
transport.setStopsTableOffset(index.stopsFileOffset);
|
||||
// if(index.incompleteRoutesLength > 0) {
|
||||
// if(index.incompleteRoutesLength > 0) {
|
||||
transport.setIncompleteRoutesLength(index.incompleteRoutesLength);
|
||||
transport.setIncompleteRoutesOffset(index.incompleteRoutesOffset);
|
||||
// }
|
||||
// }
|
||||
transport.setStringTableLength(index.stringTable.length);
|
||||
transport.setStringTableOffset(index.stringTable.fileOffset);
|
||||
fileIndex.addTransportIndex(transport);
|
||||
}
|
||||
|
||||
for (RouteRegion index : reader.getRoutingIndexes()) {
|
||||
|
||||
for(RouteRegion index : reader.getRoutingIndexes()) {
|
||||
RoutingPart.Builder routing = OsmandIndex.RoutingPart.newBuilder();
|
||||
routing.setSize(index.getLength());
|
||||
routing.setOffset(index.getFilePointer());
|
||||
if (index.getName() != null) {
|
||||
if(index.getName() != null) {
|
||||
routing.setName(index.getName());
|
||||
}
|
||||
for (RouteSubregion sub : index.getSubregions()) {
|
||||
for(RouteSubregion sub : index.getSubregions()) {
|
||||
addRouteSubregion(routing, sub, false);
|
||||
}
|
||||
for (RouteSubregion sub : index.getBaseSubregions()) {
|
||||
for(RouteSubregion sub : index.getBaseSubregions()) {
|
||||
addRouteSubregion(routing, sub, true);
|
||||
}
|
||||
fileIndex.addRoutingIndex(routing);
|
||||
}
|
||||
|
||||
|
||||
storedIndexBuilder.addFileIndex(fileIndex);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void addRouteSubregion(RoutingPart.Builder routing, RouteSubregion sub, boolean base) {
|
||||
|
@ -173,11 +171,11 @@ public class CachedOsmandIndexes {
|
|||
rpart.setShifToData(sub.shiftToData);
|
||||
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");
|
||||
FileIndex found = null;
|
||||
if (storedIndex != null && useStoredIndex) {
|
||||
if (storedIndex != null) {
|
||||
for (int i = 0; i < storedIndex.getFileIndexCount(); i++) {
|
||||
FileIndex fi = storedIndex.getFileIndex(i);
|
||||
if (f.length() == fi.getSize() && f.getName().equals(fi.getFileName())) {
|
||||
|
@ -193,26 +191,26 @@ public class CachedOsmandIndexes {
|
|||
reader = new BinaryMapIndexReader(mf, f);
|
||||
addToCache(reader, f);
|
||||
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 {
|
||||
reader = initFileIndex(found, mf, f);
|
||||
}
|
||||
return reader;
|
||||
}
|
||||
|
||||
|
||||
private BinaryMapIndexReader initFileIndex(FileIndex found, RandomAccessFile mf, File f) throws IOException {
|
||||
BinaryMapIndexReader reader = new BinaryMapIndexReader(mf, f, false);
|
||||
reader.version = found.getVersion();
|
||||
reader.dateCreated = found.getDateModified();
|
||||
|
||||
for (MapPart index : found.getMapIndexList()) {
|
||||
|
||||
for(MapPart index : found.getMapIndexList()) {
|
||||
MapIndex mi = new MapIndex();
|
||||
mi.length = (int) index.getSize();
|
||||
mi.filePointer = (int) index.getOffset();
|
||||
mi.name = index.getName();
|
||||
|
||||
for (MapLevel mr : index.getLevelsList()) {
|
||||
|
||||
for(MapLevel mr : index.getLevelsList()) {
|
||||
MapRoot root = new MapRoot();
|
||||
root.length = (int) mr.getSize();
|
||||
root.filePointer = (int) mr.getOffset();
|
||||
|
@ -228,27 +226,29 @@ public class CachedOsmandIndexes {
|
|||
reader.indexes.add(mi);
|
||||
reader.basemap = reader.basemap || mi.isBaseMap();
|
||||
}
|
||||
|
||||
for (AddressPart index : found.getAddressIndexList()) {
|
||||
|
||||
for(AddressPart index : found.getAddressIndexList()) {
|
||||
AddressRegion mi = new AddressRegion();
|
||||
mi.length = (int) index.getSize();
|
||||
mi.filePointer = (int) index.getOffset();
|
||||
mi.name = index.getName();
|
||||
mi.enName = index.getNameEn();
|
||||
mi.indexNameOffset = index.getIndexNameOffset();
|
||||
for (CityBlock mr : index.getCitiesList()) {
|
||||
for(CityBlock mr : index.getCitiesList() ) {
|
||||
CitiesBlock cblock = new CitiesBlock();
|
||||
cblock.length = (int) mr.getSize();
|
||||
cblock.filePointer = (int) mr.getOffset();
|
||||
cblock.type = mr.getType();
|
||||
mi.cities.add(cblock);
|
||||
}
|
||||
mi.attributeTagsTable.addAll(index.getAdditionalTagsList());
|
||||
for(String s : index.getAdditionalTagsList()) {
|
||||
mi.attributeTagsTable.add(s);
|
||||
}
|
||||
reader.addressIndexes.add(mi);
|
||||
reader.indexes.add(mi);
|
||||
}
|
||||
|
||||
for (PoiPart index : found.getPoiIndexList()) {
|
||||
|
||||
for(PoiPart index : found.getPoiIndexList()) {
|
||||
PoiRegion mi = new PoiRegion();
|
||||
mi.length = (int) index.getSize();
|
||||
mi.filePointer = (int) index.getOffset();
|
||||
|
@ -260,14 +260,14 @@ public class CachedOsmandIndexes {
|
|||
reader.poiIndexes.add(mi);
|
||||
reader.indexes.add(mi);
|
||||
}
|
||||
|
||||
for (TransportPart index : found.getTransportIndexList()) {
|
||||
|
||||
for(TransportPart index : found.getTransportIndexList()) {
|
||||
TransportIndex mi = new TransportIndex();
|
||||
mi.length = (int) index.getSize();
|
||||
mi.filePointer = (int) index.getOffset();
|
||||
mi.name = index.getName();
|
||||
mi.left = index.getLeft();
|
||||
mi.right = index.getRight();
|
||||
mi.right =index.getRight();
|
||||
mi.top = index.getTop();
|
||||
mi.bottom = index.getBottom();
|
||||
mi.stopsFileLength = index.getStopsTableLength();
|
||||
|
@ -280,14 +280,14 @@ public class CachedOsmandIndexes {
|
|||
reader.transportIndexes.add(mi);
|
||||
reader.indexes.add(mi);
|
||||
}
|
||||
|
||||
for (RoutingPart index : found.getRoutingIndexList()) {
|
||||
|
||||
for(RoutingPart index : found.getRoutingIndexList()) {
|
||||
RouteRegion mi = new RouteRegion();
|
||||
mi.length = (int) index.getSize();
|
||||
mi.filePointer = (int) index.getOffset();
|
||||
mi.name = index.getName();
|
||||
|
||||
for (RoutingSubregion mr : index.getSubregionsList()) {
|
||||
|
||||
for(RoutingSubregion mr : index.getSubregionsList()) {
|
||||
RouteSubregion sub = new RouteSubregion(mi);
|
||||
sub.length = (int) mr.getSize();
|
||||
sub.filePointer = (int) mr.getOffset();
|
||||
|
@ -296,7 +296,7 @@ public class CachedOsmandIndexes {
|
|||
sub.top = mr.getTop();
|
||||
sub.bottom = mr.getBottom();
|
||||
sub.shiftToData = mr.getShifToData();
|
||||
if (mr.getBasemap()) {
|
||||
if(mr.getBasemap()) {
|
||||
mi.basesubregions.add(sub);
|
||||
} else {
|
||||
mi.subregions.add(sub);
|
||||
|
@ -305,7 +305,7 @@ public class CachedOsmandIndexes {
|
|||
reader.routingIndexes.add(mi);
|
||||
reader.indexes.add(mi);
|
||||
}
|
||||
|
||||
|
||||
return reader;
|
||||
}
|
||||
|
||||
|
@ -315,7 +315,7 @@ public class CachedOsmandIndexes {
|
|||
try {
|
||||
storedIndex = OsmandIndex.OsmAndStoredIndex.newBuilder().mergeFrom(is).build();
|
||||
hasChanged = false;
|
||||
if (storedIndex.getVersion() != version) {
|
||||
if(storedIndex.getVersion() != version){
|
||||
storedIndex = null;
|
||||
}
|
||||
} finally {
|
||||
|
@ -323,7 +323,7 @@ public class CachedOsmandIndexes {
|
|||
}
|
||||
log.info("Initialize cache " + (System.currentTimeMillis() - time));
|
||||
}
|
||||
|
||||
|
||||
public void writeToFile(File f) throws IOException {
|
||||
if (hasChanged) {
|
||||
FileOutputStream outputStream = new FileOutputStream(f);
|
||||
|
|
|
@ -764,7 +764,6 @@ public class CommonWords {
|
|||
addFrequentlyUsed("martiri");
|
||||
addFrequentlyUsed("verdi");
|
||||
addFrequentlyUsed("augusta");
|
||||
addFrequentlyUsed("neuburger");
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -282,12 +282,10 @@ public class GeocodingUtilities {
|
|||
} else {
|
||||
Collections.sort(streetsList, DISTANCE_COMPARATOR);
|
||||
double streetDistance = 0;
|
||||
boolean isBuildingFound = knownMinBuildingDistance > 0;
|
||||
for (GeocodingResult street : streetsList) {
|
||||
if (streetDistance == 0) {
|
||||
streetDistance = street.getDistance();
|
||||
} else if (streetDistance > 0 && street.getDistance() > streetDistance + DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME &&
|
||||
isBuildingFound) {
|
||||
} else if (street.getDistance() > streetDistance + DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME) {
|
||||
continue;
|
||||
}
|
||||
street.connectionPoint = road.connectionPoint;
|
||||
|
@ -298,7 +296,6 @@ public class GeocodingUtilities {
|
|||
if (knownMinBuildingDistance == 0) {
|
||||
GeocodingResult firstBld = it.next();
|
||||
knownMinBuildingDistance = firstBld.getDistance();
|
||||
isBuildingFound = true;
|
||||
res.add(firstBld);
|
||||
}
|
||||
while (it.hasNext()) {
|
||||
|
@ -337,16 +334,14 @@ public class GeocodingUtilities {
|
|||
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
|
||||
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());
|
||||
|
|
|
@ -54371,24 +54371,6 @@ public final class OsmandOdb {
|
|||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getTextValuesBytes(int index);
|
||||
|
||||
// optional int32 precisionXY = 16;
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
boolean hasPrecisionXY();
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
int getPrecisionXY();
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code OsmAnd.OBF.OsmAndPoiBoxDataAtom}
|
||||
|
@ -54557,11 +54539,6 @@ public final class OsmandOdb {
|
|||
textValues_.add(input.readBytes());
|
||||
break;
|
||||
}
|
||||
case 128: {
|
||||
bitField0_ |= 0x00000200;
|
||||
precisionXY_ = input.readInt32();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
|
@ -55071,30 +55048,6 @@ public final class OsmandOdb {
|
|||
return textValues_.getByteString(index);
|
||||
}
|
||||
|
||||
// optional int32 precisionXY = 16;
|
||||
public static final int PRECISIONXY_FIELD_NUMBER = 16;
|
||||
private int precisionXY_;
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
public boolean hasPrecisionXY() {
|
||||
return ((bitField0_ & 0x00000200) == 0x00000200);
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
public int getPrecisionXY() {
|
||||
return precisionXY_;
|
||||
}
|
||||
|
||||
private void initFields() {
|
||||
dx_ = 0;
|
||||
dy_ = 0;
|
||||
|
@ -55109,7 +55062,6 @@ public final class OsmandOdb {
|
|||
note_ = "";
|
||||
textCategories_ = java.util.Collections.emptyList();
|
||||
textValues_ = com.google.protobuf.LazyStringArrayList.EMPTY;
|
||||
precisionXY_ = 0;
|
||||
}
|
||||
private byte memoizedIsInitialized = -1;
|
||||
public final boolean isInitialized() {
|
||||
|
@ -55170,9 +55122,6 @@ public final class OsmandOdb {
|
|||
for (int i = 0; i < textValues_.size(); i++) {
|
||||
output.writeBytes(15, textValues_.getByteString(i));
|
||||
}
|
||||
if (((bitField0_ & 0x00000200) == 0x00000200)) {
|
||||
output.writeInt32(16, precisionXY_);
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
|
@ -55254,10 +55203,6 @@ public final class OsmandOdb {
|
|||
size += dataSize;
|
||||
size += 1 * getTextValuesList().size();
|
||||
}
|
||||
if (((bitField0_ & 0x00000200) == 0x00000200)) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeInt32Size(16, precisionXY_);
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
|
@ -55400,8 +55345,6 @@ public final class OsmandOdb {
|
|||
bitField0_ = (bitField0_ & ~0x00000800);
|
||||
textValues_ = com.google.protobuf.LazyStringArrayList.EMPTY;
|
||||
bitField0_ = (bitField0_ & ~0x00001000);
|
||||
precisionXY_ = 0;
|
||||
bitField0_ = (bitField0_ & ~0x00002000);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -55487,10 +55430,6 @@ public final class OsmandOdb {
|
|||
bitField0_ = (bitField0_ & ~0x00001000);
|
||||
}
|
||||
result.textValues_ = textValues_;
|
||||
if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
|
||||
to_bitField0_ |= 0x00000200;
|
||||
}
|
||||
result.precisionXY_ = precisionXY_;
|
||||
result.bitField0_ = to_bitField0_;
|
||||
onBuilt();
|
||||
return result;
|
||||
|
@ -55586,9 +55525,6 @@ public final class OsmandOdb {
|
|||
}
|
||||
onChanged();
|
||||
}
|
||||
if (other.hasPrecisionXY()) {
|
||||
setPrecisionXY(other.getPrecisionXY());
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
return this;
|
||||
}
|
||||
|
@ -56570,55 +56506,6 @@ public final class OsmandOdb {
|
|||
return this;
|
||||
}
|
||||
|
||||
// optional int32 precisionXY = 16;
|
||||
private int precisionXY_ ;
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
public boolean hasPrecisionXY() {
|
||||
return ((bitField0_ & 0x00002000) == 0x00002000);
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
public int getPrecisionXY() {
|
||||
return precisionXY_;
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
public Builder setPrecisionXY(int value) {
|
||||
bitField0_ |= 0x00002000;
|
||||
precisionXY_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 precisionXY = 16;</code>
|
||||
*
|
||||
* <pre>
|
||||
* precision in 1-xy-xy-xy binary format
|
||||
* </pre>
|
||||
*/
|
||||
public Builder clearPrecisionXY() {
|
||||
bitField0_ = (bitField0_ & ~0x00002000);
|
||||
precisionXY_ = 0;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:OsmAnd.OBF.OsmAndPoiBoxDataAtom)
|
||||
}
|
||||
|
||||
|
@ -65121,38 +65008,37 @@ public final class OsmandOdb {
|
|||
"tegories\030\003 \003(\r\022\025\n\rsubcategories\030\005 \003(\r\"i\n" +
|
||||
"\020OsmAndPoiBoxData\022\014\n\004zoom\030\001 \001(\r\022\t\n\001x\030\002 \001" +
|
||||
"(\r\022\t\n\001y\030\003 \001(\r\0221\n\007poiData\030\005 \003(\0132 .OsmAnd." +
|
||||
"OBF.OsmAndPoiBoxDataAtom\"\205\002\n\024OsmAndPoiBo",
|
||||
"OBF.OsmAndPoiBoxDataAtom\"\360\001\n\024OsmAndPoiBo",
|
||||
"xDataAtom\022\n\n\002dx\030\002 \002(\021\022\n\n\002dy\030\003 \002(\021\022\022\n\ncat" +
|
||||
"egories\030\004 \003(\r\022\025\n\rsubcategories\030\005 \003(\r\022\014\n\004" +
|
||||
"name\030\006 \001(\t\022\016\n\006nameEn\030\007 \001(\t\022\n\n\002id\030\010 \001(\004\022\024" +
|
||||
"\n\014openingHours\030\n \001(\t\022\014\n\004site\030\013 \001(\t\022\r\n\005ph" +
|
||||
"one\030\014 \001(\t\022\014\n\004note\030\r \001(\t\022\026\n\016textCategorie" +
|
||||
"s\030\016 \003(\r\022\022\n\ntextValues\030\017 \003(\t\022\023\n\013precision" +
|
||||
"XY\030\020 \001(\005\"\032\n\007IdTable\022\017\n\007routeId\030\001 \003(\022\"F\n\017" +
|
||||
"RestrictionData\022\014\n\004type\030\001 \002(\005\022\014\n\004from\030\002 " +
|
||||
"\002(\005\022\n\n\002to\030\003 \002(\005\022\013\n\003via\030\004 \001(\005\"x\n\tRouteDat" +
|
||||
"a\022\016\n\006points\030\001 \002(\014\022\022\n\npointTypes\030\004 \001(\014\022\022\n",
|
||||
"\npointNames\030\005 \001(\014\022\r\n\005types\030\007 \002(\014\022\017\n\007rout" +
|
||||
"eId\030\014 \002(\005\022\023\n\013stringNames\030\016 \001(\014\"\304\005\n\022OsmAn" +
|
||||
"dRoutingIndex\022\014\n\004name\030\001 \002(\t\022?\n\005rules\030\002 \003" +
|
||||
"(\01320.OsmAnd.OBF.OsmAndRoutingIndex.Route" +
|
||||
"EncodingRule\022>\n\trootBoxes\030\003 \003(\0132+.OsmAnd" +
|
||||
".OBF.OsmAndRoutingIndex.RouteDataBox\022A\n\014" +
|
||||
"basemapBoxes\030\004 \003(\0132+.OsmAnd.OBF.OsmAndRo" +
|
||||
"utingIndex.RouteDataBox\022=\n\006blocks\030\005 \003(\0132" +
|
||||
"-.OsmAnd.OBF.OsmAndRoutingIndex.RouteDat" +
|
||||
"aBlock\032;\n\021RouteEncodingRule\022\013\n\003tag\030\003 \002(\t",
|
||||
"\022\r\n\005value\030\005 \002(\t\022\n\n\002id\030\007 \001(\r\032\231\001\n\014RouteDat" +
|
||||
"aBox\022\014\n\004left\030\001 \002(\021\022\r\n\005right\030\002 \002(\021\022\013\n\003top" +
|
||||
"\030\003 \002(\021\022\016\n\006bottom\030\004 \002(\021\022\023\n\013shiftToData\030\005 " +
|
||||
"\001(\007\022:\n\005boxes\030\007 \003(\0132+.OsmAnd.OBF.OsmAndRo" +
|
||||
"utingIndex.RouteDataBox\032\303\001\n\016RouteDataBlo" +
|
||||
"ck\022$\n\007idTable\030\005 \001(\0132\023.OsmAnd.OBF.IdTable" +
|
||||
"\022*\n\013dataObjects\030\006 \003(\0132\025.OsmAnd.OBF.Route" +
|
||||
"Data\0221\n\014restrictions\030\007 \003(\0132\033.OsmAnd.OBF." +
|
||||
"RestrictionData\022,\n\013stringTable\030\010 \001(\0132\027.O" +
|
||||
"smAnd.OBF.StringTableB\036\n\021net.osmand.bina",
|
||||
"ryB\tOsmandOdb"
|
||||
"s\030\016 \003(\r\022\022\n\ntextValues\030\017 \003(\t\"\032\n\007IdTable\022\017" +
|
||||
"\n\007routeId\030\001 \003(\022\"F\n\017RestrictionData\022\014\n\004ty" +
|
||||
"pe\030\001 \002(\005\022\014\n\004from\030\002 \002(\005\022\n\n\002to\030\003 \002(\005\022\013\n\003vi" +
|
||||
"a\030\004 \001(\005\"x\n\tRouteData\022\016\n\006points\030\001 \002(\014\022\022\n\n" +
|
||||
"pointTypes\030\004 \001(\014\022\022\n\npointNames\030\005 \001(\014\022\r\n\005",
|
||||
"types\030\007 \002(\014\022\017\n\007routeId\030\014 \002(\005\022\023\n\013stringNa" +
|
||||
"mes\030\016 \001(\014\"\304\005\n\022OsmAndRoutingIndex\022\014\n\004name" +
|
||||
"\030\001 \002(\t\022?\n\005rules\030\002 \003(\01320.OsmAnd.OBF.OsmAn" +
|
||||
"dRoutingIndex.RouteEncodingRule\022>\n\trootB" +
|
||||
"oxes\030\003 \003(\0132+.OsmAnd.OBF.OsmAndRoutingInd" +
|
||||
"ex.RouteDataBox\022A\n\014basemapBoxes\030\004 \003(\0132+." +
|
||||
"OsmAnd.OBF.OsmAndRoutingIndex.RouteDataB" +
|
||||
"ox\022=\n\006blocks\030\005 \003(\0132-.OsmAnd.OBF.OsmAndRo" +
|
||||
"utingIndex.RouteDataBlock\032;\n\021RouteEncodi" +
|
||||
"ngRule\022\013\n\003tag\030\003 \002(\t\022\r\n\005value\030\005 \002(\t\022\n\n\002id",
|
||||
"\030\007 \001(\r\032\231\001\n\014RouteDataBox\022\014\n\004left\030\001 \002(\021\022\r\n" +
|
||||
"\005right\030\002 \002(\021\022\013\n\003top\030\003 \002(\021\022\016\n\006bottom\030\004 \002(" +
|
||||
"\021\022\023\n\013shiftToData\030\005 \001(\007\022:\n\005boxes\030\007 \003(\0132+." +
|
||||
"OsmAnd.OBF.OsmAndRoutingIndex.RouteDataB" +
|
||||
"ox\032\303\001\n\016RouteDataBlock\022$\n\007idTable\030\005 \001(\0132\023" +
|
||||
".OsmAnd.OBF.IdTable\022*\n\013dataObjects\030\006 \003(\013" +
|
||||
"2\025.OsmAnd.OBF.RouteData\0221\n\014restrictions\030" +
|
||||
"\007 \003(\0132\033.OsmAnd.OBF.RestrictionData\022,\n\013st" +
|
||||
"ringTable\030\010 \001(\0132\027.OsmAnd.OBF.StringTable" +
|
||||
"B\036\n\021net.osmand.binaryB\tOsmandOdb"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||
|
@ -65410,7 +65296,7 @@ public final class OsmandOdb {
|
|||
internal_static_OsmAnd_OBF_OsmAndPoiBoxDataAtom_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAnd_OBF_OsmAndPoiBoxDataAtom_descriptor,
|
||||
new java.lang.String[] { "Dx", "Dy", "Categories", "Subcategories", "Name", "NameEn", "Id", "OpeningHours", "Site", "Phone", "Note", "TextCategories", "TextValues", "PrecisionXY", });
|
||||
new java.lang.String[] { "Dx", "Dy", "Categories", "Subcategories", "Name", "NameEn", "Id", "OpeningHours", "Site", "Phone", "Note", "TextCategories", "TextValues", });
|
||||
internal_static_OsmAnd_OBF_IdTable_descriptor =
|
||||
getDescriptor().getMessageTypes().get(36);
|
||||
internal_static_OsmAnd_OBF_IdTable_fieldAccessorTable = new
|
||||
|
|
|
@ -4,7 +4,6 @@ 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;
|
||||
|
@ -38,9 +37,7 @@ public class RouteDataObject {
|
|||
public int[] nameIds;
|
||||
// mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2
|
||||
public float[] heightDistanceArray = null;
|
||||
public float heightByCurrentLocation = Float.NaN;
|
||||
private static final Log LOG = PlatformUtil.getLog(RouteDataObject.class);
|
||||
|
||||
public RouteDataObject(RouteRegion region) {
|
||||
this.region = region;
|
||||
}
|
||||
|
@ -127,7 +124,7 @@ public class RouteDataObject {
|
|||
equals = this.pointTypes[i] == thatObj.pointTypes[i];
|
||||
} else if (pointTypes[i].length != thatObj.pointTypes[i].length) {
|
||||
equals = false;
|
||||
} else {
|
||||
} else {
|
||||
for (int j = 0; j < this.pointTypes[i].length && equals; j++) {
|
||||
String thisTag = region.routeEncodingRules.get(pointTypes[i][j]).getTag();
|
||||
String thisValue = region.routeEncodingRules.get(pointTypes[i][j]).getValue();
|
||||
|
@ -150,7 +147,7 @@ public class RouteDataObject {
|
|||
equals = this.pointNameTypes[i] == thatObj.pointNameTypes[i];
|
||||
} else if (pointNameTypes[i].length != thatObj.pointNameTypes[i].length) {
|
||||
equals = false;
|
||||
} else {
|
||||
} else {
|
||||
for (int j = 0; j < this.pointNameTypes[i].length && equals; j++) {
|
||||
String thisTag = region.routeEncodingRules.get(pointNameTypes[i][j]).getTag();
|
||||
String thisValue = pointNames[i][j];
|
||||
|
@ -168,68 +165,53 @@ public class RouteDataObject {
|
|||
}
|
||||
|
||||
public float[] calculateHeightArray() {
|
||||
return calculateHeightArray(null);
|
||||
}
|
||||
|
||||
public float[] calculateHeightArray(LatLon currentLocation) {
|
||||
if (heightDistanceArray != null) {
|
||||
if(heightDistanceArray != null) {
|
||||
return heightDistanceArray;
|
||||
}
|
||||
int startHeight = Algorithms.parseIntSilently(getValue("osmand_ele_start"), HEIGHT_UNDEFINED);
|
||||
int endHeight = Algorithms.parseIntSilently(getValue("osmand_ele_end"), startHeight);
|
||||
if (startHeight == HEIGHT_UNDEFINED) {
|
||||
if(startHeight == HEIGHT_UNDEFINED) {
|
||||
heightDistanceArray = new float[0];
|
||||
return heightDistanceArray;
|
||||
}
|
||||
|
||||
heightDistanceArray = new float[2 * getPointsLength()];
|
||||
heightDistanceArray = new float[2*getPointsLength()];
|
||||
double plon = 0;
|
||||
double plat = 0;
|
||||
float prevHeight = startHeight;
|
||||
heightByCurrentLocation = Float.NaN;
|
||||
double prevDistance = 0;
|
||||
for (int k = 0; k < getPointsLength(); k++) {
|
||||
for(int k = 0; k < getPointsLength(); k++) {
|
||||
double lon = MapUtils.get31LongitudeX(getPoint31XTile(k));
|
||||
double lat = MapUtils.get31LatitudeY(getPoint31YTile(k));
|
||||
if (k > 0) {
|
||||
if(k > 0) {
|
||||
double dd = MapUtils.getDistance(plat, plon, lat, lon);
|
||||
float height = HEIGHT_UNDEFINED;
|
||||
if (k == getPointsLength() - 1) {
|
||||
if(k == getPointsLength() - 1) {
|
||||
height = endHeight;
|
||||
} else {
|
||||
String asc = getValue(k, "osmand_ele_asc");
|
||||
if (asc != null && asc.length() > 0) {
|
||||
if(asc != null && asc.length() > 0) {
|
||||
height = (prevHeight + Float.parseFloat(asc));
|
||||
} else {
|
||||
String desc = getValue(k, "osmand_ele_desc");
|
||||
if (desc != null && desc.length() > 0) {
|
||||
if(desc != null && desc.length() > 0) {
|
||||
height = (prevHeight - Float.parseFloat(desc));
|
||||
}
|
||||
}
|
||||
}
|
||||
heightDistanceArray[2 * k] = (float) dd;
|
||||
heightDistanceArray[2 * k + 1] = height;
|
||||
|
||||
if (currentLocation != null) {
|
||||
double distance = MapUtils.getDistance(currentLocation, lat, lon);
|
||||
if (height != HEIGHT_UNDEFINED && distance < prevDistance) {
|
||||
prevDistance = distance;
|
||||
heightByCurrentLocation = height;
|
||||
}
|
||||
}
|
||||
|
||||
if (height != HEIGHT_UNDEFINED) {
|
||||
heightDistanceArray[2*k] = (float) dd;
|
||||
heightDistanceArray[2*k+1] = height;
|
||||
if(height != HEIGHT_UNDEFINED) {
|
||||
// interpolate undefined
|
||||
double totalDistance = dd;
|
||||
int startUndefined = k;
|
||||
while (startUndefined - 1 >= 0 && heightDistanceArray[2 * (startUndefined - 1) + 1] == HEIGHT_UNDEFINED) {
|
||||
startUndefined--;
|
||||
totalDistance += heightDistanceArray[2 * (startUndefined)];
|
||||
while(startUndefined - 1 >= 0 && heightDistanceArray[2*(startUndefined - 1)+1] == HEIGHT_UNDEFINED) {
|
||||
startUndefined --;
|
||||
totalDistance += heightDistanceArray[2*(startUndefined)];
|
||||
}
|
||||
if (totalDistance > 0) {
|
||||
if(totalDistance > 0) {
|
||||
double angle = (height - prevHeight) / totalDistance;
|
||||
for (int j = startUndefined; j < k; j++) {
|
||||
heightDistanceArray[2 * j + 1] = (float) ((heightDistanceArray[2 * j] * angle) + heightDistanceArray[2 * j - 1]);
|
||||
for(int j = startUndefined; j < k; j++) {
|
||||
heightDistanceArray[2*j+1] = (float) ((heightDistanceArray[2*j] * angle) + heightDistanceArray[2*j-1]);
|
||||
}
|
||||
}
|
||||
prevHeight = height;
|
||||
|
@ -241,9 +223,6 @@ public class RouteDataObject {
|
|||
}
|
||||
plat = lat;
|
||||
plon = lon;
|
||||
if (currentLocation != null) {
|
||||
prevDistance = MapUtils.getDistance(currentLocation, plat, plon);
|
||||
}
|
||||
}
|
||||
return heightDistanceArray;
|
||||
}
|
||||
|
@ -252,34 +231,34 @@ public class RouteDataObject {
|
|||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
if (names != null) {
|
||||
public String getName(){
|
||||
if(names != null ) {
|
||||
return names.get(region.nameTypeRule);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public String getName(String lang) {
|
||||
public String getName(String lang){
|
||||
return getName(lang, false);
|
||||
}
|
||||
|
||||
public String getName(String lang, boolean transliterate) {
|
||||
if (names != null) {
|
||||
if (Algorithms.isEmpty(lang)) {
|
||||
public String getName(String lang, boolean transliterate){
|
||||
if(names != null ) {
|
||||
if(Algorithms.isEmpty(lang)) {
|
||||
return names.get(region.nameTypeRule);
|
||||
}
|
||||
int[] kt = names.keys();
|
||||
for (int i = 0; i < kt.length; i++) {
|
||||
for(int i = 0 ; i < kt.length; i++) {
|
||||
int k = kt[i];
|
||||
if (region.routeEncodingRules.size() > k) {
|
||||
if (("name:" + lang).equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
if(region.routeEncodingRules.size() > k) {
|
||||
if(("name:"+lang).equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
return names.get(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
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 nmDef;
|
||||
|
@ -300,20 +279,20 @@ public class RouteDataObject {
|
|||
// return getDestinationRef(direction);
|
||||
//}
|
||||
if (names != null) {
|
||||
if (Algorithms.isEmpty(lang)) {
|
||||
if(Algorithms.isEmpty(lang)) {
|
||||
return names.get(region.refTypeRule);
|
||||
}
|
||||
int[] kt = names.keys();
|
||||
for (int i = 0; i < kt.length; i++) {
|
||||
for(int i = 0 ; i < kt.length; i++) {
|
||||
int k = kt[i];
|
||||
if (region.routeEncodingRules.size() > k) {
|
||||
if (("ref:" + lang).equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
if(region.routeEncodingRules.size() > k) {
|
||||
if(("ref:"+lang).equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
return names.get(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
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 refDefault;
|
||||
|
@ -328,13 +307,13 @@ public class RouteDataObject {
|
|||
String refTagDefault = "destination:ref";
|
||||
String refDefault = null;
|
||||
|
||||
for (int i = 0; i < kt.length; i++) {
|
||||
for(int i = 0 ; i < kt.length; i++) {
|
||||
int k = kt[i];
|
||||
if (region.routeEncodingRules.size() > k) {
|
||||
if (refTag.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
if(region.routeEncodingRules.size() > k) {
|
||||
if(refTag.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
return names.get(k);
|
||||
}
|
||||
if (refTagDefault.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
if(refTagDefault.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
refDefault = names.get(k);
|
||||
}
|
||||
}
|
||||
|
@ -347,12 +326,12 @@ public class RouteDataObject {
|
|||
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
|
||||
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();
|
||||
|
||||
// Issue #3181: Parse destination keys in this order:
|
||||
|
@ -362,39 +341,39 @@ public class RouteDataObject {
|
|||
// destination
|
||||
|
||||
String destinationTagLangFB = "destination:lang:XX";
|
||||
if (!Algorithms.isEmpty(lang)) {
|
||||
if(!Algorithms.isEmpty(lang)) {
|
||||
destinationTagLangFB = (direction == true) ? "destination:lang:" + lang + ":forward" : "destination:lang:" + lang + ":backward";
|
||||
}
|
||||
String destinationTagFB = (direction == true) ? "destination:forward" : "destination:backward";
|
||||
String destinationTagLang = "destination:lang:XX";
|
||||
if (!Algorithms.isEmpty(lang)) {
|
||||
if(!Algorithms.isEmpty(lang)) {
|
||||
destinationTagLang = "destination:lang:" + lang;
|
||||
}
|
||||
String destinationTagDefault = "destination";
|
||||
String destinationDefault = null;
|
||||
|
||||
for (int i = 0; i < kt.length; i++) {
|
||||
for(int i = 0 ; i < kt.length; i++) {
|
||||
int k = kt[i];
|
||||
if (region.routeEncodingRules.size() > k) {
|
||||
if (!Algorithms.isEmpty(lang) && destinationTagLangFB.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
if(region.routeEncodingRules.size() > k) {
|
||||
if(!Algorithms.isEmpty(lang) && destinationTagLangFB.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
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));
|
||||
}
|
||||
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));
|
||||
}
|
||||
if (destinationTagDefault.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
if(destinationTagDefault.equals(region.routeEncodingRules.get(k).getTag())) {
|
||||
destinationDefault = names.get(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (destinationDefault != null) {
|
||||
if(destinationDefault != null) {
|
||||
return destRef1 + ((transliterate) ? TransliterationHelper.transliterate(destinationDefault) : destinationDefault);
|
||||
}
|
||||
}
|
||||
return Algorithms.isEmpty(destRef) ? null : destRef;
|
||||
return "".equals(destRef) ? null : destRef;
|
||||
}
|
||||
|
||||
public int getPoint31XTile(int i) {
|
||||
|
@ -421,14 +400,14 @@ public class RouteDataObject {
|
|||
RestrictionInfo ri = new RestrictionInfo();
|
||||
ri.toWay = getRestrictionId(k);
|
||||
ri.type = getRestrictionType(k);
|
||||
if (restrictionsVia != null && k < restrictionsVia.length) {
|
||||
if(restrictionsVia != null && k < restrictionsVia.length) {
|
||||
ri.viaWay = restrictionsVia[k];
|
||||
}
|
||||
return ri;
|
||||
}
|
||||
|
||||
public long getRestrictionVia(int i) {
|
||||
if (restrictionsVia != null && restrictionsVia.length > i) {
|
||||
if(restrictionsVia != null && restrictionsVia.length > i) {
|
||||
return restrictionsVia[i];
|
||||
}
|
||||
return 0;
|
||||
|
@ -462,7 +441,7 @@ public class RouteDataObject {
|
|||
}
|
||||
if (insNames) {
|
||||
pointNames = new String[opointNames.length + 1][];
|
||||
pointNameTypes = new int[opointNameTypes.length + 1][];
|
||||
pointNameTypes = new int[opointNameTypes.length +1][];
|
||||
}
|
||||
int i = 0;
|
||||
for (; i < pos; i++) {
|
||||
|
@ -520,24 +499,6 @@ public class RouteDataObject {
|
|||
}
|
||||
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() {
|
||||
return types;
|
||||
|
@ -584,7 +545,7 @@ public class RouteDataObject {
|
|||
String nonCondTag = rtr.getTag();
|
||||
int 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)) {
|
||||
break;
|
||||
}
|
||||
|
@ -629,7 +590,7 @@ public class RouteDataObject {
|
|||
}
|
||||
|
||||
public static float parseSpeed(String v, float def) {
|
||||
if (v.equals("none")) {
|
||||
if(v.equals("none")) {
|
||||
return RouteDataObject.NONE_MAX_SPEED;
|
||||
} else {
|
||||
int i = Algorithms.findFirstNumberEndIndex(v);
|
||||
|
@ -653,20 +614,20 @@ public class RouteDataObject {
|
|||
f += Float.parseFloat(v.substring(0, i));
|
||||
String pref = v.substring(i, v.length()).trim();
|
||||
float add = 0;
|
||||
for (int ik = 0; ik < pref.length(); ik++) {
|
||||
if (Algorithms.isDigit(pref.charAt(ik)) || pref.charAt(ik) == '.' || pref.charAt(ik) == '-') {
|
||||
for(int ik = 0; ik < pref.length(); ik++) {
|
||||
if(Algorithms.isDigit(pref.charAt(ik)) || pref.charAt(ik) == '.' || pref.charAt(ik) == '-') {
|
||||
int first = Algorithms.findFirstNumberEndIndex(pref.substring(ik));
|
||||
if (first != -1) {
|
||||
if(first != -1) {
|
||||
add = parseLength(pref.substring(ik), 0);
|
||||
pref = pref.substring(0, ik);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (pref.contains("km")) {
|
||||
if(pref.contains("km")) {
|
||||
f *= 1000;
|
||||
}
|
||||
if (pref.contains("\"") || pref.contains("in")) {
|
||||
if(pref.contains("\"") || pref.contains("in")) {
|
||||
f *= 0.0254;
|
||||
} else if (pref.contains("\'") || pref.contains("ft") || pref.contains("feet")) {
|
||||
// foot to meters
|
||||
|
@ -712,27 +673,27 @@ public class RouteDataObject {
|
|||
return false;
|
||||
}
|
||||
|
||||
public boolean roundabout() {
|
||||
public boolean roundabout(){
|
||||
int sz = types.length;
|
||||
for (int i = 0; i < sz; i++) {
|
||||
for(int i=0; i<sz; i++) {
|
||||
RouteTypeRule r = region.quickGetEncodingRule(types[i]);
|
||||
if (r.roundabout()) {
|
||||
if(r.roundabout()) {
|
||||
return true;
|
||||
} else if (r.onewayDirection() != 0 && loop()) {
|
||||
} else if(r.onewayDirection() != 0 && loop()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean tunnel() {
|
||||
public boolean tunnel(){
|
||||
int sz = types.length;
|
||||
for (int i = 0; i < sz; i++) {
|
||||
for(int i=0; i<sz; 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;
|
||||
}
|
||||
if (r.getTag().equals("layer") && r.getValue().equals("-1")) {
|
||||
if(r.getTag().equals("layer") && r.getValue().equals("-1")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -921,7 +882,7 @@ public class RouteDataObject {
|
|||
|
||||
public boolean bearingVsRouteDirection(Location loc) {
|
||||
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);
|
||||
direction = Math.abs(diff) < Math.PI / 2f;
|
||||
}
|
||||
|
@ -971,13 +932,13 @@ public class RouteDataObject {
|
|||
}
|
||||
|
||||
public double distance(int startPoint, int endPoint) {
|
||||
if (startPoint > endPoint) {
|
||||
if(startPoint > endPoint) {
|
||||
int k = endPoint;
|
||||
endPoint = startPoint;
|
||||
startPoint = k;
|
||||
}
|
||||
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 y = getPoint31YTile(k);
|
||||
int kx = getPoint31XTile(k + 1);
|
||||
|
@ -1013,16 +974,16 @@ public class RouteDataObject {
|
|||
// translate into meters
|
||||
total += simplifyDistance(x, y, px, py);
|
||||
} 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) {
|
||||
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);
|
||||
if (exp != dest) {
|
||||
if(exp != dest) {
|
||||
System.err.println("FAIL " + vl + " " + dest);
|
||||
} else {
|
||||
System.out.println("OK " + vl);
|
||||
|
@ -1031,24 +992,24 @@ public class RouteDataObject {
|
|||
|
||||
public static void main(String[] args) {
|
||||
assertTrueLength("10 km", 10000);
|
||||
assertTrueLength("0.01 km", 10);
|
||||
assertTrueLength("0.01 km 10 m", 20);
|
||||
assertTrueLength("10 m", 10);
|
||||
assertTrueLength("10m", 10);
|
||||
assertTrueLength("3.4 m", 3.4f);
|
||||
assertTrueLength("3.40 m", 3.4f);
|
||||
assertTrueLength("10 m 10m", 20);
|
||||
assertTrueLength("14'10\"", 4.5212f);
|
||||
assertTrueLength("14.5'", 4.4196f);
|
||||
assertTrueLength("14.5 ft", 4.4196f);
|
||||
assertTrueLength("14'0\"", 4.2672f);
|
||||
assertTrueLength("15ft", 4.572f);
|
||||
assertTrueLength("15 ft 1 in", 4.5974f);
|
||||
assertTrueLength("4.1 metres", 4.1f);
|
||||
assertTrueLength("14'0''", 4.2672f);
|
||||
assertTrueLength("14 feet", 4.2672f);
|
||||
assertTrueLength("14 mile", 22530.76f);
|
||||
assertTrueLength("14 cm", 0.14f);
|
||||
assertTrueLength("0.01 km", 10);
|
||||
assertTrueLength("0.01 km 10 m", 20);
|
||||
assertTrueLength("10 m", 10);
|
||||
assertTrueLength("10m", 10);
|
||||
assertTrueLength("3.4 m", 3.4f);
|
||||
assertTrueLength("3.40 m", 3.4f);
|
||||
assertTrueLength("10 m 10m", 20);
|
||||
assertTrueLength("14'10\"", 4.5212f);
|
||||
assertTrueLength("14.5'", 4.4196f);
|
||||
assertTrueLength("14.5 ft", 4.4196f);
|
||||
assertTrueLength("14'0\"", 4.2672f);
|
||||
assertTrueLength("15ft", 4.572f);
|
||||
assertTrueLength("15 ft 1 in", 4.5974f);
|
||||
assertTrueLength("4.1 metres", 4.1f);
|
||||
assertTrueLength("14'0''", 4.2672f);
|
||||
assertTrueLength("14 feet", 4.2672f);
|
||||
assertTrueLength("14 mile", 22530.76f);
|
||||
assertTrueLength("14 cm", 0.14f);
|
||||
|
||||
// float badValue = -1;
|
||||
// assertTrueLength("none", badValue);
|
||||
|
@ -1093,7 +1054,7 @@ public class RouteDataObject {
|
|||
public RestrictionInfo next; // optional to simulate linked list
|
||||
|
||||
public int length() {
|
||||
if (next == null) {
|
||||
if(next == null) {
|
||||
return 1;
|
||||
}
|
||||
return next.length() + 1;
|
||||
|
@ -1103,16 +1064,16 @@ public class RouteDataObject {
|
|||
public void setRestriction(int k, long to, int type, long viaWay) {
|
||||
long valto = (to << RouteDataObject.RESTRICTION_SHIFT) | ((long) type & RouteDataObject.RESTRICTION_MASK);
|
||||
restrictions[k] = valto;
|
||||
if (viaWay != 0) {
|
||||
if(viaWay != 0) {
|
||||
setRestrictionVia(k, viaWay);
|
||||
}
|
||||
}
|
||||
|
||||
public void setRestrictionVia(int k, long viaWay) {
|
||||
if (restrictionsVia != null) {
|
||||
if(restrictionsVia != null) {
|
||||
long[] nrestrictionsVia = new long[Math.max(k + 1, restrictions.length)];
|
||||
System.arraycopy(restrictions, 0, nrestrictionsVia, 0, restrictions.length);
|
||||
restrictionsVia = nrestrictionsVia;
|
||||
restrictionsVia = nrestrictionsVia;
|
||||
} else {
|
||||
restrictionsVia = new long[k + 1];
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ public abstract class StringBundleWriter {
|
|||
|
||||
public void writeBundle() {
|
||||
for (Entry<String, Item<?>> entry : bundle.getMap().entrySet()) {
|
||||
writeItem("osmand:" + entry.getKey(), entry.getValue());
|
||||
writeItem(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,17 @@
|
|||
package net.osmand.data;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.osm.MapPoiTypes;
|
||||
import net.osmand.osm.PoiCategory;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
|
@ -11,14 +21,9 @@ import java.util.Map;
|
|||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.json.JSONObject;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.osm.MapPoiTypes;
|
||||
import net.osmand.osm.PoiCategory;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
|
||||
public class Amenity extends MapObject {
|
||||
|
@ -39,17 +44,6 @@ public class Amenity extends MapObject {
|
|||
public static final String REF = "ref";
|
||||
public static final String OSM_DELETE_VALUE = "delete";
|
||||
public static final String OSM_DELETE_TAG = "osmand_change";
|
||||
public static final String IMAGE_TITLE = "image_title";
|
||||
public static final String IS_PART = "is_part";
|
||||
public static final String IS_PARENT_OF = "is_parent_of";
|
||||
public static final String IS_AGGR_PART = "is_aggr_part";
|
||||
public static final String CONTENT_JSON = "content_json";
|
||||
public static final String ROUTE_ID = "route_id";
|
||||
public static final String ROUTE_SOURCE = "route_source";
|
||||
public static final String COLOR = "color";
|
||||
public static final String LANG_YES = "lang_yes";
|
||||
public static final String GPX_ICON = "gpx_icon";
|
||||
|
||||
|
||||
private String subType;
|
||||
private PoiCategory type;
|
||||
|
@ -102,46 +96,12 @@ public class Amenity extends MapObject {
|
|||
}
|
||||
|
||||
|
||||
// this method should be used carefully
|
||||
public Map<String, String> getInternalAdditionalInfoMap() {
|
||||
public Map<String, String> getAdditionalInfo() {
|
||||
if (additionalInfo == null) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return additionalInfo;
|
||||
}
|
||||
|
||||
public Collection<String> getAdditionalInfoValues(boolean excludeZipped) {
|
||||
if (additionalInfo == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
boolean zipped = false;
|
||||
for(String v : additionalInfo.values()) {
|
||||
if(isContentZipped(v)) {
|
||||
zipped = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(zipped) {
|
||||
List<String> r = new ArrayList<>(additionalInfo.size());
|
||||
for(String str : additionalInfo.values()) {
|
||||
if(excludeZipped && isContentZipped(str)) {
|
||||
|
||||
} else {
|
||||
r.add(unzipContent(str));
|
||||
}
|
||||
}
|
||||
return r;
|
||||
} else {
|
||||
return additionalInfo.values();
|
||||
}
|
||||
}
|
||||
|
||||
public Collection<String> getAdditionalInfoKeys() {
|
||||
if (additionalInfo == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return additionalInfo.keySet();
|
||||
}
|
||||
|
||||
public void setAdditionalInfo(Map<String, String> additionalInfo) {
|
||||
this.additionalInfo = null;
|
||||
|
@ -174,7 +134,7 @@ public class Amenity extends MapObject {
|
|||
}
|
||||
this.additionalInfo.put(tag, value);
|
||||
if (OPENING_HOURS.equals(tag)) {
|
||||
this.openingHours = unzipContent(value);
|
||||
this.openingHours = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -205,15 +165,6 @@ public class Amenity extends MapObject {
|
|||
setAdditionalInfo(PHONE, phone);
|
||||
}
|
||||
|
||||
public String getColor() {
|
||||
return getAdditionalInfo(COLOR);
|
||||
}
|
||||
|
||||
public String getGpxIcon() {
|
||||
return getAdditionalInfo(GPX_ICON);
|
||||
}
|
||||
|
||||
|
||||
public String getContentLanguage(String tag, String lang, String defLang) {
|
||||
if (lang != null) {
|
||||
String translateName = getAdditionalInfo(tag + ":" + lang);
|
||||
|
@ -231,7 +182,7 @@ public class Amenity extends MapObject {
|
|||
}
|
||||
int maxLen = 0;
|
||||
String lng = defLang;
|
||||
for (String nm : getAdditionalInfoKeys()) {
|
||||
for (String nm : getAdditionalInfo().keySet()) {
|
||||
if (nm.startsWith(tag + ":")) {
|
||||
String key = nm.substring(tag.length() + 1);
|
||||
String cnt = getAdditionalInfo(tag + ":" + key);
|
||||
|
@ -253,7 +204,7 @@ public class Amenity extends MapObject {
|
|||
|
||||
public List<String> getNames(String tag, String defTag) {
|
||||
List<String> l = new ArrayList<String>();
|
||||
for (String nm : getAdditionalInfoKeys()) {
|
||||
for (String nm : getAdditionalInfo().keySet()) {
|
||||
if (nm.startsWith(tag + ":")) {
|
||||
l.add(nm.substring(tag.length() + 1));
|
||||
} else if (nm.equals(tag)) {
|
||||
|
@ -263,35 +214,7 @@ public class Amenity extends MapObject {
|
|||
return l;
|
||||
}
|
||||
|
||||
public String getTagSuffix(String tagPrefix) {
|
||||
for (String infoTag : getAdditionalInfoKeys()) {
|
||||
if (infoTag.startsWith(tagPrefix)) {
|
||||
if (infoTag.length() > tagPrefix.length()) {
|
||||
return infoTag.substring(tagPrefix.length());
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getTagContent(String tag) {
|
||||
return getTagContent(tag, null);
|
||||
}
|
||||
|
||||
public String getTagContent(String tag, String lang) {
|
||||
String translateName = getStrictTagContent(tag, lang);
|
||||
if (translateName != null) {
|
||||
return translateName;
|
||||
}
|
||||
for (String nm : getAdditionalInfoKeys()) {
|
||||
if (nm.startsWith(tag + ":")) {
|
||||
return getAdditionalInfo(nm);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getStrictTagContent(String tag, String lang) {
|
||||
if (lang != null) {
|
||||
String translateName = getAdditionalInfo(tag + ":" + lang);
|
||||
if (!Algorithms.isEmpty(translateName)) {
|
||||
|
@ -306,6 +229,11 @@ public class Amenity extends MapObject {
|
|||
if (!Algorithms.isEmpty(enName)) {
|
||||
return enName;
|
||||
}
|
||||
for (String nm : getAdditionalInfo().keySet()) {
|
||||
if (nm.startsWith(tag + ":")) {
|
||||
return getAdditionalInfo(nm);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -417,4 +345,4 @@ public class Amenity extends MapObject {
|
|||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -106,42 +106,25 @@ public class Building extends MapObject {
|
|||
|
||||
|
||||
public float interpolation(String hno) {
|
||||
if (getInterpolationType() != null || getInterpolationInterval() > 0
|
||||
// || checkNameAsInterpolation() // disable due to situation in NL #4284
|
||||
) {
|
||||
if(getInterpolationType() != null || getInterpolationInterval() > 0
|
||||
//|| checkNameAsInterpolation() // disable due to situation in NL #4284
|
||||
) {
|
||||
int num = Algorithms.extractFirstIntegerNumber(hno);
|
||||
String fname = super.getName();
|
||||
int numB = Algorithms.extractFirstIntegerNumber(fname);
|
||||
int numT = numB;
|
||||
String sname = getName2();
|
||||
if (getInterpolationType() == BuildingInterpolation.ALPHABETIC) {
|
||||
if (num != numB) {
|
||||
// currently not supported
|
||||
return -1;
|
||||
}
|
||||
int hint = (int) hno.charAt(hno.length() - 1);
|
||||
int fch = (int) fname.charAt(fname.length() - 1);
|
||||
int sch = sname.charAt(sname.length() - 1);
|
||||
if (fch == sch) {
|
||||
return -1;
|
||||
}
|
||||
float res = ((float) hint - fch) / (((float) sch - fch));
|
||||
if (res > 1 || res < 0) {
|
||||
return -1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
int numT = numB;
|
||||
if (num >= numB) {
|
||||
if (fname.contains("-") && sname == null) {
|
||||
String sname = getName2();
|
||||
if(fname.contains("-") && sname == null){
|
||||
int l = fname.indexOf('-');
|
||||
sname = fname.substring(l + 1, fname.length());
|
||||
}
|
||||
if (sname != null) {
|
||||
numT = Algorithms.extractFirstIntegerNumber(sname);
|
||||
if (numT < num) {
|
||||
if(numT < num) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (getInterpolationType() == BuildingInterpolation.EVEN && num % 2 == 1) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -154,8 +137,8 @@ public class Building extends MapObject {
|
|||
} else {
|
||||
return -1;
|
||||
}
|
||||
if (numT > numB) {
|
||||
return ((float) num - numB) / (((float) numT - numB));
|
||||
if(numT > numB){
|
||||
return ((float)num - numB) / (((float)numT - numB));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -182,10 +165,10 @@ public class Building extends MapObject {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (interpolationInterval != 0) {
|
||||
return name + "-" + name2 + " (+" + interpolationInterval + ") ";
|
||||
} else if (interpolationType != null) {
|
||||
return name + "-" + name2 + " (" + interpolationType + ") ";
|
||||
if(interpolationInterval !=0){
|
||||
return name+"-"+name2 +" (+"+interpolationInterval+") ";
|
||||
} else if(interpolationType != null) {
|
||||
return name+"-"+name2 +" ("+interpolationType+") ";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
|
|
@ -24,10 +24,6 @@ public class City extends MapObject {
|
|||
public double getRadius() {
|
||||
return radius;
|
||||
}
|
||||
|
||||
public boolean storedAsSeparateAdminEntity() {
|
||||
return this != DISTRICT && this != NEIGHBOURHOOD && this != BOROUGH;
|
||||
}
|
||||
|
||||
public static String valueToString(CityType t) {
|
||||
return t.toString().toLowerCase();
|
||||
|
|
|
@ -13,6 +13,7 @@ import java.io.ByteArrayInputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
|
@ -89,22 +90,23 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
names.putAll(name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Map<String, String> getNamesMap(boolean includeEn) {
|
||||
if ((!includeEn || Algorithms.isEmpty(enName)) && names == null) {
|
||||
return Collections.emptyMap();
|
||||
if (!includeEn || Algorithms.isEmpty(enName)) {
|
||||
if (names == null) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return names;
|
||||
}
|
||||
Map<String, String> mp = new HashMap<String, String>();
|
||||
if (names != null) {
|
||||
Iterator<Entry<String, String>> it = names.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Iterator<Entry<String, String>> it = mp.entrySet().iterator();
|
||||
while(it.hasNext()) {
|
||||
Entry<String, String> e = it.next();
|
||||
mp.put(e.getKey(), unzipContent(e.getValue()));
|
||||
}
|
||||
}
|
||||
if (includeEn && !Algorithms.isEmpty(enName)) {
|
||||
mp.put("en", unzipContent(enName));
|
||||
}
|
||||
mp.put("en", unzipContent(enName));
|
||||
return mp;
|
||||
}
|
||||
|
||||
|
@ -114,7 +116,7 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
l.add(unzipContent(enName));
|
||||
}
|
||||
if (names != null) {
|
||||
for (String nm : names.values()) {
|
||||
for(String nm : names.values()) {
|
||||
l.add(unzipContent(nm));
|
||||
}
|
||||
}
|
||||
|
@ -181,9 +183,8 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
public String getName(String lang, boolean transliterate) {
|
||||
if (lang != null && lang.length() > 0) {
|
||||
if (lang.equals("en")) {
|
||||
// for some objects like wikipedia, english name is stored 'name' tag
|
||||
String enName = getEnName(transliterate);
|
||||
return !Algorithms.isEmpty(enName) ? enName : getName();
|
||||
// ignore transliterate option here for backward compatibility
|
||||
return getEnName(true);
|
||||
} else {
|
||||
// get name
|
||||
if (names != null) {
|
||||
|
@ -350,8 +351,8 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
return json;
|
||||
}
|
||||
|
||||
String unzipContent(String str) {
|
||||
if (isContentZipped(str)) {
|
||||
public String unzipContent(String str) {
|
||||
if (str != null && str.startsWith(" gz ")) {
|
||||
try {
|
||||
int ind = 4;
|
||||
byte[] bytes = new byte[str.length() - ind];
|
||||
|
@ -368,10 +369,6 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
}
|
||||
br.close();
|
||||
str = bld.toString();
|
||||
// ugly fix of temporary problem of map generation
|
||||
if(isContentZipped(str)) {
|
||||
str = unzipContent(str);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -379,10 +376,6 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
return str;
|
||||
}
|
||||
|
||||
boolean isContentZipped(String str) {
|
||||
return str != null && str.startsWith(" gz ");
|
||||
}
|
||||
|
||||
protected static void parseJSON(JSONObject json, MapObject o) {
|
||||
if (json.has("name")) {
|
||||
o.name = json.getString("name");
|
||||
|
|
|
@ -61,9 +61,9 @@ public class Multipolygon {
|
|||
innerLinearRings.add(innerRing.toLinearRing());
|
||||
}
|
||||
}
|
||||
polygons.add(geometryFactory.createPolygon(outerRing.toLinearRing(), innerLinearRings.toArray(new LinearRing[0])));
|
||||
polygons.add(geometryFactory.createPolygon(outerRing.toLinearRing(), innerLinearRings.toArray(new LinearRing[innerLinearRings.size()])));
|
||||
}
|
||||
return geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[0]));
|
||||
return geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[polygons.size()]));
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
|
@ -163,7 +163,9 @@ public class Multipolygon {
|
|||
* @return true if this multipolygon is correct and contains the point
|
||||
*/
|
||||
public boolean containsPoint(LatLon point) {
|
||||
|
||||
return containsPoint(point.getLatitude(), point.getLongitude());
|
||||
|
||||
}
|
||||
|
||||
public int countOuterPolygons() {
|
||||
|
|
|
@ -6,7 +6,6 @@ public class QuadRect {
|
|||
public double top;
|
||||
public double bottom;
|
||||
|
||||
// left & right / top & bottom could be flipped (so it's useful for latlon bbox)
|
||||
public QuadRect(double left, double top, double right, double bottom) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
|
@ -22,18 +21,16 @@ public class QuadRect {
|
|||
}
|
||||
|
||||
public double width() {
|
||||
return Math.abs(right - left);
|
||||
return right - left;
|
||||
}
|
||||
|
||||
public double height() {
|
||||
return Math.abs(bottom - top);
|
||||
return bottom - top;
|
||||
}
|
||||
|
||||
public boolean contains(double left, double top, double right, double bottom) {
|
||||
return Math.min(this.left, this.right) <= Math.min(left, right)
|
||||
&& Math.max(this.left, this.right) >= Math.max(left, right)
|
||||
&& Math.min(this.top, this.bottom) <= Math.min(top, bottom)
|
||||
&& Math.max(this.top, this.bottom) >= Math.max(top, bottom);
|
||||
return this.left < this.right && this.top < this.bottom && this.left <= left && this.top <= top && this.right >= right
|
||||
&& this.bottom >= bottom;
|
||||
}
|
||||
|
||||
public boolean contains(QuadRect box) {
|
||||
|
@ -41,15 +38,12 @@ public class QuadRect {
|
|||
}
|
||||
|
||||
public static boolean intersects(QuadRect a, QuadRect b) {
|
||||
return Math.min(a.left, a.right) <= Math.max(b.left, b.right)
|
||||
&& Math.max(a.left, a.right) >= Math.min(b.left, b.right)
|
||||
&& Math.min(a.bottom, a.top) <= Math.max(b.bottom, b.top)
|
||||
&& Math.max(a.bottom, a.top) >= Math.min(b.bottom, b.top);
|
||||
return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
|
||||
}
|
||||
|
||||
public static boolean trivialOverlap(QuadRect a, QuadRect b) {
|
||||
return !((a.right < b.left) || (a.left > b.right) || (a.top < b.bottom) || (a.bottom > b.top));
|
||||
}
|
||||
|
||||
public static boolean trivialOverlap(QuadRect a, QuadRect b) {
|
||||
return intersects(a, b);
|
||||
}
|
||||
|
||||
public double centerX() {
|
||||
return (left + right) / 2;
|
||||
|
|
|
@ -103,16 +103,18 @@ public class QuadTree<T> {
|
|||
void splitBox(QuadRect node_extent, QuadRect[] n) {
|
||||
// coord2d c=node_extent.center();
|
||||
|
||||
double width = node_extent.width();
|
||||
double height = node_extent.height();
|
||||
|
||||
double lx = node_extent.left;
|
||||
double ly = node_extent.top;
|
||||
double hx = node_extent.right;
|
||||
double hy = node_extent.bottom;
|
||||
double lox = node_extent.left;
|
||||
double loy = node_extent.top;
|
||||
double hix = node_extent.right;
|
||||
double hiy = node_extent.bottom;
|
||||
|
||||
n[0] = new QuadRect(lx, ly, lx + (hx - lx) * ratio, ly + (hy - ly) * ratio);
|
||||
n[1] = new QuadRect(lx + (hx - lx) * (1 - ratio), ly, hx, ly + (hy - ly) * ratio);
|
||||
n[2] = new QuadRect(lx, ly + (hy - ly) * (1 - ratio), lx + (hx - lx) * ratio, hy);
|
||||
n[3] = new QuadRect(lx + (hx - lx) * (1 - ratio), ly + (hy - ly) * (1 - ratio), hx, hy);
|
||||
n[0] = new QuadRect(lox, loy, lox + width * ratio, loy + height * ratio);
|
||||
n[1] = new QuadRect(hix - width * ratio, loy, hix, loy + height * ratio);
|
||||
n[2] = new QuadRect(lox, hiy - height * ratio, lox + width * ratio, hiy);
|
||||
n[3] = new QuadRect(hix - width * ratio, hiy - height * ratio, hix, hiy);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -436,7 +436,6 @@ public class OsmandRegions {
|
|||
cx /= object.getPointsLength();
|
||||
cy /= object.getPointsLength();
|
||||
rd.regionCenter = new LatLon(MapUtils.get31LatitudeY((int) cy), MapUtils.get31LongitudeX((int) cx));
|
||||
findBoundaries(rd, object);
|
||||
}
|
||||
|
||||
rd.regionParentFullName = mapIndexFields.get(mapIndexFields.parentFullName, object);
|
||||
|
@ -462,47 +461,6 @@ public class OsmandRegions {
|
|||
return rd;
|
||||
}
|
||||
|
||||
private void findBoundaries(WorldRegion rd, BinaryMapDataObject object) {
|
||||
if (object.getPointsLength() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<LatLon> polygon = new ArrayList<>();
|
||||
double currentX = object.getPoint31XTile(0);
|
||||
double currentY = object.getPoint31YTile(0);
|
||||
polygon.add(new LatLon(currentX, currentY));
|
||||
double minX = currentX;
|
||||
double maxX = currentX;
|
||||
double minY = currentY;
|
||||
double maxY = currentY;
|
||||
|
||||
if (object.getPointsLength() > 1) {
|
||||
for (int i = 1; i < object.getPointsLength(); i++) {
|
||||
currentX = object.getPoint31XTile(i);
|
||||
currentY = object.getPoint31YTile(i);
|
||||
if (currentX > maxX) {
|
||||
maxX = currentX;
|
||||
} else if (currentX < minX) {
|
||||
minX = currentX;
|
||||
}
|
||||
if (currentY > maxY) {
|
||||
maxY = currentY;
|
||||
} else if (currentY < minY) {
|
||||
minY = currentY;
|
||||
}
|
||||
polygon.add(new LatLon(currentX, currentY));
|
||||
}
|
||||
}
|
||||
|
||||
minX = MapUtils.get31LongitudeX((int) minX);
|
||||
maxX = MapUtils.get31LongitudeX((int) maxX);
|
||||
double revertedMinY = MapUtils.get31LatitudeY((int) maxY);
|
||||
double revertedMaxY = MapUtils.get31LatitudeY((int) minY);
|
||||
|
||||
rd.boundingBox = new QuadRect(minX, revertedMinY, maxX, revertedMaxY);
|
||||
rd.polygon = polygon;
|
||||
}
|
||||
|
||||
private String getSearchIndex(BinaryMapDataObject object) {
|
||||
MapIndex mi = object.getMapIndex();
|
||||
TIntObjectIterator<String> it = object.getObjectNames().iterator();
|
||||
|
|
|
@ -140,7 +140,7 @@ public class TileSourceManager {
|
|||
}
|
||||
}
|
||||
}
|
||||
return randoms.toArray(new String[0]);
|
||||
return randoms.toArray(new String[randoms.size()]);
|
||||
}
|
||||
|
||||
public void setMinZoom(int minZoom) {
|
||||
|
@ -518,8 +518,8 @@ public class TileSourceManager {
|
|||
}
|
||||
if (override || !metainfo.exists()) {
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(metainfo)));
|
||||
for (Map.Entry<String, String> entry : properties.entrySet()) {
|
||||
writer.write("[" + entry.getKey() + "]\n" + entry.getValue() + "\n");
|
||||
for (String key : properties.keySet()) {
|
||||
writer.write("[" + key + "]\n" + properties.get(key) + "\n");
|
||||
}
|
||||
writer.close();
|
||||
}
|
||||
|
|
|
@ -1,15 +1,11 @@
|
|||
package net.osmand.map;
|
||||
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class WorldRegion implements Serializable {
|
||||
|
||||
|
@ -44,8 +40,6 @@ public class WorldRegion implements Serializable {
|
|||
protected String regionDownloadName;
|
||||
protected boolean regionMapDownload;
|
||||
protected LatLon regionCenter;
|
||||
protected QuadRect boundingBox;
|
||||
protected List<LatLon> polygon;
|
||||
|
||||
public static class RegionParams {
|
||||
protected String regionLeftHandDriving;
|
||||
|
@ -80,12 +74,12 @@ public class WorldRegion implements Serializable {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean isRegionMapDownload() {
|
||||
return regionMapDownload;
|
||||
}
|
||||
|
||||
|
||||
public String getLocaleName() {
|
||||
if(!Algorithms.isEmpty(regionNameLocale)) {
|
||||
return regionNameLocale;
|
||||
|
@ -96,14 +90,14 @@ public class WorldRegion implements Serializable {
|
|||
if(!Algorithms.isEmpty(regionName)) {
|
||||
return regionName;
|
||||
}
|
||||
|
||||
|
||||
return capitalize(regionFullName.replace('_', ' '));
|
||||
}
|
||||
|
||||
|
||||
public String getRegionDownloadName() {
|
||||
return regionDownloadName;
|
||||
}
|
||||
|
||||
|
||||
public String getRegionDownloadNameLC() {
|
||||
return regionDownloadName == null ? null : regionDownloadName.toLowerCase();
|
||||
}
|
||||
|
@ -115,7 +109,7 @@ public class WorldRegion implements Serializable {
|
|||
public LatLon getRegionCenter() {
|
||||
return regionCenter;
|
||||
}
|
||||
|
||||
|
||||
public String getRegionSearchText() {
|
||||
return regionSearchText;
|
||||
}
|
||||
|
@ -149,7 +143,7 @@ public class WorldRegion implements Serializable {
|
|||
this.regionDownloadName = downloadName;
|
||||
superregion = null;
|
||||
subregions = new LinkedList<WorldRegion>();
|
||||
|
||||
|
||||
}
|
||||
public WorldRegion(String id) {
|
||||
this(id, null);
|
||||
|
@ -158,7 +152,7 @@ public class WorldRegion implements Serializable {
|
|||
public String getRegionId() {
|
||||
return regionFullName;
|
||||
}
|
||||
|
||||
|
||||
private String capitalize(String s) {
|
||||
String[] words = s.split(" ");
|
||||
if (words[0].length() > 0) {
|
||||
|
@ -188,49 +182,4 @@ public class WorldRegion implements Serializable {
|
|||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean containsRegion(WorldRegion region) {
|
||||
if (containsBoundingBox(region.boundingBox)) {
|
||||
// check polygon only if bounding box match
|
||||
return containsPolygon(region.polygon);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean containsBoundingBox(QuadRect rectangle) {
|
||||
return (boundingBox != null && rectangle != null) &&
|
||||
boundingBox.contains(rectangle);
|
||||
}
|
||||
|
||||
private boolean containsPolygon(List<LatLon> another) {
|
||||
return (polygon != null && another != null) &&
|
||||
Algorithms.isFirstPolygonInsideSecond(another, polygon);
|
||||
}
|
||||
|
||||
public boolean isContinent() {
|
||||
if (superregion != null) {
|
||||
String superRegionId = superregion.getRegionId();
|
||||
String thisRegionId = getRegionId();
|
||||
return WORLD.equals(superRegionId) && !RUSSIA_REGION_ID.equals(thisRegionId);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static List<WorldRegion> removeDuplicates(List<WorldRegion> regions) {
|
||||
List<WorldRegion> copy = new ArrayList<>(regions);
|
||||
Set<WorldRegion> duplicates = new HashSet<>();
|
||||
for (int i = 0; i < copy.size() - 1; i++) {
|
||||
WorldRegion r1 = copy.get(i);
|
||||
for (int j = i + 1; j < copy.size(); j++) {
|
||||
WorldRegion r2 = copy.get(j);
|
||||
if (r1.containsRegion(r2)) {
|
||||
duplicates.add(r2);
|
||||
} else if (r2.containsRegion(r1)) {
|
||||
duplicates.add(r1);
|
||||
}
|
||||
}
|
||||
}
|
||||
copy.removeAll(duplicates);
|
||||
return copy;
|
||||
}
|
||||
}
|
|
@ -658,8 +658,6 @@ public class MapPoiTypes {
|
|||
tp.setOsmValue(parser.getAttributeValue("", "value"));
|
||||
tp.setOsmEditTagValue(parser.getAttributeValue("", "edit_tag"),
|
||||
parser.getAttributeValue("", "edit_value"));
|
||||
tp.setOsmEditTagValue2(parser.getAttributeValue("", "edit_tag2"),
|
||||
parser.getAttributeValue("", "edit_value2"));
|
||||
|
||||
tp.setOsmTag2(parser.getAttributeValue("", "tag2"));
|
||||
tp.setOsmValue2(parser.getAttributeValue("", "value2"));
|
||||
|
@ -825,7 +823,7 @@ public class MapPoiTypes {
|
|||
}
|
||||
String name = keyName;
|
||||
name = name.replace('_', ' ');
|
||||
return Algorithms.capitalizeFirstLetter(name);
|
||||
return Algorithms.capitalizeFirstLetterAndLowercase(name);
|
||||
}
|
||||
|
||||
public boolean isRegisteredType(PoiCategory t) {
|
||||
|
|
|
@ -27,7 +27,7 @@ public abstract class MapRenderingTypes {
|
|||
|
||||
private static final Log log = PlatformUtil.getLog(MapRenderingTypes.class);
|
||||
public static final String[] langs = new String[] { "af", "als", "ar", "az", "be", "bg", "bn", "bpy", "br", "bs", "ca", "ceb", "cs", "cy", "da", "de", "el", "eo", "es", "et", "eu", "fa", "fi", "fr", "fy", "ga", "gl", "he", "hi", "hsb",
|
||||
"hr", "ht", "hu", "hy", "id", "is", "it", "ja", "ka", "kn", "ko", "ku", "la", "lb", "lo", "lt", "lv", "mk", "ml", "mr", "ms", "nds", "new", "nl", "nn", "no", "nv", "os", "pl", "pms", "pt", "ro", "ru", "sc", "sh", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "vi", "vo", "zh", "zh-hans", "zh-hant", };
|
||||
"hr", "ht", "hu", "hy", "id", "is", "it", "ja", "ka", "ko", "ku", "la", "lb", "lo", "lt", "lv", "mk", "ml", "mr", "ms", "nds", "new", "nl", "nn", "no", "nv", "os", "pl", "pms", "pt", "ro", "ru", "sc", "sh", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "vi", "vo", "zh", "zh-hans", "zh-hant", };
|
||||
|
||||
|
||||
public final static byte RESTRICTION_NO_RIGHT_TURN = 1;
|
||||
|
@ -96,9 +96,8 @@ public abstract class MapRenderingTypes {
|
|||
Map<String, String> common = new HashMap<String, String>();
|
||||
String ATTACHED_KEY = "seamark:attached";
|
||||
String type = "";
|
||||
for (Entry<String, String> entry : tags.entrySet()) {
|
||||
String s = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
for (String s : tags.keySet()) {
|
||||
String value = tags.get(s);
|
||||
if (s.equals("seamark:type")) {
|
||||
type = value;
|
||||
common.put(ATTACHED_KEY, openSeaType(value));
|
||||
|
|
|
@ -16,10 +16,9 @@ public class PoiType extends AbstractPoiType {
|
|||
|
||||
private String editTag;
|
||||
private String editValue;
|
||||
private String editTag2;
|
||||
private String editValue2;
|
||||
private boolean filterOnly;
|
||||
|
||||
|
||||
private String nameTag;
|
||||
private boolean text;
|
||||
private boolean nameOnly;
|
||||
|
@ -69,46 +68,27 @@ public class PoiType extends AbstractPoiType {
|
|||
this.editTag = osmTag;
|
||||
this.editValue = editValue;
|
||||
}
|
||||
|
||||
public void setOsmEditTagValue2(String osmTag, String editValue) {
|
||||
this.editTag2 = osmTag;
|
||||
this.editValue2 = editValue;
|
||||
}
|
||||
|
||||
|
||||
public String getEditOsmTag() {
|
||||
if (isReference()) {
|
||||
if(isReference()) {
|
||||
return referenceType.getEditOsmTag();
|
||||
}
|
||||
if (editTag == null) {
|
||||
if(editTag == null) {
|
||||
return getOsmTag();
|
||||
}
|
||||
return editTag;
|
||||
}
|
||||
|
||||
public String getEditOsmValue() {
|
||||
if (isReference()) {
|
||||
if(isReference()) {
|
||||
return referenceType.getEditOsmValue();
|
||||
}
|
||||
if (editValue == null) {
|
||||
if(editValue == null) {
|
||||
return getOsmValue();
|
||||
}
|
||||
return editValue;
|
||||
}
|
||||
|
||||
public String getEditOsmTag2() {
|
||||
if (isReference()) {
|
||||
return referenceType.getEditOsmTag2();
|
||||
}
|
||||
return editTag2;
|
||||
}
|
||||
|
||||
public String getEditOsmValue2() {
|
||||
if (isReference()) {
|
||||
return referenceType.getEditOsmValue2();
|
||||
}
|
||||
return editValue2;
|
||||
}
|
||||
|
||||
public void setOsmTag(String osmTag) {
|
||||
this.osmTag = osmTag;
|
||||
}
|
||||
|
|
|
@ -1,266 +0,0 @@
|
|||
package net.osmand.osm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RouteActivityType {
|
||||
private static final List<RouteActivityType> values = new ArrayList<>();
|
||||
public static final String DEFAULT_ICON = "special_marker";
|
||||
public static final String DEFAULT_COLOR = "orange";
|
||||
|
||||
public static final RouteActivityType WATER = createType("water", "yellow").icon("special_kayak").reg();
|
||||
public static final RouteActivityType WINTER = createType("winter", "yellow").icon("special_skiing").reg();
|
||||
public static final RouteActivityType SNOWMOBILE = createType("snowmobile", "yellow").icon("special_snowmobile").reg();
|
||||
public static final RouteActivityType RIDING = createType("riding", "yellow").icon("special_horse").reg();
|
||||
public static final RouteActivityType RACING = createType("racing", "yellow").icon("raceway").reg();
|
||||
public static final RouteActivityType MOUNTAINBIKE = createType("mountainbike", "blue").icon("sport_cycling").reg();
|
||||
public static final RouteActivityType CYCLING = createType("cycling", "blue").icon("special_bicycle").reg();
|
||||
public static final RouteActivityType HIKING = createType("hiking", "orange").icon("special_trekking").reg();
|
||||
public static final RouteActivityType RUNNING = createType("running", "orange").icon("running").reg();
|
||||
public static final RouteActivityType WALKING = createType("walking", "orange").icon("special_walking").reg();
|
||||
public static final RouteActivityType OFFROAD = createType("offroad", "yellow").icon("special_offroad").reg();
|
||||
public static final RouteActivityType MOTORBIKE = createType("motorbike", "green").icon("special_motorcycle").reg();
|
||||
public static final RouteActivityType CAR = createType("car", "green").icon("shop_car").reg();
|
||||
// less specific bottom order
|
||||
String name;
|
||||
String color;
|
||||
String icon;
|
||||
|
||||
RouteActivityType(String nm, String clr) {
|
||||
this.name = nm;
|
||||
this.color = clr;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public String getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static RouteActivityType getOrCreateTypeFromName(String name) {
|
||||
for (RouteActivityType rat : values) {
|
||||
if (rat.name.equalsIgnoreCase(name)) {
|
||||
return rat;
|
||||
}
|
||||
}
|
||||
return createType(name.toLowerCase(), DEFAULT_COLOR).icon(DEFAULT_ICON).reg();
|
||||
}
|
||||
|
||||
private static RouteActivityTypeBuilder createType(String name, String color) {
|
||||
RouteActivityTypeBuilder builder = new RouteActivityTypeBuilder();
|
||||
builder.routeActivityType = new RouteActivityType(name, color);
|
||||
return builder;
|
||||
}
|
||||
|
||||
public static RouteActivityType getTypeFromTags(String[] tags) {
|
||||
RouteActivityType activityType = null;
|
||||
for (String tg : tags) {
|
||||
RouteActivityType rat = RouteActivityType.convertFromOsmGPXTag(tg);
|
||||
if (rat != null) {
|
||||
if (activityType == null || values.indexOf(activityType) > values.indexOf(rat)) {
|
||||
activityType = rat;
|
||||
}
|
||||
}
|
||||
}
|
||||
return activityType;
|
||||
}
|
||||
|
||||
public static RouteActivityType convertFromOsmGPXTag(String tg) {
|
||||
String t = tg.toLowerCase();
|
||||
if ("mountain hiking".equalsIgnoreCase(t)) {
|
||||
return HIKING;
|
||||
}
|
||||
if ("motorcar".equalsIgnoreCase(t)) {
|
||||
return CAR;
|
||||
}
|
||||
if ("laufen".equalsIgnoreCase(t)) {
|
||||
return RUNNING;
|
||||
}
|
||||
if ("pedestrian".equalsIgnoreCase(t)) {
|
||||
return WALKING;
|
||||
}
|
||||
switch (t) {
|
||||
case "mountainbiking":
|
||||
case "mtb":
|
||||
case "mountainbike":
|
||||
case "mountain bike":
|
||||
case "mountain biking":
|
||||
case "mountbarker":
|
||||
case "mtb-tour":
|
||||
case "ciclismo-mtb-gravel":
|
||||
case "vtt":
|
||||
case "btt":
|
||||
case "vth":
|
||||
case "mtb ride":
|
||||
return MOUNTAINBIKE;
|
||||
case "hiking":
|
||||
case "route=hiking":
|
||||
case "mountain hiking":
|
||||
case "hiking trail":
|
||||
case "wandern":
|
||||
case "hike":
|
||||
case "randonnée":
|
||||
case "trekking":
|
||||
case "climbing":
|
||||
return HIKING;
|
||||
case "bike":
|
||||
case "biking":
|
||||
case "bicycling":
|
||||
case "bicycle":
|
||||
case "cycling":
|
||||
case "cycle":
|
||||
case "cycleway":
|
||||
case "cykel":
|
||||
case "handcycle":
|
||||
case "cyclotourisme":
|
||||
case "route=bicycle":
|
||||
case "cyclotourism":
|
||||
case "fietsen":
|
||||
case "вело":
|
||||
case "велосипед":
|
||||
case "rower":
|
||||
case "trasa rowerem":
|
||||
case "vélo":
|
||||
case "velo":
|
||||
case "radtour":
|
||||
case "bici":
|
||||
case "fiets":
|
||||
case "fahrrad":
|
||||
case "ncn":
|
||||
case "icn":
|
||||
case "lcn":
|
||||
case "network=ncn":
|
||||
case "network=icn":
|
||||
case "network=lcn":
|
||||
return CYCLING;
|
||||
case "car":
|
||||
case "motorcar":
|
||||
case "by car":
|
||||
case "auto":
|
||||
case "автомобиль":
|
||||
case "automobile":
|
||||
case "autós":
|
||||
case "driving":
|
||||
case "drive":
|
||||
case "van":
|
||||
case "авто":
|
||||
case "на автомобиле":
|
||||
case "bus":
|
||||
case "truck":
|
||||
case "taxi":
|
||||
return CAR;
|
||||
case "running":
|
||||
case "run":
|
||||
case "rungis":
|
||||
case "trail running":
|
||||
case "trailrunning":
|
||||
case "бег":
|
||||
case "laufen":
|
||||
case "langlauf":
|
||||
case "lauf":
|
||||
case "course":
|
||||
case "jogging":
|
||||
case "fitotrack":
|
||||
return RUNNING;
|
||||
case "wanderung":
|
||||
case "walking":
|
||||
case "walk":
|
||||
case "nightwalk":
|
||||
case "walkway":
|
||||
case "пешком":
|
||||
case "пеший":
|
||||
case "pěšky":
|
||||
case "marche":
|
||||
case "pedestrian":
|
||||
case "foot":
|
||||
case "footing":
|
||||
case "on_foot":
|
||||
case "byfoot":
|
||||
case "onfoot":
|
||||
case "sightseeing":
|
||||
case "geocaching":
|
||||
case "etnanatura":
|
||||
case "etna":
|
||||
case "iwn":
|
||||
case "lwn":
|
||||
case "rwn":
|
||||
case "network=iwn":
|
||||
case "network=lwn":
|
||||
case "network=rwn":
|
||||
return WALKING;
|
||||
case "ling-moto":
|
||||
case "motorbiking":
|
||||
case "motorcycle":
|
||||
case "motorrad":
|
||||
case "motorbike":
|
||||
case "motor bike":
|
||||
case "FVbike":
|
||||
case "Motorrad":
|
||||
return MOTORBIKE;
|
||||
case "offroad":
|
||||
case "off-road":
|
||||
case "off road":
|
||||
case "4x4":
|
||||
case "terrain":
|
||||
case "quad":
|
||||
case "enduro":
|
||||
case "feldwege":
|
||||
case "feldweg":
|
||||
return OFFROAD;
|
||||
case "boat":
|
||||
case "water":
|
||||
case "boating":
|
||||
case "kayak":
|
||||
case "river":
|
||||
case "lake":
|
||||
case "lakes":
|
||||
case "canal":
|
||||
return WATER;
|
||||
case "ski":
|
||||
case "skiing":
|
||||
case "skating":
|
||||
case "skitour":
|
||||
case "winter":
|
||||
case "wintersports":
|
||||
case "snowboard":
|
||||
case "лыжи":
|
||||
case "лыжня":
|
||||
case "nordic":
|
||||
case "piste":
|
||||
return WINTER;
|
||||
case "snowmobile=designated":
|
||||
case "snowmobile=permissive":
|
||||
case "snowmobile=yes":
|
||||
case "snowmobile":
|
||||
return SNOWMOBILE;
|
||||
case "ride":
|
||||
case "horse":
|
||||
case "horse trail":
|
||||
return RIDING;
|
||||
case "racing":
|
||||
return RACING;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static class RouteActivityTypeBuilder {
|
||||
|
||||
private RouteActivityType routeActivityType;
|
||||
|
||||
public RouteActivityTypeBuilder icon(String icon) {
|
||||
routeActivityType.icon = icon;
|
||||
return this;
|
||||
}
|
||||
|
||||
private RouteActivityType reg() {
|
||||
values.add(routeActivityType);
|
||||
return routeActivityType;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -114,8 +114,6 @@ public abstract class Entity implements Serializable {
|
|||
public static final int MODIFY_DELETED = -1;
|
||||
public static final int MODIFY_MODIFIED = 1;
|
||||
public static final int MODIFY_CREATED = 2;
|
||||
public static final String POI_TYPE_TAG = "poi_type_tag";
|
||||
public static final String REMOVE_TAG_PREFIX = "----";
|
||||
|
||||
public Entity(long id) {
|
||||
this.id = id;
|
||||
|
@ -243,11 +241,6 @@ public abstract class Entity implements Serializable {
|
|||
return Collections.unmodifiableMap(tags);
|
||||
}
|
||||
|
||||
public boolean isNotValid(String tag) {
|
||||
String val = getTag(tag);
|
||||
return val == null || val.length() == 0 || tag.length() == 0
|
||||
|| tag.startsWith(REMOVE_TAG_PREFIX) || tag.equals(POI_TYPE_TAG);
|
||||
}
|
||||
|
||||
public Collection<String> getTagKeySet() {
|
||||
if (tags == null) {
|
||||
|
|
|
@ -21,7 +21,7 @@ import net.osmand.osm.edit.Relation.RelationMember;
|
|||
import net.osmand.util.Algorithms;
|
||||
|
||||
public class EntityParser {
|
||||
|
||||
|
||||
public static void parseMapObject(MapObject mo, Entity e, Map<String, String> tags) {
|
||||
mo.setId(e.getId());
|
||||
if(mo instanceof Amenity) {
|
||||
|
@ -33,10 +33,9 @@ public class EntityParser {
|
|||
if (mo.getEnName(false).length() == 0) {
|
||||
mo.setEnName(tags.get(OSMTagKey.NAME_EN.getValue()));
|
||||
}
|
||||
for (Map.Entry<String, String> entry : tags.entrySet()) {
|
||||
String ts = entry.getKey();
|
||||
for (String ts : tags.keySet()) {
|
||||
if (ts.startsWith("name:") && !ts.equals(OSMTagKey.NAME_EN.getValue())) {
|
||||
mo.setName(ts.substring(("name:").length()), entry.getValue());
|
||||
mo.setName(ts.substring(("name:").length()), tags.get(ts));
|
||||
}
|
||||
}
|
||||
if (mo.getName().length() == 0) {
|
||||
|
@ -123,7 +122,7 @@ public class EntityParser {
|
|||
mo.setName(ref);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void setNameFromBrand(MapObject mo, Map<String, String> tags) {
|
||||
String ref = tags.get(OSMTagKey.BRAND.getValue());
|
||||
if(ref != null){
|
||||
|
@ -140,7 +139,7 @@ public class EntityParser {
|
|||
op += " [" + ref + "]";
|
||||
mo.setName(op);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static String getWebSiteURL(Map<String, String> tagValues, boolean checkWikipedia) {
|
||||
String siteUrl = null;
|
||||
|
@ -170,14 +169,14 @@ public class EntityParser {
|
|||
}
|
||||
return siteUrl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static List<Amenity> parseAmenities(MapPoiTypes poiTypes, Entity entity, Map<String, String> tags,
|
||||
List<Amenity> amenitiesList) {
|
||||
amenitiesList.clear();
|
||||
// it could be collection of amenities
|
||||
boolean relation = entity instanceof Relation;
|
||||
boolean purerelation = relation &&
|
||||
boolean purerelation = relation &&
|
||||
!("multipolygon".equals(tags.get("type")) || "boundary".equals(tags.get("type")));
|
||||
Collection<Map<String, String>> it = MapRenderingTypes.splitTagsIntoDifferentObjects(tags);
|
||||
for (Map<String, String> ts : it) {
|
||||
|
@ -201,7 +200,9 @@ public class EntityParser {
|
|||
}
|
||||
return amenitiesList;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private static boolean checkAmenitiesToAdd(Amenity a, List<Amenity> amenitiesList){
|
||||
// check amenity for duplication
|
||||
for(Amenity b : amenitiesList){
|
||||
|
@ -210,9 +211,9 @@ public class EntityParser {
|
|||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static Building parseBuilding(Entity e){
|
||||
Building b = new Building();
|
||||
parseMapObject(b, e, e.getTags());
|
||||
|
@ -226,7 +227,7 @@ public class EntityParser {
|
|||
List<Node> nodes = ((Way) e).getNodes();
|
||||
for(int i = 0; i < nodes.size(); i++) {
|
||||
Node node = nodes.get(i);
|
||||
if(node != null && "yes".equals(node.getTag(OSMTagKey.ENTRANCE)) &&
|
||||
if(node != null && "yes".equals(node.getTag(OSMTagKey.ENTRANCE)) &&
|
||||
!Algorithms.isEmpty(node.getTag(OSMTagKey.REF))) {
|
||||
b.addEntrance(node.getTag(OSMTagKey.REF), node.getLatLon());
|
||||
}
|
||||
|
@ -234,11 +235,11 @@ public class EntityParser {
|
|||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
public static City parseCity(Node el) {
|
||||
return parseCity(el, CityType.valueFromString(el.getTag(OSMTagKey.PLACE.getValue())));
|
||||
}
|
||||
|
||||
|
||||
public static City parseCity(Entity el, CityType t) {
|
||||
if(t == null) {
|
||||
return null;
|
||||
|
@ -250,15 +251,15 @@ public class EntityParser {
|
|||
c.setIsin(isin);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static TransportRoute parserRoute(Relation r, String ref){
|
||||
TransportRoute rt = new TransportRoute();
|
||||
parseMapObject(rt, r, r.getTags());
|
||||
rt.setRef(ref);
|
||||
return rt;
|
||||
}
|
||||
|
||||
|
||||
public static TransportStop parseTransportStop(Entity e){
|
||||
TransportStop st = new TransportStop();
|
||||
parseMapObject(st, e, e.getTags());
|
||||
|
|
|
@ -153,34 +153,35 @@ public class OsmMapUtils {
|
|||
}
|
||||
boolean area = w.getFirstNodeId() == w.getLastNodeId();
|
||||
// double check for area (could be negative all)
|
||||
if (area) {
|
||||
if(area) {
|
||||
Node fn = w.getFirstNode();
|
||||
Node ln = w.getLastNode();
|
||||
if (fn != null && fn != null && MapUtils.getDistance(fn.getLatLon(), ln.getLatLon()) < 50) {
|
||||
if(fn != null && fn != null && MapUtils.getDistance(fn.getLatLon(), ln.getLatLon()) < 50) {
|
||||
area = true;
|
||||
} else {
|
||||
area = false;
|
||||
}
|
||||
}
|
||||
LatLon ll = area ? getComplexPolyCenter(nodes, null) : getWeightCenterForNodes(nodes);
|
||||
if (ll == null) {
|
||||
if(ll == null) {
|
||||
return null;
|
||||
}
|
||||
double flat = ll.getLatitude();
|
||||
double flon = ll.getLongitude();
|
||||
if (!area || !MapAlgorithms.containsPoint(nodes, ll.getLatitude(), ll.getLongitude())) {
|
||||
if(!area || !MapAlgorithms.containsPoint(nodes, ll.getLatitude(), ll.getLongitude())) {
|
||||
double minDistance = Double.MAX_VALUE;
|
||||
for (Node n : nodes) {
|
||||
if (n != null) {
|
||||
double d = MapUtils.getDistance(n.getLatitude(), n.getLongitude(), ll.getLatitude(), ll.getLongitude());
|
||||
if (d < minDistance) {
|
||||
if(d < minDistance) {
|
||||
flat = n.getLatitude();
|
||||
flon = n.getLongitude();
|
||||
minDistance = d;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new LatLon(flat, flon);
|
||||
|
||||
}
|
||||
|
@ -340,30 +341,6 @@ public class OsmMapUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static void simplifyDouglasPeucker(List<Node> nodes, int start, int end, List<Node> survivedNodes, double epsilon) {
|
||||
double dmax = Double.NEGATIVE_INFINITY;
|
||||
int index = -1;
|
||||
|
||||
Node startPt = nodes.get(start);
|
||||
Node endPt = nodes.get(end);
|
||||
|
||||
for (int i = start + 1; i < end; i++) {
|
||||
Node pt = nodes.get(i);
|
||||
double d = MapUtils.getOrthogonalDistance(pt.getLatitude(), pt.getLongitude(),
|
||||
startPt.getLatitude(), startPt.getLongitude(), endPt.getLatitude(), endPt.getLongitude());
|
||||
if (d > dmax) {
|
||||
dmax = d;
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
if (dmax > epsilon) {
|
||||
simplifyDouglasPeucker(nodes, start, index, survivedNodes, epsilon);
|
||||
simplifyDouglasPeucker(nodes, index, end, survivedNodes, epsilon);
|
||||
} else {
|
||||
survivedNodes.add(nodes.get(end));
|
||||
}
|
||||
}
|
||||
|
||||
private static double orthogonalDistance(int zoom, Node nodeLineStart, Node nodeLineEnd, Node node) {
|
||||
LatLon p = MapUtils.getProjection(node.getLatitude(), node.getLongitude(), nodeLineStart.getLatitude(),
|
||||
nodeLineStart.getLongitude(), nodeLineEnd.getLatitude(), nodeLineEnd.getLongitude());
|
||||
|
|
|
@ -1,104 +1,93 @@
|
|||
package net.osmand.osm.io;
|
||||
|
||||
|
||||
/**
|
||||
* @source http://www.javaworld.com/javaworld/javatips/jw-javatip47.html -- 24.11.2008, (mb)
|
||||
*/
|
||||
public class Base64 {
|
||||
/*******************************************************************************************************************
|
||||
* BASE 64 encoding of a String or an array of bytes. See also RFC 1421.
|
||||
*
|
||||
* @author Unknown
|
||||
* @author David W. Croft
|
||||
* @version 1998-06-08
|
||||
******************************************************************************************************************/
|
||||
/*******************************************************************************************************************
|
||||
* BASE 64 encoding of a String or an array of bytes. See also RFC 1421.
|
||||
*
|
||||
* @author Unknown
|
||||
* @author David W. Croft
|
||||
* @version 1998-06-08
|
||||
******************************************************************************************************************/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
public static final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7
|
||||
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8 to 15
|
||||
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23
|
||||
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31
|
||||
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47
|
||||
'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55
|
||||
'4', '5', '6', '7', '8', '9', '+', '/' }; // 56 to 63
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
public static final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7
|
||||
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8 to 15
|
||||
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23
|
||||
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31
|
||||
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47
|
||||
'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55
|
||||
'4', '5', '6', '7', '8', '9', '+', '/' }; // 56 to 63
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
public static int indexOf(char c) {
|
||||
for (int i = 0; i < alphabet.length; i++) {
|
||||
if (alphabet[i] == c) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
public static String encode(final String s)
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
return encode(s.getBytes());
|
||||
}
|
||||
|
||||
public static String encode(final byte[] octetString)
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
int bits24;
|
||||
int bits6;
|
||||
|
||||
public static String encode(final String s)
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
return encode(s.getBytes());
|
||||
}
|
||||
final char[] out = new char[((octetString.length - 1) / 3 + 1) * 4];
|
||||
|
||||
public static String encode(final byte[] octetString)
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
int bits24;
|
||||
int bits6;
|
||||
int outIndex = 0;
|
||||
int i = 0;
|
||||
|
||||
final char[] out = new char[((octetString.length - 1) / 3 + 1) * 4];
|
||||
while ((i + 3) <= octetString.length) {
|
||||
// store the octets
|
||||
bits24 = (octetString[i++] & 0xFF) << 16;
|
||||
bits24 |= (octetString[i++] & 0xFF) << 8;
|
||||
bits24 |= (octetString[i++] & 0xFF);
|
||||
|
||||
int outIndex = 0;
|
||||
int i = 0;
|
||||
bits6 = (bits24 & 0x00FC0000) >> 18;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0003F000) >> 12;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x00000FC0) >> 6;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0000003F);
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
}
|
||||
|
||||
while ((i + 3) <= octetString.length) {
|
||||
// store the octets
|
||||
bits24 = (octetString[i++] & 0xFF) << 16;
|
||||
bits24 |= (octetString[i++] & 0xFF) << 8;
|
||||
bits24 |= (octetString[i++] & 0xFF);
|
||||
if (octetString.length - i == 2) {
|
||||
// store the octets
|
||||
bits24 = (octetString[i] & 0xFF) << 16;
|
||||
bits24 |= (octetString[i + 1] & 0xFF) << 8;
|
||||
|
||||
bits6 = (bits24 & 0x00FC0000) >> 18;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0003F000) >> 12;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x00000FC0) >> 6;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0000003F);
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
}
|
||||
bits6 = (bits24 & 0x00FC0000) >> 18;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0003F000) >> 12;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x00000FC0) >> 6;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
|
||||
if (octetString.length - i == 2) {
|
||||
// store the octets
|
||||
bits24 = (octetString[i] & 0xFF) << 16;
|
||||
bits24 |= (octetString[i + 1] & 0xFF) << 8;
|
||||
// padding
|
||||
out[outIndex++] = '=';
|
||||
} else if (octetString.length - i == 1) {
|
||||
// store the octets
|
||||
bits24 = (octetString[i] & 0xFF) << 16;
|
||||
|
||||
bits6 = (bits24 & 0x00FC0000) >> 18;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0003F000) >> 12;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x00000FC0) >> 6;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x00FC0000) >> 18;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0003F000) >> 12;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
|
||||
// padding
|
||||
out[outIndex++] = '=';
|
||||
} else if (octetString.length - i == 1) {
|
||||
// store the octets
|
||||
bits24 = (octetString[i] & 0xFF) << 16;
|
||||
// padding
|
||||
out[outIndex++] = '=';
|
||||
out[outIndex++] = '=';
|
||||
}
|
||||
|
||||
bits6 = (bits24 & 0x00FC0000) >> 18;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
bits6 = (bits24 & 0x0003F000) >> 12;
|
||||
out[outIndex++] = alphabet[bits6];
|
||||
|
||||
// padding
|
||||
out[outIndex++] = '=';
|
||||
out[outIndex++] = '=';
|
||||
}
|
||||
|
||||
return new String(out);
|
||||
}
|
||||
return new String(out);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,22 +1,30 @@
|
|||
package net.osmand.osm.io;
|
||||
|
||||
import com.github.scribejava.core.model.OAuthRequest;
|
||||
import com.github.scribejava.core.model.Response;
|
||||
import com.github.scribejava.core.model.Verb;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.osm.oauth.OsmOAuthAuthorizationClient;
|
||||
import net.osmand.util.Algorithms;
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.Proxy;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
public class NetworkUtils {
|
||||
private static final Log log = PlatformUtil.getLog(NetworkUtils.class);
|
||||
private static final String GPX_UPLOAD_USER_AGENT = "OsmGPXUploadAgent";
|
||||
|
||||
private static Proxy proxy = null;
|
||||
|
||||
public static String sendGetRequest(String urlText, String userNamePassword, StringBuilder responseBody){
|
||||
|
@ -29,7 +37,7 @@ public class NetworkUtils {
|
|||
if(userNamePassword != null) {
|
||||
conn.setRequestProperty("Authorization", "Basic " + Base64.encode(userNamePassword)); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
conn.setRequestProperty("User-Agent", "OsmAnd"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
conn.setRequestProperty("User-Agent", "OsmAnd"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
log.info("Response code and message : " + conn.getResponseCode() + " " + conn.getResponseMessage());
|
||||
if(conn.getResponseCode() != 200){
|
||||
return conn.getResponseMessage();
|
||||
|
@ -47,6 +55,7 @@ public class NetworkUtils {
|
|||
responseBody.append("\n"); //$NON-NLS-1$
|
||||
}
|
||||
responseBody.append(s);
|
||||
|
||||
}
|
||||
is.close();
|
||||
}
|
||||
|
@ -56,110 +65,46 @@ public class NetworkUtils {
|
|||
return e.getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
public static String sendPostDataRequest(String urlText, String formName, String fileName, InputStream data) {
|
||||
try {
|
||||
log.info("POST : " + urlText);
|
||||
HttpURLConnection conn = getHttpURLConnection(urlText);
|
||||
conn.setDoInput(true);
|
||||
conn.setDoOutput(false);
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("Accept", "*/*");
|
||||
conn.setRequestProperty("User-Agent", "OsmAnd"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
|
||||
OutputStream ous = conn.getOutputStream();
|
||||
ous.write(("--" + BOUNDARY + "\r\n").getBytes());
|
||||
ous.write(("Content-Disposition: form-data; name=\"" + formName + "\"; filename=\"" + fileName + "\"\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.write(("Content-Type: application/octet-stream\r\n\r\n").getBytes()); //$NON-NLS-1$
|
||||
Algorithms.streamCopy(data, ous);
|
||||
ous.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.flush();
|
||||
log.info("Response code and message : " + conn.getResponseCode() + " " + conn.getResponseMessage());
|
||||
if (conn.getResponseCode() != 200) {
|
||||
return null;
|
||||
}
|
||||
StringBuilder responseBody = new StringBuilder();
|
||||
InputStream is = conn.getInputStream();
|
||||
responseBody.setLength(0);
|
||||
if (is != null) {
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8")); //$NON-NLS-1$
|
||||
String s;
|
||||
boolean first = true;
|
||||
while ((s = in.readLine()) != null) {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
responseBody.append("\n"); //$NON-NLS-1$
|
||||
}
|
||||
responseBody.append(s);
|
||||
}
|
||||
is.close();
|
||||
}
|
||||
Algorithms.closeStream(is);
|
||||
Algorithms.closeStream(data);
|
||||
Algorithms.closeStream(ous);
|
||||
return responseBody.toString();
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
return e.getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static final String BOUNDARY = "CowMooCowMooCowCowCow"; //$NON-NLS-1$
|
||||
public static String uploadFile(String urlText, File fileToUpload, String userNamePassword,
|
||||
OsmOAuthAuthorizationClient client,
|
||||
String formName, boolean gzip, Map<String, String> additionalMapData){
|
||||
public static String uploadFile(String urlText, File fileToUpload, String userNamePassword, String formName, boolean gzip, Map<String, String> additionalMapData){
|
||||
URL url;
|
||||
try {
|
||||
boolean firstPrm =!urlText.contains("?");
|
||||
for (Map.Entry<String, String> entry : additionalMapData.entrySet()) {
|
||||
urlText += (firstPrm ? "?" : "&") + entry.getKey() + "=" + URLEncoder.encode(entry.getValue(), "UTF-8");
|
||||
for (String key : additionalMapData.keySet()) {
|
||||
urlText += (firstPrm ? "?" : "&") + key + "=" + URLEncoder.encode(additionalMapData.get(key), "UTF-8");
|
||||
firstPrm = false;
|
||||
}
|
||||
log.info("Start uploading file to " + urlText + " " +fileToUpload.getName());
|
||||
url = new URL(urlText);
|
||||
HttpURLConnection conn;
|
||||
if (client != null && client.isValidToken()){
|
||||
OAuthRequest req = new OAuthRequest(Verb.POST, urlText);
|
||||
client.getService().signRequest(client.getAccessToken(), req);
|
||||
req.addHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
|
||||
try {
|
||||
Response r = client.getHttpClient().execute(GPX_UPLOAD_USER_AGENT, req.getHeaders(), req.getVerb(),
|
||||
req.getCompleteUrl(), fileToUpload);
|
||||
if (r.getCode() != 200) {
|
||||
return r.getBody();
|
||||
}
|
||||
return null;
|
||||
} catch (InterruptedException e) {
|
||||
log.error(e);
|
||||
} catch (ExecutionException e) {
|
||||
log.error(e);
|
||||
}
|
||||
return null;
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setDoInput(true);
|
||||
conn.setDoOutput(true);
|
||||
conn.setRequestMethod("POST");
|
||||
if(userNamePassword != null) {
|
||||
conn.setRequestProperty("Authorization", "Basic " + Base64.encode(userNamePassword)); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
else {
|
||||
conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setDoInput(true);
|
||||
conn.setDoOutput(true);
|
||||
conn.setRequestMethod("POST");
|
||||
if(userNamePassword != null) {
|
||||
conn.setRequestProperty("Authorization", "Basic " + Base64.encode(userNamePassword)); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
}
|
||||
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
conn.setRequestProperty("User-Agent", "OsmAnd"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
OutputStream ous = conn.getOutputStream();
|
||||
ous.write(("--" + BOUNDARY + "\r\n").getBytes());
|
||||
|
||||
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
conn.setRequestProperty("User-Agent", "OsmAnd"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
OutputStream ous = conn.getOutputStream();
|
||||
// for (String key : additionalMapData.keySet()) {
|
||||
// ous.write(("--" + BOUNDARY + "\r\n").getBytes());
|
||||
// ous.write(("content-disposition: form-data; name=\"" + key + "\"\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
// ous.write((additionalMapData.get(key) + "\r\n").getBytes());
|
||||
// }
|
||||
ous.write(("--" + BOUNDARY+"\r\n").getBytes());
|
||||
String filename = fileToUpload.getName();
|
||||
if (gzip) {
|
||||
filename += ".gz";
|
||||
if(gzip){
|
||||
filename+=".gz";
|
||||
}
|
||||
ous.write(("content-disposition: form-data; name=\"" + formName + "\"; filename=\"" + filename + "\"\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.write(("Content-Type: application/octet-stream\r\n\r\n").getBytes()); //$NON-NLS-1$
|
||||
InputStream fis = new FileInputStream(fileToUpload);
|
||||
ous.write(("content-disposition: form-data; name=\""+formName+"\"; filename=\"" + filename + "\"\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.write(("Content-Type: application/octet-stream\r\n\r\n").getBytes()); //$NON-NLS-1$
|
||||
InputStream fis = new FileInputStream(fileToUpload);
|
||||
BufferedInputStream bis = new BufferedInputStream(fis, 20 * 1024);
|
||||
ous.flush();
|
||||
if (gzip) {
|
||||
if(gzip){
|
||||
GZIPOutputStream gous = new GZIPOutputStream(ous, 1024);
|
||||
Algorithms.streamCopy(bis, gous);
|
||||
gous.flush();
|
||||
|
@ -167,7 +112,8 @@ public class NetworkUtils {
|
|||
} else {
|
||||
Algorithms.streamCopy(bis, ous);
|
||||
}
|
||||
ous.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
ous.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.flush();
|
||||
Algorithms.closeStream(bis);
|
||||
Algorithms.closeStream(ous);
|
||||
|
@ -190,6 +136,7 @@ public class NetworkUtils {
|
|||
responseBody.append("\n"); //$NON-NLS-1$
|
||||
}
|
||||
responseBody.append(s);
|
||||
|
||||
}
|
||||
is.close();
|
||||
}
|
||||
|
@ -210,6 +157,7 @@ public class NetworkUtils {
|
|||
proxy = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static Proxy getProxy() {
|
||||
return proxy;
|
||||
}
|
||||
|
|
|
@ -183,7 +183,7 @@ public class OsmBaseStorage {
|
|||
protected static final int moduleProgress = 1 << 10;
|
||||
|
||||
public void startElement(XmlPullParser parser, String name) {
|
||||
if (!parseStarted) {
|
||||
if(!parseStarted){
|
||||
initRootElement(parser, name);
|
||||
}
|
||||
if (ELEM_MODIFY.equals(name) ) {
|
||||
|
@ -283,14 +283,13 @@ public class OsmBaseStorage {
|
|||
if (type != null) {
|
||||
if(currentParsedEntity != null){
|
||||
EntityId entityId = new EntityId(type, currentParsedEntity.getId());
|
||||
if (acceptEntityToLoad(entityId, currentParsedEntity)) {
|
||||
if(acceptEntityToLoad(entityId, currentParsedEntity)){
|
||||
Entity oldEntity = entities.put(entityId, currentParsedEntity);
|
||||
if (parseEntityInfo && currentParsedEntityInfo != null) {
|
||||
if(parseEntityInfo && currentParsedEntityInfo != null){
|
||||
entityInfo.put(entityId, currentParsedEntityInfo);
|
||||
}
|
||||
if (!supressWarnings && oldEntity != null) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Entity with id=" + oldEntity.getId() + " is duplicated in osm map"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
if(!supressWarnings && oldEntity!= null){
|
||||
throw new UnsupportedOperationException("Entity with id=" + oldEntity.getId() +" is duplicated in osm map"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
} else {
|
||||
// System.gc();
|
||||
|
@ -309,8 +308,8 @@ public class OsmBaseStorage {
|
|||
|
||||
|
||||
protected boolean acceptEntityToLoad(EntityId entityId, Entity entity) {
|
||||
for (IOsmStorageFilter f : filters) {
|
||||
if (!f.acceptEntityToLoad(this, entityId, entity)) {
|
||||
for(IOsmStorageFilter f : filters){
|
||||
if(!f.acceptEntityToLoad(this, entityId, entity)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,259 +0,0 @@
|
|||
package net.osmand.osm.oauth;
|
||||
|
||||
import com.github.scribejava.core.exceptions.OAuthException;
|
||||
import com.github.scribejava.core.httpclient.HttpClient;
|
||||
import com.github.scribejava.core.httpclient.jdk.JDKHttpClientConfig;
|
||||
import com.github.scribejava.core.httpclient.jdk.JDKHttpFuture;
|
||||
import com.github.scribejava.core.httpclient.multipart.MultipartPayload;
|
||||
import com.github.scribejava.core.httpclient.multipart.MultipartUtils;
|
||||
import com.github.scribejava.core.model.*;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public class OsmAndJDKHttpClient implements HttpClient {
|
||||
private static final String BOUNDARY = "CowMooCowMooCowCowCow";
|
||||
private final JDKHttpClientConfig config;
|
||||
|
||||
public OsmAndJDKHttpClient() {
|
||||
this(JDKHttpClientConfig.defaultConfig());
|
||||
}
|
||||
|
||||
public OsmAndJDKHttpClient(JDKHttpClientConfig clientConfig) {
|
||||
config = clientConfig;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
byte[] bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) {
|
||||
|
||||
return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodyType.BYTE_ARRAY, bodyContents, callback,
|
||||
converter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
MultipartPayload bodyContents, OAuthAsyncRequestCallback<T> callback,
|
||||
OAuthRequest.ResponseConverter<T> converter) {
|
||||
|
||||
return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodyType.MULTIPART, bodyContents, callback,
|
||||
converter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
String bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) {
|
||||
|
||||
return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodyType.STRING, bodyContents, callback,
|
||||
converter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
File bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) {
|
||||
return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodyType.STREAM, bodyContents, callback,
|
||||
converter);
|
||||
}
|
||||
|
||||
private <T> Future<T> doExecuteAsync(String userAgent, Map<String, String> headers, Verb httpVerb,
|
||||
String completeUrl, BodyType bodyType, Object bodyContents, OAuthAsyncRequestCallback<T> callback,
|
||||
OAuthRequest.ResponseConverter<T> converter) {
|
||||
try {
|
||||
final Response response = doExecute(userAgent, headers, httpVerb, completeUrl, bodyType, bodyContents);
|
||||
@SuppressWarnings("unchecked") final T t = converter == null ? (T) response : converter.convert(response);
|
||||
if (callback != null) {
|
||||
callback.onCompleted(t);
|
||||
}
|
||||
return new JDKHttpFuture<>(t);
|
||||
} catch (IOException | RuntimeException e) {
|
||||
if (callback != null) {
|
||||
callback.onThrowable(e);
|
||||
}
|
||||
return new JDKHttpFuture<>(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
byte[] bodyContents) throws InterruptedException, ExecutionException, IOException {
|
||||
return doExecute(userAgent, headers, httpVerb, completeUrl, BodyType.BYTE_ARRAY, bodyContents);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
MultipartPayload multipartPayloads) throws InterruptedException, ExecutionException, IOException {
|
||||
return doExecute(userAgent, headers, httpVerb, completeUrl, BodyType.MULTIPART, multipartPayloads);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
String bodyContents) throws InterruptedException, ExecutionException, IOException {
|
||||
return doExecute(userAgent, headers, httpVerb, completeUrl, BodyType.STRING, bodyContents);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response execute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
File bodyContents) throws InterruptedException, ExecutionException, IOException {
|
||||
return doExecute(userAgent, headers, httpVerb, completeUrl, BodyType.STREAM, bodyContents);
|
||||
}
|
||||
|
||||
private Response doExecute(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
|
||||
BodyType bodyType, Object bodyContents) throws IOException {
|
||||
final URL url = new URL(completeUrl);
|
||||
final HttpURLConnection connection;
|
||||
if (config.getProxy() == null) {
|
||||
connection = (HttpURLConnection) url.openConnection();
|
||||
} else {
|
||||
connection = (HttpURLConnection) url.openConnection(config.getProxy());
|
||||
}
|
||||
connection.setInstanceFollowRedirects(config.isFollowRedirects());
|
||||
connection.setRequestMethod(httpVerb.name());
|
||||
if (config.getConnectTimeout() != null) {
|
||||
connection.setConnectTimeout(config.getConnectTimeout());
|
||||
}
|
||||
if (config.getReadTimeout() != null) {
|
||||
connection.setReadTimeout(config.getReadTimeout());
|
||||
}
|
||||
addHeaders(connection, headers, userAgent);
|
||||
if (httpVerb.isPermitBody()) {
|
||||
bodyType.setBody(connection, bodyContents, httpVerb.isRequiresBody());
|
||||
}
|
||||
|
||||
try {
|
||||
connection.connect();
|
||||
final int responseCode = connection.getResponseCode();
|
||||
return new Response(responseCode, connection.getResponseMessage(), parseHeaders(connection),
|
||||
responseCode >= 200 && responseCode < 400 ? connection.getInputStream()
|
||||
: connection.getErrorStream());
|
||||
} catch (UnknownHostException e) {
|
||||
throw new OAuthException("The IP address of a host could not be determined.", e);
|
||||
}
|
||||
}
|
||||
|
||||
private enum BodyType {
|
||||
BYTE_ARRAY {
|
||||
@Override
|
||||
void setBody(HttpURLConnection connection, Object bodyContents, boolean requiresBody) throws IOException {
|
||||
addBody(connection, (byte[]) bodyContents, requiresBody);
|
||||
}
|
||||
},
|
||||
STREAM {
|
||||
@Override
|
||||
void setBody(HttpURLConnection connection, Object bodyContents, boolean requiresBody) throws IOException {
|
||||
addBody(connection, (File) bodyContents, requiresBody);
|
||||
}
|
||||
},
|
||||
MULTIPART {
|
||||
@Override
|
||||
void setBody(HttpURLConnection connection, Object bodyContents, boolean requiresBody) throws IOException {
|
||||
addBody(connection, (MultipartPayload) bodyContents, requiresBody);
|
||||
}
|
||||
},
|
||||
STRING {
|
||||
@Override
|
||||
void setBody(HttpURLConnection connection, Object bodyContents, boolean requiresBody) throws IOException {
|
||||
addBody(connection, ((String) bodyContents).getBytes(), requiresBody);
|
||||
}
|
||||
};
|
||||
|
||||
abstract void setBody(HttpURLConnection connection, Object bodyContents, boolean requiresBody)
|
||||
throws IOException;
|
||||
}
|
||||
|
||||
private static Map<String, String> parseHeaders(HttpURLConnection conn) {
|
||||
final Map<String, String> headers = new HashMap<>();
|
||||
|
||||
for (Map.Entry<String, List<String>> headerField : conn.getHeaderFields().entrySet()) {
|
||||
final String key = headerField.getKey();
|
||||
final String value = headerField.getValue().get(0);
|
||||
if ("Content-Encoding".equalsIgnoreCase(key)) {
|
||||
headers.put("Content-Encoding", value);
|
||||
} else {
|
||||
headers.put(key, value);
|
||||
}
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
|
||||
private static void addHeaders(HttpURLConnection connection, Map<String, String> headers, String userAgent) {
|
||||
for (Map.Entry<String, String> header : headers.entrySet()) {
|
||||
connection.setRequestProperty(header.getKey(), header.getValue());
|
||||
}
|
||||
|
||||
if (userAgent != null) {
|
||||
connection.setRequestProperty(OAuthConstants.USER_AGENT_HEADER_NAME, userAgent);
|
||||
}
|
||||
}
|
||||
|
||||
private static void addBody(HttpURLConnection connection, File file, boolean requiresBody) throws IOException {
|
||||
if (requiresBody) {
|
||||
String filename = file.getName();
|
||||
String formName = "file";
|
||||
InputStream stream = new FileInputStream(file);
|
||||
connection.setDoInput(true);
|
||||
connection.setDoOutput(true);
|
||||
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
connection.setRequestProperty("User-Agent", "OsmAnd"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
final OutputStream ous = connection.getOutputStream();
|
||||
ous.write(("--" + BOUNDARY + "\r\n").getBytes());
|
||||
ous.write(("content-disposition: form-data; name=\"" + formName + "\"; filename=\"" + filename + "\"\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.write(("Content-Type: application/octet-stream\r\n\r\n").getBytes()); //$NON-NLS-1$
|
||||
BufferedInputStream bis = new BufferedInputStream(stream, 20 * 1024);
|
||||
ous.flush();
|
||||
Algorithms.streamCopy(bis, ous);
|
||||
ous.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
ous.flush();
|
||||
Algorithms.closeStream(bis);
|
||||
}
|
||||
}
|
||||
|
||||
private static void addBody(HttpURLConnection connection, byte[] content, boolean requiresBody) throws IOException {
|
||||
final int contentLength = content.length;
|
||||
if (requiresBody || contentLength > 0) {
|
||||
connection.setDoOutput(true);
|
||||
final OutputStream outputStream = prepareConnectionForBodyAndGetOutputStream(connection, contentLength);
|
||||
if (contentLength > 0) {
|
||||
outputStream.write(content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void addBody(HttpURLConnection connection, MultipartPayload multipartPayload, boolean requiresBody)
|
||||
throws IOException {
|
||||
|
||||
for (Map.Entry<String, String> header : multipartPayload.getHeaders().entrySet()) {
|
||||
connection.setRequestProperty(header.getKey(), header.getValue());
|
||||
}
|
||||
|
||||
if (requiresBody) {
|
||||
final ByteArrayOutputStream os = MultipartUtils.getPayload(multipartPayload);
|
||||
final int contentLength = os.size();
|
||||
connection.setDoOutput(true);
|
||||
final OutputStream outputStream = prepareConnectionForBodyAndGetOutputStream(connection, contentLength);
|
||||
if (contentLength > 0) {
|
||||
os.writeTo(outputStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static OutputStream prepareConnectionForBodyAndGetOutputStream(HttpURLConnection connection,
|
||||
int contentLength) throws IOException {
|
||||
connection.setRequestProperty(CONTENT_LENGTH, String.valueOf(contentLength));
|
||||
if (connection.getRequestProperty(CONTENT_TYPE) == null) {
|
||||
connection.setRequestProperty(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
|
||||
}
|
||||
return connection.getOutputStream();
|
||||
}
|
||||
}
|
|
@ -1,175 +0,0 @@
|
|||
// License: GPL. For details, see LICENSE file.
|
||||
package net.osmand.osm.oauth;
|
||||
|
||||
import com.github.scribejava.core.builder.ServiceBuilder;
|
||||
import com.github.scribejava.core.builder.api.DefaultApi10a;
|
||||
import com.github.scribejava.core.builder.api.OAuth1SignatureType;
|
||||
import com.github.scribejava.core.httpclient.jdk.JDKHttpClientConfig;
|
||||
import com.github.scribejava.core.model.*;
|
||||
import com.github.scribejava.core.oauth.OAuth10aService;
|
||||
import net.osmand.PlatformUtil;
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
/**
|
||||
* An OAuth 1.0 authorization client.
|
||||
*
|
||||
* @since 2746
|
||||
*/
|
||||
public class OsmOAuthAuthorizationClient {
|
||||
private OAuth1RequestToken requestToken;
|
||||
private OAuth1AccessToken accessToken;
|
||||
private final OAuth10aService service;
|
||||
private final OsmAndJDKHttpClient httpClient;
|
||||
public final static Log log = PlatformUtil.getLog(OsmOAuthAuthorizationClient.class);
|
||||
|
||||
public OsmOAuthAuthorizationClient(String key, String secret, DefaultApi10a api) {
|
||||
httpClient = new OsmAndJDKHttpClient(JDKHttpClientConfig.defaultConfig());
|
||||
service = new ServiceBuilder(key)
|
||||
.apiSecret(secret)
|
||||
.httpClient(httpClient)
|
||||
.callback("osmand-oauth://example.com/oauth")
|
||||
.build(api);
|
||||
}
|
||||
|
||||
public static class OsmApi extends DefaultApi10a {
|
||||
@Override
|
||||
public OAuth1SignatureType getSignatureType() {
|
||||
return OAuth1SignatureType.QUERY_STRING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRequestTokenEndpoint() {
|
||||
return "https://www.openstreetmap.org/oauth/request_token";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccessTokenEndpoint() {
|
||||
return "https://www.openstreetmap.org/oauth/access_token";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getAuthorizationBaseUrl() {
|
||||
return "https://www.openstreetmap.org/oauth/authorize";
|
||||
}
|
||||
}
|
||||
|
||||
public static class OsmDevApi extends DefaultApi10a {
|
||||
@Override
|
||||
public OAuth1SignatureType getSignatureType() {
|
||||
return OAuth1SignatureType.QUERY_STRING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRequestTokenEndpoint() {
|
||||
return "https://master.apis.dev.openstreetmap.org/oauth/request_token";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccessTokenEndpoint() {
|
||||
return "https://master.apis.dev.openstreetmap.org/oauth/access_token";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getAuthorizationBaseUrl() {
|
||||
return "https://master.apis.dev.openstreetmap.org/oauth/authorize";
|
||||
}
|
||||
}
|
||||
|
||||
public OsmAndJDKHttpClient getHttpClient() {
|
||||
return httpClient;
|
||||
}
|
||||
|
||||
public OAuth10aService getService() {
|
||||
return service;
|
||||
}
|
||||
|
||||
public void setAccessToken(OAuth1AccessToken accessToken) {
|
||||
this.accessToken = accessToken;
|
||||
}
|
||||
|
||||
public OAuth1AccessToken getAccessToken() {
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
public OAuth1RequestToken getRequestToken() {
|
||||
return requestToken;
|
||||
}
|
||||
|
||||
public Response performRequestWithoutAuth(String url, String requestMethod, String requestBody)
|
||||
throws InterruptedException, ExecutionException, IOException {
|
||||
Verb verb = parseRequestMethod(requestMethod);
|
||||
OAuthRequest req = new OAuthRequest(verb, url);
|
||||
req.setPayload(requestBody);
|
||||
return service.execute(req);
|
||||
}
|
||||
|
||||
public void performGetRequest(String url, OAuthAsyncRequestCallback<Response> callback) {
|
||||
if (accessToken == null) {
|
||||
throw new IllegalStateException("Access token is null");
|
||||
}
|
||||
OAuthRequest req = new OAuthRequest(Verb.GET, url);
|
||||
service.signRequest(accessToken, req);
|
||||
service.execute(req, callback);
|
||||
}
|
||||
|
||||
public Response performRequest(String url, String method, String body)
|
||||
throws InterruptedException, ExecutionException, IOException {
|
||||
service.getApi().getSignatureType();
|
||||
if (accessToken == null) {
|
||||
throw new IllegalStateException("Access token is null");
|
||||
}
|
||||
Verb verbMethod = parseRequestMethod(method);
|
||||
OAuthRequest req = new OAuthRequest(verbMethod, url);
|
||||
req.setPayload(body);
|
||||
service.signRequest(accessToken, req);
|
||||
req.addHeader("Content-Type", "application/xml");
|
||||
return service.execute(req);
|
||||
}
|
||||
|
||||
public OAuth1RequestToken startOAuth() {
|
||||
try {
|
||||
requestToken = service.getRequestToken();
|
||||
} catch (IOException e) {
|
||||
log.error(e);
|
||||
} catch (InterruptedException e) {
|
||||
log.error(e);
|
||||
} catch (ExecutionException e) {
|
||||
log.error(e);
|
||||
}
|
||||
return requestToken;
|
||||
}
|
||||
|
||||
public OAuth1AccessToken authorize(String oauthVerifier) {
|
||||
try {
|
||||
setAccessToken(service.getAccessToken(requestToken, oauthVerifier));
|
||||
} catch (IOException e) {
|
||||
log.error(e);
|
||||
} catch (InterruptedException e) {
|
||||
log.error(e);
|
||||
} catch (ExecutionException e) {
|
||||
log.error(e);
|
||||
}
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
public boolean isValidToken() {
|
||||
return !(accessToken == null);
|
||||
}
|
||||
|
||||
private Verb parseRequestMethod(String method) {
|
||||
Verb m = Verb.GET;
|
||||
if (method.equals("POST")) {
|
||||
m = Verb.POST;
|
||||
}
|
||||
if (method.equals("PUT")) {
|
||||
m = Verb.PUT;
|
||||
}
|
||||
if (method.equals("DELETE")) {
|
||||
m = Verb.DELETE;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
}
|
|
@ -41,7 +41,7 @@ public class RenderingRule {
|
|||
public void init(Map<String, String> attributes) {
|
||||
ArrayList<RenderingRuleProperty> props = new ArrayList<RenderingRuleProperty>(attributes.size());
|
||||
intProperties = new int[attributes.size()];
|
||||
floatProperties = new float[attributes.size()];
|
||||
floatProperties = null;
|
||||
attributesRef = null;
|
||||
int i = 0;
|
||||
Iterator<Entry<String, String>> it = attributes.entrySet().iterator();
|
||||
|
@ -58,19 +58,20 @@ public class RenderingRule {
|
|||
attributesRef[i] = storage.getRenderingAttributeRule(vl.substring(1));
|
||||
} else if (property.isString()) {
|
||||
intProperties[i] = storage.getDictionaryValue(vl);
|
||||
} else if (property.isFloat()) {
|
||||
if (floatProperties == null) {
|
||||
// lazy creates
|
||||
floatProperties = new float[attributes.size()];
|
||||
}
|
||||
floatProperties[i] = property.parseFloatValue(vl);
|
||||
intProperties[i] = property.parseIntValue(vl);
|
||||
} else {
|
||||
float floatVal = property.parseFloatValue(vl);
|
||||
// if (floatProperties == null && floatVal != 0) {
|
||||
// // lazy creates
|
||||
// floatProperties = new float[attributes.size()];
|
||||
floatProperties[i] = floatVal;
|
||||
// }
|
||||
intProperties[i] = property.parseIntValue(vl);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
properties = props.toArray(new RenderingRuleProperty[0]);
|
||||
properties = props.toArray(new RenderingRuleProperty[props.size()]);
|
||||
}
|
||||
|
||||
private int getPropertyIndex(String property){
|
||||
|
@ -94,7 +95,7 @@ public class RenderingRule {
|
|||
|
||||
public float getFloatPropertyValue(String property) {
|
||||
int i = getPropertyIndex(property);
|
||||
if (i >= 0) {
|
||||
if(i >= 0 && floatProperties != null){
|
||||
return floatProperties[i];
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -155,7 +155,12 @@ public class RenderingRuleProperty {
|
|||
try {
|
||||
int colon = value.indexOf(':');
|
||||
if(colon != -1) {
|
||||
return (int) Float.parseFloat(value.substring(colon + 1));
|
||||
int c = 0;
|
||||
if(colon > 0) {
|
||||
c += (int) Float.parseFloat(value.substring(0, colon));
|
||||
}
|
||||
c += (int) Float.parseFloat(value.substring(colon + 1));
|
||||
return c;
|
||||
}
|
||||
return (int) Float.parseFloat(value);
|
||||
} catch (NumberFormatException e) {
|
||||
|
@ -185,35 +190,30 @@ public class RenderingRuleProperty {
|
|||
} catch (NumberFormatException e) {
|
||||
log.error("Rendering parse " + value + " in " + attrName);
|
||||
}
|
||||
return 0;
|
||||
return -1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
public float parseFloatValue(String value) {
|
||||
try {
|
||||
if (type == FLOAT_TYPE) {
|
||||
public float parseFloatValue(String value){
|
||||
if(type == FLOAT_TYPE){
|
||||
try {
|
||||
int colon = value.indexOf(':');
|
||||
if (colon != -1) {
|
||||
if (colon > 0) {
|
||||
if(colon != -1) {
|
||||
if(colon > 0) {
|
||||
return Float.parseFloat(value.substring(0, colon));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return Float.parseFloat(value);
|
||||
|
||||
} else if (type == INT_TYPE) {
|
||||
int colon = value.indexOf(':');
|
||||
if (colon != -1 && colon > 0) {
|
||||
return Float.parseFloat(value.substring(0, colon));
|
||||
}
|
||||
return 0;
|
||||
} catch (NumberFormatException e) {
|
||||
log.error("Rendering parse " + value + " in " + attrName);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
log.error("Rendering parse " + value + " in " + attrName);
|
||||
return -1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -244,6 +244,8 @@ public class RenderingRuleStorageProperties {
|
|||
R_TEXT_HALO_COLOR = registerRuleInternal(RenderingRuleProperty.createOutputColorProperty(TEXT_HALO_COLOR));
|
||||
R_TEXT_SIZE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(TEXT_SIZE));
|
||||
R_TEXT_ORDER = registerRuleInternal(RenderingRuleProperty.createOutputIntProperty(TEXT_ORDER));
|
||||
R_ICON_ORDER = registerRuleInternal(RenderingRuleProperty.createOutputIntProperty(ICON_ORDER));
|
||||
R_ICON_VISIBLE_SIZE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(ICON_VISIBLE_SIZE));
|
||||
R_TEXT_MIN_DISTANCE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(TEXT_MIN_DISTANCE));
|
||||
R_TEXT_SHIELD = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty(TEXT_SHIELD));
|
||||
|
||||
|
@ -263,9 +265,7 @@ public class RenderingRuleStorageProperties {
|
|||
R_ICON_3 = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty("icon_3"));
|
||||
R_ICON_4 = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty("icon_4"));
|
||||
R_ICON_5 = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty("icon_5"));
|
||||
R_ICON_ORDER = registerRuleInternal(RenderingRuleProperty.createOutputIntProperty(ICON_ORDER));
|
||||
R_SHIELD = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty(SHIELD));
|
||||
R_ICON_VISIBLE_SIZE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(ICON_VISIBLE_SIZE));
|
||||
|
||||
// polygon/way
|
||||
R_COLOR = registerRuleInternal(RenderingRuleProperty.createOutputColorProperty(COLOR));
|
||||
|
@ -318,7 +318,7 @@ public class RenderingRuleStorageProperties {
|
|||
}
|
||||
|
||||
public RenderingRuleProperty[] getPoperties() {
|
||||
return rules.toArray(new RenderingRuleProperty[0]);
|
||||
return rules.toArray(new RenderingRuleProperty[rules.size()]);
|
||||
}
|
||||
|
||||
public List<RenderingRuleProperty> getCustomRules() {
|
||||
|
|
|
@ -432,7 +432,8 @@ public class RenderingRulesStorage {
|
|||
for(RenderingRule ch : caseChildren) {
|
||||
List<RenderingRule> apply = applyRules;
|
||||
if(!renderingRule.getIfChildren().isEmpty()) {
|
||||
apply = new ArrayList<>(renderingRule.getIfChildren());
|
||||
apply = new ArrayList<RenderingRule>();
|
||||
apply.addAll(renderingRule.getIfChildren());
|
||||
if(applyRules != null) {
|
||||
apply.addAll(applyRules);
|
||||
}
|
||||
|
@ -491,10 +492,10 @@ public class RenderingRulesStorage {
|
|||
}
|
||||
|
||||
public String[] getRenderingAttributeNames() {
|
||||
return renderingAttributes.keySet().toArray(new String[0]);
|
||||
return renderingAttributes.keySet().toArray(new String[renderingAttributes.size()]);
|
||||
}
|
||||
public RenderingRule[] getRenderingAttributeValues() {
|
||||
return renderingAttributes.values().toArray(new RenderingRule[0]);
|
||||
return renderingAttributes.values().toArray(new RenderingRule[renderingAttributes.size()]);
|
||||
}
|
||||
|
||||
public RenderingRule[] getRules(int state){
|
||||
|
|
|
@ -152,9 +152,9 @@ public class RenderingRulesStoragePrinter {
|
|||
for (int i = 0; i < 15; i++) {
|
||||
out.println("" + indent + ti + "RenderingRule rule" + i + " = null;");
|
||||
}
|
||||
for (Entry<String, RenderingRule> entry : storage.renderingAttributes.entrySet()) {
|
||||
generateRenderingRule(storage, out, indent + ti, "rule", 0, entry.getValue());
|
||||
out.println("" + indent + ti + "storage.renderingAttributes.put(" + javaString(entry.getKey()) + ", rule0);");
|
||||
for (String s : storage.renderingAttributes.keySet()) {
|
||||
generateRenderingRule(storage, out, indent + ti, "rule", 0, storage.renderingAttributes.get(s));
|
||||
out.println("" + indent + ti + "storage.renderingAttributes.put(" + javaString(s) + ", rule0);");
|
||||
}
|
||||
out.println(""+indent +"}");
|
||||
}
|
||||
|
@ -221,7 +221,7 @@ public class RenderingRulesStoragePrinter {
|
|||
mp+=", ";
|
||||
}
|
||||
}
|
||||
if(mp.isEmpty()) {
|
||||
if(mp.equals("")) {
|
||||
mp = "java.util.Collections.EMPTY_MAP";
|
||||
} else {
|
||||
mp = "createMap(" +mp +")";
|
||||
|
@ -242,9 +242,9 @@ public class RenderingRulesStoragePrinter {
|
|||
|
||||
private void printJavaInitConstants(RenderingRulesStorage storage, PrintStream out, String indent, String ti) {
|
||||
out.println("\n" + indent + "public void initConstants() {");
|
||||
for (Entry<String, String> entry : storage.renderingConstants.entrySet()) {
|
||||
out.println("" + indent + ti + "storage.renderingConstants.put(" + javaString(entry.getKey()) + ", "
|
||||
+ javaString(entry.getValue()) + ");");
|
||||
for (String s : storage.renderingConstants.keySet()) {
|
||||
out.println("" + indent + ti + "storage.renderingConstants.put(" + javaString(s) + ", "
|
||||
+ javaString(storage.renderingConstants.get(s)) + ");");
|
||||
}
|
||||
out.println(""+indent +"}");
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ public class RenderingRulesTransformer {
|
|||
for (int i = 0; i < nl.getLength();) {
|
||||
Element app = (Element) nl.item(i);
|
||||
String pt = app.getAttribute("pattern");
|
||||
if (!pt.isEmpty()) {
|
||||
if (!pt.equals("")) {
|
||||
if (!patterns.containsKey(pt)) {
|
||||
throw new IllegalStateException("Pattern '" + pt + "' is not defined");
|
||||
}
|
||||
|
|
|
@ -533,19 +533,16 @@ public class BinaryRoutePlanner {
|
|||
long fid = to.getRoad().getId();
|
||||
for (int i = 0; i < from.getRoad().getRestrictionLength(); i++) {
|
||||
long id = from.getRoad().getRestrictionId(i);
|
||||
int tp = from.getRoad().getRestrictionType(i);
|
||||
if (fid == id) {
|
||||
if (tp == MapRenderingTypes.RESTRICTION_NO_LEFT_TURN
|
||||
|| tp == MapRenderingTypes.RESTRICTION_NO_RIGHT_TURN
|
||||
|| tp == MapRenderingTypes.RESTRICTION_NO_STRAIGHT_ON
|
||||
|| tp == MapRenderingTypes.RESTRICTION_NO_U_TURN) {
|
||||
int tp = from.getRoad().getRestrictionType(i);
|
||||
if (tp == MapRenderingTypes.RESTRICTION_NO_LEFT_TURN ||
|
||||
tp == MapRenderingTypes.RESTRICTION_NO_RIGHT_TURN ||
|
||||
tp == MapRenderingTypes.RESTRICTION_NO_STRAIGHT_ON ||
|
||||
tp == MapRenderingTypes.RESTRICTION_NO_U_TURN) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (tp == MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
@ -650,36 +647,24 @@ public class BinaryRoutePlanner {
|
|||
int type = -1;
|
||||
if (!reverseWay) {
|
||||
for (int i = 0; i < road.getRestrictionLength(); i++) {
|
||||
int rt = road.getRestrictionType(i);
|
||||
long rv = road.getRestrictionVia(i);
|
||||
if (road.getRestrictionId(i) == next.road.id) {
|
||||
if (!via || rv == viaId) {
|
||||
type = rt;
|
||||
if(!via || road.getRestrictionVia(i) == viaId) {
|
||||
type = road.getRestrictionType(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rv == viaId && via && rt == MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON) {
|
||||
type = MapRenderingTypes.RESTRICTION_NO_STRAIGHT_ON;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < next.road.getRestrictionLength(); i++) {
|
||||
int rt = next.road.getRestrictionType(i);
|
||||
long rv = next.road.getRestrictionVia(i);
|
||||
long restrictedTo = next.road.getRestrictionId(i);
|
||||
if (restrictedTo == road.id) {
|
||||
if (!via || rv == viaId) {
|
||||
if(!via || next.road.getRestrictionVia(i) == viaId) {
|
||||
type = rt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (rv == viaId && via && rt == MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON) {
|
||||
type = MapRenderingTypes.RESTRICTION_NO_STRAIGHT_ON;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if there is restriction only to the other than current road
|
||||
if (rt == MapRenderingTypes.RESTRICTION_ONLY_RIGHT_TURN || rt == MapRenderingTypes.RESTRICTION_ONLY_LEFT_TURN
|
||||
|| rt == MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON) {
|
||||
|
|
|
@ -63,9 +63,9 @@ public class GeneralRouter implements VehicleRouter {
|
|||
|
||||
// cached values
|
||||
private boolean restrictionsAware = true;
|
||||
private float sharpTurn;
|
||||
private float leftTurn;
|
||||
private float roundaboutTurn;
|
||||
private float slightTurn;
|
||||
private float rightTurn;
|
||||
// speed in m/s
|
||||
private float minSpeed = 0.28f;
|
||||
// speed in m/s
|
||||
|
@ -220,19 +220,19 @@ public class GeneralRouter implements VehicleRouter {
|
|||
|
||||
public void addAttribute(String k, String v) {
|
||||
attributes.put(k, v);
|
||||
if (k.equals("restrictionsAware")) {
|
||||
if(k.equals("restrictionsAware")) {
|
||||
restrictionsAware = parseSilentBoolean(v, restrictionsAware);
|
||||
} else if (k.equals("sharpTurn") || k.equals("leftTurn")) {
|
||||
sharpTurn = parseSilentFloat(v, sharpTurn);
|
||||
} else if (k.equals("slightTurn") || k.equals("rightTurn")) {
|
||||
slightTurn = parseSilentFloat(v, slightTurn);
|
||||
} else if (k.equals("roundaboutTurn")) {
|
||||
} else if(k.equals("leftTurn")) {
|
||||
leftTurn = parseSilentFloat(v, leftTurn);
|
||||
} else if(k.equals("rightTurn")) {
|
||||
rightTurn = parseSilentFloat(v, rightTurn);
|
||||
} else if(k.equals("roundaboutTurn")) {
|
||||
roundaboutTurn = parseSilentFloat(v, roundaboutTurn);
|
||||
} else if (k.equals("minDefaultSpeed") || k.equals("defaultSpeed")) {
|
||||
} else if(k.equals("minDefaultSpeed") || k.equals("defaultSpeed")) {
|
||||
defaultSpeed = parseSilentFloat(v, defaultSpeed * 3.6f) / 3.6f;
|
||||
} else if (k.equals("minSpeed")) {
|
||||
} else if( k.equals("minSpeed")) {
|
||||
minSpeed = parseSilentFloat(v, minSpeed * 3.6f) / 3.6f;
|
||||
} else if (k.equals("maxDefaultSpeed") || k.equals("maxSpeed")) {
|
||||
} else if(k.equals("maxDefaultSpeed") || k.equals("maxSpeed")) {
|
||||
maxSpeed = parseSilentFloat(v, maxSpeed * 3.6f) / 3.6f;
|
||||
}
|
||||
}
|
||||
|
@ -605,11 +605,11 @@ public class GeneralRouter implements VehicleRouter {
|
|||
}
|
||||
|
||||
public double getLeftTurn() {
|
||||
return sharpTurn;
|
||||
return leftTurn;
|
||||
}
|
||||
|
||||
public double getRightTurn() {
|
||||
return slightTurn;
|
||||
return rightTurn;
|
||||
}
|
||||
|
||||
public double getRoundaboutTurn() {
|
||||
|
@ -620,11 +620,9 @@ public class GeneralRouter implements VehicleRouter {
|
|||
public double calculateTurnTime(RouteSegment segment, int segmentEnd, RouteSegment prev, int prevSegmentEnd) {
|
||||
float ts = getPenaltyTransition(segment.getRoad());
|
||||
float prevTs = getPenaltyTransition(prev.getRoad());
|
||||
float totalPenalty = 0;
|
||||
if (prevTs != ts) {
|
||||
totalPenalty += Math.abs(ts - prevTs) / 2;
|
||||
if(prevTs != ts) {
|
||||
return Math.abs(ts - prevTs) / 2;
|
||||
}
|
||||
|
||||
// int[] pt = prev.getRoad().getPointTypes(prevSegmentEnd);
|
||||
// if(pt != null) {
|
||||
// RouteRegion reg = prev.getRoad().region;
|
||||
|
@ -636,28 +634,27 @@ public class GeneralRouter implements VehicleRouter {
|
|||
// }
|
||||
// }
|
||||
// }
|
||||
if (shortestRoute) {
|
||||
return totalPenalty;
|
||||
}
|
||||
|
||||
|
||||
if(segment.getRoad().roundabout() && !prev.getRoad().roundabout()) {
|
||||
double rt = getRoundaboutTurn();
|
||||
if(rt > 0) {
|
||||
totalPenalty += rt;
|
||||
return rt;
|
||||
}
|
||||
} else if (getLeftTurn() > 0 || getRightTurn() > 0) {
|
||||
double a1 = segment.getRoad().directionRoute(segment.getSegmentStart(),
|
||||
segment.getSegmentStart() < segmentEnd);
|
||||
}
|
||||
if (getLeftTurn() > 0 || getRightTurn() > 0) {
|
||||
double a1 = segment.getRoad().directionRoute(segment.getSegmentStart(), segment.getSegmentStart() < segmentEnd);
|
||||
double a2 = prev.getRoad().directionRoute(prevSegmentEnd, prevSegmentEnd < prev.getSegmentStart());
|
||||
double diff = Math.abs(MapUtils.alignAngleDifference(a1 - a2 - Math.PI));
|
||||
// more like UT
|
||||
if (diff > 2 * Math.PI / 3) {
|
||||
totalPenalty += getLeftTurn();
|
||||
return getLeftTurn();
|
||||
} else if (diff > Math.PI / 3) {
|
||||
totalPenalty += getRightTurn();
|
||||
return getRightTurn();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return totalPenalty;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -757,21 +754,21 @@ public class GeneralRouter implements VehicleRouter {
|
|||
}
|
||||
|
||||
public RouteAttributeEvalRule[] getRules() {
|
||||
return rules.toArray(new RouteAttributeEvalRule[0]);
|
||||
return rules.toArray(new RouteAttributeEvalRule[rules.size()]);
|
||||
}
|
||||
|
||||
public String[] getParamKeys() {
|
||||
if(paramContext == null) {
|
||||
return new String[0];
|
||||
}
|
||||
return paramContext.vars.keySet().toArray(new String[0]);
|
||||
return paramContext.vars.keySet().toArray(new String[paramContext.vars.size()]);
|
||||
}
|
||||
|
||||
public String[] getParamValues() {
|
||||
if(paramContext == null) {
|
||||
return new String[0];
|
||||
}
|
||||
return paramContext.vars.values().toArray(new String[0]);
|
||||
return paramContext.vars.values().toArray(new String[paramContext.vars.size()]);
|
||||
}
|
||||
|
||||
private Object evaluate(RouteDataObject ro) {
|
||||
|
@ -991,19 +988,19 @@ public class GeneralRouter implements VehicleRouter {
|
|||
|
||||
|
||||
public RouteAttributeExpression[] getExpressions() {
|
||||
return expressions.toArray(new RouteAttributeExpression[0]);
|
||||
return expressions.toArray(new RouteAttributeExpression[expressions.size()]);
|
||||
}
|
||||
|
||||
public String[] getParameters() {
|
||||
return parameters.toArray(new String[0]);
|
||||
return parameters.toArray(new String[parameters.size()]);
|
||||
}
|
||||
|
||||
public String[] getTagValueCondDefTag() {
|
||||
return tagValueCondDefTag.toArray(new String[0]);
|
||||
return tagValueCondDefTag.toArray(new String[tagValueCondDefTag.size()]);
|
||||
}
|
||||
|
||||
public String[] getTagValueCondDefValue() {
|
||||
return tagValueCondDefValue.toArray(new String[0]);
|
||||
return tagValueCondDefValue.toArray(new String[tagValueCondDefValue.size()]);
|
||||
}
|
||||
|
||||
public boolean[] getTagValueCondDefNot() {
|
||||
|
|
|
@ -49,16 +49,14 @@ public class RouteCalculationProgress {
|
|||
pr = Math.min(p * p / (all * all), 1);
|
||||
}
|
||||
float progress = INITIAL_PROGRESS;
|
||||
if (totalIterations <= 1) {
|
||||
progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS);
|
||||
} else if (totalIterations <= 2) {
|
||||
if (totalIterations > 1) {
|
||||
if (iteration < 1) {
|
||||
progress = pr * FIRST_ITERATION + INITIAL_PROGRESS;
|
||||
} else {
|
||||
progress = (INITIAL_PROGRESS + FIRST_ITERATION) + pr * (1 - FIRST_ITERATION - INITIAL_PROGRESS);
|
||||
}
|
||||
} else {
|
||||
progress = (float) ((iteration + Math.min(pr, 0.7)) / totalIterations);
|
||||
progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS);
|
||||
}
|
||||
return Math.min(progress * 100f, 99);
|
||||
}
|
||||
|
|
|
@ -1,501 +0,0 @@
|
|||
package net.osmand.router;
|
||||
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||
import net.osmand.GPXUtilities.Track;
|
||||
import net.osmand.GPXUtilities.TrkSegment;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.osm.edit.OsmMapUtils;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RouteColorize {
|
||||
|
||||
public int zoom;
|
||||
public double[] latitudes;
|
||||
public double[] longitudes;
|
||||
public double[] values;
|
||||
public double minValue;
|
||||
public double maxValue;
|
||||
public double[][] palette;
|
||||
|
||||
private List<RouteColorizationPoint> dataList;
|
||||
|
||||
public static final int DARK_GREY = rgbaToDecimal(92, 92, 92, 255);
|
||||
public static final int LIGHT_GREY = rgbaToDecimal(200, 200, 200, 255);
|
||||
public static final int GREEN = rgbaToDecimal(90, 220, 95, 255);
|
||||
public static final int YELLOW = rgbaToDecimal(212, 239, 50, 255);
|
||||
public static final int RED = rgbaToDecimal(243, 55, 77, 255);
|
||||
public static final int[] colors = new int[] {GREEN, YELLOW, RED};
|
||||
|
||||
private static final float DEFAULT_BASE = 17.2f;
|
||||
private static final int MAX_SLOPE_VALUE = 25;
|
||||
|
||||
public enum ColorizationType {
|
||||
ELEVATION,
|
||||
SPEED,
|
||||
SLOPE,
|
||||
NONE
|
||||
}
|
||||
|
||||
private final int VALUE_INDEX = 0;
|
||||
private final int DECIMAL_COLOR_INDEX = 1;//sRGB decimal format
|
||||
private final int RED_COLOR_INDEX = 1;//RGB
|
||||
private final int GREEN_COLOR_INDEX = 2;//RGB
|
||||
private final int BLUE_COLOR_INDEX = 3;//RGB
|
||||
private final int ALPHA_COLOR_INDEX = 4;//RGBA
|
||||
|
||||
private ColorizationType colorizationType;
|
||||
|
||||
public static int SLOPE_RANGE = 150;//150 meters
|
||||
private static final double MIN_DIFFERENCE_SLOPE = 0.05d;//5%
|
||||
|
||||
private static final Log LOG = PlatformUtil.getLog(RouteColorize.class);
|
||||
|
||||
/**
|
||||
* @param minValue can be NaN
|
||||
* @param maxValue can be NaN
|
||||
* @param palette array {{value,color},...} - color in sRGB (decimal) format OR {{value,RED,GREEN,BLUE,ALPHA},...} - color in RGBA format
|
||||
*/
|
||||
public RouteColorize(int zoom, double[] latitudes, double[] longitudes, double[] values, double minValue, double maxValue, double[][] palette) {
|
||||
this.zoom = zoom;
|
||||
this.latitudes = latitudes;
|
||||
this.longitudes = longitudes;
|
||||
this.values = values;
|
||||
this.minValue = minValue;
|
||||
this.maxValue = maxValue;
|
||||
this.palette = palette;
|
||||
|
||||
if (Double.isNaN(minValue) || Double.isNaN(maxValue)) {
|
||||
calculateMinMaxValue();
|
||||
}
|
||||
checkPalette();
|
||||
sortPalette();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type ELEVATION, SPEED, SLOPE
|
||||
*/
|
||||
public RouteColorize(int zoom, GPXFile gpxFile, ColorizationType type) {
|
||||
this(zoom, gpxFile, null, type, 0);
|
||||
}
|
||||
|
||||
public RouteColorize(int zoom, GPXFile gpxFile, GPXTrackAnalysis analysis, ColorizationType type, float maxProfileSpeed) {
|
||||
|
||||
if (!gpxFile.hasTrkPt()) {
|
||||
LOG.warn("GPX file is not consist of track points");
|
||||
return;
|
||||
}
|
||||
|
||||
List<Double> latList = new ArrayList<>();
|
||||
List<Double> lonList = new ArrayList<>();
|
||||
List<Double> valList = new ArrayList<>();
|
||||
int wptIdx = 0;
|
||||
|
||||
if (analysis == null) {
|
||||
analysis = Algorithms.isEmpty(gpxFile.path)
|
||||
? gpxFile.getAnalysis(System.currentTimeMillis())
|
||||
: gpxFile.getAnalysis(gpxFile.modifiedTime);
|
||||
}
|
||||
for (Track t : gpxFile.tracks) {
|
||||
for (TrkSegment ts : t.segments) {
|
||||
if (ts.generalSegment || ts.points.size() < 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (WptPt p : ts.points) {
|
||||
latList.add(p.lat);
|
||||
lonList.add(p.lon);
|
||||
if (type == ColorizationType.SPEED) {
|
||||
valList.add((double) analysis.speedData.get(wptIdx).speed);
|
||||
} else {
|
||||
valList.add((double) analysis.elevationData.get(wptIdx).elevation);
|
||||
}
|
||||
wptIdx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.zoom = zoom;
|
||||
colorizationType = type;
|
||||
latitudes = listToArray(latList);
|
||||
longitudes = listToArray(lonList);
|
||||
|
||||
if (type == ColorizationType.SLOPE) {
|
||||
values = calculateSlopesByElevations(latitudes, longitudes, listToArray(valList), SLOPE_RANGE);
|
||||
} else {
|
||||
values = listToArray(valList);
|
||||
}
|
||||
calculateMinMaxValue();
|
||||
maxValue = getMaxValue(colorizationType, analysis, minValue, maxProfileSpeed);
|
||||
checkPalette();
|
||||
sortPalette();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate slopes from elevations needs for right colorizing
|
||||
*
|
||||
* @param slopeRange - in what range calculate the derivative, usually we used 150 meters
|
||||
* @return slopes array, in the begin and the end present NaN values!
|
||||
*/
|
||||
public double[] calculateSlopesByElevations(double[] latitudes, double[] longitudes, double[] elevations, double slopeRange) {
|
||||
|
||||
double[] newElevations = elevations;
|
||||
for (int i = 2; i < elevations.length - 2; i++) {
|
||||
newElevations[i] = elevations[i - 2]
|
||||
+ elevations[i - 1]
|
||||
+ elevations[i]
|
||||
+ elevations[i + 1]
|
||||
+ elevations[i + 2];
|
||||
newElevations[i] /= 5;
|
||||
}
|
||||
elevations = newElevations;
|
||||
|
||||
double[] slopes = new double[elevations.length];
|
||||
if (latitudes.length != longitudes.length || latitudes.length != elevations.length) {
|
||||
LOG.warn("Sizes of arrays latitudes, longitudes and values are not match");
|
||||
return slopes;
|
||||
}
|
||||
|
||||
double[] distances = new double[elevations.length];
|
||||
double totalDistance = 0.0d;
|
||||
distances[0] = totalDistance;
|
||||
for (int i = 0; i < elevations.length - 1; i++) {
|
||||
totalDistance += MapUtils.getDistance(latitudes[i], longitudes[i], latitudes[i + 1], longitudes[i + 1]);
|
||||
distances[i + 1] = totalDistance;
|
||||
}
|
||||
|
||||
for (int i = 0; i < elevations.length; i++) {
|
||||
if (distances[i] < slopeRange / 2 || distances[i] > totalDistance - slopeRange / 2) {
|
||||
slopes[i] = Double.NaN;
|
||||
} else {
|
||||
double[] arg = findDerivativeArguments(distances, elevations, i, slopeRange);
|
||||
slopes[i] = (arg[1] - arg[0]) / (arg[3] - arg[2]);
|
||||
}
|
||||
}
|
||||
return slopes;
|
||||
}
|
||||
|
||||
public List<RouteColorizationPoint> getResult(boolean simplify) {
|
||||
List<RouteColorizationPoint> result = new ArrayList<>();
|
||||
if (simplify) {
|
||||
result = simplify(zoom);
|
||||
} else {
|
||||
for (int i = 0; i < latitudes.length; i++) {
|
||||
result.add(new RouteColorizationPoint(i, latitudes[i], longitudes[i], values[i]));
|
||||
}
|
||||
}
|
||||
for (RouteColorizationPoint data : result) {
|
||||
data.color = getColorByValue(data.val);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getColorByValue(double value) {
|
||||
if (Double.isNaN(value)) {
|
||||
value = colorizationType == ColorizationType.SLOPE ? minValue : (minValue + maxValue) / 2;
|
||||
}
|
||||
for (int i = 0; i < palette.length - 1; i++) {
|
||||
if (value == palette[i][VALUE_INDEX])
|
||||
return (int) palette[i][DECIMAL_COLOR_INDEX];
|
||||
if (value >= palette[i][VALUE_INDEX] && value <= palette[i + 1][VALUE_INDEX]) {
|
||||
int minPaletteColor = (int) palette[i][DECIMAL_COLOR_INDEX];
|
||||
int maxPaletteColor = (int) palette[i + 1][DECIMAL_COLOR_INDEX];
|
||||
double minPaletteValue = palette[i][VALUE_INDEX];
|
||||
double maxPaletteValue = palette[i + 1][VALUE_INDEX];
|
||||
double percent = (value - minPaletteValue) / (maxPaletteValue - minPaletteValue);
|
||||
double resultRed = getRed(minPaletteColor) + percent * (getRed(maxPaletteColor) - getRed(minPaletteColor));
|
||||
double resultGreen = getGreen(minPaletteColor) + percent * (getGreen(maxPaletteColor) - getGreen(minPaletteColor));
|
||||
double resultBlue = getBlue(minPaletteColor) + percent * (getBlue(maxPaletteColor) - getBlue(minPaletteColor));
|
||||
double resultAlpha = getAlpha(minPaletteColor) + percent * (getAlpha(maxPaletteColor) - getAlpha(minPaletteColor));
|
||||
return rgbaToDecimal((int) resultRed, (int) resultGreen, (int) resultBlue, (int) resultAlpha);
|
||||
}
|
||||
}
|
||||
return getTransparentColor();
|
||||
}
|
||||
|
||||
public void setPalette(double[][] palette) {
|
||||
this.palette = palette;
|
||||
checkPalette();
|
||||
sortPalette();
|
||||
}
|
||||
|
||||
public void setPalette(int[] gradientPalette) {
|
||||
if (gradientPalette == null || gradientPalette.length != 3) {
|
||||
return;
|
||||
}
|
||||
setPalette(new double[][] {
|
||||
{minValue, gradientPalette[0]},
|
||||
{(minValue + maxValue) / 2, gradientPalette[1]},
|
||||
{maxValue, gradientPalette[2]}
|
||||
});
|
||||
}
|
||||
|
||||
private int getTransparentColor() {
|
||||
return rgbaToDecimal(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
public List<RouteColorizationPoint> simplify(int zoom) {
|
||||
if (dataList == null) {
|
||||
dataList = new ArrayList<>();
|
||||
for (int i = 0; i < latitudes.length; i++) {
|
||||
dataList.add(new RouteColorizationPoint(i, latitudes[i], longitudes[i], values[i]));
|
||||
}
|
||||
}
|
||||
List<Node> nodes = new ArrayList<>();
|
||||
List<Node> result = new ArrayList<>();
|
||||
for (RouteColorizationPoint data : dataList) {
|
||||
nodes.add(new net.osmand.osm.edit.Node(data.lat, data.lon, data.id));
|
||||
}
|
||||
|
||||
double epsilon = Math.pow(2.0, DEFAULT_BASE - zoom);
|
||||
result.add(nodes.get(0));
|
||||
OsmMapUtils.simplifyDouglasPeucker(nodes, 0, nodes.size() - 1, result, epsilon);
|
||||
|
||||
List<RouteColorizationPoint> simplified = new ArrayList<>();
|
||||
for (int i = 1; i < result.size(); i++) {
|
||||
int prevId = (int) result.get(i - 1).getId();
|
||||
int currentId = (int) result.get(i).getId();
|
||||
List<RouteColorizationPoint> sublist = dataList.subList(prevId, currentId);
|
||||
simplified.addAll(getExtremums(sublist));
|
||||
}
|
||||
Node lastSurvivedPoint = result.get(result.size() - 1);
|
||||
simplified.add(dataList.get((int) lastSurvivedPoint.getId()));
|
||||
return simplified;
|
||||
}
|
||||
|
||||
private List<RouteColorizationPoint> getExtremums(List<RouteColorizationPoint> subDataList) {
|
||||
if (subDataList.size() <= 2) {
|
||||
return subDataList;
|
||||
}
|
||||
|
||||
List<RouteColorizationPoint> result = new ArrayList<>();
|
||||
double min;
|
||||
double max;
|
||||
min = max = subDataList.get(0).val;
|
||||
for (RouteColorizationPoint pt : subDataList) {
|
||||
if (min > pt.val) {
|
||||
min = pt.val;
|
||||
}
|
||||
if (max < pt.val) {
|
||||
max = pt.val;
|
||||
}
|
||||
}
|
||||
|
||||
double diff = max - min;
|
||||
|
||||
result.add(subDataList.get(0));
|
||||
for (int i = 1; i < subDataList.size() - 1; i++) {
|
||||
double prev = subDataList.get(i - 1).val;
|
||||
double current = subDataList.get(i).val;
|
||||
double next = subDataList.get(i + 1).val;
|
||||
RouteColorizationPoint currentData = subDataList.get(i);
|
||||
|
||||
if ((current > prev && current > next) || (current < prev && current < next)
|
||||
|| (current < prev && current == next) || (current == prev && current < next)
|
||||
|| (current > prev && current == next) || (current == prev && current > next)) {
|
||||
RouteColorizationPoint prevInResult;
|
||||
if (result.size() > 0) {
|
||||
prevInResult = result.get(0);
|
||||
if (prevInResult.val / diff > MIN_DIFFERENCE_SLOPE) {
|
||||
result.add(currentData);
|
||||
}
|
||||
} else
|
||||
result.add(currentData);
|
||||
}
|
||||
}
|
||||
result.add(subDataList.get(subDataList.size() - 1));
|
||||
return result;
|
||||
}
|
||||
|
||||
private void checkPalette() {
|
||||
if (palette == null || palette.length < 2 || palette[0].length < 2 || palette[1].length < 2) {
|
||||
LOG.info("Will use default palette");
|
||||
palette = new double[3][2];
|
||||
|
||||
double[][] defaultPalette = {
|
||||
{minValue, GREEN},
|
||||
{(minValue + maxValue) / 2, YELLOW},
|
||||
{maxValue, RED}
|
||||
};
|
||||
palette = defaultPalette;
|
||||
}
|
||||
double min;
|
||||
double max = min = palette[0][VALUE_INDEX];
|
||||
int minIndex = 0;
|
||||
int maxIndex = 0;
|
||||
double[][] sRGBPalette = new double[palette.length][2];
|
||||
for (int i = 0; i < palette.length; i++) {
|
||||
double[] p = palette[i];
|
||||
if (p.length == 2) {
|
||||
sRGBPalette[i] = p;
|
||||
} else if (p.length == 4) {
|
||||
int color = rgbaToDecimal((int) p[RED_COLOR_INDEX], (int) p[GREEN_COLOR_INDEX], (int) p[BLUE_COLOR_INDEX], 255);
|
||||
sRGBPalette[i] = new double[]{p[VALUE_INDEX], color};
|
||||
} else if (p.length >= 5) {
|
||||
int color = rgbaToDecimal((int) p[RED_COLOR_INDEX], (int) p[GREEN_COLOR_INDEX], (int) p[BLUE_COLOR_INDEX], (int) p[ALPHA_COLOR_INDEX]);
|
||||
sRGBPalette[i] = new double[]{p[VALUE_INDEX], color};
|
||||
}
|
||||
if (p[VALUE_INDEX] > max) {
|
||||
max = p[VALUE_INDEX];
|
||||
maxIndex = i;
|
||||
}
|
||||
if (p[VALUE_INDEX] < min) {
|
||||
min = p[VALUE_INDEX];
|
||||
minIndex = i;
|
||||
}
|
||||
}
|
||||
palette = sRGBPalette;
|
||||
if (minValue < min) {
|
||||
palette[minIndex][VALUE_INDEX] = minValue;
|
||||
}
|
||||
if (maxValue > max) {
|
||||
palette[maxIndex][VALUE_INDEX] = maxValue;
|
||||
}
|
||||
}
|
||||
|
||||
private void sortPalette() {
|
||||
java.util.Arrays.sort(palette, new java.util.Comparator<double[]>() {
|
||||
public int compare(double[] a, double[] b) {
|
||||
return Double.compare(a[VALUE_INDEX], b[VALUE_INDEX]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @return double[minElevation, maxElevation, minDist, maxDist]
|
||||
*/
|
||||
private double[] findDerivativeArguments(double[] distances, double[] elevations, int index, double slopeRange) {
|
||||
double[] result = new double[4];
|
||||
double minDist = distances[index] - slopeRange / 2;
|
||||
double maxDist = distances[index] + slopeRange / 2;
|
||||
result[0] = Double.NaN;
|
||||
result[1] = Double.NaN;
|
||||
result[2] = minDist;
|
||||
result[3] = maxDist;
|
||||
int closestMaxIndex = -1;
|
||||
int closestMinIndex = -1;
|
||||
for (int i = index; i < distances.length; i++) {
|
||||
if (distances[i] == maxDist) {
|
||||
result[1] = elevations[i];
|
||||
break;
|
||||
}
|
||||
if (distances[i] > maxDist) {
|
||||
closestMaxIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int i = index; i >= 0; i--) {
|
||||
if (distances[i] == minDist) {
|
||||
result[0] = elevations[i];
|
||||
break;
|
||||
}
|
||||
if (distances[i] < minDist) {
|
||||
closestMinIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (closestMaxIndex > 0) {
|
||||
double diff = distances[closestMaxIndex] - distances[closestMaxIndex - 1];
|
||||
double coef = (maxDist - distances[closestMaxIndex - 1]) / diff;
|
||||
if (coef > 1 || coef < 0) {
|
||||
LOG.warn("Coefficient fo max must be 0..1 , coef=" + coef);
|
||||
}
|
||||
result[1] = (1 - coef) * elevations[closestMaxIndex - 1] + coef * elevations[closestMaxIndex];
|
||||
}
|
||||
if (closestMinIndex >= 0) {
|
||||
double diff = distances[closestMinIndex + 1] - distances[closestMinIndex];
|
||||
double coef = (minDist - distances[closestMinIndex]) / diff;
|
||||
if (coef > 1 || coef < 0) {
|
||||
LOG.warn("Coefficient for min must be 0..1 , coef=" + coef);
|
||||
}
|
||||
result[0] = (1 - coef) * elevations[closestMinIndex] + coef * elevations[closestMinIndex + 1];
|
||||
}
|
||||
if (Double.isNaN(result[0]) || Double.isNaN(result[1])) {
|
||||
LOG.warn("Elevations wasn't calculated");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static double getMinValue(ColorizationType type, GPXTrackAnalysis analysis) {
|
||||
return type == ColorizationType.ELEVATION ? analysis.minElevation : 0.0;
|
||||
}
|
||||
|
||||
public static double getMaxValue(ColorizationType type, GPXTrackAnalysis analysis, double minValue, double maxProfileSpeed) {
|
||||
if (type == ColorizationType.SPEED) {
|
||||
return Math.max(analysis.maxSpeed, maxProfileSpeed);
|
||||
} else if (type == ColorizationType.ELEVATION) {
|
||||
return Math.max(analysis.maxElevation, minValue + 50);
|
||||
} else {
|
||||
return MAX_SLOPE_VALUE;
|
||||
}
|
||||
}
|
||||
|
||||
private void calculateMinMaxValue() {
|
||||
if (values.length == 0)
|
||||
return;
|
||||
minValue = maxValue = Double.NaN;
|
||||
for (double value : values) {
|
||||
if ((Double.isNaN(maxValue) || Double.isNaN(minValue)) && !Double.isNaN(value))
|
||||
maxValue = minValue = value;
|
||||
if (minValue > value)
|
||||
minValue = value;
|
||||
if (maxValue < value)
|
||||
maxValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
private double[] listToArray(List<Double> doubleList) {
|
||||
double[] result = new double[doubleList.size()];
|
||||
for (int i = 0; i < doubleList.size(); i++) {
|
||||
result[i] = doubleList.get(i);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int rgbaToDecimal(int r, int g, int b, int a) {
|
||||
int value = ((a & 0xFF) << 24) |
|
||||
((r & 0xFF) << 16) |
|
||||
((g & 0xFF) << 8) |
|
||||
((b & 0xFF) << 0);
|
||||
return value;
|
||||
}
|
||||
|
||||
private int getRed(int value) {
|
||||
return (value >> 16) & 0xFF;
|
||||
}
|
||||
|
||||
private int getGreen(int value) {
|
||||
return (value >> 8) & 0xFF;
|
||||
}
|
||||
|
||||
private int getBlue(int value) {
|
||||
return (value >> 0) & 0xFF;
|
||||
}
|
||||
|
||||
private int getAlpha(int value) {
|
||||
return (value >> 24) & 0xff;
|
||||
}
|
||||
|
||||
public static class RouteColorizationPoint {
|
||||
public int id;
|
||||
public double lat;
|
||||
public double lon;
|
||||
public double val;
|
||||
public int color;
|
||||
|
||||
RouteColorizationPoint(int id, double lat, double lon, double val) {
|
||||
this.id = id;
|
||||
this.lat = lat;
|
||||
this.lon = lon;
|
||||
this.val = val;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -20,10 +20,10 @@ public class RouteExporter {
|
|||
|
||||
public static final String OSMAND_ROUTER_V2 = "OsmAndRouterV2";
|
||||
|
||||
private final String name;
|
||||
private final List<RouteSegmentResult> route;
|
||||
private final List<Location> locations;
|
||||
private final List<WptPt> points;
|
||||
private String name;
|
||||
private List<RouteSegmentResult> route;
|
||||
private List<Location> locations;
|
||||
private List<WptPt> points;
|
||||
|
||||
public RouteExporter(String name, List<RouteSegmentResult> route, List<Location> locations, List<WptPt> points) {
|
||||
this.name = name;
|
||||
|
@ -33,34 +33,6 @@ public class RouteExporter {
|
|||
}
|
||||
|
||||
public GPXFile exportRoute() {
|
||||
GPXFile gpx = new GPXFile(OSMAND_ROUTER_V2);
|
||||
Track track = new Track();
|
||||
track.name = name;
|
||||
gpx.tracks.add(track);
|
||||
track.segments.add(generateRouteSegment());
|
||||
if (points != null) {
|
||||
for (WptPt pt : points) {
|
||||
gpx.addPoint(pt);
|
||||
}
|
||||
}
|
||||
return gpx;
|
||||
}
|
||||
|
||||
public static GPXFile exportRoute(String name, List<TrkSegment> trkSegments, List<WptPt> points) {
|
||||
GPXFile gpx = new GPXFile(OSMAND_ROUTER_V2);
|
||||
Track track = new Track();
|
||||
track.name = name;
|
||||
gpx.tracks.add(track);
|
||||
track.segments.addAll(trkSegments);
|
||||
if (points != null) {
|
||||
for (WptPt pt : points) {
|
||||
gpx.addPoint(pt);
|
||||
}
|
||||
}
|
||||
return gpx;
|
||||
}
|
||||
|
||||
public TrkSegment generateRouteSegment() {
|
||||
RouteDataResources resources = new RouteDataResources(locations);
|
||||
List<StringBundle> routeItems = new ArrayList<>();
|
||||
if (!Algorithms.isEmpty(route)) {
|
||||
|
@ -85,9 +57,15 @@ public class RouteExporter {
|
|||
typeList.add(typeBundle);
|
||||
}
|
||||
|
||||
GPXFile gpx = new GPXFile(OSMAND_ROUTER_V2);
|
||||
Track track = new Track();
|
||||
track.name = name;
|
||||
gpx.tracks.add(track);
|
||||
TrkSegment trkSegment = new TrkSegment();
|
||||
track.segments.add(trkSegment);
|
||||
|
||||
if (locations == null || locations.isEmpty()) {
|
||||
return trkSegment;
|
||||
return gpx;
|
||||
}
|
||||
for (int i = 0; i < locations.size(); i++) {
|
||||
Location loc = locations.get(i);
|
||||
|
@ -105,17 +83,23 @@ public class RouteExporter {
|
|||
}
|
||||
trkSegment.points.add(pt);
|
||||
}
|
||||
if (points != null) {
|
||||
for (WptPt pt : points) {
|
||||
gpx.addPoint(pt);
|
||||
}
|
||||
}
|
||||
|
||||
List<RouteSegment> routeSegments = new ArrayList<>();
|
||||
for (StringBundle item : routeItems) {
|
||||
routeSegments.add(RouteSegment.fromStringBundle(item));
|
||||
}
|
||||
trkSegment.routeSegments = routeSegments;
|
||||
gpx.routeSegments = routeSegments;
|
||||
List<RouteType> routeTypes = new ArrayList<>();
|
||||
for (StringBundle item : typeList) {
|
||||
routeTypes.add(RouteType.fromStringBundle(item));
|
||||
}
|
||||
trkSegment.routeTypes = routeTypes;
|
||||
return trkSegment;
|
||||
gpx.routeTypes = routeTypes;
|
||||
|
||||
return gpx;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import net.osmand.GPXUtilities;
|
|||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.RouteSegment;
|
||||
import net.osmand.GPXUtilities.RouteType;
|
||||
import net.osmand.GPXUtilities.TrkSegment;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.PlatformUtil;
|
||||
|
@ -29,9 +28,10 @@ public class RouteImporter {
|
|||
|
||||
private File file;
|
||||
private GPXFile gpxFile;
|
||||
private TrkSegment segment;
|
||||
|
||||
private final List<RouteSegmentResult> route = new ArrayList<>();
|
||||
private List<RouteSegmentResult> route = new ArrayList<>();
|
||||
private RouteRegion region = new RouteRegion();
|
||||
private RouteDataResources resources = new RouteDataResources();
|
||||
|
||||
public RouteImporter(File file) {
|
||||
this.file = file;
|
||||
|
@ -41,12 +41,8 @@ public class RouteImporter {
|
|||
this.gpxFile = gpxFile;
|
||||
}
|
||||
|
||||
public RouteImporter(TrkSegment segment) {
|
||||
this.segment = segment;
|
||||
}
|
||||
|
||||
public List<RouteSegmentResult> importRoute() {
|
||||
if (gpxFile != null || segment != null) {
|
||||
if (gpxFile != null) {
|
||||
parseRoute();
|
||||
} else if (file != null) {
|
||||
FileInputStream fis = null;
|
||||
|
@ -73,34 +69,19 @@ public class RouteImporter {
|
|||
}
|
||||
|
||||
private void parseRoute() {
|
||||
if (segment != null) {
|
||||
parseRoute(segment);
|
||||
} else if (gpxFile != null) {
|
||||
List<TrkSegment> segments = gpxFile.getNonEmptyTrkSegments(true);
|
||||
for (TrkSegment s : segments) {
|
||||
parseRoute(s);
|
||||
}
|
||||
collectLocations();
|
||||
collectSegments();
|
||||
collectTypes();
|
||||
for (RouteSegmentResult segment : route) {
|
||||
segment.fillNames(resources);
|
||||
}
|
||||
}
|
||||
|
||||
private void parseRoute(TrkSegment segment) {
|
||||
RouteRegion region = new RouteRegion();
|
||||
RouteDataResources resources = new RouteDataResources();
|
||||
|
||||
collectLocations(resources, segment);
|
||||
List<RouteSegmentResult> route = collectRouteSegments(region, resources, segment);
|
||||
collectRouteTypes(region, segment);
|
||||
for (RouteSegmentResult routeSegment : route) {
|
||||
routeSegment.fillNames(resources);
|
||||
}
|
||||
this.route.addAll(route);
|
||||
}
|
||||
|
||||
private void collectLocations(RouteDataResources resources, TrkSegment segment) {
|
||||
private void collectLocations() {
|
||||
List<Location> locations = resources.getLocations();
|
||||
double lastElevation = HEIGHT_UNDEFINED;
|
||||
if (segment.hasRoute()) {
|
||||
for (WptPt point : segment.points) {
|
||||
if (gpxFile.tracks.size() > 0 && gpxFile.tracks.get(0).segments.size() > 0 && gpxFile.tracks.get(0).segments.get(0).points.size() > 0) {
|
||||
for (WptPt point : gpxFile.tracks.get(0).segments.get(0).points) {
|
||||
Location loc = new Location("", point.getLatitude(), point.getLongitude());
|
||||
if (!Double.isNaN(point.ele)) {
|
||||
loc.setAltitude(point.ele);
|
||||
|
@ -113,20 +94,18 @@ public class RouteImporter {
|
|||
}
|
||||
}
|
||||
|
||||
private List<RouteSegmentResult> collectRouteSegments(RouteRegion region, RouteDataResources resources, TrkSegment segment) {
|
||||
List<RouteSegmentResult> route = new ArrayList<>();
|
||||
for (RouteSegment routeSegment : segment.routeSegments) {
|
||||
private void collectSegments() {
|
||||
for (RouteSegment segment : gpxFile.routeSegments) {
|
||||
RouteDataObject object = new RouteDataObject(region);
|
||||
RouteSegmentResult segmentResult = new RouteSegmentResult(object);
|
||||
segmentResult.readFromBundle(new RouteDataBundle(resources, routeSegment.toStringBundle()));
|
||||
segmentResult.readFromBundle(new RouteDataBundle(resources, segment.toStringBundle()));
|
||||
route.add(segmentResult);
|
||||
}
|
||||
return route;
|
||||
}
|
||||
|
||||
private void collectRouteTypes(RouteRegion region, TrkSegment segment) {
|
||||
private void collectTypes() {
|
||||
int i = 0;
|
||||
for (RouteType routeType : segment.routeTypes) {
|
||||
for (RouteType routeType : gpxFile.routeTypes) {
|
||||
StringBundle bundle = routeType.toStringBundle();
|
||||
String t = bundle.getString("t", null);
|
||||
String v = bundle.getString("v", null);
|
||||
|
|
|
@ -6,6 +6,7 @@ import net.osmand.NativeLibrary;
|
|||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.ResultMatcher;
|
||||
import net.osmand.binary.BinaryMapIndexReader;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.data.LatLon;
|
||||
|
@ -63,6 +64,8 @@ public class RoutePlannerFrontEnd {
|
|||
public int routeGapDistance;
|
||||
public int routeDistanceUnmatched;
|
||||
|
||||
public boolean calculationCancelled;
|
||||
private boolean calculationDone;
|
||||
|
||||
public GpxRouteApproximation(RoutingContext ctx) {
|
||||
this.ctx = ctx;
|
||||
|
@ -79,6 +82,10 @@ public class RoutePlannerFrontEnd {
|
|||
routeCalculations, routeDistCalculations, routePointsSearched, routeDistance, routeDistanceUnmatched);
|
||||
}
|
||||
|
||||
public boolean isCalculationDone() {
|
||||
return calculationDone;
|
||||
}
|
||||
|
||||
public double distFromLastPoint(LatLon startPoint) {
|
||||
if (result.size() > 0) {
|
||||
return MapUtils.getDistance(getLastPoint(), startPoint);
|
||||
|
@ -232,22 +239,18 @@ public class RoutePlannerFrontEnd {
|
|||
public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List<GpxPoint> gpxPoints, ResultMatcher<GpxRouteApproximation> resultMatcher) throws IOException, InterruptedException {
|
||||
long timeToCalculate = System.nanoTime();
|
||||
gctx.ctx.keepNativeRoutingContext = true;
|
||||
if (gctx.ctx.calculationProgress == null) {
|
||||
gctx.ctx.calculationProgress = new RouteCalculationProgress();
|
||||
}
|
||||
GpxPoint start = null;
|
||||
GpxPoint prev = null;
|
||||
if (gpxPoints.size() > 0) {
|
||||
gctx.ctx.calculationProgress.totalIterations = (int) (gpxPoints.get(gpxPoints.size() - 1).cumDist / gctx.MAXIMUM_STEP_APPROXIMATION + 1);
|
||||
start = gpxPoints.get(0);
|
||||
}
|
||||
while (start != null && !gctx.ctx.calculationProgress.isCancelled) {
|
||||
while (start != null && !gctx.calculationCancelled) {
|
||||
double routeDist = gctx.MAXIMUM_STEP_APPROXIMATION;
|
||||
GpxPoint next = findNextGpxPointWithin(gctx, gpxPoints, start, routeDist);
|
||||
boolean routeFound = false;
|
||||
gctx.ctx.calculationProgress.nextIteration();
|
||||
if (next != null && initRoutingPoint(start, gctx, gctx.MINIMUM_POINT_APPROXIMATION)) {
|
||||
gctx.ctx.calculationProgress.totalEstimatedDistance = 0;
|
||||
gctx.ctx.calculationProgress.iteration = (int) (next.cumDist / gctx.MAXIMUM_STEP_APPROXIMATION);
|
||||
while (routeDist >= gctx.MINIMUM_STEP_APPROXIMATION && !routeFound) {
|
||||
routeFound = initRoutingPoint(next, gctx, gctx.MINIMUM_POINT_APPROXIMATION);
|
||||
if (routeFound) {
|
||||
|
@ -255,7 +258,7 @@ public class RoutePlannerFrontEnd {
|
|||
if (routeFound) {
|
||||
// route is found - cut the end of the route and move to next iteration
|
||||
// start.stepBackRoute = new ArrayList<RouteSegmentResult>();
|
||||
// boolean stepBack = true;
|
||||
// boolean stepBack = true;
|
||||
boolean stepBack = stepBackAndFindPrevPointInRoute(gctx, gpxPoints, start, next);
|
||||
if (!stepBack) {
|
||||
// not supported case (workaround increase MAXIMUM_STEP_APPROXIMATION)
|
||||
|
@ -296,19 +299,20 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
start = next;
|
||||
}
|
||||
if (gctx.ctx.calculationProgress != null) {
|
||||
gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate;
|
||||
if(gctx.ctx.calculationProgress != null) {
|
||||
gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate;
|
||||
}
|
||||
gctx.ctx.deleteNativeRoutingContext();
|
||||
BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx);
|
||||
calculateGpxRoute(gctx, gpxPoints);
|
||||
if (!gctx.result.isEmpty() && !gctx.ctx.calculationProgress.isCancelled) {
|
||||
if (!gctx.result.isEmpty() && !gctx.calculationCancelled) {
|
||||
new RouteResultPreparation().printResults(gctx.ctx, gpxPoints.get(0).loc, gpxPoints.get(gpxPoints.size() - 1).loc, gctx.result);
|
||||
System.out.println(gctx);
|
||||
}
|
||||
if (resultMatcher != null) {
|
||||
resultMatcher.publish(gctx.ctx.calculationProgress.isCancelled ? null : gctx);
|
||||
resultMatcher.publish(gctx.calculationCancelled ? null : gctx);
|
||||
}
|
||||
gctx.calculationDone = true;
|
||||
return gctx;
|
||||
}
|
||||
|
||||
|
@ -361,7 +365,7 @@ public class RoutePlannerFrontEnd {
|
|||
reg.initRouteEncodingRule(0, "highway", RouteResultPreparation.UNMATCHED_HIGHWAY_TYPE);
|
||||
List<LatLon> lastStraightLine = null;
|
||||
GpxPoint straightPointStart = null;
|
||||
for (int i = 0; i < gpxPoints.size() && !gctx.ctx.calculationProgress.isCancelled; ) {
|
||||
for (int i = 0; i < gpxPoints.size() && !gctx.calculationCancelled; ) {
|
||||
GpxPoint pnt = gpxPoints.get(i);
|
||||
if (pnt.routeToTarget != null && !pnt.routeToTarget.isEmpty()) {
|
||||
LatLon startPoint = pnt.routeToTarget.get(0).getStartPoint();
|
||||
|
@ -455,7 +459,7 @@ public class RoutePlannerFrontEnd {
|
|||
private void cleanupResultAndAddTurns(GpxRouteApproximation gctx) {
|
||||
// cleanup double joints
|
||||
int LOOK_AHEAD = 4;
|
||||
for(int i = 0; i < gctx.result.size() && !gctx.ctx.calculationProgress.isCancelled; i++) {
|
||||
for(int i = 0; i < gctx.result.size() && !gctx.calculationCancelled; i++) {
|
||||
RouteSegmentResult s = gctx.result.get(i);
|
||||
for(int j = i + 2; j <= i + LOOK_AHEAD && j < gctx.result.size(); j++) {
|
||||
RouteSegmentResult e = gctx.result.get(j);
|
||||
|
@ -472,7 +476,7 @@ public class RoutePlannerFrontEnd {
|
|||
r.setTurnType(null);
|
||||
r.setDescription("");
|
||||
}
|
||||
if (!gctx.ctx.calculationProgress.isCancelled) {
|
||||
if (!gctx.calculationCancelled) {
|
||||
preparation.prepareTurnResults(gctx.ctx, gctx.result);
|
||||
}
|
||||
}
|
||||
|
@ -545,10 +549,8 @@ public class RoutePlannerFrontEnd {
|
|||
if (start != null && start.pnt == null) {
|
||||
gctx.routePointsSearched++;
|
||||
RouteSegmentPoint rsp = findRouteSegment(start.loc.getLatitude(), start.loc.getLongitude(), gctx.ctx, null, false);
|
||||
if (rsp != null) {
|
||||
if (MapUtils.getDistance(rsp.getPreciseLatLon(), start.loc) < distThreshold) {
|
||||
start.pnt = rsp;
|
||||
}
|
||||
if (MapUtils.getDistance(rsp.getPreciseLatLon(), start.loc) < distThreshold) {
|
||||
start.pnt = rsp;
|
||||
}
|
||||
}
|
||||
if (start != null && start.pnt != null) {
|
||||
|
@ -688,15 +690,15 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
}
|
||||
if (ctx.calculationMode == RouteCalculationMode.COMPLEX && routeDirection == null
|
||||
&& maxDistance > RoutingConfiguration.DEVIATION_RADIUS * 6) {
|
||||
&& maxDistance > ctx.config.DEVIATION_RADIUS * 6) {
|
||||
ctx.calculationProgress.totalIterations++;
|
||||
RoutingContext nctx = buildRoutingContext(ctx.config, ctx.nativeLib, ctx.getMaps(), RouteCalculationMode.BASE);
|
||||
nctx.calculationProgress = ctx.calculationProgress;
|
||||
List<RouteSegmentResult> ls = searchRoute(nctx, start, end, intermediates);
|
||||
if (ls == null) {
|
||||
if(ls == null) {
|
||||
return null;
|
||||
}
|
||||
routeDirection = PrecalculatedRouteDirection.build(ls, RoutingConfiguration.DEVIATION_RADIUS, ctx.getRouter().getMaxSpeed());
|
||||
routeDirection = PrecalculatedRouteDirection.build(ls, ctx.config.DEVIATION_RADIUS, ctx.getRouter().getMaxSpeed());
|
||||
}
|
||||
List<RouteSegmentResult> res ;
|
||||
if (intermediatesEmpty && ctx.nativeLib != null) {
|
||||
|
@ -735,7 +737,7 @@ public class RoutePlannerFrontEnd {
|
|||
res = searchRouteImpl(ctx, points, routeDirection);
|
||||
}
|
||||
if (ctx.calculationProgress != null) {
|
||||
ctx.calculationProgress.timeToCalculate = (System.nanoTime() - timeToCalculate);
|
||||
ctx.calculationProgress.timeToCalculate += (System.nanoTime() - timeToCalculate);
|
||||
}
|
||||
BinaryRoutePlanner.printDebugMemoryInformation(ctx);
|
||||
if (res != null) {
|
||||
|
@ -917,7 +919,7 @@ public class RoutePlannerFrontEnd {
|
|||
|
||||
private List<RouteSegmentResult> runNativeRouting(final RoutingContext ctx, RouteSegment recalculationEnd) throws IOException {
|
||||
refreshProgressDistance(ctx);
|
||||
RouteRegion[] regions = ctx.reverseMap.keySet().toArray(new RouteRegion[0]);
|
||||
RouteRegion[] regions = ctx.reverseMap.keySet().toArray(new BinaryMapRouteReaderAdapter.RouteRegion[ctx.reverseMap.size()]);
|
||||
ctx.checkOldRoutingFiles(ctx.startX, ctx.startY);
|
||||
ctx.checkOldRoutingFiles(ctx.targetX, ctx.targetY);
|
||||
|
||||
|
|
|
@ -176,49 +176,11 @@ public class RouteResultPreparation {
|
|||
combineWayPointsForAreaRouting(ctx, result);
|
||||
validateAllPointsConnected(result);
|
||||
splitRoadsAndAttachRoadSegments(ctx, result, recalculation);
|
||||
for (int i = 0; i < result.size(); i++) {
|
||||
filterMinorStops(result.get(i));
|
||||
}
|
||||
calculateTimeSpeed(ctx, result);
|
||||
|
||||
prepareTurnResults(ctx, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public RouteSegmentResult filterMinorStops(RouteSegmentResult seg) {
|
||||
List<Integer> stops = null;
|
||||
boolean plus = seg.getStartPointIndex() < seg.getEndPointIndex();
|
||||
int next;
|
||||
|
||||
for (int i = seg.getStartPointIndex(); i != seg.getEndPointIndex(); i = next) {
|
||||
next = plus ? i + 1 : i - 1;
|
||||
int[] pointTypes = seg.getObject().getPointTypes(i);
|
||||
if (pointTypes != null) {
|
||||
for (int j = 0; j < pointTypes.length; j++) {
|
||||
if (pointTypes[j] == seg.getObject().region.stopMinor) {
|
||||
if (stops == null) {
|
||||
stops = new ArrayList<>();
|
||||
}
|
||||
stops.add(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (stops != null) {
|
||||
for (int stop : stops) {
|
||||
List<RouteSegmentResult> attachedRoutes = seg.getAttachedRoutes(stop);
|
||||
for (RouteSegmentResult attached : attachedRoutes) {
|
||||
int attStopPriority = highwaySpeakPriority(attached.getObject().getHighway());
|
||||
int segStopPriority = highwaySpeakPriority(seg.getObject().getHighway());
|
||||
if (segStopPriority < attStopPriority) {
|
||||
seg.getObject().removePointType(stop, seg.getObject().region.stopSign);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return seg;
|
||||
}
|
||||
|
||||
public void prepareTurnResults(RoutingContext ctx, List<RouteSegmentResult> result) {
|
||||
for (int i = 0; i < result.size(); i ++) {
|
||||
|
@ -1117,8 +1079,8 @@ public class RouteResultPreparation {
|
|||
if (UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway())) {
|
||||
bearingDist = RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED;
|
||||
}
|
||||
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(prev.getEndPointIndex(), Math.min(prev.getDistance(), bearingDist)),
|
||||
rr.getBearingBegin(rr.getStartPointIndex(), Math.min(rr.getDistance(), bearingDist)));
|
||||
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(prev.getEndPointIndex(), bearingDist),
|
||||
rr.getBearingBegin(rr.getStartPointIndex(), bearingDist));
|
||||
if (mpi >= TURN_DEGREE_MIN) {
|
||||
if (mpi < TURN_DEGREE_MIN) {
|
||||
// Slight turn detection here causes many false positives where drivers would expect a "normal" TL. Best use limit-angle=TURN_DEGREE_MIN, this reduces TSL to the turn-lanes cases.
|
||||
|
@ -1227,7 +1189,6 @@ public class RouteResultPreparation {
|
|||
RouteSegmentResult last = rr;
|
||||
RouteSegmentResult firstRoundabout = rr;
|
||||
RouteSegmentResult lastRoundabout = rr;
|
||||
|
||||
for (int j = i; j < result.size(); j++) {
|
||||
RouteSegmentResult rnext = result.get(j);
|
||||
last = rnext;
|
||||
|
@ -1254,18 +1215,12 @@ public class RouteResultPreparation {
|
|||
TurnType t = TurnType.getExitTurn(exit, 0, leftSide);
|
||||
// usually covers more than expected
|
||||
float turnAngleBasedOnOutRoads = (float) MapUtils.degreesDiff(last.getBearingBegin(), prev.getBearingEnd());
|
||||
// Angle based on circle method tries
|
||||
// 1. to calculate antinormal to roundabout circle on roundabout entrance and
|
||||
// 2. normal to roundabout circle on roundabout exit
|
||||
// 3. calculate angle difference
|
||||
// This method doesn't work if you go from S to N touching only 1 point of roundabout,
|
||||
// but it is very important to identify very sharp or very large angle to understand did you pass whole roundabout or small entrance
|
||||
// usually covers less than expected
|
||||
float turnAngleBasedOnCircle = (float) -MapUtils.degreesDiff(firstRoundabout.getBearingBegin(), lastRoundabout.getBearingEnd() + 180);
|
||||
if (Math.abs(turnAngleBasedOnOutRoads) > 120) {
|
||||
// correctly identify if angle is +- 180, so we approach from left or right side
|
||||
t.setTurnAngle(turnAngleBasedOnCircle) ;
|
||||
if(Math.abs(turnAngleBasedOnOutRoads - turnAngleBasedOnCircle) > 180) {
|
||||
t.setTurnAngle(turnAngleBasedOnCircle ) ;
|
||||
} else {
|
||||
t.setTurnAngle(turnAngleBasedOnOutRoads) ;
|
||||
t.setTurnAngle((turnAngleBasedOnCircle + turnAngleBasedOnOutRoads) / 2) ;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
@ -1762,7 +1717,7 @@ public class RouteResultPreparation {
|
|||
}
|
||||
}
|
||||
}
|
||||
Integer[] array = possibleTurns.toArray(new Integer[0]);
|
||||
Integer[] array = possibleTurns.toArray(new Integer[possibleTurns.size()]);
|
||||
Arrays.sort(array, new Comparator<Integer>() {
|
||||
|
||||
@Override
|
||||
|
|
|
@ -255,8 +255,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
@Override
|
||||
public void writeToBundle(RouteDataBundle bundle) {
|
||||
Map<RouteTypeRule, Integer> rules = bundle.getResources().getRules();
|
||||
boolean reversed = endPointIndex < startPointIndex;
|
||||
bundle.putInt("length", Math.abs(endPointIndex - startPointIndex) + 1);
|
||||
bundle.putInt("length", (Math.abs(endPointIndex - startPointIndex) + 1) * (endPointIndex >= startPointIndex ? 1 : -1));
|
||||
bundle.putFloat("segmentTime", segmentTime, 2);
|
||||
bundle.putFloat("speed", speed, 2);
|
||||
if (turnType != null) {
|
||||
|
@ -272,29 +271,24 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
bundle.putString("turnLanes", TurnType.lanesToString(turnLanes));
|
||||
}
|
||||
}
|
||||
bundle.putLong("id", object.id >> 6); // OsmAnd ID to OSM ID
|
||||
bundle.putLong("id", object.id);
|
||||
bundle.putArray("types", convertTypes(object.types, rules));
|
||||
|
||||
int start = Math.min(startPointIndex, endPointIndex);
|
||||
int end = Math.max(startPointIndex, endPointIndex) + 1;
|
||||
if (object.pointTypes != null && start < object.pointTypes.length) {
|
||||
int[][] types = Arrays.copyOfRange(object.pointTypes, start, Math.min(end, object.pointTypes.length));
|
||||
if (reversed) {
|
||||
Algorithms.reverseArray(types);
|
||||
}
|
||||
bundle.putArray("pointTypes", convertTypes(types, rules));
|
||||
}
|
||||
if (object.nameIds != null) {
|
||||
bundle.putArray("names", convertNameIds(object.nameIds, rules));
|
||||
}
|
||||
if (object.pointNameTypes != null && start < object.pointNameTypes.length && object.pointNames != null) {
|
||||
if (object.pointNameTypes != null && start < object.pointNameTypes.length) {
|
||||
int[][] types = Arrays.copyOfRange(object.pointNameTypes, start, Math.min(end, object.pointNameTypes.length));
|
||||
String[][] names = Arrays.copyOfRange(object.pointNames, start, Math.min(end, object.pointNames.length));
|
||||
if (reversed) {
|
||||
Algorithms.reverseArray(types);
|
||||
Algorithms.reverseArray(names);
|
||||
if (object.pointNames != null) {
|
||||
String[][] names = Arrays.copyOfRange(object.pointNames, start, Math.min(end, object.pointNames.length));
|
||||
bundle.putArray("pointNames", convertPointNames(types, names, rules));
|
||||
}
|
||||
bundle.putArray("pointNames", convertPointNames(types, names, rules));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -315,7 +309,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
int[] turnLanes = TurnType.lanesFromString(bundle.getString("turnLanes", null));
|
||||
turnType.setLanes(turnLanes);
|
||||
}
|
||||
object.id = bundle.getLong("id", object.id) << 6;
|
||||
object.id = bundle.getLong("id", object.id);
|
||||
object.types = bundle.getIntArray("types", null);
|
||||
object.pointTypes = bundle.getIntIntArray("pointTypes", null);
|
||||
object.nameIds = bundle.getIntArray("names", null);
|
||||
|
@ -333,21 +327,22 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
Location prevLocation = null;
|
||||
for (int i = 0; i < length; i++) {
|
||||
Location location = resources.getLocation(index);
|
||||
if (location != null) {
|
||||
double dist = 0;
|
||||
if (prevLocation != null) {
|
||||
dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude());
|
||||
distance += dist;
|
||||
}
|
||||
prevLocation = location;
|
||||
object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude());
|
||||
object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude());
|
||||
if (location.hasAltitude() && object.heightDistanceArray.length > 0) {
|
||||
object.heightDistanceArray[i * 2] = (float) dist;
|
||||
object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude();
|
||||
} else {
|
||||
object.heightDistanceArray = new float[0];
|
||||
}
|
||||
if (location == null) {
|
||||
break;
|
||||
}
|
||||
double dist = 0;
|
||||
if (prevLocation != null) {
|
||||
dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude());
|
||||
distance += dist;
|
||||
}
|
||||
prevLocation = location;
|
||||
object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude());
|
||||
object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude());
|
||||
if (location.hasAltitude() && object.heightDistanceArray.length > 0) {
|
||||
object.heightDistanceArray[i * 2] = (float) dist;
|
||||
object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude();
|
||||
} else {
|
||||
object.heightDistanceArray = new float[0];
|
||||
}
|
||||
if (plus) {
|
||||
index++;
|
||||
|
@ -457,7 +452,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
}
|
||||
|
||||
public float getBearingBegin() {
|
||||
return getBearingBegin(startPointIndex, distance > 0 && distance < DIST_BEARING_DETECT ? distance : DIST_BEARING_DETECT);
|
||||
return getBearingBegin(startPointIndex, DIST_BEARING_DETECT);
|
||||
}
|
||||
|
||||
public float getBearingBegin(int point, float dist) {
|
||||
|
@ -465,7 +460,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
}
|
||||
|
||||
public float getBearingEnd() {
|
||||
return getBearingEnd(endPointIndex, distance > 0 && distance < DIST_BEARING_DETECT ? distance : DIST_BEARING_DETECT);
|
||||
return getBearingEnd(endPointIndex, DIST_BEARING_DETECT);
|
||||
}
|
||||
|
||||
public float getBearingEnd(int point, float dist) {
|
||||
|
|
|
@ -367,9 +367,8 @@ public class RouteStatisticsHelper {
|
|||
RouteDataObject obj = segment.obj;
|
||||
for (int type : obj.getTypes()) {
|
||||
BinaryMapRouteReaderAdapter.RouteTypeRule tp = obj.region.quickGetEncodingRule(type);
|
||||
if (tp.getTag().equals("highway") || tp.getTag().equals("route")
|
||||
|| tp.getTag().equals("railway") || tp.getTag().equals("aeroway")
|
||||
|| tp.getTag().equals("aerialway") || tp.getTag().equals("piste:type")) {
|
||||
if (tp.getTag().equals("highway") || tp.getTag().equals("route") ||
|
||||
tp.getTag().equals("railway") || tp.getTag().equals("aeroway") || tp.getTag().equals("aerialway")) {
|
||||
if (!mainTagAdded) {
|
||||
req.setStringFilter(rrs.PROPS.R_TAG, tp.getTag());
|
||||
req.setStringFilter(rrs.PROPS.R_VALUE, tp.getValue());
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue