实习学习笔记

10月9日 第一天

1. 学习GIS的基本操作

今日工作内容:

postgis,今天主要了解空间数据类型有哪些;空间数据格式有哪些,不同格式之间的转换;空间数据的增删查改;常用基础空间查询函数的使用;常用分析函数的使用。

1.1 创建空间表

1.1 创建一个表
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
population INTEGER,
geom GEOMETRY(Point, 4326)
);

id: 自增主键。 name: 城市名称,非空。 population: 城市人口。 geom: 存储城市的地理位置,类型为 Point,使用 EPSG:4326 坐标系统。

为什么要使用Point类型呢?

这是pg的几何类型

名称存储大小描述表示形式
point16 字节平面上的点(x,y)
line24 字节无限直线{A,B,C}
lseg32 字节有限线段[(x1,y1),(x2,y2)]
box32 字节矩形框(x1,y1),(x2,y2)
path16+16n 字节闭合路径(类似于多边形)((x1,y1),…)
path16+16n 字节开放路径[(x1,y1),…]
polygon40+16n 字节多边形(类似于闭合路径)((x1,y1),…)
circle24 字节<(x,y),r> (中心点和半径)

Point属于什么空间函数

geometry是PostGIS的基本空间数据类型,用于表达点线面等空间要素,具体类型涵盖了OGC的简单对象模型,并扩展实现了 SQL/MM ( ISO/IEC 13249-3 SQL Multimedia - Spatial ) Curver相关类型,定义了包含圆弧曲线的几何子对象类型 CircularString、 CompoundCurve、 CurvePolygon、MultiCurve、 MultiSurface。

以下为各几何对象的类型、构成及有效性限定:

对象分类对象类型描述构成有效性限定
SFA简单对象POINT单点/
MULTIPOINT多点由n个点组成/
LINESTRING线,折线由点串构成/
LINEARRING线环由点串构成首尾闭合,非自相交
MULTILINESTRING点串由n个线串组成/
POLYGON由n个首尾相交的线串组成边缘为线环、内部为洞
MULTIPOLYGON多面由n个面组成非覆盖、非相邻
POLYHEDRALSURFACE多面体表面由n个具有相邻边的Polygon组成具有相邻边
TRIANGLE三角形由3个非共线顶点组成首尾闭合、非共线
TIN不规则三角网由n个三角形组成非覆盖
SQL/MM参数化对象CIRCULARSTRING曲线串用点串描述,三个点确定一段圆弧前一个圆弧的最后一个点与后一个圆弧的第一个点共用;特别地,如果圆弧的第一个点与第三个点重合,则第二个点表示圆心,以此来表达圆形
COMPOUNDCURVE复合线由 n 个部分组成,每个部分可以是LineString 或 CircularString前一部分的最后一个点与后续部分的第一个点重合,保证复合线对象的连续性
CURVEPOLYGON曲面由 n 个部分组成,每个部分是首尾相连的 CircularString 或 LineString 或 CompoundCurve与 Polygon 类似,都表达一个闭合的区域,区别在于是否有CircularString对象参与构造
MULTICURVE多(曲)线由 n 个子对象组成,每个子对象可以是CircularString 或 LineString 或 CompoundCurve/
MULTISURFACE多面由 n 个子对象组成,每个子对象可以是Polygon 或 CurvePolygon 类型与 MultiPolygon类似,都表达多面对象,区别在于是否有CircularString对象参与构造
GEOMETRYCOLLECTION复合对象由n个任意子对象类型构成/
1.2 创建空间索引
CREATE INDEX idx_cities_geom ON cities USING GIST (geom);

CREATE INDEX: 创建索引。 idx_cities_geom: 索引名称。 USING GIST: 使用 GiST 索引方法。 (geom): 针对 geom 字段创建空间索引。

PG的索引类型有哪些呢

  • B-tree
  • Hash
  • GiST
  • GIN
  • BRIN
  1. BTREE索引:

CREATE INDEX默认使用BTREE索引,适合按照顺序存储的数据进行比较查询和范围查询,查询优化器会优先考虑使用BTREE索引,如果涉及到以下任何一种操作:

1)<,<=,=,>,>=

2)以及这些操作的组合,比如between and,也可以使用BTREE。

3)在索引列上的IS NULL 或者IS NOT NULL也可以使用BTREE。

4)BTREE索引也可以用于模糊查询,但是仅限字符串开头是常量的情况下,比如 name LIKE ‘Jason%’,或者name ~ ’^Jason’。但是name LIKE ‘%Jason’是不能用的。

5)Min/Max聚集操作也可使用BTREE索引。

6)其实在merge join以及order by中,可以通过使用BTREE索引的有序性来减少sort带来的代价。

  1. HASH索引

只能处理简单的等值比较,当索引列涉及到等于操作比较时,优化器会考虑使用Hash索引。Hash索引是通过比较hash值来查找定位,如果hash索引列的数据重复度比较高,容易产生严重的hash冲突,从而降低查询效率,因此这种情况下,不适合hash索引。

CREATE INDEX idx_name ON table_name USING HASH (column_name);

  1. GIST索引

不是独立的索引类型,是一种架构或者索引模板,是一棵平衡二叉树。适用于多维数据类型和集合数据类型,和Btree索引类似,同样适用于其他的数据类型。GiST可以用来做位置搜索,如包含、相交、左边、右边等。和Btree索引相比,GiST多字段索引在查询条件中包含索引字段的任何子集都会使用索引扫描,而Btree索引只有查询条件包含第一个索引字段才会使用索引扫描。GiST索引特定操作符类型高度依赖于索引策略(操作符类)。GiST跟Btree索引相比,索引创建耗时较长,占用空间也比较大。

GIST主要用于空间索引

1.3 插入空间数据
INSERT INTO cities (name, population, geom)
VALUES (
'Beijing',
21540000,
ST_GeomFromText('POINT(116.4074 39.9042)', 4326)
);

ST_GeomFromText(‘POINT(116.4074 39.9042)’, 4326): 使用 Well-Known Text (WKT) 创建一个点对象,指定坐标系统为 EPSG:4326。

插入空间数据的ST_GeomFromText是什么意思?

PostgreSQL提供了下面两种转化操作函数,分别是:

  • ST_GeomFromText(wkt,坐标系参数):将wkt格式数据转化成geometry格式,其中第一个参数是wkt类型的数据,第二个是坐标系参数,常用的有4490即CGCS2000大地坐标系、4326地理坐标系等。
  • ST_AsText(geometry):将geometry格式转化成wkt格式

image-20251009105122559

除了以上两个转换函数以外,还有其他一些常用的函数:

  • st_centroid(geometry):获取某个geometry的中心点
  • st_intersects(geometry,geometry):实现两个geometry的相交
  • st_union(geom):实现多个geometry的联合

1.2 常用的空间函数和操作

PostGIS 提供了丰富的空间函数,以下是一些常用的函数及其详细解释和示例。

1.2.1 创建空间几何对象
ST_GeomFromText:从 WKT(Well-Known Text)创建几何对象。

语法:

ST_GeomFromText(text, srid)

示例:

SELECT ST_GeomFromText('POINT(30 10)', 4326);

解释:

创建一个点对象,坐标为 (30, 10),使用 EPSG:4326 坐标系统(4326地理坐标系)。

ST_Point:创建点对象。

语法:ST_Point(x, y)

示例:

SELECT ST_Point(30, 10);
1.2.2 空间关系函数
ST_Contains:判断一个几何对象是否包含另一个几何对象。

语法:ST_Contains(geometry A, geometry B)

SELECT ST_Contains(
ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))', 4326),
ST_GeomFromText('POINT(5 5)', 4326)
);
ST_Within:判断一个几何对象是否在另一个几何对象内部。

语法:ST_Within(geometry A, geometry B)

SELECT ST_Within(
ST_GeomFromText('POINT(5 5)', 4326),
ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);

判断点 (5,5) 是否在指定的多边形内,结果为 true

ST_Intersects:判断两个几何对象是否相交。

语法:ST_Intersects(geometry A, geometry B)

示例:

SELECT ST_Intersects(
ST_GeomFromText('LINESTRING(0 0, 10 10)', 4326),
ST_GeomFromText('LINESTRING(0 10, 10 0)', 4326)
);

判断两条线是否相交,结果为 true(交点为 (5,5))。

1.2.3 空间分析函数
ST_Distance:计算两个几何对象之间的距离。

语法:ST_Distance(geometry A, geometry B)

示例:

SELECT ST_Distance(
ST_GeomFromText('POINT(0 0)', 4326),
ST_GeomFromText('POINT(3 4)', 4326)
);

计算点 (0,0) 和点 (3,4) 之间的距离,结果为 5。

注意:

  • 使用 GEOGRAPHY 类型可以计算地球表面的实际距离(米)。
  • 使用 GEOMETRY 类型计算的是平面上的距离。

示例(使用 GEOGRAPHY):

SELECT ST_Distance(
ST_GeogFromText('SRID=4326;POINT(116.4074 39.9042)'), -- 北京
ST_GeogFromText('SRID=4326;POINT(-0.1278 51.5074)') -- 伦敦
);

计算北京和伦敦之间的地理距离,结果为大约 8135 公里。

ST_Buffer生成几何对象的缓冲区。

语法ST_Buffer(geometry, radius)

示例:

SELECT ST_Buffer(
ST_GeomFromText('POINT(0 0)', 4326),
1000
);

创建以点 (0,0) 为中心,半径为 1000 单位的缓冲区。注意,单位依赖于坐标系统。

注意:

  • 对于 GEOGRAPHY 类型,半径单位为米。
  • 对于 GEOMETRY 类型,半径单位为坐标系的单位(如度)。

示例(使用 GEOGRAPHY):

SELECT ST_Buffer(
ST_GeogFromText('SRID=4326;POINT(116.4074 39.9042)'), -- 北京
10000 -- 10 公里
);
ST_Area:计算多边形的面积。

语法:

ST_Area(geometry)

示例:

SELECT ST_Area(
ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))', 4326)
);

解释:

计算指定多边形的面积,结果单位依赖于坐标系统。

注意:

  • 对于 GEOGRAPHY 类型,面积单位为平方米。
  • 对于 GEOMETRY 类型,面积单位为坐标系的单位的平方(如度的平方)。
1.2.4 空间转换函数
ST_Transform:转换几何对象的空间参考系统

语法:

ST_Transform(geometry, target_srid)
AI运行代码sql1

示例:

SELECT ST_Transform(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326),
3857
);
AI运行代码sql1234

解释:

将点 (116.4074, 39.9042) 从 EPSG:4326 转换到 EPSG:3857 坐标系统。

ST_Simplify:简化几何对象,减少其复杂度。

语法:

ST_Simplify(geometry, tolerance)
AI运行代码sql1

示例:

SELECT ST_Simplify(
ST_GeomFromText('LINESTRING(0 0, 1 1, 2 2, 3 3)', 4326),
1
);

解释:

简化折线,允许的最大偏差为 1 单位。

10月11日第三天

问题1:本地修改了代码怎么推上去

问题2:远程日志问题

问题2:后端部署模块怎么使用