1.概述

去年自己参与了一款含有GIS核心功能的App开发,开发结束后自己在笔记软件做了项目总结,今天特意想起来,就将其搬到博客这里来,并进行一定的修改优化。庆幸自己一直有做完项目即时做总结的习惯,否则此时再去回顾,多半无从下手。
此款软件,为了降低开发成本,我们采用了跨平台的React-Native框架。App主体功能有两个:GIS功能和表单功能。其中,GIS功能包括地图展示、图例绘制、地点搜索、地点导航、轨迹搜集等;表格功能即是信息展示、信息填写、信息上传等一般表单包含的功能。虽然说自己也参与部分表单功能的开发(比如区域选择器、表单内容约束机制等),但GIS功能主要由我负责,自己对这块体会更加深刻,因此,本文主要介绍移动端GIS功能开发,包括使用的框架、核心包\组件、遇到的问题及解决方法等。

2.框架及核心库

App采用跨平台的React-Native框架,而地图页面是H5页面,GIS库采用Leaflet
1. 上述框架确定前的技术预研及踩坑:
A、在GIS库方面,我在Leaflet、OpenLayers、MapboxGL三款基础地图库中,根据稳定性、软件成熟度、社区生态链完善程度几项指标,选择了Leaflet作为基础地图库,后续开发证明选择确实没错,“Leaflet包含了大量第三方插件,需要什么功能,都可以先到Github上搜索,常见的功能都有对应的第三方库实现了。同时,Leaflet文档也相当完善及高质量。”
B、在决定采用H5页面开发方面,前期自己先检索了React-Native的第三方地图包,结果都没有找到合适的,例如react-native-maps需要用到谷歌地图,因此不适合国内。最后才确定在react-native中嵌入H5页面,而H5页面用一个新项目实现,用webpack打包工具打包。
2. 使用到的核心库/组件:

  • react-native-webview: 用于在React-Native项目中嵌入H5页面。
  • react-native-loaction: 用于获取手机当前位置。
  • react-native-foreground-service: 用于安卓手机开启前台任务。
  • HtmlWebpackInlineSourcePlugin: 用于将引用到js文件及css文件都打包进html文件中。
  • 天地图: 提供地图源服务及搜索服务。
  • 腾讯地图/高德地图/百度地图: 提供跳转到App进行导航的api。

3.问题及解决方法(需求及实现方式)

1.H5页面路径: 由于在android上,传给react-native-webview包source参数的值需要是绝对路径(‘file:///android_asset/pages/index.html’),而在ios上,传入的值可以是相对路径,因此需要将H5页面引用到的js文件、css文件都复制到android/app/src/asset目录下以及另外一个路径(用于ios)。
2.调试H5页面: react-native-webview调试需要用到Chrome Inspect工具,需要翻墙;调试前,需要将地图页面项目webpack配置中的HtmlWebpackInlineSourcePlugin插件去掉,否则无法定位问题至具体的js文件。
3.react-native-webview与H5页面通信: 在H5页面上,android页面需要通过document.addEventListener() 监听RN发送过来的消息,而ios平台则是通过window.addEventListener()。为了在页面初始化前能获知平台类型,需要通过react-native-webview的injectedJavaScriptBeforeContentLoaded属性传入字符串赋值。
4.实时获取手机当前位置:

  • 定位功能:首先,尝试使用Leaflet地图库的api及Html5的api,两者都可以实现,Leaflet的api实际上是在Html5的api做了封装而已,但在适配ios时出现了位置权限提示的问题(弹窗提示"xx/xx/index.html想使用您当前位置"),而且在外边的react-native已经请求过权限了,因此重新找了react-native-location包实现定位功能。
  • 轨迹搜集功能:首先,因为react-native-locationgetLatestLocation() api经常返回过时的位置,因此没办法用 “定时调用该api来实现轨迹搜集” ;接着,由于配置不对,所以react-native-locationsubscribeToLocationUpdates api不能及时更新位置;最后,修改了 "
    interval;maxWaitTime"
    这两个参数实现实时获取用户位置的功能。
  • 后台运行轨迹搜集:首先,由于expo包有后台获取位置的api,所以先尝试用expo的api去获取位置,但发现始终没返回,猜测是GooglePlay的原因,但没能验证,所以也没有放弃;然后,尝试通过expoBackgroundFetch api定时调用其它包的位置获取api来实现功能,但间隔时间最短没有少于1min,无法实现功能需求;接着,尝试使用之前的定位功能时会报 “你的设备不支持GooglePlay,因此无法运行xxx” 的问题,最终调试是expo-location包的原因,因此得出expo包获取位置是需要谷歌服务的,因此放弃expo方案;最后,由间隔时间最短限制查到android文档上说明了android8+以上会对后台应用做程序运行频率进行限制,同时看到了成为前台应用的几个条件,其中一个是有前台任务,因此去github找前台任务的react-native包,最终找到了react-native-foreground-service,至此,完成了安卓后台运行轨迹搜集功能;而针对ios平台,则是看到了react-native-location包中有一个设置 “allowsBackgroundLocationUpdates”,最终开启这个设置便实现了后台运行。

4.总结

经验证,移动端GIS功能开发可以采用如下框架及技术:
1.采用React-Native作为App主体框架,地图页面作为一个单独项目,最终打包成H5页面,用react-native-webview组件加载H5页面。
2.地图页面采用Leaflet基础地图库,地图源使用天地图(免费),天地图同时也提供POI搜索、路线规划等GIS服务。
3.地图页面页面上:图例展示、绘制、点击等由Leaflet实现;POI搜索由天地图服务提供,地点导航由高德地图、腾讯地图、百度地图提供api跳转实现;定位功能及轨迹搜集功能借助react-native-loaction实现。
整体来说,采用全部免费的框架及技术实现,难度会比直接使用收费的地图库大很多,而且实现效果也完全比不上,比如说用 react-native-loaction 第三方库实现的轨迹搜集功能,会存在GPS漂移、轨迹路线不顺滑等问题,如果想进一步优化,可以采用卡尔曼滤波优化,这种优化有检索过,没有实现过。总之,收费的才是最好的(@_@)。

移动端GIS功能开发相关推荐

  1. 从零开始安卓端相机功能开发(一)了解用什么去开发以及流程

    目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...

  2. 从零开始安卓端相机功能开发(二)让我们来开发一个相机

    目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...

  3. 网络游戏《丛林战争》开发与学习之(四):游戏客户器端的功能开发(上)

    (三)中主要完成了服务器端的基础功能开发,本篇博客主要针对客户端进行功能开发. 0.客户端的基础准备工作 客户端的开发在Unity的场景中进行,首先导入UI框架和游戏环境的unitypackage包, ...

  4. 18.1.1 登录界面设计——第18章 PC端项目功能开发

    18.1.1 登录界面设计 登录界面效果图如下图18.1-1: 图18.1-1 界面设计主要是2个输入框,2个按钮, script脚本内容暂时不去管,主要看模板文件和样式. 在views目录下创建Lo ...

  5. Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)

    Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34  454人阅读  评论(1) ...

  6. gis 大屏_胡中南:Web端GIS技术新进展 | (PPT+速记)

    ▲点击关注,收获更多GIS精彩 在GTC 2020『GIS基础软件新技术论坛』上,超图研究院副院长胡中南作<云原生GIS及Web端技术新进展>报告,他首先系统讲解了云原生GIS技术的三大新 ...

  7. vue技术分享ppt_胡中南:Web端GIS技术新进展 | GTC专题论坛报告(视频+PPT+速记)

    点击图片上方蓝色字体"慧天地"即可订阅 文章转载自微信公众号GIS软件技术大会,版权归原作者及刊载媒体所有. 在GTC 2020『GIS基础软件新技术论坛』上,超图研究院副院长胡中 ...

  8. GIS底层开发、GIS前端开发和GIS后端开发有什么区别?

    使用哪些语言? GIS底层开发 说白了就是做软件,国内外有各种GIS软件公司,例如美国的ESRI公司的arcgis,国产的超图的supermap和中地数码的mapgis等,都属于gis软件. 软件开发 ...

  9. GIS软件开发工具包TatukGIS Developer Kernel更新至v11.5,修复紧急问题

    2019独角兽企业重金招聘Python工程师标准>>> GIS定制开发首选控件,帮您轻松搞定高效.优质.实惠的GIS解决方案 TatukGIS Developer Kernel(DK ...

最新文章

  1. C++ string中find ,rfind 等函数 用法总结及示例
  2. linux中html的图片显示不出来,如何在HTML中显示原始的rgb图像
  3. Java高级编程细节-动态代理-进阶高级开发必学技能
  4. CodeBlocks+Qt(MinGW)配置 QT4.8.x MinGW 问题解决
  5. B题 锅炉水冷壁温度曲线 2021年第一届长三角高校数学建模竞赛
  6. Adobe Reader 文档无法签名_手把手教你如何利用PDF阅读器压缩PDF文档
  7. BZOJ 2957 楼房重建 (分块)
  8. OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
  9. mysql 索引 内存_mysql索引【第三篇】
  10. 麦子mysql_[数据库]MySQL基础 (麦子学员 php 第二阶段)
  11. c语言学习-对一个百分制的成绩给出相应的等级(如90分以上A,80分以上B等
  12. android 加载更多动画效果,Android实践之带加载效果的下拉刷新上拉加载更多
  13. 繁体字_学认繁体字?你可能是低估了汉字的难度
  14. Vue.js 组件编码规范
  15. c语言程序构建,c语言开发环境构建及简单的c程序设计.doc
  16. 如何使用jmeter录制脚本
  17. SQL Prompt快捷键
  18. SOLIDWORKS在机械设计行业的优势所在
  19. input中加入图标实现搜索框
  20. 计算机培训学校可行性报告,在线考试系统可行性分析报告

热门文章

  1. 内连接与外连接-及其典型案例
  2. 西安建筑科技大学计算机真题,2016年西安建筑科技大学计算机应用技术数据库复试笔试仿真模拟题...
  3. C++Primer 5th 第二章 部分练习题答案
  4. 深度信念网络与受限玻尔兹曼机
  5. 2.15 这样的小红书图片内容,最容易“踩雷”!【玩赚小红书】
  6. tar 解压 跳过第一级目录
  7. 教你快速开发一个微信小游戏好友排行榜
  8. 不想上班的小公司 - 团队介绍
  9. 一个程序员如何快速下载软件方法总结
  10. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析-namenode启动过程分析...