WebGIS使用教程

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暴露主键

https://blog.csdn.net/huzhenv5/article/details/103744425

geoserver默认不暴露主键,所以找不到ID值,需要自己主动显示暴露主键

到数据存储=>自己的数据层=>Expose primary keys选择

Geowebcache

放在tomcat目录下进行运行了

而且要解决跨域问题,下面这篇文章方法二能解决,记得要放在tomcat下的geowebcache/web-inf/lib。

https://www.cnblogs.com/giser-s/p/12627482.html

Openlayers使用手册

安装OpenLayers

nodejs安装方法(官方推荐)

参照https://openlayers.org/en/latest/doc/tutorials/bundle.html

  1. 首先先安装nodejs,然后创建一个文件夹,然后输入下面的命令

    npm init -y

  2. 然后安装打包工具Parcel

    npm install --save-dev parcel-bundler

  3. 安装ol软件包

    npm install ol

  4. 在项目下编写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
      })
    });
    
  5. 编写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>
    
  6. 在项目下的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"
    }
    
  7. 输入npm start启动程序,在浏览器中打开网址

    http://localhost:1234/

  8. 之后打包生成项目包,在dist文件目录下

    npm run build

传统开发库(书上使用这种)

去官网下载.zip,然后使用ol.js和ol.css两个文件包

https://openlayers.org/download/

文档位置网址:

https://openlayers.org/en/latest/apidoc/

目前成功的代码:

PostGreSQL使用手册

局域网的连接

https://blog.csdn.net/shouzang/article/details/81262029

在安装目录的/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的相关教程可以看这个博主的

https://blog.csdn.net/qq_35732147/article/details/85256640

加载了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

    GeoJson

  • 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子句中放置了一个特殊的”基于索引的距离运算符“,在本例中为”<->”。有两种基于索引的距离运算符:

  • <-> —— 表示边界框中心之间的距离
  • <#> —— 表示边界框边界之间的距离

评论

  1. Zang
    Macintosh Chrome 100.0.4896.75
    2年前
    2022-4-20 21:46:54

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

    • 博主
      Zang
      Windows Edge 100.0.1185.39
      2年前
      2022-4-21 14:21:54

      ???

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇