Compare commits

..

2 Commits

Author SHA1 Message Date
Yannik Bloscheck
327a64eea6 [styles] Add road borders to major roads
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2026-01-08 19:12:37 +01:00
Yannik Bloscheck
4c5bc5d1e8 [styles] Add road borders to minor roads
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2026-01-08 19:12:37 +01:00
35 changed files with 94 additions and 803 deletions

View File

@@ -132,6 +132,7 @@ import app.organicmaps.widget.placepage.PlacePageViewModel;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Objects;
@@ -711,6 +712,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
if (!TextUtils.isEmpty(appName))
{
setTitle(appName);
((MaterialTextView) mPointChooser.findViewById(R.id.title)).setText(appName);
}
}

View File

@@ -114,7 +114,6 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
public void onCreate(@NonNull LifecycleOwner owner)
{
Logger.d(TAG);
Framework.nativeSetCarScreenMode(true);
mSensorsManager = new CarSensorsManager(getCarContext());
mDisplayManager = MwmApplication.from(getCarContext()).getDisplayManager();
mDisplayManager.addListener(DisplayType.Car, this);
@@ -160,7 +159,6 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
public void onDestroy(@NonNull LifecycleOwner owner)
{
mDisplayManager.removeListener(DisplayType.Car);
Framework.nativeSetCarScreenMode(false);
}
private void init()

View File

@@ -237,7 +237,6 @@ public class EditorHostFragment
for (LocalizedName name : sNames)
languages.add(name.lang);
args.putStringArrayList(LanguagesFragment.EXISTING_LOCALIZED_NAMES, languages);
args.putBoolean(LanguagesFragment.INCLUDE_LOCAL_LANGUAGE, false);
editWithFragment(Mode.LANGUAGE, R.string.choose_language, args, LanguagesFragment.class, false);
}

View File

@@ -1,15 +1,11 @@
package app.organicmaps.editor;
import static app.organicmaps.sdk.editor.data.Language.DEFAULT_LANG_CODE;
import android.content.res.Configuration;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.os.ConfigurationCompat;
import androidx.core.os.LocaleListCompat;
import androidx.fragment.app.Fragment;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment;
import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.data.Language;
@@ -25,7 +21,6 @@ import java.util.Set;
public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
{
final static String EXISTING_LOCALIZED_NAMES = "ExistingLocalizedNames";
final static String INCLUDE_LOCAL_LANGUAGE = "IncludeLocalLanguage";
public interface Listener
{
@@ -39,8 +34,6 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
protected LanguagesAdapter createAdapter()
{
Bundle args = getArguments();
boolean includeLocalLanguage =
args != null ? args.getBoolean(INCLUDE_LOCAL_LANGUAGE) : true;
Set<String> existingLanguages =
args != null ? new HashSet<>(args.getStringArrayList(EXISTING_LOCALIZED_NAMES)) : new HashSet<>();
@@ -75,12 +68,6 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
languages.addAll(0, systemLanguages.stream().filter(Objects::nonNull).toList());
if (includeLocalLanguage) {
String localLanguageLabel = getString(R.string.pref_maplanguage_local);
Language localLanguage = new Language(DEFAULT_LANG_CODE, localLanguageLabel);
languages.add(0, localLanguage);
}
return new LanguagesAdapter(this, languages.toArray(new Language[languages.size()]));
}

View File

@@ -1,7 +1,6 @@
package app.organicmaps.settings;
import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
import static app.organicmaps.sdk.editor.data.Language.DEFAULT_LANG_CODE;
import android.annotation.SuppressLint;
import android.content.Intent;
@@ -141,13 +140,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
private void updateMapLanguageCodeSummary()
{
final Preference pref = getPreference(getString(R.string.pref_map_locale));
String mapLanguageCode = MapLanguageCode.getMapLanguageCode();
if (mapLanguageCode.equals(DEFAULT_LANG_CODE)) {
pref.setSummary(R.string.pref_maplanguage_local);
} else {
Locale locale = new Locale(mapLanguageCode);
pref.setSummary(locale.getDisplayLanguage());
}
Locale locale = new Locale(MapLanguageCode.getMapLanguageCode());
pref.setSummary(locale.getDisplayLanguage());
}
private void updateRoutingSettingsPrefsSummary()

View File

@@ -20,8 +20,8 @@
android:gravity="center"
android:layout_gravity="end|center_vertical"
android:background="?selectableItemBackgroundBorderless"
android:textSize="@dimen/text_size_toolbar"
android:padding="@dimen/margin_half"
android:textAppearance="@style/MwmTextAppearance.Toolbar.Title"
android:text="@string/editor_report_problem_send_button"/>
</com.google.android.material.appbar.MaterialToolbar>

View File

@@ -15,8 +15,15 @@
android:theme="@style/MwmWidget.ToolbarTheme"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:title="@string/editor_add_select_location">
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/margin_half"
android:text="@string/editor_add_select_location"
android:textAppearance="@style/MwmTextAppearance.Toolbar.Title"/>
</com.google.android.material.appbar.MaterialToolbar>
<com.google.android.material.textview.MaterialTextView

View File

@@ -797,10 +797,8 @@
<string name="enable_show_on_lock_screen">Show on the lock screen</string>
<!-- Description in preferences -->
<string name="enable_show_on_lock_screen_description">When enabled, the app will work on the lockscreen even when the device is locked.</string>
<!-- Current language of the map -->
<!-- Current language of the map! -->
<string name="change_map_locale">Map language</string>
<!-- Local language -->
<string name="pref_maplanguage_local">Local Language</string>
<!-- OpenStreetMap text on splash screen -->
<string name="splash_subtitle">Map data from OpenStreetMap</string>
<!-- Telegram group url for the "?" About page -->

View File

@@ -98,6 +98,16 @@
<item name="android:textColorHint">@color/text_light_hint</item>
</style>
<style name="MwmTextAppearance.Toolbar.Title" parent="android:TextAppearance.Material.Widget.ActionBar.Title">
<item name="android:textSize">@dimen/text_size_toolbar</item>
<item name="android:textColor">@color/text_light</item>
<item name="android:textColorHint">@color/text_light_hint</item>
</style>
<style name="MwmTextAppearance.Toolbar.Title.Light">
<item name="android:textColor">@color/bg_cards</item>
</style>
<style name="MwmTextAppearance.NavMenu">
<item name="android:textStyle">bold</item>
</style>

View File

@@ -143,7 +143,8 @@
<item name="android:background">?colorPrimary</item>
<item name="android:displayOptions">homeAsUp|showTitle</item>
<item name="contentInsetStart">0dp</item>
<item name="titleTextColor">@color/text_light</item>
<item name="android:titleTextAppearance">@style/MwmTextAppearance.Toolbar.Title</item>
<item name="titleTextAppearance">@style/MwmTextAppearance.Toolbar.Title</item>
<item name="buttonGravity">center_vertical</item>
</style>
@@ -168,7 +169,9 @@
<item name="android:cacheColorHint">@android:color/transparent</item>
</style>
<style name="MwmWidget.TextView" parent="Widget.MaterialComponents.TextView" />
<style name="MwmWidget.TextView" parent="Widget.MaterialComponents.TextView">
<item name="android:background">@android:color/transparent</item>
</style>
<style name="MwmWidget.TextView.Item">
<item name="android:layout_width">match_parent</item>

View File

@@ -1490,12 +1490,6 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSet3dMode(JNIEnv
g_framework->Set3dMode(allow3d, allow3dBuildings);
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSetCarScreenMode(JNIEnv * env, jclass, jboolean enabled)
{
if (g_framework)
frm()->SetCarScreenMode(static_cast<bool>(enabled));
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeGet3dMode(JNIEnv * env, jclass, jobject result)
{
bool enabled;

View File

@@ -280,8 +280,6 @@ public class Framework
public static native void nativeSet3dMode(boolean allow3d, boolean allow3dBuildings);
public static native void nativeSetCarScreenMode(boolean enabled);
public static native boolean nativeGetAutoZoomEnabled();
public static native void nativeSetAutoZoomEnabled(boolean enabled);

View File

@@ -9,7 +9,6 @@ import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Handler;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresPermission;
@@ -17,9 +16,6 @@ import androidx.annotation.UiThread;
import androidx.core.content.ContextCompat;
import androidx.core.location.GnssStatusCompat;
import androidx.core.location.LocationManagerCompat;
import org.chromium.base.ObserverList;
import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.bookmarks.data.FeatureId;
@@ -29,8 +25,7 @@ import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.LocationUtils;
import app.organicmaps.sdk.util.NetworkPolicy;
import app.organicmaps.sdk.util.log.Logger;
import java.util.HashMap;
import org.chromium.base.ObserverList;
public class LocationHelper implements BaseLocationProvider.Listener
{
@@ -61,12 +56,6 @@ public class LocationHelper implements BaseLocationProvider.Listener
private Handler mHandler;
private Runnable mLocationTimeoutRunnable = this::notifyLocationUpdateTimeout;
private static final double INTERVAL_PROVIDER_DECISION = 3.0; // seconds
private final HashMap<String, Integer> mProviderLocationCounts = new HashMap<>();
private final HashMap<String, Float> mProviderAccuracyMeans = new HashMap<>();
private double mTimeAtLastProviderChange = Double.NaN;
private String mCurrentProvider = null;
@NonNull
private final GnssStatusCompat.Callback mGnssStatusCallback = new GnssStatusCompat.Callback() {
@Override
@@ -198,6 +187,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
@Override
public void onLocationChanged(@NonNull Location location)
{
Logger.d(TAG, "provider = " + mLocationProvider.getClass().getSimpleName() + " location = " + location);
if (!isActive())
{
@@ -211,80 +201,20 @@ public class LocationHelper implements BaseLocationProvider.Listener
return;
}
updateProviderDecision(location);
if (mCurrentProvider != null && !mCurrentProvider.equals(location.getProvider()))
if (mSavedLocation != null)
{
Logger.d(TAG, "REJECTED: provider = " + mLocationProvider.getClass().getSimpleName() + " location = " + location);
return;
if (!LocationUtils.isLocationBetterThanLast(location, mSavedLocation))
{
Logger.d(TAG, "The new " + location + " is worse than the last " + mSavedLocation);
return;
}
}
Logger.d(TAG, "provider = " + mLocationProvider.getClass().getSimpleName() + " location = " + location);
mSavedLocation = location;
mMyPosition = null;
notifyLocationUpdated();
}
private void updateProviderDecision(Location location)
{
if (Double.isNaN(mTimeAtLastProviderChange))
mTimeAtLastProviderChange = location.getElapsedRealtimeNanos() * 1.0E-9;
String provider = location.getProvider();
Integer cnt = mProviderLocationCounts.getOrDefault(provider, 0);
Float avg = mProviderAccuracyMeans.getOrDefault(provider, 0.0f);
if (cnt == null || avg == null)
{
mProviderLocationCounts.clear();
mProviderAccuracyMeans.clear();
return;
}
int count = cnt;
float average = avg;
float accuracy = location.getAccuracy();
int newCount = count + 1;
float newAverage = (count * average + accuracy) / newCount;
mProviderLocationCounts.put(provider, newCount);
mProviderAccuracyMeans.put(provider, newAverage);
double currentTime = location.getElapsedRealtimeNanos();
double timeDiff = (currentTime - mTimeAtLastProviderChange) * 1.0E-9;
if (timeDiff > INTERVAL_PROVIDER_DECISION)
{
mCurrentProvider = getMinAccuracyProvider();
Logger.d(TAG, "Selected: " + mCurrentProvider + ", with acc. " + mProviderAccuracyMeans.get(mCurrentProvider));
mTimeAtLastProviderChange = currentTime;
mProviderLocationCounts.clear();
mProviderAccuracyMeans.clear();
}
}
private String getMinAccuracyProvider()
{
String minAccuracyProvider = null;
float minAccuracy = Float.MAX_VALUE;
for (String p : mProviderAccuracyMeans.keySet())
{
Float pAcc = mProviderAccuracyMeans.get(p);
if (pAcc == null)
continue;
float pAccuracy = pAcc;
if (pAccuracy < minAccuracy)
{
minAccuracy = pAccuracy;
minAccuracyProvider = p;
}
}
return minAccuracyProvider;
}
// Used by GoogleFusedLocationProvider.
@SuppressWarnings("unused")
@Override

View File

@@ -81,6 +81,20 @@ public class LocationUtils
return location.getAccuracy() > 0.0f;
}
public static boolean isLocationBetterThanLast(@NonNull Location newLocation, @NonNull Location lastLocation)
{
if (newLocation.getElapsedRealtimeNanos() < lastLocation.getElapsedRealtimeNanos())
return false;
// As described in isAccuracySatisfied, GPS may have zero accuracy "for some reasons".
if (isFromGpsProvider(lastLocation) && lastLocation.getAccuracy() == 0.0f)
return true;
double speed = Math.max(DEFAULT_SPEED_MPS, (newLocation.getSpeed() + lastLocation.getSpeed()) / 2.0);
double lastAccuracy = lastLocation.getAccuracy() + speed * LocationUtils.getTimeDiff(lastLocation, newLocation);
return newLocation.getAccuracy() < lastAccuracy;
}
public static boolean areLocationServicesTurnedOn(@NonNull Context context)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)

View File

@@ -1,543 +1 @@
{
"@category_eat": "",
"@category_food": "",
"@category_transport": "",
"@category_fuel": "",
"@category_parking": "",
"@category_shopping": "",
"@category_hotel": "",
"@category_tourism": "",
"@category_entertainment": "",
"@category_nightlife": "",
"@category_children": "",
"@category_atm": "",
"@category_rv": "",
"amenity-atm|@category_atm": "",
"@category_bank": "",
"@category_secondhand": "",
"amenity-bank|@category_bank": "",
"@category_recycling": "",
"amenity-bureau_de_change": "",
"amenity-studio": "",
"amenity-bar|amenity-pub|@category_eat|@category_nightlife": "",
"amenity-cafe|@category_eat": "",
"amenity-fast_food|@category_eat": "",
"amenity-restaurant|@category_eat": "",
"amenity-fuel|@category_fuel": "",
"@shop": "",
"shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "",
"shop|@shop": "",
"shop-cannabis|@shop": "",
"shop-cosmetics|@category_shopping|@shop": "",
"shop-convenience|@category_food|@shop": "",
"shop-deli|@category_food|@shop": "",
"shop-farm|@category_food|@shop": "",
"shop-garden_centre|@shop": "",
"shop-grocery|@category_food|@shop": "",
"shop-health_food|@category_food|@shop": "",
"shop-hearing_aids|@shop": "",
"shop-mobile_phone|@shop": "",
"shop-florist|@shop": "",
"shop-butcher|@category_food|@shop": "",
"shop-furniture|@shop": "",
"shop-kitchen|@shop": "",
"shop-alcohol|@category_food|@shop": "",
"shop-books|@shop": "",
"shop-shoes|@category_shopping|@shop": "",
"shop-electronics|@shop": "",
"shop-hardware|shop-doityourself|@shop": "",
"shop-houseware|@shop": "",
"shop-jewelry|@category_shopping|@shop": "",
"shop-optician|@shop": "",
"shop-gift|@category_shopping|@shop": "",
"shop-beauty": "",
"shop-beauty-nails": "",
"shop-greengrocer|@category_food|@shop": "",
"shop-sports|@category_shopping|@shop": "",
"shop-supermarket|@category_food|@shop": "",
"shop-mall|@category_shopping|@shop": "",
"shop-department_store|@category_shopping|@shop": "",
"shop-beverages|@category_food|@shop": "",
"shop-computer|@shop": "",
"shop-confectionery|craft-confectionery|@category_food|@shop": "",
"shop-laundry": "",
"shop-toys|@category_children|@shop": "",
"amenity-marketplace|@category_food": "",
"amenity-mobile_money_agent": "",
"amenity-money_transfer": "",
"shop-clothes|@category_shopping|@shop": "",
"shop-caravan|@category_rv|@shop": "",
"shop-car|@shop": "",
"shop-bicycle|@shop": "",
"shop-kiosk": "",
"highway-bus_stop|@category_transport": "",
"railway-tram_stop|@category_transport": "",
"amenity-bus_station|@category_transport": "",
"railway-station|railway-halt|building-train_station|@category_transport": "",
"railway-station-funicular": "",
"railway-station-subway|@category_transport": "",
"amenity-ferry_terminal|@category_transport": "",
"amenity-taxi|@category_transport": "",
"amenity-townhall": "",
"tourism-attraction|@category_tourism": "",
"tourism-artwork": "",
"tourism-artwork-sculpture": "",
"tourism-artwork-statue": "",
"tourism-artwork-painting": "",
"tourism-viewpoint|@category_tourism": "",
"tourism-information": "",
"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "",
"amenity-place_of_worship": "",
"amenity-place_of_worship-christian": "",
"amenity-place_of_worship-muslim": "",
"amenity-place_of_worship-buddhist": "",
"amenity-place_of_worship-hindu": "",
"amenity-place_of_worship-shinto": "",
"amenity-place_of_worship-jewish": "",
"amenity-place_of_worship-taoist": "",
"tourism-museum|@category_tourism": "",
"waterway-waterfall|@category_tourism": "",
"historic-archaeological_site|@category_tourism": "",
"historic-battlefield": "",
"historic-stone": "",
"historic-boundary_stone": "",
"historic-castle|@category_tourism": "",
"historic-city_gate|@category_tourism": "",
"historic-citywalls|@category_tourism": "",
"historic-fort|@category_tourism": "",
"historic-gallows|@category_tourism": "",
"historic-memorial|@category_tourism": "",
"historic-memorial-cross": "",
"historic-memorial-plaque": "",
"historic-memorial-sculpture|@category_tourism": "",
"historic-memorial-statue|@category_tourism": "",
"historic-memorial-stolperstein": "",
"historic-memorial-war_memorial|@category_tourism": "",
"historic-monument|@category_tourism": "",
"historic-pillory|@category_tourism": "",
"historic-cannon": "",
"historic-anchor": "",
"historic-ruins|@category_tourism": "",
"historic-mine": "",
"historic-ship|@category_tourism": "",
"historic-wreck": "",
"historic-locomotive|@category_tourism": "",
"historic-tank|@category_tourism": "",
"historic-aircraft|@category_tourism": "",
"historic-tomb|@category_tourism": "",
"man_made-cross": "",
"historic-wayside_cross": "",
"historic-wayside_shrine": "",
"leisure-dog_park": "",
"leisure-dance|@category_entertainment": "",
"leisure-garden": "",
"leisure-firepit": "",
"amenity-bench|amenity-bench-backless": "",
"amenity-boat_rental": "",
"amenity-bicycle_rental": "",
"amenity-bicycle_repair_station": "",
"amenity-car_sharing": "",
"amenity-car_rental": "",
"amenity-motorcycle_rental": "",
"amenity-cinema|@category_entertainment": "",
"leisure-bowling_alley|@category_entertainment": "",
"amenity-theatre|@category_entertainment": "",
"amenity-nightclub|@category_entertainment|@category_nightlife": "",
"amenity-brothel": "",
"amenity-love_hotel": "",
"@gambling": "",
"amenity-gambling|@gambling": "",
"amenity-casino|@category_entertainment|@category_nightlife|@gambling": "",
"leisure-adult_gaming_centre|@gambling": "",
"leisure-amusement_arcade|@category_entertainment": "",
"amenity-college": "",
"amenity-fire_station": "",
"amenity-fountain": "",
"amenity-grave_yard|landuse-cemetery": "",
"shop-funeral_directors": "",
"@category_hospital": "",
"amenity-hospital|@category_hospital": "",
"amenity-clinic|@category_hospital": "",
"amenity-doctors|@category_hospital": "",
"amenity-dentist": "",
"healthcare-laboratory": "",
"healthcare-physiotherapist": "",
"healthcare-alternative": "",
"healthcare-audiologist": "",
"healthcare-blood_donation": "",
"healthcare-optometrist": "",
"healthcare-podiatrist": "",
"healthcare-psychotherapist": "",
"healthcare-sample_collection": "",
"healthcare-speech_therapist": "",
"amenity-hunting_stand": "",
"amenity-kindergarten": "",
"amenity-library": "",
"amenity-parking|amenity-parking_entrance|@category_parking": "",
"@category_pharmacy": "",
"amenity-pharmacy|@category_pharmacy": "",
"@category_post": "",
"amenity-post_box|@category_post": "",
"amenity-post_office|post_office-post_partner|@category_post": "",
"amenity-vehicle_inspection": "",
"amenity-waste_disposal": "",
"amenity-recycling-centre|@category_recycling": "",
"amenity-recycling-container|amenity-recycling|@category_recycling": "",
"recycling-batteries|@category_recycling": "",
"recycling-clothes|@category_recycling": "",
"recycling-glass_bottles|@category_recycling": "",
"recycling-paper|@category_recycling": "",
"recycling-plastic|@category_recycling": "",
"recycling-plastic_bottles|@category_recycling": "",
"recycling-scrap_metal|@category_recycling": "",
"recycling-small_appliances|@category_recycling": "",
"recycling-cardboard|@category_recycling": "",
"recycling-cans|@category_recycling": "",
"recycling-shoes|@category_recycling": "",
"recycling-green_waste|@category_recycling": "",
"recycling-cartons|@category_recycling": "",
"amenity-sanitary_dump_station|@category_rv": "",
"amenity-school": "",
"amenity-shelter": "",
"amenity-shelter-basic_hut": "",
"amenity-shelter-lean_to": "",
"amenity-stripclub": "",
"amenity-telephone": "",
"@category_toilet": "",
"amenity-toilets|toilets-yes|@category_toilet": "",
"amenity-university": "",
"place-continent": "",
"place-country": "",
"place-city": "",
"place-town": "",
"place-city-capital": "",
"place-county": "",
"place-state": "",
"place-region": "",
"place-island|place-islet": "",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "",
"place-hamlet": "",
"place-village": "",
"place-locality": "",
"place-farm": "",
"highway-raceway": "",
"highway-path|highway-footway|highway-steps|highway-cycleway": "",
"highway-pedestrian|highway-primary|highway-primary_link|highway-residential|highway-secondary|highway-secondary_link|highway-tertiary|highway-tertiary_link|highway-service|highway-road|highway-track|highway-trunk|highway-trunk_link|highway-living_street|highway-unclassified|highway-motorway_link|highway-motorway|highway-cycleway": "",
"highway-motorway_junction": "",
"highway-elevator": "",
"@mountain": "",
"natural-peak|@mountain": "",
"natural-saddle|mountain_pass": "",
"natural-strait": "",
"landuse-forest": "",
"leisure-park": "",
"tourism-aquarium|@category_tourism": "",
"tourism-hostel|@category_hotel": "",
"tourism-hotel|@category_hotel": "",
"tourism-guest_house|@category_hotel": "",
"tourism-motel|@category_hotel": "",
"tourism-alpine_hut|@category_hotel": "",
"shop-hairdresser": "",
"aeroway-aerodrome": "",
"leisure-stadium": "",
"leisure-playground|@category_children": "",
"leisure-sports_centre|leisure-sports_centre-sport-american_football|leisure-sports_centre-sport-archery|leisure-sports_centre-sport-athletics|leisure-sports_centre-sport-australian_football|leisure-sports_centre-sport-badminton|leisure-sports_centre-sport-baseball|leisure-sports_centre-sport-basketball|leisure-sports_centre-sport-beachvolleyball|leisure-sports_centre-sport-bowls|leisure-sports_centre-sport-climbing|leisure-sports_centre-sport-cricket|leisure-sports_centre-sport-curling|leisure-sports_centre-sport-equestrian|leisure-sports_centre-sport-field_hockey|leisure-sports_centre-sport-futsal|leisure-sports_centre-sport-golf|leisure-sports_centre-sport-gymnastics|leisure-sports_centre-sport-handball|leisure-sports_centre-sport-ice_hockey|leisure-sports_centre-sport-multi|leisure-sports_centre-sport-padel|leisure-sports_centre-sport-pelota|leisure-sports_centre-sport-scuba_diving|leisure-sports_centre-sport-shooting|leisure-sports_centre-sport-skateboard|leisure-sports_centre-sport-skiing|leisure-sports_centre-sport-soccer|leisure-sports_centre-sport-table_tennis|leisure-sports_centre-sport-tennis|leisure-sports_centre-sport-volleyball|leisure-sports_centre-sport-yoga": "",
"leisure-sports_centre-sport-swimming": "",
"leisure-golf_course": "",
"leisure-miniature_golf": "",
"leisure-escape_game": "",
"leisure-hackerspace": "",
"leisure-pitch": "",
"leisure-swimming_pool": "",
"leisure-swimming_pool-private": "",
"sport-american_football": "",
"sport-archery": "",
"sport-athletics": "",
"sport-australian_football": "",
"sport-baseball": "",
"sport-basketball": "",
"sport-beachvolleyball": "",
"sport-bowls": "",
"sport-chess": "",
"sport-cricket": "",
"sport-curling": "",
"sport-equestrian": "",
"sport-golf": "",
"sport-gymnastics": "",
"sport-handball": "",
"sport-scuba_diving": "",
"sport-shooting": "",
"sport-skateboard": "",
"sport-skiing": "",
"sport-soccer": "",
"sport-swimming": "",
"sport-table_tennis": "",
"sport-tennis": "",
"sport-padel": "",
"sport-volleyball": "",
"sport-9pin": "",
"sport-10pin": "",
"building": "",
"building-address": "",
"@category_police": "",
"amenity-police|@category_police": "",
"office-diplomatic": "",
"natural-bay": "",
"@category_water": "",
"amenity-drinking_water|drinking_water-yes|@category_water": "",
"natural-hot_spring|@category_water": "",
"natural-spring|@category_water": "",
"man_made-water_well|@category_water": "",
"amenity-water_point|@category_water|@category_rv": "",
"man_made-water_tap|@category_water": "",
"@waterbody": "",
"natural-water|@waterbody": "",
"natural-water-basin|landuse-basin|@waterbody": "",
"natural-water-pond|@waterbody": "",
"natural-water-lake|@waterbody": "",
"natural-water-reservoir|landuse-reservoir|@waterbody": "",
"waterway-river|waterway-stream|natural-water-river": "",
"waterway-canal": "",
"shop-car_repair": "",
"tourism-camp_site|@category_hotel": "",
"tourism-caravan_site|@category_rv||@category_hotel": "",
"office": "",
"office-company": "",
"office-government": "",
"office-lawyer": "",
"office-telecommunication": "",
"craft-beekeeper": "",
"craft-blacksmith": "",
"craft-brewery": "",
"craft-caterer": "",
"craft-carpenter": "",
"craft-confectionery": "",
"craft-electrician": "",
"craft-electronics_repair": "",
"craft-gardener": "",
"craft-grinding_mill": "",
"craft-handicraft": "",
"craft-hvac": "",
"craft-metal_construction": "",
"craft-key_cutter": "",
"craft-locksmith": "",
"craft-painter": "",
"craft-photographer": "",
"craft-plumber": "",
"craft-sawmill": "",
"craft-shoemaker": "",
"craft-winery": "",
"craft-tailor": "",
"area:highway-footway|area:highway-pedestrian|area:highway-steps|place-square": "",
"place-sea": "",
"place-ocean": "",
"@category_wifi": "",
"internet_access|internet_access-wlan|@category_wifi": "",
"natural-beach|natural-beach-sand|natural-beach-gravel|leisure-beach_resort": "",
"man_made-lighthouse": "",
"man_made-survey_point": "",
"man_made-flagpole": "",
"man_made-mast": "",
"man_made-communications_tower|man_made-tower-communication": "",
"man_made-petroleum_well": "",
"organic-only|organic-yes": "",
"shop-copyshop": "",
"shop-photo|@shop": "",
"shop-camera|@shop": "",
"shop-travel_agency": "",
"shop-outdoor|@shop": "",
"shop-dry_cleaning": "",
"shop-tyres|@shop": "",
"amenity-car_wash": "",
"man_made-telescope|man_made-telescope-optical|man_made-telescope-radio|man_made-telescope-gamma": "",
"man_made-observatory": "",
"amenity-veterinary": "",
"amenity-animal_shelter": "",
"@charging_station": "",
"amenity-charging_station|@charging_station": "",
"amenity-charging_station-bicycle|@charging_station": "",
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "",
"amenity-childcare": "",
"amenity-bicycle_parking": "",
"amenity-waste_basket": "",
"emergency-phone": "",
"leisure-fitness_centre": "",
"leisure-sauna": "",
"shop-car_repair-tyres|shop-car_repair": "",
"shop-chemist|@shop": "",
"shop-pet|@shop": "",
"tourism-zoo|@category_tourism|@category_children": "",
"attraction-animal": "",
"tourism-information-office|amenity-ranger_station|@category_tourism": "",
"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "",
"amenity-community_centre": "",
"amenity-compressed_air": "",
"amenity-courthouse": "",
"amenity-vending_machine": "",
"amenity-vending_machine-cigarettes": "",
"amenity-vending_machine-coffee": "",
"amenity-vending_machine-condoms": "",
"amenity-vending_machine-drinks": "",
"amenity-vending_machine-food|@category_food": "",
"amenity-vending_machine-parking_tickets|@category_parking": "",
"amenity-vending_machine-public_transport_tickets|@category_transport": "",
"amenity-vending_machine-newspapers": "",
"amenity-vending_machine-sweets": "",
"amenity-vending_machine-excrement_bags": "",
"amenity-parcel_locker|@category_post": "",
"shop-outpost": "",
"amenity-vending_machine-fuel|@category_fuel": "",
"building-garage": "",
"highway-rest_area|highway-services": "",
"man_made-chimney": "",
"man_made-crane": "",
"man_made-tower|man_made-flare": "",
"shop-bookmaker|@gambling": "",
"shop-seafood|@category_food|@shop": "",
"shop-second_hand|@category_shopping|@shop|@category_secondhand": "",
"shop-charity|@shop|@category_secondhand": "",
"shop-ticket": "",
"shop-wine|@category_food|@shop": "",
"shop-car_parts|@shop": "",
"tourism-chalet|@category_hotel": "",
"tourism-information-board": "",
"tourism-information-map": "",
"tourism-information-tactile_map": "",
"tourism-information-guidepost": "",
"aerialway-station": "",
"aeroway-helipad": "",
"barrier-border_control": "",
"leisure-water_park|@category_tourism|@category_children": "",
"man_made-water_tower": "",
"man_made-windmill": "",
"natural-cave_entrance": "",
"natural-volcano|@mountain": "",
"office-estate_agent": "",
"waterway-lock_gate": "",
"amenity-public_bookcase": "",
"sport-climbing": "",
"sport-yoga": "",
"leisure-fitness_centre-sport-yoga": "",
"tourism-apartment|@category_hotel": "",
"leisure-resort|@category_hotel": "",
"amenity-biergarten|@category_eat|@category_nightlife": "",
"amenity-driving_school": "",
"amenity-sailing_school": "",
"amenity-flight_school": "",
"amenity-prep_school": "",
"amenity-music_school": "",
"amenity-language_school": "",
"amenity-ice_cream": "",
"amenity-internet_cafe": "",
"amenity-motorcycle_parking": "",
"amenity-parking_space-disabled|@category_parking": "",
"amenity-car_pooling|@category_parking": "",
"amenity-nursing_home": "",
"amenity-payment_terminal": "",
"amenity-payment_centre": "",
"amenity-public_bath": "",
"amenity-shower": "",
"emergency-access_point": "",
"emergency-assembly_point": "",
"emergency-life_ring": "",
"emergency-defibrillator": "",
"emergency-fire_hydrant": "",
"amenity-hydrant": "",
"emergency-lifeguard": "",
"emergency-mountain_rescue": "",
"leisure-fitness_station": "",
"office-insurance": "",
"office-ngo": "",
"shop-erotic|@shop": "",
"shop-beauty-day_spa": "",
"shop-massage": "",
"shop-motorcycle|@shop": "",
"shop-motorcycle_repair": "",
"shop-newsagent": "",
"shop-pawnbroker": "",
"shop-stationery|@shop": "",
"shop-tattoo": "",
"shop-variety_store|@category_shopping|@shop": "",
"shop-video|@shop": "",
"shop-video_games|@shop": "",
"tourism-wilderness_hut|@category_hotel": "",
"tourism-gallery|@category_tourism": "",
"tourism-theme_park|@category_tourism|@category_children": "",
"boundary-national_park|@category_tourism": "",
"leisure-nature_reserve|@category_tourism": "",
"natural-cape": "",
"natural-geyser": "",
"natural-glacier|@category_tourism": "",
"highway-ford": "",
"leisure-marina": "",
"leisure-indoor_play": "",
"piste:type-downhill|piste:type-nordic": "",
"amenity-events_venue": "",
"shop-chocolate|@category_food|@shop": "",
"shop-coffee|@category_food|@shop": "",
"shop-fabric|@shop": "",
"shop-money_lender": "",
"shop-music|@shop": "",
"shop-musical_instrument|@shop": "",
"shop-tea|@shop": "",
"shop-telecommunication|@shop": "",
"shop-antiques|@category_shopping|@shop|@category_secondhand": "",
"shop-art|@category_shopping|@shop": "",
"shop-baby_goods|@category_children|@shop": "",
"shop-bag|@category_shopping|@shop": "",
"shop-cheese|@category_food|@shop": "",
"shop-dairy|@category_food|@shop": "",
"shop-electrical|@shop": "",
"shop-fishing|@shop": "",
"shop-interior_decoration|@shop": "",
"shop-lighting|@shop": "",
"shop-lottery|@gambling": "",
"shop-medical_supply|@shop": "",
"shop-nutrition_supplements|@shop": "",
"shop-paint|@shop": "",
"shop-perfumery|@category_shopping|@shop": "",
"shop-sewing|@shop": "",
"shop-storage_rental": "",
"shop-tobacco|@shop": "",
"shop-trade|@shop": "",
"shop-watches|@category_shopping|@shop": "",
"shop-wholesale|@shop": "",
"leisure-track": "",
"leisure-bandstand": "",
"power-plant": "",
"power-generator-wind": "",
"shop-auction|@category_secondhand": "",
"shop-collector|@category_shopping|@category_secondhand": "",
"man_made-cairn": "",
"wheelchair-yes": "",
"amenity-social_facility": "",
"social_facility-soup_kitchen": "",
"social_facility-food_bank": "",
"amenity-food_sharing": "",
"amenity-give_box": "",
"leisure-sports_hall": "",
"amenity-arts_centre|@category_tourism": "",
"amenity-prison": "",
"amenity-exhibition_centre": "",
"shop-bathroom_furnishing|@shop": "",
"shop-bed|@shop": "",
"shop-boutique|@shop": "",
"amenity-food_court": "",
"shop-curtain|@shop": "",
"shop-gas|@shop": "",
"shop-pet_grooming": "",
"shop-hifi|@shop": "",
"amenity-conference_centre": "",
"shop-herbalist|@shop": "",
"shop-appliance|@shop": "",
"shop-agrarian|@shop": "",
"shop-fashion_accessories|@shop": "",
"amenity-waste_transfer_station": "",
"shop-carpet|@shop": "",
"shop-craft|@shop": "",
"shop-pasta|@shop": "",
"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "",
"amenity-luggage_locker": "",
"office-security": "",
"building-guardhouse": ""
}
{}

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18" height="18" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="12" fill="#fff" opacity=".4"/>
<circle cx="12" cy="12" r="11" fill="#0d3c73"/>
<path d="m12 19.141c-2.6667 0-6-1.8076-6-6.141v-7.0295h4v6.9295c0 0.66086 0.66667 1.9 2 1.9 1.3333 0 2-1.0119 2-1.8v-7.0295h4v6.8295c0 4.5333-3.3333 6.341-6 6.341z" fill="#e7ecf1"/>
<svg viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<g>
<circle cx="12" cy="12" r="12" fill="#FFF" opacity=".4"/>
<circle cx="12" cy="12" r="11" fill="#0D3C73"/>
<path d="m12.7 19.1c-3.6 0.4-6.7-2.5-6.7-6.1v-8h4v7.9c0 0.8 0.5 1.6 1.3 1.9 1.4 0.4 2.7-0.5 2.7-1.8v-8h4v7.8c0 3.1-2.2 5.9-5.3 6.3z" fill="#FFF" opacity=".6"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 435 B

After

Width:  |  Height:  |  Size: 374 B

View File

@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14" height="14" version="1.1" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
<g stroke-width=".75">
<circle cx="9" cy="9" r="9" fill="#fff" opacity=".4"/>
<circle cx="9" cy="9" r="8.25" fill="#0d3c73"/>
<path d="m9 14.356c-2 0-4.5-1.3557-4.5-4.6057v-5.2722h3v5.1972c0 0.49565 0.5 1.425 1.5 1.425 1 0 1.5-0.75896 1.5-1.35v-5.2722h3v5.1222c0 3.4-2.5 4.7557-4.5 4.7557z" fill="#e7ecf1"/>
<svg viewBox="0 0 18 18" width="14" height="14" xmlns="http://www.w3.org/2000/svg">
<g>
<circle cx="9" cy="9" r="9" fill="#FFF" opacity=".4"/>
<circle cx="9" cy="9" r="8" fill="#0D3C73"/>
<path d="m5 4h3v6c0 0.57157 0.42843 1 1 1s1-0.42843 1-1v-6h3v6c0 2.2284-1.7716 4-4 4-2.2284 0-4-1.7716-4-4v-6z" fill="#FFF" opacity=".6"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 347 B

View File

@@ -1 +0,0 @@
<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="m6.70796435.16441116 2.91781369 1.20859801c.45330196.18776383.81344906.54791086 1.00121276 1.00121279l1.208598 2.91781371c.1877638.45330195.1877638.96262671 0 1.41592868l-1.208598 2.91781367c-.1877637.45330198-.5479108.81344908-1.00121276 1.00121278l-2.91781371 1.208598c-.45330195.1877638-.96262671.1877638-1.41592868 0l-2.91781367-1.208598c-.45330195-.1877637-.81344898-.5479108-1.00121281-1.00121276l-1.20859801-2.91781369c-.18776381-.45330196-.18776381-.96262674 0-1.4159287l1.20859801-2.91781369c.18776382-.45330196.54791083-.81344897 1.00121279-1.00121279l2.91781369-1.20859801c.45330196-.18776381.96262674-.18776381 1.4159287 0z" fill="#181715" fill-opacity=".5"/><path d="m6.57402515.487769 2.91781369 1.20859801c.36754213.15224093.65955326.44425202.81179416.81179415l1.208598 2.91781369c.1522409.36754213.1522409.78050817 0 1.1480503l-1.208598 2.91781369c-.1522409.36754213-.44425203.65955326-.81179416.81179416l-2.91781369 1.208598c-.36754213.1522409-.78050817.1522409-1.1480503 0l-2.91781369-1.208598c-.36754213-.1522409-.65955322-.44425203-.81179415-.81179416l-1.20859801-2.91781369c-.15224093-.36754213-.15224093-.78050817 0-1.1480503l1.20859801-2.91781369c.15224093-.36754213.44425202-.65955322.81179415-.81179415l2.91781369-1.20859801c.36754213-.15224093.78050817-.15224093 1.1480503 0z" fill="#202510" fill-rule="evenodd"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -70,7 +70,6 @@ node|z14-[natural=geyser],
node|z16-[natural=beach],
area|z14-[natural=bare_rock],
node|z17-[natural=rock],
node|z18-[natural=tree],
{text: name;text-color: @poi_label;text-position: center;text-offset: 1;}
node|z13-[natural=peak][!name],
@@ -207,9 +206,7 @@ node|z19-[man_made=water_well][drinking_water=not],
node|z19-[amenity=water_point][drinking_water=not],
{icon-image: drinking-water-no-m.svg;}
node|z18-[natural=tree][name],
{icon-image: tree-special-m.svg;}
node|z18-[natural=tree][!name],
node|z18-[natural=tree],
{icon-image: tree-m.svg;}
node|z18-[xmas:feature=tree],

View File

@@ -2436,7 +2436,7 @@ emergency-life_ring # icon z19- (also has captio
power-substation # icon z17- (also has caption(optional) z18-, area z13-)
=== -9990
natural-tree # icon z18- (also has caption(optional) z18-)
natural-tree # icon z18-
=== -9991
# amenity-bench # caption(optional) z19- (also has icon z18-)
@@ -2474,7 +2474,6 @@ entrance-service # icon z19- (also has captio
# man_made-survey_point # caption(optional) z18- (also has icon z18-)
# man_made-telescope # caption(optional) z18- (also has icon z18-)
# man_made-telescope-optical # caption(optional) z17- (also has icon z17-)
# natural-tree # caption(optional) z18- (also has icon z18-)
# power-substation # caption(optional) z18- (also has icon z17-, area z13-)
# tourism-information # caption(optional) z16- (also has icon z16-)
# tourism-information-board # caption(optional) z16- (also has icon z16-)

View File

@@ -1,2 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18" height="18" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="12" fill="#fff" opacity=".6"/><circle cx="12" cy="12" r="11" fill="#3b87c9"/><path d="m12 19.141c-2.6667 0-6-1.8076-6-6.141v-7.0295h4v6.9295c0 0.66086 0.66667 1.9 2 1.9 1.3333 0 2-1.0119 2-1.8v-7.0295h4v6.8295c0 4.5333-3.3333 6.341-6 6.341z" fill="#fff"/></svg>
<svg viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<g>
<circle cx="12" cy="12" r="12" fill="#FFF" opacity=".6"/>
<circle cx="12" cy="12" r="11" fill="#1565C0"/>
<path d="m12.7 19.1c-3.6 0.4-6.7-2.5-6.7-6.1v-8h4v7.9c0 0.8 0.5 1.6 1.3 1.9 1.4 0.4 2.7-0.5 2.7-1.8v-8h4v7.8c0 3.1-2.2 5.9-5.3 6.3z" fill="#FFF"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 446 B

After

Width:  |  Height:  |  Size: 361 B

View File

@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14" height="14" version="1.1" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
<g stroke-width=".75">
<circle cx="9" cy="9" r="9" fill="#fff" opacity=".6"/>
<circle cx="9" cy="9" r="8.25" fill="#3b87c9"/>
<path d="m9 14.356c-2 0-4.5-1.3557-4.5-4.6057v-5.2722h3v5.1972c0 0.49565 0.5 1.425 1.5 1.425 1 0 1.5-0.75896 1.5-1.35v-5.2722h3v5.1222c0 3.4-2.5 4.7557-4.5 4.7557z" fill="#fff"/>
<svg viewBox="0 0 18 18" width="14" height="14" xmlns="http://www.w3.org/2000/svg">
<g>
<circle cx="9" cy="9" r="9" fill="#FFF" opacity=".6"/>
<circle cx="9" cy="9" r="8" fill="#1565C0"/>
<path d="m5 4h3v6c0 0.57157 0.42843 1 1 1s1-0.42843 1-1v-6h3v6c0 2.2284-1.7716 4-4 4-2.2284 0-4-1.7716-4-4v-6z" fill="#FFF"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 334 B

View File

@@ -1 +0,0 @@
<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path d="m6.70796435.16441116 2.91781369 1.20859801c.45330196.18776383.81344906.54791086 1.00121276 1.00121279l1.208598 2.91781371c.1877638.45330195.1877638.96262671 0 1.41592868l-1.208598 2.91781367c-.1877637.45330198-.5479108.81344908-1.00121276 1.00121278l-2.91781371 1.208598c-.45330195.1877638-.96262671.1877638-1.41592868 0l-2.91781367-1.208598c-.45330195-.1877637-.81344898-.5479108-1.00121281-1.00121276l-1.20859801-2.91781369c-.18776381-.45330196-.18776381-.96262674 0-1.4159287l1.20859801-2.91781369c.18776382-.45330196.54791083-.81344897 1.00121279-1.00121279l2.91781369-1.20859801c.45330196-.18776381.96262674-.18776381 1.4159287 0z" fill="#f5eada" fill-opacity=".5"/><path d="m6.57402515.487769 2.91781369 1.20859801c.36754213.15224093.65955326.44425202.81179416.81179415l1.208598 2.91781369c.1522409.36754213.1522409.78050817 0 1.1480503l-1.208598 2.91781369c-.1522409.36754213-.44425203.65955326-.81179416.81179416l-2.91781369 1.208598c-.36754213.1522409-.78050817.1522409-1.1480503 0l-2.91781369-1.208598c-.36754213-.1522409-.65955322-.44425203-.81179415-.81179416l-1.20859801-2.91781369c-.15224093-.36754213-.15224093-.78050817 0-1.1480503l1.20859801-2.91781369c.15224093-.36754213.44425202-.65955322.81179415-.81179415l2.91781369-1.20859801c.36754213-.15224093.78050817-.15224093 1.1480503 0z" fill="#a2ba4e" fill-rule="evenodd"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -2442,7 +2442,7 @@ emergency-life_ring # icon z19- (also has captio
power-substation # icon z17- (also has caption(optional) z18-, area z13-)
=== -9990
natural-tree # icon z18- (also has caption(optional) z18-)
natural-tree # icon z18-
=== -9991
# amenity-bench # caption(optional) z19- (also has icon z18-)
@@ -2480,7 +2480,6 @@ entrance-service # icon z19- (also has captio
# man_made-survey_point # caption(optional) z15- (also has icon z14-)
# man_made-telescope # caption(optional) z18- (also has icon z18-)
# man_made-telescope-optical # caption(optional) z17- (also has icon z17-)
# natural-tree # caption(optional) z18- (also has icon z18-)
# power-substation # caption(optional) z18- (also has icon z17-, area z13-)
# tourism-information # caption(optional) z15- (also has icon z15-)
# tourism-information-board # caption(optional) z15- (also has icon z15-)

View File

@@ -57,8 +57,6 @@ TagMapping const kMotorCarTagMapping = {
{OsmElement::Tag("motorcar", "private"), RoadAccess::Type::Private},
{OsmElement::Tag("motorcar", "destination"), RoadAccess::Type::Destination},
{OsmElement::Tag("motorcar", "permit"), RoadAccess::Type::Permit},
{OsmElement::Tag("service", "parking_aisle"), RoadAccess::Type::Destination},
{OsmElement::Tag("amenity", "parking_entrance"), RoadAccess::Type::Destination},
};
TagMapping const kMotorVehicleTagMapping = {
@@ -136,6 +134,8 @@ TagMapping const kDefaultTagMapping = {
{OsmElement::Tag("access", "agricultural"), RoadAccess::Type::Private},
{OsmElement::Tag("access", "forestry"), RoadAccess::Type::Private},
{OsmElement::Tag("locked", "yes"), RoadAccess::Type::Locked},
{OsmElement::Tag("service", "parking_aisle"), RoadAccess::Type::Private},
{OsmElement::Tag("amenity", "parking_entrance"), RoadAccess::Type::Private},
};
// Removed secondary, tertiary from car list. Example https://www.openstreetmap.org/node/8169922700

View File

@@ -59,7 +59,6 @@ NS_SWIFT_NAME(FrameworkHelper)
+ (void)updatePlacePageData;
+ (void)updateAfterDeleteBookmark;
+ (int)currentZoomLevel;
+ (void)setCarScreenMode:(BOOL)enabled;
@end

View File

@@ -241,8 +241,4 @@
return [[ElevationProfileData alloc] initWithElevationInfo:GetFramework().GetTrackRecordingElevationInfo()];
}
+ (void)setCarScreenMode:(BOOL)enabled {
GetFramework().SetCarScreenMode(enabled);
}
@end

View File

@@ -62,8 +62,6 @@ final class CarPlayService: NSObject {
toWindow: window,
isCarplayActivated: true
)
FrameworkHelper.setCarScreenMode(true)
}
private var savedInterfaceController: CPInterfaceController?
@@ -128,7 +126,6 @@ final class CarPlayService: NSObject {
isCarplayActivated: false
)
}
FrameworkHelper.setCarScreenMode(false)
}
@objc func destroy() {
@@ -626,32 +623,22 @@ extension CarPlayService: CarPlayRouterListener {
extension CarPlayService: LocationModeListener {
func processMyPositionStateModeEvent(_ mode: MWMMyPositionMode) {
currentPositionMode = mode
// 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)
guard let rootMapTemplate = rootMapTemplate,
let info = rootMapTemplate.userInfo as? MapInfo,
info.type == CPConstants.TemplateType.main else {
return
}
switch mode {
case .follow, .followAndRotate:
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,7 +5,6 @@ final class MapTemplateBuilder {
case startPanning
case zoomIn
case zoomOut
case myPositionMode
}
enum BarButtonType {
case dismissPaning
@@ -70,10 +69,7 @@ final class MapTemplateBuilder {
let zoomOutButton = buildMapButton(type: .zoomOut) { _ in
FrameworkHelper.zoomMap(.out)
}
let myPositionModeButton = buildMapButton(type: .myPositionMode) { _ in
FrameworkHelper.switchMyPositionMode()
}
mapTemplate.mapButtons = [myPositionModeButton, panningButton, zoomInButton, zoomOutButton]
mapTemplate.mapButtons = [panningButton, zoomInButton, zoomOutButton]
let settingsButton = buildBarButton(type: .settings) { _ in
let gridTemplate = SettingsTemplateBuilder.buildGridTemplate()
@@ -103,10 +99,7 @@ final class MapTemplateBuilder {
let panningButton = buildMapButton(type: .startPanning) { _ in
mapTemplate.showPanningInterface(animated: true)
}
let myPositionModeButton = buildMapButton(type: .myPositionMode) { _ in
FrameworkHelper.switchMyPositionMode()
}
mapTemplate.mapButtons = [myPositionModeButton, panningButton]
mapTemplate.mapButtons = [panningButton]
setupMuteAndRedirectButtons(template: mapTemplate)
let endButton = buildBarButton(type: .endRoute) { _ in
CarPlayService.shared.cancelCurrentTrip()
@@ -124,28 +117,6 @@ 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()
@@ -195,8 +166,6 @@ 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) {
@@ -207,8 +176,6 @@ 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

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

View File

@@ -5120,7 +5120,7 @@
"@executable_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 2026.01.01;
MARKETING_VERSION = 2025.06.01;
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = app.comaps.debug;
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -5155,7 +5155,7 @@
"@executable_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 2026.01.01;
MARKETING_VERSION = 2025.06.01;
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = app.comaps;
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -5213,7 +5213,7 @@
"@executable_path/../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 2026.01.01;
MARKETING_VERSION = 2025.06.01;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
PRODUCT_BUNDLE_IDENTIFIER = app.comaps.debug.widgetextension;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -5243,7 +5243,7 @@
"@executable_path/../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 2026.01.01;
MARKETING_VERSION = 2025.06.01;
PRODUCT_BUNDLE_IDENTIFIER = app.comaps.widgetextension;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";

View File

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

View File

@@ -175,16 +175,6 @@ void Framework::OnLocationUpdate(GpsInfo const & info)
#endif
m_routingManager.OnLocationUpdate(rInfo);
bool const isRoutingActive = m_routingManager.IsRoutingActive();
if (m_wasRoutingActive != isRoutingActive)
{
m_wasRoutingActive = isRoutingActive;
/// State changed (Started OR Stopped) -> Refresh 3D Buildings
Refresh3dMode();
}
}
void Framework::OnCompassUpdate(CompassInfo const & info)
@@ -2434,10 +2424,6 @@ void Framework::Allow3dMode(bool allow3d, bool allow3dBuildings)
if (!m_powerManager.IsFacilityEnabled(power_management::Facility::Buildings3d))
allow3dBuildings = false;
/// If we are in CarPlay/AA mode and Navigation is active, force 3D buildings off.
if (m_isCarScreenMode && m_routingManager.IsRoutingActive())
allow3dBuildings = false;
m_drapeEngine->Allow3dMode(allow3d, allow3dBuildings);
}
@@ -3238,7 +3224,6 @@ void Framework::OnRouteFollow(routing::RouterType type)
// 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 */);
Refresh3dMode();
}
// RoutingManager::Delegate
@@ -3307,25 +3292,3 @@ void Framework::OnPowerSchemeChanged(power_management::Scheme const actualScheme
if (actualScheme == power_management::Scheme::EconomyMaximum && GetTrafficManager().IsEnabled())
GetTrafficManager().SetEnabled(false);
}
void Framework::SetCarScreenMode(bool enabled)
{
if (m_isCarScreenMode == enabled)
return;
m_isCarScreenMode = enabled;
bool allow3d, allow3dBuildings;
Load3dMode(allow3d, allow3dBuildings);
Allow3dMode(allow3d, allow3dBuildings);
}
void Framework::Refresh3dMode()
{
bool allow3d = true;
bool allow3dBuildings = true;
/// Load User Preferences and apply logic
Load3dMode(allow3d, allow3dBuildings);
Allow3dMode(allow3d, allow3dBuildings);
}

View File

@@ -769,13 +769,4 @@ public:
// PowerManager::Subscriber override.
void OnPowerFacilityChanged(power_management::Facility const facility, bool enabled) override;
void OnPowerSchemeChanged(power_management::Scheme const actualScheme) override;
public:
/// Call this from iOS/Android when CarPlay/AA session starts/ends
void SetCarScreenMode(bool enabled);
bool m_isCarScreenMode = false;
private:
void Refresh3dMode();
bool m_wasRoutingActive = false;
};

View File

@@ -458,7 +458,7 @@ private:
positionsAccessConditional.clear();
auto openingHoursDeserializer = GetOpeningHoursSerDesForRouting();
auto const size = ReadPrimitiveFromSource<uint64_t>(src);
auto const size = ReadPrimitiveFromSource<size_t>(src);
positionsAccessConditional.reserve(size);
uint32_t prevFeatureId = 0;