Попытка привязать радиус для текущего местоположения к API, у которого есть местоположения.В настоящее время новый EXPO SDK теперь запустил геозону наряду с использованием taskManager для управления запросом.
Это подтверждение концепции, и действительно ли новый SDK действительно работает для требований.
Может получитьтекущее местоположение.Возможность отображать все данные из API (с широтой и долготой)
Теперь это позволяет текущему местоположению отображать только местоположения от API до определенного радиуса.
Пока мне не нужнозапускать фоновые задачи и обновлять текущее местоположение - это больше о том, чтобы находиться в одном месте, а затем перетаскивать местоположения в радиусе от API.
Любая помощь или онлайн-уроки помогут.
Запуск этогов EXPO Snack для доказательства концепции.
Поскольку параметры геозонирования являются очень новыми для SDK - интерактивные учебные пособия недоступны и при большом количестве поиска большинство пользователей не получают окончательных результатов.
import React, {Component} from 'react';
import { AppRegistry, Text, View, StyleSheet, FlatList, Image } from 'react-native';
import { Constants, MapView, Location, TaskManager, Permissions } from 'expo';
TaskManager.defineTask('geoTask', ({ data: { eventType, region }, error }) => {
if (error) {
console.log("geoTaskError", {error});
return;
}
if (eventType === Location.GeofencingEventType.Enter) {
console.log("geoTaskEnter", { eventType, region });
}
else if (eventType === Location.GeofencingEventType.Exit) {
console.log("geoTaskExit", { eventType, region });
}
});
export default class App extends Component {
constructor() {
super ()
this.state = {
dataSource: []
}
}
state = {
mapRegion: null,
hasLocationPermissions: false,
locationResult: null
};
_handleMapRegionChange = mapRegion => {
console.log(mapRegion);
this.setState({ mapRegion });
};
_getLocationAsync = async () => {
let { status } = await Permissions.askAsync(Permissions.LOCATION);
if (status !== 'granted') {
this.setState({
locationResult: 'Permission to access location was denied',
});
} else {
this.setState({ hasLocationPermissions: true });
}
let location = await Location.getCurrentPositionAsync({});
this.setState({ locationLat: (location.coords.latitude) });
this.setState({ locationLon: (location.coords.longitude) });
this.setState({ locationResult: JSON.stringify(location) });
// Center the map on the location we just fetched.
this.setState({mapRegion: { latitude: location.coords.latitude, longitude: location.coords.longitude, latitudeDelta: 0.0922, longitudeDelta: 0.0421 }});
};
_startGeofencingAsync = async (geoTask, regions) => {
this.setState ({ regions: {radius: 4000}})
};
renderItem = ({item}) => {
return (
<View>
<View>
<Text>CODE: {item.code}
<Text> AIRPORT NAME: {item.name}
<Text> LAT: {item.lat}
<Text> LONG: {item.lon}
</Text>
</Text>
</Text>
</Text>
</View>
</View>
)}
componentDidMount() {
this._getLocationAsync();
//const url = 'https://www.json-generator.com/api/json/get/ccLAsEcOSq?indent=1'
const url = 'https://gist.githubusercontent.com/tdreyno/4278655/raw/7b0762c09b519f40397e4c3e100b097d861f5588/airports.json'
fetch(url)
.then((repsonse) => repsonse.json())
.then((responseJson) => {
this.setState({
dataSource: responseJson
})
})
.catch((error) => {
console.log(error)
});
let onPress = async () => {
await Location.startLocationUpdatesAsync('geoTask', {
accuracy: Location.Accuracy.Balanced,
});
};
}
render() {
return (
<View style={styles.container}>
<Text>Latitude: {this.state.locationLat}</Text>
<Text>Longitude: {this.state.locationLon}</Text>
<Text>Location: {this.state.locationResult}</Text>
<View style={styles.container}>
<FlatList
data={this.state.dataSource}
renderItem={this.renderItem}
/>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
},
paragraph: {
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
},
});
Текущее местоположение -> имеет радиус -> геозона тянет окружающие места в радиусе от API