Compare commits

..

16 Commits

Author SHA1 Message Date
x7z4w
96bf6e1ec1 [drape] Adjust double- and long-tap delays
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-12-29 23:26:05 +07:00
eisa01
f477d9bb49 [carplay] Add myPositionMode button to iOS <26 workaround
See PR #2474

Signed-off-by: eisa01 <eisa01@gmail.com>
2025-12-29 23:12:23 +07:00
eisa01
9ec67097fc [carplay] Use system buttons for better appearance
Signed-off-by: eisa01 <eisa01@gmail.com>
2025-12-29 23:12:23 +07:00
Johannes
c0bdbe1bcb make sure to use the correct myPositionMode terminology 2025-12-29 23:12:23 +07:00
Johannes
006951a33c Add position mode toggle for CarPlay 2025-12-29 23:12:23 +07:00
Yannik Bloscheck
bea2148f66 [ios] Don't let custom map appearance influence CarPlay
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-12-29 23:12:23 +07:00
Yannik Bloscheck
9729ab9cab [ios] Always use light map appearance by default
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-12-29 23:12:23 +07:00
Leonardo Bishop
d448369c04 [ios] Handle distinct FollowAndRotateRoute and FollowAndRotateCompass modes
Signed-off-by: Leonardo Bishop <me@leonardobishop.net>
2025-12-29 23:12:23 +07:00
Leonardo Bishop
ee4675b388 [android] Handle distinct FollowAndRotateRoute and FollowAndRotateCompass modes
Signed-off-by: Leonardo Bishop <me@leonardobishop.net>
2025-12-29 23:12:23 +07:00
Leonardo Bishop
515cf98cef [drape] Add FollowAndRotateRoute mode
This adds a new mode to rotate the camera towards the route while driving.
This is done by looking ahead X number of seconds along the current route,
up to the next turn, and calculating the angle between the current position
and then.

Squashed commits:

[drape] Add bearing calculation via route lookahead while navigating
[drape] Extract NavigationContext from OnLocationUpdate params
[drape] Increase rotation animation duration during navigation
[drape] Seperate route and compass rotation into two modes
[drape] Reduce route lookahead maximum to 25 seconds
[drape] Fix case where rotation was incorrectly considered invalid
[drape] Make FollowAndRotateRoute mode only available during driving navigation
[drape] Rewrite FollowedPolyline::GetLookaheadPoint
[drape] Cleanup

Signed-off-by: Leonardo Bishop <me@leonardobishop.net>
2025-12-29 23:12:23 +07:00
Jean-Baptiste
0d01076c0f [android] Fix camera cutout offset in navigation
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-29 23:12:23 +07:00
thesupertechie
5f0bcc1486 [core] remove random key file
Signed-off-by: thesupertechie <thesupertechie1@gmail.com>
2025-12-29 23:12:23 +07:00
thesupertechie
1edcb23ab2 [tts] add tamil TTS translation
Signed-off-by: thesupertechie <thesupertechie1@gmail.com>
2025-12-29 23:12:22 +07:00
Jean-Baptiste
817b31bc5f [android] Update Android dependencies
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-29 23:12:22 +07:00
Yannik Bloscheck
33e4894a56 [core] Add language data to world files
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-12-29 16:13:18 +01:00
Bastian Greshake Tzovaras
aa34159ce8 [taginfo] update tags
Signed-off-by: Bastian Greshake Tzovaras <bgreshake@googlemail.com>
2025-12-28 17:38:17 -03:00
87 changed files with 700 additions and 437 deletions

View File

@@ -351,6 +351,7 @@ dependencies {
implementation libs.androidx.recyclerview
implementation libs.androidx.work.runtime
implementation libs.androidx.lifecycle.process
implementation libs.androidx.documentfile
implementation libs.android.material
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
// https://github.com/organicmaps/organicmaps/issues/6106

View File

@@ -9,7 +9,8 @@ import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
import static app.organicmaps.sdk.location.LocationState.FOLLOW;
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE;
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE_COMPASS;
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE_ROUTE;
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
import static app.organicmaps.sdk.util.Utils.dimen;
@@ -1900,7 +1901,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
locationHelper.restartWithNewMode();
if ((newMode == FOLLOW || newMode == FOLLOW_AND_ROTATE) && !LocationUtils.checkFineLocationPermission(this))
if ((newMode == FOLLOW || newMode == FOLLOW_AND_ROTATE_ROUTE || newMode == FOLLOW_AND_ROTATE_COMPASS)
&& !LocationUtils.checkFineLocationPermission(this))
{
// Try to optimistically request FINE permission for FOLLOW and FOLLOW_AND_ROTATE modes.
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION permission for " + LocationState.nameOf(newMode));

View File

@@ -183,11 +183,16 @@ public final class UiHelpers
drawableRes = R.drawable.ic_follow;
tintColor = Colors.LOCATION_TINT;
}
case LocationState.FOLLOW_AND_ROTATE ->
case LocationState.FOLLOW_AND_ROTATE_COMPASS ->
{
drawableRes = R.drawable.ic_follow_and_rotate;
tintColor = Colors.LOCATION_TINT;
}
case LocationState.FOLLOW_AND_ROTATE_ROUTE ->
{
drawableRes = R.drawable.ic_follow_route;
tintColor = Colors.LOCATION_TINT;
}
default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode);
}

View File

@@ -98,6 +98,11 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
mSpeedLimit = topFrame.findViewById(R.id.nav_speed_limit);
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
View mTopbar = topFrame.findViewById(R.id.statutbar);
ViewCompat.setOnApplyWindowInsetsListener(mTopbar,(v, windowInsets) -> {
UiUtils.setViewNavigationTopInsetsMargin(v, windowInsets);
return windowInsets;
});
// Show a blank view below the navbar to hide the menu content
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
final View nextTurnContainer = mFrame.findViewById(R.id.nav_next_turn_container);

View File

@@ -281,6 +281,14 @@ public final class UiUtils
view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, view.getPaddingBottom());
}
public static void setViewNavigationTopInsetsMargin(View view, WindowInsetsCompat windowInsets)
{
final Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.topMargin = systemInsets.top;
view.setLayoutParams(lp);
}
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar, @NonNull View.OnClickListener listener)
{
View customNavigationButton = toolbar.findViewById(R.id.back);

View File

@@ -49,8 +49,8 @@ public class MyPositionButton
int colorAttr = R.attr.iconTint;
@DimenRes
int sizeDimen = R.dimen.map_button_icon_size;
if (mode == LocationState.FOLLOW || mode == LocationState.FOLLOW_AND_ROTATE
|| mode == LocationState.PENDING_POSITION)
if (mode == LocationState.FOLLOW || mode == LocationState.FOLLOW_AND_ROTATE_ROUTE
|| mode == LocationState.FOLLOW_AND_ROTATE_COMPASS || mode == LocationState.PENDING_POSITION)
{
colorAttr = com.google.android.material.R.attr.colorSecondary;
if (mode == LocationState.PENDING_POSITION)
@@ -69,7 +69,8 @@ public class MyPositionButton
case LocationState.NOT_FOLLOW_NO_POSITION -> R.drawable.ic_location_off;
case LocationState.NOT_FOLLOW -> R.drawable.ic_location_crosshair;
case LocationState.FOLLOW -> R.drawable.ic_follow;
case LocationState.FOLLOW_AND_ROTATE -> R.drawable.ic_follow_and_rotate;
case LocationState.FOLLOW_AND_ROTATE_COMPASS -> R.drawable.ic_follow_and_rotate;
case LocationState.FOLLOW_AND_ROTATE_ROUTE -> R.drawable.ic_follow_route;
default -> throw new IllegalArgumentException("Invalid button mode: " + mode);
};
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:strokeColor="@android:color/white"
android:fillColor="@android:color/white"
android:pathData="M15.15 16.92l-7.04 2.8v0.4l2.63 1.07 0.98 2.67h0.39z"/>
<path
android:strokeColor="@android:color/white"
android:strokeWidth="2"
android:strokeLineJoin="miter"
android:pathData="m 16.25,15.95 c 2.29,-2.29 1.91,-3.87 -4.06,-3.87"/>
<path
android:strokeColor="@android:color/white"
android:strokeWidth="2"
android:strokeLineJoin="miter"
android:pathData="M8.98 7.43c-2.97 2.96-2.72 4.66 3.24 4.66"/>
<path
android:strokeColor="@android:color/white"
android:strokeWidth="2"
android:strokeLineJoin="miter"
android:pathData="M8.89 7.51l8.83-8.79"/>
<path
android:strokeColor="@android:color/white"
android:strokeWidth="2"
android:strokeLineJoin="miter"
android:pathData="M9.2 22.83c-0.64 0.57-2.9 2.5-3.56 3.13"/>
</vector>

View File

@@ -11,13 +11,12 @@
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/statutbar"
android:layout_height="15dp"
android:layout_height="1dp"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/street_frame"
android:layout_width="500dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_half_plus_eight"
android:layout_marginEnd="@dimen/margin_quarter"
app:cardCornerRadius="@dimen/margin_half"
android:elevation="@dimen/nav_elevation"
@@ -52,7 +51,6 @@
app:layout_constraintEnd_toStartOf="@+id/street_frame"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/statutbar"
android:layout_marginTop="@dimen/margin_half_plus_eight"
android:layout_marginStart="@dimen/margin_quarter"
android:clickable="true"
android:elevation="@dimen/nav_elevation">

View File

@@ -11,13 +11,12 @@
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/statutbar"
android:layout_height="25dp"
android:layout_height="1dp"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/street_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_half_plus"
android:layout_marginStart="@dimen/nav_street_left"
android:layout_marginEnd="@dimen/margin_quarter"
app:cardCornerRadius="@dimen/margin_half"
@@ -55,7 +54,6 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/statutbar"
android:layout_marginStart="@dimen/margin_half"
android:layout_marginTop="@dimen/margin_half_plus"
android:clickable="true"
android:elevation="@dimen/nav_elevation">
<LinearLayout

View File

@@ -1,15 +1,15 @@
[versions]
androidGradlePlugin = "8.11.2"
androidGradlePlugin = "8.13.2"
androidxCarApp = "1.7.0"
[libraries]
android-tools = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" }
triplet-play-publisher = { module = "com.github.triplet.gradle:play-publisher", version = "3.12.1" }
triplet-play-publisher = { module = "com.github.triplet.gradle:play-publisher", version = "3.13.0" }
huawei-publish = { module = "ru.cian:huawei-publish-gradle-plugin", version = "1.4.2" }
android-tools-desugar = { module = "com.android.tools:desugar_jdk_libs", version = "2.1.5" }
microg-services-location = { module = "org.microg.gms:play-services-location", version = "0.3.6.244735" }
androidx-core = { module = "androidx.core:core", version = "1.17.0" }
jetbrains-kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version = "2.2.20" }
jetbrains-kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version = "2.2.21" }
androidx-annotation = { module = "androidx.annotation:annotation", version = "1.9.1" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.1" }
androidx-car-app = { module = "androidx.car.app:app", version.ref = "androidxCarApp" }
@@ -21,12 +21,13 @@ androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version
androidx-work-runtime = { module = "androidx.work:work-runtime", version = "2.10.5" }
androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version = "2.9.4" }
androidx-media = { module = "androidx.media:media", version = "1.7.1" }
androidx-documentfile= { module = "androidx.documentfile:documentfile", version ="1.1.0" }
android-material = { module = "com.google.android.material:material", version = "1.12.0" }
google-guava = { module = "com.google.guava:guava", version = "33.4.8-android" }
google-guava = { module = "com.google.guava:guava", version = "33.5.0-android" }
appdevnext-androidchart = { module = "com.github.AppDevNext:AndroidChart", version = "3.1.0.31" }
androidx-test-junit = { module = "androidx.test.ext:junit", version = "1.3.0" }
junit = { module = "junit:junit", version = "4.13.2" }
mockito-core = { module = "org.mockito:mockito-core", version = "5.20.0" }
mockito-core = { module = "org.mockito:mockito-core", version = "5.21.0" }
[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }

View File

@@ -126,6 +126,7 @@ dependencies {
implementation libs.androidx.recyclerview
implementation libs.androidx.preference
implementation libs.android.material
implementation libs.androidx.documentfile
testImplementation libs.junit
}

View File

@@ -20,7 +20,8 @@ public final class LocationState
}
@Retention(RetentionPolicy.SOURCE)
@IntDef({PENDING_POSITION, NOT_FOLLOW_NO_POSITION, NOT_FOLLOW, FOLLOW, FOLLOW_AND_ROTATE})
@IntDef({PENDING_POSITION, NOT_FOLLOW_NO_POSITION, NOT_FOLLOW, FOLLOW, FOLLOW_AND_ROTATE_COMPASS,
FOLLOW_AND_ROTATE_ROUTE})
@interface Value
{}
@@ -29,7 +30,8 @@ public final class LocationState
public static final int NOT_FOLLOW_NO_POSITION = 1;
public static final int NOT_FOLLOW = 2;
public static final int FOLLOW = 3;
public static final int FOLLOW_AND_ROTATE = 4;
public static final int FOLLOW_AND_ROTATE_COMPASS = 4;
public static final int FOLLOW_AND_ROTATE_ROUTE = 5;
// These constants should correspond to values defined in platform/location.hpp
// Leave 0-value as no any error.
@@ -69,7 +71,8 @@ public final class LocationState
case NOT_FOLLOW_NO_POSITION -> "NOT_FOLLOW_NO_POSITION";
case NOT_FOLLOW -> "NOT_FOLLOW";
case FOLLOW -> "FOLLOW";
case FOLLOW_AND_ROTATE -> "FOLLOW_AND_ROTATE";
case FOLLOW_AND_ROTATE_COMPASS -> "FOLLOW_AND_ROTATE_COMPASS";
case FOLLOW_AND_ROTATE_ROUTE -> "FOLLOW_AND_ROTATE_ROUTE";
default -> "Unknown: " + mode;
};
}

View File

@@ -42,11 +42,10 @@
<string name="type.amenity.gambling">Glücksspiel</string>
<string name="type.leisure.adult_gaming_centre">Spielhalle für Erwachsene</string>
<string name="type.leisure.amusement_arcade">Spielhalle für Unterhaltungsspiele</string>
<string name="type.amenity.charging_station.general">Ladestation</string>
<string name="type.amenity.charging_station.bicycle">Fahrräder</string>
<string name="type.amenity.charging_station.motorcycle">Motorräder</string>
<string name="type.amenity.charging_station.motorcar">Autos</string>
<string name="type.amenity.charging_station.small">Begrenzte Kapazität</string>
<string name="type.amenity.charging_station">Ladestation</string>
<string name="type.amenity.charging_station.bicycle">Fahrrad-Ladestation</string>
<string name="type.amenity.charging_station.motorcar">Kfz-Ladestation</string>
<string name="type.amenity.charging_station.motorcar.small">Kfz-Ladestation</string>
<string name="type.amenity.childcare">Kindertagesstätte</string>
<string name="type.amenity.cinema">Kino</string>
<string name="type.leisure.bowling_alley">Bowlingbahn</string>

View File

@@ -52,11 +52,10 @@
<string name="type.amenity.gambling">Gambling</string>
<string name="type.leisure.adult_gaming_centre">Adult Gaming Centre</string>
<string name="type.leisure.amusement_arcade">Arcade</string>
<string name="type.amenity.charging_station.general">Charging Station</string>
<string name="type.amenity.charging_station.bicycle">Bicycles</string>
<string name="type.amenity.charging_station.motorcycle">Motorcycles</string>
<string name="type.amenity.charging_station.motorcar">Cars</string>
<string name="type.amenity.charging_station.small">Limited Capacity</string>
<string name="type.amenity.charging_station">Charging Station</string>
<string name="type.amenity.charging_station.bicycle">Bicycle Charging Station</string>
<string name="type.amenity.charging_station.motorcar">Car Charging Station</string>
<string name="type.amenity.charging_station.motorcar.small">Car Charging Point</string>
<string name="type.amenity.childcare">Nursery</string>
<string name="type.amenity.cinema">Cinema</string>
<string name="type.amenity.studio">Media Studio</string>

View File

@@ -328,9 +328,7 @@
"amenity-car_wash": "4Autowaschanlage|Autowäsche",
"amenity-veterinary": "4Tierarzt",
"@charging_station": "4Ladestation|aufladen",
"amenity-charging_station-bicycle|@charging_station": "5Fahrradladestation|Fahrrad aufladen|E-Bike aufladen|Fahrrad laden|E-Bike laden",
"amenity-charging_station-motorcycle|@charging_station": "6Motorradladestation|Motorrad aufladen|Motorrad laden",
"amenity-charging_station-motorcar|@charging_station": "4Autoladestation|5Autoladegerät|Auto aufladen|Auto laden",
"amenity-charging_station-bicycle|@charging_station": "Fahrrad aufladen",
"amenity-childcare": "Kindertagesstätte|Kindergarten|Kinderbetreuung",
"amenity-bicycle_parking": "6Fahrradständer",
"amenity-waste_basket": "6Abfalleimer|4Mülleimer|Papierkorb",
@@ -512,6 +510,7 @@
"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraktion|Labyrinth",
"building-guardhouse": "4Wache",
"shop-lighting|@shop": "Leuchtmittel|Lampen|Leuchte",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "4Autoladestation|5Autoladegerät|Ladestation",
"amenity-mobile_money_agent": "6Mobile Money Vertretung|Mobile Money|Mobiles Geld",
"man_made-telescope|man_made-telescope-optical|man_made-telescope-radio|man_made-telescope-gamma": "4Teleskop",
"amenity-sailing_school": "5Segelschule|5Bootsschule|Bootsfahrschule",

View File

@@ -353,11 +353,10 @@
"man_made-observatory": "4Observatory",
"amenity-veterinary": "4Veterinary Doctor|3Veterinary|vet|veterinarian",
"amenity-animal_shelter": "6Animal Shelter",
"@charging_station": "4Charging Station|charging|charger",
"amenity-charging_station-general|@charging_station": "",
"amenity-charging_station-bicycle|@charging_station": "4Bicycle Charging Station|Bicycle Charging|Bike Charging",
"amenity-charging_station-motorcycle|@charging_station": "5Motorcycle Charging Station|Motorcycle Charging|Motorbike Charging",
"amenity-charging_station-motorcar|@charging_station": "3Car Charging Station|Motorcar Charging|Car Charging",
"@charging_station": "4Charging Station|charging",
"amenity-charging_station|@charging_station": "",
"amenity-charging_station-bicycle|@charging_station": "4Bicycle Charging|4Bike Charging",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "4Motorcar Charging|3Car Charging|Charger",
"amenity-childcare": "Nursery|4Child Care|childcare",
"amenity-bicycle_parking": "4Bicycle Parking|4Bike Parking",
"amenity-waste_basket": "4Trash Bin|4litter bin|5waste basket|bin",

View File

@@ -518,7 +518,7 @@
"amenity-toilets|toilets-yes|@category_toilet": "wc",
"leisure-sports_centre-sport-swimming": "4Centro de natación",
"amenity-police|@category_police": "Estación de policía|policía",
"amenity-charging_station-motorcar|@charging_station": "Cargador de autos|cargador de coches|cargador de carros",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "Cargador de autos|cargador de coches|cargador de carros",
"amenity-sailing_school": "Escuela de vela|Escuela de navegación",
"amenity-flight_school": "Escuela de aviación|Escuela de aeronáutica|Escuela de pilotos|aeronáutica|vuelo|aviación",
"amenity-prep_school": "Propedéutico|Tutoría",

View File

@@ -486,7 +486,7 @@
"amenity-love_hotel": "Hôtel de passe|Hôtel de sexe|Hôtel pour adultes",
"healthcare-sample_collection": "Prélèvement d'échantillons",
"recycling-cardboard|@category_recycling": "5Recyclage de carton|Déchets de carton|Carton",
"amenity-charging_station-motorcar|@charging_station": "Chargeur automobile|Chargeur de voiture|Chargeur",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "Chargeur automobile|Chargeur de voiture|Chargeur",
"shop-lighting|@shop": "4Lumières|Luminaires|4Lampes",
"office-security": "Bureau de sécurité",
"building-guardhouse": "Garde|poste de sécurité|poste de gardiennage",

View File

@@ -320,7 +320,7 @@
"amenity-veterinary": "4Veterinārārsts|vetārsts|vetklīnika|veterinārā klīnika",
"@charging_station": "4Uzlādes stacija|uzlāde",
"amenity-charging_station-bicycle|@charging_station": "4Velosipēdu uzlāde|Riteņu uzlāde|Ričuku uzlāde|Divriteņu uzlāde",
"amenity-charging_station-motorcar|@charging_station": "Automobiļu uzlāde|mašīnu uzlāde",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "Automobiļu uzlāde|mašīnu uzlāde",
"amenity-childcare": "Bērnistaba",
"amenity-bicycle_parking": "4Velonovietne",
"amenity-waste_basket": "Atkritumu tvertne|4miskaste",

View File

@@ -330,7 +330,7 @@
"amenity-animal_shelter": "Приют для животных",
"@charging_station": "4Зарядная станция|зарядка|электрозарядка|зарядить",
"amenity-charging_station-bicycle|@charging_station": "4Велозарядка|Зарядка для велосипедов",
"amenity-charging_station-motorcar|@charging_station": "4Автозарядка",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "4Автозарядка",
"amenity-childcare": "Детская комната|3ясли",
"amenity-bicycle_parking": "4Велопарковка|велостоянка",
"amenity-waste_basket": "3Урна|4Мусорная корзина",

View File

@@ -331,7 +331,7 @@
"amenity-veterinary": "4Veteriner",
"@charging_station": "Şarj İstasyonu|şarj etme",
"amenity-charging_station-bicycle|@charging_station": "4Bisiklet Şarjı",
"amenity-charging_station-motorcar|@charging_station": "4Otomobil Şarj Cihazı|4Araba Şarj Cihazı|4Araç Şarj Cihazı|3Trugo|4TOGG Şarj",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "4Otomobil Şarj Cihazı|4Araba Şarj Cihazı|4Araç Şarj Cihazı|3Trugo|4TOGG Şarj",
"amenity-childcare": "Çocuk Yuvası|Kreş",
"amenity-bicycle_parking": "4Bisiklet park etme|bisiklet park",
"amenity-waste_basket": "Çöp Kutusu",

View File

@@ -1,4 +1,10 @@
{
"World": {
"languages": ["int_name", "en", "default"]
},
"WorldCoasts": {
"languages": ["int_name", "en", "default"]
},
"Abkhazia": {
"languages": ["ab", "ru"]
},

View File

@@ -301,7 +301,7 @@ railway|crossing;197;
boundary|national_park;198;
deprecated:natural|wood|deciduous:01.2020;[natural=wood][wood=deciduous],[natural=wood][leaf_type=deciduous],[natural=wood][leaf_cycle=deciduous];x;name;int_name;199;landuse|forest|deciduous
waterway|dam;200;
amenity|charging_station|small;[amenity=charging_station][motorcar?][!capacity],[amenity=charging_station][motorcar?][capacity=1],[amenity=charging_station][motorcar?][capacity=2],[amenity=charging_station][!capacity],[amenity=charging_station][capacity=1],[amenity=charging_station][capacity=2],;;name;int_name;201;
amenity|charging_station|motorcar|small;[amenity=charging_station][motorcar?][!capacity],[amenity=charging_station][motorcar?][capacity=1],[amenity=charging_station][motorcar?][capacity=2];;name;int_name;201;
leisure|golf_course;202;
highway|service|bridge;[highway=service][bridge?];;name;int_name;203;
# ~250K usages.
@@ -405,12 +405,12 @@ highway|secondary|tunnel;[highway=secondary][tunnel?];;name;int_name;297;
# TODO: its a mismapping likely, if there is a bridge structure still, then it should be railway=disused.
railway|abandoned|bridge;[railway=abandoned][bridge?];;name;int_name;298;
man_made|lighthouse;299;
amenity|charging_station|motorcycle;[amenity=charging_station][motorcycle?];;name;int_name;300;
deprecated:highway|path|demanding_mountain_hiking:04.2024;[highway=path][sac_scale=demanding_mountain_hiking];x;name;int_name;300;highway|path|difficult
man_made|storage_tank;301;
man_made|silo;302;
power|generator;303;
highway|pedestrian|bridge;[highway=pedestrian][bridge?];;name;int_name;304;
amenity|charging_station|motorcar;[amenity=charging_station][motorcar?][capacity?],[amenity=charging_station][motorcar?];;name;int_name;305;
amenity|charging_station|motorcar;[amenity=charging_station][motorcar?][capacity?];;name;int_name;305;
natural|saddle;306;
mountain_pass;[mountain_pass];;name;int_name;307;
highway|raceway;308;
@@ -419,7 +419,7 @@ highway|primary_link|bridge;[highway=primary_link][bridge?];;name;int_name;310;
man_made|tower|communication;[man_made=tower][tower:type=communication];;name;int_name;311;
sport|equestrian;312;
tourism|information|office;[tourism=information][information=office];;name;int_name;313;
amenity|charging_station|carless;[amenity=charging_station][motorcar=not],[amenity=charging_station][motorcar=no];;name;int_name;314;
deprecated:highway|footway|hiking:04.2024;[highway=footway][sac_scale=hiking];x;name;int_name;314;highway|path
aeroway|gate;315;
# TODO: railway=preserved is deprecated in OSM, recommended mapping is railway:preserved=yes + railway=*
railway|preserved;316;
@@ -1192,7 +1192,7 @@ shop|tyres;1064;
craft|beekeeper;1065;
amenity|car_wash;1066;
amenity|veterinary;1067;
amenity|charging_station|general;[amenity=charging_station];;name;int_name;1068;
amenity|charging_station;1068;
amenity|childcare;1069;
craft|blacksmith;1070;
amenity|bicycle_parking;1071;
Can't render this file because it contains an unexpected character in line 7 and column 16.

View File

@@ -0,0 +1,108 @@
{
"make_a_slight_right_turn":"லேசாக வலதுபுறம் திரும்புங்கள்.",
"make_a_slight_right_turn_street":"NULL",
"make_a_slight_right_turn_street_verb":"NULL",
"make_a_right_turn":"வலதுபுறமாக திரும்புங்கள்.",
"make_a_right_turn_street":"NULL",
"make_a_sharp_right_turn":"கூர்மையாக வலதுபுறம் திரும்புங்கள்.",
"make_a_sharp_right_turn_street":"NULL",
"enter_the_roundabout":"ரவுண்டபௌட்டை நுழையுங்கள்.",
"enter_the_roundabout_street":"NULL",
"enter_the_roundabout_street_verb":"NULL",
"leave_the_roundabout":"ரவுண்டபௌட்டை வெளியேறுங்கள்.",
"leave_the_roundabout_street":"NULL",
"leave_the_roundabout_street_verb":"NULL",
"make_a_slight_left_turn":"லேசாக இடதுபுறம் திரும்புங்கள்.",
"make_a_slight_left_turn_street":"NULL",
"make_a_slight_left_turn_street_verb":"NULL",
"make_a_left_turn":"இடதுபுறமாக திரும்புங்கள்.",
"make_a_left_turn_street":"NULL",
"make_a_sharp_left_turn":"கூர்மையாக இடதுபுறம் திரும்புங்கள்.",
"make_a_sharp_left_turn_street":"NULL",
"make_a_u_turn":"U-வழியில் திரும்புங்கள்.",
"make_a_u_turn_street":"NULL",
"make_a_u_turn_street_verb":"NULL",
"go_straight":"நேரா போங்க.",
"exit":"வெளியேறுங்கள்.",
"onto":"நோக்கி",
"take_exit_number":"வெளியேறும் வழி எடுங்கள்",
"take_exit_number_street_verb":"NULL",
"route_recalculating":"வழி மறுபடி கணிக்கிறது",
"destination":"நீங்கள் வருவீர்கள்.",
"you_have_reached_the_destination":"நீங்கள் வந்துவிட்டீர்கள்..",
"in_50_meters":"ஐம்பது மீட்டரில்",
"in_100_meters":"நூறு மீட்டரில்",
"in_200_meters":"இருநூறு மீட்டரில்",
"in_250_meters":"இருநூற்று ஐம்பது மீட்டரில்",
"in_300_meters":"முன்னூறு மீட்டரில்",
"in_400_meters":"நானூறு மீட்டரில்",
"in_500_meters":"ஐநூறு மீட்டரில்",
"in_600_meters":"அறுநூறு மீட்டரில்",
"in_700_meters":"எழுநூறு மீட்டரில்",
"in_750_meters":"எழுநூறு ஐம்பது மீட்டரில்",
"in_800_meters":"எண்ணூறு மீட்டரில்",
"in_900_meters":"தொள்ளாயிரம் மீட்டரில்",
"in_1_kilometer":"ஒரு கிலோமீட்டரில்",
"in_1_5_kilometers":"ஒன்றரை கிலோமீட்டரில்",
"in_2_kilometers":"இரண்டு கிலோமீட்டரில்",
"in_2_5_kilometers":"இரண்டரை கிலோமீட்டரில்",
"in_3_kilometers":"மூன்று கிலோமீட்டரில்",
"then":"அடுத்தது",
"dist_direction_onto_street":"%1$s %4$s %3$s %5$s %2$s",
"take_the_1_exit":"ஒன்றாம் வெளியேறும் வழி எடுங்கள்.",
"take_the_1_exit_street":"NULL",
"take_the_1_exit_street_verb":"NULL",
"take_the_2_exit":"இரண்டாம் வெளியேறும் வழி எடுங்கள்.",
"take_the_2_exit_street":"NULL",
"take_the_2_exit_street_verb":"NULL",
"take_the_3_exit":"மூன்றாம் வெளியேறும் வழி எடுங்கள்.",
"take_the_3_exit_street":"NULL",
"take_the_3_exit_street_verb":"NULL",
"take_the_4_exit":"நான்காவது வெளியேறும் வழி எடுங்கள்.",
"take_the_4_exit_street":"NULL",
"take_the_4_exit_street_verb":"NULL",
"take_the_5_exit":"ஐந்தாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_5_exit_street":"NULL",
"take_the_5_exit_street_verb":"NULL",
"take_the_6_exit":"ஆறாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_6_exit_street":"NULL",
"take_the_6_exit_street_verb":"NULL",
"take_the_7_exit":"ஏழாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_7_exit_street":"NULL",
"take_the_7_exit_street_verb":"NULL",
"take_the_8_exit":"எட்டாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_8_exit_street":"NULL",
"take_the_8_exit_street_verb":"NULL",
"take_the_9_exit":"ஒன்பதாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_9_exit_street":"NULL",
"take_the_9_exit_street_verb":"NULL",
"take_the_10_exit":"பத்தாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_10_exit_street":"NULL",
"take_the_10_exit_street_verb":"NULL",
"take_the_11_exit":"பதினொன்றாவது வெளியேறும் வழி எடுங்கள்.",
"take_the_11_exit_street":"NULL",
"take_the_11_exit_street_verb":"NULL",
"in_50_feet":"ஐம்பது அடியில்",
"in_100_feet":"நூறு அடியில்",
"in_200_feet":"இருநூறு அடியில்",
"in_300_feet":"முன்னூறு அடியில்",
"in_400_feet":"நானூறு அடியில்",
"in_500_feet":"ஐநூறு அடியில்",
"in_600_feet":"அறுநூறு அடியில்",
"in_700_feet":"எழுநூறு அடியில்",
"in_800_feet":"எண்ணூறு அடியில்",
"in_900_feet":"தொள்ளாயிரம் அடியில்",
"in_1000_feet":"ஆயிரம் அடியில்",
"in_1500_feet":"ஆயிரம் ஐநூறு அடியில்",
"in_2000_feet":"இரண்டு ஆயிரம் அடியில்",
"in_2500_feet":"இரண்டு ஆயிரம் ஐநூறு அடியில்",
"in_3000_feet":"மூன்று ஆயிரம் அடியில்",
"in_3500_feet":"மூன்று ஆயிரம் ஐநூறு அடியில்",
"in_4000_feet":"நான்கு ஆயிரம் அடியில்",
"in_4500_feet":"நான்கு ஆயிரம் ஐநூறு அடியில்",
"in_5000_feet":"ஐந்து ஆயிரம் அடியில்",
"in_1_mile":"ஒன்று மைலில்",
"in_1_5_miles":"ஒன்றரை மைலில்",
"in_2_miles":"இரண்டு மைலில்",
"unknown_camera":"கேமரா முன்னால் இருக்கிறது"
}

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -558,9 +558,8 @@ area|z15-[amenity=marketplace],
area|z15-[office=diplomatic],
area|z15-[amenity=vehicle_inspection],
area|z15-[amenity=car_wash],
area|z15-[amenity=fuel],
area|z15-[amenity=charging_station][motorcar?],
area|z16-[amenity=charging_station],
area|z15-[amenity=fuel],
area|z15-[amenity=motorcycle_parking],
area|z15-[amenity=bicycle_parking],
{fill-opacity: 1; fill-color: @general_area;}

View File

@@ -2398,28 +2398,18 @@ node|z17-[amenity=fuel],
node|z18-[amenity=fuel],
{font-size: 11;}
node|z15-[amenity=charging_station][motorcar?],
node|z16-[amenity=charging_station][motorcycle?],
node|z16-[amenity=charging_station][bicycle?],
node|z16-[amenity=charging_station][motorcar=not],
node|z16-[amenity=charging_station],
{icon-image: charging_station-small-m.svg;}
node|z14[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging_station-s.svg;}
node|z15-[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging_station-m.svg;}
node|z14[amenity=charging_station][motorcar?][!capacity],
node|z14[amenity=charging_station][motorcar?][capacity=1],
node|z14[amenity=charging_station][motorcar?][capacity=2],
{icon-image: none;}
node|z15-[amenity=charging_station][motorcar?][!capacity],
node|z15-[amenity=charging_station][motorcar?][capacity=1],
node|z15-[amenity=charging_station][motorcar?][capacity=2],
{icon-image: charging_station-small-m.svg;}
node|z16-[amenity=charging_station],
{icon-image: charging-point-m.svg;}
node|z14[amenity=charging_station][motorcar?],
node|z14[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging-station-s.svg;}
node|z15-[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging-station-m.svg;}
node|z14[amenity=charging_station][motorcar?][capacity?],
{text-offset: 1;font-size: 10;icon-min-distance: 20;}
node|z15[amenity=charging_station][motorcar?],
{icon-min-distance: 20;}

View File

@@ -85,12 +85,8 @@ landuse-cemetery-christian # area z10- (also has icon z
=== 180
amenity-car_wash # area z15- (also has icon z17-, caption(optional) z17-)
amenity-charging_station-bicycle # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-carless # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-general # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-motorcar # area z15- (also has icon z14-, caption(optional) z14-)
amenity-charging_station-motorcycle # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-small # area z15- (also has icon z15-, caption(optional) z16-)
amenity-charging_station-motorcar-small # area z15- (also has icon z16-, caption(optional) z16-)
amenity-courthouse # area z15- (also has icon z17-, caption(optional) z17-)
amenity-fire_station # area z15- (also has icon z16-, caption(optional) z17-)
amenity-fuel # area z15- (also has icon z14-, caption(optional) z14-)

View File

@@ -374,13 +374,13 @@ tourism-attraction # icon z14- (also has captio
tourism-gallery # icon z15- (also has caption(optional) z15-)
=== 4300
amenity-charging_station-small # icon z15- (also has caption(optional) z16-, area z15-)
=== 4280
amenity-charging_station-motorcar # icon z14- (also has caption(optional) z14-, area z15-)
amenity-fuel # icon z14- (also has caption(optional) z14-, area z15-)
=== 4270
amenity-charging_station-motorcar-small # icon z16- (also has caption(optional) z16-, area z15-)
=== 4260
highway-services # icon z14- (also has caption(optional) z14-, area z13-)
=== 4250
@@ -424,23 +424,13 @@ highway-rest_area # icon z15- (also has captio
tourism-camp_site # icon z16- (also has caption(optional) z16-, area z13-)
tourism-caravan_site # icon z16- (also has caption(optional) z16-)
tourism-chalet # icon z16- (also has caption(optional) z16-)
=== 3850
shop-car_repair-tyres # icon z15- (also has caption(optional) z15-)
=== 3800
amenity-charging_station-motorcycle # icon z16- (also has caption(optional) z16-, area z16-)
=== 3752
amenity-charging_station-bicycle # icon z16- (also has caption(optional) z16-, area z16-)
=== 3751
amenity-charging_station-general # icon z16- (also has caption(optional) z16-, area z16-)
amenity-charging_station # icon z16- (also has caption(optional) z16-)
amenity-charging_station-bicycle # icon z16- (also has caption(optional) z16-)
shop-car_repair-tyres # icon z15- (also has caption(optional) z15-)
=== 3750
amenity-charging_station-carless # icon z16- (also has caption(optional) z16-, area z16-)
=== 3749
railway-subway_entrance # icon z16- (also has caption(optional) z17-)
railway-subway_entrance-adana # icon z16- (also has caption(optional) z17-)
railway-subway_entrance-algiers # icon z16- (also has caption(optional) z17-)
@@ -1650,13 +1640,13 @@ leisure-swimming_pool-private # icon z17- (also has captio
# tourism-gallery # caption(optional) z15- (also has icon z15-)
# === -5700
# amenity-charging_station-small # caption(optional) z16- (also has icon z15-, area z15-)
# === -5720
# amenity-charging_station-motorcar # caption(optional) z14- (also has icon z14-, area z15-)
# amenity-fuel # caption(optional) z14- (also has icon z14-, area z15-)
# === -5730
# amenity-charging_station-motorcar-small # caption(optional) z16- (also has icon z16-, area z15-)
# === -5740
# highway-services # caption(optional) z14- (also has icon z14-, area z13-)
# === -5750
@@ -1700,23 +1690,13 @@ leisure-swimming_pool-private # icon z17- (also has captio
# tourism-camp_site # caption(optional) z16- (also has icon z16-, area z13-)
# tourism-caravan_site # caption(optional) z16- (also has icon z16-)
# tourism-chalet # caption(optional) z16- (also has icon z16-)
# === -6150
# shop-car_repair-tyres # caption(optional) z15- (also has icon z15-)
# === -6200
# amenity-charging_station-motorcycle # caption(optional) z16- (also has icon z16-, area z16-)
# === -6248
# amenity-charging_station-bicycle # caption(optional) z16- (also has icon z16-, area z16-)
# === -6249
# amenity-charging_station-general # caption(optional) z16- (also has icon z16-, area z16-)
# amenity-charging_station # caption(optional) z16- (also has icon z16-)
# amenity-charging_station-bicycle # caption(optional) z16- (also has icon z16-)
# shop-car_repair-tyres # caption(optional) z15- (also has icon z15-)
# === -6250
# amenity-charging_station-carless # caption(optional) z16- (also has icon z16-, area z16-)
# === -6251
# railway-subway_entrance # caption(optional) z17- (also has icon z16-)
# railway-subway_entrance-adana # caption(optional) z17- (also has icon z16-)
# railway-subway_entrance-algiers # caption(optional) z17- (also has icon z16-)

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -78,7 +78,6 @@ leisure-sports_centre-sport-volleyball # area z13- (also has icon z
leisure-sports_centre-sport-yoga # area z13- (also has icon z16-, caption(optional) z16-)
=== 190
amenity-courthouse # area z15- (also has icon z17-, caption(optional) z17-)
amenity-grave_yard # area z10- (also has icon z17-, caption(optional) z17-)
amenity-grave_yard-christian # area z10- (also has icon z17-, caption(optional) z17-)
landuse-cemetery # area z10- (also has icon z14-, caption(optional) z15-)
@@ -86,12 +85,9 @@ landuse-cemetery-christian # area z10- (also has icon z
=== 180
amenity-car_wash # area z15- (also has icon z17-, caption(optional) z17-)
amenity-charging_station-bicycle # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-carless # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-general # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-motorcar # area z15- (also has icon z14-, caption(optional) z14-)
amenity-charging_station-motorcycle # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-small # area z15- (also has icon z15-, caption(optional) z16-)
amenity-charging_station-motorcar-small # area z15- (also has icon z16-, caption(optional) z16-)
amenity-courthouse # area z15- (also has icon z17-, caption(optional) z17-)
amenity-fire_station # area z15- (also has icon z16-, caption(optional) z17-)
amenity-fuel # area z15- (also has icon z14-, caption(optional) z14-)
amenity-marketplace # area z15- (also has icon z16-, caption(optional) z16-)

View File

@@ -374,13 +374,13 @@ tourism-attraction # icon z14- (also has captio
tourism-gallery # icon z15- (also has caption(optional) z15-)
=== 4300
amenity-charging_station-small # icon z15- (also has caption(optional) z16-, area z15-)
=== 4280
amenity-charging_station-motorcar # icon z14- (also has caption(optional) z14-, area z15-)
amenity-fuel # icon z14- (also has caption(optional) z14-, area z15-)
=== 4270
amenity-charging_station-motorcar-small # icon z16- (also has caption(optional) z16-, area z15-)
=== 4260
highway-services # icon z14- (also has caption(optional) z14-, area z13-)
=== 4250
@@ -424,23 +424,13 @@ highway-rest_area # icon z14- (also has captio
tourism-camp_site # icon z13- (also has caption(optional) z13-, area z13-)
tourism-caravan_site # icon z13- (also has caption(optional) z13-)
tourism-chalet # icon z14- (also has caption(optional) z14-)
=== 3850
shop-car_repair-tyres # icon z15- (also has caption(optional) z15-)
=== 3800
amenity-charging_station-motorcycle # icon z16- (also has caption(optional) z16-, area z16-)
=== 3752
amenity-charging_station-bicycle # icon z16- (also has caption(optional) z16-, area z16-)
=== 3751
amenity-charging_station-general # icon z16- (also has caption(optional) z16-, area z16-)
amenity-charging_station # icon z16- (also has caption(optional) z16-)
amenity-charging_station-bicycle # icon z16- (also has caption(optional) z16-)
shop-car_repair-tyres # icon z15- (also has caption(optional) z15-)
=== 3750
amenity-charging_station-carless # icon z16- (also has caption(optional) z16-, area z16-)
=== 3749
railway-subway_entrance # icon z16- (also has caption(optional) z17-)
railway-subway_entrance-adana # icon z16- (also has caption(optional) z17-)
railway-subway_entrance-algiers # icon z16- (also has caption(optional) z17-)
@@ -1653,13 +1643,13 @@ leisure-swimming_pool-private # icon z17- (also has captio
# tourism-gallery # caption(optional) z15- (also has icon z15-)
# === -5700
# amenity-charging_station-small # caption(optional) z16- (also has icon z15-, area z15-)
# === -5720
# amenity-charging_station-motorcar # caption(optional) z14- (also has icon z14-, area z15-)
# amenity-fuel # caption(optional) z14- (also has icon z14-, area z15-)
# === -5730
# amenity-charging_station-motorcar-small # caption(optional) z16- (also has icon z16-, area z15-)
# === -5740
# highway-services # caption(optional) z14- (also has icon z14-, area z13-)
# === -5750
@@ -1703,23 +1693,13 @@ leisure-swimming_pool-private # icon z17- (also has captio
# tourism-camp_site # caption(optional) z13- (also has icon z13-, area z13-)
# tourism-caravan_site # caption(optional) z13- (also has icon z13-)
# tourism-chalet # caption(optional) z14- (also has icon z14-)
# === -6150
# shop-car_repair-tyres # caption(optional) z15- (also has icon z15-)
# === -6200
# amenity-charging_station-motorcycle # caption(optional) z16- (also has icon z16-, area z16-)
# === -6248
# amenity-charging_station-bicycle # caption(optional) z16- (also has icon z16-, area z16-)
# === -6249
# amenity-charging_station-general # caption(optional) z16- (also has icon z16-, area z16-)
# amenity-charging_station # caption(optional) z16- (also has icon z16-)
# amenity-charging_station-bicycle # caption(optional) z16- (also has icon z16-)
# shop-car_repair-tyres # caption(optional) z15- (also has icon z15-)
# === -6250
# amenity-charging_station-carless # caption(optional) z16- (also has icon z16-, area z16-)
# === -6251
# railway-subway_entrance # caption(optional) z17- (also has icon z16-)
# railway-subway_entrance-adana # caption(optional) z17- (also has icon z16-)
# railway-subway_entrance-algiers # caption(optional) z17- (also has icon z16-)

View File

@@ -349,9 +349,8 @@ area|z13-[highway=services],
area|z13-[highway=rest_area],
area|z13-[landuse=garages],
area|z15-[amenity=fuel],
area|z15-[amenity=charging_station][motorcar?],
area|z16-[amenity=charging_station],
area|z15-[amenity=fuel],
area|z17-[amenity=vehicle_inspection],
area|z17-[amenity=car_wash],
area|z17-[amenity=motorcycle_parking],

View File

@@ -626,28 +626,16 @@ node|z17[amenity=fuel],
node|z18-[amenity=fuel],
{icon-image: fuel-m.svg;font-size: 14.5;}
node|z15-[amenity=charging_station][motorcar?],
node|z16-[amenity=charging_station][motorcycle?],
node|z16-[amenity=charging_station][bicycle?],
node|z16-[amenity=charging_station][motorcar=not],
node|z14-[amenity=charging_station][motorcar?][!capacity],
node|z14-[amenity=charging_station][motorcar?][capacity=1],
node|z14-[amenity=charging_station][motorcar?][capacity=2],
node|z16-[amenity=charging_station],
{icon-image: charging_station-small-m.svg;}
{icon-image: charging-point-m.svg;}
node|z14-[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging-station-m.svg;}
node|z14[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging_station-s.svg;}
node|z15-[amenity=charging_station][motorcar?][capacity?],
{icon-image: charging_station-m.svg;}
node|z14[amenity=charging_station][motorcar?][!capacity],
node|z14[amenity=charging_station][motorcar?][capacity=1],
node|z14[amenity=charging_station][motorcar?][capacity=2],
{icon-image: none;}
node|z15-[amenity=charging_station][motorcar?][!capacity],
node|z15-[amenity=charging_station][motorcar?][capacity=1],
node|z15-[amenity=charging_station][motorcar?][capacity=2],
{icon-image: charging_station-small-m.svg;}
node|z14[amenity=charging_station][motorcar?],
{text-offset: 1;font-size: 12.25;icon-min-distance: 20;}
node|z15[amenity=charging_station][motorcar?],
{icon-min-distance: 20;font-size: 12.5;}

View File

@@ -33,12 +33,8 @@ amenity-parking-street_side-private # area z15- (also has icon z
=== 160
amenity-car_wash # area z17- (also has icon z17-, caption(optional) z17-)
amenity-charging_station-bicycle # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-carless # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-general # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-motorcar # area z15- (also has icon z14-, caption(optional) z14-)
amenity-charging_station-motorcycle # area z16- (also has icon z16-, caption(optional) z16-)
amenity-charging_station-small # area z15- (also has icon z15-, caption(optional) z16-)
amenity-charging_station-motorcar-small # area z15- (also has icon z16-, caption(optional) z16-)
amenity-fuel # area z15- (also has icon z12-, caption(optional) z12-)
amenity-vehicle_inspection # area z17- (also has icon z17-)
highway-rest_area # area z13- (also has icon z14-, caption(optional) z14-)

View File

@@ -170,28 +170,17 @@ aeroway-aerodrome-international # icon z7- (also has caption
place-town # caption z8-
=== 3250
amenity-charging_station-small # icon z15- (also has caption(optional) z16-, area z15-)
=== 3210
amenity-charging_station-motorcar # icon z14- (also has caption(optional) z14-, area z15-)
amenity-fuel # icon z12- (also has caption(optional) z12-, area z15-)
=== 3200
amenity-charging_station-motorcar-small # icon z16- (also has caption(optional) z16-, area z15-)
=== 3190
amenity-charging_station # icon z16- (also has caption(optional) z16-)
amenity-vending_machine-fuel # icon z17- (also has caption(optional) z17-)
=== 3153
amenity-charging_station-motorcycle # icon z16- (also has caption(optional) z16-, area z16-)
=== 3152
amenity-charging_station-bicycle # icon z16- (also has caption(optional) z16-, area z16-)
=== 3151
amenity-charging_station-general # icon z16- (also has caption(optional) z16-, area z16-)
=== 3150
amenity-charging_station-carless # icon z16- (also has caption(optional) z16-, area z16-)
=== 3149
railway-station-subway-moscow # icon z11-15 (also has caption(optional) z15)
railway-station-subway-spb # icon z11-16 (also has caption(optional) z15-16)
=== 3100
@@ -539,6 +528,9 @@ natural-beach-gravel # caption z15- (also has are
natural-beach-sand # caption z15- (also has area z10-)
=== 900
amenity-charging_station-bicycle # icon z16- (also has caption(optional) z16-)
=== 850
historic-boundary_stone # icon z16- (also has caption(optional) z16-)
historic-gallows # icon z16- (also has caption(optional) z16-)
historic-pillory # icon z16- (also has caption(optional) z16-)
@@ -792,28 +784,17 @@ entrance-emergency # icon z19- (also has captio
# aeroway-aerodrome-international # caption(optional) z10- (also has icon z7-, area z10-)
# === -6700
# amenity-charging_station-small # caption(optional) z16- (also has icon z15-, area z15-)
# === -6790
# amenity-charging_station-motorcar # caption(optional) z14- (also has icon z14-, area z15-)
# amenity-fuel # caption(optional) z12- (also has icon z12-, area z15-)
# === -6800
# amenity-charging_station-motorcar-small # caption(optional) z16- (also has icon z16-, area z15-)
# === -6810
# amenity-charging_station # caption(optional) z16- (also has icon z16-)
# amenity-vending_machine-fuel # caption(optional) z17- (also has icon z17-)
# === -6847
# amenity-charging_station-motorcycle # caption(optional) z16- (also has icon z16-, area z16-)
# === -6848
# amenity-charging_station-bicycle # caption(optional) z16- (also has icon z16-, area z16-)
# === -6849
# amenity-charging_station-general # caption(optional) z16- (also has icon z16-, area z16-)
# === -6850
# amenity-charging_station-carless # caption(optional) z16- (also has icon z16-, area z16-)
# === -6851
# railway-station-subway-moscow # caption(optional) z15 (also has icon z11-15)
# railway-station-subway-spb # caption(optional) z15-16 (also has icon z11-16)
# === -6900
@@ -1075,6 +1056,9 @@ entrance-emergency # icon z19- (also has captio
# amenity-hospital # caption(optional) z15- (also has icon z15-)
# === -9000
# amenity-charging_station-bicycle # caption(optional) z16- (also has icon z16-)
# === -9150
# historic-boundary_stone # caption(optional) z16- (also has icon z16-)
# historic-gallows # caption(optional) z16- (also has icon z16-)
# historic-pillory # caption(optional) z16- (also has icon z16-)

View File

@@ -1,7 +1,7 @@
{
"data_format": 1,
"data_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/taginfo.json",
"data_updated": "20251120T121118Z",
"data_updated": "20251228T203737Z",
"project": {
"name": "CoMaps",
"description": "CoMaps is a community-focused privacy navigation iOS & Android app for travelers - drivers, hikers, and cyclists.",
@@ -176,7 +176,7 @@
"description": "amenity=car_pooling",
"key": "amenity",
"value": "car_pooling",
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/parking-pooling-m.svg"
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/parking_pooling-m.svg"
},
{
"description": "amenity=car_rental",
@@ -431,6 +431,12 @@
"value": "hunting_stand",
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/hunting-tower-m.svg"
},
{
"description": "amenity=hydrant",
"key": "amenity",
"value": "hydrant",
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/hydrant-m.svg"
},
{
"description": "amenity=ice_cream",
"key": "amenity",

View File

@@ -239,7 +239,7 @@ final class CarPlayService: NSObject {
MapTemplateBuilder.configureBaseUI(mapTemplate: mapTemplate)
if currentPositionMode == .pendingPosition {
mapTemplate.leadingNavigationBarButtons = []
} else if currentPositionMode == .follow || currentPositionMode == .followAndRotate {
} else if currentPositionMode == .follow || currentPositionMode == .followAndRotateCompass || currentPositionMode == .followAndRotateRoute {
MapTemplateBuilder.setupDestinationButton(mapTemplate: mapTemplate)
} else {
MapTemplateBuilder.setupRecenterButton(mapTemplate: mapTemplate)
@@ -623,22 +623,32 @@ extension CarPlayService: CarPlayRouterListener {
extension CarPlayService: LocationModeListener {
func processMyPositionStateModeEvent(_ mode: MWMMyPositionMode) {
currentPositionMode = mode
guard let rootMapTemplate = rootMapTemplate,
let info = rootMapTemplate.userInfo as? MapInfo,
info.type == CPConstants.TemplateType.main else {
// make sure we have a rootMapTemplate
guard let rootMapTemplate = rootMapTemplate else {
return
}
// exit if we're navigating
guard let info = rootMapTemplate.userInfo as? MapInfo,
info.type == CPConstants.TemplateType.main else {
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
return
}
switch mode {
case .follow, .followAndRotate:
case .follow, .followAndRotateCompass, .followAndRotateRoute:
if !rootMapTemplate.isPanningInterfaceVisible {
MapTemplateBuilder.setupDestinationButton(mapTemplate: rootMapTemplate)
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
}
case .notFollow:
if !rootMapTemplate.isPanningInterfaceVisible {
MapTemplateBuilder.setupRecenterButton(mapTemplate: rootMapTemplate)
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
}
case .pendingPosition, .notFollowNoPosition:
rootMapTemplate.leadingNavigationBarButtons = []
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
}
}
}

View File

@@ -5,6 +5,7 @@ final class MapTemplateBuilder {
case startPanning
case zoomIn
case zoomOut
case myPositionMode
}
enum BarButtonType {
case dismissPaning
@@ -28,7 +29,7 @@ final class MapTemplateBuilder {
configureBaseUI(mapTemplate: mapTemplate)
if positionMode == .pendingPosition {
mapTemplate.leadingNavigationBarButtons = []
} else if positionMode == .follow || positionMode == .followAndRotate {
} else if positionMode == .follow || positionMode == .followAndRotateCompass || positionMode == .followAndRotateRoute {
setupDestinationButton(mapTemplate: mapTemplate)
} else {
setupRecenterButton(mapTemplate: mapTemplate)
@@ -69,7 +70,10 @@ final class MapTemplateBuilder {
let zoomOutButton = buildMapButton(type: .zoomOut) { _ in
FrameworkHelper.zoomMap(.out)
}
mapTemplate.mapButtons = [panningButton, zoomInButton, zoomOutButton]
let myPositionModeButton = buildMapButton(type: .myPositionMode) { _ in
FrameworkHelper.switchMyPositionMode()
}
mapTemplate.mapButtons = [myPositionModeButton, panningButton, zoomInButton, zoomOutButton]
let settingsButton = buildBarButton(type: .settings) { _ in
let gridTemplate = SettingsTemplateBuilder.buildGridTemplate()
@@ -99,7 +103,10 @@ final class MapTemplateBuilder {
let panningButton = buildMapButton(type: .startPanning) { _ in
mapTemplate.showPanningInterface(animated: true)
}
mapTemplate.mapButtons = [panningButton]
let myPositionModeButton = buildMapButton(type: .myPositionMode) { _ in
FrameworkHelper.switchMyPositionMode()
}
mapTemplate.mapButtons = [myPositionModeButton, panningButton]
setupMuteAndRedirectButtons(template: mapTemplate)
let endButton = buildBarButton(type: .endRoute) { _ in
CarPlayService.shared.cancelCurrentTrip()
@@ -117,6 +124,28 @@ final class MapTemplateBuilder {
mapTemplate.leadingNavigationBarButtons = [destinationButton]
}
class func updateMyPositionModeButton(mapTemplate: CPMapTemplate, newMode: MWMMyPositionMode) {
let button = CPMapButton(handler: { _ in
FrameworkHelper.switchMyPositionMode()
})
switch newMode {
case .pendingPosition:
button.image = UIImage(systemName: "location.fill")
case .notFollowNoPosition:
button.image = UIImage(systemName: "location")
case .notFollow:
button.image = UIImage(systemName: "location")
case .follow:
button.image = UIImage(systemName: "location.fill")
case .followAndRotate:
button.image = UIImage(systemName: "location.north.line.fill")
}
if mapTemplate.mapButtons.count > 0 {
mapTemplate.mapButtons[0] = button
}
}
class func setupRecenterButton(mapTemplate: CPMapTemplate) {
let recenterButton = buildBarButton(type: .recenter) { _ in
FrameworkHelper.switchMyPositionMode()
@@ -166,6 +195,8 @@ final class MapTemplateBuilder {
button.image = UIImage(systemName: "plus")
case .zoomOut:
button.image = UIImage(systemName: "minus")
case .myPositionMode:
button.image = UIImage(systemName: "location")
}
// Remove code below once Apple has fixed its issue with the button background
if #unavailable(iOS 26) {
@@ -176,6 +207,8 @@ final class MapTemplateBuilder {
button.focusedImage = UIImage(systemName: "plus.circle.fill")
case .zoomOut:
button.focusedImage = UIImage(systemName: "minus.circle.fill")
case .myPositionMode:
button.image = UIImage(systemName: "location.fill")
}
}
return button

View File

@@ -91,7 +91,8 @@ NSString * const kUDDidShowLongTapToShowSideButtonsToast = @"kUDDidShowLongTapTo
case MWMMyPositionModeNotFollow:
case MWMMyPositionModeNotFollowNoPosition: [locBtn setStyleNameAndApply: @"ButtonGetPosition"]; break;
case MWMMyPositionModeFollow: [locBtn setStyleNameAndApply: @"ButtonFollow"]; break;
case MWMMyPositionModeFollowAndRotate: [locBtn setStyleNameAndApply: @"ButtonFollowAndRotate"]; break;
case MWMMyPositionModeFollowAndRotateCompass: [locBtn setStyleNameAndApply: @"ButtonFollowAndRotateCompass"]; break;
case MWMMyPositionModeFollowAndRotateRoute: [locBtn setStyleNameAndApply: @"ButtonFollowAndRotateRoute"]; break;
}
}

View File

@@ -632,7 +632,8 @@ NSString *const kAboutSegue = @"Map2About";
case MWMMyPositionModeNotFollow:
break;
case MWMMyPositionModeFollow:
case MWMMyPositionModeFollowAndRotate:
case MWMMyPositionModeFollowAndRotateCompass:
case MWMMyPositionModeFollowAndRotateRoute:
self.disableStandbyOnLocationStateMode = YES;
break;
}

View File

@@ -32,7 +32,8 @@ static inline MWMMyPositionMode mwmMyPositionMode(location::EMyPositionMode mode
case location::EMyPositionMode::NotFollowNoPosition: return MWMMyPositionModeNotFollowNoPosition;
case location::EMyPositionMode::NotFollow: return MWMMyPositionModeNotFollow;
case location::EMyPositionMode::Follow: return MWMMyPositionModeFollow;
case location::EMyPositionMode::FollowAndRotate: return MWMMyPositionModeFollowAndRotate;
case location::EMyPositionMode::FollowAndRotateCompass: return MWMMyPositionModeFollowAndRotateCompass;
case location::EMyPositionMode::FollowAndRotateRoute: return MWMMyPositionModeFollowAndRotateRoute;
}
}
} // namespace location_helpers

View File

@@ -50,7 +50,8 @@ std::string DebugPrint(MWMMyPositionMode mode) {
case MWMMyPositionModeNotFollowNoPosition: return "MWMMyPositionModeNotFollowNoPosition";
case MWMMyPositionModeNotFollow: return "MWMMyPositionModeNotFollow";
case MWMMyPositionModeFollow: return "MWMMyPositionModeFollow";
case MWMMyPositionModeFollowAndRotate: return "MWMMyPositionModeFollowAndRotate";
case MWMMyPositionModeFollowAndRotateCompass: return "MWMMyPositionModeFollowAndRotateCompass";
case MWMMyPositionModeFollowAndRotateRoute: return "MWMMyPositionModeFollowAndRotateRoute";
}
CHECK(false, ("Unsupported value", static_cast<int>(mode)));
}
@@ -367,7 +368,8 @@ void setShowLocationAlert(BOOL needShow) {
case MWMMyPositionModeNotFollowNoPosition:
case MWMMyPositionModeNotFollow: manager.geoMode = GeoMode::NotInPosition; break;
case MWMMyPositionModeFollow: manager.geoMode = GeoMode::InPosition; break;
case MWMMyPositionModeFollowAndRotate: manager.geoMode = GeoMode::FollowAndRotate; break;
case MWMMyPositionModeFollowAndRotateCompass:
case MWMMyPositionModeFollowAndRotateRoute: manager.geoMode = GeoMode::FollowAndRotate; break;
}
}
}

View File

@@ -30,7 +30,7 @@ NSUInteger constexpr kMaxPredictionCount = 20;
- (void)setMyPositionMode:(MWMMyPositionMode)mode
{
self.isLastPositionModeValid = (mode == MWMMyPositionModeFollowAndRotate);
self.isLastPositionModeValid = (mode == MWMMyPositionModeFollowAndRotateCompass);
[self restart];
}

View File

@@ -3,5 +3,6 @@ typedef NS_CLOSED_ENUM(NSUInteger, MWMMyPositionMode) {
MWMMyPositionModeNotFollowNoPosition,
MWMMyPositionModeNotFollow,
MWMMyPositionModeFollow,
MWMMyPositionModeFollowAndRotate
MWMMyPositionModeFollowAndRotateCompass,
MWMMyPositionModeFollowAndRotateRoute
};

View File

@@ -41,13 +41,14 @@ final class ThemeManager: NSObject {
}
}(actualTheme)
if Settings.mapAppearance == .light {
let isCarPlayActive = CarPlayService.shared.isCarplayActivated
if !isCarPlayActive, Settings.mapAppearance == .light {
if actualTheme == .vehicleDay || actualTheme == .vehicleNight {
FrameworkHelper.setTheme(.vehicleDay)
} else {
FrameworkHelper.setTheme(.day)
}
} else if Settings.mapAppearance == .dark {
} else if !isCarPlayActive, Settings.mapAppearance == .dark {
if actualTheme == .vehicleDay || actualTheme == .vehicleNight {
FrameworkHelper.setTheme(.vehicleNight)
} else {

View File

@@ -7,7 +7,8 @@ enum MapStyleSheet: String, CaseIterable {
case mapButtonPending = "ButtonPending"
case mapButtonGetPosition = "ButtonGetPosition"
case mapButtonFollow = "ButtonFollow"
case mapButtonFollowAndRotate = "ButtonFollowAndRotate"
case mapButtonFollowAndRotateCompass = "ButtonFollowAndRotateCompass"
case mapButtonFollowAndRotateRoute = "ButtonFollowAndRotateRoute"
case mapButtonMapBookmarks = "ButtonMapBookmarks"
case mapPromoDiscoveryButton = "PromoDiscroveryButton"
case mapButtonBookmarksBack = "ButtonBookmarksBack"
@@ -67,10 +68,14 @@ extension MapStyleSheet: IStyleSheet {
return .add { s in
s.mwmImage = "btn_follow"
}
case .mapButtonFollowAndRotate:
case .mapButtonFollowAndRotateCompass:
return .add { s in
s.mwmImage = "btn_follow_and_rotate"
}
case .mapButtonFollowAndRotateRoute:
return .add { s in
s.mwmImage = "btn_follow_route"
}
case .mapButtonMapBookmarks:
return .add { s in
s.mwmImage = "ic_routing_bookmark"

View File

@@ -1,6 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "btn_follow_route_dark.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "btn_follow_route_highlighted_dark.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "btn_follow_route_highlighted_light.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "btn_follow_route_light.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -42,11 +42,10 @@
"type.amenity.gambling" = "Glücksspiel";
"type.leisure.adult_gaming_centre" = "Spielhalle für Erwachsene";
"type.leisure.amusement_arcade" = "Spielhalle für Unterhaltungsspiele";
"type.amenity.charging_station.general" = "Ladestation";
"type.amenity.charging_station.motorcar" = "Autos";
"type.amenity.charging_station.motorcycle" = "Motorräder";
"type.amenity.charging_station.bicycle" = "Fahrräder";
"type.amenity.charging_station.small" = "Begrenzte Kapazität";
"type.amenity.charging_station" = "Ladestation";
"type.amenity.charging_station.bicycle" = "Fahrrad-Ladestation";
"type.amenity.charging_station.motorcar" = "Kfz-Ladestation";
"type.amenity.charging_station.motorcar.small" = "Kfz-Ladestation";
"type.amenity.childcare" = "Kindertagesstätte";
"type.amenity.cinema" = "Kino";
"type.leisure.bowling_alley" = "Bowlingbahn";

View File

@@ -47,11 +47,10 @@
"type.amenity.gambling" = "Gambling";
"type.leisure.adult_gaming_centre" = "Adult Gaming Centre";
"type.leisure.amusement_arcade" = "Arcade";
"type.amenity.charging_station.general" = "Charging Station";
"type.amenity.charging_station.motorcar" = "Cars";
"type.amenity.charging_station.motorcycle" = "Motorcycles";
"type.amenity.charging_station.bicycle" = "Bicycles";
"type.amenity.charging_station.small" = "Limited Capacity";
"type.amenity.charging_station" = "Charging Station";
"type.amenity.charging_station.bicycle" = "Bicycle Charging Station";
"type.amenity.charging_station.motorcar" = "Car Charging Station";
"type.amenity.charging_station.motorcar.small" = "Car Charging Point";
"type.amenity.childcare" = "Nursery";
"type.amenity.cinema" = "Cinema";
"type.leisure.bowling_alley" = "Bowling Alley";

View File

@@ -54,11 +54,10 @@
"type.amenity.studio" = "Media Studio";
"type.leisure.adult_gaming_centre" = "Adult Gaming Centre";
"type.leisure.amusement_arcade" = "Arcade";
"type.amenity.charging_station.general" = "Charging Station";
"type.amenity.charging_station.motorcar" = "Cars";
"type.amenity.charging_station.motorcycle" = "Motorcycles";
"type.amenity.charging_station.bicycle" = "Bicycles";
"type.amenity.charging_station.small" = "Limited Capacity";
"type.amenity.charging_station" = "Charging Station";
"type.amenity.charging_station.bicycle" = "Bicycle Charging Station";
"type.amenity.charging_station.motorcar" = "Car Charging Station";
"type.amenity.charging_station.motorcar.small" = "Car Charging Point";
"type.amenity.childcare" = "Nursery";
"type.amenity.cinema" = "Cinema";
"type.leisure.bowling_alley" = "Bowling Alley";

View File

@@ -186,7 +186,7 @@ import AVFoundation
return mapAppearance
}
return .auto
return .light
}
set {
UserDefaults.standard.set(newValue.rawValue, forKey: userDefaultsKeyMapAppearance)

View File

@@ -9,6 +9,7 @@
#include "drape/support_manager.hpp"
#include "platform/settings.hpp"
#include "routing/base/followed_polyline.hpp"
#include <unordered_map>
@@ -40,7 +41,7 @@ DrapeEngine::DrapeEngine(Params && params)
using namespace location;
EMyPositionMode mode = PendingPosition;
if (settings::Get(kLocationStateMode, mode) && mode == FollowAndRotate)
if (settings::Get(kLocationStateMode, mode) && mode == FollowAndRotateCompass)
{
// If the screen rect setting in follow and rotate mode is missing or invalid, it could cause
// invalid animations, so the follow and rotate mode should be discarded.
@@ -441,13 +442,12 @@ void DrapeEngine::SetCompassInfo(location::CompassInfo const & info)
MessagePriority::Normal);
}
void DrapeEngine::SetGpsInfo(location::GpsInfo const & info, bool isNavigable, double distToNextTurn, double speedLimit,
void DrapeEngine::SetGpsInfo(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
location::RouteMatchingInfo const & routeInfo)
{
m_threadCommutator->PostMessage(
ThreadsCommutator::RenderThread,
make_unique_dp<GpsInfoMessage>(info, isNavigable, distToNextTurn, speedLimit, routeInfo),
MessagePriority::Normal);
m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread,
make_unique_dp<GpsInfoMessage>(info, navigationContext, routeInfo),
MessagePriority::Normal);
}
void DrapeEngine::SwitchMyPositionNextMode()
@@ -474,12 +474,13 @@ void DrapeEngine::StopLocationFollow()
MessagePriority::Normal);
}
void DrapeEngine::FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued)
void DrapeEngine::FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued,
bool allowRouteRotation)
{
m_threadCommutator->PostMessage(
ThreadsCommutator::RenderThread,
make_unique_dp<FollowRouteMessage>(preferredZoomLevel, preferredZoomLevel3d, enableAutoZoom, isArrowGlued),
MessagePriority::Normal);
m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread,
make_unique_dp<FollowRouteMessage>(preferredZoomLevel, preferredZoomLevel3d,
enableAutoZoom, isArrowGlued, allowRouteRotation),
MessagePriority::Normal);
}
void DrapeEngine::SetModelViewListener(ModelViewChangedHandler && fn)

View File

@@ -1,5 +1,7 @@
#pragma once
#include "drape_frontend/my_position_controller.hpp"
#include "routing/base/followed_polyline.hpp"
#include "traffic/traffic_info.hpp"
#include "drape_frontend/backend_renderer.hpp"
@@ -154,7 +156,7 @@ public:
void UpdateMapStyle();
void SetCompassInfo(location::CompassInfo const & info);
void SetGpsInfo(location::GpsInfo const & info, bool isNavigable, double distToNextTurn, double speedLimit,
void SetGpsInfo(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
location::RouteMatchingInfo const & routeInfo);
void SwitchMyPositionNextMode();
void LoseLocation();
@@ -171,7 +173,8 @@ public:
dp::DrapeID AddSubroute(SubrouteConstPtr subroute);
void RemoveSubroute(dp::DrapeID subrouteId, bool deactivateFollowing);
void FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued);
void FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued,
bool allowRouteRotation);
void DeactivateRouteFollowing();
void SetSubrouteVisibility(dp::DrapeID subrouteId, bool isVisible);
dp::DrapeID AddRoutePreviewSegment(m2::PointD const & startPt, m2::PointD const & finishPt);

View File

@@ -438,8 +438,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
break;
#endif
ref_ptr<GpsInfoMessage> msg = message;
m_myPositionController->OnLocationUpdate(msg->GetInfo(), msg->IsNavigable(), msg->GetDistanceToNextTurn(),
msg->GetSpeedLimit(), m_userEventStream.GetCurrentScreen());
m_myPositionController->OnLocationUpdate(msg->GetInfo(), msg->GetNavigationContext(),
m_userEventStream.GetCurrentScreen());
location::RouteMatchingInfo const & info = msg->GetRouteInfo();
if (info.HasDistanceFromBegin())
@@ -512,7 +512,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
if (m_pendingFollowRoute != nullptr)
{
FollowRoute(m_pendingFollowRoute->m_preferredZoomLevel, m_pendingFollowRoute->m_preferredZoomLevelIn3d,
m_pendingFollowRoute->m_enableAutoZoom, m_pendingFollowRoute->m_isArrowGlued);
m_pendingFollowRoute->m_enableAutoZoom, m_pendingFollowRoute->m_isArrowGlued,
m_pendingFollowRoute->m_allowRouteRotation);
m_pendingFollowRoute.reset();
}
break;
@@ -584,13 +585,14 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
// receive FollowRoute message before FlushSubroute message, so we need to postpone its processing.
if (m_routeRenderer->GetSubroutes().empty())
{
m_pendingFollowRoute = std::make_unique<FollowRouteData>(
msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(), msg->EnableAutoZoom(), msg->IsArrowGlued());
m_pendingFollowRoute =
std::make_unique<FollowRouteData>(msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(),
msg->EnableAutoZoom(), msg->IsArrowGlued(), msg->AllowRouteRotation());
}
else
{
FollowRoute(msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(), msg->EnableAutoZoom(),
msg->IsArrowGlued());
msg->IsArrowGlued(), msg->AllowRouteRotation());
}
break;
}
@@ -1057,10 +1059,11 @@ void FrontendRenderer::UpdateContextDependentResources()
}
void FrontendRenderer::FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom,
bool isArrowGlued)
bool isArrowGlued, bool allowRouteRotation)
{
m_myPositionController->ActivateRouting(
!m_enablePerspectiveInNavigation ? preferredZoomLevel : preferredZoomLevelIn3d, enableAutoZoom, isArrowGlued);
!m_enablePerspectiveInNavigation ? preferredZoomLevel : preferredZoomLevelIn3d, enableAutoZoom, isArrowGlued,
allowRouteRotation);
if (m_enablePerspectiveInNavigation)
AddUserEvent(make_unique_dp<SetAutoPerspectiveEvent>(true /* isAutoPerspective */));

View File

@@ -261,7 +261,8 @@ private:
using TRenderGroupRemovePredicate = std::function<bool(drape_ptr<RenderGroup> const &)>;
void RemoveRenderGroupsLater(TRenderGroupRemovePredicate const & predicate);
void FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued);
void FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued,
bool allowRouteRotation);
bool CheckRouteRecaching(ref_ptr<BaseSubrouteData> subrouteData);
@@ -372,17 +373,20 @@ private:
struct FollowRouteData
{
FollowRouteData(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued)
FollowRouteData(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued,
bool allowRouteRotation)
: m_preferredZoomLevel(preferredZoomLevel)
, m_preferredZoomLevelIn3d(preferredZoomLevelIn3d)
, m_enableAutoZoom(enableAutoZoom)
, m_isArrowGlued(isArrowGlued)
, m_allowRouteRotation(allowRouteRotation)
{}
int m_preferredZoomLevel;
int m_preferredZoomLevelIn3d;
bool m_enableAutoZoom;
bool m_isArrowGlued;
bool m_allowRouteRotation;
};
std::unique_ptr<FollowRouteData> m_pendingFollowRoute;

View File

@@ -10,6 +10,7 @@
#include "drape_frontend/gui/skin.hpp"
#include "drape_frontend/message.hpp"
#include "drape_frontend/my_position.hpp"
#include "drape_frontend/my_position_controller.hpp"
#include "drape_frontend/overlay_batcher.hpp"
#include "drape_frontend/postprocess_renderer.hpp"
#include "drape_frontend/render_node.hpp"
@@ -29,6 +30,7 @@
#include "geometry/rect2d.hpp"
#include "geometry/triangle2d.hpp"
#include "routing/base/followed_polyline.hpp"
#include <condition_variable>
#include <functional>
@@ -475,28 +477,22 @@ private:
class GpsInfoMessage : public Message
{
public:
GpsInfoMessage(location::GpsInfo const & info, bool isNavigable, double distToNextTurn, double speedLimit,
GpsInfoMessage(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
location::RouteMatchingInfo const & routeInfo)
: m_info(info)
, m_isNavigable(isNavigable)
, m_distToNextTurn(distToNextTurn)
, m_speedLimit(speedLimit)
, m_navigationContext(navigationContext)
, m_routeInfo(routeInfo)
{}
Type GetType() const override { return Type::GpsInfo; }
location::GpsInfo const & GetInfo() const { return m_info; }
bool IsNavigable() const { return m_isNavigable; }
double const & GetSpeedLimit() const { return m_speedLimit; }
double const & GetDistanceToNextTurn() const { return m_distToNextTurn; }
df::NavigationContext const & GetNavigationContext() const { return m_navigationContext; }
location::RouteMatchingInfo const & GetRouteInfo() const { return m_routeInfo; }
private:
location::GpsInfo const m_info;
bool const m_isNavigable;
double const m_distToNextTurn;
double const m_speedLimit;
df::NavigationContext const m_navigationContext;
location::RouteMatchingInfo const m_routeInfo;
};
@@ -740,11 +736,13 @@ public:
class FollowRouteMessage : public Message
{
public:
FollowRouteMessage(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued)
FollowRouteMessage(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued,
bool allowRouteRotation)
: m_preferredZoomLevel(preferredZoomLevel)
, m_preferredZoomLevelIn3d(preferredZoomLevelIn3d)
, m_enableAutoZoom(enableAutoZoom)
, m_isArrowGlued(isArrowGlued)
, m_allowRouteRotation(allowRouteRotation)
{}
Type GetType() const override { return Type::FollowRoute; }
@@ -753,12 +751,14 @@ public:
int GetPreferredZoomLevelIn3d() const { return m_preferredZoomLevelIn3d; }
bool EnableAutoZoom() const { return m_enableAutoZoom; }
bool IsArrowGlued() const { return m_isArrowGlued; }
bool AllowRouteRotation() const { return m_allowRouteRotation; }
private:
int const m_preferredZoomLevel;
int const m_preferredZoomLevelIn3d;
bool const m_enableAutoZoom;
bool const m_isArrowGlued;
bool const m_allowRouteRotation;
};
class SwitchMapStyleMessage : public BaseBlockingMessage

View File

@@ -9,9 +9,11 @@
#include "geometry/mercator.hpp"
#include "platform/location.hpp"
#include "platform/measurement_utils.hpp"
#include "base/math.hpp"
#include "routing/base/followed_polyline.hpp"
#include <algorithm>
#include <array>
@@ -31,6 +33,9 @@ double constexpr kMaxTimeInBackgroundSec = 60.0 * 60 * 30; // 30 hours before s
double constexpr kMaxNotFollowRoutingTimeSec = 20.0;
double constexpr kMaxUpdateLocationInvervalSec = 30.0;
double constexpr kMaxBlockAutoZoomTimeSec = 10.0;
double constexpr kDefaultSpeedLimitKmpH = 50.0;
double constexpr kLookaheadTimeSpeedRatio = 0.3;
double constexpr kMaxLookaheadTimeSec = 25.0;
int constexpr kZoomThreshold = 10;
int constexpr kMaxScaleZoomLevel = 16;
@@ -66,7 +71,6 @@ double CalculateZoomByMaxSpeed(double speedMpS, bool isPerspectiveAllowed)
std::array<TSpeedScale, 2> const & scales = isPerspectiveAllowed ? scales3d : scales2d;
double constexpr kDefaultSpeedLimitKmpH = 50.0;
double const speedKmpH = speedMpS > 0 ? measurement_utils::MpsToKmph(speedMpS) : kDefaultSpeedLimitKmpH;
size_t i = 0;
@@ -143,7 +147,7 @@ void ResetNotification(uint64_t & notifyId)
bool IsModeChangeViewport(location::EMyPositionMode mode)
{
return mode == location::Follow || mode == location::FollowAndRotate;
return mode == location::Follow || mode == location::FollowAndRotateCompass || mode == location::FollowAndRotateRoute;
}
} // namespace
@@ -157,9 +161,11 @@ MyPositionController::MyPositionController(Params && params, ref_ptr<DrapeNotifi
, m_errorRadius(0.0)
, m_horizontalAccuracy(0.0)
, m_position(m2::PointD::Zero())
, m_drawDirection(0.0)
, m_direction(0.0)
, m_routeDirection(0.0)
, m_arrowDirection(0.0)
, m_oldPosition(m2::PointD::Zero())
, m_oldDrawDirection(0.0)
, m_oldArrowDirection(0.0)
, m_enablePerspectiveInRouting(false)
, m_enableAutoZoomInRouting(params.m_isAutozoomEnabled)
, m_autoScale2d(GetScreenScale(kDefaultAutoZoom))
@@ -171,7 +177,8 @@ MyPositionController::MyPositionController(Params && params, ref_ptr<DrapeNotifi
, m_isDirtyAutoZoom(false)
, m_isPendingAnimation(false)
, m_isPositionAssigned(false)
, m_isDirectionAssigned(false)
, m_isArrowDirectionAssigned(false)
, m_isRouteDirectionAssigned(false)
, m_isCompassAvailable(false)
, m_positionIsObsolete(false)
, m_needBlockAutoZoom(false)
@@ -290,7 +297,7 @@ void MyPositionController::ScaleEnded()
void MyPositionController::Rotated()
{
if (m_mode == location::FollowAndRotate)
if (m_mode == location::FollowAndRotateCompass)
m_wasRotationInScaling = true;
}
@@ -398,25 +405,32 @@ void MyPositionController::NextMode(ScreenBase const & screen)
// In routing not-follow -> follow-and-rotate, otherwise not-follow -> follow.
if (m_mode == location::NotFollow)
{
ChangeMode(m_isInRouting ? location::FollowAndRotate : location::Follow);
ChangeMode(m_isInRouting ? location::FollowAndRotateCompass : location::Follow);
UpdateViewport(preferredZoomLevel);
return;
}
// From follow mode we transit to follow-and-rotate if compass is available or
// routing is enabled.
// From follow mode we transit to follow-and-rotate-compass, if in routing
if (m_mode == location::Follow)
{
if (IsRotationAvailable() || m_isInRouting)
if (IsArrowRotationAvailable() || m_isInRouting)
{
ChangeMode(location::FollowAndRotate);
ChangeMode(location::FollowAndRotateCompass);
UpdateViewport(preferredZoomLevel);
}
return;
}
// From follow-and-rotate mode we can transit to follow mode.
if (m_mode == location::FollowAndRotate)
// From -rotate-compass mode we transit to -rotate-route mode, if allowed
if (m_mode == location::FollowAndRotateCompass && IsRouteRotationAvailable() && m_allowRouteRotationInRouting)
{
ChangeMode(location::FollowAndRotateRoute);
UpdateViewport(preferredZoomLevel);
return;
}
// From -rotate-route mode, or from -rotate-compass if -rotate-route is not allowed, we return to follow mode
if (m_mode == location::FollowAndRotateRoute || m_mode == location::FollowAndRotateCompass)
{
if (m_isInRouting && screen.isPerspective())
preferredZoomLevel = static_cast<int>(GetZoomLevel(ScreenBase::GetStartPerspectiveScale() * 1.1));
@@ -425,8 +439,8 @@ void MyPositionController::NextMode(ScreenBase const & screen)
}
}
void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, double distanceToNextTurn,
double speedLimit, ScreenBase const & screen)
void MyPositionController::OnLocationUpdate(location::GpsInfo const & info,
df::NavigationContext const & navigationContext, ScreenBase const & screen)
{
m2::PointD const oldPos = GetDrawablePosition();
double const oldAzimut = GetDrawableAzimut();
@@ -438,33 +452,62 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool
m_errorRadius = rect.SizeX() * 0.5;
m_horizontalAccuracy = info.m_horizontalAccuracy;
if (distanceToNextTurn >= 0.0 || speedLimit >= 0.0)
if (navigationContext.m_distanceToNextTurn >= 0.0 || navigationContext.m_speedLimit >= 0.0)
{
double const mercatorPerMeter = m_errorRadius / info.m_horizontalAccuracy;
m_autoScale2d =
mercatorPerMeter * CalculateAutoZoom(speedLimit, distanceToNextTurn, false /* isPerspectiveAllowed */);
mercatorPerMeter * CalculateAutoZoom(navigationContext.m_speedLimit, navigationContext.m_distanceToNextTurn,
false /* isPerspectiveAllowed */);
m_autoScale3d =
mercatorPerMeter * CalculateAutoZoom(speedLimit, distanceToNextTurn, true /* isPerspectiveAllowed */);
mercatorPerMeter * CalculateAutoZoom(navigationContext.m_speedLimit, navigationContext.m_distanceToNextTurn,
true /* isPerspectiveAllowed */);
}
else
{
m_autoScale2d = m_autoScale3d = kUnknownAutoZoom;
}
// Sets direction based on GPS if:
// Sets arrow direction based on GPS if:
// 1. Compass is not available.
// 2. Direction must be glued to the route during routing (route-corrected angle is set only in
// OnLocationUpdate(): in OnCompassUpdate() the angle always has the original value.
// 3. Device is moving faster then pedestrian.
bool const isMovingFast = info.HasSpeed() && info.m_speed > kMinSpeedThresholdMps;
bool const glueArrowInRouting = isNavigable && m_isArrowGluedInRouting;
bool const glueArrowInRouting = navigationContext.m_isNavigable && m_isArrowGluedInRouting;
// Calculate the route direction by looking ahead a distance in the route
// depending on the current speed
if (glueArrowInRouting && navigationContext.m_followedPolyline != nullptr)
{
double const speed =
(navigationContext.m_speedLimit > 0 ? measurement_utils::MpsToKmph(navigationContext.m_speedLimit)
: kDefaultSpeedLimitKmpH);
double const lookaheadTimeSec = std::min(speed * kLookaheadTimeSpeedRatio, kMaxLookaheadTimeSec);
double const lookaheadDistance = std::min(speed * lookaheadTimeSec, navigationContext.m_distanceToNextTurn);
auto const & iter = navigationContext.m_followedPolyline->GetCurrentIter();
m2::PointD const point = navigationContext.m_followedPolyline->GetLookaheadPoint(lookaheadDistance);
auto angle = math::RadToDeg(ang::AngleTo(iter.m_pt, point));
if (std::isnan(angle) || std::isinf(angle))
{
// fallback in case the current route becomes invalid for any reason
SetRouteDirection(info.m_bearing);
}
else
{
SetRouteDirection(math::DegToRad(location::AngleToBearing(angle)));
}
}
if ((!m_isCompassAvailable || glueArrowInRouting || isMovingFast) && info.HasBearing())
{
SetDirection(math::DegToRad(info.m_bearing));
SetArrowDirection(math::DegToRad(info.m_bearing));
m_lastGPSBearingTimer.Reset();
}
m_direction = m_mode == location::FollowAndRotateRoute ? m_routeDirection : m_arrowDirection;
if (m_isPositionAssigned && (!AlmostCurrentPosition(oldPos) || !AlmostCurrentAzimut(oldAzimut)))
{
CreateAnim(oldPos, oldAzimut, screen);
@@ -487,9 +530,9 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool
{
ChangeModelView(m_position, kDoNotChangeZoom);
}
else if (m_mode == location::FollowAndRotate)
else if (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute)
{
ChangeModelView(m_position, m_drawDirection,
ChangeModelView(m_position, m_direction,
m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center(),
kDoNotChangeZoom);
}
@@ -499,7 +542,7 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool
{
if (m_isInRouting)
{
ChangeMode(location::FollowAndRotate);
ChangeMode(location::FollowAndRotateCompass);
UpdateViewport(kMaxScaleZoomLevel);
}
else
@@ -525,7 +568,7 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool
{
if (m_isInRouting)
{
ChangeMode(location::FollowAndRotate);
ChangeMode(location::FollowAndRotateCompass);
UpdateViewport(kMaxScaleZoomLevel);
}
else
@@ -552,7 +595,8 @@ void MyPositionController::LoseLocation()
{
if (m_mode == location::NotFollowNoPosition)
return;
else if (m_mode == location::Follow || m_mode == location::FollowAndRotate)
else if (m_mode == location::Follow || m_mode == location::FollowAndRotateCompass ||
m_mode == location::FollowAndRotateRoute)
ChangeMode(location::PendingPosition);
else
ChangeMode(location::NotFollowNoPosition);
@@ -570,10 +614,11 @@ void MyPositionController::OnCompassUpdate(location::CompassInfo const & info, S
if ((IsInRouting() && m_isArrowGluedInRouting) || existsFreshGpsBearing)
return;
SetDirection(info.m_bearing);
SetArrowDirection(info.m_bearing);
if (m_isPositionAssigned && !AlmostCurrentAzimut(oldAzimut) && m_mode == location::FollowAndRotate)
if (m_isPositionAssigned && !AlmostCurrentAzimut(oldAzimut) && m_mode == location::FollowAndRotateCompass)
{
m_direction = info.m_bearing;
CreateAnim(GetDrawablePosition(), oldAzimut, screen);
m_isDirtyViewport = true;
}
@@ -582,10 +627,10 @@ void MyPositionController::OnCompassUpdate(location::CompassInfo const & info, S
bool MyPositionController::UpdateViewportWithAutoZoom()
{
double const autoScale = m_enablePerspectiveInRouting ? m_autoScale3d : m_autoScale2d;
if (autoScale > 0.0 && m_mode == location::FollowAndRotate && m_isInRouting && m_enableAutoZoomInRouting &&
!m_needBlockAutoZoom)
if (autoScale > 0.0 && (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute) &&
m_isInRouting && m_enableAutoZoomInRouting && !m_needBlockAutoZoom)
{
ChangeModelView(autoScale, m_position, m_drawDirection, GetRoutingRotationPixelCenter());
ChangeModelView(autoScale, m_position, m_direction, GetRoutingRotationPixelCenter());
return true;
}
return false;
@@ -617,7 +662,7 @@ void MyPositionController::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<
m_shape->SetPositionObsolete(m_positionIsObsolete);
m_shape->SetPosition(m2::PointF(GetDrawablePosition()));
m_shape->SetAzimuth(static_cast<float>(GetDrawableAzimut()));
m_shape->SetIsValidAzimuth(IsRotationAvailable());
m_shape->SetIsValidAzimuth(IsArrowRotationAvailable());
m_shape->SetAccuracy(static_cast<float>(m_errorRadius));
m_shape->SetRoutingMode(IsInRouting());
@@ -631,7 +676,7 @@ void MyPositionController::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<
bool MyPositionController::IsRouteFollowingActive() const
{
return IsInRouting() && m_mode == location::FollowAndRotate;
return IsInRouting() && m_mode == location::FollowAndRotateCompass;
}
bool MyPositionController::AlmostCurrentPosition(m2::PointD const & pos) const
@@ -643,18 +688,25 @@ bool MyPositionController::AlmostCurrentPosition(m2::PointD const & pos) const
bool MyPositionController::AlmostCurrentAzimut(double azimut) const
{
double constexpr kDirectionEqualityDelta = 1e-3;
return AlmostEqualAbs(azimut, m_drawDirection, kDirectionEqualityDelta);
return AlmostEqualAbs(azimut, m_direction, kDirectionEqualityDelta);
}
void MyPositionController::SetDirection(double bearing)
void MyPositionController::SetRouteDirection(double bearing)
{
m_drawDirection = bearing;
m_isDirectionAssigned = true;
m_routeDirection = bearing;
m_isRouteDirectionAssigned = true;
}
void MyPositionController::SetArrowDirection(double bearing)
{
m_arrowDirection = bearing;
m_isArrowDirectionAssigned = true;
}
void MyPositionController::ChangeMode(location::EMyPositionMode newMode)
{
if (m_isInRouting && (m_mode != newMode) && (newMode == location::FollowAndRotate))
if (m_isInRouting && (m_mode != newMode) &&
(newMode == location::FollowAndRotateCompass || newMode == location::FollowAndRotateRoute))
ResetBlockAutoZoomTimer();
m_mode = newMode;
@@ -675,7 +727,8 @@ bool MyPositionController::IsWaitingForLocation() const
void MyPositionController::StopLocationFollow()
{
if (m_mode == location::Follow || m_mode == location::FollowAndRotate)
if (m_mode == location::Follow || m_mode == location::FollowAndRotateCompass ||
m_mode == location::FollowAndRotateRoute)
ChangeMode(location::NotFollow);
m_desiredInitMode = location::NotFollow;
@@ -690,7 +743,7 @@ void MyPositionController::OnEnterForeground(double backgroundTime)
// When location was active during previous session the app will try to follow the user.
if (m_mode == location::NotFollow)
{
ChangeMode(m_isInRouting ? location::FollowAndRotate : location::Follow);
ChangeMode(m_isInRouting ? location::FollowAndRotateCompass : location::Follow);
UpdateViewport(kDoNotChangeZoom);
}
@@ -706,7 +759,7 @@ void MyPositionController::OnEnterBackground() {}
void MyPositionController::OnCompassTapped()
{
if (m_mode == location::FollowAndRotate)
if (m_mode == location::FollowAndRotateCompass)
{
ChangeMode(location::Follow);
ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), kDoNotChangeZoom);
@@ -763,9 +816,9 @@ void MyPositionController::UpdateViewport(int zoomLevel)
{
ChangeModelView(m_position, zoomLevel);
}
else if (m_mode == location::FollowAndRotate)
else if (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute)
{
ChangeModelView(m_position, m_drawDirection,
ChangeModelView(m_position, m_direction,
m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center(), zoomLevel);
}
}
@@ -775,7 +828,7 @@ m2::PointD MyPositionController::GetRotationPixelCenter() const
if (m_mode == location::Follow)
return m_visiblePixelRect.Center();
if (m_mode == location::FollowAndRotate)
if (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute)
return m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center();
return m2::PointD::Zero();
@@ -817,15 +870,15 @@ double MyPositionController::GetDrawableAzimut()
}
if (m_isPendingAnimation)
return m_oldDrawDirection;
return m_oldArrowDirection;
return m_drawDirection;
return m_arrowDirection;
}
void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimut, ScreenBase const & screen)
{
double const moveDuration = PositionInterpolator::GetMoveDuration(oldPos, m_position, screen);
double const rotateDuration = AngleInterpolator::GetRotateDuration(oldAzimut, m_drawDirection);
double const rotateDuration = AngleInterpolator::GetRotateDuration(oldAzimut, m_arrowDirection);
if (df::IsAnimationAllowed(std::max(moveDuration, rotateDuration), screen))
{
if (IsModeChangeViewport())
@@ -834,7 +887,7 @@ void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimu
{
drape_ptr<Animation> anim = make_unique_dp<ArrowAnimation>(
GetDrawablePosition(), m_position, syncAnim == nullptr ? moveDuration : syncAnim->GetDuration(),
GetDrawableAzimut(), m_drawDirection);
GetDrawableAzimut(), m_arrowDirection);
if (syncAnim != nullptr)
{
anim->SetMaxDuration(syncAnim->GetMaxDuration());
@@ -843,13 +896,13 @@ void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimu
return anim;
};
m_oldPosition = oldPos;
m_oldDrawDirection = oldAzimut;
m_oldArrowDirection = oldAzimut;
m_isPendingAnimation = true;
}
else
{
AnimationSystem::Instance().CombineAnimation(
make_unique_dp<ArrowAnimation>(oldPos, m_position, moveDuration, oldAzimut, m_drawDirection));
make_unique_dp<ArrowAnimation>(oldPos, m_position, moveDuration, oldAzimut, m_arrowDirection));
}
}
}
@@ -868,16 +921,18 @@ void MyPositionController::EnableAutoZoomInRouting(bool enableAutoZoom)
}
}
void MyPositionController::ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued)
void MyPositionController::ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued,
bool allowRouteRotation)
{
if (!m_isInRouting)
{
m_isInRouting = true;
m_isArrowGluedInRouting = isArrowGlued;
m_enableAutoZoomInRouting = enableAutoZoom;
m_allowRouteRotationInRouting = allowRouteRotation;
ChangeMode(location::FollowAndRotate);
ChangeModelView(m_position, m_isDirectionAssigned ? m_drawDirection : 0.0, GetRoutingRotationPixelCenter(),
ChangeMode(location::FollowAndRotateCompass);
ChangeModelView(m_position, m_isRouteDirectionAssigned ? m_routeDirection : 0.0, GetRoutingRotationPixelCenter(),
zoomLevel, [this](ref_ptr<Animation> anim) { UpdateViewport(kDoNotChangeZoom); });
ResetRoutingNotFollowTimer();
}
@@ -889,8 +944,10 @@ void MyPositionController::DeactivateRouting()
{
m_isInRouting = false;
m_isArrowGluedInRouting = false;
m_allowRouteRotationInRouting = false;
m_isDirectionAssigned = m_isCompassAvailable && m_isDirectionAssigned;
m_isArrowDirectionAssigned = m_isCompassAvailable && m_isArrowDirectionAssigned;
m_isRouteDirectionAssigned = false;
ChangeMode(location::Follow);
ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), kDoNotChangeZoom);
@@ -919,7 +976,7 @@ void MyPositionController::CheckNotFollowRouting()
CHECK_ON_TIMEOUT(m_routingNotFollowNotifyId, kMaxNotFollowRoutingTimeSec, CheckNotFollowRouting);
if (m_routingNotFollowTimer.ElapsedSeconds() >= kMaxNotFollowRoutingTimeSec)
{
ChangeMode(location::FollowAndRotate);
ChangeMode(location::FollowAndRotateCompass);
UpdateViewport(kDoNotChangeZoom);
}
}

View File

@@ -7,6 +7,7 @@
#include "drape/pointers.hpp"
#include "routing/base/followed_polyline.hpp"
#include "shaders/program_manager.hpp"
#include "platform/location.hpp"
@@ -24,6 +25,24 @@ using TAnimationCreator = std::function<drape_ptr<Animation>(ref_ptr<Animation>)
class DrapeNotifier;
struct NavigationContext
{
bool m_isNavigable = false;
double m_distanceToNextTurn = 0.0;
double m_speedLimit = 0.0;
routing::FollowedPolyline const * m_followedPolyline = nullptr;
NavigationContext() = default;
NavigationContext(bool navigable, double distanceToTurn, double speedLimit,
routing::FollowedPolyline const & followedPolyline)
: m_isNavigable(navigable)
, m_distanceToNextTurn(distanceToTurn)
, m_speedLimit(speedLimit)
, m_followedPolyline(&followedPolyline)
{}
};
class MyPositionController
{
public:
@@ -102,7 +121,7 @@ public:
drape_ptr<MyPosition> && shape, Arrow3d::PreloadedData && preloadedData);
void ResetRenderShape();
void ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued);
void ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued, bool allowRouteRotation);
void DeactivateRouting();
void EnablePerspectiveInRouting(bool enablePerspective);
@@ -117,14 +136,15 @@ public:
void OnEnterBackground();
void OnCompassTapped();
void OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, double distanceToNextTurn, double speedLimit,
void OnLocationUpdate(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
ScreenBase const & screen);
void OnCompassUpdate(location::CompassInfo const & info, ScreenBase const & screen);
void Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, ScreenBase const & screen,
int zoomLevel, FrameValues const & frameValues);
bool IsRotationAvailable() const { return m_isDirectionAssigned; }
bool IsArrowRotationAvailable() const { return m_isArrowDirectionAssigned; }
bool IsRouteRotationAvailable() const { return m_isRouteDirectionAssigned; }
bool IsInRouting() const { return m_isInRouting; }
bool IsRouteFollowingActive() const;
bool IsModeChangeViewport() const;
@@ -135,7 +155,8 @@ public:
private:
void ChangeMode(location::EMyPositionMode newMode);
void SetDirection(double bearing);
void SetRouteDirection(double bearing);
void SetArrowDirection(double bearing);
void ChangeModelView(m2::PointD const & center, int zoomLevel);
void ChangeModelView(double azimuth);
@@ -178,12 +199,15 @@ private:
double m_errorRadius; // error radius in mercator.
double m_horizontalAccuracy;
m2::PointD m_position; // position in mercator.
double m_drawDirection;
double m_direction;
double m_routeDirection;
double m_arrowDirection;
m2::PointD m_oldPosition; // position in mercator.
double m_oldDrawDirection;
double m_oldArrowDirection;
bool m_enablePerspectiveInRouting;
bool m_enableAutoZoomInRouting;
bool m_allowRouteRotationInRouting;
double m_autoScale2d;
double m_autoScale3d;
@@ -205,7 +229,8 @@ private:
TAnimationCreator m_animCreator;
bool m_isPositionAssigned;
bool m_isDirectionAssigned;
bool m_isArrowDirectionAssigned;
bool m_isRouteDirectionAssigned;
bool m_isCompassAvailable;
bool m_positionIsObsolete;

View File

@@ -31,8 +31,8 @@ namespace df
{
namespace
{
uint64_t constexpr kDoubleTapPauseMs = 250;
uint64_t constexpr kLongTouchMs = 500;
uint64_t constexpr kDoubleTapPauseMs = 200;
uint64_t constexpr kLongTouchMs = 700;
uint64_t constexpr kKineticDelayMs = 500;
float constexpr kForceTapThreshold = 0.75;

View File

@@ -191,21 +191,9 @@ void TypesHolder::SortBySpec()
auto const getPriority = [&cl](uint32_t type) { return cl.GetObject(type)->GetMaxOverlaysPriority(); };
auto const & checker = UselessTypesChecker::Instance();
auto const & isChargingStationChecker = ftypes::IsCharingStationChecker::Instance();
auto const & isChargingStationSmallChecker = ftypes::IsCharingStationSmallChecker::Instance();
std::stable_sort(begin(), end(), [&checker, &getPriority, &isChargingStationChecker, &isChargingStationSmallChecker](uint32_t t1, uint32_t t2)
std::stable_sort(begin(), end(), [&checker, &getPriority](uint32_t t1, uint32_t t2)
{
if (isChargingStationSmallChecker(t1) && !isChargingStationSmallChecker(t2))
return false;
else if (isChargingStationSmallChecker(t1) && !isChargingStationSmallChecker(t2))
return true;
if (isChargingStationChecker(t1) && !isChargingStationChecker(t2))
return true;
else if (isChargingStationChecker(t2) && !isChargingStationChecker(t1))
return false;
int const p1 = getPriority(t1);
int const p2 = getPriority(t2);
if (p1 != p2)
@@ -415,13 +403,6 @@ void FeatureParams::SetRwSubwayType(char const * cityName)
FeatureParams::TypesResult FeatureParams::FinishAddingTypesEx()
{
auto const & cl = classif();
auto charingStation = cl.GetTypeByPath({"amenity", "charging_station", "general"});
auto motorcarCharingStation = cl.GetTypeByPath({"amenity", "charging_station", "motorcar"});
auto carelessCharingStation = cl.GetTypeByPath({"amenity", "charging_station", "carless"});
if (IsTypeExist(charingStation) && !IsTypeExist(motorcarCharingStation) && !IsTypeExist(carelessCharingStation))
AddType(motorcarCharingStation);
base::SortUnique(m_types);
TypesResult res = TYPES_GOOD;

View File

@@ -753,30 +753,6 @@ IsDirectionalChecker::IsDirectionalChecker() : ftypes::BaseChecker(1 /* level */
m_types.push_back(c.GetTypeByPath({"lateral"}));
}
IsCharingStationChecker::IsCharingStationChecker() : ftypes::BaseChecker(3 /* level */)
{
Classificator const & c = classif();
m_types.push_back(c.GetTypeByPath({"amenity", "charging_station", "general"}));
}
IsCharingStationCarChecker::IsCharingStationCarChecker() : ftypes::BaseChecker(3 /* level */)
{
Classificator const & c = classif();
m_types.push_back(c.GetTypeByPath({"amenity", "charging_station", "motorcar"}));
}
IsCharingStationCarlessChecker::IsCharingStationCarlessChecker() : ftypes::BaseChecker(3 /* level */)
{
Classificator const & c = classif();
m_types.push_back(c.GetTypeByPath({"amenity", "charging_station", "carless"}));
}
IsCharingStationSmallChecker::IsCharingStationSmallChecker() : ftypes::BaseChecker(3 /* level */)
{
Classificator const & c = classif();
m_types.push_back(c.GetTypeByPath({"amenity", "charging_station", "small"}));
}
IsTaxiChecker::IsTaxiChecker()
{
Classificator const & c = classif();

View File

@@ -519,38 +519,6 @@ public:
DECLARE_CHECKER_INSTANCE(IsDirectionalChecker);
};
class IsCharingStationChecker : public ftypes::BaseChecker
{
IsCharingStationChecker();
public:
DECLARE_CHECKER_INSTANCE(IsCharingStationChecker);
};
class IsCharingStationCarChecker : public ftypes::BaseChecker
{
IsCharingStationCarChecker();
public:
DECLARE_CHECKER_INSTANCE(IsCharingStationCarChecker);
};
class IsCharingStationCarlessChecker : public ftypes::BaseChecker
{
IsCharingStationCarlessChecker();
public:
DECLARE_CHECKER_INSTANCE(IsCharingStationCarlessChecker);
};
class IsCharingStationSmallChecker : public ftypes::BaseChecker
{
IsCharingStationSmallChecker();
public:
DECLARE_CHECKER_INSTANCE(IsCharingStationSmallChecker);
};
class IsTaxiChecker : public BaseChecker
{
IsTaxiChecker();

View File

@@ -121,19 +121,12 @@ std::string MapObject::GetLocalizedAllTypes(bool withMainType) const
auto const & isPoi = ftypes::IsPoiChecker::Instance();
auto const & isDirectional = ftypes::IsDirectionalChecker::Instance();
auto const & amenityChecker = ftypes::IsAmenityChecker::Instance();
auto const & charingStationCarChecker = ftypes::IsCharingStationCarChecker::Instance();
auto const & charingStationCarlessChecker = ftypes::IsCharingStationCarlessChecker::Instance();
auto const & charingStationSmallChecker = ftypes::IsCharingStationSmallChecker::Instance();
std::ostringstream oss;
bool isMainType = true;
bool isFirst = true;
for (auto const type : copy)
{
// Ignore some charing stations
if (charingStationCarlessChecker(type) || ((charingStationCarChecker(type) || charingStationSmallChecker(type)) && charingStationCarlessChecker(copy)))
continue;
if (isMainType && !withMainType)
{
isMainType = false;

View File

@@ -86,9 +86,7 @@ std::map<std::string, BookmarkMatchInfo> const kFeatureTypeToBookmarkMatchInfo =
{"amenity-bureau_de_change", {kml::BookmarkIcon::Exchange, BookmarkBaseType::Exchange}},
{"amenity-charging_station", {kml::BookmarkIcon::ChargingStation, BookmarkBaseType::Gas}},
{"amenity-charging_station-general", {kml::BookmarkIcon::ChargingStation, BookmarkBaseType::Gas}},
{"amenity-charging_station-bicycle", {kml::BookmarkIcon::ChargingStation, BookmarkBaseType::Gas}},
{"amenity-charging_station-motorcycle", {kml::BookmarkIcon::ChargingStation, BookmarkBaseType::Gas}},
{"amenity-charging_station-motorcar", {kml::BookmarkIcon::ChargingStation, BookmarkBaseType::Gas}},
{"amenity-fuel", {kml::BookmarkIcon::Gas, BookmarkBaseType::Gas}},

View File

@@ -7,6 +7,7 @@
#include "ge0/url_generator.hpp"
#include "platform/location.hpp"
#include "routing/route.hpp"
#include "routing/speed_camera_prohibition.hpp"
@@ -1453,7 +1454,7 @@ void Framework::CreateDrapeEngine(ref_ptr<dp::GraphicsContextFactory> contextFac
GetPlatform().RunTask(Platform::Thread::Gui, [this, mode, routingActive]()
{
// Deactivate selection (and hide place page) if we return to routing in F&R mode.
if (routingActive && mode == location::FollowAndRotate)
if (routingActive && (mode == location::FollowAndRotateCompass || mode == location::FollowAndRotateRoute))
DeactivateMapSelection();
if (m_myPositionListener != nullptr)
@@ -3208,6 +3209,7 @@ void Framework::ReadFeatures(function<void(FeatureType &)> const & reader, vecto
void Framework::OnRouteFollow(routing::RouterType type)
{
bool const isPedestrianRoute = type == RouterType::Pedestrian;
bool const allowRouteRotation = type == RouterType::Vehicle;
bool const enableAutoZoom = isPedestrianRoute ? false : LoadAutoZoom();
int const scale = isPedestrianRoute ? scales::GetPedestrianNavigationScale() : scales::GetNavigationScale();
int scale3d = isPedestrianRoute ? scales::GetPedestrianNavigation3dScale() : scales::GetNavigation3dScale();
@@ -3223,7 +3225,7 @@ void Framework::OnRouteFollow(routing::RouterType type)
// TODO. We need to sync two enums VehicleType and RouterType to be able to pass
// GetRoutingSettings(type).m_matchRoute to the FollowRoute() instead of |isPedestrianRoute|.
// |isArrowGlued| parameter fully corresponds to |m_matchRoute| in RoutingSettings.
m_drapeEngine->FollowRoute(scale, scale3d, enableAutoZoom, !isPedestrianRoute /* isArrowGlued */);
m_drapeEngine->FollowRoute(scale, scale3d, enableAutoZoom, !isPedestrianRoute /* isArrowGlued */, allowRouteRotation);
}
// RoutingManager::Delegate

View File

@@ -1,9 +1,12 @@
#include "routing_manager.hpp"
#include "drape_frontend/my_position_controller.hpp"
#include "geometry/angles.hpp"
#include "map/chart_generator.hpp"
#include "map/routing_mark.hpp"
#include "routing/absent_regions_finder.hpp"
#include "routing/base/followed_polyline.hpp"
#include "routing/checkpoint_predictor.hpp"
#include "routing/index_router.hpp"
#include "routing/route.hpp"
@@ -1170,9 +1173,9 @@ void RoutingManager::SetDrapeEngine(ref_ptr<df::DrapeEngine> engine, bool is3dAl
if (m_gpsInfoCache != nullptr)
{
auto routeMatchingInfo = GetRouteMatchingInfo(*m_gpsInfoCache);
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, *m_gpsInfoCache, m_routingSession.IsNavigable(),
m_routingSession.GetDistanceToNextTurn(), m_routingSession.GetCurrentSpeedLimit(),
routeMatchingInfo);
df::NavigationContext navigationContext(m_routingSession.IsNavigable(), m_routingSession.GetDistanceToNextTurn(),
m_routingSession.GetCurrentSpeedLimit(), GetRoutePolyline());
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, *m_gpsInfoCache, navigationContext, routeMatchingInfo);
m_gpsInfoCache.reset();
}
@@ -1516,9 +1519,9 @@ void RoutingManager::OnExtrapolatedLocationUpdate(location::GpsInfo const & info
m_gpsInfoCache = make_unique<location::GpsInfo>(gpsInfo);
auto routeMatchingInfo = GetRouteMatchingInfo(gpsInfo);
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, gpsInfo, m_routingSession.IsNavigable(),
m_routingSession.GetDistanceToNextTurn(), m_routingSession.GetCurrentSpeedLimit(),
routeMatchingInfo);
df::NavigationContext navigationContext(m_routingSession.IsNavigable(), m_routingSession.GetDistanceToNextTurn(),
m_routingSession.GetCurrentSpeedLimit(), GetRoutePolyline());
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, gpsInfo, navigationContext, routeMatchingInfo);
}
void RoutingManager::DeleteSavedRoutePoints()

View File

@@ -228,9 +228,7 @@ private:
{{"shop", "money_lender"}, SearchMarkType::Bank},
{{"amenity", "fuel"}, SearchMarkType::Fuel},
{{"amenity", "charging_station"}, SearchMarkType::ChargingStation},
{{"amenity", "charging_station", "general"}, SearchMarkType::ChargingStation},
{{"amenity", "charging_station", "bicycle"}, SearchMarkType::ChargingStation},
{{"amenity", "charging_station", "motorcycle"}, SearchMarkType::ChargingStation},
{{"amenity", "charging_station", "motorcar"}, SearchMarkType::ChargingStation},
{{"shop", "alcohol"}, SearchMarkType::ShopAlcohol},
{{"shop", "beverages"}, SearchMarkType::ShopAlcohol},

View File

@@ -27,7 +27,7 @@ namespace routing::turns::sound
* - All other variants default to `zh-Hans` (Simplified Chinese).
*
*/
std::array<std::pair<std::string_view, std::string_view>, 42> constexpr kLanguageList = {{
std::array<std::pair<std::string_view, std::string_view>, 43> constexpr kLanguageList = {{
{"en", "English"},
{"id", "Bahasa Indonesia"},
{"ca", "Català"},
@@ -82,5 +82,6 @@ std::array<std::pair<std::string_view, std::string_view>, 42> constexpr kLanguag
#endif
{"ja", "日本語"},
{"ko", "한국어"},
{"ta", "தமிழ்"},
}};
} // namespace routing::turns::sound

View File

@@ -139,7 +139,8 @@ enum EMyPositionMode
NotFollowNoPosition,
NotFollow,
Follow,
FollowAndRotate
FollowAndRotateCompass,
FollowAndRotateRoute
};
using TMyPositionModeChanged = std::function<void(location::EMyPositionMode, bool)>;

View File

@@ -308,7 +308,8 @@ string ToString<location::EMyPositionMode>(location::EMyPositionMode const & v)
case location::NotFollow: return "NotFollow";
case location::NotFollowNoPosition: return "NotFollowNoPosition";
case location::Follow: return "Follow";
case location::FollowAndRotate: return "FollowAndRotate";
case location::FollowAndRotateCompass: return "FollowAndRotateCompass";
case location::FollowAndRotateRoute: return "FollowAndRotateRoute";
default: return "Pending";
}
}
@@ -324,8 +325,10 @@ bool FromString<location::EMyPositionMode>(string const & s, location::EMyPositi
v = location::NotFollowNoPosition;
else if (s == "Follow")
v = location::Follow;
else if (s == "FollowAndRotate")
v = location::FollowAndRotate;
else if (s == "FollowAndRotateCompass")
v = location::FollowAndRotateCompass;
else if (s == "FollowAndRotateRoute")
v = location::FollowAndRotateRoute;
else
return false;

View File

@@ -237,4 +237,34 @@ Iter FollowedPolyline::GetClosestMatchingProjectionInInterval(m2::RectD const &
return nearestIter;
}
m2::PointD FollowedPolyline::GetLookaheadPoint(double lookaheadDistanceM) const
{
if (!IsValid())
return m2::PointD();
size_t segmentIdx = m_current.m_ind;
m2::PointD prev = m_current.m_pt;
size_t const maxSegmentIdx = m_poly.GetSize() - 1;
double remaining = lookaheadDistanceM;
while (segmentIdx < maxSegmentIdx)
{
m2::PointD const & next = m_poly.GetPoint(segmentIdx + 1);
double segLen = mercator::DistanceOnEarth(prev, next);
if (remaining <= segLen)
{
double t = remaining / segLen;
return prev + (next - prev) * t;
}
remaining -= segLen;
prev = next;
segmentIdx += 1;
}
return m_poly.GetPoint(segmentIdx);
}
} // namespace routing

View File

@@ -125,6 +125,9 @@ public:
bool IsFakeSegment(size_t index) const;
/// \brief Obtain a point |lookaheadDistanceM| meters along the current route
m2::PointD GetLookaheadPoint(double lookaheadDistanceM) const;
private:
/// \returns iterator to the best projection of center of |posRect| to the |m_poly|.
/// If there's a good projection of center of |posRect| to two closest segments of |m_poly|