开源 GIS 学习与实践
对于使用过百度地图和echarts开发地图相关功能的前端,往往混淆地图软件和GIS软件,主要原因有
- 功能重叠 百度地图提供了丰富的地图展示、定位、导航等功能,ECharts 也能实现地图数据的可视化。这些功能与 GIS 软件中的基础地图展示和简单的空间数据可视化有相似之处,容易让开发人员认为它们是同一类软件。例如,百度地图和 ECharts 都可以加载地图底图,并在上面标注点、线、面等地理要素,这与 GIS 软件中地图可视化的基本功能类似。
- 数据处理相似性 在处理地理数据时,百度地图和 ECharts 都需要对数据进行解析和转换,以便在地图上正确展示。GIS 软件同样需要进行数据处理,包括数据的导入、格式转换、坐标系统设置等。例如,开发人员在使用百度地图和 ECharts 展示地理数据时,都需要将数据格式化为它们能够识别的格式,如 JSON 等,这与 GIS 软件中数据处理的流程有一定的相似性。
- 开发体验相近 对于前端开发人员来说,使用百度地图和 ECharts 开发地图相关功能时,都需要通过 API 来调用各种功能和接口,都要进行数据绑定、事件监听等操作。这种相似的开发体验可能会让开发人员将它们与 GIS 软件混淆,因为 GIS 软件的开发也会涉及到类似的编程接口和操作方式。 然而,地图软件和 GIS 软件在本质上是有区别的。地图软件主要侧重于提供地图展示和基本的导航等功能,以满足用户的出行和地理信息查询需求;而 GIS 软件则更加强调对地理数据的管理、分析、处理和挖掘,具有更强大的空间分析能力和数据管理功能,可用于专业的地理研究、城市规划、资源管理等领域。
1.2、GIS软件定义
GIS 软件即地理信息系统(Geographic Information System)软件,是一种用于采集、存储、管理、分析和可视化地理空间数据的计算机系统。
- 数据处理与管理 GIS 软件能够采集多种来源的地理空间数据,包括但不限于卫星影像、航空照片、地形图、GPS 数据以及各种专题数据等。它可以将这些数据进行有效的存储和管理,通过建立空间数据库,实现对海量数据的高效组织和快速检索。
- 空间分析功能 这是 GIS 软件的核心能力之一。它具备强大的空间分析工具,能够对地理空间数据进行各种分析操作,如缓冲区分析、叠加分析、网络分析、地形分析等。
- 可视化展示 GIS 软件能够将地理空间数据以直观的地图形式进行可视化展示,并且可以根据用户的需求定制不同的地图样式和专题图,如行政区划图、人口密度图、气象灾害分布图等。同时,还支持三维可视化和动态演示,帮助用户更清晰地理解地理现象和数据之间的关系。
- 辅助决策支持 基于对地理空间数据的分析和可视化结果,GIS 软件能够为各种领域的决策提供有力支持。
1.3、GIS软件与地图类软件区别
- 数据管理 GIS 软件:可管理海量、多类型地理空间数据,支持复杂的数据结构和关系。 地图类软件:主要管理地图展示所需的基础地理数据,数据量和类型相对有限。
- 功能侧重 GIS 软件:侧重于空间分析、数据挖掘和处理,如缓冲区分析、叠加分析等。 地图类软件:侧重于地图展示、导航和位置查询等功能。
- 应用场景 GIS 软件:用于专业领域,如城市规划、资源管理、环境评估等。 地图类软件:主要用于大众出行、位置服务和简单的地理信息查询。
- 开发难度 GIS 软件:开发难度较高,需要掌握专业的 GIS 知识和开发技能。 地图类软件:开发相对简单,主要基于现有地图平台进行二次开发。
1.4、GIS软件适用场景
略
1.5、地图和遥感影像区别
略
2、开源GIS软件(geoserver)使用
2.1、下载
访问官网:https://geoserver.org/
如果单独下载缓存服务(geowebcache),可以访问缓存服务地址(一般新版本的geoserver也内置 geowebcache服务,但如果考虑单独部署缓存服务,需单独下载 - 性能会更好)官方地址:https://geowebcache.osgeo.org/
,右侧download 可以选择对应版本下载
进入后,选择版本,下载war包:
2.2、使用Docker 部署GeoServer
tomcat下部署,浏览器浏览,默认账号 admin/geoserver
2.2.1、准备工作
进入本地docker挂载目录,创建geoserver相关文件夹,(注:其中geoserver/data/nepsp 用来放置要部署的地图仓库文件)
cd /Users/dftshine/Career/LocalDocker/docker_volumes/
mkdir -p geoserver/{webapp,conf,logs} geoserver/data/nepsp
分别解压geoserver-2.27.2-war.zip 和 geowebcache-1.27.2-war.zip 得到 geoserver.war 和 geowebcache.war,然后再分别解压得到geoserver 和 geowebcache 文件夹,将这两个文件夹移动到 /Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/webapp
下
然后在conf中创建tomcat配置server.xml 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"/>
</GlobalNamingResources>
<Service name="Catalina">
<!-- 优化连接器配置 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="20"
maxSpareThreads="50"
acceptCount="100"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/>
<!--
<Connector protocol="AJP/1.3"
address="127.0.0.1"
port="8009"
redirectPort="8443"
secret="GeoserverAJPSecret123" /> 自定义密钥,随意设置但需非空 -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i""/>
</Host>
</Engine>
</Service>
</Server>
2.2.2、构建运行容器
注:本次使用的是 arm的tomcat,如果是x86的需调整对应的镜像。 另外如果使用tomcat10 可能会与Tomcat 10 的 jakarta.servlet
冲突(未成功,所以改用9.x)。
services:
geoserver:
image: docker.1ms.run/arm64v8/tomcat:9-jdk17
container_name: geoserver
restart: always
ports:
- "8777:8080"
environment:
# JVM参数优化(适配M系列芯片,根据实际内存调整)
- JAVA_OPTS=-Xms1G -Xmx2G -XX:+UseG1GC -XX:MaxMetaspaceSize=256m
# Tomcat管理员账号密码(可选)
- TOMCAT_USER=admin
- TOMCAT_PASSWORD=admin123
volumes:
- /Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/webapp/geoserver:/usr/local/tomcat/webapps/geoserver
- /Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/webapp/geowebcache:/usr/local/tomcat/webapps/geowebcache
- /Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/conf/server.xml:/usr/local/tomcat/conf/server.xml
- /Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/logs:/usr/local/tomcat/logs
- /Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/data/nepsp:/usr/local/tomcat/webapps/geoserver/data/data/nepsp
networks:
- geoserver-network
networks:
geoserver-network: {}
2.2.3、访问geoserver服务
http://localhost:8777/geoserver
默认用户名:admin
默认密码:geoserver
2.3、 概念
2.3.1、基础概念
工作空间(Workspace):是一种对相关数据和服务进行组织和管理的容器,用于隔离不同项目或用户的数据,避免命名冲突。 存储仓库(Data Store):用于连接和存储地理数据,比如 Shapefile、数据库等,是数据的实际存放位置。 图层(Layer):是基于存储仓库中的数据发布的可在地图上显示的要素集合,每个图层都有自己的样式和属性。 图层集(Layer Group):是将多个相关图层组合在一起形成的集合,方便对多个图层进行统一管理和操作,如同时发布、设置可见性等。 它们的逻辑关系是:工作空间包含存储仓库,存储仓库存储地理数据,基于这些数据可创建多个图层,而图层集是对多个图层进行组织管理的集合,它们都在工作空间的框架下进行组织和管理,以实现地理数据的有效发布和展示。
2.3.2、 其他概念
SRS:
在 GIS(地理信息系统)中,SRS 是空间参考系统(Spatial Reference System)的缩写。它是用于定义地理数据在地球表面上的位置和方向的系统,主要由坐标系统和投影方法组成。 坐标系统:坐标系统用于确定地球上点的位置。常见的坐标系统有地理坐标系统和投影坐标系统。 投影方法:将地球表面的曲面转换为平面的数学方法,常见的投影方法有墨卡托投影、高斯 - 克吕格投影等。 SRS 的作用是确保 GIS 中的地理数据能够准确地在空间中定位和显示,并且不同来源的数据能够在同一空间参考下进行整合和分析。如果没有正确的 SRS,地理数据可能会出现位置错误、变形或无法正确叠加等问题,影响 GIS 应用的准确性和可靠性。
EPSG:3857是一种投影坐标系统,也称为 WGS84 Web Mercator 或伪墨卡托投影。 WGS84:是一种国际上广泛使用的地理坐标系统,全称为 World Geodetic System 1984 BD09:是百度地图使用的地理坐标系统,也称为百度坐标系。它是在 WGS84 坐标系统的基础上,经过加密和偏移处理得到的。主要是为了满足国家地理信息安全的要求以及适应百度地图的应用需求,通过特定的算法对原始的经纬度坐标进行转换,使得在百度地图上显示的地理位置与实际的 WGS84 坐标有所不同。
2.4、实践配置
2.4.1、下载风资源Geotif
访问网站:https://globalwindatlas.info/en/download/gis-files
, 选择要下载的内容,下载
此处,我最终下载了:CHN_wind-speed_100m.tif, 然后放到上面准备的文件夹中:/Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/data/nepsp/
2.4.2、创建工作空间
2.4.3、创建存储仓库
此处使用的GeoTIFF格式的仓库,选择的文件正好是docker 挂载的目录下。
2.4.4、创建图层
注意下面的参数(注:从数据中计算的,也不知道是否正确):
2.4.5、发布图层
2.4.6、预览图层
2.5、地图下载和发布
使用全能地图下载,下载地图数据,高德影像地图1-14级瓦片,拼接tiff大图
2.6、 预览地图
通过geoserver图层预览功能,找到要查看的图层,点击OpenLayers 进入预览页面
2.7 使用缓存功能预览地图
正式应用环境,直接使用geotiff发布的图层服务会比较慢,此时可以选择使用切片图层,加载速度会提高
2.8、图层样式
上面缓存使用的geotiff 为100m风速资源灰度tiff,可以使用豆包生成适合风速的sld文件,比如:
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>wind_speed_100m_style</Name>
<UserStyle>
<Title>中国100m风速样式</Title>
<FeatureTypeStyle>
<Rule>
<RasterSymbolizer>
<ColorMap type="intervals" extended="false">
<ColorMapEntry color="#0000FF" quantity="0" label="0-5m/s"/>
<ColorMapEntry color="#00FFFF" quantity="5" label="5-10m/s"/>
<ColorMapEntry color="#00FF00" quantity="10" label="10-15m/s"/>
<ColorMapEntry color="#FFFF00" quantity="15" label="15-20m/s"/>
<ColorMapEntry color="#FFAA00" quantity="20" label="20-25m/s"/>
<ColorMapEntry color="#FF5500" quantity="25" label="25-30m/s"/>
<ColorMapEntry color="#FF0000" quantity="30" label="30-35m/s"/>
<ColorMapEntry color="#AA0000" quantity="35" label="35m/s以上"/>
</ColorMap>
</RasterSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
在样式中增加此样式
然后在图层发布地方,配置可选样式和默认样式:
最后在缓存图层预览,查看效果:
3、JS类库(openlayers)集成geoserver发布的地图
3.1、安装依赖
npm i ol@6 注:使用vue3, openlayers 6.x 以上版本有更好的兼容性
3.2、加载地图
3.3 缩放工具栏
3.4 鼠标悬停经纬度信息栏
3.5 地图缩放级别、比例尺、精度(米)信息栏
3.6 图形绘制工具栏
绘制多边形、矩形、圆形,上传绘制图形、保存绘制图形、清除绘制图形
4、案例
4.1、案例描述
地块项目管理展示项目列表, 单个项目维护页面布局为左中右三区域布局,左侧展示分类列表(地块),中间展示地图插件,右侧展示地块组合方案。 左侧分类列表 可维护地块,通过上传、绘制 新增分类下地块,也可以删除和修改已存在的地块信息。 右侧地块组合方案,支持多套方案,每套方案可以组合勾选左侧分类列表下的地块