#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%)";