WebGIS使用教程
GeoServer使用手册
安装GeoServer
参照https://docs.geoserver.org/stable/en/user/installation/win_binary.html
到bin目录下运行startup.bat
访问http://172.21.15.67:8080/geoserver/web/
账户:admin
密码:geoserver
端口在安装目录下的start.ini文件下
找到下面这行修改端口号即可
HTTP port to listen on
jetty.port=8080
实现自动导入功能,创建maven工程就行了
package com.szx.geoserver;
import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.decoder.RESTLayer;
import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder;
import java.io.IOException;
import java.net.URL;
import java.util.List;
public class GeoserverPostGIS {
public static void main(String[] args) throws IOException {
//GeoServer的连接配置
String url = "http://172.21.15.67:8081/geoserver" ;
String username = "admin" ;
String passwd = "geoserver" ;
GeoserverPublishPostGISData(url, username, passwd);
}
//发布postgis中的数据
public static void GeoserverPublishPostGISData(String url,String username,String passwd) throws IOException {
//postgis连接配置
String postgisHost = "172.21.15.67" ;
int postgisPort = 5432 ;//端口号
String postgisUser = "postgres" ;//用户名
String postgisPassword = "root" ;//用户密码
String postgisDatabase = "bj_bus" ;//数据库名称
String ws = "bj_bus" ; //待创建和发布图层的工作区名称workspace
String store_name = "bus" ; //待创建和发布图层的数据存储名称store
String table_name = "beijingbusstop" ; // 数据库要发布的表名称,后面图层名称和表名保持一致
//判断工作区(workspace)是否存在,不存在则创建
URL u = new URL(url);
GeoServerRESTManager manager = new GeoServerRESTManager(u, username, passwd);
GeoServerRESTPublisher publisher = manager.getPublisher() ;
List<String> workspaces = manager.getReader().getWorkspaceNames();
if(!workspaces.contains(ws)){
boolean createws = publisher.createWorkspace(ws);
System.out.println("create ws : " + createws);
}else {
System.out.println("workspace已经存在了,ws :" + ws);
}
//判断数据存储(datastore)是否已经存在,不存在则创建
RESTDataStore restStore = manager.getReader().getDatastore(ws, store_name);
if(restStore == null){
GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(store_name);
store.setHost(postgisHost);//设置url
store.setPort(postgisPort);//设置端口
store.setUser(postgisUser);// 数据库的用户名
store.setPassword(postgisPassword);// 数据库的密码
store.setDatabase(postgisDatabase);// 那个数据库;
store.setSchema("public"); //当前先默认使用public这个schema
store.setConnectionTimeout(20);// 超时设置
//store.setName(schema);
store.setMaxConnections(20); // 最大连接数
store.setMinConnections(1); // 最小连接数
store.setExposePrimaryKeys(true);
boolean createStore = manager.getStoreManager().create(ws, store);
System.out.println("create store : " + createStore);
} else {
System.out.println("数据存储已经存在了,store:" + store_name);
}
//判断图层是否已经存在,不存在则创建并发布
RESTLayer layer = manager.getReader().getLayer(ws, table_name);
if(layer == null){
GSFeatureTypeEncoder pds = new GSFeatureTypeEncoder();
pds.setTitle(table_name);
pds.setName(table_name);
pds.setNativeCRS("EPSG:4326");
pds.setSRS("EPSG:3857");
pds.setProjectionPolicy(GSResourceEncoder.ProjectionPolicy.REPROJECT_TO_DECLARED);
GSLayerEncoder layerEncoder = new GSLayerEncoder();
boolean publish = manager.getPublisher().publishDBLayer(ws, store_name, pds, layerEncoder);
System.out.println("publish : " + publish);
}else {
System.out.println("表已经发布过了,table:" + table_name);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>geosolutions</artifactId>
<version>1.0-SNAPSHOT</version>
<profiles>
<profile>
<id>development</id>
<activation>
<jdk>15</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<maven.compiler.compilerVersion>15</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<repositories>
<repository>
<id>GeoSolutions</id>
<url>http://maven.geo-solutions.it/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>it.geosolutions</groupId>
<artifactId>geoserver-manager</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
GeoServer暴露主键
geoserver默认不暴露主键,所以找不到ID值,需要自己主动显示暴露主键
到数据存储=>自己的数据层=>Expose primary keys选择
Geowebcache
放在tomcat目录下进行运行了
而且要解决跨域问题,下面这篇文章方法二能解决,记得要放在tomcat下的geowebcache/web-inf/lib。
Openlayers使用手册
安装OpenLayers
nodejs安装方法(官方推荐)
参照https://openlayers.org/en/latest/doc/tutorials/bundle.html
-
首先先安装nodejs,然后创建一个文件夹,然后输入下面的命令
npm init -y -
然后安装打包工具Parcel
npm install --save-dev parcel-bundler -
安装ol软件包
npm install ol -
在项目下编写index.js
import 'ol/ol.css'; import {Map, View} from 'ol'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; const map = new Map({ target: 'map', layers: [ new TileLayer({ source: new OSM() }) ], view: new View({ center: [0, 0], zoom: 0 }) }); -
编写index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Using Parcel with OpenLayers</title> <style> #map { width: 400px; height: 250px; } </style> </head> <body> <div id="map"></div> <script src="./index.js"></script> </body> </html> -
在项目下的package.json引入两个附加命令
"start","build"{ "name": "test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "parcel index.html", "build": "parcel build --public-url . index.html" }, "author": "", "license": "ISC" } -
输入npm start启动程序,在浏览器中打开网址
-
之后打包生成项目包,在dist文件目录下
npm run build
传统开发库(书上使用这种)
去官网下载.zip,然后使用ol.js和ol.css两个文件包
文档位置网址:
目前成功的代码:
PostGreSQL使用手册
局域网的连接
在安装目录的/data文件夹下,打开pg_hba.conf文件,定位到如下文本。
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
在下面添加一条相同的语句:
host all all 0.0.0.0/0 scram-sha-256
然后保存。
接下来修改防火墙:
打开windows defender防火墙,找到“高级设置”打开。
在“入站规则”中新建一条规则,规则类型选择“端口”,特定本地端口端口填写安装时设置的端口号,如默认的“5432”,其他默认即可。先新建一条TCP的规则,再新建一条UDP的规则。
设置好防火墙后,局域网内即可访问postgresql数据库了。
创建空间表
create table beijingtest(id serial primary key,
name text not NULL,
geom geometry(LINESTRING,4326));
建立索引
CREATE INDEX beijingtest_geom_idx
ON beijingtest
USING GIST (geom);
查询SRID
SELECT * FROM geometry_columns;
插入数据
INSERT INTO beijingtest VALUES(8,'pl',ST_geomfromText('Linestring(116 39,115 38)',4326));
语句记录
SELECT * FROM public.beijingtest ORDER BY id DESC LIMIT 100;
select id,name,ST_AsText(geom) from beijingtest ORDER BY id DESC LIMIT 100;
select id,name,ST_AsText(geom) from beijingtest where id=261;
update beijingtest set name='TESTWFS1' where id=261;
truncate table beijingtest;
delete from beijingtest where id=1;
INSERT INTO beijingtest VALUES(1,'TESTWFS',ST_geomfromText('Linestring(115 39,116 40)',4326));
PostGIS学习教程
安装完Postgresql的时候可以选择安装postgis,或者安装完后单独安装
postgis的相关教程可以看这个博主的
加载了PostGIS空间扩展
CREATE EXTENSION postgis;
查看是否安装了
SELECT postgis_full_version();
在数据库中查找SRID
SELECT srtext FROM spatial_ref_sys WHERE srid = 26918;
视图geometry_columns提供了数据库中所有空间数据表的描述信息
SELECT * FROM geometry_columns;
空间函数
ST_AsText可以把geom类型转换成文本
SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Point';
点的空间函数
- ST_X(geometry) —— 返回X坐标
- ST_Y(geometry) —— 返回Y坐标
SELECT ST_X(geom), ST_Y(geom)
线段的空间函数
- ST_Length(geometry) —— 返回线串的长度
- ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回
- ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回
- ST_NPoints(geometry) —— 返回线串的坐标数量
多边形的空间函数
- ST_Area(geometry) —— 返回多边形的面积
- ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)
- ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环
- ST_InteriorRingN(geometry, n) —— 以线串形式返回指定的内部环
- ST_Perimeter(geometry) —— 返回所有环的长度
集合
- MultiPoint —— 点集合
- MultiLineString —— 线串集合
- MultiPolygon —— 多边形集合
- GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合
集合空间函数
- ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量
- ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分
- ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积
- ST_Length(geometry) —— 返回所有线段组成部分的总长度
几何图形的输入和输出
①Well-known text(WKT)
-
ST_GeomFromText(text, srid) —— 返回geometry
-
ST_AsText(geometry) —— 返回text
-
ST_AsEWKT(geometry) —— 返回text
②Well-known binary(WKB)
-
ST_GeomFromWKB(bytea) —— 返回geometry
-
ST_AsBinary(geometry) —— 返回bytea
-
ST_AsEWKB(geometry) —— 返回bytea
③Geographic Mark-up Language(GML)
-
ST_GeomFromGML(text) —— 返回geometry
-
ST_ASGML(geometry) —— 返回text
④Keyhole Mark-up Language(KML)
-
ST_GeomFromKML(text) —— 返回geometry
-
ST_ASKML(geometry) —— 返回text
-
ST_AsGeoJSON(geometry) —— 返回text
⑥Scalable Vector Graphics(SVG)
-
ST_AsSVG(geometry) —— 返回text
ST_GeomFromText()将文本转换成geometry
下面的语句可以进行类型转换
olddata::newtype
例子:
SELECT 'POINT(0 0)'::geometry;
包含指定SRID的图形转换:
SELECT 'SRID=4326;POINT(0 0)'::geometry;
空间关系
-
**ST_Equals(geometry A, geometry B)**用于测试两个图形的空间相等性
-
ST_Intersects(geometry A, geometry B)边界或内部相交返回True
-
**ST_Disjoint(geometry A, geometry B)**对立的方法,即没有重合的部分,则它们不相交,但not intersect更有效,因为可以使用空间索引
-
**ST_Crosses(geometry A, geometry B)**如果相交生成的几何图形的维度小于两个源几何图形的最大维度,且相交集位于两个源几何图形的内部,则返回真
-
**ST_Overlaps(geometry A, geometry B)**比较两个相同维度的几何图形,如果它们的结果集与两个源几何图形都不同但具有相同维度,则返回TRUE。
-
**ST_Touches()**测试两个几何图形是否在它们的边界上接触,但在它们的内部不相交。
-
如果第一个几何图形完全位于第二个几何图形内,则**ST_Within(geometry A, geometry B)**返回TRUE,ST_Within()测试的结果与ST_Contains()完全相反。
-
如果第二个几何图形完全包含在第一个几何图形内,则**ST_Contains(geometry A, geometry B)**返回TRUE。
-
**ST_Distance(geometry A, geometry B)**计算两个几何图形之间的最短距离,并将其作为浮点数返回。
-
ST_DWithin()测试两个几何图形之间的距离是否在某个范围之内
找到地铁站附近(10米内)的街道
SELECT name FROM nyc_streets WHERE ST_DWithin( geom, ST_GeomFromText('POINT(583571 4506714)',26918), 10 );
空间连接
JOIN…ON
strpos
空间索引
INDEX
USING GIST (geom);
&&纯索引搜索
ANALYZE命令要求PostgreSQL遍历该表并更新用于查询操作而估算的内部统计信息。
VACUUM清理回收表页面中因记录的更新或删除而留下的任何未使用的空间。
两个可以一起用
VACUUM ANALYZE nyc_census_blocks;
投影数据
**ST_Transform(geometry, srid)**函数就可以实现重投影
**ST_SRID(geometry)和ST_SetSRID(geometry,SRID)**查看和设置几何图形的空间参照标识符
定义包含在spatial_ref_sys表中。事实上,有两个定义。”well-known text”(WKT)定义在srtext列中,”proj.4″格式定义在proj4text列。srtext列由GeoServer、uDig和FME等外部程序使用;proj4text列由内部程序使用。
若要查看表的SRID,请查询数据库的geometry_columns视图表:
SELECT f_table_name AS name, srid
FROM geometry_columns;
**ST_Transform(geometry, srid)**转换坐标系
**ST_AsKML()**会变成地理坐标,因为所有的KML都是地理坐标,会进行自动转换s [si]
地理坐标
使用geography而不是geometry类型
SELECT ST_Distance(
ST_GeographyFromText('POINT(-118.4079 33.9434)'), -- Los Angeles (LAX)
ST_GeographyFromText('POINT(2.5559 49.0083)') -- Paris (CDG)
);
返回值单位为米
为了将geometry数据加载到geography表中,首先需要将geometry投影到EPSG:4326(经度-longitude/纬度-latitude),然后再将其转换为geography。
**ST_Transform(geometry, srid)**函数能将坐标转换为地理坐标,**Geography(geometry)**函数能将geometry转换为geography
CREATE TABLE nyc_subway_stations_geog AS
SELECT
Geography(ST_Transform(geom,4326)) AS geog,
name,
routes
FROM nyc_subway_stations;
建立索引的方式也一样,就是空间函数会少一点。
geography包含在表创建时直接指定表类型的功能。
geog GEOGRAPHY(Point)
并且在geography_columns视图中注册
转换成geometry
geog::geometry
**如果你的数据在地理范围上是紧凑的(包含在州、县或市内),请使用基于笛卡尔坐标的*geometry*类型,这样使你的数据有意义。有关可能的参考系统的选择,请参见http://spatialreference.org站点并输入您所在区域的名称。
**如果你需要测量在地理范围上是分散的数据集(覆盖世界大部分地区)的距离,请使用**geography**类型。**通过基于geography类型运行而节省的应用程序复杂性将抵消任何性能问题。同时转换为geometry可以抵消大多数功能限制。
几何图形创建函数
ST_Centroid计算质心
ST_PointOnSurface返回在多边形内的“质心”
**ST_Buffer(geometry, distance)**创建缓冲区,也支持负数的距离,在里面构建内接多边形
CREATE TABLE liberty_island_zone AS
SELECT ST_Buffer(geom,500)::geometry(Polygon,26918) AS geom
FROM nyc_census_blocks
WHERE blkid = '360610001001001';
**ST_Intersection(geometry A, geometry B)**函数返回两个参数共有的空间区域(或直线,或点)
ST_Union(geometry A, geometry B)接受两个几何图形参数并返回合并的并集
有效性
ST_IsValid检测有效性
ST_IsValidReason(geometry)*
OpenJump工具可以修复无效图形
修复有效性
- ST_MakeValid函数,对于清晰但无效的数据来说,这个函数非常适用
- ST_Buffer函数
相等
ST_OrderingEquals精确相等
ST_Equals空间相等
供了等边界运算符 = ,这仅在边界框**(矩形)**上操作,确保几何图形占用相同的二维范围,但不一定占用相同的空间。
线性参考
ST_LineLocatePoint函数接受线串和点,并返回该点沿线串的线性参考比例。
ST_LineInterpolatePoint从线性参考比例得到相应的点。
线性参考可以来实现捕捉功能
维数扩展的9交集模型
ST_Relate有两个参数和三个参数的用法
最近邻域搜索
挺重要的,建议看一下网页
基于索引的KNN查询的语法在查询的ORDER BY子句中放置了一个特殊的”基于索引的距离运算符“,在本例中为”<->”。有两种基于索引的距离运算符:
- <-> —— 表示边界框中心之间的距离
- <#> —— 表示边界框边界之间的距离



怎么和孙哥的一比感觉自己是傻瓜式学习∠( ᐛ 」∠)_
???