Compare commits
22 Commits
pastk-gen-
...
test/2025.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3b39411e8 | ||
|
|
38b2dfe6eb | ||
|
|
1c8a1e7595 | ||
|
|
ceb590fa48 | ||
|
|
8e41c89bec | ||
|
|
4f1b2e5e43 | ||
|
|
53deacd712 | ||
|
|
8777601eb0 | ||
|
|
65e36a1787 | ||
|
|
e25b8e13d4 | ||
|
|
37dc6daf6d | ||
|
|
ef5ff26dd7 | ||
|
|
38b3e4422d | ||
|
|
5b9322f2e7 | ||
|
|
2ab69e2e99 | ||
|
|
b96564d454 | ||
|
|
59fe3c08ab | ||
|
|
4e154fb10b | ||
|
|
6dee814ff5 | ||
|
|
7df0565bc9 | ||
|
|
52b31d31e4 | ||
|
|
0324e37a1f |
1
.gitignore
vendored
@@ -9,7 +9,6 @@ Makefile.Release
|
||||
object_script.*.Debug
|
||||
object_script.*.Release
|
||||
compile_commands.json
|
||||
*.local.*
|
||||
|
||||
stxxl.errlog
|
||||
stxxl.log
|
||||
|
||||
@@ -31,7 +31,6 @@ if (NOT WITH_SYSTEM_PROVIDED_3PARTY)
|
||||
set(JANSSON_WITHOUT_TESTS ON)
|
||||
add_subdirectory(jansson/jansson/)
|
||||
target_include_directories(jansson INTERFACE "${PROJECT_BINARY_DIR}/3party/jansson/jansson/include")
|
||||
add_library(jansson::jansson ALIAS jansson)
|
||||
|
||||
# Add gflags library.
|
||||
set(GFLAGS_BUILD_TESTING OFF)
|
||||
|
||||
@@ -94,11 +94,6 @@ if (PLATFORM_WIN)
|
||||
)
|
||||
endif()
|
||||
|
||||
# Try fast native arch.
|
||||
if (PLATFORM_LINUX)
|
||||
add_compile_options(-march=native)
|
||||
endif()
|
||||
|
||||
# Built-in CMake configurations: Debug, Release, RelWithDebInfo, MinSizeRel
|
||||
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
|
||||
add_definitions(-DDEBUG)
|
||||
@@ -108,29 +103,12 @@ if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
|
||||
elseif (${CMAKE_BUILD_TYPE} MATCHES "Rel")
|
||||
add_definitions(-DRELEASE)
|
||||
if (NOT MSVC)
|
||||
add_compile_options(-Ofast $<$<CXX_COMPILER_ID:GNU>:-flto=auto>) # Also enables -ffast-math
|
||||
add_compile_options(-Ofast) # Also enables -ffast-math
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Unknown build type: " ${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
|
||||
if (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
|
||||
add_compile_options(-fno-omit-frame-pointer)
|
||||
endif()
|
||||
|
||||
# Linux GCC LTO plugin fix.
|
||||
if (PLATFORM_LINUX AND (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_BUILD_TYPE MATCHES "^Rel"))
|
||||
# To force errors if LTO was not enabled.
|
||||
add_compile_options(-fno-fat-lto-objects)
|
||||
# To fix ar and ranlib "plugin needed to handle lto object".
|
||||
string(REGEX MATCH "[0-9]+" GCC_MAJOR_VERSION ${CMAKE_CXX_COMPILER_VERSION})
|
||||
file(GLOB_RECURSE plugin /usr/lib/gcc/*/${GCC_MAJOR_VERSION}/liblto_plugin.so)
|
||||
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> --plugin ${plugin} qcs <TARGET> <OBJECTS>")
|
||||
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> --plugin ${plugin} <TARGET>")
|
||||
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> --plugin ${plugin} qcs <TARGET> <OBJECTS>")
|
||||
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> --plugin ${plugin} <TARGET>")
|
||||
endif()
|
||||
|
||||
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
|
||||
|
||||
if (PLATFORM_LINUX OR PLATFORM_ANDROID)
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Gönüllüler tarafından yürütülen, OpenStreetMap harita verisini kullanan, şeffaf, mahremiyete saygılı, kamu yararına olma kararlılığıyla güçlendirilmiş bir özgür yazılım.
|
||||
@@ -0,0 +1 @@
|
||||
Kolayca gezinin - Seyahatinizde keşfe çıkın - Gönüllüler tarafından yapıldı
|
||||
1
android/app/src/fdroid/play/listings/tr-TR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - İnternetsiz Seyahat Edin
|
||||
@@ -0,0 +1 @@
|
||||
Kolayca gezinin - Seyahatinizde keşfe çıkın - Gönüllüler tarafından yapıldı
|
||||
1
android/app/src/google/play/listings/tr-TR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
CoMaps - Mahremiyetli Seyahat
|
||||
@@ -34,7 +34,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StyleRes;
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
@@ -120,6 +119,8 @@ import app.organicmaps.widget.menu.MainMenu;
|
||||
import app.organicmaps.widget.placepage.PlacePageController;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
@@ -187,7 +188,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
private MapFragment mMapFragment;
|
||||
|
||||
private View mPointChooser;
|
||||
private Toolbar mPointChooserToolbar;
|
||||
private MaterialToolbar mPointChooserToolbar;
|
||||
|
||||
private RoutingPlanInplaceController mRoutingPlanInplaceController;
|
||||
|
||||
|
||||
@@ -15,11 +15,12 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StyleRes;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.SplashActivity;
|
||||
@@ -148,7 +149,7 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
onBackPressed();
|
||||
}
|
||||
|
||||
protected Toolbar getToolbar()
|
||||
protected MaterialToolbar getToolbar()
|
||||
{
|
||||
return findViewById(R.id.toolbar);
|
||||
}
|
||||
|
||||
@@ -10,11 +10,13 @@ import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
@@ -23,7 +25,7 @@ import app.organicmaps.widget.PlaceholderView;
|
||||
|
||||
public abstract class BaseMwmRecyclerFragment<T extends RecyclerView.Adapter> extends Fragment
|
||||
{
|
||||
private Toolbar mToolbar;
|
||||
private MaterialToolbar mToolbar;
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
|
||||
@@ -6,11 +6,13 @@ import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
@@ -26,7 +28,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
|
||||
{
|
||||
super.onSafeCreate(savedInstanceState);
|
||||
|
||||
Toolbar toolbar = getToolbar();
|
||||
MaterialToolbar toolbar = getToolbar();
|
||||
if (toolbar != null)
|
||||
{
|
||||
int title = getToolbarTitle();
|
||||
@@ -42,7 +44,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
|
||||
}
|
||||
}
|
||||
|
||||
protected void setupHomeButton(@NonNull Toolbar toolbar)
|
||||
protected void setupHomeButton(@NonNull MaterialToolbar toolbar)
|
||||
{
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
}
|
||||
@@ -92,7 +94,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
|
||||
|
||||
if (title != null)
|
||||
{
|
||||
Toolbar toolbar = getToolbar();
|
||||
MaterialToolbar toolbar = getToolbar();
|
||||
if (toolbar != null && toolbar.getTitle() != null)
|
||||
{
|
||||
mLastTitle = toolbar.getTitle().toString();
|
||||
|
||||
@@ -480,6 +480,13 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
|
||||
UiUtils.showIf(mSearchResultsMode && !TextUtils.isEmpty(found), mFoundName);
|
||||
|
||||
long size = getMapDisplaySize();
|
||||
mSize.setText(StringUtils.getFileSizeString(mFragment.requireContext(), size));
|
||||
mStatusIcon.update(mItem);
|
||||
}
|
||||
|
||||
private long getMapDisplaySize()
|
||||
{
|
||||
long size;
|
||||
if (mItem.status == CountryItem.STATUS_ENQUEUED ||
|
||||
mItem.status == CountryItem.STATUS_PROGRESS ||
|
||||
@@ -487,13 +494,16 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
||||
{
|
||||
size = mItem.enqueuedSize;
|
||||
}
|
||||
else if (mItem.status == CountryItem.STATUS_FAILED ||
|
||||
mItem.status == CountryItem.STATUS_DOWNLOADABLE)
|
||||
{
|
||||
size = mItem.totalSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = ((!mSearchResultsMode && mMyMapsMode) ? mItem.size : mItem.totalSize);
|
||||
}
|
||||
|
||||
mSize.setText(StringUtils.getFileSizeString(mFragment.requireContext(), size));
|
||||
mStatusIcon.update(mItem);
|
||||
return size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
@@ -47,6 +46,7 @@ import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.PlaceholderView;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
@@ -226,7 +226,7 @@ public class SearchFragment extends BaseMwmFragment
|
||||
private void updateFrames()
|
||||
{
|
||||
final boolean hasQuery = mToolbarController.hasQuery();
|
||||
Toolbar toolbar = mToolbarController.getToolbar();
|
||||
MaterialToolbar toolbar = mToolbarController.getToolbar();
|
||||
AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
|
||||
lp.setScrollFlags(hasQuery ? AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
|
||||
| AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL : 0);
|
||||
|
||||
@@ -27,7 +27,6 @@ import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.content.res.ResourcesCompat;
|
||||
import androidx.core.graphics.Insets;
|
||||
@@ -37,6 +36,8 @@ import androidx.core.view.WindowInsetsControllerCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
import java.util.Objects;
|
||||
@@ -193,7 +194,7 @@ public final class UiUtils
|
||||
hide(tv);
|
||||
}
|
||||
|
||||
public static void showHomeUpButton(Toolbar toolbar)
|
||||
public static void showHomeUpButton(MaterialToolbar toolbar)
|
||||
{
|
||||
toolbar.setNavigationIcon(ThemeUtils.getResource(toolbar.getContext(), androidx.appcompat.R.attr.homeAsUpIndicator));
|
||||
}
|
||||
@@ -297,7 +298,7 @@ public final class UiUtils
|
||||
systemInsets.right, view.getPaddingBottom());
|
||||
}
|
||||
|
||||
public static void setupNavigationIcon(@NonNull Toolbar toolbar,
|
||||
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar,
|
||||
@NonNull View.OnClickListener listener)
|
||||
{
|
||||
View customNavigationButton = toolbar.findViewById(R.id.back);
|
||||
@@ -311,14 +312,14 @@ public final class UiUtils
|
||||
}
|
||||
}
|
||||
|
||||
public static void setupHomeUpButtonAsNavigationIcon(@NonNull Toolbar toolbar,
|
||||
public static void setupHomeUpButtonAsNavigationIcon(@NonNull MaterialToolbar toolbar,
|
||||
@NonNull View.OnClickListener listener)
|
||||
{
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
toolbar.setNavigationOnClickListener(listener);
|
||||
}
|
||||
|
||||
public static void clearHomeUpButton(@NonNull Toolbar toolbar)
|
||||
public static void clearHomeUpButton(@NonNull MaterialToolbar toolbar)
|
||||
{
|
||||
toolbar.setNavigationIcon(null);
|
||||
toolbar.setNavigationOnClickListener(null);
|
||||
|
||||
@@ -9,8 +9,10 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
@@ -21,7 +23,7 @@ public class ToolbarController
|
||||
@Nullable
|
||||
private Activity mActivity;
|
||||
@NonNull
|
||||
private final Toolbar mToolbar;
|
||||
private final MaterialToolbar mToolbar;
|
||||
@NonNull
|
||||
protected final View.OnClickListener mNavigationClickListener = view -> onUpClick();
|
||||
|
||||
@@ -39,7 +41,7 @@ public class ToolbarController
|
||||
setSupportActionBar(activity, mToolbar);
|
||||
}
|
||||
|
||||
private void setSupportActionBar(@NonNull Activity activity, @NonNull Toolbar toolbar)
|
||||
private void setSupportActionBar(@NonNull Activity activity, @NonNull MaterialToolbar toolbar)
|
||||
{
|
||||
AppCompatActivity appCompatActivity = (AppCompatActivity) activity;
|
||||
appCompatActivity.setSupportActionBar(toolbar);
|
||||
@@ -86,7 +88,7 @@ public class ToolbarController
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public Toolbar getToolbar()
|
||||
public MaterialToolbar getToolbar()
|
||||
{
|
||||
return mToolbar;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
@@ -33,6 +32,8 @@ import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.InputUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
@@ -203,7 +204,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
|
||||
private void initToolbar(View view)
|
||||
{
|
||||
Toolbar toolbar = view.findViewById(R.id.toolbar);
|
||||
MaterialToolbar toolbar = view.findViewById(R.id.toolbar);
|
||||
|
||||
ViewCompat.setOnApplyWindowInsetsListener(toolbar, PaddingInsetsListener.excludeBottom());
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ import android.widget.TextView;
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
@@ -52,6 +51,8 @@ import app.organicmaps.widget.placepage.sections.PlacePageOpeningHoursFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePagePhoneFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageProductsFragment;
|
||||
import app.organicmaps.widget.placepage.sections.PlacePageWikipediaFragment;
|
||||
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -86,7 +87,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
|
||||
private View mFrame;
|
||||
// Preview.
|
||||
private ViewGroup mPreview;
|
||||
private Toolbar mToolbar;
|
||||
private MaterialToolbar mToolbar;
|
||||
private TextView mTvTitle;
|
||||
private TextView mTvSecondaryTitle;
|
||||
private TextView mTvSubtitle;
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<Button
|
||||
android:id="@+id/accept_btn"
|
||||
style="@style/MwmWidget.Button.Primary"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/accept"/>
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/sharing_options_img_size">
|
||||
<TextView
|
||||
android:id="@+id/decline_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:fontFamily="@string/robotoMedium"
|
||||
android:gravity="center"
|
||||
android:letterSpacing="0.01"
|
||||
android:textAllCaps="true"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textSize="@dimen/text_size_body_3"
|
||||
android:textStyle="normal"
|
||||
android:text="@string/learn_more"
|
||||
tools:ignore="UnusedAttribute"
|
||||
tools:text="NOT NOW" />
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
</merge>
|
||||
@@ -8,7 +8,7 @@
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="32dp"
|
||||
@@ -22,7 +22,7 @@
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
@@ -31,7 +31,7 @@
|
||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/car_used_on_the_car_screen"
|
||||
@@ -39,7 +39,7 @@
|
||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1" />
|
||||
</LinearLayout>
|
||||
|
||||
<Button
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_continue"
|
||||
style="@style/MwmWidget.Button.Accent"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="32dp"
|
||||
app:srcCompat="@drawable/ic_location_permission_request" />
|
||||
|
||||
<TextView
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="32dp"
|
||||
@@ -23,7 +23,7 @@
|
||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<Button
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_grant_permissions"
|
||||
style="@style/MwmWidget.Button.Accent"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:background="?cardBackground"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
@@ -15,7 +15,7 @@
|
||||
android:gravity="end|center_vertical"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme"
|
||||
tools:ignore="UnusedAttribute">
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
<LinearLayout
|
||||
android:layout_marginTop="@dimen/margin_half_double_plus"
|
||||
android:orientation="horizontal"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?windowBackgroundForced">
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
@@ -22,7 +22,7 @@
|
||||
android:layout_gravity="end|center_vertical"
|
||||
android:scaleType="centerInside"
|
||||
android:contentDescription="@string/save" />
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
<FrameLayout
|
||||
style="@style/MwmWidget.FrameLayout.Elevation"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/fragment_container"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
@@ -18,7 +18,7 @@
|
||||
android:id="@+id/save"
|
||||
style="@style/MwmWidget.Downloader.ToolbarButton"
|
||||
android:text="@string/editor_report_problem_send_button"/>
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/scrollView"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar_point_chooser"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<FrameLayout android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:theme="@style/MwmWidget.ToolbarTheme"
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
</FrameLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/driving_options_btn_container"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle.NoElevation"
|
||||
@@ -11,4 +11,4 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="gone"/>
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle"
|
||||
@@ -13,4 +13,4 @@
|
||||
android:orientation="vertical">
|
||||
<include layout="@layout/toolbar_search_controls" />
|
||||
</LinearLayout>
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/MwmWidget.ToolbarStyle.NoElevation"
|
||||
@@ -12,4 +12,4 @@
|
||||
android:orientation="vertical">
|
||||
<include layout="@layout/toolbar_search_controls" />
|
||||
</LinearLayout>
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<string name="type.amenity.charging_station">محطة شحن</string>
|
||||
<string name="type.amenity.charging_station.bicycle">محطة شحن الدراجات</string>
|
||||
<string name="type.amenity.charging_station.motorcar">محطة شحن السيارات</string>
|
||||
<string name="type.amenity.childcare">حضانة</string>
|
||||
<string name="type.amenity.childcare">حضّانة</string>
|
||||
<string name="type.amenity.cinema">سينما</string>
|
||||
<string name="type.leisure.bowling_alley">صالة بولينج</string>
|
||||
<string name="type.amenity.clinic">عيادة</string>
|
||||
@@ -62,7 +62,7 @@
|
||||
<string name="type.amenity.exhibition_centre">مركز المعرض</string>
|
||||
<string name="type.amenity.money_transfer">تحويل المال</string>
|
||||
<string name="type.amenity.music_school">مدرسة موسيقى</string>
|
||||
<string name="type.amenity.language_school">مدرسة لغة</string>
|
||||
<string name="type.amenity.language_school">مدرسة لغات</string>
|
||||
<string name="type.office.diplomatic">سفارة</string>
|
||||
<string name="type.amenity.fast_food">وجبات سريعة</string>
|
||||
<string name="type.amenity.ferry_terminal">محطة عبّارات</string>
|
||||
@@ -1278,4 +1278,7 @@
|
||||
<string name="type.amenity.dojo">دوجو</string>
|
||||
<!-- https://wiki.openstreetmap.org/wiki/Tag:leisure=sports_hall -->
|
||||
<string name="type.leisure.sports_hall">الصالة الرياضية</string>
|
||||
<string name="type.aerialway.mixed_lift">رفع مختلط</string>
|
||||
<string name="type.amenity.love_hotel">فندق جب</string>
|
||||
<string name="type.amenity.studio">معرض</string>
|
||||
</resources>
|
||||
|
||||
@@ -1332,4 +1332,8 @@
|
||||
<string name="type.organic.only">有機</string>
|
||||
<string name="type.organic.yes">有機</string>
|
||||
<string name="type.power.pole">電柱</string>
|
||||
<string name="type.amenity.shelter.lean_to">三壁の避難所</string>
|
||||
<string name="type.amenity.vending_machine.excrement_bags">うんち袋の自販機</string>
|
||||
<string name="type.amenity.parcel_locker">宅配ロッカー</string>
|
||||
<string name="type.amenity.waste_transfer_station">ゴミ処理場</string>
|
||||
</resources>
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
<string name="type.amenity.veterinary">獸醫</string>
|
||||
<string name="type.amenity.waste_basket">垃圾箱</string>
|
||||
<string name="type.amenity.waste_disposal">垃圾</string>
|
||||
<string name="type.amenity.waste_transfer_station">垃圾轉運站</string>
|
||||
<string name="type.amenity.waste_transfer_station">廢物轉運站</string>
|
||||
<string name="type.amenity.water_point">飲水站</string>
|
||||
<string name="type.amenity.water_point.drinking_water_no">飲水站</string>
|
||||
<string name="type.barrier">障礙物</string>
|
||||
@@ -1281,4 +1281,5 @@
|
||||
<!-- https://wiki.openstreetmap.org/wiki/Tag:leisure=sports_hall -->
|
||||
<string name="type.leisure.sports_hall">體育館</string>
|
||||
<string name="type.attraction.bumper_car">碰碰車</string>
|
||||
<string name="type.leisure.track">賽道</string>
|
||||
</resources>
|
||||
|
||||
@@ -32,4 +32,7 @@
|
||||
<string name="type.organic.yes">有機</string>
|
||||
<string name="type.power.pole">電線桿</string>
|
||||
<string name="type.amenity.shelter.lean_to">三面避難所</string>
|
||||
<string name="type.amenity.waste_transfer_station">垃圾轉運站</string>
|
||||
<string name="type.amenity.vending_machine.excrement_bags">撿便袋販賣機</string>
|
||||
<string name="type.amenity.parcel_locker">智取櫃</string>
|
||||
</resources>
|
||||
|
||||
@@ -67,11 +67,7 @@ UNIT_TEST(AlmostEqualULPs_double)
|
||||
TEST(!base::AlmostEqualULPs(1.0, -1.0), ());
|
||||
TEST(!base::AlmostEqualULPs(2.0, -2.0), ());
|
||||
TEST(!base::AlmostEqualULPs(dmax, -dmax), ());
|
||||
|
||||
// That's why AlmostEqualULPs is a strange function, IMHO.
|
||||
TEST(!base::AlmostEqualULPs(0.0, eps), ());
|
||||
TEST(!base::AlmostEqualULPs(-eps, 0.0), ());
|
||||
TEST(!base::AlmostEqualULPs(eps, 2.0*eps), ());
|
||||
}
|
||||
|
||||
UNIT_TEST(AlmostEqualULPs_float)
|
||||
@@ -95,11 +91,7 @@ UNIT_TEST(AlmostEqualULPs_float)
|
||||
TEST(!base::AlmostEqualULPs(1.0f, -1.0f), ());
|
||||
TEST(!base::AlmostEqualULPs(2.0f, -2.0f), ());
|
||||
TEST(!base::AlmostEqualULPs(dmax, -dmax), ());
|
||||
|
||||
// That's why AlmostEqualULPs is a strange function, IMHO.
|
||||
TEST(!base::AlmostEqualULPs(0.0f, eps), ());
|
||||
TEST(!base::AlmostEqualULPs(-eps, 0.0f), ());
|
||||
TEST(!base::AlmostEqualULPs(eps, 2.0f*eps), ());
|
||||
}
|
||||
|
||||
UNIT_TEST(AlmostEqual_Smoke)
|
||||
|
||||
@@ -34,8 +34,6 @@ public:
|
||||
}
|
||||
|
||||
size_t size() const { return m_map.size(); }
|
||||
auto begin() const { return m_map.begin(); }
|
||||
auto end() const { return m_map.end(); }
|
||||
|
||||
protected:
|
||||
/// @todo buffer_vector is not suitable now, because Key/Value is not default constructible.
|
||||
|
||||
@@ -440,66 +440,15 @@ bool AlmostEqual(std::string const & str1, std::string const & str2, size_t mism
|
||||
return false;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
// Trim, unquote the string, and unescape two double quotes.
|
||||
std::string & UnescapeCSVColumn(std::string & s)
|
||||
{
|
||||
Trim(s);
|
||||
|
||||
if (s.size() < 2)
|
||||
return s;
|
||||
|
||||
if (*s.begin() == '"' && *s.rbegin() == '"')
|
||||
s = s.substr(1, s.size() - 2);
|
||||
|
||||
for (size_t i = 1; i < s.size(); ++i)
|
||||
if (s[i] == '"' && s[i - 1] == '"')
|
||||
s.erase(i, 1);
|
||||
|
||||
return s;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void ParseCSVRow(std::string const & row, char const delimiter, std::vector<std::string> & target)
|
||||
void ParseCSVRow(std::string const & s, char const delimiter, std::vector<std::string> & target)
|
||||
{
|
||||
target.clear();
|
||||
|
||||
std::string prevColumns;
|
||||
for (TokenizeIterator<SimpleDelimiter, std::string::const_iterator, true /* KeepEmptyTokens */> it {row.begin(), row.end(), delimiter}; it; ++it)
|
||||
TokenizeIterator<SimpleDelimiter, std::string::const_iterator, true /* KeepEmptyTokens */> it(s.begin(), s.end(), delimiter);
|
||||
for (; it; ++it)
|
||||
{
|
||||
std::string_view column = *it;
|
||||
size_t const quotesCount = std::count(column.begin(), column.end(), '"');
|
||||
bool const evenQuotes = quotesCount % 2 == 0;
|
||||
if (prevColumns.empty())
|
||||
{
|
||||
if (evenQuotes)
|
||||
{
|
||||
if (quotesCount == 0)
|
||||
target.emplace_back(column);
|
||||
else
|
||||
{
|
||||
std::string strColumn {column};
|
||||
target.push_back(UnescapeCSVColumn(strColumn));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prevColumns = column;
|
||||
prevColumns.push_back(',');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prevColumns.append(column);
|
||||
if (evenQuotes)
|
||||
prevColumns.push_back(',');
|
||||
else
|
||||
{
|
||||
target.push_back(UnescapeCSVColumn(prevColumns));
|
||||
prevColumns.clear();
|
||||
}
|
||||
}
|
||||
std::string column(*it);
|
||||
Trim(column);
|
||||
target.push_back(std::move(column));
|
||||
}
|
||||
|
||||
// Special case: if the string is empty, return an empty array instead of {""}.
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace csv_reader_test
|
||||
{
|
||||
using platform::tests_support::ScopedFile;
|
||||
|
||||
using Row = coding::CSVReader::Row;
|
||||
@@ -181,41 +179,3 @@ UNIT_TEST(CSVReaderIterator)
|
||||
TEST_EQUAL(index, answer.size(), ());
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(CSVReaderEmptyColumns)
|
||||
{
|
||||
auto const kContentWithEmptyColumns = ",,2,,4,\n,,,,,";
|
||||
auto const fileName = "test.csv";
|
||||
ScopedFile sf(fileName, kContentWithEmptyColumns);
|
||||
Rows const answer = {{"", "", "2", "", "4", ""}, {"", "", "", "", "", ""}};
|
||||
coding::CSVReader reader(sf.GetFullPath());
|
||||
size_t index = 0;
|
||||
while (auto const optionalRow = reader.ReadRow())
|
||||
{
|
||||
TEST_EQUAL(*optionalRow, answer[index], ());
|
||||
++index;
|
||||
}
|
||||
TEST_EQUAL(index, answer.size(), ());
|
||||
TEST(!reader.ReadRow(), ());
|
||||
TEST(!reader.ReadRow(), ());
|
||||
}
|
||||
|
||||
UNIT_TEST(CSVReaderQuotes)
|
||||
{
|
||||
auto const kContentWithQuotes = R"(noquotes, "" , "with space","with, comma","""double"" quotes","""double,"", commas", """""",)";
|
||||
auto const fileName = "test.csv";
|
||||
ScopedFile sf(fileName, kContentWithQuotes);
|
||||
Rows const answer = {{"noquotes", "", "with space", "with, comma", "\"double\" quotes", "\"double,\", commas","\"\"", ""}};
|
||||
coding::CSVReader reader(sf.GetFullPath());
|
||||
size_t index = 0;
|
||||
while (auto const optionalRow = reader.ReadRow())
|
||||
{
|
||||
TEST_EQUAL(*optionalRow, answer[index], ());
|
||||
++index;
|
||||
}
|
||||
TEST_EQUAL(index, answer.size(), ());
|
||||
TEST(!reader.ReadRow(), ());
|
||||
TEST(!reader.ReadRow(), ());
|
||||
}
|
||||
|
||||
} // namespace csv_reader_test
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
#include "testing/testing.hpp"
|
||||
|
||||
#include "coding/internal/file_data.hpp"
|
||||
#include "coding/writer.hpp"
|
||||
|
||||
#include "base/logging.hpp"
|
||||
|
||||
#include <cstring> // strlen
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace file_data_test
|
||||
{
|
||||
@@ -217,35 +220,6 @@ UNIT_TEST(EmptyFile)
|
||||
TEST(DeleteFileX(copy), ());
|
||||
}
|
||||
|
||||
UNIT_TEST(RenameOnExistingFile)
|
||||
{
|
||||
using namespace base;
|
||||
|
||||
std::string const name = "test.empty";
|
||||
std::string const copy = "test.empty.copy";
|
||||
{
|
||||
FileData f(name, FileData::Op::WRITE_TRUNCATE);
|
||||
uint8_t const x = 1;
|
||||
f.Write(&x, 1);
|
||||
}
|
||||
{
|
||||
FileData f(copy, FileData::Op::WRITE_TRUNCATE);
|
||||
uint8_t const x = 2;
|
||||
f.Write(&x, 1);
|
||||
}
|
||||
|
||||
TEST(RenameFileX(name, copy), ());
|
||||
|
||||
{
|
||||
FileData f(copy, FileData::Op::READ);
|
||||
uint8_t x;
|
||||
f.Read(0, &x, 1);
|
||||
TEST_EQUAL(x, 1, ());
|
||||
}
|
||||
|
||||
TEST(DeleteFileX(copy), ());
|
||||
}
|
||||
|
||||
// Made this 'obvious' test for getline. I had (or not?) behaviour when 'while (getline)' loop
|
||||
// didn't get last string in file without trailing '\n'.
|
||||
UNIT_TEST(File_StdGetLine)
|
||||
|
||||
232
data/colors.txt
@@ -59,6 +59,7 @@
|
||||
2236962
|
||||
2301728
|
||||
2302755
|
||||
2364429
|
||||
2367520
|
||||
2374579
|
||||
2399474
|
||||
@@ -66,6 +67,7 @@
|
||||
2498323
|
||||
2499106
|
||||
2500128
|
||||
2592674
|
||||
2631706
|
||||
2695475
|
||||
2706568
|
||||
@@ -87,7 +89,6 @@
|
||||
3434779
|
||||
3542630
|
||||
3552308
|
||||
3584191
|
||||
3629602
|
||||
3677972
|
||||
3681605
|
||||
@@ -95,6 +96,7 @@
|
||||
3684408
|
||||
3773998
|
||||
3832097
|
||||
3874837
|
||||
3881273
|
||||
3881787
|
||||
3968060
|
||||
@@ -144,6 +146,7 @@
|
||||
6164237
|
||||
6173981
|
||||
6247213
|
||||
6272197
|
||||
6291544
|
||||
6381914
|
||||
6381921
|
||||
@@ -160,6 +163,7 @@
|
||||
6967599
|
||||
7105644
|
||||
7224647
|
||||
7302655
|
||||
7353344
|
||||
7434609
|
||||
7542806
|
||||
@@ -189,12 +193,15 @@
|
||||
8550167
|
||||
8916559
|
||||
8947848
|
||||
9099495
|
||||
9163744
|
||||
9211020
|
||||
9326109
|
||||
9404166
|
||||
9682745
|
||||
9718290
|
||||
9868678
|
||||
9815480
|
||||
9868939
|
||||
9868950
|
||||
10066329
|
||||
10167040
|
||||
@@ -205,142 +212,164 @@
|
||||
10340289
|
||||
10395294
|
||||
10426903
|
||||
10506258
|
||||
10592406
|
||||
10790054
|
||||
11053224
|
||||
11057133
|
||||
11058780
|
||||
11112295
|
||||
11184810
|
||||
11190117
|
||||
11250586
|
||||
11453035
|
||||
11584112
|
||||
11710882
|
||||
11387999
|
||||
11579812
|
||||
11585379
|
||||
11711154
|
||||
11716458
|
||||
11720246
|
||||
11720952
|
||||
11770767
|
||||
11781233
|
||||
11836942
|
||||
11841150
|
||||
11898395
|
||||
11979115
|
||||
12000284
|
||||
12039862
|
||||
12105912
|
||||
12372094
|
||||
12504182
|
||||
12517551
|
||||
12700809
|
||||
12763315
|
||||
12699589
|
||||
12837073
|
||||
12895428
|
||||
13029267
|
||||
12896712
|
||||
12898689
|
||||
13028554
|
||||
13031851
|
||||
13155550
|
||||
13161612
|
||||
13163437
|
||||
13224123
|
||||
13229526
|
||||
13357519
|
||||
13407549
|
||||
13420474
|
||||
13484259
|
||||
13538264
|
||||
13615592
|
||||
13620648
|
||||
13746411
|
||||
13749671
|
||||
13942770
|
||||
13554898
|
||||
13555607
|
||||
13685196
|
||||
13947850
|
||||
14144428
|
||||
13952918
|
||||
14014162
|
||||
14209512
|
||||
14275263
|
||||
14539184
|
||||
14802147
|
||||
14934482
|
||||
14951168
|
||||
14999213
|
||||
15000299
|
||||
14999725
|
||||
15014691
|
||||
15022389
|
||||
15037299
|
||||
15062700
|
||||
15066325
|
||||
15086900
|
||||
15094016
|
||||
15128239
|
||||
15214341
|
||||
15260347
|
||||
15263452
|
||||
15591638
|
||||
15263457
|
||||
15263939
|
||||
15592411
|
||||
15592899
|
||||
15656370
|
||||
15658734
|
||||
15690752
|
||||
15754290
|
||||
15763456
|
||||
15790320
|
||||
15920858
|
||||
15921852
|
||||
15898392
|
||||
15900208
|
||||
15902016
|
||||
15921870
|
||||
16027569
|
||||
16056407
|
||||
16064048
|
||||
16087552
|
||||
16088855
|
||||
16103246
|
||||
16115926
|
||||
16117459
|
||||
16118756
|
||||
16119285
|
||||
16308697
|
||||
16311482
|
||||
16316664
|
||||
16169823
|
||||
16173957
|
||||
16180686
|
||||
16182236
|
||||
16183529
|
||||
16248287
|
||||
16311234
|
||||
16372627
|
||||
16391736
|
||||
16431936
|
||||
16433750
|
||||
16557154
|
||||
16575614
|
||||
16579778
|
||||
16579836
|
||||
16728450
|
||||
16733986
|
||||
16740096
|
||||
16741158
|
||||
16742950
|
||||
16746278
|
||||
16746306
|
||||
16747109
|
||||
16748864
|
||||
16749632
|
||||
16750080
|
||||
16750592
|
||||
16752972
|
||||
16756055
|
||||
16757286
|
||||
16760320
|
||||
16760658
|
||||
16762880
|
||||
16763432
|
||||
16763913
|
||||
16764506
|
||||
16765952
|
||||
16766323
|
||||
16767702
|
||||
16770999
|
||||
16774560
|
||||
16775925
|
||||
16776958
|
||||
16777215
|
||||
223300167
|
||||
234881023
|
||||
436602368
|
||||
437326080
|
||||
438572045
|
||||
439885588
|
||||
441002267
|
||||
441140803
|
||||
441199131
|
||||
441925171
|
||||
441272132
|
||||
441403975
|
||||
442905727
|
||||
443115881
|
||||
443432263
|
||||
443510271
|
||||
446405263
|
||||
451800027
|
||||
452524280
|
||||
452107824
|
||||
452109632
|
||||
452377439
|
||||
452764770
|
||||
452968274
|
||||
452983541
|
||||
452984574
|
||||
452984831
|
||||
575358531
|
||||
587201269
|
||||
609045837
|
||||
654706176
|
||||
655629312
|
||||
659106075
|
||||
658186261
|
||||
659244611
|
||||
659375940
|
||||
659507783
|
||||
660157219
|
||||
666683518
|
||||
670628088
|
||||
671054374
|
||||
671057702
|
||||
671061056
|
||||
666290539
|
||||
670074880
|
||||
670398976
|
||||
670414670
|
||||
671088382
|
||||
671088639
|
||||
856032768
|
||||
856756480
|
||||
@@ -349,6 +378,7 @@
|
||||
857223704
|
||||
857282841
|
||||
857551774
|
||||
858002445
|
||||
858401316
|
||||
858466343
|
||||
858532890
|
||||
@@ -357,12 +387,13 @@
|
||||
859519803
|
||||
859645463
|
||||
860111940
|
||||
860432667
|
||||
860571203
|
||||
860629531
|
||||
860834375
|
||||
861027891
|
||||
861097451
|
||||
861295871
|
||||
861355571
|
||||
861483811
|
||||
861690961
|
||||
861690972
|
||||
861885229
|
||||
@@ -370,28 +401,33 @@
|
||||
862148400
|
||||
862348902
|
||||
862862663
|
||||
862940671
|
||||
863203947
|
||||
863664762
|
||||
863850275
|
||||
864585864
|
||||
864835622
|
||||
864925824
|
||||
864964125
|
||||
865356306
|
||||
865445970
|
||||
865871792
|
||||
866144274
|
||||
868514559
|
||||
868862139
|
||||
869387687
|
||||
869585866
|
||||
869590934
|
||||
869652178
|
||||
870704341
|
||||
871230427
|
||||
871954680
|
||||
871536408
|
||||
871540032
|
||||
871741262
|
||||
871807839
|
||||
871811973
|
||||
872195170
|
||||
872395302
|
||||
872215006
|
||||
872413941
|
||||
872414974
|
||||
872415231
|
||||
1074136576
|
||||
1078675011
|
||||
1090058488
|
||||
1090519039
|
||||
1216522952
|
||||
1291845632
|
||||
@@ -406,6 +442,7 @@
|
||||
1293490457
|
||||
1293753629
|
||||
1294082594
|
||||
1294210061
|
||||
1294608932
|
||||
1294673959
|
||||
1294738992
|
||||
@@ -414,14 +451,13 @@
|
||||
1295200561
|
||||
1295201075
|
||||
1295397940
|
||||
1295429823
|
||||
1295523604
|
||||
1295527997
|
||||
1295658816
|
||||
1295720469
|
||||
1295727419
|
||||
1295853079
|
||||
1295855912
|
||||
1296187970
|
||||
1296316234
|
||||
1296319556
|
||||
1296381741
|
||||
@@ -432,7 +468,6 @@
|
||||
1296845900
|
||||
1296910148
|
||||
1296977469
|
||||
1297041991
|
||||
1297109072
|
||||
1297235507
|
||||
1297305067
|
||||
@@ -443,7 +478,9 @@
|
||||
1297898588
|
||||
1298019613
|
||||
1298092845
|
||||
1298117829
|
||||
1298131758
|
||||
1298227553
|
||||
1298283903
|
||||
1298356016
|
||||
1298359132
|
||||
@@ -457,38 +494,46 @@
|
||||
1300793480
|
||||
1301043238
|
||||
1301056384
|
||||
1301133440
|
||||
1301171741
|
||||
1301433013
|
||||
1301563922
|
||||
1301653586
|
||||
1301661112
|
||||
1301714310
|
||||
1301714571
|
||||
1302101349
|
||||
1302185921
|
||||
1302351890
|
||||
1302438038
|
||||
1303425444
|
||||
1303556514
|
||||
1304148906
|
||||
1304608947
|
||||
1304535147
|
||||
1304722175
|
||||
1304938175
|
||||
1305069755
|
||||
1305595303
|
||||
1305793482
|
||||
1305798550
|
||||
1305859794
|
||||
1306645694
|
||||
1306647779
|
||||
1306780114
|
||||
1307438043
|
||||
1307504366
|
||||
1307744024
|
||||
1307747648
|
||||
1307933184
|
||||
1307948878
|
||||
1307961558
|
||||
1307964388
|
||||
1308162296
|
||||
1308402786
|
||||
1308015455
|
||||
1308019589
|
||||
1308218259
|
||||
1308422622
|
||||
1308425468
|
||||
1308576652
|
||||
1308586790
|
||||
1308588582
|
||||
1308591910
|
||||
1308594496
|
||||
1308595264
|
||||
1308601687
|
||||
1308604747
|
||||
1308606290
|
||||
1308622590
|
||||
1308622847
|
||||
1511594265
|
||||
1523897290
|
||||
@@ -508,29 +553,33 @@
|
||||
1715283479
|
||||
1715287582
|
||||
1715749956
|
||||
1715771835
|
||||
1716070683
|
||||
1716276300
|
||||
1716665907
|
||||
1716868437
|
||||
1716933887
|
||||
1717150383
|
||||
1717328977
|
||||
1717523245
|
||||
1717714303
|
||||
1717786416
|
||||
1717789532
|
||||
1718500679
|
||||
1718578687
|
||||
1719302778
|
||||
1719488291
|
||||
1720223880
|
||||
1720473638
|
||||
1720486784
|
||||
1720602141
|
||||
1720994322
|
||||
1721144710
|
||||
1721782290
|
||||
1724152575
|
||||
1724368575
|
||||
1724500155
|
||||
1724896680
|
||||
1724437644
|
||||
1725290194
|
||||
1727174424
|
||||
1728053247
|
||||
1931024665
|
||||
1943327690
|
||||
@@ -545,9 +594,7 @@
|
||||
2149720610
|
||||
2150377008
|
||||
2150839091
|
||||
2151067839
|
||||
2151296832
|
||||
2151365435
|
||||
2151493928
|
||||
2151825986
|
||||
2151957572
|
||||
@@ -556,12 +603,13 @@
|
||||
2152483916
|
||||
2152615485
|
||||
2153076053
|
||||
2153141503
|
||||
2153536593
|
||||
2153755845
|
||||
2153769774
|
||||
2153921919
|
||||
2153997148
|
||||
2154708295
|
||||
2154786303
|
||||
2154984050
|
||||
2155510394
|
||||
2155695907
|
||||
@@ -570,20 +618,19 @@
|
||||
2156431496
|
||||
2156681254
|
||||
2156694400
|
||||
2156771456
|
||||
2157291602
|
||||
2157352326
|
||||
2157739365
|
||||
2159194530
|
||||
2159483932
|
||||
2160246963
|
||||
2160360191
|
||||
2160707771
|
||||
2161168844
|
||||
2162418130
|
||||
2162506037
|
||||
2163123456
|
||||
2163800312
|
||||
2164002331
|
||||
2164214668
|
||||
2164260606
|
||||
2164260863
|
||||
2370396489
|
||||
2371253590
|
||||
@@ -601,22 +648,20 @@
|
||||
2571387972
|
||||
2571723081
|
||||
2571847235
|
||||
2572571903
|
||||
2572580182
|
||||
2573200174
|
||||
2573352319
|
||||
2574138695
|
||||
2575126307
|
||||
2575861896
|
||||
2576111654
|
||||
2576201856
|
||||
2576722002
|
||||
2576782726
|
||||
2579790591
|
||||
2580006591
|
||||
2580534696
|
||||
2580075660
|
||||
2582553856
|
||||
2583230712
|
||||
2583432731
|
||||
2583691006
|
||||
2583691263
|
||||
2787649562
|
||||
2789826889
|
||||
@@ -633,17 +678,13 @@
|
||||
3006477107
|
||||
3006694172
|
||||
3007595588
|
||||
3007916315
|
||||
3008113177
|
||||
3008779519
|
||||
3009559935
|
||||
3010346311
|
||||
3012069512
|
||||
3015998207
|
||||
3016153515
|
||||
3018761472
|
||||
3019640347
|
||||
3019862822
|
||||
3019870528
|
||||
3019898879
|
||||
3226034505
|
||||
@@ -655,6 +696,7 @@
|
||||
3427361097
|
||||
3428218198
|
||||
3428990335
|
||||
3430649653
|
||||
3431500856
|
||||
3432785840
|
||||
3435428607
|
||||
@@ -667,7 +709,7 @@
|
||||
3645464905
|
||||
3646322006
|
||||
3647094143
|
||||
3649819616
|
||||
3649755367
|
||||
3653532415
|
||||
3657174555
|
||||
3942645760
|
||||
|
||||
@@ -19,7 +19,7 @@ with open('countries-to-generate.json') as f1:
|
||||
entry = {
|
||||
"key": c,
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"profileName": "normal",
|
||||
"tileCoordsSubset": list(),
|
||||
"tilesAreBanned": False
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
{
|
||||
"key": "Algeria_Central",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"profileName": "extra_small",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
@@ -9691,262 +9691,6 @@
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Angola",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Australia_Northern Territory",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Australia_Queensland",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Australia_Western Australia",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Brazil_Mato Grosso",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Brazil_North Region_East",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Brazil_North Region_West",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Cameroon_Central",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Canada_Nunavut_North",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Canada_Nunavut_South",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "China_Gansu",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "China_Sichuan",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Colombia_East",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Congo-Kinshasa_West",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Indonesia_Central",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Indonesia_West",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Iran_East",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Kenya",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Libya",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Madagascar",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Malaysia",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Mali",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Mongolia",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Mozambique",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Myanmar",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Vietnam",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Nigeria_South",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Russia_Krasnoyarsk Krai_North",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Russia_Sakha Republic",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Tanzania",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Zambia",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Zimbabwe",
|
||||
"value": {
|
||||
"profileName": "poor",
|
||||
"tileCoordsSubset": [],
|
||||
"tilesAreBanned": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,13 +63,13 @@
|
||||
{
|
||||
"key": "poor",
|
||||
"value": {
|
||||
"alitudesStep": 100,
|
||||
"alitudesStep": 500,
|
||||
"gaussianFilterRFactor": 1.0,
|
||||
"gaussianFilterStDev": 2.0,
|
||||
"latLonStepFactor": 4,
|
||||
"latLonStepFactor": 2,
|
||||
"maxIsolinesLength": 500,
|
||||
"medianFilterR": 1,
|
||||
"simplificationZoom": 13
|
||||
"simplificationZoom": 14
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -24,29 +24,35 @@
|
||||
10.8 4.5
|
||||
13.5 5.4
|
||||
18.0 6.2
|
||||
5.0 2.0
|
||||
6.0 2.5
|
||||
8.0 3.0
|
||||
10.0 3.5
|
||||
5.0 3.0
|
||||
6.0 4.2
|
||||
8.0 5.5
|
||||
10.0 6.7
|
||||
2.0 1.0
|
||||
3.6 1.6
|
||||
5.0 2.2
|
||||
5.4 2.7
|
||||
7.0 3.0
|
||||
16.2 8.1
|
||||
5.0 1.5
|
||||
6.0 1.8
|
||||
8.0 2.3
|
||||
10.0 2.7
|
||||
6.0 9.0
|
||||
8.0 10.0
|
||||
10.0 11.0
|
||||
15.0 15.0
|
||||
20.0 20.0
|
||||
4.0 1.0
|
||||
6.0 1.3
|
||||
8.0 1.5
|
||||
9.0 1.8
|
||||
11.0 2.3
|
||||
13.0 2.7
|
||||
5.0 5.0
|
||||
4.0 4.0
|
||||
3.5 2.0
|
||||
4.0 2.5
|
||||
6.0 3.5
|
||||
8.0 4.5
|
||||
7.0 9.6
|
||||
3.5 2.7
|
||||
7.5 9.5
|
||||
4.0 3.2
|
||||
8.0 9.4
|
||||
8.5 9.3
|
||||
6.0 4.7
|
||||
9.0 9.2
|
||||
8.0 6.2
|
||||
1.0 2.0
|
||||
1.8 2.5
|
||||
@@ -59,6 +65,8 @@
|
||||
2.5 2.2
|
||||
3.2 2.8
|
||||
4.0 3.5
|
||||
6.0 2.5
|
||||
7.0 3.0
|
||||
9.0 3.5
|
||||
12.0 3.5
|
||||
4.0 2.0 2.0 1.5
|
||||
@@ -78,12 +86,16 @@
|
||||
10.0 10.0
|
||||
13.0 13.0
|
||||
16.0 16.0
|
||||
5.4 2.7
|
||||
2.7 2.7
|
||||
4.95 4.95
|
||||
6.0 1.0
|
||||
7.0 1.2
|
||||
9.0 1.7
|
||||
12.0 2.2
|
||||
2.0 6.0
|
||||
3.0 7.0
|
||||
4.0 8.0
|
||||
3.5 2.5
|
||||
4.0 3.0
|
||||
6.0 4.5
|
||||
@@ -102,6 +114,7 @@
|
||||
2.5 7.0
|
||||
5.2 5.2
|
||||
3.5 3.5
|
||||
5.0 2.0
|
||||
10.1 10.1
|
||||
0.8 12.0
|
||||
1.15 14.0
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
/*3.2 Vegetation*/
|
||||
|
||||
@forest: #141C00;
|
||||
@heath: #0F1400;
|
||||
@green0: #0F1400;
|
||||
@green1: #131900;
|
||||
@green1b: #141C00;
|
||||
@@ -101,6 +102,8 @@
|
||||
/* 5.ROADS */
|
||||
/* 5.1 All roads */
|
||||
|
||||
@motorway0: #3B2015;
|
||||
@motorway1: #3B2015;
|
||||
@trunk0: #49291B;
|
||||
@trunk1: #49291B;
|
||||
@primary0: #593323;
|
||||
@@ -126,6 +129,8 @@
|
||||
|
||||
/* 5.3 Tunnels */
|
||||
|
||||
@motorway_tunnel: #24140D;
|
||||
@motorway_tunnel_casing: #000000;
|
||||
@trunk_tunnel: #381F14;
|
||||
@trunk_tunnel_casing: #000000;
|
||||
@primary_tunnel: #4C2A1B;
|
||||
|
||||
@@ -91,11 +91,11 @@ line|z10-[boundary=administrative][admin_level=4]
|
||||
|
||||
area|z10-[landuse=forest],
|
||||
area|z10-[leisure=park],
|
||||
area|z12-[natural=heath],
|
||||
area|z12-[leisure=garden],
|
||||
area|z12-[landuse=grass],
|
||||
area|z12-[natural=grassland],
|
||||
area|z12-[leisure=golf_course],
|
||||
area|z12-[natural=heath],
|
||||
area|z12-[landuse=allotments],
|
||||
area|z12-[natural=bare_rock],
|
||||
area|z12-[natural=shingle],
|
||||
@@ -131,7 +131,6 @@ area|z16-[landuse=grass],
|
||||
area|z14-15[natural=grassland],
|
||||
area|z14-[leisure=golf_course],
|
||||
area|z14-[leisure=miniature_golf],
|
||||
area|z14-[natural=heath],
|
||||
area|z14-[landuse=allotments],
|
||||
area|z14-[landuse=orchard],
|
||||
area|z14-[landuse=plant_nursery],
|
||||
@@ -141,10 +140,11 @@ area|z14-[landuse=recreation_ground],
|
||||
area|z14-[landuse=village_green],
|
||||
area|z14-[landuse=field],
|
||||
{fill-color: @green1;}
|
||||
area|z11[landuse=forest],
|
||||
area|z16-[natural=grassland],
|
||||
area|z16-[landuse=meadow],
|
||||
{fill-color: @green1b;}
|
||||
area|z11-12[landuse=forest],
|
||||
area|z12[landuse=forest],
|
||||
area|z12[leisure=garden],
|
||||
{fill-color: @green2;}
|
||||
area|z13[landuse=forest],
|
||||
@@ -167,10 +167,11 @@ area|z16-[leisure=garden][garden:type=residential],
|
||||
area|z17-[leisure=garden][garden:type=residential],
|
||||
{fill-color: @green2;}
|
||||
|
||||
area|z12-[natural=heath],
|
||||
{fill-color: @heath;}
|
||||
area|z12-13[landuse=grass],
|
||||
area|z12-13[natural=grassland],
|
||||
area|z12-13[leisure=golf_course],
|
||||
area|z12-13[natural=heath],
|
||||
area|z12-13[landuse=allotments],
|
||||
area|z12-13[landuse=orchard],
|
||||
area|z12-13[landuse=plant_nursery],
|
||||
@@ -548,11 +549,11 @@ line|z19-[man_made=cutline],
|
||||
|
||||
area|z14[building],
|
||||
area|z14[waterway=dam],
|
||||
{fill-color: @building0;fill-opacity: 0.5;}
|
||||
{fill-color: @building0;fill-opacity: 0.6;}
|
||||
|
||||
area|z15[building],
|
||||
area|z15[waterway=dam],
|
||||
{fill-color: @building0;fill-opacity: 0.6;}
|
||||
{fill-color: @building0;fill-opacity: 0.7;}
|
||||
|
||||
area|z14-15[aeroway=terminal],
|
||||
area|z16[building],
|
||||
@@ -605,13 +606,13 @@ line|z19-[barrier=hedge],
|
||||
|
||||
line|z14-[barrier=city_wall],
|
||||
line|z14-[historic=citywalls],
|
||||
{color: @building1; width: 2; opacity: 0.7;}
|
||||
{color: @building_border1; width: 2; opacity: 0.9;}
|
||||
line|z15[barrier=city_wall],
|
||||
line|z15[historic=citywalls],
|
||||
{width: 2.8;}
|
||||
line|z16-[barrier=city_wall],
|
||||
line|z16-[historic=citywalls],
|
||||
{color: @building0; width: 4.5; dashes: 3,3,1.5,3;}
|
||||
{width: 4.5; dashes: 3,3,1.5,3;}
|
||||
line|z17[barrier=city_wall],
|
||||
line|z17[historic=citywalls],
|
||||
{width: 5.9; dashes: 4,4,1.9,4;}
|
||||
@@ -656,7 +657,7 @@ line|z18-[barrier=retaining_wall],
|
||||
|
||||
|
||||
line|z16-[man_made=embankment],
|
||||
{color: @building1; width: 3.5; dashes: 4,2,2,1.5; opacity: 0.7;}
|
||||
{color: @building_border0; width: 3.5; dashes: 4,2,2,1.5; opacity: 0.7;}
|
||||
line|z17[man_made=embankment],
|
||||
{width: 5; dashes: 6,3,3,2;}
|
||||
line|z18-[man_made=embankment],
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
line|z6-9[highway=world_towns_level],
|
||||
line|z4-9[highway=world_level],
|
||||
{color: @trunk1;opacity: 1;}
|
||||
{color: @motorway1;opacity: 1;}
|
||||
|
||||
line|z4[highway=world_level]
|
||||
{width: 0.5;}
|
||||
@@ -73,20 +73,23 @@ line|z9[highway=world_level]
|
||||
|
||||
/* 3.TRUNK & MOTORWAY 6-22 ZOOM */
|
||||
|
||||
line|z6[highway=trunk],
|
||||
line|z6[highway=motorway],
|
||||
{color: @trunk0; opacity: 0.3;}
|
||||
{color: @motorway0; opacity: 1;}
|
||||
line|z6[highway=trunk],
|
||||
{color: @trunk0; opacity: 0.6;}
|
||||
line|z7-13[highway=motorway],
|
||||
{color: @motorway0; opacity: 1;}
|
||||
line|z7-9[highway=trunk],
|
||||
line|z7-9[highway=motorway],
|
||||
{color: @trunk0; opacity: 0.7;}
|
||||
|
||||
line|z10-[highway=trunk],
|
||||
line|z10-[highway=motorway],
|
||||
{color: @trunk1; opacity: 0.7;}
|
||||
{color: @trunk0; opacity: 0.8;}
|
||||
line|z10-13[highway=trunk],
|
||||
{color: @trunk1; opacity: 1;}
|
||||
line|z14-[highway=motorway],
|
||||
{color: @motorway1;}
|
||||
line|z14-[highway=trunk],
|
||||
{color: @trunk1; opacity: 0.9;}
|
||||
line|z10-[highway=motorway_link],
|
||||
line|z10-[highway=trunk_link],
|
||||
{color: @primary0; opacity: 0.7;}
|
||||
line|z13-14[highway=trunk],
|
||||
line|z13-14[highway=motorway],
|
||||
line|z14-15[highway=motorway_link],
|
||||
line|z14-15[highway=trunk_link],
|
||||
@@ -110,85 +113,112 @@ line|z14-[highway=trunk_link][bridge?]::bridgeblack,
|
||||
|
||||
/* 3.1 Trunk & Motorway 6-22 ZOOM */
|
||||
|
||||
line|z6[highway=trunk],
|
||||
line|z6[highway=motorway],
|
||||
{width: 1.7;}
|
||||
line|z7[highway=motorway]
|
||||
{width: 1.8;}
|
||||
line|z8[highway=motorway]
|
||||
{width: 1.9;}
|
||||
line|z9[highway=motorway]
|
||||
{width: 2.0;}
|
||||
line|z10[highway=motorway]
|
||||
{width: 2.2;}
|
||||
line|z11[highway=motorway]
|
||||
{width: 2.4;}
|
||||
line|z12[highway=motorway]
|
||||
{width: 2.7;}
|
||||
line|z13[highway=motorway],
|
||||
{width: 3.6;}
|
||||
line|z14[highway=motorway],
|
||||
{width: 4.4;}
|
||||
line|z15[highway=motorway],
|
||||
{width: 5.6;}
|
||||
line|z16[highway=motorway],
|
||||
{width: 7.8;}
|
||||
line|z17[highway=motorway],
|
||||
{width: 9.0;}
|
||||
line|z18[highway=motorway],
|
||||
{width: 12.0;}
|
||||
line|z19-[highway=motorway],
|
||||
{width: 16.0;}
|
||||
|
||||
line|z6[highway=trunk],
|
||||
{width: 0.8;}
|
||||
line|z7[highway=trunk],
|
||||
line|z7[highway=motorway]
|
||||
{width: 0.9;}
|
||||
line|z8[highway=trunk],
|
||||
line|z8[highway=motorway]
|
||||
{width: 1.1;}
|
||||
line|z9[highway=trunk],
|
||||
line|z9[highway=motorway]
|
||||
{width: 1.2;}
|
||||
line|z9[highway=trunk],
|
||||
{width: 1.3;}
|
||||
line|z10[highway=trunk],
|
||||
line|z10[highway=motorway]
|
||||
{width: 1.5;}
|
||||
line|z11[highway=trunk],
|
||||
line|z11[highway=motorway]
|
||||
{width: 1.7;}
|
||||
line|z12[highway=trunk],
|
||||
line|z12[highway=motorway]
|
||||
{width: 1.9;}
|
||||
line|z11[highway=trunk],
|
||||
{width: 2.1;}
|
||||
line|z12[highway=trunk],
|
||||
{width: 2.4;}
|
||||
line|z13[highway=trunk],
|
||||
line|z13[highway=motorway],
|
||||
{width: 2.8;}
|
||||
{width: 3.2;}
|
||||
line|z14[highway=trunk],
|
||||
line|z14[highway=motorway],
|
||||
{width: 3.8;}
|
||||
{width: 4.0;}
|
||||
line|z15[highway=trunk],
|
||||
line|z15[highway=motorway],
|
||||
{width: 4.4;}
|
||||
{width: 4.8;}
|
||||
line|z16[highway=trunk],
|
||||
line|z16[highway=motorway],
|
||||
{width: 6;}
|
||||
{width: 6.2;}
|
||||
line|z17[highway=trunk],
|
||||
line|z17[highway=motorway],
|
||||
{width: 8.2;}
|
||||
line|z18[highway=trunk],
|
||||
line|z18[highway=motorway],
|
||||
{width: 11;}
|
||||
line|z19-[highway=trunk],
|
||||
line|z19-[highway=motorway],
|
||||
{width: 13.5;}
|
||||
|
||||
line|z10[highway=motorway_link],
|
||||
{width: 0.9;}
|
||||
line|z11[highway=motorway_link],
|
||||
{width: 1.1;}
|
||||
line|z12[highway=motorway_link],
|
||||
{width: 1.4;}
|
||||
line|z13[highway=motorway_link],
|
||||
{width: 1.9;}
|
||||
line|z14[highway=motorway_link],
|
||||
{width: 2.7;}
|
||||
line|z15[highway=motorway_link],
|
||||
{width: 3.7;}
|
||||
line|z16[highway=motorway_link],
|
||||
{width: 5.1;}
|
||||
line|z17[highway=motorway_link],
|
||||
{width: 6.7;}
|
||||
line|z18[highway=motorway_link],
|
||||
{width: 9.5;}
|
||||
line|z19-[highway=motorway_link],
|
||||
{width: 11.7;}
|
||||
|
||||
line|z10[highway=trunk_link]
|
||||
{width: 0.8;}
|
||||
line|z11[highway=motorway_link],
|
||||
line|z11[highway=trunk_link]
|
||||
{width: 1.0;}
|
||||
line|z12[highway=motorway_link],
|
||||
line|z12[highway=trunk_link]
|
||||
{width: 1.3;}
|
||||
line|z13[highway=motorway_link],
|
||||
line|z13[highway=trunk_link]
|
||||
{width: 1.8;}
|
||||
line|z14[highway=motorway_link],
|
||||
line|z14[highway=trunk_link]
|
||||
{width: 2.6;}
|
||||
line|z15[highway=motorway_link],
|
||||
line|z15[highway=trunk_link]
|
||||
{width: 3.6;}
|
||||
line|z16[highway=motorway_link],
|
||||
line|z16[highway=trunk_link]
|
||||
{width: 5;}
|
||||
line|z17[highway=motorway_link],
|
||||
line|z17[highway=trunk_link]
|
||||
{width: 6.6;}
|
||||
line|z18[highway=motorway_link],
|
||||
line|z18[highway=trunk_link]
|
||||
{width: 9.4;}
|
||||
line|z19-[highway=motorway_link],
|
||||
line|z19-[highway=trunk_link]
|
||||
{width: 11.6;}
|
||||
|
||||
/* 3.2 Trunk & Motorway tunnel 12-22 ZOOM */
|
||||
|
||||
line|z12-[highway=motorway][tunnel?],
|
||||
line|z12-[highway=trunk][tunnel?],
|
||||
line|z13-[highway=motorway_link][tunnel?],
|
||||
{color: @motorway_tunnel; casing-linecap: butt; casing-color: @motorway_tunnel_casing; casing-opacity: 0.7;}
|
||||
line|z12-[highway=trunk][tunnel?],
|
||||
line|z13-[highway=trunk_link][tunnel?],
|
||||
{color: @trunk_tunnel; casing-linecap: butt; casing-color: @trunk_tunnel_casing; casing-opacity: 0.7;}
|
||||
|
||||
@@ -246,16 +276,12 @@ line|z18-[highway=trunk_link][bridge?]::bridgeblack
|
||||
/* 4.PRIMARY 8-22 ZOOM */
|
||||
|
||||
line|z8-10[highway=primary],
|
||||
{color: @primary0; opacity: 0.7;}
|
||||
|
||||
line|z11-12[highway=primary],
|
||||
line|z11-12[highway=primary_link]
|
||||
{color: @primary1; opacity: 0.7;}
|
||||
line|z13-14[highway=primary],
|
||||
line|z13-14[highway=primary_link],
|
||||
{color: @primary1; opacity: 0.85;}
|
||||
line|z15-[highway=primary],
|
||||
line|z15-[highway=primary_link],
|
||||
{color: @primary0; opacity: 0.8;}
|
||||
line|z11-13[highway=primary],
|
||||
line|z11-13[highway=primary_link]
|
||||
{color: @primary1; opacity: 1;}
|
||||
line|z14-[highway=primary],
|
||||
line|z14-[highway=primary_link],
|
||||
{color: @primary2; opacity: 1;}
|
||||
|
||||
line|z14-[highway=primary][bridge?]::bridgewhite,
|
||||
@@ -272,25 +298,26 @@ line|z8[highway=primary],
|
||||
line|z9[highway=primary],
|
||||
{width: 0.8;}
|
||||
line|z10[highway=primary],
|
||||
{width: 1.2;}
|
||||
{width: 1.6;}
|
||||
line|z11[highway=primary],
|
||||
{width: 1.5;}
|
||||
{width: 2.0;}
|
||||
line|z12[highway=primary],
|
||||
{width: 1.7;}
|
||||
{width: 2.2;}
|
||||
line|z13[highway=primary],
|
||||
{width: 2.3;}
|
||||
{width: 2.6;}
|
||||
line|z14[highway=primary],
|
||||
{width: 3.2;}
|
||||
line|z15[highway=primary],
|
||||
{width: 3.8;}
|
||||
line|z15[highway=primary],
|
||||
{width: 4.4;}
|
||||
line|z16[highway=primary],
|
||||
{width: 5;}
|
||||
{width: 5.4;}
|
||||
line|z17[highway=primary],
|
||||
{width: 6.6;}
|
||||
{width: 7;}
|
||||
line|z18[highway=primary],
|
||||
{width: 9.4;}
|
||||
{width: 10;}
|
||||
line|z19-[highway=primary],
|
||||
{width: 11.6;}
|
||||
{width: 12;}
|
||||
|
||||
|
||||
line|z11[highway=primary_link],
|
||||
{width: 0.8;}
|
||||
@@ -348,13 +375,10 @@ line|z18-[highway=primary_link][bridge?]::bridgeblack,
|
||||
|
||||
/* 5.SECONDARY 10-22 ZOOM */
|
||||
|
||||
line|z10-12[highway=secondary],
|
||||
{color: @secondary0; opacity: 0.8;}
|
||||
line|z13-14[highway=secondary],
|
||||
line|z13-14[highway=secondary_link],
|
||||
{color: @secondary1; opacity: 0.9;}
|
||||
line|z15-[highway=secondary],
|
||||
line|z15-[highway=secondary_link],
|
||||
line|z10-13[highway=secondary],
|
||||
{color: @secondary0; opacity: 1;}
|
||||
line|z14-[highway=secondary],
|
||||
line|z14-[highway=secondary_link],
|
||||
{color: @secondary1; opacity: 1;}
|
||||
|
||||
line|z14-[highway=secondary][bridge?]::bridgewhite,
|
||||
@@ -367,13 +391,13 @@ line|z14-[highway=secondary_link][bridge?]::bridgeblack,
|
||||
/* 5.1 Secondary 10-22 ZOOM */
|
||||
|
||||
line|z10[highway=secondary],
|
||||
{width: 1.2;}
|
||||
{width: 1.4;}
|
||||
line|z11[highway=secondary],
|
||||
{width: 1.5;}
|
||||
{width: 1.8;}
|
||||
line|z12[highway=secondary],
|
||||
{width: 1.7;}
|
||||
{width: 2.0;}
|
||||
line|z13[highway=secondary],
|
||||
{width: 2.3;}
|
||||
{width: 2.4;}
|
||||
line|z14[highway=secondary],
|
||||
{width: 3.2;}
|
||||
line|z15[highway=secondary],
|
||||
@@ -432,18 +456,28 @@ line|z18-[highway=secondary_link][bridge?]::bridgeblack
|
||||
|
||||
/* 6.TERTIARY & UNCLASSIFIED 11-22 ZOOM */
|
||||
|
||||
line|z11-[highway=tertiary],
|
||||
line|z11-[highway=unclassified],
|
||||
line|z11-[highway=tertiary]
|
||||
{color: @tertiary; opacity: 1;}
|
||||
line|z12-13[highway=tertiary],
|
||||
{opacity: 0.95;}
|
||||
line|z14-[highway=tertiary_link],
|
||||
{color: @tertiary; opacity: 0.7;}
|
||||
{color: @tertiary;}
|
||||
line|z11-[highway=unclassified]
|
||||
{color: @tertiary; opacity: 0.95;}
|
||||
line|z12[highway=unclassified]
|
||||
{opacity: 0.8;}
|
||||
line|z13[highway=unclassified]
|
||||
{opacity: 0.58;}
|
||||
line|z14-15[highway=tertiary],
|
||||
line|z14-15[highway=unclassified],
|
||||
line|z15-16[highway=tertiary_link],
|
||||
{opacity: 0.85;}
|
||||
{color: @tertiary; opacity: 0.9;}
|
||||
line|z13-15[highway=unclassified]
|
||||
{opacity: 0.8;}
|
||||
line|z16-[highway=tertiary],
|
||||
line|z16-[highway=unclassified],
|
||||
line|z17-[highway=tertiary_link],
|
||||
{opacity: 1;}
|
||||
line|z16-[highway=unclassified],
|
||||
{opacity: 0.9;}
|
||||
|
||||
line|z14-[highway=tertiary][bridge?]::bridgewhite,
|
||||
line|z14-[highway=tertiary_link][bridge?]::bridgewhite
|
||||
@@ -457,31 +491,22 @@ line|z14-[highway=unclassified][bridge?]::bridgeblack,
|
||||
/* 6.1 Tertiary & Unclassified 11-22 ZOOM */
|
||||
|
||||
line|z11[highway=tertiary],
|
||||
line|z11[highway=unclassified],
|
||||
{width: 0.8;}
|
||||
{width: 1.2;}
|
||||
line|z12[highway=tertiary],
|
||||
line|z12[highway=unclassified],
|
||||
{width: 1.3;}
|
||||
{width: 1.6;}
|
||||
line|z13[highway=tertiary],
|
||||
line|z13[highway=unclassified],
|
||||
{width: 1.8;}
|
||||
line|z14[highway=tertiary],
|
||||
line|z14[highway=unclassified],
|
||||
{width: 2.7;}
|
||||
line|z15[highway=tertiary],
|
||||
line|z15[highway=unclassified],
|
||||
{width: 3.8;}
|
||||
line|z16[highway=tertiary],
|
||||
line|z16[highway=unclassified],
|
||||
{width: 5;}
|
||||
line|z17[highway=tertiary],
|
||||
line|z17[highway=unclassified],
|
||||
{width: 6.6;}
|
||||
line|z18[highway=tertiary],
|
||||
line|z18[highway=unclassified],
|
||||
{width: 9.4;}
|
||||
line|z19-[highway=tertiary],
|
||||
line|z19-[highway=unclassified],
|
||||
{width: 11.6;}
|
||||
|
||||
line|z14[highway=tertiary_link],
|
||||
@@ -497,6 +522,25 @@ line|z18[highway=tertiary_link],
|
||||
line|z19-[highway=tertiary_link],
|
||||
{width: 8.2;}
|
||||
|
||||
line|z11[highway=unclassified],
|
||||
{width: 0.6;}
|
||||
line|z12[highway=unclassified],
|
||||
{width: 1.0;}
|
||||
line|z13[highway=unclassified],
|
||||
{width: 1.4;}
|
||||
line|z14[highway=unclassified],
|
||||
{width: 2.3;}
|
||||
line|z15[highway=unclassified],
|
||||
{width: 3.2;}
|
||||
line|z16[highway=unclassified],
|
||||
{width: 4.2;}
|
||||
line|z17[highway=unclassified],
|
||||
{width: 6;}
|
||||
line|z18[highway=unclassified],
|
||||
{width: 8;}
|
||||
line|z19-[highway=unclassified],
|
||||
{width: 10;}
|
||||
|
||||
/* 6.2 Tertiary & Unclassified tunnel 16-22 ZOOM */
|
||||
|
||||
line|z16-[highway=tertiary][tunnel?],
|
||||
@@ -537,10 +581,10 @@ line|z18-[highway=unclassified][bridge?]::bridgeblack,
|
||||
line|z12-[highway=residential],
|
||||
line|z12-[highway=road],
|
||||
line|z12-[highway=living_street],
|
||||
{color: @residential; opacity: 0.7;}
|
||||
line|z14-16[highway=residential],
|
||||
line|z14-16[highway=road],
|
||||
line|z14-16[highway=living_street],
|
||||
{color: @residential; opacity: 0.8;}
|
||||
line|z13-16[highway=residential],
|
||||
line|z13-16[highway=road],
|
||||
line|z13-16[highway=living_street],
|
||||
{opacity: 0.85;}
|
||||
line|z17-[highway=residential],
|
||||
line|z17-[highway=road],
|
||||
@@ -614,7 +658,7 @@ line|z18-[highway=residential][bridge?]::bridgeblack,
|
||||
line|z15-[highway=service],
|
||||
line|z15-[highway=service][service=busway],
|
||||
line|z15-[highway=busway],
|
||||
{color: @residential; opacity: 0.8;}
|
||||
{color: @residential; opacity: 0.9;}
|
||||
|
||||
line|z15[highway=service],
|
||||
line|z15[highway=service][service=busway],
|
||||
@@ -643,11 +687,25 @@ line|z19-[highway=busway],
|
||||
|
||||
line|z13-[highway=pedestrian],
|
||||
line|z13-[highway=ford]
|
||||
{color: @pedestrian;opacity: 0.85;}
|
||||
{color: @pedestrian;opacity: 0.9;}
|
||||
|
||||
line|z13-[highway=cycleway],
|
||||
line|z14-[highway=path][bicycle=designated]::cycleline,
|
||||
line|z15-[highway=footway][bicycle=designated]::cycleline,
|
||||
{color: @cycleway;}
|
||||
|
||||
line|z14-[highway=path][bicycle=designated]::cycleline,
|
||||
{dashes: 7,9.6;}
|
||||
line|z16[highway=path][bicycle=designated]::cycleline,
|
||||
{dashes: 7.5,9.5;}
|
||||
line|z17[highway=path][bicycle=designated]::cycleline,
|
||||
{dashes: 8,9.4;}
|
||||
line|z18[highway=path][bicycle=designated]::cycleline,
|
||||
{dashes: 8.5,9.3;}
|
||||
line|z19-[highway=path][bicycle=designated]::cycleline,
|
||||
{dashes: 9,9.2;}
|
||||
|
||||
|
||||
line|z13-[highway=construction],
|
||||
{color: @construction;opacity: 0.7;}
|
||||
line|z13-[highway=pedestrian][bridge?]::bridgewhite,
|
||||
@@ -679,9 +737,9 @@ line|z15-[leisure=track][!area],
|
||||
line|z14-[highway=bridleway]
|
||||
{color: @bridleway;opacity: 0.6;}
|
||||
line|z15-[highway=footway],
|
||||
{color: @footway;opacity: 0.75;}
|
||||
{color: @footway;opacity: 0.87;}
|
||||
line|z15-[highway=steps],
|
||||
{color: @footway;opacity: 0.85;}
|
||||
{color: @footway;opacity: 0.9;}
|
||||
line|z14-[highway=path],
|
||||
{color: @path;opacity: 0.6;}
|
||||
line|z14-[highway=path][_path_grade=expert],
|
||||
@@ -711,25 +769,25 @@ line|z17-[highway=steps][tunnel?]::tunnelCasing,
|
||||
|
||||
line|z13[highway=pedestrian],
|
||||
line|z13[highway=ford]
|
||||
{width: 1;dashes: 2,1;}
|
||||
{width: 1;dashes: 4,1;}
|
||||
line|z14[highway=pedestrian],
|
||||
line|z14[highway=ford]
|
||||
{width: 1.6;dashes: 3.6,1.6;}
|
||||
{width: 1.6;dashes: 6,1.3;}
|
||||
line|z15[highway=pedestrian],
|
||||
line|z15[highway=ford]
|
||||
{width: 2;dashes: 5,2.2;}
|
||||
{width: 2;dashes: 8,1.5;}
|
||||
line|z16[highway=pedestrian],
|
||||
line|z16[highway=ford]
|
||||
{width: 2.4;dashes: 5.4,2.7;}
|
||||
{width: 2.4;dashes: 8,1.5;}
|
||||
line|z17[highway=pedestrian],
|
||||
line|z17[highway=ford]
|
||||
{width: 3;dashes: 5,2;}
|
||||
{width: 3;dashes: 9,1.8;}
|
||||
line|z18[highway=pedestrian],
|
||||
line|z18[highway=ford]
|
||||
{width: 4;dashes: 7,3;opacity: 1;}
|
||||
{width: 4;dashes: 11,2.3;opacity: 1;}
|
||||
line|z19-[highway=pedestrian],
|
||||
line|z19-[highway=ford]
|
||||
{width: 5;dashes: 16.2,8.1;opacity: 1;}
|
||||
{width: 5;dashes: 13,2.7;opacity: 1;}
|
||||
|
||||
/* 8.2 Pedestrian & ford tunnel 16-22 ZOOM */
|
||||
|
||||
@@ -757,50 +815,54 @@ line|z16-[highway=pedestrian][bridge?]::bridgeblack,
|
||||
/* 8.4 Cycleway 13-22 ZOOM */
|
||||
|
||||
line|z13[highway=cycleway],
|
||||
{opacity: 0.3;}
|
||||
{opacity: 0.5;}
|
||||
line|z14[highway=cycleway],
|
||||
line|z14[highway=path][bicycle=designated]::cycleline,
|
||||
{opacity: 0.4;}
|
||||
{opacity: 0.6;}
|
||||
line|z15[highway=cycleway],
|
||||
line|z15[highway=path][bicycle=designated]::cycleline,
|
||||
{opacity: 0.5;}
|
||||
{opacity: 0.8;}
|
||||
line|z16-17[highway=cycleway],
|
||||
line|z16-17[highway=path][bicycle=designated]::cycleline,
|
||||
{opacity: 0.6;}
|
||||
{opacity: 0.9;}
|
||||
line|z18-[highway=cycleway],
|
||||
line|z18-[highway=path][bicycle=designated]::cycleline,
|
||||
{opacity: 0.8;}
|
||||
{opacity: 1;}
|
||||
|
||||
line|z15-16[highway=footway][bicycle=designated]::cycleline,
|
||||
{opacity: 0.4;}
|
||||
line|z17-[highway=footway][bicycle=designated]::cycleline,
|
||||
{opacity: 0.5;}
|
||||
line|z15-[highway=footway][bicycle=designated]::cycleline,
|
||||
{opacity: 1;}
|
||||
|
||||
line|z13[highway=cycleway]
|
||||
{width: 0.9;}
|
||||
{width: 1.0;}
|
||||
line|z14[highway=cycleway],
|
||||
line|z14[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.1;}
|
||||
line|z15[highway=cycleway]
|
||||
line|z15[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z15[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.2;}
|
||||
line|z15[highway=cycleway],
|
||||
line|z15[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.5;}
|
||||
line|z16[highway=cycleway],
|
||||
line|z16[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z16[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.3;}
|
||||
{width: 2;}
|
||||
line|z17[highway=cycleway],
|
||||
line|z17[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z17[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.4;}
|
||||
{width: 2.4;}
|
||||
line|z18[highway=cycleway],
|
||||
line|z18[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z18[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.6;}
|
||||
{width: 3.2;}
|
||||
line|z19-[highway=cycleway],
|
||||
line|z19-[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z19-[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.8;}
|
||||
{width: 4.2;}
|
||||
|
||||
line|z15[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 0.7;}
|
||||
line|z16[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 0.8;}
|
||||
line|z17[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 1.1;}
|
||||
line|z18[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 1.4;}
|
||||
line|z19-[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 2.0;}
|
||||
|
||||
line|z17[highway=cycleway][tunnel?]::tunnelBackground
|
||||
{casing-width-add: 1;}
|
||||
@@ -953,26 +1015,26 @@ line|z17-[highway=track][bridge?]::bridgeblack
|
||||
/* 8.7 Footway 15-22 ZOOM */
|
||||
|
||||
line|z15[highway=footway]
|
||||
{width: 1.5; dashes: 5,2;}
|
||||
{width: 1.5; dashes: 5,1.5;}
|
||||
line|z16[highway=footway]
|
||||
{width: 2; dashes: 5,2;}
|
||||
{width: 2; dashes: 5,1.5;}
|
||||
line|z17[highway=footway]
|
||||
{width: 2.4; dashes: 6,2.5;}
|
||||
{width: 2.4; dashes: 6,1.8;}
|
||||
line|z18[highway=footway]
|
||||
{width: 3.2; dashes: 8,3; opacity: 1;}
|
||||
{width: 3.2; dashes: 8,2.3; opacity: 1;}
|
||||
line|z19-[highway=footway],
|
||||
{width: 4.2; dashes: 10,3.5; opacity: 1;}
|
||||
{width: 4.2; dashes: 10,2.7;opacity: 1;}
|
||||
|
||||
line|z15[highway=footway][bicycle=designated],
|
||||
{width: 1.5; dashes: 5,3;}
|
||||
{width: 1.5; dashes: 6,9; opacity: 0.8;}
|
||||
line|z16[highway=footway][bicycle=designated],
|
||||
{width: 2; dashes: 5,3;}
|
||||
{width: 2; dashes: 8,10; opacity: 0.9;}
|
||||
line|z17[highway=footway][bicycle=designated],
|
||||
{width: 2.4; dashes: 6,4.2; opacity: 0.9;}
|
||||
{width: 2.4; dashes: 10,11; opacity: 1;}
|
||||
line|z18[highway=footway][bicycle=designated],
|
||||
{width: 3.2; dashes: 8,5.5; opacity: 1;}
|
||||
{width: 3.2; dashes: 15,15; opacity: 1;}
|
||||
line|z19-[highway=footway][bicycle=designated],
|
||||
{width: 4.2; dashes: 10,6.7; opacity: 1;}
|
||||
{width: 4.2; dashes: 20,20; opacity: 1;}
|
||||
|
||||
/* Don't display sidewalks and pedestrian crossings on z15. */
|
||||
line|z15[highway=footway][footway=sidewalk],
|
||||
|
||||
@@ -45,10 +45,6 @@ power-line # line z19- (also has line::
|
||||
power-line::dash # line::dash z19- (also has line z19-)
|
||||
=== 340
|
||||
|
||||
highway-cycleway # line z13- (also has pathtext z15-)
|
||||
highway-cycleway-bridge # line z13- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
|
||||
highway-cycleway-tunnel # line z13- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
|
||||
highway-footway-crossing # line z16-
|
||||
highway-steps # line z15- (also has pathtext z16-)
|
||||
highway-steps-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z16-)
|
||||
highway-steps-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z16-)
|
||||
@@ -192,15 +188,22 @@ highway-secondary_link-tunnel # line z13- (also has line(c
|
||||
=== 224
|
||||
|
||||
# highway-secondary_link-tunnel # line(casing) z16- (also has line z13-, pathtext z16-)
|
||||
# === 223
|
||||
|
||||
highway-tertiary_link # line z14- (also has pathtext z18-)
|
||||
highway-tertiary_link-bridge # line z14- (also has line::bridgeblack z14-, line::bridgewhite z14-, pathtext z18-)
|
||||
highway-tertiary_link-tunnel # line z14- (also has line(casing) z16-, pathtext z18-)
|
||||
=== 222
|
||||
=== 223
|
||||
|
||||
highway-busway # line z15- (also has pathtext z16-)
|
||||
highway-busway-bridge # line z15- (also has pathtext z16-)
|
||||
highway-busway-tunnel # line z15- (also has pathtext z16-)
|
||||
highway-service # line z15- (also has pathtext z16-)
|
||||
highway-service-area # line z15- (also has pathtext z16-)
|
||||
highway-service-bridge # line z15- (also has line::bridgeblack z16-, line::bridgewhite z16-, pathtext z16-)
|
||||
highway-service-driveway # line z16- (also has pathtext z16-)
|
||||
highway-service-parking_aisle # line z15- (also has pathtext z16-)
|
||||
highway-service-tunnel # line z15- (also has pathtext z16-)
|
||||
# highway-tertiary_link-tunnel # line(casing) z16- (also has line z14-, pathtext z18-)
|
||||
# === 221
|
||||
=== 222
|
||||
|
||||
railway-light_rail::dash # line::dash z16- (also has line z13-)
|
||||
railway-light_rail-bridge::dash # line::dash z16- (also has line z13-, line::bridgeblack z16-, line::bridgewhite z13-)
|
||||
@@ -218,8 +221,19 @@ railway-rail-utility-bridge::dash # line::dash z17- (also has
|
||||
railway-rail-utility-tunnel::dash # line::dash z17- (also has line z13-, line(casing) z14-)
|
||||
railway-subway::dash # line::dash z16- (also has line z13-)
|
||||
railway-subway-bridge::dash # line::dash z16- (also has line z13-, line::bridgeblack z16-, line::bridgewhite z13-)
|
||||
=== 221
|
||||
|
||||
highway-footway-bicycle # line z15- (also has line::cycleline z15-, pathtext z15-)
|
||||
=== 220
|
||||
|
||||
highway-footway-bicycle::cycleline # line::cycleline z15- (also has line z15-, pathtext z15-)
|
||||
=== 219
|
||||
|
||||
highway-cycleway # line z13- (also has pathtext z15-)
|
||||
highway-cycleway-bridge # line z13- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
|
||||
highway-cycleway-tunnel # line z13- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
|
||||
=== 218
|
||||
|
||||
railway-light_rail # line z13- (also has line::dash z16-)
|
||||
railway-light_rail-bridge # line z13- (also has line::bridgeblack z16-, line::bridgewhite z13-, line::dash z16-)
|
||||
railway-rail # line z11- (also has line::dash z16-)
|
||||
@@ -254,15 +268,7 @@ highway-pedestrian-tunnel # line z13- (also has line(c
|
||||
# highway-pedestrian-tunnel # line(casing) z16- (also has line z13-, pathtext z14-)
|
||||
# === 199
|
||||
|
||||
highway-busway # line z15- (also has pathtext z16-)
|
||||
highway-busway-bridge # line z15- (also has pathtext z16-)
|
||||
highway-busway-tunnel # line z15- (also has pathtext z16-)
|
||||
highway-service # line z15- (also has pathtext z16-)
|
||||
highway-service-area # line z15- (also has pathtext z16-)
|
||||
highway-service-bridge # line z15- (also has line::bridgeblack z16-, line::bridgewhite z16-, pathtext z16-)
|
||||
highway-service-driveway # line z16- (also has pathtext z16-)
|
||||
highway-service-parking_aisle # line z15- (also has pathtext z16-)
|
||||
highway-service-tunnel # line z15- (also has pathtext z16-)
|
||||
highway-path-bicycle::cycleline # line::cycleline z14- (also has line z14-, pathtext z15-)
|
||||
=== 190
|
||||
|
||||
highway-bridleway # line z14- (also has pathtext z15-)
|
||||
@@ -270,7 +276,7 @@ highway-bridleway-bridge # line z14- (also has line::
|
||||
highway-bridleway-tunnel # line z14- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
|
||||
highway-footway # line z15- (also has pathtext z15-)
|
||||
highway-footway-area # line z15- and area z14- (also has pathtext z15-)
|
||||
highway-footway-bicycle # line z15- (also has line::cycleline z15-, pathtext z15-)
|
||||
highway-footway-crossing # line z16-
|
||||
highway-path # line z14- (also has pathtext z15-)
|
||||
highway-path-bicycle # line z14- (also has line::cycleline z14-, pathtext z15-)
|
||||
highway-path-difficult # line z14- (also has pathtext z15-)
|
||||
@@ -283,10 +289,6 @@ highway-track-no-access # line z14- (also has pathte
|
||||
highway-track-tunnel # line z14- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
|
||||
=== 180
|
||||
|
||||
highway-footway-bicycle::cycleline # line::cycleline z15- (also has line z15-, pathtext z15-)
|
||||
highway-path-bicycle::cycleline # line::cycleline z14- (also has line z14-, pathtext z15-)
|
||||
=== 170
|
||||
|
||||
highway-construction # line z13- (also has pathtext z15-)
|
||||
leisure-track # line z15- (also has caption z16-)
|
||||
railway-abandoned # line z16-
|
||||
|
||||
@@ -668,6 +668,9 @@ highway-residential-bridge::shield # shield::shield z15- (also
|
||||
highway-residential-tunnel::shield # shield::shield z15- (also has pathtext z13-, line z12-, line(casing) z16-)
|
||||
=== 2955
|
||||
|
||||
highway-footway-bicycle # pathtext z15- (also has line z15-, line::cycleline z15-)
|
||||
=== 2954
|
||||
|
||||
highway-cycleway # pathtext z15- (also has line z13-)
|
||||
highway-cycleway-bridge # pathtext z15- (also has line z13-, line::bridgeblack z17-, line::bridgewhite z15-)
|
||||
highway-cycleway-tunnel # pathtext z15- (also has line z13-, line::tunnelBackground z17-, line::tunnelCasing z17-)
|
||||
@@ -676,7 +679,6 @@ highway-cycleway-tunnel # pathtext z15- (also has li
|
||||
area:highway-footway # caption z15- (also has area z14-)
|
||||
highway-footway # pathtext z15- (also has line z15-)
|
||||
highway-footway-area # pathtext z15- (also has line z15-, area z14-)
|
||||
highway-footway-bicycle # pathtext z15- (also has line z15-, line::cycleline z15-)
|
||||
highway-footway-bridge # pathtext z15- (also has line z15-, line::bridgeblack z17-, line::bridgewhite z15-)
|
||||
highway-footway-tunnel # pathtext z15- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
|
||||
highway-tertiary_link # pathtext z18- (also has line z14-)
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
1.BASEMAP
|
||||
2.BOUNDARY
|
||||
3.NATURAL
|
||||
3.1 Main natural
|
||||
3.2 Vegetation
|
||||
3.1 Main natural
|
||||
3.2 Vegetation
|
||||
4.LANDUSE
|
||||
4.1 Main landuse
|
||||
4.2 Aerodrome
|
||||
4.1 Main landuse
|
||||
4.2 Aerodrome
|
||||
4.3 Barriers
|
||||
4.4 Buildings
|
||||
5.ROADS
|
||||
5.1 All roads
|
||||
5.2 Bridges
|
||||
5.2 Bridges
|
||||
5.3 Tunnels
|
||||
5.4 Piste
|
||||
5.5 Transport
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/* 1.BASEMAP */
|
||||
|
||||
@background: #E3E1D2;
|
||||
@background: #F5E8D6;
|
||||
|
||||
/* 2.BOUNDARY */
|
||||
|
||||
@@ -38,103 +38,108 @@
|
||||
/* 3.1 Main natural */
|
||||
|
||||
@glacier: #FFFFFF;
|
||||
@water: #8BD3E0;
|
||||
@water_bad: #9dc7c1;
|
||||
@river: #36B0BF;
|
||||
@wetland: #c9ddd6;
|
||||
@beach: #FCEC7E;
|
||||
@water: #8AD8E7;
|
||||
@water_bad: #95C5B8;
|
||||
@river: #5FB4C5;
|
||||
@wetland: #C3E0D1;
|
||||
@beach: #FFE7B7;
|
||||
@barerock: #D9D2BF;
|
||||
@scree: #CCC7BA;
|
||||
@desert: #EEE5B2;
|
||||
@desert: #F6E5CE;
|
||||
|
||||
/*3.2 Vegetation*/
|
||||
|
||||
@green0: #CFD5A8;
|
||||
@green1: #C6CF93;
|
||||
@green1b: #C1CC89;
|
||||
@green2: #BCC87E;
|
||||
@green3: #B3C471;
|
||||
@green4: #AEC26B;
|
||||
@green5: #B0C270;
|
||||
@forest: #AABF65;
|
||||
@green6: #888C38;
|
||||
@flowers: #B3C471;
|
||||
@heath: #CED797;
|
||||
@green0: #C8D48C;
|
||||
@green1: #C4D181;
|
||||
@green1b: #BECC76;
|
||||
@green2: #B6C96B;
|
||||
@green3: #B0C763;
|
||||
@green4: #B2C76A;
|
||||
@green5: #ADC45F;
|
||||
@forest: #A8BE5C;
|
||||
@green6: #7B8F35;
|
||||
@flowers: #B6C96B;
|
||||
|
||||
/* 4.LANDUSE */
|
||||
/*4.1 Main landuse*/
|
||||
|
||||
@pedestrian_area: #EDE8D6;
|
||||
@pedestrian_area_light: #F2EEDA;
|
||||
@university: #F8E4BA;
|
||||
@hospital: #F8D9D9;
|
||||
@industrial: #E4E2EB;
|
||||
@sport0: #DDD9B0;
|
||||
@sport1: #D7D3AC;
|
||||
@sport2: #D1CDA7;
|
||||
@parking: #F2F2BC;
|
||||
@pedestrian_area: #F6EBDC;
|
||||
@pedestrian_area_light: #F7EDDF;
|
||||
@university: #F8E3C2;
|
||||
@hospital: #FFDAD6;
|
||||
@industrial: #E8E6E1;
|
||||
@sport0: #F5EED3;
|
||||
@sport1: #E8E8C3;
|
||||
@sport2: #D4E796;
|
||||
@parking: #F6F0E9;
|
||||
@military: #E53935;
|
||||
@prison: #727272;
|
||||
@farmland: #E4DEAD;
|
||||
@farmyard: #E5D6AC;
|
||||
@farmland: #E4E0AD;
|
||||
@farmyard: #E6D6AF;
|
||||
|
||||
/*4.2 Aerodrome*/
|
||||
|
||||
@aerodrome0: #D4BFF2;
|
||||
@aerodrome1: #D4BFF2;
|
||||
@aerodrome2: #D1C0EB;
|
||||
@aerodrome3: #CFC1E8;
|
||||
@aerodrome4: #CDC0E3;
|
||||
@aerodrome5: #C8BCDE;
|
||||
@aerodrome0: #CED4D2;
|
||||
@aerodrome1: #CED4D2;
|
||||
@aerodrome2: #CBD1CF;
|
||||
@aerodrome3: #C6CCCA;
|
||||
@aerodrome4: #C4C9C8;
|
||||
@aerodrome5: #C1C7C5;
|
||||
|
||||
/* 4.3 Barriers */
|
||||
@fence: #888888;
|
||||
@hedge: #8DB880;
|
||||
@hedge: #95A852;
|
||||
@cliff: #8C5826;
|
||||
|
||||
/* 4.4 Buildings */
|
||||
|
||||
@building0: #C9C8BB;
|
||||
@building1: #C2C0B3;
|
||||
@building0: #D5D6D2;
|
||||
@building1: #D0D1CC;
|
||||
@building_border0: #A1A096;
|
||||
@building_border1: #9B9A8F;
|
||||
|
||||
/* 5.ROADS */
|
||||
/* 5.1 All roads */
|
||||
|
||||
@trunk0: #FF7326;
|
||||
@trunk1: #FF7A26;
|
||||
@primary0: #FF8726;
|
||||
@primary1: #FF9440;
|
||||
@primary2: #FFA14C;
|
||||
@secondary0: #FFB226;
|
||||
@secondary1: #FFBF52;
|
||||
@motorway0: #F57A00;
|
||||
@motorway1: #F08800;
|
||||
@trunk0: #F29718;
|
||||
@trunk1: #F29E30;
|
||||
@primary0: #F5B74E;
|
||||
@primary1: #FABB40;
|
||||
@primary2: #FAC256;
|
||||
@secondary0: #FFCE5A;
|
||||
@secondary1: #FFD573;
|
||||
@tertiary: #FFFFFF;
|
||||
@residential: #F8F8F8;
|
||||
@pedestrian: #F8F8F8;
|
||||
@footway: #F8F8F8;
|
||||
@cycleway: #5654FF;
|
||||
@construction: #BBBBAA;
|
||||
@residential: #FFFEFE;
|
||||
@pedestrian: #FFFAF5;
|
||||
@footway: #FFFAF5;
|
||||
@cycleway: #6F6DFF;
|
||||
@construction: #C1A06B;
|
||||
@track: #635730;
|
||||
@path: #A05012;
|
||||
@path: #8E4E1D;
|
||||
@path_expert: #3D2617;
|
||||
@bridleway: #3D361E;
|
||||
|
||||
/* 5.2 Bridges */
|
||||
|
||||
@bridge_background: #EDEBDB;
|
||||
@bridge_casing: #808080;
|
||||
@bridge_background: #FCF1DE;
|
||||
@bridge_casing: #E1D4BE;
|
||||
|
||||
/* 5.3 Tunnels */
|
||||
|
||||
@trunk_tunnel: #FCA462;
|
||||
@motorway_tunnel: #F2A540;
|
||||
@motorway_tunnel_casing: #808080;
|
||||
@trunk_tunnel: #F6BB5F;
|
||||
@trunk_tunnel_casing: #808080;
|
||||
@primary_tunnel: #FCA462;
|
||||
@primary_tunnel: #F6CB85;
|
||||
@primary_tunnel_casing: #808080;
|
||||
@secondary_tunnel: #FFBF52;
|
||||
@secondary_tunnel: #F9D393;
|
||||
@secondary_tunnel_casing: #808080;
|
||||
@tertiary_tunnel: #FFFFFF;
|
||||
@tertiary_tunnel_casing: #808080;
|
||||
@residential_tunnel: #FFFFFF;
|
||||
@residential_tunnel: #FFFEFE;
|
||||
@residential_tunnel_casing: #808080;
|
||||
|
||||
/* 5.4 Piste */
|
||||
@@ -149,15 +154,15 @@
|
||||
|
||||
/* 5.5 Transport */
|
||||
|
||||
@railway_light: #B2B1A2;
|
||||
@railway: #969586;
|
||||
@railway_light: #B0B1A4;
|
||||
@railway: #96968B;
|
||||
@railway_tourism: #9C7D65;
|
||||
@railway_dash: #EEEEEE;
|
||||
@railway_tunnel: #808080;
|
||||
@aerialway: #444444;
|
||||
@powerline: #969586;
|
||||
@tram: #7A7A7A;
|
||||
@ferry: #4499Bb;
|
||||
@ferry: #59A2AF;
|
||||
|
||||
/* 6.LABELS COLORS */
|
||||
/* 6.1 Main labels */
|
||||
@@ -169,7 +174,7 @@
|
||||
|
||||
/* 6.2 Natural labels */
|
||||
|
||||
@water_label: #4499Bb;
|
||||
@water_label: #278FA2;
|
||||
@park_label: #3A7921;
|
||||
@halo_park_label: #FFFFFF;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g id="bar-m" fill-rule="nonzero">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path id="🔹-Icon-Color" d="m18 6.9667c0-0.53333-0.43333-0.96667-0.96667-0.96667h-10.067c-0.53333 0-0.96667 0.43333-0.96667 0.96667 0 0.23333 0.086667 0.46667 0.24667 0.64l5.0867 5.7267v3.3333h-2.6667c-0.36667 0-0.66667 0.3-0.66667 0.66667 0 0.36667 0.3 0.66667 0.66667 0.66667h6.6667c0.36667 0 0.66667-0.3 0.66667-0.66667 0-0.36667-0.3-0.66667-0.66667-0.66667h-2.6667v-3.3333l5.0867-5.7267c0.16-0.17333 0.24667-0.40667 0.24667-0.64zm-9.0467 1.7-1.18-1.3333h8.46l-1.1867 1.3333h-6.0933z" fill="#fff"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 853 B After Width: | Height: | Size: 853 B |
@@ -3,7 +3,7 @@
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g id="cafe-m" fill-rule="nonzero">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path id="Shape" d="m15.889 7h-8.8889v5.5556c0 1.2278 0.99444 2.2222 2.2222 2.2222h3.3333c1.2278 0 2.2222-0.99444 2.2222-2.2222v-1.6667h1.1111c0.61667 0 1.1111-0.5 1.1111-1.1111v-1.6667c0-0.61667-0.49444-1.1111-1.1111-1.1111zm0 2.7778h-1.1111v-1.6667h1.1111v1.6667zm-8.8889 6.1111h8.8889v1.1111h-8.8889v-1.1111z" fill="#fff"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 678 B After Width: | Height: | Size: 678 B |
@@ -3,7 +3,7 @@
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g id="fastfood-m" fill-rule="nonzero">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<g id="Group" transform="translate(5 6)" fill="#fff">
|
||||
<path id="Path" d="m0.959 7.896c0.553-0.203 0.819-0.546 1.393-0.546 0.833 0 0.994 0.7 2.331 0.7 1.365 0 1.463-0.7 2.331-0.7 0.833 0 0.994 0.7 2.331 0.7 1.365 0 1.463-0.7 2.331-0.7 0.567 0 0.819 0.322 1.351 0.532 0.469 0.182 0.973-0.175 0.973-0.672 0-0.301-0.196-0.567-0.483-0.672-0.679-0.245-0.854-0.581-1.855-0.581-1.365 0-1.463 0.7-2.331 0.7-0.833 0-0.994-0.7-2.331-0.7-1.365 0-1.463 0.7-2.331 0.7-0.833 0-0.994-0.7-2.331-0.7-1.085 0-1.372 0.441-1.876 0.623-0.273 0.098-0.455 0.364-0.455 0.658 0 0.483 0.49 0.826 0.952 0.658z"/>
|
||||
<path id="Path" d="m0 11.2c0 0.77 0.63 1.4 1.4 1.4h11.2c0.77 0 1.4-0.63 1.4-1.4v-0.7c0-0.77-0.63-1.4-1.4-1.4h-11.2c-0.77 0-1.4 0.63-1.4 1.4v0.7z"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle cx="12" cy="12" r="11" fill="#bb9342"/>
|
||||
<circle cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path d="m12.049 5.3147c-1.902 0-3.5057 1.3566-3.8631 3.1738-0.93283 0.34526-1.5879 1.2414-1.5879 2.2772 0 1.3386 1.0851 2.4218 2.4238 2.4218 0.60736 0.0071 1.0136-0.18667 1.4042-0.3496 0.50275 0.22412 1.0536 0.3496 1.623 0.3496 0.57544 0 1.1396-0.12704 1.6484-0.36327 0.32914 0.16064 0.82873 0.36216 1.3808 0.36327 1.3386 0 2.4238-1.0831 2.4238-2.4218 0-1.0358-0.65506-1.932-1.5879-2.2772-0.35738-1.8172-1.9631-3.1738-3.8651-3.1738zm1.707 8.7282c-0.52703 0.30792-1.109 0.47264-1.705 0.47264-0.58984 0-1.1609-0.16489-1.6816-0.45702-0.37309 0.19579-0.78848 0.34937-1.3437 0.36522l2.3906 4.7831c0.11234 0.22468 0.33902 0.36522 0.59177 0.36522 0.25276 0 0.47944-0.14054 0.59178-0.36522l2.4257-4.8514c-0.48744-0.03354-0.98887-0.14016-1.2695-0.31249z" fill="#fff"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1014 B After Width: | Height: | Size: 1014 B |
@@ -1,5 +1,5 @@
|
||||
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path d="m18.289 5.5406c0.20956 0.15523 0.33374 0.40359 0.33374 0.6649v8.6928c0 1.1435-1.1125 2.0697-2.4837 2.0697s-2.4837-0.9262-2.4837-2.0697 1.1125-2.0697 2.4837-2.0697c0.28976 0 0.56917 0.04136 0.82789 0.11901v-3.7669l-6.6231 1.9869v5.3864c0 1.1435-1.1125 2.0697-2.4837 2.0697s-2.4837-0.9262-2.4837-2.0697 1.1125-2.0697 2.4837-2.0697c0.28976 0 0.56917 0.04136 0.82789 0.11901v-5.9142c0-0.36479 0.2406-0.68818 0.58987-0.79426l8.2789-2.4837c0.25095-0.075029 0.5226-0.02848 0.73216 0.12936z" fill="#fff"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 767 B After Width: | Height: | Size: 767 B |
@@ -3,7 +3,7 @@
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g id="beer-m" fill-rule="nonzero">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path id="Shape" d="m16.116 10.413h-0.9863c0.22129-0.37302 0.35406-0.80295 0.35406-1.2645 0-1.3973-1.1317-2.529-2.529-2.529-0.21496 0-0.41728 0.031612-0.6196 0.082192-0.51844-0.42993-1.176-0.70179-1.9094-0.70179-1.1949 0-2.2192 0.70179-2.6997 1.7134-0.99895 0.33509-1.726 1.2708-1.726 2.3836 0 1.176 0.80927 2.156 1.8967 2.4405v5.4626h6.9547v-1.2645h1.2645c0.69547 0 1.2645-0.56902 1.2645-1.2645v-3.7935c0-0.69547-0.56902-1.2645-1.2645-1.2645zm-7.5869 0.94837c-0.69547 0-1.2645-0.56902-1.2645-1.2645 0-0.53741 0.34773-1.0116 0.86617-1.1886l0.5058-0.17071 0.22761-0.48051c0.29715-0.61328 0.89146-0.99262 1.5616-0.99262 0.49947 0 0.87882 0.22129 1.1001 0.41096l0.49315 0.41096s0.40464-0.20232 0.9294-0.20232c0.69547 0 1.2645 0.56902 1.2645 1.2645h-1.8967c-2.0991 0-2.4278 2.2129-3.7871 2.2129zm7.5869 4.1096h-1.2645v-3.7935h1.2645v3.7935z" fill="#fff"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -3,7 +3,7 @@
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g id="restaurant-m" fill-rule="nonzero">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle id="Oval" cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path id="Shape" d="m10.75 9.55v-2.9478c0-0.33259-0.26509-0.60221-0.59571-0.60221h-0.058575c-0.329 0-0.59571 0.27856-0.59571 0.60221v2.9478h-1.25v-2.9478c0-0.33259-0.26509-0.60221-0.59571-0.60221h-0.058575c-0.329 0-0.59571 0.27856-0.59571 0.60221v2.9478c0 1.378 1.25 2.45 2.4375 2.45l-0.16221 5.1908c-0.013966 0.4469 0.32885 0.80919 0.76779 0.80919h0.16385c0.438 0 0.77819-0.35736 0.75936-0.80919l-0.21628-5.1908c1.25 0 2.75-1.072 2.5-2.45v-2.9478c0-0.33259-0.26509-0.60221-0.59571-0.60221h-0.058575c-0.329 0-0.59571 0.27856-0.59571 0.60221v2.9478h-1.25zm3.25 3.25h1.5v4.455c0 0.41147 0.3329 0.74503 0.75 0.74503 0.41421 0 0.75-0.33347 0.75-0.75065v-11.249c-2.094 0-3.05 1.456-3 2.6v4.2z" fill="#fff"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle id="Oval" cx="12" cy="12" r="12" fill="#fff" opacity=".6"/>
|
||||
<circle cx="12" cy="12" r="11" fill="#BB9342"/>
|
||||
<circle cx="12" cy="12" r="11" fill="#EC955E"/>
|
||||
<path d="m2.0024 15.579 2.4463-3.7354-2.2168-3.4229h1.6895l1.4355 2.2998 1.4062-2.2998h1.6748l-2.2266 3.4766 2.4463 3.6816h-1.7432l-1.5869-2.4756-1.5918 2.4756zm6.6699 0 2.4463-3.7354-2.2168-3.4229h1.6895l1.4355 2.2998 1.4062-2.2998h1.6748l-2.2266 3.4766 2.4463 3.6816h-1.7432l-1.5869-2.4756-1.5918 2.4756zm6.6699 0 2.4463-3.7354-2.2168-3.4229h1.6895l1.4355 2.2998 1.4062-2.2998h1.6748l-2.2266 3.4766 2.4463 3.6816h-1.7432l-1.5869-2.4756-1.5918 2.4756z" fill="#fff"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 752 B After Width: | Height: | Size: 752 B |
@@ -103,10 +103,9 @@ line|z11-[highway=bridleway],
|
||||
{color: @path; opacity: 1;}
|
||||
|
||||
line|z11-[highway=cycleway],
|
||||
line|z13-[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z12-[highway=path][bicycle=designated]::cycleline,
|
||||
{color: @cycleway; opacity: 1;}
|
||||
line|z13-[highway=footway][bicycle=designated]::cycleline,
|
||||
{color: @cycleway; opacity: 0.8;}
|
||||
|
||||
line|z11[highway=track],
|
||||
{width: 1.1; dashes: 6,2.5; opacity: 0.6;}
|
||||
@@ -168,27 +167,37 @@ line|z13-[highway=footway][bicycle=designated],
|
||||
{opacity: 0.8;}
|
||||
|
||||
line|z12[highway=path][bicycle=designated],
|
||||
line|z12[highway=footway][bicycle=designated],
|
||||
{width: 1.1; dashes: 3.5,2.5; opacity: 0.7;}
|
||||
line|z13[highway=path][bicycle=designated],
|
||||
line|z13[highway=footway][bicycle=designated],
|
||||
{width: 1.3; dashes: 4,3;}
|
||||
line|z14[highway=path][bicycle=designated],
|
||||
line|z14[highway=footway][bicycle=designated],
|
||||
{width: 1.6; dashes: 4,3;}
|
||||
line|z15[highway=path][bicycle=designated],
|
||||
line|z15[highway=footway][bicycle=designated],
|
||||
{width: 2; dashes: 6,4.5;}
|
||||
line|z16[highway=path][bicycle=designated],
|
||||
line|z16[highway=footway][bicycle=designated],
|
||||
{width: 2.6; dashes: 6,4.5;}
|
||||
line|z17[highway=path][bicycle=designated],
|
||||
line|z17[highway=footway][bicycle=designated],
|
||||
{width: 3.3; dashes: 8,6;}
|
||||
line|z18-[highway=path][bicycle=designated],
|
||||
line|z18-[highway=footway][bicycle=designated],
|
||||
{width: 4; dashes: 8,6; opacity: 1;}
|
||||
|
||||
line|z12[highway=footway][bicycle=designated],
|
||||
{width: 1.1; dashes: 2,6; opacity: 0.7;}
|
||||
line|z13[highway=footway][bicycle=designated],
|
||||
{width: 1.3; dashes: 3,7;}
|
||||
line|z14[highway=footway][bicycle=designated],
|
||||
{width: 1.6; dashes: 4,8;}
|
||||
line|z15[highway=footway][bicycle=designated],
|
||||
{width: 2; dashes: 6,9; opacity: 0.8;}
|
||||
line|z16[highway=footway][bicycle=designated],
|
||||
{width: 2.6; dashes: 8,10; opacity: 0.9;}
|
||||
line|z17[highway=footway][bicycle=designated],
|
||||
{width: 3.3; dashes: 10,11; opacity: 1;}
|
||||
line|z18[highway=footway][bicycle=designated],
|
||||
{width: 4; dashes: 15,15; opacity: 1;}
|
||||
line|z19-[highway=footway][bicycle=designated],
|
||||
{width: 4; dashes: 20,20; opacity: 1;}
|
||||
|
||||
line|z11[highway=path][_path_grade=difficult],
|
||||
line|z11[highway=path][_path_grade=expert],
|
||||
{width: 1; dashes: 1,2; opacity: 0.7;}
|
||||
@@ -247,32 +256,42 @@ line|z18-[highway=bridleway],
|
||||
line|z11[highway=cycleway],
|
||||
{width: 0.9; opacity: 0.7;}
|
||||
line|z12[highway=cycleway],
|
||||
line|z12[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1; opacity: 0.7;}
|
||||
{width: 1.1; opacity: 0.7;}
|
||||
line|z13[highway=cycleway],
|
||||
line|z13[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z13[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.1; opacity: 0.8;}
|
||||
{width: 1.3; opacity: 0.8;}
|
||||
line|z14[highway=cycleway],
|
||||
line|z14[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z14[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.3;}
|
||||
{width: 1.6;}
|
||||
line|z15[highway=cycleway],
|
||||
line|z15[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z15[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.5;}
|
||||
line|z16[highway=cycleway],
|
||||
line|z16[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z16[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 1.7;}
|
||||
line|z17[highway=cycleway],
|
||||
line|z17[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z17[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 2;}
|
||||
line|z16[highway=cycleway],
|
||||
line|z16[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 2.6;}
|
||||
line|z17[highway=cycleway],
|
||||
line|z17[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 3.3;}
|
||||
line|z18-[highway=cycleway],
|
||||
line|z18-[highway=footway][bicycle=designated]::cycleline,
|
||||
line|z18-[highway=path][bicycle=designated]::cycleline,
|
||||
{width: 2.4;}
|
||||
{width: 4;}
|
||||
|
||||
line|z13-[highway=footway][bicycle=designated]::cycleline,
|
||||
{opacity: 1;}
|
||||
line|z13[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 0.5;}
|
||||
line|z14[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 0.6;}
|
||||
line|z15[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 0.7;}
|
||||
line|z16[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 0.8;}
|
||||
line|z17[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 1.1;}
|
||||
line|z18[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 1.4;}
|
||||
line|z19-[highway=footway][bicycle=designated]::cycleline,
|
||||
{width: 2.0;}
|
||||
|
||||
|
||||
/* Ski pistes */
|
||||
|
||||
@@ -47,6 +47,12 @@ power-line::dash # line::dash z13- (also has
|
||||
power-minor_line::dash # line::dash z15- (also has line z15-)
|
||||
=== 340
|
||||
|
||||
highway-footway-bicycle # line z11- (also has line::cycleline z13-, pathtext z13-)
|
||||
=== 332
|
||||
|
||||
highway-footway-bicycle::cycleline # line::cycleline z13- (also has line z11-, pathtext z13-)
|
||||
=== 331
|
||||
|
||||
highway-cycleway # line z11- (also has pathtext z13-)
|
||||
highway-cycleway-bridge # line z11- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z13-)
|
||||
highway-cycleway-tunnel # line z11- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z13-)
|
||||
@@ -272,9 +278,8 @@ highway-bridleway-bridge # line z11- (also has line::
|
||||
highway-bridleway-tunnel # line z11- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z13-)
|
||||
highway-footway # line z11- (also has pathtext z13-)
|
||||
highway-footway-area # line z11- and area z14- (also has pathtext z13-)
|
||||
highway-footway-bicycle # line z11- (also has line::cycleline z13-, pathtext z13-)
|
||||
highway-path # line z11- (also has pathtext z13-)
|
||||
highway-path-bicycle # line z11- (also has line::cycleline z12-, pathtext z13-)
|
||||
highway-path-bicycle # line z11- (also has line::cycleline z13-, pathtext z13-)
|
||||
highway-path-difficult # line z11- (also has pathtext z13-)
|
||||
highway-path-expert # line z11- (also has pathtext z13-)
|
||||
highway-raceway # line z14- (also has pathtext z16-)
|
||||
@@ -285,8 +290,7 @@ highway-track-no-access # line z11- (also has pathte
|
||||
highway-track-tunnel # line z11- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z13-)
|
||||
=== 180
|
||||
|
||||
highway-footway-bicycle::cycleline # line::cycleline z13- (also has line z11-, pathtext z13-)
|
||||
highway-path-bicycle::cycleline # line::cycleline z12- (also has line z11-, pathtext z13-)
|
||||
highway-path-bicycle::cycleline # line::cycleline z13- (also has line z11-, pathtext z13-)
|
||||
=== 170
|
||||
|
||||
highway-construction # line z11- (also has pathtext z15-)
|
||||
|
||||
@@ -668,6 +668,9 @@ highway-residential-bridge::shield # shield::shield z15- (also
|
||||
highway-residential-tunnel::shield # shield::shield z15- (also has pathtext z13-, line z12-, line(casing) z16-)
|
||||
=== 2955
|
||||
|
||||
highway-footway-bicycle # pathtext z13- (also has line z11-, line::cycleline z13-)
|
||||
=== 2954
|
||||
|
||||
highway-cycleway # pathtext z13- (also has line z11-)
|
||||
highway-cycleway-bridge # pathtext z13- (also has line z11-, line::bridgeblack z17-, line::bridgewhite z15-)
|
||||
highway-cycleway-tunnel # pathtext z13- (also has line z11-, line::tunnelBackground z17-, line::tunnelCasing z17-)
|
||||
@@ -676,7 +679,6 @@ highway-cycleway-tunnel # pathtext z13- (also has li
|
||||
area:highway-footway # caption z15- (also has area z14-)
|
||||
highway-footway # pathtext z13- (also has line z11-)
|
||||
highway-footway-area # pathtext z13- (also has line z11-, area z14-)
|
||||
highway-footway-bicycle # pathtext z13- (also has line z11-, line::cycleline z13-)
|
||||
highway-footway-bridge # pathtext z13- (also has line z11-, line::bridgeblack z17-, line::bridgewhite z15-)
|
||||
highway-footway-tunnel # pathtext z13- (also has line z11-, line::tunnelBackground z17-, line::tunnelCasing z17-)
|
||||
highway-tertiary_link # pathtext z18- (also has line z14-)
|
||||
@@ -706,7 +708,7 @@ highway-bridleway # pathtext z13- (also has li
|
||||
highway-bridleway-bridge # pathtext z13- (also has line z11-, line::bridgeblack z17-, line::bridgewhite z15-)
|
||||
highway-bridleway-tunnel # pathtext z13- (also has line z11-, line::tunnelBackground z17-, line::tunnelCasing z17-)
|
||||
highway-path # pathtext z13- (also has line z11-)
|
||||
highway-path-bicycle # pathtext z13- (also has line z11-, line::cycleline z12-)
|
||||
highway-path-bicycle # pathtext z13- (also has line z11-, line::cycleline z13-)
|
||||
highway-path-bridge # pathtext z13- (also has line z11-, line::bridgeblack z17-, line::bridgewhite z15-)
|
||||
highway-path-difficult # pathtext z13- (also has line z11-)
|
||||
highway-path-expert # pathtext z13- (also has line z11-)
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
|
||||
@cycleway: #534DEB; /* slightly darker than in main */
|
||||
|
||||
@pedestrian: #FFFFFF; /* slightly lighter than in main */
|
||||
@footway: #FFFFFF; /* slightly lighter than in main */
|
||||
|
||||
@construction: #ABAB9A;
|
||||
|
||||
/* 5.5 Transport */
|
||||
|
||||
@@ -11,27 +11,18 @@
|
||||
|
||||
To build and run CoMaps you'll need a machine with at least 4Gb of RAM and 20-30Gb of disk space depending on your target platform. Expect to download 2-5Gb of files.
|
||||
|
||||
For _Windows_ you need to have [Git for Windows](https://git-scm.com/download/win) installed and Git bash available in the PATH.
|
||||
|
||||
## Getting sources
|
||||
|
||||
First of all get the source code. The full CoMaps sources repository is ~3Gb in size, there are various [clone options](#special-cases-options) to reduce the download size to suit your needs.
|
||||
|
||||
For _Windows_, it's necessary to enable symlink support:
|
||||
1. Activate _Windows Development Mode_ to enable symlinks globally:
|
||||
- Windows 10: _Settings_ -> _Update and Security_ -> _For Developers_ -> _Activate Developer Mode_
|
||||
- Windows 11: _Settings_ -> _Privacy and Security_ -> _For Developers_ -> _Activate Developer Mode_
|
||||
- Press Win + R, run `ms-settings:developers` and _Activate Developer Mode_
|
||||
2. Enable [symlinks](https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresymlinks) support in git. The easiest way is to reinstall the latest [Git for Windows](https://git-scm.com/download/win) with the "Enable Symlinks" checkbox checked. If you don't want to reinstall Git, then you can add `-c core.symlinks=true` parameter to the clone command below to enable symlinks for the repository.
|
||||
|
||||
```bash
|
||||
git config --global core.symlinks true
|
||||
```
|
||||
|
||||
Clone the repository including all submodules (see [Special cases options](#special-cases-options) below):
|
||||
Clone the repository including all submodules (see [Special cases options](#special-cases-options) below)
|
||||
|
||||
(if you plan to contribute and propose pull requests then use a web interface at https://codeberg.org/comaps/comaps to fork the repository first and use your fork's URL in the command below)
|
||||
|
||||
Follow the instructions for your OS, and afterwards the repository is prepared to build a CoMaps app!
|
||||
|
||||
### Linux
|
||||
Clone the repository
|
||||
```bash
|
||||
git clone --recurse-submodules --shallow-submodules https://codeberg.org/comaps/comaps.git
|
||||
```
|
||||
@@ -54,6 +45,25 @@ Configure the repository (make sure you have a working C++ build environment):
|
||||
bash ./configure.sh
|
||||
```
|
||||
|
||||
### Windows
|
||||
You need to have [Git for Windows](https://git-scm.com/download/win) installed and Git bash available in the PATH.
|
||||
|
||||
It's necessary to enable symlink support:
|
||||
1. Activate _Windows Development Mode_ to enable symlinks globally:
|
||||
- Windows 10: _Settings_ -> _Update and Security_ -> _For Developers_ -> _Activate Developer Mode_
|
||||
- Windows 11: _Settings_ -> _Privacy and Security_ -> _For Developers_ -> _Activate Developer Mode_
|
||||
- Press Win + R, run `ms-settings:developers` and _Activate Developer Mode_
|
||||
2. Enable [symlinks](https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresymlinks) support in git. The easiest way is to reinstall the latest [Git for Windows](https://git-scm.com/download/win) with the "Enable Symlinks" checkbox checked. If you don't want to reinstall Git, then you can add `-c core.symlinks=true` parameter to the clone command below to enable symlinks for the repository.
|
||||
|
||||
```bash
|
||||
git config --global core.symlinks true
|
||||
```
|
||||
|
||||
Clone the repository
|
||||
```bash
|
||||
git clone --recurse-submodules --shallow-submodules https://codeberg.org/comaps/comaps.git
|
||||
```
|
||||
|
||||
For _Windows 10_: You should be able to build the project by following either of these setup methods:
|
||||
|
||||
**Setup 1: Using WSL**
|
||||
@@ -69,7 +79,30 @@ For _Windows 10_: You should be able to build the project by following either o
|
||||
"C:\Program Files\Git\bin\bash.exe" configure.sh # execute the script by using Developer Command Prompt
|
||||
```
|
||||
|
||||
Now the repository is prepared to build a CoMaps app!
|
||||
### macOS
|
||||
Install required build dependencies and Xcode
|
||||
1. Install Xcode Command Line Tools
|
||||
2. Install [Xcode](https://apps.apple.com/app/xcode/id497799835?mt=12) from the App Store
|
||||
3. Install [Homebrew](https://brew.sh) and required dependencies
|
||||
4. Clone and configure the repository to be able to build the iOS app later
|
||||
|
||||
#### Xcode Command Line Tools
|
||||
```bash
|
||||
xcode-select --install
|
||||
```
|
||||
|
||||
#### Homebrew packages
|
||||
```bash
|
||||
brew install wget optipng
|
||||
```
|
||||
|
||||
#### Clone and configure repository
|
||||
Clone the repository
|
||||
```bash
|
||||
git clone --recurse-submodules --shallow-submodules https://codeberg.org/comaps/comaps.git
|
||||
cd comaps
|
||||
bash ./configure.sh
|
||||
```
|
||||
|
||||
### Special cases options
|
||||
|
||||
@@ -335,13 +368,7 @@ Building CoMaps for iOS requires a Mac.
|
||||
|
||||
Ensure that you have at least 20GB of free space.
|
||||
|
||||
After [getting all sources](#getting-sources), please make sure that Command Line Tools are installed:
|
||||
|
||||
```bash
|
||||
xcode-select --install
|
||||
```
|
||||
|
||||
Then, install [Xcode](https://apps.apple.com/app/xcode/id497799835?mt=12) from the App Store.
|
||||
Perform the steps in [getting all sources](#getting-sources), including configuring the repository
|
||||
|
||||
Enroll in the [Apple Developer Program](https://developer.apple.com/programs/) (you can run CoMaps in Simulator without this step).
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "testing/testing.hpp"
|
||||
|
||||
#include "drape_frontend/path_text_handle.hpp"
|
||||
#include "drape_frontend/visual_params.hpp"
|
||||
|
||||
#include "base/logging.hpp"
|
||||
|
||||
@@ -16,12 +15,10 @@ bool IsSmooth(m2::SplineEx const & spline)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} // namespace
|
||||
}
|
||||
|
||||
UNIT_TEST(Rounding_Spline)
|
||||
{
|
||||
df::VisualParams::Init(1.0, 1024);
|
||||
|
||||
m2::SplineEx spline1;
|
||||
df::AddPointAndRound(spline1, m2::PointD(0, 200));
|
||||
df::AddPointAndRound(spline1, m2::PointD(0, 0));
|
||||
|
||||
@@ -3,47 +3,54 @@
|
||||
|
||||
#include "routing/routing_helpers.hpp"
|
||||
|
||||
#include "indexer/altitude_loader.hpp"
|
||||
#include "indexer/feature.hpp"
|
||||
#include "indexer/feature_altitude.hpp"
|
||||
#include "indexer/feature_data.hpp"
|
||||
#include "indexer/feature_processor.hpp"
|
||||
|
||||
#include "coding/files_container.hpp"
|
||||
#include "coding/internal/file_data.hpp"
|
||||
#include "coding/read_write_utils.hpp"
|
||||
#include "coding/reader.hpp"
|
||||
#include "coding/succinct_mapper.hpp"
|
||||
#include "coding/varint.hpp"
|
||||
|
||||
#include "geometry/latlon.hpp"
|
||||
|
||||
#include "base/assert.hpp"
|
||||
#include "base/checked_cast.hpp"
|
||||
#include "base/file_name_utils.hpp"
|
||||
#include "base/logging.hpp"
|
||||
#include "base/scope_guard.hpp"
|
||||
#include "base/stl_helpers.hpp"
|
||||
#include "base/string_utils.hpp"
|
||||
|
||||
#include "defines.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "3party/succinct/elias_fano.hpp"
|
||||
#include "3party/succinct/mapper.hpp"
|
||||
#include "3party/succinct/rs_bit_vector.hpp"
|
||||
|
||||
namespace routing
|
||||
{
|
||||
using namespace feature;
|
||||
using namespace geometry;
|
||||
|
||||
namespace
|
||||
{
|
||||
using namespace routing;
|
||||
|
||||
class SrtmGetter : public AltitudeGetter
|
||||
{
|
||||
public:
|
||||
explicit SrtmGetter(std::string const & srtmDir) : m_srtmManager(srtmDir) {}
|
||||
|
||||
// AltitudeGetter overrides:
|
||||
Altitude GetAltitude(m2::PointD const & p) override
|
||||
geometry::Altitude GetAltitude(m2::PointD const & p) override
|
||||
{
|
||||
return m_srtmManager.GetAltitude(mercator::ToLatLon(p));
|
||||
}
|
||||
|
||||
void PrintStatsAndPurge() override
|
||||
{
|
||||
LOG(LINFO, ("Srtm tiles number (x26Mb):", m_srtmManager.GeTilesNumber()));
|
||||
m_srtmManager.Purge();
|
||||
return m_srtmManager.GetHeight(mercator::ToLatLon(p));
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -55,24 +62,39 @@ class Processor
|
||||
public:
|
||||
struct FeatureAltitude
|
||||
{
|
||||
FeatureAltitude(uint32_t featureId, geometry::Altitudes && altitudes)
|
||||
: m_featureId(featureId), m_altitudes(std::move(altitudes))
|
||||
FeatureAltitude() : m_featureId(0) {}
|
||||
FeatureAltitude(uint32_t featureId, Altitudes const & altitudes)
|
||||
: m_featureId(featureId), m_altitudes(altitudes)
|
||||
{
|
||||
}
|
||||
|
||||
uint32_t m_featureId;
|
||||
feature::Altitudes m_altitudes;
|
||||
Altitudes m_altitudes;
|
||||
};
|
||||
|
||||
using TFeatureAltitudes = std::vector<FeatureAltitude>;
|
||||
|
||||
explicit Processor(AltitudeGetter & altitudeGetter)
|
||||
: m_minAltitude(geometry::kInvalidAltitude), m_altitudeGetter(altitudeGetter)
|
||||
: m_altitudeGetter(altitudeGetter), m_minAltitude(geometry::kInvalidAltitude)
|
||||
{
|
||||
}
|
||||
|
||||
void operator()(FeatureType & f, uint32_t id)
|
||||
TFeatureAltitudes const & GetFeatureAltitudes() const { return m_featureAltitudes; }
|
||||
|
||||
succinct::bit_vector_builder & GetAltitudeAvailabilityBuilder()
|
||||
{
|
||||
CHECK_EQUAL(f.GetID().m_index, id, ());
|
||||
CHECK_EQUAL(id, m_altitudeAvailabilityBuilder.size(), ());
|
||||
return m_altitudeAvailabilityBuilder;
|
||||
}
|
||||
|
||||
geometry::Altitude GetMinAltitude() const { return m_minAltitude; }
|
||||
|
||||
void operator()(FeatureType & f, uint32_t const & id)
|
||||
{
|
||||
if (id != m_altitudeAvailabilityBuilder.size())
|
||||
{
|
||||
LOG(LERROR, ("There's a gap in feature id order."));
|
||||
return;
|
||||
}
|
||||
|
||||
bool hasAltitude = false;
|
||||
SCOPE_GUARD(altitudeAvailabilityBuilding,
|
||||
@@ -87,19 +109,12 @@ public:
|
||||
return;
|
||||
|
||||
geometry::Altitudes altitudes;
|
||||
altitudes.reserve(pointsCount);
|
||||
Altitude minFeatureAltitude = geometry::kInvalidAltitude;
|
||||
geometry::Altitude minFeatureAltitude = geometry::kInvalidAltitude;
|
||||
for (size_t i = 0; i < pointsCount; ++i)
|
||||
{
|
||||
auto const & pt = f.GetPoint(i);
|
||||
Altitude const a = m_altitudeGetter.GetAltitude(pt);
|
||||
geometry::Altitude const a = m_altitudeGetter.GetAltitude(f.GetPoint(i));
|
||||
if (a == geometry::kInvalidAltitude)
|
||||
{
|
||||
// Print warning for missing altitude point (if not a ferry or so).
|
||||
auto const type = CarModel::AllLimitsInstance().GetHighwayType(feature::TypesHolder(f));
|
||||
if (type && *type != HighwayType::RouteFerry && *type != HighwayType::RouteShuttleTrain)
|
||||
LOG(LWARNING, ("Invalid altitude at:", mercator::ToLatLon(pt)));
|
||||
|
||||
// One invalid point invalidates the whole feature.
|
||||
return;
|
||||
}
|
||||
@@ -113,7 +128,7 @@ public:
|
||||
}
|
||||
|
||||
hasAltitude = true;
|
||||
m_featureAltitudes.emplace_back(id, std::move(altitudes));
|
||||
m_featureAltitudes.emplace_back(id, Altitudes(std::move(altitudes)));
|
||||
|
||||
if (m_minAltitude == geometry::kInvalidAltitude)
|
||||
m_minAltitude = minFeatureAltitude;
|
||||
@@ -123,15 +138,22 @@ public:
|
||||
|
||||
bool HasAltitudeInfo() const { return !m_featureAltitudes.empty(); }
|
||||
|
||||
public:
|
||||
std::vector<FeatureAltitude> m_featureAltitudes;
|
||||
succinct::bit_vector_builder m_altitudeAvailabilityBuilder;
|
||||
Altitude m_minAltitude;
|
||||
bool IsFeatureAltitudesSorted()
|
||||
{
|
||||
return std::is_sorted(m_featureAltitudes.begin(), m_featureAltitudes.end(),
|
||||
base::LessBy(&Processor::FeatureAltitude::m_featureId));
|
||||
}
|
||||
|
||||
private:
|
||||
AltitudeGetter & m_altitudeGetter;
|
||||
TFeatureAltitudes m_featureAltitudes;
|
||||
succinct::bit_vector_builder m_altitudeAvailabilityBuilder;
|
||||
geometry::Altitude m_minAltitude;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
namespace routing
|
||||
{
|
||||
void BuildRoadAltitudes(std::string const & mwmPath, AltitudeGetter & altitudeGetter)
|
||||
{
|
||||
try
|
||||
@@ -139,27 +161,28 @@ void BuildRoadAltitudes(std::string const & mwmPath, AltitudeGetter & altitudeGe
|
||||
// Preparing altitude information.
|
||||
Processor processor(altitudeGetter);
|
||||
feature::ForEachFeature(mwmPath, processor);
|
||||
processor.m_altitudeGetter.PrintStatsAndPurge();
|
||||
|
||||
if (!processor.HasAltitudeInfo())
|
||||
{
|
||||
// Possible for small islands like Bouvet or Willis.
|
||||
LOG(LWARNING, ("No altitude information for road features of mwm:", mwmPath));
|
||||
LOG(LINFO, ("No altitude information for road features of mwm:", mwmPath));
|
||||
return;
|
||||
}
|
||||
|
||||
CHECK(processor.IsFeatureAltitudesSorted(), ());
|
||||
|
||||
FilesContainerW cont(mwmPath, FileWriter::OP_WRITE_EXISTING);
|
||||
auto w = cont.GetWriter(ALTITUDES_FILE_TAG);
|
||||
|
||||
AltitudeHeader header;
|
||||
header.m_minAltitude = processor.m_minAltitude;
|
||||
header.m_minAltitude = processor.GetMinAltitude();
|
||||
|
||||
auto const startOffset = w->Pos();
|
||||
header.Serialize(*w);
|
||||
{
|
||||
// Altitude availability serialization.
|
||||
coding::FreezeVisitor<Writer> visitor(*w);
|
||||
succinct::rs_bit_vector(&processor.m_altitudeAvailabilityBuilder).map(visitor);
|
||||
succinct::bit_vector_builder & builder = processor.GetAltitudeAvailabilityBuilder();
|
||||
succinct::rs_bit_vector(&builder).map(visitor);
|
||||
}
|
||||
header.m_featureTableOffset = base::checked_cast<uint32_t>(w->Pos() - startOffset);
|
||||
|
||||
@@ -168,7 +191,8 @@ void BuildRoadAltitudes(std::string const & mwmPath, AltitudeGetter & altitudeGe
|
||||
{
|
||||
// Altitude info serialization to memory.
|
||||
MemWriter<std::vector<uint8_t>> writer(deltas);
|
||||
for (auto const & a : processor.m_featureAltitudes)
|
||||
Processor::TFeatureAltitudes const & featureAltitudes = processor.GetFeatureAltitudes();
|
||||
for (auto const & a : featureAltitudes)
|
||||
{
|
||||
offsets.push_back(base::checked_cast<uint32_t>(writer.Pos()));
|
||||
a.m_altitudes.Serialize(header.m_minAltitude, writer);
|
||||
@@ -176,7 +200,8 @@ void BuildRoadAltitudes(std::string const & mwmPath, AltitudeGetter & altitudeGe
|
||||
}
|
||||
{
|
||||
// Altitude offsets serialization.
|
||||
CHECK(base::IsSortedAndUnique(offsets.begin(), offsets.end()), ());
|
||||
CHECK(std::is_sorted(offsets.begin(), offsets.end()), ());
|
||||
CHECK(adjacent_find(offsets.begin(), offsets.end()) == offsets.end(), ());
|
||||
|
||||
succinct::elias_fano::elias_fano_builder builder(offsets.back(), offsets.size());
|
||||
for (uint32_t offset : offsets)
|
||||
@@ -196,10 +221,9 @@ void BuildRoadAltitudes(std::string const & mwmPath, AltitudeGetter & altitudeGe
|
||||
w->Seek(startOffset);
|
||||
header.Serialize(w);
|
||||
w->Seek(endOffset);
|
||||
|
||||
LOG(LINFO, (ALTITUDES_FILE_TAG, "section is ready. The size is", header.m_endOffset));
|
||||
if (processor.HasAltitudeInfo())
|
||||
LOG(LINFO, ("Min altitude is", processor.m_minAltitude));
|
||||
LOG(LINFO, ("Min altitude is", processor.GetMinAltitude()));
|
||||
else
|
||||
LOG(LINFO, ("Min altitude isn't defined."));
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include "geometry/point2d.hpp"
|
||||
#include "geometry/point_with_altitude.hpp"
|
||||
|
||||
#include "indexer/feature_altitude.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace routing
|
||||
@@ -11,7 +13,6 @@ class AltitudeGetter
|
||||
{
|
||||
public:
|
||||
virtual geometry::Altitude GetAltitude(m2::PointD const & p) = 0;
|
||||
virtual void PrintStatsAndPurge() {}
|
||||
};
|
||||
|
||||
/// \brief Adds altitude section to mwm. It has the following format:
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "coding/varint.hpp"
|
||||
|
||||
#include "geometry/mercator.hpp"
|
||||
#include "geometry/parametrized_segment.hpp"
|
||||
#include "geometry/simplification.hpp"
|
||||
|
||||
#include "base/assert.hpp"
|
||||
@@ -23,18 +24,20 @@
|
||||
|
||||
#include <cmath>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
|
||||
#include "base/assert.hpp"
|
||||
#include "base/string_utils.hpp"
|
||||
|
||||
#include "defines.hpp"
|
||||
|
||||
namespace borders
|
||||
{
|
||||
namespace
|
||||
{
|
||||
|
||||
template <class ToDo>
|
||||
void ForEachCountry(std::string const & baseDir, ToDo && toDo)
|
||||
{
|
||||
@@ -46,11 +49,11 @@ void ForEachCountry(std::string const & baseDir, ToDo && toDo)
|
||||
Platform::GetFilesByExt(bordersDir, BORDERS_EXTENSION, files);
|
||||
for (std::string file : files)
|
||||
{
|
||||
PolygonsList polygons;
|
||||
std::vector<m2::RegionD> polygons;
|
||||
if (LoadBorders(bordersDir + file, polygons))
|
||||
{
|
||||
base::GetNameWithoutExt(file);
|
||||
toDo(std::move(file), std::move(polygons));
|
||||
toDo(file, polygons);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -62,7 +65,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void operator()(std::string name, PolygonsList && borders)
|
||||
void operator()(std::string const & name, std::vector<m2::RegionD> const & borders)
|
||||
{
|
||||
// use index in vector as tag
|
||||
auto w = m_writer.GetWriter(strings::to_string(m_polys.size()));
|
||||
@@ -102,7 +105,7 @@ private:
|
||||
std::vector<storage::CountryDef> m_polys;
|
||||
};
|
||||
|
||||
bool ReadPolygon(std::istream & stream, Polygon & poly, std::string const & filename)
|
||||
bool ReadPolygon(std::istream & stream, m2::RegionD & region, std::string const & filename)
|
||||
{
|
||||
std::string line, name;
|
||||
double lon, lat;
|
||||
@@ -127,7 +130,7 @@ bool ReadPolygon(std::istream & stream, Polygon & poly, std::string const & file
|
||||
iss >> lon >> lat;
|
||||
CHECK(!iss.fail(), ("Incorrect data in", filename));
|
||||
|
||||
poly.AddPoint(mercator::FromLatLon(lat, lon));
|
||||
region.AddPoint(mercator::FromLatLon(lat, lon));
|
||||
}
|
||||
|
||||
// drop inner rings
|
||||
@@ -143,7 +146,7 @@ bool CountryPolygons::Contains(m2::PointD const & point) const
|
||||
});
|
||||
}
|
||||
|
||||
bool LoadBorders(std::string const & borderFile, PolygonsList & outBorders)
|
||||
bool LoadBorders(std::string const & borderFile, std::vector<m2::RegionD> & outBorders)
|
||||
{
|
||||
std::ifstream stream(borderFile);
|
||||
std::string line;
|
||||
@@ -153,12 +156,12 @@ bool LoadBorders(std::string const & borderFile, PolygonsList & outBorders)
|
||||
return false;
|
||||
}
|
||||
|
||||
Polygon currentPolygon;
|
||||
m2::RegionD currentPolygon;
|
||||
while (ReadPolygon(stream, currentPolygon, borderFile))
|
||||
{
|
||||
CHECK(currentPolygon.IsValid(), ("Invalid region in", borderFile));
|
||||
outBorders.emplace_back(std::move(currentPolygon));
|
||||
currentPolygon = {};
|
||||
currentPolygon = m2::RegionD();
|
||||
}
|
||||
|
||||
CHECK(!outBorders.empty(), ("No borders were loaded from", borderFile));
|
||||
@@ -175,7 +178,7 @@ bool GetBordersRect(std::string const & baseDir, std::string const & country,
|
||||
return false;
|
||||
}
|
||||
|
||||
PolygonsList borders;
|
||||
std::vector<m2::RegionD> borders;
|
||||
CHECK(LoadBorders(bordersFile, borders), ());
|
||||
bordersRect.MakeEmpty();
|
||||
for (auto const & border : borders)
|
||||
@@ -189,16 +192,13 @@ CountryPolygonsCollection LoadCountriesList(std::string const & baseDir)
|
||||
LOG(LINFO, ("Loading countries in", BORDERS_DIR, "folder in", baseDir));
|
||||
|
||||
CountryPolygonsCollection countryPolygonsCollection;
|
||||
ForEachCountry(baseDir, [&](std::string name, PolygonsList && borders)
|
||||
ForEachCountry(baseDir, [&](auto const & name, auto const & borders)
|
||||
{
|
||||
PolygonsTree polygons;
|
||||
for (Polygon & border : borders)
|
||||
{
|
||||
auto const rect = border.GetRect();
|
||||
polygons.Add(std::move(border), rect);
|
||||
}
|
||||
for (m2::RegionD const & border : borders)
|
||||
polygons.Add(border, border.GetRect());
|
||||
|
||||
countryPolygonsCollection.Add(CountryPolygons(std::move(name), std::move(polygons)));
|
||||
countryPolygonsCollection.Add(CountryPolygons(name, polygons));
|
||||
});
|
||||
|
||||
LOG(LINFO, ("Countries loaded:", countryPolygonsCollection.GetSize()));
|
||||
@@ -214,7 +214,7 @@ void GeneratePackedBorders(std::string const & baseDir)
|
||||
}
|
||||
|
||||
void DumpBorderToPolyFile(std::string const & targetDir, storage::CountryId const & mwmName,
|
||||
PolygonsList const & polygons)
|
||||
std::vector<m2::RegionD> const & polygons)
|
||||
{
|
||||
CHECK(!polygons.empty(), ());
|
||||
|
||||
@@ -222,8 +222,7 @@ void DumpBorderToPolyFile(std::string const & targetDir, storage::CountryId cons
|
||||
std::ofstream poly(filePath);
|
||||
CHECK(poly.good(), ());
|
||||
|
||||
// Used to have fixed precicion with 6 digits. And Alaska has 4 digits after comma :) Strange, but as is.
|
||||
poly << std::setprecision(6) << std::fixed;
|
||||
poly << std::setprecision(20) << std::fixed;
|
||||
|
||||
poly << mwmName << std::endl;
|
||||
size_t polygonId = 1;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "generator/feature_builder.hpp"
|
||||
|
||||
#include "storage/storage_defines.hpp"
|
||||
|
||||
#include "coding/geometry_coding.hpp"
|
||||
@@ -9,9 +11,12 @@
|
||||
#include "geometry/region2d.hpp"
|
||||
#include "geometry/tree4d.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#define BORDERS_DIR "borders/"
|
||||
@@ -43,8 +48,9 @@ class CountryPolygons
|
||||
{
|
||||
public:
|
||||
CountryPolygons() = default;
|
||||
explicit CountryPolygons(std::string && name, PolygonsTree && regions)
|
||||
: m_name(std::move(name)), m_polygons(std::move(regions))
|
||||
explicit CountryPolygons(std::string const & name, PolygonsTree const & regions)
|
||||
: m_name(name)
|
||||
, m_polygons(regions)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -91,8 +97,6 @@ public:
|
||||
|
||||
private:
|
||||
std::string m_name;
|
||||
|
||||
/// @todo Is it an overkill to store Tree4D for each country's polygon?
|
||||
PolygonsTree m_polygons;
|
||||
};
|
||||
|
||||
@@ -101,15 +105,11 @@ class CountryPolygonsCollection
|
||||
public:
|
||||
CountryPolygonsCollection() = default;
|
||||
|
||||
void Add(CountryPolygons && countryPolygons)
|
||||
void Add(CountryPolygons const & countryPolygons)
|
||||
{
|
||||
auto const res = m_countryPolygonsMap.emplace(countryPolygons.GetName(), std::move(countryPolygons));
|
||||
CHECK(res.second, ());
|
||||
|
||||
auto const & inserted = res.first->second;
|
||||
inserted.ForEachPolygon([&inserted, this](Polygon const & polygon)
|
||||
{
|
||||
m_regionsTree.Add(inserted, polygon.GetRect());
|
||||
auto const it = m_countryPolygonsMap.emplace(countryPolygons.GetName(), countryPolygons);
|
||||
countryPolygons.ForEachPolygon([&](auto const & polygon) {
|
||||
m_regionsTree.Add(it.first->second, polygon.GetRect());
|
||||
});
|
||||
}
|
||||
|
||||
@@ -119,10 +119,9 @@ public:
|
||||
void ForEachCountryInRect(m2::RectD const & rect, ToDo && toDo) const
|
||||
{
|
||||
std::unordered_set<CountryPolygons const *> uniq;
|
||||
m_regionsTree.ForEachInRect(rect, [&](CountryPolygons const & cp)
|
||||
{
|
||||
if (uniq.insert(&cp).second)
|
||||
toDo(cp);
|
||||
m_regionsTree.ForEachInRect(rect, [&](auto const & countryPolygons) {
|
||||
if (uniq.emplace(&countryPolygons.get()).second)
|
||||
toDo(countryPolygons);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -143,10 +142,8 @@ private:
|
||||
std::unordered_map<std::string, CountryPolygons> m_countryPolygonsMap;
|
||||
};
|
||||
|
||||
using PolygonsList = std::vector<Polygon>;
|
||||
|
||||
/// @return false if borderFile can't be opened
|
||||
bool LoadBorders(std::string const & borderFile, PolygonsList & outBorders);
|
||||
bool LoadBorders(std::string const & borderFile, std::vector<m2::RegionD> & outBorders);
|
||||
|
||||
bool GetBordersRect(std::string const & baseDir, std::string const & country,
|
||||
m2::RectD & bordersRect);
|
||||
@@ -156,10 +153,10 @@ bool LoadCountriesList(std::string const & baseDir, CountryPolygonsCollection &
|
||||
void GeneratePackedBorders(std::string const & baseDir);
|
||||
|
||||
template <typename Source>
|
||||
PolygonsList ReadPolygonsOfOneBorder(Source & src)
|
||||
std::vector<m2::RegionD> ReadPolygonsOfOneBorder(Source & src)
|
||||
{
|
||||
auto const count = ReadVarUint<uint32_t>(src);
|
||||
PolygonsList result(count);
|
||||
std::vector<m2::RegionD> result(count);
|
||||
for (size_t i = 0; i < count; ++i)
|
||||
{
|
||||
std::vector<m2::PointD> points;
|
||||
@@ -171,7 +168,7 @@ PolygonsList ReadPolygonsOfOneBorder(Source & src)
|
||||
}
|
||||
|
||||
void DumpBorderToPolyFile(std::string const & filePath, storage::CountryId const & mwmName,
|
||||
PolygonsList const & polygons);
|
||||
std::vector<m2::RegionD> const & polygons);
|
||||
void UnpackBorders(std::string const & baseDir, std::string const & targetDir);
|
||||
|
||||
CountryPolygonsCollection const & GetOrCreateCountryPolygonsTree(std::string const & baseDir);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "generator/utils.hpp"
|
||||
|
||||
#include "indexer/feature.hpp"
|
||||
#include "indexer/ftypes_matcher.hpp"
|
||||
#include "indexer/feature_processor.hpp"
|
||||
|
||||
#include "platform/platform.hpp"
|
||||
@@ -87,38 +88,45 @@ std::string DescriptionsCollectionBuilderStat::LangStatisticsToString() const
|
||||
|
||||
void DescriptionsCollector::operator() (FeatureType & ft, uint32_t featureId)
|
||||
{
|
||||
// auto const & attractionsChecker = ftypes::AttractionsChecker::Instance();
|
||||
// if (!attractionsChecker(ft))
|
||||
// return;
|
||||
auto const & attractionsChecker = ftypes::AttractionsChecker::Instance();
|
||||
if (!attractionsChecker(ft))
|
||||
return;
|
||||
|
||||
(*this)(ft.GetMetadata().GetWikiURL(), featureId);
|
||||
}
|
||||
|
||||
void DescriptionsCollector::operator() (std::string const & wikiUrl, uint32_t featureId)
|
||||
{
|
||||
descriptions::LangMeta langsMeta;
|
||||
std::string path;
|
||||
|
||||
size_t size = 0;
|
||||
// First try to get wikipedia url.
|
||||
if (!wikiUrl.empty())
|
||||
size = FindPageAndFill(MakePathForWikipedia(m_wikipediaDir, wikiUrl), langsMeta);
|
||||
|
||||
// Second try to get wikidata id.
|
||||
bool const isWikiUrl = !langsMeta.empty();
|
||||
if (!isWikiUrl)
|
||||
bool const isWikiUrl = !wikiUrl.empty();
|
||||
if (isWikiUrl)
|
||||
{
|
||||
path = MakePathForWikipedia(m_wikipediaDir, wikiUrl);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Second try to get wikidata id.
|
||||
auto const wikidataId = m_wikidataHelper.GetWikidataId(featureId);
|
||||
if (wikidataId)
|
||||
size = FindPageAndFill(MakePathForWikidata(m_wikipediaDir, *wikidataId), langsMeta);
|
||||
path = MakePathForWikidata(m_wikipediaDir, *wikidataId);
|
||||
}
|
||||
|
||||
if (langsMeta.empty())
|
||||
if (path.empty())
|
||||
return;
|
||||
|
||||
if (size > 0)
|
||||
descriptions::LangMeta langsMeta;
|
||||
int const sz = FindPageAndFill(path, langsMeta);
|
||||
if (sz < 0)
|
||||
{
|
||||
LOG(LWARNING, ("Page", path, "not found."));
|
||||
return;
|
||||
}
|
||||
else if (sz > 0)
|
||||
{
|
||||
// Add only new loaded pages (not from cache).
|
||||
m_stat.AddSize(size);
|
||||
m_stat.AddSize(sz);
|
||||
m_stat.IncPage();
|
||||
}
|
||||
|
||||
@@ -158,10 +166,10 @@ std::string DescriptionsCollector::FillStringFromFile(std::string const & fullPa
|
||||
return std::string(std::istreambuf_iterator<char>(stream), std::istreambuf_iterator<char>());
|
||||
}
|
||||
|
||||
size_t DescriptionsCollector::FindPageAndFill(std::string const & path, descriptions::LangMeta & meta)
|
||||
int DescriptionsCollector::FindPageAndFill(std::string const & path, descriptions::LangMeta & meta)
|
||||
{
|
||||
size_t size = 0;
|
||||
if (path.empty() || !IsValidDir(path))
|
||||
int size = -1;
|
||||
if (!IsValidDir(path))
|
||||
return size;
|
||||
|
||||
Platform::FilesList filelist;
|
||||
@@ -176,27 +184,24 @@ size_t DescriptionsCollector::FindPageAndFill(std::string const & path, descript
|
||||
continue;
|
||||
}
|
||||
|
||||
if (size < 0)
|
||||
size = 0;
|
||||
|
||||
m_stat.IncCode(code);
|
||||
|
||||
auto res = m_path2Index.try_emplace(base::JoinPath(path, filename), 0);
|
||||
if (res.second)
|
||||
{
|
||||
auto const & filePath = res.first->first;
|
||||
auto content = FillStringFromFile(filePath);
|
||||
size_t const sz = content.size();
|
||||
if (sz == 0)
|
||||
{
|
||||
LOG(LWARNING, ("Empty descriptions file:", filePath));
|
||||
m_path2Index.erase(res.first);
|
||||
continue;
|
||||
}
|
||||
|
||||
auto & strings = m_collection.m_strings;
|
||||
res.first->second = strings.size();
|
||||
strings.push_back(std::move(content));
|
||||
strings.push_back(FillStringFromFile(filePath));
|
||||
|
||||
size_t const sz = strings.back().size();
|
||||
CHECK(sz > 0, ("Empty file:", filePath));
|
||||
size += sz;
|
||||
}
|
||||
|
||||
m_stat.IncCode(code);
|
||||
meta.emplace_back(code, res.first->second);
|
||||
}
|
||||
|
||||
|
||||
@@ -78,8 +78,8 @@ public:
|
||||
|
||||
static std::string FillStringFromFile(std::string const & fullPath);
|
||||
|
||||
/// @return Aggregated loaded from disk page's size.
|
||||
size_t FindPageAndFill(std::string const & wikipediaUrl, descriptions::LangMeta & meta);
|
||||
/// @return -1 If page not found. 0 if page from cache. Size > 0 if page was loaded from disk.
|
||||
int FindPageAndFill(std::string const & wikipediaUrl, descriptions::LangMeta & meta);
|
||||
|
||||
public:
|
||||
DescriptionsCollectionBuilderStat m_stat;
|
||||
|
||||
@@ -188,7 +188,7 @@ public:
|
||||
for (uint32_t i = 0; i < numPoints; ++i)
|
||||
{
|
||||
// Feature segment altitude.
|
||||
geometry::Altitude altitude = m_srtmManager.GetAltitude(mercator::ToLatLon(f.GetPoint(i)));
|
||||
geometry::Altitude altitude = m_srtmManager.GetHeight(mercator::ToLatLon(f.GetPoint(i)));
|
||||
pointAltitudes[i] = altitude == geometry::kInvalidAltitude ? 0 : altitude;
|
||||
if (i == 0)
|
||||
{
|
||||
|
||||
@@ -113,10 +113,8 @@ public:
|
||||
StringUtf8Multilang str;
|
||||
std::string const badUrl = "https://en.wikipedia.org/wiki/Not_exists";
|
||||
auto const path = DescriptionsCollector::MakePathForWikipedia(m_wikiDir, badUrl);
|
||||
|
||||
descriptions::LangMeta meta;
|
||||
TEST_EQUAL(collector.FindPageAndFill(path, meta), 0, ());
|
||||
TEST(meta.empty(), ());
|
||||
TEST_EQUAL(collector.FindPageAndFill(path, meta), -1, ());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,26 +2,13 @@
|
||||
|
||||
#include "generator/srtm_parser.hpp"
|
||||
|
||||
#include "coding/endianness.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace srtm_parser_test
|
||||
{
|
||||
using namespace generator;
|
||||
using namespace geometry;
|
||||
|
||||
inline std::string GetBase(ms::LatLon const & coord)
|
||||
namespace
|
||||
{
|
||||
return SrtmTile::GetBase(coord);
|
||||
}
|
||||
inline std::string GetBase(ms::LatLon const & coord) { return SrtmTile::GetBase(coord); }
|
||||
|
||||
inline SrtmTile::LatLonKey GetKey(ms::LatLon const & coord)
|
||||
{
|
||||
return SrtmTile::GetKey(coord);
|
||||
}
|
||||
|
||||
UNIT_TEST(SRTM_FilenameTest)
|
||||
UNIT_TEST(FilenameTests)
|
||||
{
|
||||
auto name = GetBase({56.4566, 37.3467});
|
||||
TEST_EQUAL(name, "N56E037", ());
|
||||
@@ -29,110 +16,13 @@ UNIT_TEST(SRTM_FilenameTest)
|
||||
name = GetBase({34.077433, -118.304569});
|
||||
TEST_EQUAL(name, "N34W119", ());
|
||||
|
||||
name = GetBase({1.0, 1.0});
|
||||
TEST_EQUAL(name, "N01E001", ());
|
||||
|
||||
name = GetBase({0.1, 0.1});
|
||||
TEST_EQUAL(name, "N00E000", ());
|
||||
|
||||
TEST_NOT_EQUAL(GetKey({0.1, 0.1}), GetKey({1.0, 1.0}), ());
|
||||
|
||||
name = GetBase({-0.1, -0.1});
|
||||
TEST_EQUAL(name, "S01W001", ());
|
||||
|
||||
TEST_NOT_EQUAL(GetKey({0.1, 0.1}), GetKey({-0.1, -0.1}), ());
|
||||
|
||||
name = GetBase({-0.9, -0.9});
|
||||
TEST_EQUAL(name, "S01W001", ());
|
||||
|
||||
TEST_EQUAL(GetKey({-0.9, -0.9}), GetKey({-0.1, -0.1}), ());
|
||||
|
||||
name = GetBase({-1.0, -1.0});
|
||||
TEST_EQUAL(name, "S01W001", ());
|
||||
|
||||
TEST_EQUAL(GetKey({-0.9, -0.9}), GetKey({-1.0, -1.0}), ());
|
||||
|
||||
name = GetBase({-1.9, -1.1});
|
||||
TEST_EQUAL(name, "S02W002", ());
|
||||
|
||||
TEST_NOT_EQUAL(GetKey({-1.1, -1.1}), GetKey({-1.0, -1.0}), ());
|
||||
|
||||
name = GetBase({-35.35, -12.1});
|
||||
TEST_EQUAL(name, "S36W013", ());
|
||||
|
||||
name = GetBase({-34.622358, -58.383654});
|
||||
TEST_EQUAL(name, "S35W059", ());
|
||||
}
|
||||
|
||||
UNIT_TEST(SRTM_TileTest)
|
||||
{
|
||||
SrtmTile tile;
|
||||
size_t sz;
|
||||
Altitude * data = tile.DataForTests(sz);
|
||||
|
||||
// Fill 5 last rows:
|
||||
// -4 -4 -4
|
||||
// -2 -2 -2
|
||||
// 0 0 0
|
||||
// 2 2 2
|
||||
// 4 4 4
|
||||
size_t row = sz - 1;
|
||||
for (Altitude a = 4; a >= -4; a -= 2)
|
||||
{
|
||||
for (size_t i = row * sz; i < (row + 1) * sz; ++i)
|
||||
data[i] = ReverseByteOrder(a);
|
||||
--row;
|
||||
}
|
||||
|
||||
double const len = 1.0 / (sz - 1);
|
||||
|
||||
TEST_EQUAL(tile.GetHeight({0, 0}), 4, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetTriangleHeight({0, 0}), 4.0, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetBilinearHeight({0, 0}), 4.0, ());
|
||||
TEST_EQUAL(tile.GetHeight({len, len}), 2, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetTriangleHeight({len, len}), 2.0, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetBilinearHeight({len, len}), 2.0, ());
|
||||
|
||||
double l = len / 2;
|
||||
Altitude h = tile.GetHeight({l, l});
|
||||
TEST(h == 4 || h == 2, (h));
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetTriangleHeight({l, l}), 3.0, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetBilinearHeight({l, l}), 3.0, ());
|
||||
|
||||
l = 3 * len + len / 2;
|
||||
h = tile.GetHeight({l, l});
|
||||
TEST(h == -4 || h == -2, (h));
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetTriangleHeight({l, l}), -3.0, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(tile.GetBilinearHeight({l, l}), -3.0, ());
|
||||
}
|
||||
|
||||
/*
|
||||
UNIT_TEST(SRTM_SamplesTest)
|
||||
{
|
||||
SrtmTileManager manager("/Users/vng/SRTM");
|
||||
|
||||
std::initializer_list<ms::LatLon> arr[] = {
|
||||
{{ 41.899802800880578957, 12.498703841110341273}, { 41.899748897914214751, 12.498642150302543996}, { 41.899315676124750496, 12.498172763721441925}, { 41.899207869324136766, 12.498057428732948893 }},
|
||||
{{ 41.900315874986389986, 12.499267105007675127}, { 41.900234022973513959, 12.499175909900486658}, { 41.899802800880578957, 12.498703841110341273 }},
|
||||
{{ 41.899317672545265623, 12.499556783583443575}, { 41.899704976945002954, 12.498910371206022774}, { 41.899716955394147533, 12.49888623132471821}, { 41.899730930248637151, 12.498862091443413647}, { 41.899744905100071435, 12.49882990493497914}, { 41.899760876355117034, 12.498797718426573056}, { 41.899772854793766896, 12.498768214127181864}, { 41.899788826041820755, 12.498736027618775779}, { 41.899802800880578957, 12.498703841110341273 }},
|
||||
{{ 41.900297907480371862, 12.497869674100513748}, { 41.900259976062137923, 12.497931364908311025}, { 41.899866685818835776, 12.498593870539906447}, { 41.899834743357700972, 12.498647514720602203}, { 41.899818772121129484, 12.498674336810950081}, { 41.899802800880578957, 12.498703841110341273 }},
|
||||
{{ 41.899728933841061007, 12.497309092412223208}, { 41.900224041013551357, 12.497850898637267392}, { 41.90023202658165502, 12.49786430968242712}, { 41.900224041013551357, 12.497888449563731683}, { 41.899826757739916161, 12.498548272986312213}, { 41.899808790096251698, 12.498556319613442156}, { 41.899802800880578957, 12.498550955195355527}, { 41.89979281885320006, 12.498545590777297321}, { 41.899307690442057606, 12.498009148970311344}, { 41.899301701179375357, 12.497995737925151616}, { 41.899309686862821422, 12.497976962461905259}, { 41.899716955394147533, 12.497311774621238101}, { 41.899728933841061007, 12.497309092412223208 }},
|
||||
{{ 41.899802800880578957, 12.498550955195355527}, { 41.899748897914214751, 12.498642150302543996}, { 41.899681020039992063, 12.498754803082022136 }},
|
||||
{{ 41.899912603078725226, 12.498650196929645517}, { 41.899866685818835776, 12.498593870539906447}, { 41.899826757739916161, 12.498548272986312213 }},
|
||||
{{ 41.899994455503602353, 12.498516086477906128}, { 41.899912603078725226, 12.498650196929645517}, { 41.899912603078725226, 12.498685065647094916}, { 41.900285929140210328, 12.499090079211356397}, { 41.90030589303923847, 12.499111536883646068}, { 41.90070516970908443, 12.498435620206862495}, { 41.900711158840110215, 12.49842489137071766}, { 41.900715151593857399, 12.498408798116514618}, { 41.900713155217019334, 12.498398069280369782}, { 41.90056342677709722, 12.498237136738282516}, { 41.900327853320931126, 12.497979644670920152}, { 41.900317871375655443, 12.497976962461905259}, { 41.900307889428788144, 12.497982326879963466}, { 41.899994455503602353, 12.498516086477906128 }},
|
||||
|
||||
{{ 44.759886801735603967, 34.316046940654871378 }, { 44.759500178870737841, 34.315553414192436321 }, { 44.759132599068138347, 34.315443443622029918 }, { 44.758765016927078761, 34.315430032576841768 }, { 44.758071746835689453, 34.315253006780551459 }, { 44.758037464032938146, 34.315255688989566352 }, { 44.757483222565575431, 34.315306650961247215 }, { 44.756708037437867631, 34.315676795808059296 }, { 44.756323297960172169, 34.315652655926726311 }, { 44.755963316624225001, 34.315430032576841768 }, { 44.755833798981250027, 34.315153765046261469 }, { 44.755789991477485046, 34.314949917159594861 }},
|
||||
{{ 44.759886801735603967, 34.316046940654871378 }, { 44.760006787615907342, 34.315175222718522718 }, { 44.760048687388419353, 34.315011607967392138 }, { 44.760260090322724125, 34.314772891363304552 }, { 44.760437211104594724, 34.314665603001913041 }, { 44.760572431981174191, 34.314383971053246114 }, { 44.760701939002856875, 34.314300822573159166 }, { 44.761223773178279828, 34.314088928059419459 }, { 44.761292334982400121, 34.314091610268434351 }, { 44.761376132632506142, 34.314011143997390718 }, { 44.761667518969709079, 34.313895809008897686 }, { 44.761739889204726239, 34.31379924948365101 }, { 44.761739889204726239, 34.313705372167419227 }, { 44.76183130410882427, 34.313568579506636524 }, { 44.761930336758403826, 34.313549804043390168 }, { 44.761981757490261202, 34.313442515681998657 }, { 44.762050318394869919, 34.313396918128404423 }, { 44.762176013175370315, 34.313391553710346216 }, { 44.762316943361625476, 34.313359367201911709 }, { 44.762610229403847484, 34.313332545111563832 }, { 44.762627369451166714, 34.313343273947708667 }, { 44.762663553978839559, 34.313313769648317475 }, { 44.762673076219179791, 34.313278900930868076 }, { 44.762678789562635018, 34.313233303377273842 }, { 44.762692120695184883, 34.31320379907788265 }, { 44.762720687397411723, 34.313182341405621401 }, { 44.762734018520298207, 34.313107239552635974 }, { 44.762747349640086725, 34.313091146298432932 }, { 44.7628063874193316, 34.313101875134577767 }, { 44.76292065391750441, 34.313123332806839016 }, { 44.762977787081830172, 34.313056277580983533 }, { 44.763063486722373341, 34.313107239552635974 }, { 44.763282496337311045, 34.313088464089389618 }},
|
||||
{{ 44.756521381971580809, 34.332137512655094724 }, { 44.756469956380023234, 34.331619846311355104 }, { 44.756412816780184016, 34.331308710063325407 }, { 44.756359486436011252, 34.331040489159818208 }, { 44.75633282124546497, 34.330965387306861203 }, { 44.756294728094793811, 34.330860781154484584 }, { 44.756264253556160781, 34.330694484194339111 }, { 44.756294728094793811, 34.330608653505208849 }, { 44.756323297960172169, 34.330533551652223423 }, { 44.756433767973362592, 34.330359208064976428 }, { 44.756555665673857902, 34.330109762624715586 }, { 44.756641374840555159, 34.329940783455526798 }, { 44.756755653531747896, 34.329755711032106547 }, { 44.757010875126020721, 34.329463350247323206 }, { 44.757180387352946127, 34.329117345281815687 }, { 44.757266095593031707, 34.32893495506743875 }, { 44.757448939413642108, 34.328564810220626669 }, { 44.757591785745901802, 34.328301953735206098 }, { 44.757746059388104243, 34.327797698436654628 }, { 44.757807006886359602, 34.327470468934393466 }, { 44.75787366813893442, 34.327239798957407402 }, { 44.757986039790637278, 34.327089595251464971 }, { 44.758026036427494887, 34.326995717935233188 }, { 44.758113648011466523, 34.326907205037088033 }, { 44.75817078592944398, 34.326783823421465058 }, { 44.758237446762365153, 34.326400267529493249 }, { 44.758264111073970071, 34.3263519877668557 }, { 44.758357436067782942, 34.326177644179608706 }, { 44.758412669156371066, 34.325909423276101506 }, { 44.758505993910240761, 34.325775312824362118 }, { 44.758526944344453113, 34.325598287028071809 }, { 44.758479329710219474, 34.325461494367289106 }, { 44.758391718680712756, 34.325370299260100637 }, { 44.758429810449001707, 34.32524423543546277 }, { 44.75854789477109108, 34.325085985102390396 }, { 44.758637410144764601, 34.324914323724158294 }, { 44.758685024648755757, 34.324734615718824671 }, { 44.758707879596705936, 34.324613916312273432 }, { 44.758766921503791991, 34.324568318758679197 }, { 44.758749780311177346, 34.32444225493404133 }, { 44.758799299298182461, 34.324206220538968637 }, { 44.75882786792522694, 34.323988961607142301 }, { 44.758825963350531651, 34.323667096522939346 }, { 44.758843104520543932, 34.323423015500765132 }, { 44.758862150259034252, 34.323181616687634232 }, { 44.758915478293424428, 34.322983133219054253 }, { 44.758944046863021526, 34.322875844857662742 }, { 44.759084984933011242, 34.322862433812474592 }, { 44.758966901708539865, 34.32266126813487972 }, { 44.758865959405987667, 34.32256202640058973 }, { 44.758753589465527511, 34.322331356423575244 }, { 44.75867359717138072, 34.322089957610444344 }, { 44.758690738386590624, 34.321875380887661322 }, { 44.758690738386590624, 34.321754681481081661 }, { 44.758698356702829813, 34.321642028701631943 }, { 44.758643123887310367, 34.321379172216211373 }, { 44.758641219306547043, 34.321231650719283834 }, { 44.758665978851873035, 34.321027802832645648 }, { 44.758732639113461005, 34.320837365991167189 }, { 44.75867359717138072, 34.320502089861804507 }, { 44.75867931091034535, 34.320392119291369681 }, { 44.758808822175438991, 34.320268737675775128 }, { 44.758793585571083895, 34.320099758506557919 }, { 44.758978329127899087, 34.319783257840441593 }, { 44.759109744288181787, 34.319584774371861613 }, { 44.75926782299799811, 34.31950430810081798 }, { 44.759357337256332698, 34.319305824632238 }, { 44.759387810163708821, 34.319016146056469552 }, { 44.759481133342561066, 34.318686234345193498 }, { 44.75951351073673834, 34.318530666221164438 }, { 44.759524938047988485, 34.318332182752584458 }, { 44.759637306488322395, 34.317903029306989993 }, { 44.759671588341880977, 34.317436324934931235 }, { 44.759871565415501493, 34.317044722415829483 }, { 44.759902038051663453, 34.316647755478669524 }, { 44.759915369824923914, 34.316167640061422617 }, { 44.759886801735603967, 34.316046940654871378 }},
|
||||
};
|
||||
|
||||
using namespace std;
|
||||
for (auto const & points : arr)
|
||||
{
|
||||
for (auto const & p : points)
|
||||
cout << manager.GetTriangleHeight(p) << ", ";
|
||||
cout << endl;
|
||||
}
|
||||
}
|
||||
*/
|
||||
} // namespace srtm_parser_test
|
||||
} // namespace
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "routing/maxspeeds_serialization.hpp"
|
||||
#include "routing/routing_helpers.hpp"
|
||||
|
||||
#include "routing_common/car_model_coefs.hpp"
|
||||
#include "routing_common/maxspeed_conversion.hpp"
|
||||
|
||||
#include "indexer/feature.hpp"
|
||||
@@ -38,10 +37,6 @@ using namespace routing;
|
||||
using std::string;
|
||||
|
||||
char constexpr kDelim[] = ", \t\r\n";
|
||||
double constexpr kMinDefSpeedRoadsLengthKm = 5.0;
|
||||
double constexpr kMaxPossibleDefSpeedKmH = 400.0;
|
||||
// This factor should be greater than sqrt(2) / 2 - prefer diagonal link to square path.
|
||||
double constexpr kLinkToMainSpeedFactor = 0.85;
|
||||
|
||||
template <class TokenizerT> bool ParseOneSpeedValue(TokenizerT & iter, MaxspeedType & value)
|
||||
{
|
||||
@@ -73,21 +68,11 @@ class MaxspeedsMwmCollector
|
||||
{
|
||||
double m_lengthKM = 0;
|
||||
double m_timeH = 0;
|
||||
|
||||
double m_speed = -1; // invalid initial value
|
||||
|
||||
friend std::string DebugPrint(AvgInfo const & i)
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << "AvgInfo{ " << i.m_speed << ", " << i.m_lengthKM << ", " << i.m_timeH << " }";
|
||||
return ss.str();
|
||||
}
|
||||
};
|
||||
|
||||
static int constexpr kSpeedsCount = MaxspeedsSerializer::DEFAULT_SPEEDS_COUNT;
|
||||
static int constexpr kOutsideCityIdx = 0;
|
||||
static int constexpr SPEEDS_COUNT = MaxspeedsSerializer::DEFAULT_SPEEDS_COUNT;
|
||||
// 0 - outside a city; 1 - inside a city.
|
||||
std::unordered_map<HighwayType, AvgInfo> m_avgSpeeds[kSpeedsCount];
|
||||
std::unordered_map<HighwayType, AvgInfo> m_avgSpeeds[SPEEDS_COUNT];
|
||||
|
||||
base::GeoObjectId GetOsmID(uint32_t fid) const
|
||||
{
|
||||
@@ -102,14 +87,10 @@ class MaxspeedsMwmCollector
|
||||
return m_graph->GetRoadGeometry(fid);
|
||||
}
|
||||
|
||||
// OSM data related warning tag for convenient grep.
|
||||
std::string m_logTag;
|
||||
|
||||
public:
|
||||
MaxspeedsMwmCollector(string const & dataPath, FeatureIdToOsmId const & ft2osm, IndexGraph * graph)
|
||||
: m_dataPath(dataPath), m_ft2osm(ft2osm), m_graph(graph)
|
||||
, m_converter(MaxspeedConverter::Instance())
|
||||
, m_logTag("SpeedsBuilder")
|
||||
{
|
||||
}
|
||||
|
||||
@@ -165,8 +146,9 @@ public:
|
||||
(*parentHwType == HighwayType::HighwayTertiary && hwType == HighwayType::HighwayTertiaryLink))
|
||||
{
|
||||
// Reduce factor from parent road. See DontUseLinksWhenRidingOnMotorway test.
|
||||
// 0.85, this factor should be greater than sqrt(2) / 2 - prefer diagonal link to square path.
|
||||
return converter.ClosestValidMacro(
|
||||
{ base::asserted_cast<MaxspeedType>(std::lround(s.GetForward() * kLinkToMainSpeedFactor)), s.GetUnits() });
|
||||
{ base::asserted_cast<MaxspeedType>(std::lround(s.GetForward() * 0.85)), s.GetUnits() });
|
||||
}
|
||||
|
||||
return {};
|
||||
@@ -283,16 +265,8 @@ public:
|
||||
});
|
||||
}
|
||||
|
||||
private:
|
||||
void AddSpeed(uint32_t featureID, uint64_t osmID, Maxspeed const & speed)
|
||||
{
|
||||
MaxspeedType constexpr kMaxReasonableSpeed = 280;
|
||||
if ((speed.GetSpeedKmPH(true) >= kMaxReasonableSpeed) ||
|
||||
(speed.IsBidirectional() && speed.GetSpeedKmPH(false) >= kMaxReasonableSpeed))
|
||||
{
|
||||
LOG(LWARNING, (m_logTag, "Very big speed", speed, "for way", osmID));
|
||||
}
|
||||
|
||||
// Add converted macro speed.
|
||||
SpeedInUnits const forward(speed.GetForward(), speed.GetUnits());
|
||||
CHECK(forward.IsValid(), ());
|
||||
@@ -304,12 +278,12 @@ private:
|
||||
|
||||
if (ftSpeed.m_forward == SpeedMacro::Undefined)
|
||||
{
|
||||
LOG(LWARNING, (m_logTag, "Undefined forward speed macro", forward, "for way", osmID));
|
||||
LOG(LWARNING, ("Undefined forward speed macro", forward, "for way", osmID));
|
||||
return;
|
||||
}
|
||||
if (backward.IsValid() && backwardMacro == SpeedMacro::Undefined)
|
||||
{
|
||||
LOG(LWARNING, (m_logTag, "Undefined backward speed macro", backward, "for way", osmID));
|
||||
LOG(LWARNING, ("Undefined backward speed macro", backward, "for way", osmID));
|
||||
}
|
||||
|
||||
m_maxspeeds.push_back(ftSpeed);
|
||||
@@ -337,167 +311,36 @@ private:
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG(LWARNING, (m_logTag, "Undefined HighwayType for way", osmID));
|
||||
LOG(LWARNING, ("Undefined HighwayType for way", osmID));
|
||||
}
|
||||
|
||||
public:
|
||||
void CalculateDefaultTypeSpeeds(MaxspeedsSerializer::HW2SpeedMap typeSpeeds[])
|
||||
void SerializeMaxspeeds() const
|
||||
{
|
||||
std::vector<std::pair<HighwayType, InOutCitySpeedKMpH>> baseSpeeds(
|
||||
kHighwayBasedSpeeds.begin(), kHighwayBasedSpeeds.end());
|
||||
// Remove links, because they don't conform speed consistency.
|
||||
baseSpeeds.erase(std::remove_if(baseSpeeds.begin(), baseSpeeds.end(), [](auto const & e)
|
||||
if (m_maxspeeds.empty())
|
||||
return;
|
||||
|
||||
MaxspeedsSerializer::HW2SpeedMap typeSpeeds[SPEEDS_COUNT];
|
||||
for (int ind = 0; ind < SPEEDS_COUNT; ++ind)
|
||||
{
|
||||
return (e.first == HighwayType::HighwayMotorwayLink ||
|
||||
e.first == HighwayType::HighwayTrunkLink ||
|
||||
e.first == HighwayType::HighwayPrimaryLink ||
|
||||
e.first == HighwayType::HighwaySecondaryLink ||
|
||||
e.first == HighwayType::HighwayTertiaryLink);
|
||||
}), baseSpeeds.end());
|
||||
|
||||
for (int ind = 0; ind < kSpeedsCount; ++ind)
|
||||
{
|
||||
// Calculate average speed.
|
||||
for (auto & e : m_avgSpeeds[ind])
|
||||
{
|
||||
// Check some reasonable conditions when assigning average speed.
|
||||
if (e.second.m_lengthKM > kMinDefSpeedRoadsLengthKm)
|
||||
{
|
||||
auto const speed = e.second.m_lengthKM / e.second.m_timeH;
|
||||
if (speed < kMaxPossibleDefSpeedKmH)
|
||||
e.second.m_speed = speed;
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare ethalon vector.
|
||||
bool const inCity = ind != kOutsideCityIdx;
|
||||
std::sort(baseSpeeds.begin(), baseSpeeds.end(), [inCity](auto const & l, auto const & r)
|
||||
{
|
||||
// Sort from biggest to smallest.
|
||||
return r.second.GetSpeed(inCity).m_weight < l.second.GetSpeed(inCity).m_weight;
|
||||
});
|
||||
|
||||
// First of all check that calculated speed and base speed difference is less than 2x.
|
||||
for (auto const & e : baseSpeeds)
|
||||
{
|
||||
auto & l = m_avgSpeeds[ind][e.first];
|
||||
if (l.m_speed > 0)
|
||||
{
|
||||
double const base = e.second.GetSpeed(inCity).m_weight;
|
||||
double const factor = l.m_speed / base;
|
||||
if (factor > 2 || factor < 0.5)
|
||||
{
|
||||
LOG(LWARNING, (m_logTag, "More than 2x diff:", e.first, l.m_speed, base));
|
||||
l.m_speed = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check speed's pairs consistency.
|
||||
// Constraints from the previous iteration can be broken if we modify l-speed on the next iteration.
|
||||
for (size_t il = 0, ir = 1; ir < baseSpeeds.size(); ++ir)
|
||||
{
|
||||
auto & l = m_avgSpeeds[ind][baseSpeeds[il].first];
|
||||
if (l.m_speed < 0)
|
||||
{
|
||||
++il;
|
||||
continue;
|
||||
}
|
||||
auto & r = m_avgSpeeds[ind][baseSpeeds[ir].first];
|
||||
if (r.m_speed < 0)
|
||||
continue;
|
||||
|
||||
// |l| should be greater than |r|
|
||||
if (l.m_speed < r.m_speed)
|
||||
{
|
||||
LOG(LWARNING, (m_logTag, "Bad def speeds pair:", baseSpeeds[il].first, baseSpeeds[ir].first, l, r));
|
||||
|
||||
if (l.m_lengthKM >= r.m_lengthKM)
|
||||
r.m_speed = l.m_speed;
|
||||
else
|
||||
l.m_speed = r.m_speed;
|
||||
}
|
||||
|
||||
il = ir;
|
||||
}
|
||||
|
||||
auto const getSpeed = [this, ind, inCity](HighwayType type)
|
||||
{
|
||||
auto const s = m_avgSpeeds[ind][type].m_speed;
|
||||
if (s > 0)
|
||||
return s;
|
||||
auto const * p = kHighwayBasedSpeeds.Find(type);
|
||||
CHECK(p, ());
|
||||
return p->GetSpeed(inCity).m_weight;
|
||||
};
|
||||
|
||||
// These speeds: Primary, Secondary, Tertiary, Residential have the biggest routing quality impact.
|
||||
{
|
||||
double const primaryS = getSpeed(HighwayType::HighwayPrimary);
|
||||
double const secondaryS = getSpeed(HighwayType::HighwaySecondary);
|
||||
double const tertiaryS = getSpeed(HighwayType::HighwayTertiary);
|
||||
double const residentialS = getSpeed(HighwayType::HighwayResidential);
|
||||
double constexpr eps = 1.0;
|
||||
if (primaryS + eps < secondaryS || secondaryS + eps < tertiaryS || tertiaryS + eps < residentialS)
|
||||
{
|
||||
LOG(LWARNING, (m_logTag, "Ignore primary, secondary, tertiary, residential speeds:",
|
||||
primaryS, secondaryS, tertiaryS, residentialS));
|
||||
|
||||
m_avgSpeeds[ind][HighwayType::HighwayPrimary].m_speed = -1;
|
||||
m_avgSpeeds[ind][HighwayType::HighwaySecondary].m_speed = -1;
|
||||
m_avgSpeeds[ind][HighwayType::HighwayTertiary].m_speed = -1;
|
||||
m_avgSpeeds[ind][HighwayType::HighwayResidential].m_speed = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Update links.
|
||||
std::pair<HighwayType, HighwayType> arrLinks[] = {
|
||||
{HighwayType::HighwayMotorway, HighwayType::HighwayMotorwayLink},
|
||||
{HighwayType::HighwayTrunk, HighwayType::HighwayTrunkLink},
|
||||
{HighwayType::HighwayPrimary, HighwayType::HighwayPrimaryLink},
|
||||
{HighwayType::HighwaySecondary, HighwayType::HighwaySecondaryLink},
|
||||
{HighwayType::HighwayTertiary, HighwayType::HighwayTertiaryLink},
|
||||
};
|
||||
for (auto const & e : arrLinks)
|
||||
{
|
||||
auto const main = m_avgSpeeds[ind][e.first].m_speed;
|
||||
auto & link = m_avgSpeeds[ind][e.second].m_speed;
|
||||
if (main > 0)
|
||||
link = kLinkToMainSpeedFactor * main;
|
||||
else
|
||||
link = -1;
|
||||
}
|
||||
|
||||
// Fill type-speed map.
|
||||
LOG(LINFO, ("Average speeds", ind == kOutsideCityIdx ? "outside" : "inside", "a city:"));
|
||||
LOG(LINFO, ("Average speeds", ind == 0 ? "outside" : "inside", "a city:"));
|
||||
for (auto const & e : m_avgSpeeds[ind])
|
||||
{
|
||||
if (e.second.m_speed > 0)
|
||||
long const speed = std::lround(e.second.m_lengthKM / e.second.m_timeH);
|
||||
if (speed < routing::kInvalidSpeed)
|
||||
{
|
||||
// Store type speeds in Metric system, like VehicleModel profiles.
|
||||
auto const speedInUnits = m_converter.ClosestValidMacro(
|
||||
{ static_cast<MaxspeedType>(e.second.m_speed), measurement_utils::Units::Metric });
|
||||
{ static_cast<MaxspeedType>(speed), measurement_utils::Units::Metric });
|
||||
|
||||
LOG(LINFO, ("*", e.first, "=", speedInUnits));
|
||||
|
||||
typeSpeeds[ind][e.first] = m_converter.SpeedToMacro(speedInUnits);
|
||||
}
|
||||
else
|
||||
LOG(LWARNING, ("Large average speed for", e.first, "=", speed));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SerializeMaxspeeds()
|
||||
{
|
||||
if (m_maxspeeds.empty())
|
||||
return;
|
||||
|
||||
MaxspeedsSerializer::HW2SpeedMap typeSpeeds[kSpeedsCount];
|
||||
/// @todo There are too many claims/bugs with Turkey calculated defaults.
|
||||
/// And yes, now this dummy country check :)
|
||||
if (m_dataPath.find("Turkey_") == std::string::npos)
|
||||
CalculateDefaultTypeSpeeds(typeSpeeds);
|
||||
|
||||
// Serialize speeds.
|
||||
FilesContainerW cont(m_dataPath, FileWriter::OP_WRITE_EXISTING);
|
||||
auto writer = cont.GetWriter(MAXSPEEDS_FILE_TAG);
|
||||
MaxspeedsSerializer::Serialize(m_maxspeeds, typeSpeeds, *writer);
|
||||
|
||||
@@ -4,10 +4,14 @@
|
||||
|
||||
#include "routing_common/maxspeed_conversion.hpp"
|
||||
|
||||
#include "platform/measurement_utils.hpp"
|
||||
|
||||
#include "base/geo_object_id.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace routing
|
||||
{
|
||||
|
||||
@@ -209,11 +209,7 @@ void RelationTagsWay::Process(RelationElement const & e)
|
||||
continue;
|
||||
|
||||
// Do not pass "ref" tags from boundaries and other, non-route relations to highways.
|
||||
if (isHighway && p.first == "ref")
|
||||
continue;
|
||||
|
||||
// https://github.com/organicmaps/organicmaps/issues/8246
|
||||
if (type == "route" && (p.first == "oneway" || p.first == "surface"))
|
||||
if (p.first == "ref" && isHighway)
|
||||
continue;
|
||||
|
||||
Base::AddCustomTag(p);
|
||||
|
||||
@@ -2,116 +2,72 @@
|
||||
|
||||
#include "routing/routing_helpers.hpp"
|
||||
|
||||
#include "indexer/classificator.hpp"
|
||||
#include "indexer/classificator_loader.hpp"
|
||||
#include "indexer/feature.hpp"
|
||||
#include "indexer/feature_altitude.hpp"
|
||||
#include "indexer/feature_data.hpp"
|
||||
#include "indexer/feature_processor.hpp"
|
||||
|
||||
#include "geometry/distance_on_sphere.hpp"
|
||||
#include "geometry/mercator.hpp"
|
||||
#include "geometry/point_with_altitude.hpp"
|
||||
|
||||
#include "platform/country_file.hpp"
|
||||
#include "platform/local_country_file.hpp"
|
||||
#include "platform/local_country_file_utils.hpp"
|
||||
#include "platform/platform.hpp"
|
||||
|
||||
#include "base/logging.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
#include <gflags/gflags.h>
|
||||
|
||||
DEFINE_string(srtm_path, "", "Path to directory with SRTM files");
|
||||
DEFINE_string(mwm_path, "", "Path to mwm files (writable dir)");
|
||||
DEFINE_bool(check_dist, false, "Check feature sections distance");
|
||||
|
||||
class SafeTileManager
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
generator::SrtmTileManager m_manager;
|
||||
std::mutex m_mutex;
|
||||
gflags::SetUsageMessage("SRTM coverage checker.");
|
||||
gflags::ParseCommandLineFlags(&argc, &argv, true);
|
||||
|
||||
uint32_t m_ferry;
|
||||
Platform & platform = GetPlatform();
|
||||
if (!FLAGS_mwm_path.empty())
|
||||
platform.SetWritableDirForTests(FLAGS_mwm_path);
|
||||
|
||||
public:
|
||||
explicit SafeTileManager(std::string const & dir) : m_manager(dir)
|
||||
if (FLAGS_srtm_path.empty())
|
||||
{
|
||||
m_ferry = classif().GetTypeByPath({"route", "ferry"});
|
||||
CHECK(m_ferry != Classificator::INVALID_TYPE, ());
|
||||
LOG(LERROR, ("SRTM files directory is not specified."));
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool IsAltitudeRoad(FeatureType & ft) const
|
||||
{
|
||||
feature::TypesHolder types(ft);
|
||||
return (routing::IsRoad(types) && !types.Has(m_ferry));
|
||||
}
|
||||
LOG(LINFO, ("writable dir =", platform.WritableDir()));
|
||||
LOG(LINFO, ("srtm dir =", FLAGS_srtm_path));
|
||||
|
||||
geometry::Altitude GetAltitude(ms::LatLon const & coord)
|
||||
{
|
||||
std::lock_guard guard(m_mutex);
|
||||
return m_manager.GetAltitude(coord);
|
||||
}
|
||||
|
||||
void Purge()
|
||||
{
|
||||
std::lock_guard guard(m_mutex);
|
||||
m_manager.Purge();
|
||||
}
|
||||
};
|
||||
|
||||
template <class FnT> void ForEachMWM(SafeTileManager & manager, FnT && fn)
|
||||
{
|
||||
std::vector<platform::LocalCountryFile> localFiles;
|
||||
FindAllLocalMapsAndCleanup(std::numeric_limits<int64_t>::max() /* latestVersion */, localFiles);
|
||||
|
||||
// Better use ComputationalThreadPool, but we want to call SafeTileManager::Purge after each batch.
|
||||
size_t constexpr kThreadsCount = 24;
|
||||
std::vector<std::thread> pool;
|
||||
generator::SrtmTileManager manager(FLAGS_srtm_path);
|
||||
classificator::Load();
|
||||
|
||||
size_t workers = 0;
|
||||
for (auto & file : localFiles)
|
||||
{
|
||||
// Skip worlds.
|
||||
if (file.GetDirectory().empty() || file.GetCountryName().starts_with("World"))
|
||||
continue;
|
||||
|
||||
file.SyncWithDisk();
|
||||
if (!file.OnDisk(MapFileType::Map))
|
||||
{
|
||||
LOG_SHORT(LWARNING, ("Map file not found for:", file.GetCountryName()));
|
||||
LOG(LINFO, ("Warning! Routing file not found for:", file.GetCountryName()));
|
||||
continue;
|
||||
}
|
||||
|
||||
LOG_SHORT(LINFO, ("Processing", file.GetCountryName()));
|
||||
auto const path = file.GetPath(MapFileType::Map);
|
||||
LOG(LINFO, ("Mwm", path, "is being processed."));
|
||||
|
||||
pool.emplace_back([&fn, &file]() { fn(file); });
|
||||
|
||||
if (++workers == kThreadsCount)
|
||||
{
|
||||
for (auto & t : pool)
|
||||
t.join();
|
||||
pool.clear();
|
||||
|
||||
manager.Purge();
|
||||
workers = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto & t : pool)
|
||||
t.join();
|
||||
}
|
||||
|
||||
void CheckCoverage(SafeTileManager & manager)
|
||||
{
|
||||
ForEachMWM(manager, [&](platform::LocalCountryFile const & file)
|
||||
{
|
||||
size_t all = 0;
|
||||
size_t good = 0;
|
||||
feature::ForEachFeature(file.GetPath(MapFileType::Map), [&](FeatureType & ft, uint32_t)
|
||||
{
|
||||
if (!manager.IsAltitudeRoad(ft))
|
||||
feature::ForEachFeature(path, [&](FeatureType & ft, uint32_t fid) {
|
||||
if (!routing::IsRoad(feature::TypesHolder(ft)))
|
||||
return;
|
||||
|
||||
ft.ParseGeometry(FeatureType::BEST_GEOMETRY);
|
||||
@@ -119,136 +75,16 @@ void CheckCoverage(SafeTileManager & manager)
|
||||
|
||||
for (size_t i = 0; i < ft.GetPointsCount(); ++i)
|
||||
{
|
||||
auto const height = manager.GetAltitude(mercator::ToLatLon(ft.GetPoint(i)));
|
||||
auto const height = manager.GetHeight(mercator::ToLatLon(ft.GetPoint(i)));
|
||||
if (height != geometry::kInvalidAltitude)
|
||||
good++;
|
||||
}
|
||||
});
|
||||
|
||||
auto const bad = all - good;
|
||||
auto const percent = (all == 0) ? 0.0 : bad * 100.0 / all;
|
||||
LOG_SHORT(LINFO, (percent > 10.0 ? "Huge" : "Low", "error rate in:", file.GetCountryName(),
|
||||
"good:", good, "bad:", bad, "all:", all, "%:", percent));
|
||||
});
|
||||
}
|
||||
|
||||
void CheckDistance(SafeTileManager & manager)
|
||||
{
|
||||
ForEachMWM(manager, [&](platform::LocalCountryFile const & file)
|
||||
{
|
||||
size_t all = 0;
|
||||
size_t added = 0;
|
||||
size_t invalid = 0;
|
||||
feature::ForEachFeature(file.GetPath(MapFileType::Map), [&](FeatureType & ft, uint32_t)
|
||||
{
|
||||
if (!manager.IsAltitudeRoad(ft))
|
||||
return;
|
||||
|
||||
ft.ParseGeometry(FeatureType::BEST_GEOMETRY);
|
||||
all += ft.GetPointsCount();
|
||||
|
||||
for (size_t i = 1; i < ft.GetPointsCount(); ++i)
|
||||
{
|
||||
auto const ll1 = mercator::ToLatLon(ft.GetPoint(i-1));
|
||||
auto const alt1 = manager.GetAltitude(ll1);
|
||||
auto const ll2 = mercator::ToLatLon(ft.GetPoint(i));
|
||||
auto const alt2 = manager.GetAltitude(ll2);
|
||||
|
||||
if (alt1 == geometry::kInvalidAltitude || alt2 == geometry::kInvalidAltitude)
|
||||
{
|
||||
++invalid;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Divide by 1 second sections.
|
||||
size_t const sections = std::round(ms::DistanceOnSphere(ll1.m_lat, ll1.m_lon, ll2.m_lat, ll2.m_lon) * 3600);
|
||||
if (sections < 2)
|
||||
continue;
|
||||
|
||||
for (size_t j = 1; j < sections; ++j)
|
||||
{
|
||||
double const a = j / double(sections);
|
||||
ms::LatLon const ll(ll2.m_lat * a + ll1.m_lat * (1 - a), ll2.m_lon * a + ll1.m_lon * (1 - a));
|
||||
|
||||
// Get diff between approx altitude and real one.
|
||||
auto const alt = manager.GetAltitude(ll);
|
||||
if (alt == geometry::kInvalidAltitude)
|
||||
{
|
||||
LOG_SHORT(LWARNING, ("Invalid altitude for the middle point:", ll));
|
||||
++added;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto const approxAlt = static_cast<geometry::Altitude>(std::round(alt2 * a + alt1 * (1 - a)));
|
||||
if (abs(alt - approxAlt) >= std::max(1, abs(alt)/10)) // 10%
|
||||
++added;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
auto const percent = added * 100.0 / all;
|
||||
std::string prefix = "Low";
|
||||
if (percent >= 1)
|
||||
prefix = "Huge";
|
||||
else if (added >= 1000)
|
||||
prefix = "Medium";
|
||||
|
||||
LOG_SHORT(LINFO, (prefix, file.GetCountryName(), "all:", all, "invalid:", invalid, "added:", added, "%:", percent));
|
||||
});
|
||||
}
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
gflags::SetUsageMessage("SRTM coverage checker.");
|
||||
gflags::ParseCommandLineFlags(&argc, &argv, true);
|
||||
|
||||
if (FLAGS_srtm_path.empty())
|
||||
{
|
||||
LOG_SHORT(LERROR, ("SRTM files directory is not specified."));
|
||||
return -1;
|
||||
}
|
||||
|
||||
classificator::Load();
|
||||
|
||||
if (!FLAGS_mwm_path.empty())
|
||||
{
|
||||
SafeTileManager manager(FLAGS_srtm_path);
|
||||
|
||||
Platform & platform = GetPlatform();
|
||||
platform.SetWritableDirForTests(FLAGS_mwm_path);
|
||||
|
||||
if (FLAGS_check_dist)
|
||||
CheckDistance(manager);
|
||||
else
|
||||
CheckCoverage(manager);
|
||||
}
|
||||
else
|
||||
{
|
||||
generator::SrtmTileManager manager(FLAGS_srtm_path);
|
||||
|
||||
using namespace std;
|
||||
cout << "Enter lat lon. Or Ctrl + C to exit." << endl;
|
||||
|
||||
while (true)
|
||||
{
|
||||
double lat, lon;
|
||||
cin >> lat >> lon;
|
||||
if (!cin)
|
||||
{
|
||||
cout << "Invalid lat lon." << endl;
|
||||
cin.clear();
|
||||
cin.ignore(10000, '\n');
|
||||
}
|
||||
else
|
||||
{
|
||||
auto const & tile = manager.GetTile({lat, lon});
|
||||
cout << "H = " << tile.GetHeight({lat, lon}) <<
|
||||
"; Trg = " << tile.GetTriangleHeight({lat, lon}) <<
|
||||
"; Bilinear = " << tile.GetBilinearHeight({lat, lon});
|
||||
cout << endl;
|
||||
}
|
||||
}
|
||||
auto const percent = all == 0 ? 0.0 : bad * 100.0 / all;
|
||||
LOG(LINFO, (percent > 10.0 ? "Huge" : "Low", "error rate in:", file.GetCountryName(),
|
||||
"good:", good, "bad:", bad, "all:", all, "%:", percent));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -16,21 +16,15 @@ namespace generator
|
||||
{
|
||||
namespace
|
||||
{
|
||||
int constexpr kArcSecondsInDegree = 60 * 60;
|
||||
size_t constexpr kArcSecondsInDegree = 60 * 60;
|
||||
size_t constexpr kSrtmTileSize = (kArcSecondsInDegree + 1) * (kArcSecondsInDegree + 1) * 2;
|
||||
|
||||
struct UnzipMemDelegate : public ZipFileReader::Delegate
|
||||
{
|
||||
explicit UnzipMemDelegate(std::vector<uint8_t> & buffer) : m_buffer(buffer), m_completed(false)
|
||||
{
|
||||
m_buffer.reserve(kSrtmTileSize);
|
||||
}
|
||||
explicit UnzipMemDelegate(std::string & buffer) : m_buffer(buffer), m_completed(false) {}
|
||||
|
||||
// ZipFileReader::Delegate overrides:
|
||||
void OnBlockUnzipped(size_t size, char const * data) override
|
||||
{
|
||||
m_buffer.insert(m_buffer.end(), data, data + size);
|
||||
}
|
||||
void OnBlockUnzipped(size_t size, char const * data) override { m_buffer.append(data, size); }
|
||||
|
||||
void OnStarted() override
|
||||
{
|
||||
@@ -40,7 +34,7 @@ struct UnzipMemDelegate : public ZipFileReader::Delegate
|
||||
|
||||
void OnCompleted() override { m_completed = true; }
|
||||
|
||||
std::vector<uint8_t> & m_buffer;
|
||||
std::string & m_buffer;
|
||||
bool m_completed;
|
||||
};
|
||||
|
||||
@@ -51,6 +45,11 @@ std::string GetSrtmContFileName(std::string const & dir, std::string const & bas
|
||||
} // namespace
|
||||
|
||||
// SrtmTile ----------------------------------------------------------------------------------------
|
||||
SrtmTile::SrtmTile()
|
||||
{
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
SrtmTile::SrtmTile(SrtmTile && rhs) : m_data(std::move(rhs.m_data)), m_valid(rhs.m_valid)
|
||||
{
|
||||
rhs.Invalidate();
|
||||
@@ -91,7 +90,7 @@ void SrtmTile::Init(std::string const & dir, ms::LatLon const & coord)
|
||||
}
|
||||
else
|
||||
{
|
||||
m_data = base::ReadFile(base::JoinPath(dir, file));
|
||||
GetPlatform().GetReader(file)->ReadAsString(m_data);
|
||||
}
|
||||
|
||||
if (m_data.size() != kSrtmTileSize)
|
||||
@@ -104,9 +103,11 @@ void SrtmTile::Init(std::string const & dir, ms::LatLon const & coord)
|
||||
m_valid = true;
|
||||
}
|
||||
|
||||
// static
|
||||
ms::LatLon SrtmTile::GetCoordInSeconds(ms::LatLon const & coord)
|
||||
geometry::Altitude SrtmTile::GetHeight(ms::LatLon const & coord) const
|
||||
{
|
||||
if (!IsValid())
|
||||
return geometry::kInvalidAltitude;
|
||||
|
||||
double ln = coord.m_lon - static_cast<int>(coord.m_lon);
|
||||
if (ln < 0)
|
||||
ln += 1;
|
||||
@@ -115,98 +116,15 @@ ms::LatLon SrtmTile::GetCoordInSeconds(ms::LatLon const & coord)
|
||||
lt += 1;
|
||||
lt = 1 - lt; // from North to South
|
||||
|
||||
return { kArcSecondsInDegree * lt, kArcSecondsInDegree * ln };
|
||||
}
|
||||
auto const row = static_cast<size_t>(std::round(kArcSecondsInDegree * lt));
|
||||
auto const col = static_cast<size_t>(std::round(kArcSecondsInDegree * ln));
|
||||
|
||||
geometry::Altitude SrtmTile::GetHeight(ms::LatLon const & coord) const
|
||||
{
|
||||
if (!IsValid())
|
||||
return geometry::kInvalidAltitude;
|
||||
|
||||
auto const ll = GetCoordInSeconds(coord);
|
||||
|
||||
return GetHeightRC(static_cast<size_t>(std::round(ll.m_lat)), static_cast<size_t>(std::round(ll.m_lon)));
|
||||
}
|
||||
|
||||
geometry::Altitude SrtmTile::GetHeightRC(size_t row, size_t col) const
|
||||
{
|
||||
size_t const ix = row * (kArcSecondsInDegree + 1) + col;
|
||||
CHECK_LESS(ix, Size(), (row, col));
|
||||
|
||||
CHECK_LESS(ix, Size(), (coord));
|
||||
return ReverseByteOrder(Data()[ix]);
|
||||
}
|
||||
|
||||
double SrtmTile::GetTriangleHeight(ms::LatLon const & coord) const
|
||||
{
|
||||
if (!IsValid())
|
||||
return geometry::kInvalidAltitude;
|
||||
|
||||
auto const ll = GetCoordInSeconds(coord);
|
||||
|
||||
m2::Point<int> const p1(static_cast<int>(std::round(ll.m_lon)), static_cast<int>(std::round(ll.m_lat)));
|
||||
|
||||
auto p2 = p1;
|
||||
if (p2.x > ll.m_lon)
|
||||
{
|
||||
if (p2.x > 0)
|
||||
--p2.x;
|
||||
}
|
||||
else if (p2.x < ll.m_lon)
|
||||
{
|
||||
if (p2.x < kArcSecondsInDegree)
|
||||
++p2.x;
|
||||
}
|
||||
|
||||
auto p3 = p1;
|
||||
if (p3.y > ll.m_lat)
|
||||
{
|
||||
if (p3.y > 0)
|
||||
--p3.y;
|
||||
}
|
||||
else if (p3.y < ll.m_lat)
|
||||
{
|
||||
if (p3.y < kArcSecondsInDegree)
|
||||
++p3.y;
|
||||
}
|
||||
|
||||
// Approximate height from triangle p1, p2, p3.
|
||||
// p1.y == p2.y; p1.x == p3.x
|
||||
// https://stackoverflow.com/questions/36090269/finding-height-of-point-on-height-map-triangles
|
||||
int const det = (p2.y - p3.y) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.y - p3.y);
|
||||
if (det == 0)
|
||||
return GetHeightRC(p1.y, p1.x);
|
||||
|
||||
double const a1 = ((p2.y - p3.y) * (ll.m_lon - p3.x) + (p3.x - p2.x) * (ll.m_lat - p3.y)) / det;
|
||||
double const a2 = ((p3.y - p1.y) * (ll.m_lon - p3.x) + (p1.x - p3.x) * (ll.m_lat - p3.y)) / det;
|
||||
double const a3 = 1 - a1 - a2;
|
||||
|
||||
return a1 * GetHeightRC(p1.y, p1.x) + a2 * GetHeightRC(p2.y, p2.x) + a3 * GetHeightRC(p3.y, p3.x);
|
||||
}
|
||||
|
||||
double SrtmTile::GetBilinearHeight(ms::LatLon const & coord) const
|
||||
{
|
||||
if (!IsValid())
|
||||
return geometry::kInvalidAltitude;
|
||||
|
||||
auto const ll = GetCoordInSeconds(coord);
|
||||
|
||||
m2::Point<int> const p1(static_cast<int>(ll.m_lon), static_cast<int>(ll.m_lat));
|
||||
auto p2 = p1;
|
||||
if (p2.x < kArcSecondsInDegree)
|
||||
++p2.x;
|
||||
if (p2.y < kArcSecondsInDegree)
|
||||
++p2.y;
|
||||
|
||||
// https://en.wikipedia.org/wiki/Bilinear_interpolation
|
||||
double const denom = (p2.x - p1.x) * (p2.y - p1.y);
|
||||
if (denom == 0)
|
||||
return GetHeightRC(p1.y, p1.x);
|
||||
|
||||
return (GetHeightRC(p1.y, p1.x) * (p2.x - ll.m_lon) * (p2.y - ll.m_lat) +
|
||||
GetHeightRC(p1.y, p2.x) * (ll.m_lon - p1.x) * (p2.y - ll.m_lat) +
|
||||
GetHeightRC(p2.y, p1.x) * (p2.x - ll.m_lon) * (ll.m_lat - p1.y) +
|
||||
GetHeightRC(p2.y, p2.x) * (ll.m_lon - p1.x) * (ll.m_lat - p1.y)) / denom;
|
||||
}
|
||||
|
||||
// static
|
||||
std::string SrtmTile::GetPath(std::string const & dir, std::string const & base)
|
||||
{
|
||||
@@ -214,52 +132,42 @@ std::string SrtmTile::GetPath(std::string const & dir, std::string const & base)
|
||||
}
|
||||
|
||||
// static
|
||||
SrtmTile::LatLonKey SrtmTile::GetKey(ms::LatLon const & coord)
|
||||
ms::LatLon SrtmTile::GetCenter(ms::LatLon const & coord)
|
||||
{
|
||||
ms::LatLon center{floor(coord.m_lat) + 0.5, floor(coord.m_lon) + 0.5};
|
||||
if (coord.m_lat < 0)
|
||||
center.m_lat -= 1.0;
|
||||
if (coord.m_lon < 0)
|
||||
center.m_lon -= 1.0;
|
||||
|
||||
return {static_cast<int32_t>(center.m_lat), static_cast<int32_t>(center.m_lon)};
|
||||
return {floor(coord.m_lat) + 0.5, floor(coord.m_lon) + 0.5};
|
||||
}
|
||||
|
||||
// static
|
||||
std::string SrtmTile::GetBase(ms::LatLon const & coord)
|
||||
{
|
||||
auto key = GetKey(coord);
|
||||
auto center = GetCenter(coord);
|
||||
std::ostringstream ss;
|
||||
if (coord.m_lat < 0)
|
||||
if (center.m_lat < 0)
|
||||
{
|
||||
ss << "S";
|
||||
key.first = -key.first;
|
||||
center.m_lat *= -1;
|
||||
center.m_lat += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ss << "N";
|
||||
}
|
||||
ss << std::setw(2) << std::setfill('0') << static_cast<int>(center.m_lat);
|
||||
|
||||
ss << std::setw(2) << std::setfill('0') << key.first;
|
||||
|
||||
if (coord.m_lon < 0)
|
||||
if (center.m_lon < 0)
|
||||
{
|
||||
ss << "W";
|
||||
key.second = -key.second;
|
||||
center.m_lon *= -1;
|
||||
center.m_lon += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ss << "E";
|
||||
|
||||
ss << std::setw(3) << key.second;
|
||||
}
|
||||
ss << std::setw(3) << static_cast<int>(center.m_lon);
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
geometry::Altitude * SrtmTile::DataForTests(size_t & sz)
|
||||
{
|
||||
m_valid = true;
|
||||
sz = kArcSecondsInDegree + 1;
|
||||
m_data.resize(kSrtmTileSize, 0);
|
||||
return reinterpret_cast<geometry::Altitude *>(m_data.data());
|
||||
}
|
||||
|
||||
void SrtmTile::Invalidate()
|
||||
{
|
||||
m_data.clear();
|
||||
@@ -268,27 +176,47 @@ void SrtmTile::Invalidate()
|
||||
}
|
||||
|
||||
// SrtmTileManager ---------------------------------------------------------------------------------
|
||||
SrtmTile const & SrtmTileManager::GetTile(ms::LatLon const & coord)
|
||||
SrtmTileManager::SrtmTileManager(std::string const & dir) : m_dir(dir) {}
|
||||
geometry::Altitude SrtmTileManager::GetHeight(ms::LatLon const & coord)
|
||||
{
|
||||
auto res = m_tiles.emplace(SrtmTile::GetKey(coord), SrtmTile());
|
||||
if (res.second)
|
||||
auto const key = GetKey(coord);
|
||||
|
||||
auto it = m_tiles.find(key);
|
||||
if (it == m_tiles.end())
|
||||
{
|
||||
SrtmTile tile;
|
||||
try
|
||||
{
|
||||
res.first->second.Init(m_dir, coord);
|
||||
tile.Init(m_dir, coord);
|
||||
}
|
||||
catch (RootException const & e)
|
||||
{
|
||||
std::string const base = SrtmTile::GetBase(coord);
|
||||
LOG(LINFO, ("Can't init SRTM tile:", base, "reason:", e.Msg()));
|
||||
}
|
||||
|
||||
// It's OK to store even invalid tiles and return invalid height
|
||||
// for them later.
|
||||
it = m_tiles.emplace(key, std::move(tile)).first;
|
||||
}
|
||||
return res.first->second;
|
||||
|
||||
return it->second.GetHeight(coord);
|
||||
}
|
||||
|
||||
void SrtmTileManager::Purge()
|
||||
// static
|
||||
SrtmTileManager::LatLonKey SrtmTileManager::GetKey(ms::LatLon const & coord)
|
||||
{
|
||||
MapT().swap(m_tiles);
|
||||
auto const tileCenter = SrtmTile::GetCenter(coord);
|
||||
return {static_cast<int32_t>(tileCenter.m_lat), static_cast<int32_t>(tileCenter.m_lon)};
|
||||
}
|
||||
|
||||
SrtmTile const & SrtmTileManager::GetTile(ms::LatLon const & coord)
|
||||
{
|
||||
// Touch the tile to force its loading.
|
||||
GetHeight(coord);
|
||||
auto const key = GetKey(coord);
|
||||
auto const it = m_tiles.find(key);
|
||||
CHECK(it != m_tiles.end(), (coord));
|
||||
return it->second;
|
||||
}
|
||||
} // namespace generator
|
||||
|
||||
@@ -2,67 +2,44 @@
|
||||
|
||||
#include "geometry/latlon.hpp"
|
||||
|
||||
#include "indexer/feature_altitude.hpp"
|
||||
|
||||
#include "geometry/point_with_altitude.hpp"
|
||||
|
||||
#include "base/macros.hpp"
|
||||
|
||||
#include <boost/container_hash/hash.hpp>
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace generator
|
||||
{
|
||||
class SrtmTile
|
||||
{
|
||||
public:
|
||||
SrtmTile() : m_valid(false) {}
|
||||
SrtmTile();
|
||||
SrtmTile(SrtmTile && rhs);
|
||||
|
||||
void Init(std::string const & dir, ms::LatLon const & coord);
|
||||
|
||||
inline bool IsValid() const { return m_valid; }
|
||||
/// @return Height in meters at |coord| or kInvalidAltitude.
|
||||
/// @{
|
||||
/// Nearest serialized height.
|
||||
// Returns height in meters at |coord| or kInvalidAltitude.
|
||||
geometry::Altitude GetHeight(ms::LatLon const & coord) const;
|
||||
/// Triangle interpolation.
|
||||
double GetTriangleHeight(ms::LatLon const & coord) const;
|
||||
/// Bilinear interpolation.
|
||||
double GetBilinearHeight(ms::LatLon const & coord) const;
|
||||
|
||||
geometry::Altitude GetAltitude(ms::LatLon const & coord) const
|
||||
{
|
||||
return static_cast<geometry::Altitude>(std::round(GetBilinearHeight(coord)));
|
||||
}
|
||||
/// @}
|
||||
|
||||
using LatLonKey = std::pair<int32_t, int32_t>;
|
||||
static LatLonKey GetKey(ms::LatLon const & coord);
|
||||
|
||||
static std::string GetBase(ms::LatLon const & coord);
|
||||
static ms::LatLon GetCenter(ms::LatLon const & coord);
|
||||
static std::string GetPath(std::string const & dir, std::string const & base);
|
||||
|
||||
/// Used in unit tests only to prepare mock tile.
|
||||
geometry::Altitude * DataForTests(size_t & sz);
|
||||
|
||||
private:
|
||||
static ms::LatLon GetCoordInSeconds(ms::LatLon const & coord);
|
||||
geometry::Altitude GetHeightRC(size_t row, size_t col) const;
|
||||
|
||||
inline geometry::Altitude const * Data() const
|
||||
{
|
||||
return reinterpret_cast<geometry::Altitude const *>(m_data.data());
|
||||
}
|
||||
};
|
||||
|
||||
inline size_t Size() const { return m_data.size() / sizeof(geometry::Altitude); }
|
||||
void Invalidate();
|
||||
|
||||
std::vector<uint8_t> m_data;
|
||||
std::string m_data;
|
||||
bool m_valid;
|
||||
|
||||
DISALLOW_COPY(SrtmTile);
|
||||
@@ -71,35 +48,27 @@ private:
|
||||
class SrtmTileManager
|
||||
{
|
||||
public:
|
||||
explicit SrtmTileManager(std::string const & dir) : m_dir(dir) {}
|
||||
explicit SrtmTileManager(std::string const & dir);
|
||||
|
||||
geometry::Altitude GetHeight(ms::LatLon const & coord);
|
||||
|
||||
SrtmTile const & GetTile(ms::LatLon const & coord);
|
||||
|
||||
geometry::Altitude GetAltitude(ms::LatLon const & coord)
|
||||
{
|
||||
return GetTile(coord).GetAltitude(coord);
|
||||
}
|
||||
|
||||
size_t GeTilesNumber() const { return m_tiles.size(); }
|
||||
|
||||
void Purge();
|
||||
|
||||
private:
|
||||
using LatLonKey = std::pair<int32_t, int32_t>;
|
||||
static LatLonKey GetKey(ms::LatLon const & coord);
|
||||
|
||||
std::string m_dir;
|
||||
|
||||
struct Hash
|
||||
{
|
||||
size_t operator()(SrtmTile::LatLonKey const & key) const
|
||||
size_t operator()(LatLonKey const & key) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
boost::hash_combine(seed, key.first);
|
||||
boost::hash_combine(seed, key.second);
|
||||
return seed;
|
||||
return (static_cast<size_t>(key.first) << 32u) | static_cast<size_t>(key.second);
|
||||
}
|
||||
};
|
||||
|
||||
using MapT = std::unordered_map<SrtmTile::LatLonKey, SrtmTile, Hash>;
|
||||
MapT m_tiles;
|
||||
std::unordered_map<LatLonKey, SrtmTile, Hash> m_tiles;
|
||||
|
||||
DISALLOW_COPY(SrtmTileManager);
|
||||
};
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <vector>
|
||||
|
||||
#define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED
|
||||
#define BOOST_STACKTRACE_USE_ADDR2LINE
|
||||
#include <boost/stacktrace.hpp>
|
||||
|
||||
namespace generator
|
||||
|
||||
@@ -55,10 +55,10 @@ void WikiUrlDumper::Dump(size_t cpuCount) const
|
||||
// static
|
||||
void WikiUrlDumper::DumpOne(std::string const & path, std::ostream & stream)
|
||||
{
|
||||
//auto const & needWikiUrl = ftypes::AttractionsChecker::Instance();
|
||||
auto const & needWikiUrl = ftypes::AttractionsChecker::Instance();
|
||||
feature::ForEachFeatureRawFormat(path, [&](FeatureBuilder const & feature, uint64_t /* pos */) {
|
||||
// if (!needWikiUrl(feature.GetTypesHolder()))
|
||||
// return;
|
||||
if (!needWikiUrl(feature.GetTypesHolder()))
|
||||
return;
|
||||
|
||||
auto const wikiUrl = feature.GetMetadata().GetWikiURL();
|
||||
if (wikiUrl.empty())
|
||||
@@ -89,10 +89,10 @@ WikiDataFilter::WikiDataFilter(std::string const & path, std::vector<std::string
|
||||
void WikiDataFilter::FilterOne(std::string const & path, std::map<base::GeoObjectId, std::string> const & idToWikiData,
|
||||
std::ostream & stream)
|
||||
{
|
||||
//auto const & needWikiUrl = ftypes::AttractionsChecker::Instance();
|
||||
auto const & needWikiUrl = ftypes::AttractionsChecker::Instance();
|
||||
feature::ForEachFeatureRawFormat(path, [&](FeatureBuilder const & feature, uint64_t /* pos */) {
|
||||
// if (!needWikiUrl(feature.GetTypesHolder()))
|
||||
// return;
|
||||
if (!needWikiUrl(feature.GetTypesHolder()))
|
||||
return;
|
||||
|
||||
auto const it = idToWikiData.find(feature.GetMostGenericOsmId());
|
||||
if (it == std::end(idToWikiData))
|
||||
|
||||
@@ -62,12 +62,8 @@ UNIT_TEST(Segment_Smoke)
|
||||
TEST(!OnSegment(P(10 + eps, 10), ps), ());
|
||||
TEST(!OnSegment(P(0, 0), ps), ());
|
||||
}
|
||||
}
|
||||
|
||||
// This paranoid test doesn' work with Release optimizations (LTO?).
|
||||
#ifndef NDEBUG
|
||||
UNIT_TEST(Segment_Paranoid)
|
||||
{
|
||||
// Paranoid tests.
|
||||
{
|
||||
P ps[] = {{0, 0}, {1e100, 1e100}};
|
||||
TEST(OnSegment(ps[0], ps), ());
|
||||
@@ -98,7 +94,6 @@ UNIT_TEST(Segment_Paranoid)
|
||||
TEST(!OnSegment(P(1e-16, 2.0 * 1e-16), ps), ());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
UNIT_TEST(Triangle_Smoke)
|
||||
{
|
||||
@@ -134,8 +129,6 @@ UNIT_TEST(Triangle_PointInsideSegment)
|
||||
TEST(!InsideTriangle(P(eps, eps), ps), ());
|
||||
}
|
||||
|
||||
// This paranoid test doesn' work with Release optimizations (LTO?).
|
||||
#ifndef NDEBUG
|
||||
UNIT_TEST(Triangle_PointInsidePoint)
|
||||
{
|
||||
double constexpr eps = 1.0E-10;
|
||||
@@ -154,7 +147,6 @@ UNIT_TEST(Triangle_PointInsidePoint)
|
||||
TEST(!InsideTriangle(P(eps, eps), ps), ());
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
UNIT_TEST(PolygonSelfIntersections_IntersectSmoke)
|
||||
{
|
||||
|
||||
@@ -12,38 +12,15 @@ using namespace std;
|
||||
using m2::Spline;
|
||||
using m2::PointD;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
double constexpr kAlmostZero = 1.0E-16;
|
||||
|
||||
void TestEqual(double x, double y)
|
||||
{
|
||||
if (fabs(x) < kAlmostZero || fabs(y) < kAlmostZero)
|
||||
TEST_ALMOST_EQUAL_ABS(x, y, kAlmostZero, ());
|
||||
else
|
||||
TEST_ALMOST_EQUAL_ULPS(x, y, ());
|
||||
}
|
||||
|
||||
void TestPointDDir(PointD const & dst, PointD const & src)
|
||||
{
|
||||
double const len1 = dst.Length();
|
||||
double const len2 = src.Length();
|
||||
if (len1 < kAlmostZero || len2 < kAlmostZero)
|
||||
{
|
||||
TestEqual(dst.x, src.x);
|
||||
TestEqual(dst.y, src.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
TestEqual(dst.x/len1, src.x/len2);
|
||||
TestEqual(dst.y/len1, src.y/len2);
|
||||
}
|
||||
TEST_ALMOST_EQUAL_ULPS(dst.x/len1, src.x/len2, ());
|
||||
TEST_ALMOST_EQUAL_ULPS(dst.y/len1, src.y/len2, ());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
UNIT_TEST(Spline_SmoothedDirections)
|
||||
UNIT_TEST(SmoothedDirections)
|
||||
{
|
||||
vector<PointD> path;
|
||||
path.push_back(PointD(0, 0));
|
||||
|
||||