Compare commits

..

1 Commits

Author SHA1 Message Date
zyphlar
5aaf5aa378 VIBECODED: idea for marking which roads have Panoramax imagery
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-12-14 10:55:33 -08:00
74 changed files with 636 additions and 842 deletions

View File

@@ -4,7 +4,6 @@ import android.location.Location;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import app.organicmaps.MwmActivity;
@@ -27,10 +26,6 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
{
private static boolean sAutodownloadLocked;
private static final int HIDE_THRESHOLD = 2;
// Default bundles (e.g., world/coasts). Used to approximate “user-downloaded” count.
private static final int DEFAULT_MAP_BASELINE = 2;
private final MwmActivity mActivity;
private final View mFrame;
private final MaterialTextView mParent;
@@ -38,7 +33,6 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
private final MaterialTextView mSize;
private final WheelProgressView mProgress;
private final MaterialButton mButton;
private final View mOfflineExplanation;
private int mStorageSubscriptionSlot;
@@ -49,10 +43,8 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
@Override
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
{
if (mCurrentCountry == null) {
updateOfflineExplanationVisibility();
if (mCurrentCountry == null)
return;
}
for (MapManager.StorageCallbackData item : data)
{
@@ -66,7 +58,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
{
mCurrentCountry.update();
updateProgressState(false);
updateOfflineExplanationVisibility();
return;
}
}
@@ -109,12 +101,6 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
return enqueued || progress || applying;
}
private void updateOfflineExplanationVisibility() {
if (mOfflineExplanation == null) return;
// hide once threshold reached; safe to call repeatedly.
app.organicmaps.util.UiUtils.showIf(MapManager.nativeGetDownloadedCount() < (DEFAULT_MAP_BASELINE + HIDE_THRESHOLD), mOfflineExplanation);
}
private void updateProgressState(boolean shouldAutoDownload)
{
updateStateInternal(shouldAutoDownload);
@@ -122,8 +108,6 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
private void updateStateInternal(boolean shouldAutoDownload)
{
updateOfflineExplanationVisibility();
boolean showFrame =
(mCurrentCountry != null && !mCurrentCountry.present && !RoutingController.get().isNavigating());
if (showFrame)
@@ -207,9 +191,6 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
mProgress = controls.findViewById(R.id.wheel_downloader_progress);
mButton = controls.findViewById(R.id.downloader_button);
mOfflineExplanation = mFrame.findViewById(R.id.offline_explanation);
updateOfflineExplanationVisibility();
mProgress.setOnClickListener(v -> {
if (mCurrentCountry == null)
return;
@@ -266,7 +247,6 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
public void onResume()
{
updateOfflineExplanationVisibility();
if (mStorageSubscriptionSlot == 0)
{
mStorageSubscriptionSlot = MapManager.nativeSubscribe(mStorageCallback);

View File

@@ -1,10 +1,7 @@
package app.organicmaps.editor;
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.base.BaseMwmRecyclerFragment;
import app.organicmaps.sdk.editor.Editor;
@@ -14,7 +11,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
@@ -36,23 +32,10 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
Set<String> existingLanguages =
args != null ? new HashSet<>(args.getStringArrayList(EXISTING_LOCALIZED_NAMES)) : new HashSet<>();
Configuration config = requireContext().getResources().getConfiguration();
LocaleListCompat systemLocales = ConfigurationCompat.getLocales(config);
List<Language> languages = new ArrayList<>();
List<Language> systemLanguages = new ArrayList<>();
for (Language lang : Editor.nativeGetSupportedLanguages(false))
{
// Separately extract system languages
for (int i = 0; i < systemLocales.size(); i++)
{
Locale locale = systemLocales.get(i);
if (locale != null && locale.getLanguage().equals(lang.code))
systemLanguages.add(lang);
}
if (existingLanguages.contains(lang.code) || systemLanguages.contains(lang))
if (existingLanguages.contains(lang.code))
continue;
languages.add(lang);
@@ -60,8 +43,6 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
Collections.sort(languages, Comparator.comparing(lhs -> lhs.name));
languages.addAll(0, systemLanguages);
return new LanguagesAdapter(this, languages.toArray(new Language[languages.size()]));
}

View File

@@ -1,6 +1,5 @@
package app.organicmaps.editor;
import android.content.res.ColorStateList;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
@@ -12,7 +11,6 @@ import androidx.annotation.IdRes;
import androidx.annotation.IntRange;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R;
@@ -383,29 +381,6 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
final boolean enable = mComplementItem != null && mComplementItem.weekdays.length != 0;
final String text = mFragment.getString(R.string.editor_time_add);
mAdd.setEnabled(enable);
final ColorStateList bgButtonColor = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
mAdd.getContext(), R.color.base_accent),
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_disabled)
});
final ColorStateList textButtonColor = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
mAdd.getContext(),
UiUtils.getStyledResourceId(mAdd.getContext(), android.R.attr.textColorPrimaryInverse)),
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_text_disabled)
});
mAdd.setBackgroundTintList(bgButtonColor);
mAdd.setTextColor(textButtonColor);
mAdd.setText(enable ? text + " (" + TimeFormatUtils.formatWeekdays(mComplementItem) + ")" : text);
}
}

View File

@@ -1,49 +0,0 @@
package app.organicmaps.widget.placepage;
import java.time.ZonedDateTime;
import java.time.format.TextStyle;
import java.util.Locale;
public class OpenStateTextFormatter
{
private OpenStateTextFormatter() {}
static String formatHoursMinutes(int hour, int minute, boolean use24h)
{
if (use24h)
return String.format(Locale.ROOT, "%02d:%02d", hour, minute);
int h = hour % 12;
if (h == 0) h = 12;
String ampm = (hour < 12) ? "AM" : "PM";
return String.format(Locale.ROOT, "%d:%02d %s", h, minute, ampm);
}
static boolean isSameLocalDate(ZonedDateTime a, ZonedDateTime b)
{
return a.toLocalDate().isEqual(b.toLocalDate());
}
static String dayShort(ZonedDateTime t, Locale locale)
{
return t.getDayOfWeek().getDisplayName(TextStyle.SHORT, locale);
}
static String buildAtLabel(
boolean opens,
boolean isToday,
String dayShort,
String time,
String opensAtLocalized,
String closesAtLocalized,
String opensDayAtLocalized,
String closesDayAtLocalized
)
{
if (isToday)
return opens ? String.format(Locale.ROOT, opensAtLocalized, time) // Opens at %s
: String.format(Locale.ROOT, closesAtLocalized, time); // Closes at %s
return opens ? String.format(Locale.ROOT, opensDayAtLocalized, dayShort, time) // Opens %s at %s
: String.format(Locale.ROOT, closesDayAtLocalized, dayShort, time); // Closes %s at %s
}
}

View File

@@ -85,11 +85,9 @@ import com.google.android.material.textview.MaterialTextView;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
public class PlacePageView extends Fragment
implements View.OnClickListener, View.OnLongClickListener, LocationListener, SensorListener, Observer<MapObject>,
@@ -107,10 +105,6 @@ public class PlacePageView extends Fragment
private static final String LINKS_FRAGMENT_TAG = "LINKS_FRAGMENT_TAG";
private static final String TRACK_SHARE_MENU_ID = "TRACK_SHARE_MENU_ID";
private static final int SHORT_HORIZON_CLOSE_MIN = 60;
private static final int SHORT_HORIZON_OPEN_MIN = 15;
private static final List<CoordinatesFormat> visibleCoordsFormat =
Arrays.asList(CoordinatesFormat.LatLonDMS, CoordinatesFormat.LatLonDecimal, CoordinatesFormat.OLCFull,
CoordinatesFormat.UTM, CoordinatesFormat.MGRS, CoordinatesFormat.OSMLink);
@@ -803,95 +797,57 @@ public class PlacePageView extends Fragment
final String ohStr = mMapObject.getMetadata(Metadata.MetadataType.FMD_OPEN_HOURS);
final Timetable[] timetables = OpeningHours.nativeTimetablesFromString(ohStr);
// No valid timetable
if (timetables == null || timetables.length == 0)
if (timetables != null && timetables.length != 0)
{
UiUtils.hide(mTvOpenState);
return;
}
final Context context = requireContext();
final OhState poiState = OpeningHours.nativeCurrentState(timetables);
final Context context = requireContext();
final OhState poiState = OpeningHours.nativeCurrentState(timetables);
// Ignore unknown rule state
if (poiState.state == OhState.State.Unknown)
{
UiUtils.hide(mTvOpenState);
return;
}
// Get colours
final ForegroundColorSpan colorGreen =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
final ForegroundColorSpan colorYellow =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
final ForegroundColorSpan colorRed = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_red));
// Get next state info
final SpannableStringBuilder openStateString = new SpannableStringBuilder();
final boolean isOpen = (poiState.state == OhState.State.Open); // False == Closed due to early exit for Unknown
final long nextStateTime = isOpen ? poiState.nextTimeClosed : poiState.nextTimeOpen; // Unix time (seconds)
final long nowSec = System.currentTimeMillis() / 1000;
final int minsToNextState = (int) ((nextStateTime - nowSec) / 60);
// NOTE: Timezone is currently device timezone. TODO: use feature-specific timezone.
final ZonedDateTime nextChangeLocal =
ZonedDateTime.ofInstant(Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault());
String localizedTimeString = OpenStateTextFormatter.formatHoursMinutes(
nextChangeLocal.getHour(), nextChangeLocal.getMinute(), DateUtils.is24HourFormat(context));
final boolean shortHorizonClosing = isOpen && minsToNextState >= 0 && minsToNextState <= SHORT_HORIZON_CLOSE_MIN;
final boolean shortHorizonOpening = !isOpen && minsToNextState >= 0 && minsToNextState <= SHORT_HORIZON_OPEN_MIN;
if (shortHorizonClosing || shortHorizonOpening) // POI Opens/Closes in 60 mins • at 18:00
{
final String minsToChangeStr = getResources().getQuantityString(
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
final String nextChangeFormatted = getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
openStateString.append(nextChangeFormatted, colorYellow, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("") // Add spacer
.append(getString(R.string.at, localizedTimeString));
}
else
{
final String opensAtStr = getString(R.string.opens_at); // "Opens at %s"
final String closesAtStr = getString(R.string.closes_at); // "Closes at %s"
final String opensDayAtStr = getString(R.string.opens_day_at); // "Opens %1$s at %2$s"
final String closesDayAtStr = getString(R.string.closes_day_at); // "Closes %1$s at %2$s"
final boolean isToday =
OpenStateTextFormatter.isSameLocalDate(nextChangeLocal, ZonedDateTime.now(nextChangeLocal.getZone()));
// Full weekday name per design feedback.
final String dayName =
nextChangeLocal.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
if (isOpen) // > 60 minutes OR negative (safety). Show “Open now • Closes at 18:00”
// Ignore unknown rule state
if (poiState.state == OhState.State.Unknown)
{
UiUtils.hide(mTvOpenState);
return;
}
// Get colours
final ForegroundColorSpan colorGreen =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
final ForegroundColorSpan colorYellow =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
final ForegroundColorSpan colorRed = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_red));
// Get next state info
final SpannableStringBuilder openStateString = new SpannableStringBuilder();
final boolean isOpen = (poiState.state == OhState.State.Open); // False == Closed due to early exit for Unknown
final long nextStateTime = isOpen ? poiState.nextTimeClosed : poiState.nextTimeOpen; // Unix time (seconds)
final int minsToNextState = (int) ((nextStateTime - (System.currentTimeMillis() / 1000)) / 60);
if (minsToNextState <= 60) // POI opens/closes in 60 mins
{
final String minsToChangeStr = minsToNextState + " " + getString(R.string.minute);
final String nextChangeFormatted = getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
final ForegroundColorSpan nextChangeColor = isOpen ? colorYellow : colorRed;
// TODO: We should check closed/open time for specific feature's timezone.
ZonedDateTime time = ZonedDateTime.ofInstant(Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault());
String localizedTime =
new HoursMinutes(time.getHour(), time.getMinute(), DateUtils.is24HourFormat(context)).toString();
openStateString.append(nextChangeFormatted, nextChangeColor, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("") // Add spacer
.append(getString(R.string.at, localizedTime));
}
else if (isOpen)
openStateString.append(getString(R.string.open_now), colorGreen, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
final String atLabel =
OpenStateTextFormatter.buildAtLabel(false, isToday, dayName, localizedTimeString,
opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
if (!TextUtils.isEmpty(atLabel))
openStateString.append("").append(atLabel);
}
// TODO: Add "Closes at 18:00" etc
else // Closed
{
openStateString.append(getString(R.string.closed_now), colorRed, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// TODO: Add "Opens at 18:00" etc
final String atLabel =
OpenStateTextFormatter.buildAtLabel(true, isToday, dayName, localizedTimeString,
opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
if (!TextUtils.isEmpty(atLabel))
openStateString.append("").append(atLabel);
}
UiUtils.setTextAndHideIfEmpty(mTvOpenState, openStateString);
return;
}
UiUtils.setTextAndHideIfEmpty(mTvOpenState, openStateString);
// No valid timetable
UiUtils.hide(mTvOpenState);
}
private void addPlace()

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M80,360v-160q0,-33 23.5,-56.5T160,120h640q33,0 56.5,23.5T880,200v160h-80v-160L160,200v160L80,360ZM160,720q-33,0 -56.5,-23.5T80,640v-200h80v200h640v-200h80v200q0,33 -23.5,56.5T800,720L160,720ZM40,840v-80h880v80L40,840ZM480,420ZM80,440v-80h240q11,0 21,6t15,16l47,93 123,-215q5,-9 14,-14.5t20,-5.5q11,0 21,5.5t15,16.5l49,98h235v80L620,440q-11,0 -21,-5.5T584,418l-26,-53 -123,215q-5,10 -15,15t-21,5q-11,0 -20.5,-6T364,578l-69,-138L80,440Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M480,840q-150,0 -255,-105T120,480q0,-150 105,-255t255,-105q14,0 27.5,1t26.5,3q-41,29 -65.5,75.5T444,300q0,90 63,153t153,63q55,0 101,-24.5t75,-65.5q2,13 3,26.5t1,27.5q0,150 -105,255T480,840ZM480,760q88,0 158,-48.5T740,585q-20,5 -40,8t-40,3q-123,0 -209.5,-86.5T364,300q0,-20 3,-40t8,-40q-78,32 -126.5,102T200,480q0,116 82,198t198,82ZM470,490Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?colorControlNormal">
<path
android:pathData="M19,9h-4v-6h-6v6h-4l7,7 7,-7ZM5,18v2h14v-2h-14Z"
android:fillColor="#FFF"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M216,784q-45,-45 -70.5,-104T120,558q0,-63 24,-124.5T222,318q35,-35 86.5,-60t122,-39.5Q501,204 591.5,201t202.5,7q8,106 5,195t-16.5,160.5q-13.5,71.5 -38,125T684,778q-53,53 -112.5,77.5T450,880q-65,0 -127,-25.5T216,784ZM328,768q29,17 59.5,24.5T450,800q46,0 91,-18.5t86,-59.5q18,-18 36.5,-50.5t32,-85Q709,534 716,459.5t2,-177.5q-49,-2 -110.5,-1.5T485,290q-61,9 -116,29t-90,55q-45,45 -62,89t-17,85q0,59 22.5,103.5T262,714q42,-80 111,-153.5T534,440q-72,63 -125.5,142.5T328,768ZM328,768ZM328,768Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M200,800v-280h-80v-80h240v80h-80v280h-80ZM200,360v-200h80v200h-80ZM360,360v-80h80v-120h80v120h80v80L360,360ZM440,800v-360h80v360h-80ZM680,800v-120h-80v-80h240v80h-80v120h-80ZM680,520v-360h80v360h-80Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M280,920q-33,0 -56.5,-23.5T200,840v-720q0,-33 23.5,-56.5T280,40h400q33,0 56.5,23.5T760,120v124q18,7 29,22t11,34v80q0,19 -11,34t-29,22v404q0,33 -23.5,56.5T680,920L280,920ZM280,840h400v-720L280,120v720ZM280,840v-720,720ZM394,640h172q14,0 24,-10t10,-24v-132q0,-14 -10,-24t-24,-10h-6v-40q0,-33 -23.5,-56.5T480,320q-33,0 -56.5,23.5T400,400v40h-6q-14,0 -24,10t-10,24v132q0,14 10,24t24,10ZM440,440v-40q0,-17 11.5,-28.5T480,360q17,0 28.5,11.5T520,400v40h-80Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M339,698q22,-22 49.5,-36t58.5,-19q-5,19 -8,38t-3,39q0,24 3.5,47t11.5,44L339,698ZM254,614 L170,528q62,-62 142,-95t168,-33q49,0 96,10.5t90,30.5q-44,8 -81.5,29T517,522q-9,-1 -18.5,-1.5T480,520q-64,0 -122.5,24.5T254,614ZM84,444 L0,360q95,-97 219.5,-148.5T480,160q136,0 260.5,51.5T960,360l-84,84q-79,-79 -181.5,-121.5T480,280q-112,0 -214.5,42.5T84,444ZM760,520 L772,580q12,5 22.5,10.5T816,604l58,-18 40,68 -46,40q2,12 2,26t-2,26l46,40 -40,68 -58,-18q-11,8 -21.5,13.5T772,860l-12,60h-80l-12,-60q-12,-5 -22.5,-10.5T624,836l-58,18 -40,-68 46,-40q-2,-12 -2,-26t2,-26l-46,-40 40,-68 58,18q11,-8 21.5,-13.5T668,580l12,-60h80ZM720,640q-33,0 -56.5,23.5T640,720q0,33 23.5,56.5T720,800q33,0 56.5,-23.5T800,720q0,-33 -23.5,-56.5T720,640Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M480,480q-66,0 -113,-47t-47,-113q0,-66 47,-113t113,-47q66,0 113,47t47,113q0,66 -47,113t-113,47ZM160,800v-112q0,-34 17.5,-62.5T224,582q62,-31 126,-46.5T480,520q66,0 130,15.5T736,582q29,15 46.5,43.5T800,688v112L160,800ZM240,720h480v-32q0,-11 -5.5,-20T700,654q-54,-27 -109,-40.5T480,600q-56,0 -111,13.5T260,654q-9,5 -14.5,14t-5.5,20v32ZM480,400q33,0 56.5,-23.5T560,320q0,-33 -23.5,-56.5T480,240q-33,0 -56.5,23.5T400,320q0,33 23.5,56.5T480,400ZM480,320ZM480,720Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="m798,638 l-62,-62q44,-41 69,-97t25,-119q0,-63 -25,-118t-69,-96l62,-64q56,53 89,125t33,153q0,81 -33,153t-89,125ZM670,510l-64,-64q18,-17 29,-38.5t11,-47.5q0,-26 -11,-47.5T606,274l64,-64q32,29 50,67.5t18,82.5q0,44 -18,82.5T670,510ZM360,520q-66,0 -113,-47t-47,-113q0,-66 47,-113t113,-47q66,0 113,47t47,113q0,66 -47,113t-113,47ZM40,840v-112q0,-33 17,-62t47,-44q51,-26 115,-44t141,-18q77,0 141,18t115,44q30,15 47,44t17,62v112L40,840ZM120,760h480v-32q0,-11 -5.5,-20T580,694q-36,-18 -92.5,-36T360,640q-71,0 -127.5,18T140,694q-9,5 -14.5,14t-5.5,20v32ZM360,440q33,0 56.5,-23.5T440,360q0,-33 -23.5,-56.5T360,280q-33,0 -56.5,23.5T280,360q0,33 23.5,56.5T360,440ZM360,360ZM360,760Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M360,440h80v-160h-80v160ZM480,440h80v-160h-80v160ZM600,440h80v-160h-80v160ZM240,880q-33,0 -56.5,-23.5T160,800v-480l240,-240h320q33,0 56.5,23.5T800,160v640q0,33 -23.5,56.5T720,880L240,880ZM240,800h480v-640L434,160L240,354v446ZM240,800h480,-480Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M13.26,3C8.17,2.86 4,6.95 4,12L2.21,12c-0.45,0 -0.67,0.54 -0.35,0.85l2.79,2.8c0.2,0.2 0.51,0.2 0.71,0l2.79,-2.8c0.31,-0.31 0.09,-0.85 -0.36,-0.85L6,12c0,-3.9 3.18,-7.05 7.1,-7 3.72,0.05 6.85,3.18 6.9,6.9 0.05,3.91 -3.1,7.1 -7,7.1 -1.61,0 -3.1,-0.55 -4.28,-1.48 -0.4,-0.31 -0.96,-0.28 -1.32,0.08 -0.42,0.42 -0.39,1.13 0.08,1.49C9,20.29 10.91,21 13,21c5.05,0 9.14,-4.17 9,-9.26 -0.13,-4.69 -4.05,-8.61 -8.74,-8.74zM12.75,8c-0.41,0 -0.75,0.34 -0.75,0.75v3.68c0,0.35 0.19,0.68 0.49,0.86l3.12,1.85c0.36,0.21 0.82,0.09 1.03,-0.26 0.21,-0.36 0.09,-0.82 -0.26,-1.03l-2.88,-1.71v-3.4c0,-0.4 -0.34,-0.74 -0.75,-0.74z"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M480,560q-33,0 -56.5,-23.5T400,480q0,-33 23.5,-56.5T480,400q33,0 56.5,23.5T560,480q0,33 -23.5,56.5T480,560ZM480,840q-139,0 -241,-91.5T122,520h82q14,104 92.5,172T480,760q117,0 198.5,-81.5T760,480q0,-117 -81.5,-198.5T480,200q-69,0 -129,32t-101,88h110v80L120,400v-240h80v94q51,-64 124.5,-99T480,120q75,0 140.5,28.5t114,77q48.5,48.5 77,114T840,480q0,75 -28.5,140.5t-77,114q-48.5,48.5 -114,77T480,840Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M2,20h20v-4h-20v4ZM4,17h2v2h-2v-2ZM2,4v4h20v-4h-20ZM6,7h-2v-2h2v2ZM2,14h20v-4h-20v4ZM4,11h2v2h-2v-2Z"
android:fillColor="#FFF"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M160,720q-33,0 -56.5,-23.5T80,640v-320q0,-33 23.5,-56.5T160,240h640q33,0 56.5,23.5T880,320v320q0,33 -23.5,56.5T800,720L160,720ZM160,640h640v-320L680,320v160h-80v-160h-80v160h-80v-160h-80v160h-80v-160L160,320v320ZM280,480h80,-80ZM440,480h80,-80ZM600,480h80,-80ZM480,480Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M280,800v-520L80,280v-120h520v120L400,280v520L280,800ZM640,800v-320L520,480v-120h360v120L760,480v320L640,800Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480h80q0,115 72.5,203T418,794l-58,-58 56,-56L598,862q-29,10 -58.5,14T480,880ZM500,600v-240h120q17,0 28.5,11.5T660,400v160q0,17 -11.5,28.5T620,600L500,600ZM300,600v-60h100v-40h-60v-40h60v-40L300,420v-60h120q17,0 28.5,11.5T460,400v160q0,17 -11.5,28.5T420,600L300,600ZM560,540h40v-120h-40v120ZM800,480q0,-115 -72.5,-203T542,166l58,58 -56,56 -182,-182q29,-10 58.5,-14t59.5,-4q83,0 156,31.5T763,197q54,54 85.5,127T880,480h-80Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="m476,880 l182,-480h84L924,880h-84l-43,-122L603,758L560,880h-84ZM160,760l-56,-56 202,-202q-35,-35 -63.5,-80T190,320h84q20,39 40,68t48,58q33,-33 68.5,-92.5T484,240L40,240v-80h280v-80h80v80h280v80L564,240q-21,72 -63,148t-83,116l96,98 -30,82 -122,-125 -202,201ZM628,688h144l-72,-204 -72,204Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="m476,880 l182,-480h84L924,880h-84l-43,-122L603,758L560,880h-84ZM628,688h144l-72,-204 -72,204ZM254,640q-66,0 -123.5,-38.5T44,498l72,-36q21,42 58,70t79,28q38,0 62.5,-23.5T340,480q0,-33 -23.5,-56.5T260,400h-60v-80h60q25,0 42.5,-17.5T320,260q0,-25 -17,-42.5T261,200q-23,0 -41,15t-32,33l-63,-49q26,-32 60,-55.5t77,-23.5q57,0 97.5,40.5T400,259q0,27 -10,52.5T361,357q10,10 18.5,20.5T396,400h124v-200h-80v-80h240v80h-80v116l-61,164L420,480v4q0,63 -46,109.5T254,640Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?colorControlNormal">
<path
android:pathData="M480,840 L0,359q93,-93 215.5,-146T480,160q142,0 264.5,53T960,359l-56,57q-81,-81 -190,-128.5T480,240q-103,0 -195,32.5T117,363l419,420 -56,57ZM864,800L761,698q-18,11 -38,16.5t-43,5.5q-68,0 -114,-46t-46,-114q0,-68 46,-114t114,-46q68,0 114,46t46,114q0,23 -5.5,43T818,641l102,103 -56,56ZM680,640q34,0 57,-23t23,-57q0,-34 -23,-57t-57,-23q-34,0 -57,23t-23,57q0,34 23,57t57,23ZM480,783Z"
android:fillColor="#fff"/>
</vector>

View File

@@ -26,33 +26,27 @@
android:clipChildren="false"
android:gravity="center"
tools:ignore="UselessParent">
<LinearLayout
android:id="@+id/offline_explanation"
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/offline_explanation_title"/>
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="normal"
android:textAppearance="@style/MwmTextAppearance.Body1"
android:text="@string/offline_explanation_text"/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="@dimen/margin_quarter"
android:layout_marginBottom="@dimen/margin_quarter"/>
</LinearLayout>
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/offline_explanation_title"/>
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="normal"
android:textAppearance="@style/MwmTextAppearance.Body1"
android:text="@string/offline_explanation_text"/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="@dimen/margin_quarter"
android:layout_marginBottom="@dimen/margin_quarter"/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/downloader_parent"
android:layout_width="wrap_content"

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/margin_base_plus"
@@ -11,7 +12,9 @@
style="@style/MwmWidget.M3.Button.Primary"
android:layout_gravity="center"
android:enabled="false"
android:textColor="?android:textColorPrimaryInverse"
android:text="@string/editor_time_add" />
android:background="?accentButtonBackground"
android:padding="@dimen/margin_base"
android:text="@string/editor_time_add"
app:backgroundTint="@null"/>
</FrameLayout>

View File

@@ -17,34 +17,29 @@
android:layout_gravity="center"
android:gravity="center_horizontal"
android:background="@drawable/onmap_downloader_background">
<LinearLayout
android:id="@+id/offline_explanation"
android:layout_width="match_parent"
<com.google.android.material.textview.MaterialTextView
android:layout_width="@dimen/square_block_size"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/offline_explanation_title"/>
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="212dp"
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="normal"
android:textAppearance="@style/MwmTextAppearance.Body1"
android:text="@string/offline_explanation_text"/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="@dimen/margin_quarter"
android:layout_marginBottom="@dimen/margin_quarter"/>
</LinearLayout>
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/offline_explanation_title"/>
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="212dp"
android:layout_marginBottom="@dimen/margin_eighth"
android:gravity="center_horizontal"
android:textStyle="normal"
android:textAppearance="@style/MwmTextAppearance.Body1"
android:text="@string/offline_explanation_text"/>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="@dimen/margin_quarter"
android:layout_marginBottom="@dimen/margin_quarter"/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/downloader_parent"
android:layout_width="@dimen/square_block_size"

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Items in the Preferences can have space reserved for an icon. As none of the
settings currently have associated icons, this leads to items that seem indented
without purpose. This wastes space and can lead to truncation of the item names
and descriptions. See https://github.com/organicmaps/organicmaps/issues/1872
To rectify this, the iconSpaceReserved property needs to be set to false.
According to https://developer.android.com/reference/android/preference/Preference#attr_android:iconSpaceReserved
false should be the default. However, according to
https://material.io/design/platform-guidance/android-settings.html this goes
against the material design guidelines and the default was overridden to true in
https://cs.android.com/android/platform/superproject/+/android-9.0.0_r1:prebuilts/sdk/current/support/v7/preference/res/values-sw360dp-v13/values-sw360dp-v13.xml
This file sets the default value back to false (i.e. no space reserved for icons).
See also the discussion at https://github.com/organicmaps/organicmaps/pull/1924
-->
<resources xmlns:tools="http://schemas.android.com/tools">
<bool name="config_materialPreferenceIconSpaceReserved" tools:ignore="MissingDefaultResource">false</bool>
</resources>

View File

@@ -441,14 +441,6 @@
<string name="opens_in">Opens in %s</string>
<string name="closes_in">Closes in %s</string>
<string name="closed">Closed</string>
<string name="opens_at">Opens at %s</string>
<string name="closes_at">Closes at %s</string>
<string name="opens_day_at">Opens on %1$s at %2$s</string>
<string name="closes_day_at">Closes on %1$s at %2$s</string>
<plurals name="minutes_short">
<item quantity="one">%d min</item>
<item quantity="other">%d min</item>
</plurals>
<!-- Used in the opening_hours fragment for the last checked date, eg. "Confirmed two weeks ago" -->
<string name="hours_confirmed_time_ago">Confirmed %s</string>
<!-- Used on the place page for the last checked date, eg. "Existence confirmed two weeks ago" -->

View File

@@ -1,29 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="backup_location"
android:summary="@string/pref_backup_location_summary_initial"
android:title="@string/pref_backup_location_title"
app:iconSpaceReserved="false" />
android:title="@string/pref_backup_location_title" />
<Preference
android:key="backup_now"
android:summary="@string/pref_backup_now_summary"
android:title="@string/pref_backup_now_title"
app:iconSpaceReserved="false" />
android:title="@string/pref_backup_now_title" />
<ListPreference
android:defaultValue="86400000"
android:entries="@array/backup_interval_entries"
android:entryValues="@array/backup_interval_values"
android:key="backup_history_interval"
android:title="@string/pref_backup_interval_title"
app:iconSpaceReserved="false" />
android:title="@string/pref_backup_interval_title" />
<ListPreference
android:defaultValue="10"
android:entries="@array/backup_history_entries"
android:entryValues="@array/backup_history_values"
android:key="backup_history_count"
android:title="@string/pref_backup_history_title"
app:iconSpaceReserved="false" />
android:title="@string/pref_backup_history_title" />
</PreferenceScreen>

View File

@@ -7,7 +7,6 @@
<Preference
android:key="@string/pref_osm_profile"
android:title="@string/profile"
app:icon="@drawable/ic_profile"
tools:summary="LongLongUsernameHere"
app:singleLineTitle="false"
android:order="1"/>
@@ -18,7 +17,6 @@
<ListPreference
android:key="@string/pref_munits"
android:title="@string/measurement_units"
app:icon="@drawable/ic_straighten"
app:singleLineTitle="false"
android:summary="@string/measurement_units_summary"
android:entries="@array/measument_units"
@@ -44,7 +42,6 @@
<SwitchPreferenceCompat
android:key="@string/pref_autodownload"
android:title="@string/autodownload"
app:icon="@drawable/ic_download_st"
app:singleLineTitle="false"
android:order="5"/>
<SwitchPreferenceCompat
@@ -52,26 +49,22 @@
android:title="@string/big_font"
app:singleLineTitle="false"
android:defaultValue="false"
app:icon="@drawable/ic_text_fields"
android:order="6"/>
<SwitchPreferenceCompat
android:key="@string/pref_transliteration"
android:title="@string/transliteration_title"
app:singleLineTitle="false"
app:icon="@drawable/ic_translate_indic"
android:defaultValue="false"
android:order="7"/>
<Preference
android:key="@string/pref_storage"
android:title="@string/maps_storage"
app:icon="@drawable/ic_sd_card"
app:singleLineTitle="false"
android:summary="@string/maps_storage_summary"
android:order="8"/>
<SwitchPreferenceCompat
android:key="@string/pref_enable_logging"
android:title="@string/enable_logging"
app:icon="@drawable/ic_browse_activity"
app:singleLineTitle="false"
android:summary="@string/enable_logging_warning_message"
android:defaultValue="false"
@@ -87,7 +80,6 @@
android:key="@string/pref_use_mobile_data"
android:title="@string/mobile_data"
app:singleLineTitle="false"
app:icon="@drawable/ic_network_manage"
android:summary="@string/mobile_data_description"
android:entries="@array/mobile_data_options"
android:entryValues="@array/mobile_data_options_values"
@@ -99,7 +91,6 @@
android:summary="@string/power_managment_description"
android:entries="@array/power_management_scheme"
android:entryValues="@array/power_management_scheme_values"
app:icon="@drawable/ic_eco"
android:order="15"/>
<SwitchPreferenceCompat
android:key="@string/pref_keep_screen_on"
@@ -111,7 +102,6 @@
<SwitchPreferenceCompat
android:key="@string/pref_show_on_lock_screen"
android:title="@string/enable_show_on_lock_screen"
app:icon="@drawable/ic_mobile_lock_portrait"
app:singleLineTitle="false"
android:summary="@string/enable_show_on_lock_screen_description"
android:defaultValue="true"
@@ -119,7 +109,6 @@
<Preference
android:key="@string/pref_map_locale"
android:title="@string/change_map_locale"
app:icon="@drawable/ic_translate"
app:singleLineTitle="false"
android:persistent="false"
android:order="18"/>
@@ -127,7 +116,6 @@
android:key="@string/pref_backup"
android:title="@string/pref_backup_title"
android:summary="@string/pref_backup_summary"
app:icon="@drawable/ic_settings_backup_restore"
app:singleLineTitle="false"
android:persistent="false"
android:order="19"/>
@@ -140,14 +128,12 @@
<ListPreference
android:key="@string/pref_map_style"
android:title="@string/pref_map_style_title"
app:icon="@drawable/ic_dark_mode"
app:singleLineTitle="false"
android:entries="@array/map_style"
android:order="1"/>
<SwitchPreferenceCompat
android:key="@string/pref_3d"
android:title="@string/pref_map_3d_title"
app:icon="@drawable/ic_three_d_rotation"
app:singleLineTitle="false"
android:order="2"/>
<SwitchPreferenceCompat
@@ -160,14 +146,12 @@
android:title="@string/pref_tts_enable_title"
app:singleLineTitle="false"
android:persistent="false"
app:icon="@drawable/ic_record_voice_over"
android:order="4">
</Preference>
<PreferenceScreen
android:key="@string/prefs_routing"
android:order="5"
android:title="@string/driving_options_title"
app:icon="@drawable/ic_instant_mix">
android:title="@string/driving_options_title">
<intent
android:targetClass="app.organicmaps.settings.DrivingOptionsActivity"
android:targetPackage="@string/app_id">
@@ -183,14 +167,12 @@
android:key="@string/pref_play_services"
android:title="@string/google_play_services"
app:singleLineTitle="false"
app:icon="@drawable/ic_wifi_find"
android:summary="@string/pref_use_google_play"
android:defaultValue="true"
android:order="1"/>
<SwitchPreferenceCompat
android:key="@string/pref_search_history"
android:title="@string/search_history_title"
app:icon="@drawable/ic_search_recent_st"
app:singleLineTitle="false"
android:defaultValue="true"
android:order="2"/>

View File

@@ -5,54 +5,45 @@
<SwitchPreferenceCompat
android:key="@string/pref_tts_enabled"
android:title="@string/pref_tts_enable_title"
app:iconSpaceReserved="false"/>
android:title="@string/pref_tts_enable_title" />
<SwitchPreferenceCompat
android:key="@string/pref_tts_street_names"
android:title="@string/pref_tts_street_names_title"
app:isPreferenceVisible="false"
android:summary="@string/pref_tts_street_names_description"
android:defaultValue="false"
app:iconSpaceReserved="false"/>
android:defaultValue="false" />
<ListPreference
android:key="@string/pref_tts_language"
app:isPreferenceVisible="false"
android:title="@string/pref_tts_language_title"
app:iconSpaceReserved="false"/>
android:title="@string/pref_tts_language_title" />
<SeekBarPreference
android:key="@string/pref_tts_volume"
app:isPreferenceVisible="false"
android:title="@string/volume"
app:iconSpaceReserved="false"/>
android:title="@string/volume" />
<Preference
android:key="@string/pref_tts_test_voice"
app:isPreferenceVisible="false"
android:title="@string/pref_tts_test_voice_title"
app:iconSpaceReserved="false"/>
android:title="@string/pref_tts_test_voice_title" />
<Preference
android:key="@string/pref_tts_open_system_settings"
android:title="@string/pref_tts_open_system_settings"
app:iconSpaceReserved="false"/>
android:title="@string/pref_tts_open_system_settings" />
<Preference
android:enabled="false"
android:key="@string/pref_tts_info"
android:persistent="false"
android:selectable="false"
android:summary="@string/prefs_languages_information"
app:iconSpaceReserved="false" />
android:summary="@string/prefs_languages_information" />
<Preference
android:enabled="true"
android:key="@string/pref_tts_info_link"
android:persistent="false"
android:selectable="true"
android:summary="@string/prefs_languages_information_off_link"
app:iconSpaceReserved="false" />
android:summary="@string/prefs_languages_information_off_link" />
<ListPreference
android:key="@string/pref_tts_speed_cameras"
android:title="@string/speedcams_alert_title"
app:singleLineTitle="false"
android:entries="@array/speed_cameras"
android:entryValues="@array/speed_cameras_values"
android:defaultValue="@string/auto_enum_value"
app:iconSpaceReserved="false" />
android:defaultValue="@string/auto_enum_value" />
</androidx.preference.PreferenceScreen>

View File

@@ -1,72 +0,0 @@
package app.organicmaps.widget.placepage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Locale;
public class OpenStateTextFormatterTest
{
private static final String OPENS_AT = "Opens at %s";
private static final String CLOSES_AT = "Closes at %s";
private static final String OPENS_DAY_AT = "Opens %1$s at %2$s";
private static final String CLOSES_DAY_AT = "Closes %1$s at %2$s";
@Test
public void formatHoursMinutes_24h()
{
assertEquals("09:00", OpenStateTextFormatter.formatHoursMinutes(9, 0, true));
assertEquals("18:05", OpenStateTextFormatter.formatHoursMinutes(18, 5, true));
}
@Test
public void formatHoursMinutes_12h()
{
assertEquals("9:00 AM", OpenStateTextFormatter.formatHoursMinutes(9, 0, false));
assertEquals("6:05 PM", OpenStateTextFormatter.formatHoursMinutes(18, 5, false));
assertEquals("12:00 PM", OpenStateTextFormatter.formatHoursMinutes(12, 0, false));
assertEquals("12:00 AM", OpenStateTextFormatter.formatHoursMinutes(0, 0, false));
}
@Test
public void buildAtLabel_today_open_close()
{
String open = OpenStateTextFormatter.buildAtLabel(true, true, "Sat", "09:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
String close = OpenStateTextFormatter.buildAtLabel(false, true, "Sat", "18:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
assertEquals("Opens at 09:00", open);
assertEquals("Closes at 18:00", close);
}
@Test
public void buildAtLabel_other_day()
{
String open = OpenStateTextFormatter.buildAtLabel(true, false, "Sat", "09:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
String close = OpenStateTextFormatter.buildAtLabel(false, false, "Tue", "18:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
assertEquals("Opens Sat at 09:00", open);
assertEquals("Closes Tue at 18:00", close);
}
@Test
public void isSameLocalDate_and_dayShort_helpers()
{
ZonedDateTime a = ZonedDateTime.of(2025, 3, 1, 10, 0, 0, 0, ZoneId.of("Europe/Paris"));
ZonedDateTime b = ZonedDateTime.of(2025, 3, 1, 22, 0, 0, 0, ZoneId.of("Europe/Paris"));
ZonedDateTime c = a.plusDays(1);
assertTrue(OpenStateTextFormatter.isSameLocalDate(a, b));
assertFalse(OpenStateTextFormatter.isSameLocalDate(a, c));
String day = OpenStateTextFormatter.dayShort(c, Locale.US);
// March 2, 2025 is a Sunday; "Sun" in US locale
assertEquals("Sun", day);
}
}

View File

@@ -337,9 +337,7 @@
<string name="type.cuisine.vegetarian">Vegetarisch</string>
<string name="type.cuisine.vietnamese">Vietnamesisch</string>
<string name="type.emergency">Notfall</string>
<string name="type.emergency.access_point">Rettungspunkt</string>
<string name="type.emergency.assembly_point">Notfall-Sammelpunkt</string>
<string name="type.emergency.life_ring">Rettungsring</string>
<string name="type.emergency.defibrillator">Defibrillator</string>
<string name="type.emergency.fire_hydrant">Hydrant</string>
<string name="type.emergency.phone">Notruftelefon</string>

View File

@@ -371,9 +371,7 @@
<string name="type.cuisine.vegetarian">Vegetarian</string>
<string name="type.cuisine.vietnamese">Vietnamese</string>
<string name="type.emergency">Emergency</string>
<string name="type.emergency.access_point">Emergency Rescue Point</string>
<string name="type.emergency.assembly_point">Emergency Assembly Point</string>
<string name="type.emergency.life_ring">Lifebuoy</string>
<string name="type.emergency.defibrillator">Defibrillator</string>
<string name="type.emergency.fire_hydrant">Fire Hydrant</string>
<string name="type.emergency.phone">Emergency Phone</string>
@@ -1236,7 +1234,6 @@
<string name="type.shop.kitchen">Kitchen Store</string>
<string name="type.shop.laundry">Laundry</string>
<string name="type.shop.mall">Mall</string>
<string name="type.shop.beauty.day_spa">Day Spa</string>
<string name="type.shop.massage">Massage Salon</string>
<string name="type.shop.mobile_phone">Mobile Phone Store</string>
<string name="type.shop.money_lender">Money Lender</string>

View File

@@ -397,9 +397,7 @@
"amenity-payment_terminal": "Bezahlterminal",
"amenity-public_bath": "Öffentliches Bad",
"amenity-shower": "Dusche",
"emergency-access_point": "4Rettungspunkt|Notfallpunkt|Notfall-Rettungspunkt|Notfall-Treffpunkt",
"emergency-assembly_point": "Notfall-Sammelpunkt",
"emergency-life_ring": "4Rettungsring",
"emergency-defibrillator": "4Defibrillator",
"emergency-fire_hydrant": "4Hydrant",
"emergency-lifeguard": "Notfall-Rettungsschwimmer|Rettungsschwimmer",

View File

@@ -2,28 +2,28 @@
"@category_eat": "Where to eat|eat|Food",
"@category_food": "4Groceries|Grocery|Food",
"@category_transport": "5Transport",
"@category_fuel": "2Gas|4Gasoline|3Petrol|4Diesel|3Fuel",
"@category_fuel": "2Gas|Gasoline|3Petrol|4Diesel|3Fuel",
"@category_parking": "4Parking",
"@category_shopping": "4Shopping|shops",
"@category_hotel": "3Hotel|hotels|4Accomodations|accommodation|sleep",
"@category_shopping": "4Shopping",
"@category_hotel": "Hotel|hotels",
"@category_tourism": "3Sights|3Attractions|3Tourism",
"@category_entertainment": "4Entertainment",
"@category_nightlife": "4Nightlife",
"@category_children": "4Family holiday|children|kid|kids|babies|family|family friendly",
"@category_entertainment": "Entertainment",
"@category_nightlife": "Nightlife",
"@category_children": "Family holiday",
"@category_atm": "ATM|Cash machine",
"@category_rv": "2RV Facilities|RV|4Caravan|Vanlife|5Campervan|5Motorhome|camper",
"amenity-atm|@category_atm": "money|cash|U+1F3E7|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7",
"@category_rv": "2RV Facilities|4Caravan|Vanlife|5Campervan|5Motorhome",
"amenity-atm|@category_atm": "money|U+1F3E7|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7",
"@category_bank": "3Bank",
"@category_secondhand": "4Second Hand|second-hand|vintage|5Vintage shop|4Thrift store|5Resale shop|6Opportunity shop|4Used-goods|thrift|thrifting",
"@category_secondhand": "4Second Hand",
"amenity-bank|@category_bank": "money|U+1F3E6|U+1F4B0|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7",
"@category_recycling": "4Recycling|Waste utilization|Waste disposal|Recyclables|Separate garbage collection|Waste sorting|Reuse",
"amenity-bureau_de_change": "3Currency Exchange|3exchange|money|U+1F4B1|U+1F4B2|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7",
"amenity-studio": "5Media studio|studio",
"amenity-studio": "Media Studio|Studio",
"amenity-bar|amenity-pub|@category_eat|@category_nightlife": "2Bar|2pub|beer|drink|U+1F37A|U+1F37B|U+1F376|tavern|bars and pubs|brew pub|cocktail lounge",
"amenity-cafe|@category_eat": "3Cafe|U+2615|U+1F356|U+1F357|U+1F35A|U+1F35B|U+1F35C|U+1F35D|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|U+1F377|U+1F60B|U+1F375|coffee|cafeteria",
"amenity-fast_food|@category_eat": "4Fast Food|takeaway|U+1F354|U+1F355|U+1F35F|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|food to go|junk food",
"amenity-restaurant|@category_eat": "3Restaurant|U+1F356|U+1F357|U+1F35A|U+1F35B|U+1F35C|U+1F35D|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|U+1F377|U+1F60B",
"amenity-fuel|@category_fuel": "3Gas station|4Petrol station|3Filling station|fill up|U+26FD",
"amenity-fuel|@category_fuel": "Gas Station|Petrol Station|3Filling Station|U+26FD",
"@shop": "Shop|Store|U+1F3EA|U+1F3EC",
"shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "3Bakery|3Pastry|Cake|3Cakes|U+1F35E",
"shop|@shop": "",
@@ -34,13 +34,13 @@
"shop-farm|@category_food|@shop": "Farm food",
"shop-garden_centre|@shop": "4Garden Centre|U+1F3E1",
"shop-grocery|@category_food|@shop": "Grocery",
"shop-health_food|@category_food|@shop": "7Health food|7Healthy food|healthfood|organic|vegan|vegetarian",
"shop-hearing_aids|@shop": "7Hearing Aids",
"shop-health_food|@category_food|@shop": "Health food",
"shop-hearing_aids|@shop": "Hearing Aids",
"shop-mobile_phone|@shop": "4Cell Phones|4Mobile Phones|6smartphones|electronics store|U+1F4F1|U+1F4F2",
"shop-florist|@shop": "4Florist|U+1F337|U+1F338|U+1F339|U+1F33A|U+1F33B|U+1F33C|U+1F490|U+1F33E|4flowers|flower shop|floral shop|floral arrangements|same day flowers|bouquet",
"shop-butcher|@category_food|@shop": "4Butcher|meat|U+1F356|U+1F357",
"shop-butcher|@category_food|@shop": "4Butcher|U+1F356|U+1F357",
"shop-furniture|@shop": "4Furniture",
"shop-kitchen|@shop": "4Kitchen|Kitchen Studio|kitchenware",
"shop-kitchen|@shop": "Kitchen|Kitchen Studio",
"shop-alcohol|@category_food|@shop": "4liquor|4alcohol|U+1F377",
"shop-books|@shop": "Bookstore|bookshop|3books|U+1F4D6|U+1F4DA|U+1F4D9|U+1F4D8|U+1F4D7|U+1F4D5",
"shop-shoes|@category_shopping|@shop": "Shoe|U+1F461|U+1F460|U+1F462|U+1F45E|U+1F45F|3shoes|4footwear",
@@ -48,95 +48,95 @@
"shop-hardware|shop-doityourself|@shop": "4Hardware|4Home Improvement|DIY|U+1F529|U+1F528|do it yourself|do-it-yourself",
"shop-houseware|@shop": "4Housewares",
"shop-jewelry|@category_shopping|@shop": "4Jewelry|U+1F48D",
"shop-optician|@shop": "4Optician|glasses|sunglasses|U+1F453",
"shop-gift|@category_shopping|@shop": "Gift|U+1F381|souvenir|souvenirs|3gifts|presents|4Souvenir shop|gift shop|giftshop",
"shop-beauty": "4Beauty Shop|beautician|U+1F484|beauty salon|beauty parlor|nail salon|coloring",
"shop-optician|@shop": "4Optician|U+1F453",
"shop-gift|@category_shopping|@shop": "Gift|U+1F381|souvenir|4souvenirs|3gifts|presents",
"shop-beauty": "4Beauty Shop|barber|beautician|hairdresser|hairdressing|haircut|U+1F484|beauty salon|hair salon|beauty parlor|hair and nail salon|nail salon|coloring",
"shop-greengrocer|@category_food|@shop": "4Greengrocer|U+1F345|U+1F346|U+1F33D|U+1F360|U+1F348|U+1F347|U+1F349|U+1F34A|U+1F34C|U+1F34D|U+1F34E|U+1F34F|U+1F350|U+1F351|U+1F353",
"shop-sports|@category_shopping|@shop": "4Sports Goods|U+1F3BF|U+1F3A3|U+1F3C2|U+1F6B4|U+26BD|U+1F3C0|U+1F3C8|U+26BE|U+1F3BE|U+1F3C9|U+26F3",
"shop-supermarket|@category_food|@shop": "3Supermarket",
"shop-mall|@category_shopping|@shop": "3Mall|Gallery|shopping arcade|entertainment center|retail",
"shop-department_store|@category_shopping|@shop": "4Department|department store",
"shop-mall|@category_shopping|@shop": "Mall|Gallery|shopping arcade|entertainment center|retail",
"shop-department_store|@category_shopping|@shop": "4Department",
"shop-beverages|@category_food|@shop": "4Beverages|4drinks|U+1F379",
"shop-computer|@shop": "4Computer shop|computer|computers|U+1F4BB",
"shop-computer|@shop": "4Computer|U+1F4BB",
"shop-confectionery|craft-confectionery|@category_food|@shop": "4Sweets|4confectionery|candies|candy|U+1F36C|U+1F36D|sweetshop|tuck|Confectioner",
"shop-laundry": "4Laundry|Laundrette|laundromat",
"shop-toys|@category_children|@shop": "Toy|toyshop|kids|toys|kids toys",
"amenity-marketplace|@category_food": "3Marketplace|market",
"amenity-mobile_money_agent": "6Mobile Money Agent|mobile money",
"amenity-money_transfer": "5Money Transfer",
"shop-clothes|@category_shopping|@shop": "3Clothes|U+1F45A|U+1F457|U+1F456|U+1F455|clothing|apparel|wear|fashion|garments ",
"shop-caravan|@category_rv|@shop": "2RV dealership|4Caravan dealership|5Motorhome dealership",
"shop-car|@shop": "3Car Dealership|4Auto Dealer|U+1F697|U+1F698|U+1F699",
"shop-bicycle|@shop": "4Bicycle|Bike|7Cycling shop|cycles|bikes|U+1F6B2|U+1F6B4|U+1F6B5",
"amenity-mobile_money_agent": "Mobile Money Agent|mobile money",
"amenity-money_transfer": "Money Transfer",
"shop-clothes|@category_shopping|@shop": "3Clothes|U+1F45A|U+1F457|U+1F456|U+1F455|clothing|wear",
"shop-caravan|@category_rv|@shop": "2RV dealership|4Caravan dealership|Motorhome dealership",
"shop-car|@shop": "3Car Dealership|Auto Dealer|U+1F697|U+1F698|U+1F699",
"shop-bicycle|@shop": "4Bicycle|Bike|cycles|bikes|U+1F6B2|U+1F6B4|U+1F6B5",
"shop-kiosk": "3Kiosk|U+1F4F0",
"highway-bus_stop|@category_transport": "2Bus Stop|bus|stop|U+1F68C|U+1F68F|U+1F68E|U+1F690",
"railway-tram_stop|@category_transport": "3Tram Stop|tram|stop|U+1F683",
"amenity-bus_station|@category_transport": "2Bus Station|bus|U+1F68C|U+1F68F|U+1F68D",
"railway-station|railway-halt|building-train_station|@category_transport": "3Train Station|trainstation|4railway|railroad|4station|U+1F684|U+1F685|U+1F689|U+1F682|U+1F686|U+1F688|U+1F68A|U+1F68B|Rail Halt",
"railway-station-funicular": "4Funicular",
"railway-station-subway|@category_transport": "3Subway Station|subway|3tube|3metro|3underground|U+1F687",
"railway-station-funicular": "Funicular",
"railway-station-subway|@category_transport": "3Subway Station|3tube|3metro|3underground|U+1F687",
"amenity-ferry_terminal|@category_transport": "3Ferry|terminal|U+1F6A2|U+1F6A4|U+2693",
"amenity-taxi|@category_transport": "Taxi|3Taxi Stand|Taxi Rank|U+1F695|U+1F696",
"amenity-taxi|@category_transport": "3Taxi|Taxi Stand|Taxi Rank|U+1F695|U+1F696",
"amenity-townhall": "3Town Hall|townhall|city hall|guildhall|village hall|4municipal hall|civic centre",
"tourism-attraction|@category_tourism": "4Attraction|U+1F3A0|U+1F3A1|U+1F3A2|U+1F3AA",
"tourism-artwork": "3Artwork|U+1F3A8",
"tourism-viewpoint|@category_tourism": "4Viewpoint|Vista",
"tourism-information": "4Tourist Information|4information|U+1F481",
"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Picnic Site|picnic|Barbecue Grill|Picnic Table|bbq|Barbec",
"amenity-place_of_worship": "5Place of Worship|3temple|U+1F64F",
"amenity-place_of_worship-christian": "4Church|place of worship|temple|4cathedral|basilica|christianity|U+1F64F|U+26EA|U+271D|U+2626",
"amenity-place_of_worship-muslim": "4Mosque|tekke|place of worship|temple|islam|U+1F64F|U+262A|U+1F54B|U+1F54C|U+262A",
"amenity-place_of_worship-buddhist": "3Temple|place of worship|4buddist temple|4buddhism|U+1F64F|U+26EA|U+2638",
"amenity-place_of_worship-hindu": "3Temple|place of worship|4hindu temple|4hinduism|U+1F64F|U+1F549",
"amenity-place_of_worship-shinto": "Shrine|place of worship|3temple|4shinto temple|4shinto|U+1F64F|U+26E9",
"amenity-place_of_worship-jewish": "4Synagogue|place of worship|3temple|judaism|U+1F64F|U+1F54D|U+2721",
"amenity-place_of_worship-taoist": "3Temple|place of worship|4taoism|4taoist temple|U+1F64F|U+262F",
"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Picnic Site|Barbecue Grill|Picnic Table",
"amenity-place_of_worship": "Place of Worship|3temple|U+1F64F",
"amenity-place_of_worship-christian": "4Church|place of worship|temple|4cathedral|basilica|U+1F64F|U+26EA|U+271D|U+2626",
"amenity-place_of_worship-muslim": "4Mosque|tekke|place of worship|temple|U+1F64F|U+262A|U+1F54B|U+1F54C|U+262A",
"amenity-place_of_worship-buddhist": "3Temple|place of worship|U+1F64F|U+26EA|U+2638",
"amenity-place_of_worship-hindu": "3Temple|place of worship|U+1F64F|U+1F549",
"amenity-place_of_worship-shinto": "Shrine|place of worship|3temple|U+1F64F|U+26E9",
"amenity-place_of_worship-jewish": "4Synagogue|place of worship|temple|U+1F64F|U+1F54D|U+2721",
"amenity-place_of_worship-taoist": "3Temple|place of worship|U+1F64F|U+262F",
"tourism-museum|@category_tourism": "2Museum|U+1F3A8|3exhibition|3gallery",
"waterway-waterfall|@category_tourism": "2Waterfall",
"historic-archaeological_site|@category_tourism": "4Archaeological Site",
"historic-battlefield": "Battlefield",
"historic-stone": "Historic stone",
"historic-boundary_stone": "Boundary stone",
"historic-stone": "Historic Stone",
"historic-boundary_stone": "Boundary Stone",
"historic-castle|@category_tourism": "4Castle|4Palace|4Fortress|U+1F3EF|U+1F3F0|U+1F451|U+1F478|Hillfort|Kremlin|Manor house",
"historic-city_gate|@category_tourism": "4City gate",
"historic-citywalls|@category_tourism": "4City wall",
"historic-city_gate|@category_tourism": "City gate",
"historic-citywalls|@category_tourism": "City Wall",
"historic-fort|@category_tourism": "Fort",
"historic-gallows|@category_tourism": "Gallows",
"historic-memorial|@category_tourism": "4Memorial|monument|U+1F5FC|U+1F5FD|U+1F5FF",
"historic-memorial-cross": "Memorial cross",
"historic-memorial-plaque": "Commemorative plaque",
"historic-memorial-sculpture|@category_tourism": "5Sculpture",
"historic-memorial-statue|@category_tourism": "3Statue",
"historic-memorial-sculpture|@category_tourism": "Sculpture",
"historic-memorial-statue|@category_tourism": "Statue",
"historic-memorial-stolperstein": "Stolperstein",
"historic-memorial-war_memorial|@category_tourism": "War memorial",
"historic-monument|@category_tourism": "4Monument|U+1F5FD|U+1F5FF",
"historic-pillory|@category_tourism": "Pillory",
"historic-cannon": "Cannon",
"historic-anchor": "4Historic anchor",
"historic-ruins|@category_tourism": "4Historic ruins|3Ruins|U+1F5FF",
"historic-mine": "4Historic mine",
"historic-anchor": "Historic Anchor",
"historic-ruins|@category_tourism": "4Historic Ruins|3Ruins|U+1F5FF",
"historic-mine": "Historic Mine",
"historic-ship|@category_tourism": "Ship|boat",
"historic-wreck": "Shipwreck",
"historic-locomotive|@category_tourism": "4Historic locomotive",
"historic-tank|@category_tourism": "4Historic tank",
"historic-aircraft|@category_tourism": "4Historic aircraft",
"historic-locomotive|@category_tourism": "Historic Locomotive",
"historic-tank|@category_tourism": "Historic Tank",
"historic-aircraft|@category_tourism": "Historic Aircraft",
"historic-tomb|@category_tourism": "Tomb|grave|memorial",
"man_made-cross": "Cross",
"historic-wayside_cross": "Wayside cross",
"historic-wayside_shrine": "Wayside shrine",
"leisure-dog_park": "Dog area|3Dog park",
"leisure-dog_park": "3Dog area|Dog park",
"leisure-dance|@category_entertainment": "4Dance|Dancing school",
"leisure-garden": "3Garden",
"leisure-firepit": "5Firepit",
"amenity-bench|amenity-bench-backless": "Bench",
"amenity-boat_rental": "4Boat rental|boat|boats|3Rental",
"amenity-bicycle_rental": "4Bicycle rental|cycling|cycle|bike|3Rental|U+1F6B2|U+1F6B4|U+1F6B5|bicycle hire|bike rental",
"amenity-bicycle_repair_station": "4Bicycle repair station|cycle|bike|4repair of bicycles",
"amenity-car_sharing": "Car Share|3carsharing|car|sharing|U+1F697|U+1F698|U+1F699|carsharing services|car sharing|4rideshare",
"amenity-car_rental": "3Car rental|car|rental|U+1F697|U+1F698|U+1F699|car hire|rent a car|auto rental|vehicle rent",
"amenity-motorcycle_rental": "4Motorcycle rental|bike|hire|4scooter|4Rental motorcycles|motorcycles",
"amenity-cinema|@category_entertainment": "3Cinema|3Movie theatre|Film|4Movies|U+1F3A6|U+1F3AC",
"leisure-bowling_alley|@category_entertainment": "4Bowling alley",
"amenity-boat_rental": "4Boat Rental|boat|3rental",
"amenity-bicycle_rental": "4Bicycle Rental|cycle|bike|3rental|U+1F6B2|U+1F6B4|U+1F6B5|bicycle hire|bike rental",
"amenity-bicycle_repair_station": "4Bicycle Repair Station|cycle|bike|4repair of bicycles",
"amenity-car_sharing": "Car Share|3carsharing|car|sharing|U+1F697|U+1F698|U+1F699|carpool|carsharing services|car sharing|4rideshare",
"amenity-car_rental": "3Car Rental|car|rental|U+1F697|U+1F698|U+1F699|car hire|rent a car|auto rental|vehicle rent",
"amenity-motorcycle_rental": "4Motorcycle Rental|bike|hire|4scooter",
"amenity-cinema|@category_entertainment": "3Cinema|3Movie Theatre|Film|Movies|U+1F3A6|U+1F3AC",
"leisure-bowling_alley|@category_entertainment": "4Bowling Alley",
"amenity-theatre|@category_entertainment": "4Theatre|U+1F3AD",
"amenity-nightclub|@category_entertainment|@category_nightlife": "3Nightclub|night club|4disco|dance|U+1F378|U+1F379|U+1F46F|U+1F483|club|nightspot|night bar",
"amenity-brothel": "Brothel|whorehouse|bordello|U+1F3E9",
@@ -166,10 +166,10 @@
"healthcare-psychotherapist": "Psychotherapist",
"healthcare-sample_collection": "Sample collection",
"healthcare-speech_therapist": "Logopedics|Speech therapist|Speech therapy",
"amenity-hunting_stand": "4Hunting stand",
"amenity-hunting_stand": "Hunting Stand",
"amenity-kindergarten": "5Kindergarten|U+1F476|U+1F37C|U+1F6BC|nursery|4Child Care|childcare",
"amenity-library": "3Library|3books|book|U+1F4D6",
"amenity-parking|amenity-parking_entrance|@category_parking": "car parking|U+1F697|U+1F17F|U+1F698|U+1F699",
"amenity-library": "3Library|U+1F4D6",
"amenity-parking|amenity-parking_entrance|@category_parking": "U+1F697|U+1F17F|U+1F698|U+1F699",
"@category_pharmacy": "3Pharmacy",
"amenity-pharmacy|@category_pharmacy": "4Drugstore|apothecary|4dispensary|U+1F489|U+1F48A",
"@category_post": "3Post",
@@ -192,15 +192,15 @@
"recycling-shoes|@category_recycling": "4Recycling of Shoes|Shoes Recycling|Donate Shoes|Shoes",
"recycling-green_waste|@category_recycling": "4Recycling of Green Waste|5Organic Waste Recycling|5Green Waste Recycling|Food Waste|Garden Waste",
"recycling-cartons|@category_recycling": "4Recycling of Bewerage Cartons|5Cartons Recycling|5Bewerage Cartons Recycling|Cartons",
"amenity-sanitary_dump_station|@category_rv": "2RV Dump Station|5Holding Tank Dump Station|4Dump station|sanitary dump station|sewage|RV waste|5motorhome dump station|5camper dump station|4caravan dump station",
"amenity-sanitary_dump_station|@category_rv": "2RV Dump Station|5Holding Tank Dump Station|4Dump Station|sanitary dump station|sewage|RV waste|5motorhome dump station|5camper dump station|4caravan dump station",
"amenity-school": "3School|U+1F392|U+1F3EB",
"amenity-shelter": "4Shelter|refuge",
"amenity-shelter-basic_hut": "basic hut|3Bivouac Hut|Bivvy|Bothy|Hut",
"amenity-shelter-lean_to": "3Lean-to Shelter|4Shelter|Refuge|lean shelter|shelter",
"amenity-stripclub": "Stripclub|strip club",
"amenity-shelter-basic_hut": "3Bivouac Hut|Bivvy|Bothy|Hut",
"amenity-shelter-lean_to": "3Lean-to Shelter|4Shelter|Refuge",
"amenity-stripclub": "Stripclub",
"amenity-telephone": "2Phone|U+260E|U+1F4DE|5Telephone",
"@category_toilet": "3Toilet|toilets|4Restroom|potty|WC|water closet",
"amenity-toilets|toilets-yes|@category_toilet": "wc|4Bathroom|loo|lavatory|U+1F6BD|U+1F6BE|U+1F4A9|U+1F6BB|U+1F6B9|U+1F6BA",
"@category_toilet": "3Toilet",
"amenity-toilets|toilets-yes|@category_toilet": "wc|5restroom|4bathroom|loo|lavatory|U+1F6BD|U+1F6BE|U+1F4A9|U+1F6BB|U+1F6B9|U+1F6BA",
"amenity-university": "4University|U+1F393|Uni",
"place-continent": "Continent|U+1F30D|U+1F30E|U+1F30F",
"place-country": "Country",
@@ -212,8 +212,8 @@
"place-region": "Region",
"place-island|place-islet": "Island|islet",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Suburb|district|quarter|neighbourhood|neighborhood|Residential Area",
"place-hamlet": "Hamlet|village|settlement|civilization",
"place-village": "Village|hamlet|settlement|civilization",
"place-hamlet": "Hamlet|village",
"place-village": "Village|hamlet",
"place-locality": "Locality",
"place-farm": "Farm|U+1F411|U+1F414|U+1F417|U+1F42E|U+1F404|U+1F430|U+1F407|U+1F40F|U+1F410|U+1F413|U+1F424|U+1F437|U+1F43D|U+1F69C",
"highway-raceway": "Racetrack|U+1F3C1",
@@ -233,18 +233,18 @@
"tourism-guest_house|@category_hotel": "4Guest House|hostel|U+1F3E8",
"tourism-motel|@category_hotel": "3Motel|hostel|U+1F3E8",
"tourism-alpine_hut|@category_hotel": "5Mountain Lodge|5backcountry hut|hut|lodge|alpine hut",
"shop-hairdresser": "3Hairdresser|U+2702|U+1F488|hair salon|hairdressing saloon|4barbershop|barber|hair cuttery|haircut|beauty parlor|coloring",
"aeroway-aerodrome": "4Aerodrome|3Airport|3plane|U+2708",
"leisure-stadium": "4Stadium|4sport|U+26BD|U+26BE|U+1F3BE|U+1F3C0|U+1F3C8|U+1F4AA|U+1F3C9|olympic stadium|sports stadium|sports complex|arena|sports arena",
"shop-hairdresser": "3Hairdresser|U+2702|U+1F488|hair salon|hairdressing saloon|barbershop|hair cuttery|haircut|beauty parlor|coloring",
"aeroway-aerodrome": "3Airport|3plane|U+2708",
"leisure-stadium": "4Stadium|4sport|U+26BD|U+26BE|U+1F3BE|U+1F3C0|U+1F3C8|U+1F4AA|U+1F3C9|olympic stadium|sports stadium|sports complex|arena",
"leisure-playground|@category_children": "4Playground",
"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": "4Sports Center|sport|sports|U+26BD|U+26BE|U+1F3BE|U+1F4AA|U+1F3C8|U+1F3C0|U+1F3C9|sports complex|sports forum",
"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": "4Sports Center|sport|U+26BD|U+26BE|U+1F3BE|U+1F4AA|U+1F3C8|U+1F3C0|U+1F3C9|sports complex|sports forum",
"leisure-sports_centre-sport-swimming": "4Swimmming Centre",
"leisure-golf_course": "4Golf Course|golf|U+26F3",
"leisure-golf_course": "Golf Course|U+26F3",
"leisure-miniature_golf": "4Minigolf|Miniature Golf|Putt Putt|mini golf|mini-golf",
"leisure-escape_game": "4Escape Room|Escape Game|quest",
"leisure-hackerspace": "6Hackerspace|hacker space|hacklab|hackspace|5makerspace",
"leisure-pitch": "4Sports Ground|sport|sports|U+26BD|U+26BE|U+1F3BE|U+1F3C0|U+1F3C8|U+1F3C9|U+1F3C3",
"leisure-swimming_pool": "4Swimming Pool|sport|sports|U+1F3CA",
"leisure-hackerspace": "Hackerspace",
"leisure-pitch": "4Sports Ground|sport|U+26BD|U+26BE|U+1F3BE|U+1F3C0|U+1F3C8|U+1F3C9|U+1F3C3",
"leisure-swimming_pool": "4Swimming Pool|sport|U+1F3CA",
"leisure-swimming_pool-private": "DoNotMatchThisType_OneLanguageDefinitionIsEnoughHere",
"sport-american_football": "American Football",
"sport-archery": "Archery",
@@ -276,16 +276,16 @@
"building": "Building|U+1F3E0|U+1F3E1|U+1F3E2",
"building-address": "Address",
"@category_police": "4Police|cops",
"amenity-police|@category_police": "Police station|U+1F693|U+1F46E|U+1F694|U+1F482|U+1F6A8",
"office-diplomatic": "4Embassy|5Consulate",
"amenity-police|@category_police": "U+1F693|U+1F46E|U+1F694|U+1F482|U+1F6A8",
"office-diplomatic": "4Embassy",
"natural-bay": "Bay",
"@category_water": "3Water|water source",
"amenity-drinking_water|drinking_water-yes|@category_water": "4Drinking Water|3Potable Water|U+1F6B0",
"natural-hot_spring|@category_water": "3Hot Spring",
"natural-spring|@category_water": "3Spring|4Natural Spring",
"man_made-water_well|@category_water": "Water Well",
"amenity-water_point|@category_water|@category_rv": "5Water tank refill point|2RV water roint|water for rv|water for campervan|water for caravan",
"man_made-water_tap|@category_water": "5Water tap",
"amenity-water_point|@category_water|@category_rv": "Water Tank Refill Point|2RV Water Point|water for rv|water for campervan|water for caravan",
"man_made-water_tap|@category_water": "Water Tap",
"@waterbody": "Water body|water surface",
"natural-water|@waterbody": "",
"natural-water-basin|landuse-basin|@waterbody": "Basin",
@@ -294,18 +294,18 @@
"natural-water-reservoir|landuse-reservoir|@waterbody": "5Reservoir",
"waterway-river|waterway-stream|natural-water-river": "River|stream|creek|brook",
"waterway-canal": "Canal",
"shop-car_repair": "3Car Repair Workshop|4service station|auto|garage|4mechanic|4Repair car|U+1F527",
"tourism-camp_site|@category_hotel": "4Camping|campsite|campground|4Tent spot|U+26FA",
"shop-car_repair": "3Car Repair Workshop|4service station|auto|garage|4mechanic|U+1F527",
"tourism-camp_site|@category_hotel": "4Camping|campsite|campground|4tent spot|U+26FA",
"tourism-caravan_site|@category_rv||@category_hotel": "2RV Park|4Caravan Site|RV site|U+1F69A|U+26FA|U+1F69B",
"office": "Office|company|U+1F454|U+1F4BC|U+1F3E2|bureau|administrative office|firm|business|corporation",
"office-company": "Company Office",
"office-government": "6Government office",
"office-lawyer": "3Lawyer|advocate|attorney|4Barrister|counsel|councellor|4Solicitor",
"office-telecommunication": "Telecom Company|6Telecommunication office",
"office-government": "Government Office",
"office-lawyer": "3Lawyer|advocate|attorney|4barrister|counsel|councellor|4solicitor",
"office-telecommunication": "Telecom Company|telecommunications",
"craft-beekeeper": "Beekeeper",
"craft-blacksmith": "Blacksmith",
"craft-brewery": "Craft brewery|4Brewery|brew house|beer|beer bar|craft beer",
"craft-caterer": "4Caterer",
"craft-caterer": "Caterer",
"craft-carpenter": "4Carpenter",
"craft-confectionery": "Confectionery|Confectioner",
"craft-electrician": "4Electrician",
@@ -313,69 +313,69 @@
"craft-gardener": "Gardener",
"craft-grinding_mill": "Grinding Mill|Mill",
"craft-handicraft": "Handicraft",
"craft-hvac": "3HVAC|AC|aircon|heating|air conditioner|ventilation|climate|climatization",
"craft-hvac": "HVAC",
"craft-metal_construction": "5Metal Worker",
"craft-key_cutter": "4Key cutting|Key duplication|Key copying",
"craft-key_cutter": "4Key Cutting|Key Duplication|Key Copying",
"craft-locksmith": "Locksmith",
"craft-painter": "House Painter|painter|decorator",
"craft-photographer": "4Photographer|photography Studio",
"craft-plumber": "4Plumber",
"craft-plumber": "Plumber",
"craft-sawmill": "Sawmill",
"craft-shoemaker": "4Shoe Repair|shoe maker",
"craft-winery": "Winery|Wine",
"craft-winery": "4Winery|Wine",
"craft-tailor": "4Tailor|clothes alteration|alterations",
"area:highway-footway|area:highway-pedestrian|area:highway-steps|place-square": "Square",
"place-sea": "Sea|U+1F30A",
"place-ocean": "Ocean|U+1F30A",
"@category_wifi": "WiFi|Wi-Fi|WLAN",
"@category_wifi": "WiFi|Wi-Fi",
"internet_access|internet_access-wlan|@category_wifi": "3Internet|U+1F4F6",
"natural-beach|natural-beach-sand|natural-beach-gravel|leisure-beach_resort": "Beach|U+1F459",
"man_made-lighthouse": "5Lighthouse",
"man_made-lighthouse": "Lighthouse",
"man_made-survey_point": "4Survey Point|survey marker|survey benchmark|4geodetic mark|geodetic vertex|4triangulation station|4trigonometrical point|trig point|trig pillar|4trig station|trig beacon|trig",
"man_made-flagpole": "4Flagpole",
"man_made-flagpole": "Flagpole",
"man_made-mast": "Mast|pole",
"man_made-communications_tower|man_made-tower-communication": "Communications Tower|cell tower|cellular tower|mast",
"man_made-petroleum_well": "7Petroleum Well|Oil Well|Boring",
"man_made-petroleum_well": "Petroleum Well|Oil Well|Boring",
"organic-only|organic-yes": "4organic|bio|biological|eco|ecological|healthy",
"shop-copyshop": "4Copyshop|copy shop|4printing|4photocopy",
"shop-photo|@shop": "4Photo|frames",
"shop-camera|@shop": "3Camera|cameras|photography",
"shop-camera|@shop": "3Camera",
"shop-travel_agency": "4Travel Agency|tours|4tour agency|trips|journeys|travel bureau|holidays|travel agent|tourist office|last minute tour",
"shop-outdoor|@shop": "4Outdoor Equipment|trekking|hiking|climbing|camping",
"shop-dry_cleaning": "3Dry Cleaner|cleaning",
"shop-tyres|@shop": "3Tyre|tyres|tyre shop|3Tires|tire|tire shop",
"shop-tyres|@shop": "3Tyre|tyres",
"amenity-car_wash": "3Car Wash",
"man_made-telescope|man_made-telescope-optical|man_made-telescope-radio|man_made-telescope-gamma": "4Telescope",
"man_made-telescope|man_made-telescope-optical|man_made-telescope-radio|man_made-telescope-gamma": "5Telescope",
"man_made-observatory": "4Observatory",
"amenity-veterinary": "4Veterinary Doctor|3Veterinary|vet|veterinarian",
"amenity-animal_shelter": "6Animal Shelter",
"amenity-veterinary": "Veterinary Doctor|4veterinary",
"amenity-animal_shelter": "Animal Shelter",
"@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",
"amenity-waste_basket": "4Trash Bin|4litter bin|waste basket",
"emergency-phone": "4Emergency Phone",
"leisure-fitness_centre": "3Fitness Centre|gym|U+1F4AA|fitness|workout|fitness gym|fitness club|health club|fitness studio|workout studio|sport|sports",
"leisure-fitness_centre": "3Fitness Centre|gym|U+1F4AA|fitness|workout|fitness gym|fitness club|health club|fitness studio|workout studio",
"leisure-sauna": "3Sauna|sweatbath|sweat lodge|steam room|steam sauna|sauna room",
"shop-car_repair-tyres|shop-car_repair": "3Tyre Repair|tyres|4puncture repair|tyre puncture repair|flat tyre repair|tyre replacement",
"shop-chemist|@shop": "4Chemist|Pharmacist",
"shop-pet|@shop": "3Pet",
"tourism-zoo|@category_tourism|@category_children": "2Zoo",
"attraction-animal": "Animal Enclosure",
"tourism-information-office|amenity-ranger_station|@category_tourism": "4Tourism office|6Ranger station",
"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "3Visitor centre|6Ranger station",
"amenity-community_centre": "4Community centre",
"amenity-compressed_air": "6Compressed air",
"tourism-information-office|amenity-ranger_station|@category_tourism": "4Tourist Office",
"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "3Visitor Centre",
"amenity-community_centre": "4Community Centre",
"amenity-compressed_air": "Compressed Air",
"amenity-courthouse": "4Courthouse",
"amenity-vending_machine-cigarettes": "4Cigarette dispenser",
"amenity-vending_machine-coffee": "4Coffee dispenser|Coffee",
"amenity-vending_machine-condoms": "4Condoms dispenser|Condoms|Condomat",
"amenity-vending_machine-drinks": "4Drinks dispenser|4Beverages",
"amenity-vending_machine-food|@category_food": "4Food dispenser|Food|Snacks",
"amenity-vending_machine-parking_tickets|@category_parking": "4Parking tickets|3Pay and Display|Parkomat|Parking Meter",
"amenity-vending_machine-public_transport_tickets|@category_transport": "6Ticket machine|Transport Tickets|Tickets|4Fare machine|Bus tickets|Train tickets|Ticketing",
"amenity-vending_machine-cigarettes": "4Cigarette Dispenser",
"amenity-vending_machine-coffee": "4Coffee Dispenser|Coffee",
"amenity-vending_machine-condoms": "4Condoms Dispenser|Condoms|Condomat",
"amenity-vending_machine-drinks": "4Drinks Dispenser|4Beverages",
"amenity-vending_machine-food|@category_food": "4Food Dispenser|Food|Snacks",
"amenity-vending_machine-parking_tickets|@category_parking": "4Parking Tickets|3Pay and Display|Parkomat|Parking Meter",
"amenity-vending_machine-public_transport_tickets|@category_transport": "Ticket Machine|Transport Tickets|Tickets",
"amenity-vending_machine-newspapers": "4Newspaper Dispenser|Newspapers",
"amenity-vending_machine-sweets": "4Sweets Dispenser|Sweets|4Candies|Lollies",
"amenity-vending_machine-excrement_bags": "5Excrement Bags Dispenser|4Poop Bags|3Dog Poop Bags|Animal Waste",
@@ -383,62 +383,59 @@
"shop-outpost": "4Pickup Point|4Parcel Pickup",
"amenity-vending_machine-fuel|@category_fuel": "Fuel Dispenser|Gas Pump",
"building-garage": "Garage",
"highway-rest_area|highway-services": "4Rest area|4Service area|station",
"highway-rest_area|highway-services": "4Rest Area|4Service Area|station",
"man_made-chimney": "Chimney",
"man_made-crane": "Crane",
"man_made-tower|man_made-flare": "Tower",
"shop-bookmaker|@gambling": "4Bookmaker",
"shop-bookmaker|@gambling": "Bookmaker",
"shop-seafood|@category_food|@shop": "4Fishmonger|4Seafood|fish market|fish|shellfish|marine",
"shop-second_hand|@category_shopping|@shop|@category_secondhand": "Thrift|4Thrift store|Flea market",
"shop-charity|@shop|@category_secondhand": "4Charity|charity shop",
"shop-ticket": "4Ticket Shop|tickets|ticket|booking",
"shop-wine|@category_food|@shop": "Wine|Winery",
"shop-second_hand|@category_shopping|@shop|@category_secondhand": "Thrift|Flea market",
"shop-charity|@shop|@category_secondhand": "4Charity",
"shop-ticket": "4Ticket Shop|tickets|booking",
"shop-wine|@category_food|@shop": "4Wine|Winery",
"shop-car_parts|@shop": "3Car Parts|4Auto Parts",
"tourism-chalet|@category_hotel": "5Holiday Cottage|5vacation home|4Chalet",
"tourism-chalet|@category_hotel": "5Holiday Cottage|5vacation home",
"tourism-information-board": "Information Board",
"tourism-information-map": "Tourist map|map|4Information",
"aerialway-station": "Aerialway Station|5Cable car station",
"aeroway-helipad": "4Helipad",
"tourism-information-map": "Tourist Map",
"aerialway-station": "Aerialway Station|Cable Car Station",
"aeroway-helipad": "Helipad",
"barrier-border_control": "4Border Control",
"leisure-water_park|@category_tourism|@category_children": "Water Park|3aqua park",
"man_made-water_tower": "Water Tower",
"man_made-windmill": "4Windmill",
"man_made-windmill": "Windmill",
"natural-cave_entrance": "Cave",
"natural-volcano|@mountain": "4Volcano",
"office-estate_agent": "4Estate Agent|Realtor|4Real Estate",
"waterway-lock_gate": "Lock Gate",
"amenity-public_bookcase": "4Book Exchange|Book swap|book|books|public bookcase|bookcase|free library|street library|sidewalk library",
"sport-climbing": "4Climbing Centre|climbing",
"amenity-public_bookcase": "4Book Exchange|Book swap",
"sport-climbing": "4Climbing Centre",
"sport-yoga": "Yoga",
"leisure-fitness_centre-sport-yoga": "Yoga Studio",
"tourism-apartment|@category_hotel": "4Holiday Apartment",
"leisure-resort|@category_hotel": "Resort",
"amenity-biergarten|@category_eat|@category_nightlife": "5Biergarten",
"amenity-driving_school": "4Driving school",
"amenity-music_school": "4Music school",
"amenity-language_school": "4Language school",
"amenity-ice_cream": "3Ice cream|Gelato",
"amenity-internet_cafe": "3Internet Cafe|5Cybercafé",
"amenity-driving_school": "4Driving School",
"amenity-music_school": "Music School",
"amenity-language_school": "Language School",
"amenity-ice_cream": "3Ice Cream|Gelato",
"amenity-internet_cafe": "3Internet Cafe",
"amenity-motorcycle_parking": "4Motorcycle Parking",
"amenity-parking_space-disabled|@category_parking": "4Disabled parking space",
"amenity-car_pooling|@category_parking": "4Carpooling|car pooling",
"amenity-parking_space-disabled|@category_parking": "Disabled Parking Space",
"amenity-car_pooling|@category_parking": "Car Pooling",
"amenity-nursing_home": "4Nursing Home",
"amenity-payment_terminal": "3Payment Terminal",
"amenity-payment_centre": "3Payment Centre",
"amenity-public_bath": "6Public bath",
"amenity-payment_terminal": "Payment Terminal",
"amenity-payment_centre": "Payment Centre",
"amenity-public_bath": "Public Bath",
"amenity-shower": "Shower",
"emergency-access_point": "5Emergency Rescue Point|Emergency Location|Emergency Marker|Emergency Access Point",
"emergency-assembly_point": "5Emergency assembly point",
"emergency-life_ring": "5Lifebuoy|6Life Ring|life-ring|lifering|flotation device|floatation device",
"emergency-assembly_point": "Emergency Assembly Point",
"emergency-defibrillator": "4Defibrillator|AED",
"emergency-fire_hydrant": "4Fire Hydrant|Fire Plug",
"emergency-lifeguard": "Lifeguard|Lifesaver",
"emergency-mountain_rescue": "Mountain Rescue Station|Search and Rescue|rescue",
"leisure-fitness_station": "3Fitness Station|street workout|fitness|workout|4Exercise station|Exercise bench|outdoor gym|5Calisthenics park|trim trail",
"emergency-mountain_rescue": "Mountain Rescue Station|Search and Rescue",
"leisure-fitness_station": "3Fitness Station|street workout",
"office-insurance": "4Insurance Office",
"office-ngo": "4Non-Governmental Organization|NGO",
"shop-erotic|@shop": "4Erotic|4Adult|3Sex",
"shop-beauty-day_spa": "4Day Spa|spa|wellness",
"shop-massage": "Massage salon|Massage Parlour|4massage|spa|massage center|massage therapy|massage services|spa treatment|spa services",
"shop-motorcycle|@shop": "4Motorcycle",
"shop-motorcycle_repair": "4Motorcycle Repair",
@@ -446,14 +443,14 @@
"shop-pawnbroker": "4Pawnbroker",
"shop-stationery|@shop": "5Stationery",
"shop-tattoo": "Tattoo Parlour|4tattoos",
"shop-variety_store|@category_shopping|@shop": "4Variety|6Dollar store|5Pound shop|5Five and dime",
"shop-video|@shop": "4Video|3DVD|videoshop|5video shop|video rental|video rental shop|video rental store",
"shop-video_games|@shop": "Video games|4videogames|video games|videogames|gaming|games|U+1F47E|U+1F579|U+1F3AE",
"shop-variety_store|@category_shopping|@shop": "Variety",
"shop-video|@shop": "4Video|3DVD",
"shop-video_games|@shop": "Video games|4videogames|video games|videogames|U+1F47E|U+1F579|U+1F3AE",
"tourism-wilderness_hut|@category_hotel": "4Wilderness Hut|5backcountry hut|hut|mountain hut|bothy|bivvy",
"tourism-gallery|@category_tourism": "3Art Gallery|3Gallery|museum",
"tourism-theme_park|@category_tourism|@category_children": "5Theme park|Amusement park",
"boundary-national_park|@category_tourism": "5National Park",
"leisure-nature_reserve|@category_tourism": "4Nature reserve",
"tourism-theme_park|@category_tourism|@category_children": "Theme park|Amusement park",
"boundary-national_park|@category_tourism": "National Park",
"leisure-nature_reserve|@category_tourism": "Nature reserve",
"natural-cape": "Cape",
"natural-geyser": "3Geyser",
"natural-glacier|@category_tourism": "Glacier",
@@ -462,31 +459,31 @@
"leisure-indoor_play": "3Indoor Play Centre|indoor play|indoor playground",
"piste:type-downhill|piste:type-nordic": "Skiing|3Ski run|4Piste",
"amenity-events_venue": "Events Venue",
"shop-chocolate|@category_food|@shop": "5Chocolate",
"shop-chocolate|@category_food|@shop": "Chocolate",
"shop-coffee|@category_food|@shop": "Coffee Retailer|Coffee",
"shop-fabric|@shop": "Fabric",
"shop-money_lender": "5Money lender",
"shop-music|@shop": "Record|4vinyl|Music|6Record store",
"shop-musical_instrument|@shop": "7Musical instruments|instruments|guitar|guitars",
"shop-money_lender": "Money lender",
"shop-music|@shop": "Record|vinyl|Music",
"shop-musical_instrument|@shop": "Musical instruments",
"shop-tea|@shop": "Tea",
"shop-telecommunication|@shop": "6Telecommunications shop|Telecommunications|telecom",
"shop-antiques|@category_shopping|@shop|@category_secondhand": "5Antiques",
"shop-telecommunication|@shop": "Telecommunication",
"shop-antiques|@category_shopping|@shop|@category_secondhand": "Antiques",
"shop-art|@category_shopping|@shop": "3Artwork|Arts",
"shop-baby_goods|@category_children|@shop": "4Baby Goods",
"shop-baby_goods|@category_children|@shop": "Baby Goods",
"shop-bag|@category_shopping|@shop": "Bags",
"shop-cheese|@category_food|@shop": "Cheese",
"shop-dairy|@category_food|@shop": "Dairy Products",
"shop-electrical|@shop": "Electrical Supplies|Electrical|U+1F50B|U+1F50C|U+1F4A1|U+1F526",
"shop-fishing|@shop": "Fishing",
"shop-interior_decoration|@shop": "6Interior decorations|interior design",
"shop-interior_decoration|@shop": "Interior Decorations",
"shop-lighting|@shop": "4Lighting|Lighting fixtures|4Lamps",
"shop-lottery|@gambling": "Lottery Tickets",
"shop-medical_supply|@shop": "7Medical supplies",
"shop-nutrition_supplements|@shop": "9Nutrition supplements",
"shop-medical_supply|@shop": "Medical Supplies",
"shop-nutrition_supplements|@shop": "Nutrition Supplements",
"shop-paint|@shop": "Paints",
"shop-perfumery|@category_shopping|@shop": "5Perfumery|perfume|perfumes",
"shop-sewing|@shop": "3Sewing supplies|4Haberdashery",
"shop-storage_rental": "5Storage rental|4Rent storage",
"shop-perfumery|@category_shopping|@shop": "Perfumery",
"shop-sewing|@shop": "3Sewing Supplies|4Haberdashery",
"shop-storage_rental": "Storage Rental",
"shop-tobacco|@shop": "Smoke|Tobacco",
"shop-trade|@shop": "Trades Supplies|Trade Supplies",
"shop-watches|@category_shopping|@shop": "Watches",
@@ -497,35 +494,35 @@
"shop-auction|@category_secondhand": "4Auction|Auctioneer|Auction House",
"shop-collector|@category_shopping|@category_secondhand": "Collectables|Collector",
"man_made-cairn": "4Cairn",
"wheelchair-yes": "5Wheelchair|accessible|accessibility|5Handicap accessible",
"amenity-social_facility": "Social Facility|social|group home|nursing home|assisted living|drug clinic|halfway house|disabled workshop|job center|homeless shelter",
"wheelchair-yes": "5Wheelchair",
"amenity-social_facility": "Social Facility",
"social_facility-soup_kitchen": "4Soup Kitchen|Food",
"social_facility-food_bank": "4Food Bank|foodbank|Food|donate|Free pantry|Free fridge",
"amenity-food_sharing": "Food Sharing|Food|donate",
"amenity-give_box": "Give Box|donate",
"social_facility-food_bank": "4Food Bank|foodbank|Food",
"amenity-food_sharing": "Food Sharing|Food",
"amenity-give_box": "Give Box",
"leisure-sports_hall": "Sports hall",
"amenity-arts_centre|@category_tourism": "Arts Center",
"amenity-prison": "prison|jail|penitentiary|detention centre|detention center",
"amenity-exhibition_centre": "5Exhibition Center",
"shop-bathroom_furnishing|@shop": "9Bathroom Furnishings",
"shop-bed|@shop": "3Bed Shop",
"shop-boutique|@shop": "4Boutique",
"amenity-food_court": "5Food Court",
"shop-curtain|@shop": "5Curtain Shop",
"shop-gas|@shop": "4Gas Store|gas shop|propane|butane|cooking gas|LNG|CNG|gas bottles",
"shop-pet_grooming": "4Pet Grooming|groomer|dog grooming",
"shop-hifi|@shop": "4HiFi Audio Shop",
"amenity-conference_centre": "5Conference Center",
"shop-herbalist|@shop": "4Herbalist",
"shop-appliance|@shop": "4Appliance Shop|Kitchen appliances|Kitchen gallery",
"shop-agrarian|@shop": "4Agricultural Shop|Feed store|Feed and seed|Farm supply",
"shop-fashion_accessories|@shop": "4Fashion Accessories",
"amenity-prison": "prison",
"amenity-exhibition_centre": "Exhibition Center",
"shop-bathroom_furnishing|@shop": "Bathroom Furnishings",
"shop-bed|@shop": "Bed Shop",
"shop-boutique|@shop": "Boutique",
"amenity-food_court": "Food Court",
"shop-curtain|@shop": "Curtain Shop",
"shop-gas|@shop": "Gas Store",
"shop-pet_grooming": "Pet Grooming",
"shop-hifi|@shop": "HiFi Audio Shop",
"amenity-conference_centre": "Conference Center",
"shop-herbalist|@shop": "Herbalist",
"shop-appliance|@shop": "Appliance Shop",
"shop-agrarian|@shop": "Agricultural Shop",
"shop-fashion_accessories|@shop": "Fashion Accessories",
"amenity-waste_transfer_station": "Waste Transfer Station",
"shop-carpet|@shop": "4Carpet Shop",
"shop-craft|@shop": "3Craft",
"shop-carpet|@shop": "Carpet Shop",
"shop-craft|@shop": "Craft",
"shop-pasta|@shop": "Pasta",
"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraction|Maze|Amusement|attractions",
"amenity-luggage_locker": "5Luggage locker|Luggage|locker|4Lockers|storage|5Coin lockers",
"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraction|Maze",
"amenity-luggage_locker": "Luggage|locker|storage",
"office-security": "4Security Office",
"building-guardhouse": "4Guard"
}

View File

@@ -24,4 +24,3 @@ China_Guangdong Hong Kong
US_Guam Guam
Macedonia North Macedonia
Czech Republic Czechia
Myanmar Burma
1 Samoa American Samoa
24 US_Guam Guam
25 Macedonia North Macedonia
26 Czech Republic Czechia
Myanmar Burma

View File

@@ -169,7 +169,7 @@ highway|residential|bridge;[highway=residential][bridge?];;name;int_name;81;
# railway|rail|service|bridge;[railway=rail][service?][service!=spur][bridge?];...
railway|rail|bridge;[railway=rail][bridge?][dont=match];;name;int_name;82;
deprecated:boundary|administrative|10:04.2024;[boundary=administrative][admin_level=10];x;name;int_name;83;
emergency|access_point;[emergency=access_point];;name;;84;
deprecated:boundary|administrative|6:04.2024;[boundary=administrative][admin_level=6];x;name;int_name;84;
highway|secondary|bridge;[highway=secondary][bridge?];;name;int_name;85;
highway|tertiary|bridge;[highway=tertiary][bridge?];;name;int_name;86;
barrier|bollard;87;
@@ -225,7 +225,7 @@ place|suburb;128;
landuse|allotments;129;
landuse|forest|coniferous;[landuse=forest][wood=coniferous],[landuse=forest][leaf_type=coniferous],[natural=wood][wood=coniferous],[natural=wood][leaf_type=coniferous];;name;int_name;130;
landuse|forest|mixed;[landuse=forest][wood=mixed],[landuse=forest][leaf_type=mixed],[landuse=forest][leaf_cycle=mixed],[natural=wood][wood=mixed],[natural=wood][leaf_type=mixed],[natural=wood][leaf_cycle=mixed];;name;int_name;131;
emergency|life_ring;132;
deprecated:natural|wood|mixed:01.2020;[natural=wood][wood=mixed],[natural=wood][leaf_type=mixed],[natural=wood][leaf_cycle=mixed];x;name;int_name;132;landuse|forest|mixed
sport|tennis;133;
# ~730k usages.
landuse|vineyard;134;
@@ -987,7 +987,7 @@ highway|busway|tunnel;[highway=busway][tunnel?];;name;int_name;860;
natural|salt_pond;861;landuse|salt_pond
amenity|conference_centre;862;
amenity|exhibition_centre;863;
shop|beauty|day_spa;[shop=beauty][beauty=spa];;name;int_name;864;
deprecated:railway|siding|tunnel:06.2023;864;x
amenity|boat_rental;865;
area:highway|footway;866;
junction|circular;867;
Can't render this file because it contains an unexpected character in line 7 and column 16.

View File

@@ -77,8 +77,6 @@ vending=water : vending=drinks
vending=milk : vending=drinks
vending=bread : vending=food
highway=emergency_access_point : emergency=access_point
building=entrance : entrance=yes
ice_road=yes : highway=ice_road

View File

@@ -242,7 +242,6 @@
@neutral_label: #51585E;
@healthcare_label: #983E44;
@public_transport_label: #2F6499;
@emergency_label: #247F52;
/* 6.4 Road labels */

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -1 +0,0 @@
<svg height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle cx="9" cy="9" fill="#000" opacity=".6" r="9"/><circle cx="9" cy="9" fill="#6b425c" r="8.25"/><path d="m6.30055657 9.36465433.00689805.0737763c.14582844 1.17941477.67189526 2.27631057 1.56061293 3.27868287l-.00113465.0761216c-1.22761107.0592649-2.19488995-.2708693-2.90183667-.9904025-.70694671-.7195332-1.02550703-1.6981313-.95568097-2.93579437.9045588-.05286646 1.66827257.11300557 2.29114131.4976161zm7.46682273-.50627566.2232054.00865956c.0698261 1.23766307-.2487342 2.21626117-.9556809 2.93579437s-1.6742256 1.0496674-2.9018367.9904025l-.0011346-.0761216c.8887176-1.0023723 1.4147844-2.0992681 1.5606129-3.27868287l.006898-.0737763c.570963-.35255965 1.260275-.5213182 2.0679359-.50627566zm-4.7673793-4.05837867.19024281.17805949c1.17397699 1.13425665 1.76096549 2.39289765 1.76096549 3.77592299 0 1.45581612-.6504028 2.78575212-1.9512083 3.98980792-1.30080552-1.2040558-1.95120828-2.5339918-1.95120828-3.98980792 0-1.45581615.65040276-2.77381031 1.95120828-3.95398248zm-3.64250524 1.23453276c.52429331.11064075.98164792.28211324 1.37206381.51441745-.26807889.60635877-.42055963 1.24178775-.45592669 1.90388473-.3404372-.15607091-.70942568-.26527279-1.10368332-.32818887-.12186067-.63450512-.05872551-1.33159631.1875462-2.09011331zm7.28501044 0c.2462718.758517.3094069 1.45560819.1875462 2.09011331-.3942576.06291608-.7632461.17211796-1.1036833.32818887-.035367-.66209698-.1878478-1.29752596-.4559267-1.90388473.3904159-.23230421.8477705-.4037767 1.3720638-.51441745z" fill="#000" fill-rule="evenodd"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1 +0,0 @@
<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m6 0c3.23839694 0 5.8775718 2.56557489 5.9958615 5.77506174l.0041385.22493826c0 3.23839694-2.56557489 5.8775718-5.77506174 5.9958615l-.22493826.0041385c-3.3137085 0-6-2.6862915-6-6s2.6862915-6 6-6zm-3 6h-2.4c0 2.98233765 2.41766235 5.4 5.4 5.4v-2.4c-1.65685425 0-3-1.34314575-3-3zm3-2.4c-1.3254834 0-2.4 1.0745166-2.4 2.4s1.0745166 2.4 2.4 2.4 2.4-1.0745166 2.4-2.4-1.0745166-2.4-2.4-2.4zm0-3v2.4c1.59768088 0 2.90366088 1.24891996 2.99490731 2.82372721l.00509269.17627279h2.4c0-2.98233765-2.41766235-5.4-5.4-5.4z" fill="#983E44" opacity=".6"/></svg>

Before

Width:  |  Height:  |  Size: 642 B

View File

@@ -927,9 +927,7 @@ node|z16-[man_made=observatory],
node|z17-[amenity=fire_station],
node|z18-[amenity=internet_cafe],
node|z18-[emergency=defibrillator],
node|z18-[emergency=access_point],
node|z18-[emergency=assembly_point],
node|z19-[emergency=life_ring],
node|z18-[emergency=lifeguard],
node|z18-[amenity=toilets],
node|z18-[amenity=atm],
@@ -1527,15 +1525,9 @@ node|z19-[emergency=fire_hydrant],
node|z18-[emergency=defibrillator],
{icon-image: defibrillator-m.svg;font-size: 11;}
node|z18-[emergency=access_point],
{icon-image: access_point-m.svg;font-size: 11;}
node|z18-[emergency=assembly_point],
{icon-image: assembly_point-m.svg;font-size: 11;}
node|z19-[emergency=life_ring],
{icon-image: lifebuoy-m.svg; font-size: 11;}
node|z17-[emergency=lifeguard],
{icon-image: lifeguard-m.svg; font-size: 11;}
@@ -2107,8 +2099,6 @@ node|z17-[shop=variety_store],
{icon-image: shop-m.svg;}
node|z17-[shop=massage],
{icon-image: massage_salon-m.svg;icon-min-distance: 24;}
node|z17-[shop=beauty][beauty=spa],
{icon-image: day-spa-m.svg;icon-min-distance: 24;}
node|z17-[shop=money_lender],
{icon-image: bank-m.svg;icon-min-distance: 24;}
node|z17-[shop=pawnbroker],

View File

@@ -34,7 +34,6 @@ node[shop=wholesale],
node[craft=photographer],
node[craft=tailor],
node[craft=winery],
{text-color: @shop_label}
node[amenity=bar],
@@ -158,6 +157,3 @@ node[healthcare],
node[amenity=bicycle_rental],
node[amenity=taxi],
{text-color: @public_transport_label;text-halo-radius: 0.1;text-halo-opacity: 0.7;text-halo-color: @label_halo_light;}
node[emergency=access_point],
{text-color: @emergency_label;text-halo-radius: 0.1;text-halo-opacity: 0.7;text-halo-color: @label_halo_light;}

View File

@@ -844,7 +844,6 @@ shop-antiques # icon z16- (also has captio
shop-appliance # icon z18- (also has caption(optional) z18-)
shop-baby_goods # icon z18- (also has caption(optional) z18-)
shop-beauty # icon z16- (also has caption(optional) z16-)
shop-beauty-day_spa # icon z16- (also has caption(optional) z16-)
shop-beverages # icon z16- (also has caption(optional) z16-)
shop-boutique # icon z18- (also has caption(optional) z18-)
shop-car_repair # icon z16- (also has caption(optional) z16-)
@@ -1891,7 +1890,6 @@ leisure-swimming_pool-private # icon z17- (also has captio
# shop-appliance # caption(optional) z18- (also has icon z18-)
# shop-baby_goods # caption(optional) z18- (also has icon z18-)
# shop-beauty # caption(optional) z16- (also has icon z16-)
# shop-beauty-day_spa # caption(optional) z16- (also has icon z16-)
# shop-beverages # caption(optional) z16- (also has icon z16-)
# shop-boutique # caption(optional) z18- (also has icon z18-)
# shop-car_repair # caption(optional) z16- (also has icon z16-)
@@ -2362,7 +2360,6 @@ amenity-bench # icon z18- (also has captio
amenity-bench-backless # icon z18- (also has caption(optional) z19-)
amenity-lounger # icon z18- (also has caption(optional) z19-)
amenity-waste_disposal # icon z18- (also has caption(optional) z18-)
emergency-access_point # icon z18- (also has caption(optional) z18-)
emergency-assembly_point # icon z18- (also has caption(optional) z18-)
emergency-defibrillator # icon z18- (also has caption(optional) z18-)
emergency-phone # icon z17-
@@ -2371,7 +2368,6 @@ man_made-telescope # icon z18- (also has captio
amenity-waste_basket # icon z18- (also has caption(optional) z19-)
emergency-fire_hydrant # icon z19- (also has caption(optional) z19-)
emergency-life_ring # icon z19- (also has caption(optional) z19-)
power-substation # icon z17- (also has caption(optional) z18-, area z13-)
=== -9990
@@ -2395,11 +2391,9 @@ amenity-loading_dock # icon z18- (also has captio
# amenity-vending_machine-sweets # caption(optional) z18- (also has icon z18-)
# amenity-waste_basket # caption(optional) z19- (also has icon z18-)
# amenity-waste_disposal # caption(optional) z18- (also has icon z18-)
# emergency-access_point # caption(optional) z18- (also has icon z18-)
# emergency-assembly_point # caption(optional) z18- (also has icon z18-)
# emergency-defibrillator # caption(optional) z18- (also has icon z18-)
# emergency-fire_hydrant # caption(optional) z19- (also has icon z19-)
# emergency-life_ring # caption(optional) z19- (also has icon z19-)
# entrance # caption(optional) z19- (also has icon z17-)
entrance-exit # icon z17- (also has caption(optional) z19-)
# entrance-exit # caption(optional) z19- (also has icon z17-)

View File

@@ -240,7 +240,6 @@
@neutral_label: #494F54;
@healthcare_label: #A6454B;
@public_transport_label: #234B73;
@emergency_label: #247F52;
/* 6.4 Road labels */

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -1 +0,0 @@
<svg height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle cx="9" cy="9" fill="#fff" opacity=".6" r="9"/><circle cx="9" cy="9" fill="#be75a3" r="8.25"/><path d="m6.30055657 9.36465433.00689805.0737763c.14582844 1.17941477.67189526 2.27631057 1.56061293 3.27868287l-.00113465.0761216c-1.22761107.0592649-2.19488995-.2708693-2.90183667-.9904025-.70694671-.7195332-1.02550703-1.6981313-.95568097-2.93579437.9045588-.05286646 1.66827257.11300557 2.29114131.4976161zm7.46682273-.50627566.2232054.00865956c.0698261 1.23766307-.2487342 2.21626117-.9556809 2.93579437s-1.6742256 1.0496674-2.9018367.9904025l-.0011346-.0761216c.8887176-1.0023723 1.4147844-2.0992681 1.5606129-3.27868287l.006898-.0737763c.570963-.35255965 1.260275-.5213182 2.0679359-.50627566zm-4.7673793-4.05837867.19024281.17805949c1.17397699 1.13425665 1.76096549 2.39289765 1.76096549 3.77592299 0 1.45581612-.6504028 2.78575212-1.9512083 3.98980792-1.30080552-1.2040558-1.95120828-2.5339918-1.95120828-3.98980792 0-1.45581615.65040276-2.77381031 1.95120828-3.95398248zm-3.64250524 1.23453276c.52429331.11064075.98164792.28211324 1.37206381.51441745-.26807889.60635877-.42055963 1.24178775-.45592669 1.90388473-.3404372-.15607091-.70942568-.26527279-1.10368332-.32818887-.12186067-.63450512-.05872551-1.33159631.1875462-2.09011331zm7.28501044 0c.2462718.758517.3094069 1.45560819.1875462 2.09011331-.3942576.06291608-.7632461.17211796-1.1036833.32818887-.035367-.66209698-.1878478-1.29752596-.4559267-1.90388473.3904159-.23230421.8477705-.4037767 1.3720638-.51441745z" fill="#fff" fill-rule="evenodd"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1 +0,0 @@
<svg height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m6 0c3.23839694 0 5.8775718 2.56557489 5.9958615 5.77506174l.0041385.22493826c0 3.23839694-2.56557489 5.8775718-5.77506174 5.9958615l-.22493826.0041385c-3.3137085 0-6-2.6862915-6-6s2.6862915-6 6-6zm-3 6h-2.4c0 2.98233765 2.41766235 5.4 5.4 5.4v-2.4c-1.65685425 0-3-1.34314575-3-3zm3-2.4c-1.3254834 0-2.4 1.0745166-2.4 2.4s1.0745166 2.4 2.4 2.4 2.4-1.0745166 2.4-2.4-1.0745166-2.4-2.4-2.4zm0-3v2.4c1.59768088 0 2.90366088 1.24891996 2.99490731 2.82372721l.00509269.17627279h2.4c0-2.98233765-2.41766235-5.4-5.4-5.4z" fill="#d85961"/></svg>

Before

Width:  |  Height:  |  Size: 629 B

View File

@@ -844,7 +844,6 @@ shop-antiques # icon z16- (also has captio
shop-appliance # icon z18- (also has caption(optional) z18-)
shop-baby_goods # icon z18- (also has caption(optional) z18-)
shop-beauty # icon z16- (also has caption(optional) z16-)
shop-beauty-day_spa # icon z16- (also has caption(optional) z16-)
shop-beverages # icon z16- (also has caption(optional) z16-)
shop-boutique # icon z18- (also has caption(optional) z18-)
shop-car_repair # icon z16- (also has caption(optional) z16-)
@@ -1894,7 +1893,6 @@ leisure-swimming_pool-private # icon z17- (also has captio
# shop-appliance # caption(optional) z18- (also has icon z18-)
# shop-baby_goods # caption(optional) z18- (also has icon z18-)
# shop-beauty # caption(optional) z16- (also has icon z16-)
# shop-beauty-day_spa # caption(optional) z16- (also has icon z16-)
# shop-beverages # caption(optional) z16- (also has icon z16-)
# shop-boutique # caption(optional) z18- (also has icon z18-)
# shop-car_repair # caption(optional) z16- (also has icon z16-)
@@ -2368,7 +2366,6 @@ amenity-bench # icon z18- (also has captio
amenity-bench-backless # icon z18- (also has caption(optional) z19-)
amenity-lounger # icon z18- (also has caption(optional) z19-)
amenity-waste_disposal # icon z18- (also has caption(optional) z18-)
emergency-access_point # icon z18- (also has caption(optional) z18-)
emergency-assembly_point # icon z18- (also has caption(optional) z18-)
emergency-defibrillator # icon z18- (also has caption(optional) z18-)
emergency-phone # icon z17-
@@ -2377,7 +2374,6 @@ man_made-telescope # icon z18- (also has captio
amenity-waste_basket # icon z18- (also has caption(optional) z19-)
emergency-fire_hydrant # icon z19- (also has caption(optional) z19-)
emergency-life_ring # icon z19- (also has caption(optional) z19-)
power-substation # icon z17- (also has caption(optional) z18-, area z13-)
=== -9990
@@ -2401,11 +2397,9 @@ amenity-loading_dock # icon z18- (also has captio
# amenity-vending_machine-sweets # caption(optional) z18- (also has icon z18-)
# amenity-waste_basket # caption(optional) z19- (also has icon z18-)
# amenity-waste_disposal # caption(optional) z18- (also has icon z18-)
# emergency-access_point # caption(optional) z18- (also has icon z18-)
# emergency-assembly_point # caption(optional) z18- (also has icon z18-)
# emergency-defibrillator # caption(optional) z18- (also has icon z18-)
# emergency-fire_hydrant # caption(optional) z19- (also has icon z19-)
# emergency-life_ring # caption(optional) z19- (also has icon z19-)
# entrance # caption(optional) z19- (also has icon z17-)
entrance-exit # icon z17- (also has caption(optional) z19-)
# entrance-exit # caption(optional) z19- (also has icon z17-)

View File

@@ -180,7 +180,6 @@
@neutral_label: #51585E;
@healthcare_label: #983E44;
@public_transport_label: #2F6499;
@emergency_label: #247F52;
/* 6.4 Road labels */

View File

@@ -151,7 +151,6 @@
@neutral_label: #494F54;
@healthcare_label: #A6454B;
@public_transport_label: #234B73;
@emergency_label: #247F52;
/* ROADS LABELS */
@shield_text: #000000;

View File

@@ -70,7 +70,3 @@ All the following commands require an app restart:
- `?all-types`: Shows all internal types in place page
- `?no-all-types`: Disables showing all internal types in place page
## Search
- `?wiki`: Search results for all elements with Wikipedia links

View File

@@ -147,6 +147,8 @@ set(SRC
osm_o5m_source.hpp
osm_source.cpp
osm_xml_source.hpp
panoramax_collector.cpp
panoramax_collector.hpp
place_processor.cpp
place_processor.hpp
platform_helpers.cpp

View File

@@ -225,11 +225,6 @@ bool FeatureBuilder::PreSerialize()
});
m_params.name = std::move(nameWithRef);
}
else if (ftypes::IsEmergencyAccessPointChecker::Instance()(types))
{
m_params.name.Clear();
m_params.name.AddString(StringUtf8Multilang::kDefaultCode, m_params.ref);
}
m_params.ref.clear();
}

View File

@@ -10,6 +10,7 @@
#include "generator/mini_roundabout_transformer.hpp"
#include "generator/node_mixer.hpp"
#include "generator/osm2type.hpp"
#include "generator/panoramax_collector.hpp"
#include "generator/region_meta.hpp"
#include "routing/speed_camera_prohibition.hpp"
@@ -68,6 +69,9 @@ void CountryFinalProcessor::Process()
if (!m_isolinesPath.empty())
AddIsolines();
LOG(LINFO, ("Enriching with Panoramax data..."));
EnrichPanoramax();
// DropProhibitedSpeedCameras();
LOG(LINFO, ("Processing building parts..."));
ProcessBuildingParts();
@@ -293,6 +297,50 @@ void CountryFinalProcessor::AddAddresses()
LOG(LINFO, ("Total addresses:", totalStats));
}
void CountryFinalProcessor::EnrichPanoramax()
{
if (m_panoramaxFilename.empty() || !Platform::IsFileExistsByFullPath(m_panoramaxFilename))
{
LOG(LINFO, ("Panoramax data not available, skipping enrichment"));
return;
}
LOG(LINFO, ("Enriching roads with Panoramax imagery data from:", m_panoramaxFilename));
// Load Panoramax imagery data
PanoramaxCollector collector;
if (!collector.LoadImageryData(m_panoramaxFilename, ""))
{
LOG(LWARNING, ("Failed to load Panoramax data"));
return;
}
// Enrich roads in each MWM
ForEachMwmTmp(m_temporaryMwmPath, [&](auto const & name, auto const & path)
{
if (!IsCountry(name))
return;
LOG(LINFO, ("Enriching Panoramax for:", name));
std::vector<FeatureBuilder> features;
ForEachFeatureRawFormat<serialization_policy::MaxAccuracy>(
path, [&](FeatureBuilder && fb, uint64_t) {
collector.EnrichRoad(fb);
features.emplace_back(std::move(fb));
});
// Rewrite the file with enriched features
FeatureBuilderWriter<serialization_policy::MaxAccuracy> writer(path, FileWriter::Op::OP_WRITE_TRUNCATE);
for (auto & fb : features)
writer.Write(fb);
LOG(LINFO, (name, "done"));
});
LOG(LINFO, ("Panoramax enrichment complete:", DebugPrint(collector.GetStats())));
}
void CountryFinalProcessor::ProcessCoastline()
{
/// @todo We can remove MinSize at all.

View File

@@ -26,6 +26,7 @@ public:
void SetAddressesDir(std::string const & dir) { m_addressPath = dir; }
void SetCityBoundariesFiles(std::string const & collectorFile) { m_boundariesCollectorFile = collectorFile; }
void SetPanoramaxFile(std::string const & filename) { m_panoramaxFilename = filename; }
// FinalProcessorIntermediateMwmInterface overrides:
void Process() override;
@@ -39,6 +40,7 @@ private:
void AddFakeNodes();
void AddIsolines();
void AddAddresses();
void EnrichPanoramax();
void DropProhibitedSpeedCameras();
// void Finish();
@@ -54,6 +56,7 @@ private:
std::string m_fakeNodesFilename;
std::string m_miniRoundaboutsFilename;
std::string m_addrInterpolFilename;
std::string m_panoramaxFilename;
std::string m_hierarchySrcFilename;

View File

@@ -42,6 +42,9 @@ struct GenerateInfo
// External folders with additional preprocessed data (isolines, addresses).
std::string m_isolinesDir, m_addressesDir;
// Panoramax imagery data file
std::string m_panoramaxFilename;
// Current generated file name if --output option is defined.
std::string m_fileName;

View File

@@ -107,6 +107,7 @@ DEFINE_string(nodes_list_path, "",
DEFINE_bool(generate_isolines_info, false, "Generate the isolines info section");
DEFINE_string(isolines_path, "", "Path to isolines directory. If set, adds isolines linear features.");
DEFINE_string(addresses_path, "", "Path to addresses directory. If set, adds addr:interpolation features.");
DEFINE_string(panoramax_file, "", "Path to Panoramax imagery coords file. If set, enriches roads with street-level imagery availability.");
// Routing.
DEFINE_bool(make_routing_index, false, "Make sections with the routing information.");
@@ -243,6 +244,7 @@ MAIN_WITH_ERROR_HANDLING([](int argc, char ** argv)
genInfo.m_complexHierarchyFilename = FLAGS_complex_hierarchy_data;
genInfo.m_isolinesDir = FLAGS_isolines_path;
genInfo.m_addressesDir = FLAGS_addresses_path;
genInfo.m_panoramaxFilename = FLAGS_panoramax_file;
// Use merged style.
GetStyleReader().SetCurrentStyle(MapStyleMerged);

View File

@@ -0,0 +1,157 @@
#include "generator/panoramax_collector.hpp"
#include "indexer/feature_meta.hpp"
#include "indexer/ftypes_matcher.hpp"
#include "geometry/mercator.hpp"
#include "base/assert.hpp"
#include "base/logging.hpp"
#include <cstdint>
#include <fstream>
#include <sstream>
namespace generator
{
PanoramaxCollector::PanoramaxCollector() = default;
bool PanoramaxCollector::LoadImageryData(std::string const & coordsFilePath, std::string const & /* tilesDir */)
{
LOG(LINFO, ("Loading Panoramax imagery from:", coordsFilePath));
std::ifstream file(coordsFilePath, std::ios::binary);
if (!file.is_open())
{
LOG(LWARNING, ("Failed to open Panoramax coords file:", coordsFilePath));
return false;
}
// Read header
uint32_t version;
uint64_t count;
file.read(reinterpret_cast<char*>(&version), sizeof(version));
file.read(reinterpret_cast<char*>(&count), sizeof(count));
if (version != 1)
{
LOG(LWARNING, ("Unsupported Panoramax coords file version:", version));
return false;
}
LOG(LINFO, ("Loading", count, "Panoramax imagery points..."));
// Read coordinates and build spatial index
std::vector<ImageryPoint> points;
points.reserve(count);
for (uint64_t i = 0; i < count; ++i)
{
double lat, lon;
file.read(reinterpret_cast<char*>(&lat), sizeof(lat));
file.read(reinterpret_cast<char*>(&lon), sizeof(lon));
// Convert to Mercator coordinates
m2::PointD mercPt = mercator::FromLatLon(lat, lon);
points.emplace_back(mercPt);
if ((i + 1) % 500000 == 0)
LOG(LINFO, ("Loaded", i + 1, "/", count, "points"));
}
if (!file)
{
LOG(LWARNING, ("Error reading Panoramax coords file"));
return false;
}
file.close();
LOG(LINFO, ("Building spatial index for", points.size(), "points..."));
// Build spatial index
for (auto const & pt : points)
m_imageryTree.Add(pt);
m_stats.m_totalImageryPoints = static_cast<uint32_t>(points.size());
LOG(LINFO, ("Panoramax data loaded:", m_stats.m_totalImageryPoints, "imagery points"));
return true;
}
bool PanoramaxCollector::EnrichRoad(feature::FeatureBuilder & fb)
{
// Only process roads
static auto const & isRoad = ftypes::IsWayChecker::Instance();
if (!isRoad(fb.GetTypes()))
return false;
m_stats.m_totalRoads++;
// Check if road already has Panoramax flag
if (fb.GetMetadata().Has(feature::Metadata::FMD_PANORAMAX))
return false;
// Get road geometry
std::vector<m2::PointD> roadPoints;
fb.ForEachPoint([&roadPoints](m2::PointD const & pt) {
roadPoints.push_back(pt);
});
if (roadPoints.empty())
return false;
// Calculate road bounding box
m2::RectD roadBBox;
for (auto const & pt : roadPoints)
roadBBox.Add(pt);
// Expand bounding box by threshold distance in Mercator units
auto const center = roadBBox.Center();
auto const inflateRect = mercator::RectByCenterXYAndSizeInMeters(center, kDistanceThresholdM);
roadBBox.Inflate(inflateRect.SizeX() / 2.0, inflateRect.SizeY() / 2.0);
// Query imagery tree for nearby points
bool hasImagery = false;
m_imageryTree.ForEachInRect(roadBBox, [&](ImageryPoint const & imgPt) {
if (hasImagery)
return; // Already found, early exit
// Check distance to each road point
for (auto const & roadPt : roadPoints)
{
double const distM = mercator::DistanceOnEarth(roadPt, imgPt.m_point);
if (distM <= kDistanceThresholdM)
{
hasImagery = true;
return;
}
}
});
if (hasImagery)
{
fb.GetMetadata().Set(feature::Metadata::FMD_PANORAMAX, "yes");
m_stats.m_roadsWithImagery++;
return true;
}
return false;
}
std::string DebugPrint(PanoramaxCollector::Stats const & s)
{
std::ostringstream out;
out << "PanoramaxCollector::Stats {"
<< " totalRoads: " << s.m_totalRoads
<< ", roadsWithImagery: " << s.m_roadsWithImagery
<< " (" << (s.m_totalRoads > 0 ? (s.m_roadsWithImagery * 100.0 / s.m_totalRoads) : 0) << "%)"
<< ", totalImageryPoints: " << s.m_totalImageryPoints
<< " }";
return out.str();
}
} // namespace generator

View File

@@ -0,0 +1,72 @@
#pragma once
#include "generator/feature_builder.hpp"
#include "geometry/point2d.hpp"
#include "geometry/tree4d.hpp"
#include "base/geo_object_id.hpp"
#include <string>
#include <vector>
namespace generator
{
/// Enriches road features with Panoramax street-level imagery availability flag.
/// Loads Panoramax imagery coordinates from tile index and marks roads within threshold distance.
class PanoramaxCollector
{
public:
// Distance threshold for matching roads to imagery (meters)
static double constexpr kDistanceThresholdM = 20.0;
/// ImageryPoint represents a single point where street-level imagery exists
struct ImageryPoint
{
m2::PointD m_point; // Mercator coordinates
ImageryPoint() = default;
explicit ImageryPoint(m2::PointD const & pt) : m_point(pt) {}
m2::RectD GetLimitRect() const { return m2::RectD(m_point, m_point); }
};
/// Statistics for debugging/logging
struct Stats
{
uint32_t m_totalRoads = 0;
uint32_t m_roadsWithImagery = 0;
uint32_t m_totalImageryPoints = 0;
uint32_t m_tilesProcessed = 0;
friend std::string DebugPrint(Stats const & s);
};
PanoramaxCollector();
/// Load Panoramax imagery data from tile directory
/// @param tileIndexPath Path to tile_index.json
/// @param tilesDir Directory containing .mvt tiles
/// @return true if data loaded successfully
bool LoadImageryData(std::string const & tileIndexPath, std::string const & tilesDir);
/// Check if a road has nearby imagery and enrich it
/// @param fb FeatureBuilder for a road segment
/// @return true if imagery was found within threshold
bool EnrichRoad(feature::FeatureBuilder & fb);
Stats const & GetStats() const { return m_stats; }
private:
/// Spatial index of imagery points
m4::Tree<ImageryPoint> m_imageryTree;
/// Statistics
Stats m_stats;
/// Decode an MVT tile and extract imagery coordinates
std::vector<m2::PointD> DecodeMVTTile(std::string const & tilePath,
int tileX, int tileY, int zoom);
};
} // namespace generator

View File

@@ -182,6 +182,7 @@ RawGenerator::FinalProcessorPtr RawGenerator::CreateCountryFinalProcessor(Affili
auto finalProcessor = std::make_shared<CountryFinalProcessor>(affiliations, m_genInfo.m_tmpDir, m_threadsCount);
finalProcessor->SetIsolinesDir(m_genInfo.m_isolinesDir);
finalProcessor->SetAddressesDir(m_genInfo.m_addressesDir);
finalProcessor->SetPanoramaxFile(m_genInfo.m_panoramaxFilename);
finalProcessor->SetMiniRoundabouts(m_genInfo.GetIntermediateFileName(MINI_ROUNDABOUTS_FILENAME));
finalProcessor->SetAddrInterpolation(m_genInfo.GetIntermediateFileName(ADDR_INTERPOL_FILENAME));
if (addAds)

View File

@@ -359,9 +359,7 @@
"type.cuisine.vegetarian" = "Vegetarisch";
"type.cuisine.vietnamese" = "Vietnamesisch";
"type.emergency" = "Notfall";
"type.emergency.access_point" = "Rettungspunkt";
"type.emergency.assembly_point" = "Notfall-Sammelpunkt";
"type.emergency.life_ring" = "Rettungsring";
"type.emergency.defibrillator" = "Defibrillator";
"type.emergency.fire_hydrant" = "Hydrant";
"type.emergency.phone" = "Notruftelefon";

View File

@@ -367,9 +367,7 @@
"type.cuisine.vegetarian" = "Vegetarian";
"type.cuisine.vietnamese" = "Vietnamese";
"type.emergency" = "Emergency";
"type.emergency.access_point" = "Emergency Rescue Point";
"type.emergency.assembly_point" = "Emergency Assembly Point";
"type.emergency.life_ring" = "Lifebuoy";
"type.emergency.defibrillator" = "Defibrillator";
"type.emergency.fire_hydrant" = "Fire Hydrant";
"type.emergency.phone" = "Emergency Phone";
@@ -1291,7 +1289,6 @@
"type.shop.kitchen" = "Kitchen Shop";
"type.shop.laundry" = "Launderette";
"type.shop.mall" = "Shopping Centre";
"type.shop.beauty.day_spa" = "Day Spa";
"type.shop.massage" = "Massage Salon";
"type.shop.mobile_phone" = "Mobile Phone Shop";
"type.shop.money_lender" = "Money Lender";

View File

@@ -386,9 +386,7 @@
"type.cuisine.vegetarian" = "Vegetarian";
"type.cuisine.vietnamese" = "Vietnamese";
"type.emergency" = "Emergency";
"type.emergency.access_point" = "Emergency Rescue Point";
"type.emergency.assembly_point" = "Emergency Assembly Point";
"type.emergency.life_ring" = "Lifebuoy";
"type.emergency.defibrillator" = "Defibrillator";
"type.emergency.fire_hydrant" = "Fire Hydrant";
"type.emergency.phone" = "Emergency Phone";
@@ -1331,7 +1329,6 @@
"type.shop.kitchen" = "Kitchen Store";
"type.shop.laundry" = "Laundry";
"type.shop.mall" = "Mall";
"type.shop.beauty.day_spa" = "Day Spa";
"type.shop.massage" = "Massage Salon";
"type.shop.mobile_phone" = "Mobile Phone Store";
"type.shop.money_lender" = "Money Lender";

View File

@@ -854,12 +854,6 @@ IsPlatformChecker::IsPlatformChecker()
m_types.push_back(c.GetTypeByPath({"public_transport", "platform"}));
}
IsEmergencyAccessPointChecker::IsEmergencyAccessPointChecker()
{
Classificator const & c = classif();
m_types.push_back(c.GetTypeByPath({"emergency", "access_point"}));
}
IsAddressInterpolChecker::IsAddressInterpolChecker() : BaseChecker(1 /* level */)
{
Classificator const & c = classif();

View File

@@ -629,14 +629,6 @@ public:
DECLARE_CHECKER_INSTANCE(IsPlatformChecker);
};
class IsEmergencyAccessPointChecker : public BaseChecker
{
IsEmergencyAccessPointChecker();
public:
DECLARE_CHECKER_INSTANCE(IsEmergencyAccessPointChecker);
};
class IsAddressInterpolChecker : public BaseChecker
{
IsAddressInterpolChecker();

View File

@@ -311,6 +311,7 @@ RoutingManager::RoutingManager(Callbacks && callbacks, Delegate & delegate)
, m_delegate(delegate)
, m_extrapolator([this](location::GpsInfo const & gpsInfo) { this->OnExtrapolatedLocationUpdate(gpsInfo); })
{
m_extrapolator.Enable(true); // Keeps smooth arrow movement whether routing or not
m_routingSession.Init(
#ifdef SHOW_ROUTE_DEBUG_MARKS
[this](m2::PointD const & pt)
@@ -555,10 +556,6 @@ void RoutingManager::RemoveRoute(bool deactivateFollowing)
if (deactivateFollowing)
{
m_transitReadManager->BlockTransitSchemeMode(false /* isBlocked */);
// Switching on the extrapolator only for following mode in car and bicycle navigation.
m_extrapolator.Enable(m_currentRouterType == RouterType::Vehicle || m_currentRouterType == RouterType::Bicycle);
// Remove all subroutes.
m_drapeEngine.SafeCall(&df::DrapeEngine::RemoveSubroute, dp::DrapeID(), true /* deactivateFollowing */);
}
@@ -769,7 +766,6 @@ void RoutingManager::FollowRoute()
void RoutingManager::CloseRouting(bool removeRoutePoints)
{
m_extrapolator.Enable(false);
// Hide preview.
HidePreviewSegments();
@@ -946,9 +942,9 @@ void RoutingManager::SetPointsFollowingMode(bool enabled)
void RoutingManager::RemovePassedPoints()
{
ASSERT(m_bmManager != nullptr, ());
RoutePointsLayout routePoints(*m_bmManager);
routePoints.RemovePassedPoints();
ASSERT(m_bmManager != nullptr, ());
RoutePointsLayout routePoints(*m_bmManager);
routePoints.RemovePassedPoints();
}
void RoutingManager::ReorderIntermediatePoints()

View File

@@ -6,7 +6,7 @@
#define MWM_GEOLOCATION_SERVER ""
#define DIFF_LIST_URL ""
#define METASERVER_URL "https://cdn-us-1.comaps.app/servers"
#define DEFAULT_URLS_JSON "[ \"https://cdn-us-2.comaps.tech/\", \"https://comaps.firewall-gateway.de/\", \"https://cdn-fi-1.comaps.app/\", \"https://comaps-cdn.s3-website.cloud.ru/\", \"https://mapgen-fi-1.comaps.app/\" ]"
#define DEFAULT_URLS_JSON "[ \"https://cdn-us-2.comaps.tech/\", \"https://comaps.firewall-gateway.de/\", \"https://cdn-fi-1.comaps.app/\", \"https://comaps-cdn.s3-website.cloud.ru/\" ]"
#define DEFAULT_CONNECTION_CHECK_IP "151.101.195.52" // For now the IP of comaps.app (Fastly CDN)
#define TRAFFIC_DATA_BASE_URL ""
#define USER_BINDING_PKCS12 ""