React Native从零单排3 地图组件

RN版本:0.63.4
系统:Win10

前言

本系列文档是React Native学习笔记,主要记录学习过程中遇到的问题和注意点。 如果有人希望按照此文档开始学习,那么最好有一些Android和前端开发基础,因为此文档只会记录作者的学习过程中的重点难点,而不会详细列出每一个步骤。

1.引入地图组件

在国内,由于墙的存在,没有办法直接使用react native自带的地图组件,百度地图和高德地图也没有针对react native的官方组件,所以只能使用第三方基于android和ios端地图魔改的组件,我这边通过比较最终还是选择了lovebing魔改的百度地图,node包地址在 https://www.npmjs.com/package/react-native-baidu-map 有兴趣的话也可以自己看一下。
使用前需确认自己当前环境符合以下要求

JS:
node: 12+
react-native: 0.50.+ 2.Android
Android SDK: api 28+
gradle: 4.10.1
Android Studio: 3.1.3+
iOS:
XCode: 11.3+

确认符合之后,通过以下方式引入node包

1. npm: node install react-native-baidu-map
2. yarn: yarn add react-native-baidu-map

然后就要针对android和ios分别配置了

2.Android:

AndroidManifest.xml:节点

    <!-- 权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
    <!-- 在application下加入此节点 -->
    <!-- 此处请务必确认Key对应的平台是Android -->
    <meta-data
        android:name="com.baidu.lbsapi.API_KEY"
        android:value="申请的百度地图的Key" />

3.IOS

ios端的Key只需要在页面上配置

import { BaiduMapManager } from 'react-native-baidu-map'
// 此处请务必确认Key对应的平台是IOS
BaiduMapManager.initSDK('申请的百度地图的Key');
4.常见问题
The 'Pods-xx' target has libraries with conflicting names: libcrypto.a and libssl.a.

解决方案

1、首先package.json文件中删除"react-native-baidu-map",然后yarn install,
2、然后到iOS目录下,pod install ,然后打开***.xcworkspace工程项目,删除Pods/OpenSSL-Universal/Static/Support Files/底下的libssl.a和libcrypto.a
3、然后返回上级目录,package.json文件中添加"react-native-baidu-map",然后yarn install,
4、然后到iOS目录下,pod install --no-repo-update,就可以了

5.使用定位

import React, { useState } from 'react';
import { SafeAreaView,  StyleSheet, ScrollView, View, Text, StatusBar, Button, Dimensions } from 'react-native';
import { BaiduMapManager, MapView, MapTypes, Geolocation, Overlay, MapApp } from 'react-native-baidu-map';

BaiduMapManager.initSDK("申请的IOS Key");

// 获取屏幕大小
const { height, width } = Dimensions.get('window');

const App = () =>  {
  const [location, setLocation] = useState({});
  const [center, setCenter] = useState({ longitude: 113.950453, latitude: 22.546045 });
  const [markers, setMarkers] = useState([
    {
      location: {
        longitude: 113.960453,
        latitude: 22.546045
      }
    },
    {
      location: {
        longitude: 113.961453,
        latitude: 22.547045
      }
    },
    {
      location: {
        longitude: 113.962453, 
        latitude: 22.548045
      }
    },
    {
      location: {
        longitude: 113.963453, 
        latitude: 22.545045
      }
    },
    {
      location: {
        longitude: 113.964453, 
        latitude: 22.544045
      }
    }
  ]);

  return (
    <>
    <StatusBar barStyle="dark-content" />
      <SafeAreaView>
        <ScrollView
          contentInsetAdjustmentBehavior="automatic"
          style={styles.scrollView}>
          <View style={styles.body}>
            <MapView 
              showsUserLocation={true}
              locationData={location}
              // 地图的大小必须设置
              width={width} 
              height={400} 
              zoom={18}
              trafficEnabled={true}
              zoomControlsVisible={true}
              mapType={MapTypes.NORMAL}
              center={center}
            >
              <Overlay.Marker rotate={45} icon={{ uri: 'https://mapopen-website-wiki.cdn.bcebos.com/homePage/images/logox1.png' }} location={{ longitude: 113.975453, latitude: 22.510045 }} />
              <Overlay.Cluster>
                <Overlay.Marker location={{ longitude: 113.969453, latitude: 22.530045 }} />
                <Overlay.Marker location={{ longitude: 113.968453, latitude: 22.531045 }} />
                <Overlay.Marker location={{ longitude: 113.967453, latitude: 22.532045 }} />
                <Overlay.Marker location={{ longitude: 113.966453, latitude: 22.533045 }} />
                <Overlay.Marker location={{ longitude: 113.965453, latitude: 22.534045 }} />
                <Overlay.Marker location={{ longitude: 113.965453, latitude: 22.535045 }} />
              </Overlay.Cluster>
              <Overlay.Cluster>
                {markers.map((marker, index) => <Overlay.Marker key={`marker-` + index} location={marker.location} />)}
              </Overlay.Cluster>
              <Overlay.Polyline
                longitude={113.960453}
                latitude={22.546045}
                // 轨迹点个数必须大于2
                points={[{ longitude: 113.960453, latitude: 22.546145 }, { longitude: 113.961453, latitude: 22.547045 }, { longitude: 113.962453, latitude: 22.54045 }]} />
              <Overlay.Arc
                longitude={113.960453}
                latitude={22.546045}
                points={[{ longitude: 113.960453, latitude: 22.546045 }, { longitude: 113.960453, latitude: 22.546145 }, { longitude: 113.960453, latitude: 22.546245 }]} />
            </MapView>
            <View style={styles.buttonGroup}>
              <View style={styles.button}>
                <Button onPress={ () => {
                  Geolocation.getCurrentPosition()
                  .then((data) => {
                    setLocation(data);
                    setCenter(data);
                    });} 
                  } 
                  title="Locate Once" />
              </View>
              <View style={styles.button}>
                <Button onPress={ () => {
                  const startPoint = {
                    longitude: 113.904453, 
                    latitude: 22.544045,
                    name: '地点1'
                  };
                  const endPoint = {
                    longitude: 113.994453, 
                    latitude: 22.544045,
                    name: '地点2'
                  };
                  MapApp.openTransitRoute(startPoint, endPoint);
                } } 
                title="Transit Route" />
              </View>
              <View style={styles.button}>
                <Button onPress={ () => {
                  const startPoint = {
                    longitude: 113.904453, 
                    latitude: 22.544045,
                    name: '地点1'
                  };
                  const endPoint = {
                    longitude: 113.994453, 
                    latitude: 22.544045,
                    name: '地点2'
                  };
                  MapApp.openDrivingRoute(startPoint, endPoint);
                } } 
                title="Drive Route" />
              </View>
            </View>
            { location.address ? (
              <View style={styles.location}>
                <Text>当前位置:{ location.address }</Text>
              </View>
            ) : null}
          </View>
        </ScrollView>
      </SafeAreaView>
    </>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  scrollView: {

  },
  location: {
    padding: 16,
  },
  buttonGroup: {
    padding: 16,
    flexDirection: 'row'
  },
  button: {
    width: 80,
    margin: 8
  }
});

export default App;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容