react native 调用手机内置地图

GitHub:https://github.com/starlight36/react-native-map-linking

Android:

  • 高德地图
  • 百度地图

iOS:

  • 高德地图
  • 百度地图
  • 苹果地图

使用:npm install react-native-map-linking --save

ios需要在 info.plist 内配置:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>baidumap</string>
    <string>iosamap</string>
</array>

使用:

import MapLinking from 'react-native-map-linking';

// 唤起地图, 并在地图上标记一个点
MapLinking.markLocation({lat: 40, lng: 118}, 'aaa', 'bbb');

// 唤起地图, 并让地图规划从开始到结束的路线
MapLinking.planRoute({lat:40, lng: 118, title: '起点'}, {lat:40, lng: 119, title: '终点'}, 'drive');

// 唤起地图, 并发起导航
MapLinking.navigate({lat:40, lng: 118, title: '终点'});

-----------------------------------------------------------------------

注意:

1、demo使用的是百度地图插件,具体配置可以看:https://blog.csdn.net/qq_39910762/article/details/82882786

2、调用手机内置地图使用的是 react native 的方法 navigator.geolocation.getCurrentPosition()

原因:在demo里使用 react native 自带的定位,会有很大的偏差(误差在1.2km左右,忍不了);

           而在调用手机地图的时候不使用 react native 自带的方法返回的经纬度,误差同样在1.2km左右

           高德地图一样(以测,放图说话)

                    

下面是未使用react native方法的结果:

          

使用后:

           

iOS以测,OK

import React, { Component } from 'react';

import {
    StyleSheet,
    Text,
    View,
    ScrollView,
    Platform,
} from 'react-native';

import { MapView,MapTypes,Geolocation} from 'react-native-baidu-map';
import MapLinking from 'react-native-map-linking';
console.log(MapLinking)

import Dimensions from 'Dimensions';
const { width,height } = Dimensions.get('window');

export default class BaiduMapDemo extends Component {
    constructor() {
        super();
        this.state = {
            zoomControlsVisible: true,
            trafficEnabled: false,
            baiduHeatMapEnabled: false,
            mapType: MapTypes.NORMAL,
            zoom: 15,
            center: {
                longitude: 113.896198,
                latitude: 22.959144,
            },
            markers: [
                {
                    longitude: 113.896198,
                    latitude: 22.959144,
                    title: 'title',
                }
            ],
            clickMessage: '',
            poiMessage: '',
        };
    }
    lat = '';
    lng = '';
    componentDidMount() {
        navigator.geolocation.getCurrentPosition(
            (position) => {
                console.log(position)
                position = position.coords;
                lat = position.latitude;
                lng = position.longitude;
            },
            (error) => alert(error.message),
        )
    }

  render() {
        return (
            <View style={styles.container}>
                <MapView 
                    zoomControlsVisible={this.state.zoomControlsVisible} //默认true,是否显示缩放控件,仅支持android
                    trafficEnabled={this.state.trafficEnabled} //默认false,是否显示交通线
                    baiduHeatMapEnabled={this.state.baiduHeatMapEnabled} //默认false,是否显示热力图
                    mapType={this.state.mapType} //地图模式,NORMAL普通 SATELLITE卫星图
                    zoom={this.state.zoom} //缩放等级,默认为10
                    center={this.state.center} // 地图中心位置
                    markers={this.state.markers} //地图多个标记点

                    onMapLoaded={(e) => { //地图加载事件
                        Geolocation.getCurrentPosition()
                            .then(data => {
                                // console.log(data)
                                this.setState({
                                    center: {
                                        longitude: data.longitude,
                                        latitude: data.latitude
                                    },
                                    markers: [{
                                        longitude: data.longitude,
                                        latitude: data.latitude,
                                        title: data.district + data.street
                                    }]
                                })
                            })
                            .catch(e =>{
                                console.warn(e, 'error');
                            })
                    }}
                    
                    onMarkerClick={(e) => { //标记点点击事件
                        console.log(e)
                    }}
                    onMapClick={(e) => { //地图空白区域点击事件,返回经纬度
                        let title = '';
                        Geolocation.reverseGeoCode(e.latitude,e.longitude)
                            .then(res => {
                                console.log(res)
                                Platform.OS == 'ios' ? 
                                    title = res.district + res.streetName
                                :
                                    title = res.district + res.street;
                                this.setState({
                                    center: {
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                    },
                                    markers: [{
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                        title: title,
                                    }],
                                    clickMessage: JSON.stringify(res)
                                })
                            })
                            .catch(err => {
                                console.log(err)
                            })
                        
                    }}
                    onMapPoiClick={(e) => { //地图已有点点击
                        Geolocation.reverseGeoCode(e.latitude,e.longitude)
                            .then(res => {
                                res = JSON.stringify(res)
                                this.setState({
                                    center: {
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                    },
                                    markers: [{
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                        title: e.name,
                                    }],
                                    poiMessage: res
                                })
                            })
                            .catch(err => {
                                console.log(err)
                            })
                    }}
                    style={styles.map}
                >
                </MapView>

                <View style={styles.list}>
                    <Text>地图缩放控件状态: </Text>
                    {this.state.zoomControlsVisible ? 
                        <Text onPress={() => this.setState({zoomControlsVisible:false})}>显示</Text>
                        :
                        <Text onPress={() => this.setState({zoomControlsVisible:true})}>关闭</Text>
                    }
                </View>
                <View style={styles.list}>
                    <Text>交通线状态: </Text>
                    {this.state.trafficEnabled ? 
                        <Text onPress={() => this.setState({trafficEnabled:false})}>显示</Text>
                        :
                        <Text onPress={() => this.setState({trafficEnabled:true})}>关闭</Text>
                    }
                </View>
                <View style={styles.list}>
                    <Text>热力图状态: </Text>
                    {this.state.baiduHeatMapEnabled ? 
                        <Text onPress={() => this.setState({baiduHeatMapEnabled:false})}>显示</Text>
                        :
                        <Text onPress={() => this.setState({baiduHeatMapEnabled:true})}>关闭</Text>
                    }
                </View>
                <View style={styles.list}>
                    <Text>地图模式状态: </Text>
                    {this.state.mapType == MapTypes.NORMAL ? 
                        <Text onPress={() => this.setState({mapType:MapTypes.SATELLITE})}>普通</Text>
                        :
                        <Text onPress={() => this.setState({mapType:MapTypes.NORMAL})}>卫星</Text>
                    }
                </View>
                <View style={styles.list}>
                    <Text>地图空白区域点击信息: </Text>
                </View>
                <View style={styles.list}>
                    <Text>{this.state.clickMessage}</Text>
                </View>
                <View style={styles.list}>
                    <Text>地图已有点点击信息: </Text>
                </View>
                <View style={styles.list}>
                    <Text>{this.state.poiMessage}</Text>
                </View>
                <View style={styles.list}>
                    <Text onPress={() => {
                        Geolocation.getCurrentPosition()
                            .then(data => {
                                console.log(data)
                                this.setState({
                                    center: {
                                        longitude: data.longitude,
                                        latitude: data.latitude
                                    },
                                    markers: [{
                                        longitude: data.longitude,
                                        latitude: data.latitude,
                                        title: data.district + data.street
                                    }]
                                })
                            })
                            .catch(e =>{
                                console.warn(e, 'error');
                            })
                    }}>当前位置</Text>
                </View>
                <View style={styles.list}>
                    <Text 
                        onPress={() => {
                            let data = this.state.markers;
                            data = data[0];
                            console.log(data)
                            MapLinking.markLocation({
                                lat: lat,
                                lng: lng,
                            },
                            data.title,data.title)}
                        }
                    >
                        调起手机地图地点
                    </Text>
                </View>
                <View style={styles.list}>
                    <Text 
                        onPress={() => {
                            let data = this.state.markers;
                            data = data[0];
                            console.log(data)
                            MapLinking.planRoute({
                                lat: lat,
                                lng: lng,
                                title: '起点'
                            },{
                                lat: data.latitude,
                                lng: data.longitude,
                                title: '终点'
                            }, 'bus')}  // drive 驾车 bus 公交 walk 步行(默认)
                        }
                    >
                        手机地图规划路线
                    </Text>
                </View>
                <View style={styles.list}>
                    <Text 
                        onPress={() => {
                            let data = this.state.markers;
                            data = data[0];
                            console.log(data)
                            MapLinking.navigate({
                                lat: data.latitude,
                                lng: data.longitude,
                                title: data.title,
                            })}
                        }
                    >
                        调起手机地图导航
                    </Text>
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
    },
    map: {
        width: width,
        height: height - 300,
        marginBottom: 5,
    },
    list: {
        flexDirection: 'row',
        paddingLeft: 10,
        marginBottom: 5,
    }
});

猜你喜欢

转载自blog.csdn.net/qq_39910762/article/details/82984873