前端离线地图 - React项目实践🔨

目录

  • 工具网站推荐
  • 介绍leaflet
  • 项目实战
    • 地图创建
    • 优化只显示中国
    • 优化只显示某一个省/市/区

工具网站推荐

为了渲染离线地图,不仅需要上一篇的瓦片图片信息。这里还需要GeoJson数据集。我们可以去阿里云的datav下载。如图下载

阿里这个平台的GeoJson数据很全,对于做国内项目完全够用了。

介绍leaflet

Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库。 它大小仅仅只有 42 KB of JS, 并且拥有绝大部分开发者所需要的所有地图特性 。

点击查看文档。

项目实战

以react项目为例子。

首先安装leaflet

css 复制代码
npm i leaflet

安装完成之后在入口文件引入它的css

arduino 复制代码
import 'leaflet/dist/leaflet.css'

🚗 这个很重要!!!

因为我的项目中需要只显示中国的领土区域,所以这边只显示了中国领土。首先看看成品效果吧⬇️

地图创建

因为在创建地图的时候需要指定中心点,所以我们需要补充下关于坐标的知识。

Leaflet(默认使用EPSG:3857,也可以使用WGS84)

  1. EPSG:3857是平面坐标系,单位是米,它基于墨卡托投影,例如: 12914838.35, 4814529.9
  2. 详细解释:GCJ02、BD09、WGS84都是地理坐标系,球面坐标,单位为度,这种坐标方便在地球上定位,但是不方便展示和进行面积距离计算,我们印象中的地图都是平面的,所以就有了另外一种平面坐标系,平面坐标系是通过投影的方式从地理坐标系中转换过来,所以也称为投影坐标系,通常单位为米,投影坐标系根据投影方式的不同存在多种,在Web开发的场景里通常使用的是Web墨卡托投影,编号为EPSG:3857,它基于墨卡托投影,把WGS-84坐标系投影成正方形,这是通过舍弃了南北85.051129纬度以上的地区实现的,因为它是正方形,所以一个大的正方形可以很方便的被分割为更小的正方形。 作者:Infinity_Future
    链接:juejin.cn/post/698394...
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

根据上文中关于坐标的解释,我们可以使用高德的坐标来定位我们自定义地图的位置。点击高德坐标拾取获取你想要自己地图为中心的坐标。

直接上代码⬇️⬇️

typescript 复制代码
import React, { FC, useEffect } from 'react';
import L from 'leaflet';
export interface MapDefaultProps {}
let map;
const MapDefault: FC<MapDefaultProps> = () => {
    useEffect(() => {
        let container: any = L.DomUtil.get('map-default');
        if (container != null) {
            container._leaflet_id = null;
        }
         
        map = L.map('map-default', {
            center: [36.67, 105.17],
            zoom: 4.4,
        });
        L.tileLayer(`http://localhost:8080/{z}/{x}/{y}.png`, {}).addTo(map)
    }, []);
     return <div id="map-default" style={{
        width: '100vw',
        height: '100vh'
     }}></div>;
};
export default MapDefault;
  • 解释下其中center的坐标是我去高德地图坐标拾取到的位置
  • 其中http://localhost:8080/{z}/{x}/{y}.png的地址是我本地的瓦片地图地址详情可以看上一篇文章
  • 为什么只显示了部分呢?因为我下载的瓦片就是中国的,这个视角是看全世界。

以上代码的效果是⬇️⬇️

优化只显示中国

先看最终效果⬇️⬇️

直接上代码⬇️⬇️

arduino 复制代码
 L.TileLayer.boundaryCanvas(`http://localhost:8080/{z}/{x}/{y}.png`, {
            boundary: GeoJSON,
        }).addTo(this.map);
        
        
// 需要安装boundaryCanvas插件 
npm i leaflet-boundary-canvas
  • 解释boundaryCanvas是一个leaflet的插件,可以自己点击查看相关文档。
  • boundary的GeoJson需要自己去下载,上文中有提到。
  • 插件的使用是在leaflet之后引入就好了

优化只显示某一个省/市/区

有了上一节的显示中国其实只要下载对应的GeoJson数据就可以显示对应的地区。注意zoom的缩放比例。

至此介绍完毕。

说点别的

我是项目都给到测试在测了才发现,我们并没有在服务器部署瓦片地图服务但是地图照样显示。如下图

后来才发现leaflet的geoJSON方法可以直接渲染GeoJson的的数据。代码如下。

less 复制代码
L.geoJSON({GeoJson}, {
            style: {
                color: '#007457',
                weight: 2,
                opacity: 0.5,
                fillColor: '#e4f0ed',
                fillOpacity: 0.8,
                className: '',
            },
        }).addTo(map)

不过为了放大之后为了显示更多细节,还是把地图瓦片部署上去了。有了这个经验,其实如果纯粹的为了显示UI的话。你甚至都不需要下载瓦片地图。至于高德/百度/腾讯都有的那种添加marker的东西leaflet都可以实现。具体请认真查看文档。

React项目完整代码

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学4 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端