有没有办法隐藏 react-native-maps 标记?
Is there a way to hide react-native-maps markers?
我正在开发一个旅游应用程序,其中包含一张带有使用我的数据制作的标记的地图。
我想添加选项以“过滤”其标记。
用户可以按下按钮“餐厅”、“酒店”、“商业”以仅显示选定的标记。
(用户按下“餐厅”-> 只显示餐厅标记,这里是想法的图片:
这是我的 Axios 请求的代码,没什么大不了的:
import axios from 'axios';
// URL API BASE
const APIURL = 'http://10.22.101.55:5000/api';
// RECUPERATION DES RESTAURANTS
export const getAllRestaurant = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/restaurant`, {
nom: nom,
adresse: adresse,
ville: ville,
cp: cp,
telephone: telephone,
email: email,
latitude: latitude,
longitude: longitude
});
// RECUPERATION DES HôTELS
export const getAllHotel = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/hotel`, {
nom: nom,
adresse: adresse,
ville: ville,
cp: cp,
telephone: telephone,
email: email,
latitude: latitude,
longitude: longitude
});
// RECUPERATION DES COMMERCES
export const getAllCommerce = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/commerce`, {
nom: nom,
adresse: adresse,
ville: ville,
cp: cp,
telephone: telephone,
email: email,
latitude: latitude,
longitude: longitude
});
还有我页面的代码,我确保将不同的类别分开,希望这样会更容易:
import React, { useEffect } from 'react';
import { View, StyleSheet, TouchableOpacity, Text} from 'react-native';
import { ScrollView, TextInput } from 'react-native-gesture-handler';
import MapView, { Marker } from 'react-native-maps';
import Ionicons from 'react-native-vector-icons/Ionicons';
// Récupération des données
import {getAllRestaurant, getAllHotel, getAllCommerce} from '../service/Emplacements'
export default function AccueilScreen() {
// RECUPERATION DES RESTAURANTS
const [restaurants, setRestaurants] = React.useState([])
const LesRestaurants = () => [
getAllRestaurant().then(response => {
setRestaurants(response.data);
}).catch(err => console.log(err))
]
// RECUPERATION DES HÔTELS
const [hotels, setHotels] = React.useState([])
const LesHotels = () => [
getAllHotel().then(response => {
setHotels(response.data);
}).catch(err => console.log(err))
]
// RECUPERATION DES COMMERCES
const [commerces, setCommerces] = React.useState([])
const lesCommerces = () => [
getAllCommerce().then(response => {
setCommerces(response.data);
}).catch(err => console.log(err))
]
// AFFICHAGE DES MARKERS RESTAURANTS
const afficheRestaurant = restaurants.map((restaurant) => (
<Marker
pinColor='#fdca40'
key={restaurant.id}
coordinate={{latitude: restaurant.latitude, longitude: restaurant.longitude}}
title={restaurant.nom}
/>
))
// AFFICHAGE DES MARKERS HÔTELS
const afficheHotel = hotels.map((hotel) => (
<Marker
pinColor='#2978b5'
key={hotel.id}
coordinate={{latitude: hotel.latitude, longitude: hotel.longitude}}
title={hotel.nom}
/>
))
// AFFICHAGE DES MARKERS COMMERCES
const afficheCommerce = commerces.map((commerce) => (
<Marker
pinColor='#8fd9a8'
key={commerce.id}
coordinate={{latitude: commerce.latitude, longitude: commerce.longitude}}
title={commerce.nom}
/>
))
// FILTRE RESTAURANT
const onlyRestaurant = () => {
afficheCommerce = commerces.map((null))
afficheHotel = hotels.map((null))
}
// CHARGEMENT DES EMPLACEMENTS
useEffect(() => {
LesRestaurants()
LesHotels()
lesCommerces()
},[])
return (
<View style={styles.container}>
{/* -- MAP ET MARKERS -- */}
<MapView
customMapStyle={MapStyle}
scrollEnabled={false}
rotateEnabled={false}
zoomEnabled={false}
minZoomLevel={0}
maxZoomLevel={13}
style={styles.container}
region={{
latitude: 49.4826616,
longitude: 1.7245633,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
}}
>
{afficheRestaurant}
{afficheHotel}
{afficheCommerce}
</MapView>
{/* -- BARRE RECHERCHE -- */}
<View style={styles.searchBox}>
<TextInput
placeholder='Rechercher un lieu ...'
placeholderTextColor='#fb3640'
style={{flex: 1, padding: 0}}
/>
<Ionicons name='search-outline' size={20}/>
</View>
{/* -- FILTRE -- */}
<ScrollView
horizontal
scrollEventThrottle={1}
showsHorizontalScrollIndicator={false}
height={50}
style={styles.scroll}
contentContainerStyle={{paddingRight: 20}}
>
<TouchableOpacity style={styles.itemAll}>
<Ionicons size={15} name='options-outline'> Tout</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemRestaurant} onPress={onlyRestaurant}>
<Ionicons size={15} name='restaurant-outline'> Restaurant</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemHotel}>
<Ionicons size={15} name='bed-outline'> Hôtel</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemCommerce}>
<Ionicons size={15} name='cart-outline'> Commerce</Ionicons>
</TouchableOpacity>
</ScrollView>
</View>
);
}
// STYLE DE LA PAGE
{...}
// STYLE DE LA CARTE
{...}
我做了一些测试(const onylRestaurant),但没什么用(.map 可以为 null,或只读错误)。
我想知道您是否有任何可以使用的想法
感谢您的帮助!
不要犹豫向我询问更多信息,我对 react-native 还是个新手,但我会尽力回答你
你走在正确的道路上。
在你的组件中有另一个状态变量。
const [currentCategory, setCurrentCategory] = React.useState('All');
当用户点击任何按钮时,用相应的类别更新这个变量。
然后使用这个新的状态变量来决定要显示哪些标记。像这样。
const getMarkers = () => {
switch (currentCategory) {
case 'hotel': return afficheHotel;
case 'restaurant': return afficheRestaurant;
case 'commerce': return afficheCommerce;
default: return [...afficheHotel, ...afficheRestaurant, ...afficheCommerce];
}
}
现在编写一个函数来通过处理 onClick 来更新这个状态变量
const onCategoryClick = category => {
setCurrentCategory(category);
}
现在在你的代码中像这样使用上面的函数
<TouchableOpacity style={styles.itemAll} onPress={() => onCategoryClick('All')}>
<Ionicons size={15} name='options-outline'> Tout</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemRestaurant} onPress={() => onCategoryClick('restaurant')}>
<Ionicons size={15} name='restaurant-outline'> Restaurant</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemHotel} onPress={() => onCategoryClick('hotel')}>
<Ionicons size={15} name='bed-outline'> Hôtel</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemCommerce} onPress={() => onCategoryClick('commerce')}>
<Ionicons size={15} name='cart-outline'> Commerce</Ionicons>
</TouchableOpacity>
最后,您必须更新代码以删除 MapView 中的这一部分
{afficheRestaurant}
{afficheHotel}
{afficheCommerce}
并在其位置添加此
{getMarkers()}
所以您的地图视图将是这样的,
<MapView
customMapStyle={MapStyle}
scrollEnabled={false}
rotateEnabled={false}
zoomEnabled={false}
minZoomLevel={0}
maxZoomLevel={13}
style={styles.container}
region={{
latitude: 49.4826616,
longitude: 1.7245633,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
}}
>
{getMarkers()}
</MapView>
这个有用吗?
我正在开发一个旅游应用程序,其中包含一张带有使用我的数据制作的标记的地图。 我想添加选项以“过滤”其标记。 用户可以按下按钮“餐厅”、“酒店”、“商业”以仅显示选定的标记。
(用户按下“餐厅”-> 只显示餐厅标记,这里是想法的图片:
这是我的 Axios 请求的代码,没什么大不了的:
import axios from 'axios';
// URL API BASE
const APIURL = 'http://10.22.101.55:5000/api';
// RECUPERATION DES RESTAURANTS
export const getAllRestaurant = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/restaurant`, {
nom: nom,
adresse: adresse,
ville: ville,
cp: cp,
telephone: telephone,
email: email,
latitude: latitude,
longitude: longitude
});
// RECUPERATION DES HôTELS
export const getAllHotel = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/hotel`, {
nom: nom,
adresse: adresse,
ville: ville,
cp: cp,
telephone: telephone,
email: email,
latitude: latitude,
longitude: longitude
});
// RECUPERATION DES COMMERCES
export const getAllCommerce = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/commerce`, {
nom: nom,
adresse: adresse,
ville: ville,
cp: cp,
telephone: telephone,
email: email,
latitude: latitude,
longitude: longitude
});
还有我页面的代码,我确保将不同的类别分开,希望这样会更容易:
import React, { useEffect } from 'react';
import { View, StyleSheet, TouchableOpacity, Text} from 'react-native';
import { ScrollView, TextInput } from 'react-native-gesture-handler';
import MapView, { Marker } from 'react-native-maps';
import Ionicons from 'react-native-vector-icons/Ionicons';
// Récupération des données
import {getAllRestaurant, getAllHotel, getAllCommerce} from '../service/Emplacements'
export default function AccueilScreen() {
// RECUPERATION DES RESTAURANTS
const [restaurants, setRestaurants] = React.useState([])
const LesRestaurants = () => [
getAllRestaurant().then(response => {
setRestaurants(response.data);
}).catch(err => console.log(err))
]
// RECUPERATION DES HÔTELS
const [hotels, setHotels] = React.useState([])
const LesHotels = () => [
getAllHotel().then(response => {
setHotels(response.data);
}).catch(err => console.log(err))
]
// RECUPERATION DES COMMERCES
const [commerces, setCommerces] = React.useState([])
const lesCommerces = () => [
getAllCommerce().then(response => {
setCommerces(response.data);
}).catch(err => console.log(err))
]
// AFFICHAGE DES MARKERS RESTAURANTS
const afficheRestaurant = restaurants.map((restaurant) => (
<Marker
pinColor='#fdca40'
key={restaurant.id}
coordinate={{latitude: restaurant.latitude, longitude: restaurant.longitude}}
title={restaurant.nom}
/>
))
// AFFICHAGE DES MARKERS HÔTELS
const afficheHotel = hotels.map((hotel) => (
<Marker
pinColor='#2978b5'
key={hotel.id}
coordinate={{latitude: hotel.latitude, longitude: hotel.longitude}}
title={hotel.nom}
/>
))
// AFFICHAGE DES MARKERS COMMERCES
const afficheCommerce = commerces.map((commerce) => (
<Marker
pinColor='#8fd9a8'
key={commerce.id}
coordinate={{latitude: commerce.latitude, longitude: commerce.longitude}}
title={commerce.nom}
/>
))
// FILTRE RESTAURANT
const onlyRestaurant = () => {
afficheCommerce = commerces.map((null))
afficheHotel = hotels.map((null))
}
// CHARGEMENT DES EMPLACEMENTS
useEffect(() => {
LesRestaurants()
LesHotels()
lesCommerces()
},[])
return (
<View style={styles.container}>
{/* -- MAP ET MARKERS -- */}
<MapView
customMapStyle={MapStyle}
scrollEnabled={false}
rotateEnabled={false}
zoomEnabled={false}
minZoomLevel={0}
maxZoomLevel={13}
style={styles.container}
region={{
latitude: 49.4826616,
longitude: 1.7245633,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
}}
>
{afficheRestaurant}
{afficheHotel}
{afficheCommerce}
</MapView>
{/* -- BARRE RECHERCHE -- */}
<View style={styles.searchBox}>
<TextInput
placeholder='Rechercher un lieu ...'
placeholderTextColor='#fb3640'
style={{flex: 1, padding: 0}}
/>
<Ionicons name='search-outline' size={20}/>
</View>
{/* -- FILTRE -- */}
<ScrollView
horizontal
scrollEventThrottle={1}
showsHorizontalScrollIndicator={false}
height={50}
style={styles.scroll}
contentContainerStyle={{paddingRight: 20}}
>
<TouchableOpacity style={styles.itemAll}>
<Ionicons size={15} name='options-outline'> Tout</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemRestaurant} onPress={onlyRestaurant}>
<Ionicons size={15} name='restaurant-outline'> Restaurant</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemHotel}>
<Ionicons size={15} name='bed-outline'> Hôtel</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemCommerce}>
<Ionicons size={15} name='cart-outline'> Commerce</Ionicons>
</TouchableOpacity>
</ScrollView>
</View>
);
}
// STYLE DE LA PAGE
{...}
// STYLE DE LA CARTE
{...}
我做了一些测试(const onylRestaurant),但没什么用(.map 可以为 null,或只读错误)。
我想知道您是否有任何可以使用的想法
感谢您的帮助!
不要犹豫向我询问更多信息,我对 react-native 还是个新手,但我会尽力回答你
你走在正确的道路上。
在你的组件中有另一个状态变量。
const [currentCategory, setCurrentCategory] = React.useState('All');
当用户点击任何按钮时,用相应的类别更新这个变量。
然后使用这个新的状态变量来决定要显示哪些标记。像这样。
const getMarkers = () => {
switch (currentCategory) {
case 'hotel': return afficheHotel;
case 'restaurant': return afficheRestaurant;
case 'commerce': return afficheCommerce;
default: return [...afficheHotel, ...afficheRestaurant, ...afficheCommerce];
}
}
现在编写一个函数来通过处理 onClick 来更新这个状态变量
const onCategoryClick = category => {
setCurrentCategory(category);
}
现在在你的代码中像这样使用上面的函数
<TouchableOpacity style={styles.itemAll} onPress={() => onCategoryClick('All')}>
<Ionicons size={15} name='options-outline'> Tout</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemRestaurant} onPress={() => onCategoryClick('restaurant')}>
<Ionicons size={15} name='restaurant-outline'> Restaurant</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemHotel} onPress={() => onCategoryClick('hotel')}>
<Ionicons size={15} name='bed-outline'> Hôtel</Ionicons>
</TouchableOpacity>
<TouchableOpacity style={styles.itemCommerce} onPress={() => onCategoryClick('commerce')}>
<Ionicons size={15} name='cart-outline'> Commerce</Ionicons>
</TouchableOpacity>
最后,您必须更新代码以删除 MapView 中的这一部分
{afficheRestaurant}
{afficheHotel}
{afficheCommerce}
并在其位置添加此
{getMarkers()}
所以您的地图视图将是这样的,
<MapView
customMapStyle={MapStyle}
scrollEnabled={false}
rotateEnabled={false}
zoomEnabled={false}
minZoomLevel={0}
maxZoomLevel={13}
style={styles.container}
region={{
latitude: 49.4826616,
longitude: 1.7245633,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
}}
>
{getMarkers()}
</MapView>
这个有用吗?