Темный режим в react-native-картах для Openstreetmaps

#react-native #openstreetmap #react-native-maps

#react-native #openstreetmap #react-native-карты

Вопрос:

Я реализовал OpenStreetMaps, используя библиотеку react-native-maps, перейдя по этой ссылке https://www.igismap.com/switching-between-google-maps-and-openstreetmap-in-react-native /. У меня есть особые требования к использованию OpenStreetMaps, поэтому я использовал пользовательский слой плитки.

Я поражен использованием темы темного режима для того же. Текущий код выглядит следующим образом:

 import MapView, {
  PROVIDER_DEFAULT,
  MAP_TYPES,
  UrlTile,
} from "react-native-maps";
import React, { Component } from "react";
import { StyleSheet, Dimensions } from "react-native";

const styles = StyleSheet.create({
  container: {
    position: "absolute",
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
    justifyContent: "flex-end",
    alignItems: "center",
  },
  map: {
    position: "absolute",
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
  },
});

const mapDarkStyle = [
  {
    elementType: "geometry",
    stylers: [
      {
        color: "#212121",
      },
    ],
  },
  {
    elementType: "labels.icon",
    stylers: [
      {
        visibility: "off",
      },
    ],
  },
  {
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#757575",
      },
    ],
  },
  {
    elementType: "labels.text.stroke",
    stylers: [
      {
        color: "#212121",
      },
    ],
  },
  {
    featureType: "administrative",
    elementType: "geometry",
    stylers: [
      {
        color: "#757575",
      },
    ],
  },
  {
    featureType: "administrative.country",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#9e9e9e",
      },
    ],
  },
  {
    featureType: "administrative.land_parcel",
    stylers: [
      {
        visibility: "off",
      },
    ],
  },
  {
    featureType: "administrative.locality",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#bdbdbd",
      },
    ],
  },
  {
    featureType: "poi",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#757575",
      },
    ],
  },
  {
    featureType: "poi.park",
    elementType: "geometry",
    stylers: [
      {
        color: "#181818",
      },
    ],
  },
  {
    featureType: "poi.park",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#616161",
      },
    ],
  },
  {
    featureType: "poi.park",
    elementType: "labels.text.stroke",
    stylers: [
      {
        color: "#1b1b1b",
      },
    ],
  },
  {
    featureType: "road",
    elementType: "geometry.fill",
    stylers: [
      {
        color: "#2c2c2c",
      },
    ],
  },
  {
    featureType: "road",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#8a8a8a",
      },
    ],
  },
  {
    featureType: "road.arterial",
    elementType: "geometry",
    stylers: [
      {
        color: "#373737",
      },
    ],
  },
  {
    featureType: "road.highway",
    elementType: "geometry",
    stylers: [
      {
        color: "#3c3c3c",
      },
    ],
  },
  {
    featureType: "road.highway.controlled_access",
    elementType: "geometry",
    stylers: [
      {
        color: "#4e4e4e",
      },
    ],
  },
  {
    featureType: "road.local",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#616161",
      },
    ],
  },
  {
    featureType: "transit",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#757575",
      },
    ],
  },
  {
    featureType: "water",
    elementType: "geometry",
    stylers: [
      {
        color: "#000000",
      },
    ],
  },
  {
    featureType: "water",
    elementType: "labels.text.fill",
    stylers: [
      {
        color: "#3d3d3d",
      },
    ],
  },
];

const { width, height } = Dimensions.get("window");

const ASPECT_RATIO = width / height;
const LATITUDE = 22.720555;
const LONGITUDE = 75.858633;
const LATITUDE_DELTA = 0.0922;
const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO;

class OpenStreetMap extends Component {
  // constructor() {
  //   super();
  // }

  constructor(props) {
    super(props);
    this.state = {
      region: {
        latitude: LATITUDE,
        longitude: LONGITUDE,
        latitudeDelta: LATITUDE_DELTA,
        longitudeDelta: LONGITUDE_DELTA,
      },
    };
  }

  get mapType() {
    return this.props.provider === PROVIDER_DEFAULT
      ? MAP_TYPES.STANDARD
      : MAP_TYPES.STANDARD;
  }

  onRegionChange(region) {
    this.state.region.setValue(region);
  }

  render() {
    console.log("Current Maps......");
    return (
      <MapView
        style={styles.map}
        provider={null}
        // region={this.state.region}
        mapType={this.mapType}
        region={this.state.region}
        // onRegionChange={this.onRegionChange}

        customMapStyle={mapDarkStyle}
      >
        <UrlTile
          urlTemplate="http://c.tile.openstreetmap.org/{z}/{x}/{y}.png"
          // urlTemplate="https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png"
          maximumZ={50}
          flipY={false}
        />
      </MapView>
    );
  }
}

export default OpenStreetMap;
 

urlTemplate="http://c.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg"
изменяет тему.

Но когда я использую URL-адрес темной темы, он меняется : urlTemplate="https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png"

Ссылка на темную тему: https://wiki.openstreetmap.org/wiki/Tile_servers

Может кто-нибудь порадовать меня этой функцией?

Текущий ввод / вывод : введите описание изображения здесь

Ответ №1:

Я использовал https://tiles.stadiamaps.com /, но это не работает в мобильном приложении.

Мой обходной путь был:

 document.getElementById('map').style.filter = "invert (1) sepia (13%) saturate (37%) hue-rotate (130deg) brightness (95%) contrast (80%)";
 

введите описание изображения здесь