移动端GIS功能开发

article/2025/10/25 12:58:54

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漂移、轨迹路线不顺滑等问题,如果想进一步优化,可以采用卡尔曼滤波优化,这种优化有检索过,没有实现过。总之,收费的才是最好的(@_@)。


http://chatgpt.dhexx.cn/article/MbV1Xwue.shtml

相关文章

超图三维GIS开发概念学习

1 二三维一体化 所谓三维是指三维地理空间和基于地理球面或椭球面的二维地图空间。 三维 GIS 指的是以三维地理空间和基于地理球面或椭球面二维地图空间为基础的 GIS。 三维 GIS 在展示效果和分析决策方面有二维 GIS 无法比拟的优势。三维 GIS 无需投影即可描述真实世界面貌&…

地图——基于python的gis开发与应用

新冠病毒疫情地图、GIS和Qt平台 这是沁园春里最难的、最核心的部分。没有地图,GIS是玩不转的。没有基石,如何能建起高楼?地图就是gis的基石。我的论文要义是基于python做gis,所以python成了我的制图工具。而python是一个神奇的语…

GIS开发与应用(实验一)

实验一:开发环境的安装与熟悉 实验目的:实验准备实验内容及要求实验过程及步骤 实验目的: 1、熟悉GIS开发所用的软件环境; 2、了解各个软件的功能作用; 3、了解GIS开发的流程思路。 实验准备 Windows操作系统、QGIS…

GIS开发:开源gdal切片

二维地图的底图一般都是用切片(瓦片),一般都是将大的影像数据,通过工具,切成地图切片,以文件的形式存放,或者是存放到数据库中,Arcgis Server或Geoserver也可将影像数据,…

GIS开发:分享常用的gis算法(C#)

在系统开发中,有时会用到一些常用的空间算法,引用一些类库是可以解决问题,但是有时类库的运行效率比较慢,引用的东西比较多,如果需要的方法不多,可以写一些简单的计算方法。 下边分享几个常用的gis计算方法…

组件式GIS开发总结(一)

一、组件式开发的优缺点 1)优点 (1)高度的伸缩性 (2)灵活的拓展性 (3)易于开发 (4)易于集成 (5)更高的性价比 2)缺点 (1&a…

从零开始搭建一个GIS开发小框架(一)——基本框架

目录 1.概述1.1 项目背景1.2 传送门 2.技术选型:GMap.NET3.底图功能实现2.1 方式一:在线地图(以高德为例)2.2 greatmaps生成底图(瓦片地图) 3.搭建主程序,实现几个最基本功能3.1 定位到具体坐标…

三维GIS/GIS开发学习路线、软件和数据、视频资源推荐

GIS开发学习资源合集来了!!一份前所未有,全网都没有这么详细的资源合集来了,从基础入门视频、实战项目、GIS开发数据合集、开发软件等,囊括了GIS开发学习所以内容。 一、GIS和WebGIS简介: 什么是GIS&#x…

WEB GIS 开发基础概念汇总

WEB GIS 开发基础概念汇总 文章目录 WEB GIS 开发基础概念汇总1.基础概念2.技术框架2.1 常见技术概念汇总2.2 思维导图(借用,感觉比较到位) 3.内网离线WEB GIS搭建思路4.感谢 1.基础概念 WEB GIS是指依托互联网建立的地理信息服务系统&#…

GIS开发中的JavaScript的应用

JavaScript简介 JavaScript是一种很常见的高级编程语言,它和Java计算机语言没有任何联系。 JavaScript主要用于开发Web端的用户界面,比如在Web和移动GIS应用程序中就会用到JavaScript;它主要目标是构建前端应用程序,这些应用程序…

最全GIS开发编程语言汇总及分类

最近总有很多人关心GIS开发语言的问题,这个确实很重要,毕竟学习一门编程语言需要花费不少时间和精力,找不到合适GIS的编程语言意味着浪费时间。 这里将这些内容做一个详细的对比,大家可以根据自己的需要进行参考。 编程语言的特…

三维gis开发

如何简单制作cesium能渲染的三维地图 目录 一、下载高程数据 二、下载卫星影像数据 三、高程数据切片 四、卫星影像切片 五、cesium里渲染加载 一、下载高程数据 网站:地理空间数据云 1、注册登录 2、高级检索 3、数据集选择GDEMV2数据 4、空间位置根据需要…

GIS开发零基础入门:地图操作(附代码)

示例功能 本示例在加载了天地图矢量图层以及其注记图层的基础上,添加了地图视图的放大、缩小、跳转以及复位功能。 示例实现 本示例需要使用 【include-openlayers-local.js】 开发库实现,然后通过 setZoom(zoom)方法设置地图的缩放等级,通过…

第一章第1节-什么是GIS开发

1. 什么是GIS 要了解GIS开发, 首先我们要知道什么是GIS GIS: Geographic Information System 地理信息系统 地理信息系统(GIS,Geographic Information System)是一门综合性学科 结合了地理学与地图学以及遥感和计算机科学 详细内容参考: …

GIS开发实战图谱

总结了GIS开发的技术栈,罗列了应该了解的内容。 算是比较大而全的了,分理论、规范、数据、算法、软件、后端、前端、方向8个专项。 不求短期内全部都会,但还是一个比较好的学习框架和实践索引,如果基础好的话,两三年…

js中的设计模式之适配器模式

Js中的适配器模式 定义 将一个对象的接口适配成用户所期待的接口。 详细描述 适配器模式就是将不同对象的方法适配成可以对接或者统一调用的方式。它也是包装器的一种。 在生活中也有很多类似的例子,比如有的手机没有3.5耳机插口,所以就需要增加一个…

JavaScript设计模式之状态模式

什么是状态模式? 状态模式是一种非同寻常的优秀模式,它也许是解决某些需求场景的最好方法。虽然状态模式并不是一种简单到一目了然的模式(它往往还会带来代码量的增加),但你一旦明白了状态模式的精髓,以后…

【JavaScript设计模式】观察者模式

观察者模式 文章目录 观察者模式🌰:理解观察者模式手写观察者模式必须先订阅再发布吗Vue数据双向绑定(响应式系统)的实现原理实现一个Event Bus/ Event Emitter在Vue中使用Event Bus来实现组件间的通讯 观察者模式与发布-订阅模式…

js设计模式

js设计模式 1.构造器函数 function Ema(name, age) {this.name nameconsole.log(this);//谁调用了this就指向谁this.sayfunction(){console.log(1)}}let ema1new Ema(zhangsna1)let ema2new Ema(李四1)console.log(ema1);//Ema obj {name:zhangsan1, Fun say}console.log(ema…

八大最常用的JavaScript设计模式

八大最常用的JavaScript设计模式 设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目…