gis空间关系类型有哪些

gis空间关系类型有哪些9 ST Area ST Area 返回表面的面积 如果它是一个多边形或多多边形 对于几何学 2D 笛卡尔面积是由 SRID 指定的单位确定的 在地理上 面积是以平方米为单位在曲面上确定的 9 1 概要 float ST Area geometry g1 float ST Area geography geog

9. ST_Area

ST_Area -返回表面的面积,如果它是一个多边形或多多边形。 对于几何学,2D笛卡尔面积是由SRID指定的单位确定的。 在地理上,面积是以平方米为单位在曲面上确定的。

9.1. 概要

float ST_Area(geometry g1); float ST_Area(geography geog, boolean use_spheroid=true); 

9.2. 描述

返回几何体的面积(如果它是多边形或多部件多边形)。 返回ST_Surface或ST_MultiSurface值的面积测量值。 对于几何学,二维笛卡尔面积是由SRID指定的单位确定的。 对于地理,默认情况下面积是在一个以平方米为单位的球体上确定的。 要测量更快但不太精确的球体周围,使用ST_Area(geog,false)。

  • 这个方法实现了SQL 1.1的OpenGIS简单功能实现规范。
  • 该方法实现了SQL/MM规范。 Sql-mm 3: 8.1.2, 9.5.3
  • 这个函数支持多面体曲面。
  • SFCGAL后端也提供了这种方法。

9.3. 样例

-- 返回面积的平方英尺为一块马萨诸塞土地,乘以转换得到平方米。 注意这是平方英尺,因为EPSG:2249是马萨诸塞州的飞机英尺  SELECT ST_Area(the_geom) As sqft, ST_Area(the_geom)*POWER(0.3048,2) As sqm FROM (SELECT ST_GeomFromText('POLYGON(( , , ,.625 , ))',2249) ) As foo(the_geom); 

sqft sqm
928.625 86.

-- 返回面积平方英尺,转换为马萨诸塞州平面米(EPSG:26986)以获得平方米。注:这是以平方英尺为单位的,因为2249是马萨诸塞州平面英尺,转换面积是以平方米为单位的,因为EPSG:26986是马萨诸塞州平面米 SELECT ST_Area(the_geom) As sqft, ST_Area(ST_Transform(the_geom,26986)) As sqm FROM (SELECTST_GeomFromText('POLYGON(( , , ,.625 , ))',2249) ) As foo(the_geom); 

sqft sqm
928.625 86.19

-- 使用地理数据类型返回面积平方英尺和平方米。请注意,我们将几何图形转换为地理图形(在此之前,请确保您的几何图形位于WGS 84 long lat 4326中)。地理总是以米为单位。这只是为了比较演示。通常,您的表将存储在地理数据类型中。 SELECT ST_Area(the_geog)/POWER(0.3048,2) As sqft_spheroid, ST_Area(the_geog,false)/POWER (0.3048,2) As sqft_sphere, ST_Area(the_geog) As sqm_spheroid FROM (SELECT geography(ST_Transform(ST_GeomFromText('POLYGON(( , , ,.625 , ))',2249) ,4326))) As foo(the_geog); 

sqft_spheroid sqft_sphere sqm_spheroid
928.5 927.0 86.29

-- 如果您的数据已经在地理中 SELECT ST_Area(the_geog)/POWER(0.3048,2) As sqft, ST_Area(the_geog) As sqm FROM somegeogtable; 

10. ST_Azimuth

ST_Azimuth - 返回基于北的方位角,以弧度为单位,从A点到B点的垂直方向顺时针测量。

10.1. 概要

float ST_Azimuth(geometry pointA, geometry pointB); float ST_Azimuth(geography pointA, geography pointB); 

10.2. 描述

返回由给定的点几何定义的线段的以弧度为单位的方位角,如果两个点重合则返回NULL。 方位角是从北方参考的,顺时针为正:北方= 0; 东=π/ 2; 南=π; 西方= 3π/ 2。
对于地理类型,正方位角作为反测地线问题的一部分来解决。
方位角是一个数学概念,定义为参考平面和点之间的角度,以弧度为角单位。 可以使用PostgreSQL内置函数degrees()将单位转换为度,如示例所示。

10.3. 样例

-- 几何方位角,以度数表示 SELECT degrees(ST_Azimuth(ST_Point(25, 45), ST_Point(75, 100))) AS degA_B,degrees(ST_Azimuth(ST_Point(75, 100), ST_Point(25, 45))) AS degB_A; 

在这里插入图片描述

dega_b degb_a
42.37 222.4

11. ST_Angle

ST_Angle -返回3个点或2个向量(4个点或2条线)之间的角度。

11.1. 概要

float ST_Angle(geometry point1, geometry point2, geometry point3, geometry point4); float ST_Angle(geometry line1, geometry line2); 

11.2. 描述

对于3个点,顺时针计算P1P2P3的测量角度。 如果输入是2条线,将线的第一个点和最后一个点作为4个点。 对于4个点,顺时针计算P1P2,P3P4的测量角度。 结果总是正的,在0到2*弧度之间。 使用成对或点的方位角。

ST_Angle(P1,P2,P3) = ST_Angle(P2,P1,P2,P3)

Result以弧度为单位,可以使用PostgreSQL内置函数degrees()转换为角度,如示例所示。

11.3. 样例

-- Geometry Azimuth in degrees WITH rand AS (SELECT s, random() * 2 * PI() AS rad1, random() * 2 * PI() AS rad2FROM generate_series(1,2,2) AS s) , points AS (SELECT s, rad1,rad2, ST_MakePoint(cos1+s,sin1+s) as p1, ST_MakePoint(s,s) AS p2, ST_MakePoint(cos2+s,sin2+s) as p3 FROM rand,cos(rad1) cos1, sin(rad1) sin1,cos(rad2) cos2, sin(rad2) sin2) SELECT s, ST_AsText(ST_SnapToGrid(ST_MakeLine(ARRAY[p1,p2,p3]),0.001)) AS line, degrees(ST_Angle(p1,p2,p3)) as computed_angle, round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference, round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference FROM points ; 

1 line computed_angle reference
1 LINESTRING(1.511 1.86,1 1,0.896 0.005) 155. 155

12. ST_Centroid

ST_Centroid - 返回几何体的几何中心。

12.1. 概要

geometry ST_Centroid(geometry g1); geography ST_Centroid(geography g1, boolean use_spheroid=true); 

12.2. 描述

计算一个几何图形的几何中心,或等效地,作为点的几何图形的质心。 对于[MULTI]POINTs,这是作为输入坐标的算术平均值计算的。 对于[MULTI]LINESTRINGs,这是作为每个线段的加权长度计算的。 对于[MULTI]多边形,“权重”是根据面积来考虑的。 如果空几何体sup ply,则返回空的GEOMETRYCOLLECTION。 如果提供了NULL,则返回NULL。 如果提供了CIRCULARSTRING或COMPOUNDCURVE,它们会先用CurveToLine转换为linestring,然后与linestring相同。

  • 这个方法实现了SQL 1.1的OpenGIS简单功能实现规范。
  • 该方法实现了SQL/MM规范。 Sql-mm 3: 8.1.4, 9.5.5

12.3. 样例

在下面的每一个插图中,绿点表示源几何的质心。

在这里插入图片描述

SELECT ST_AsText(ST_Centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )')); 

SELECT ST_AsText(ST_centroid(g)) FROM ST_GeomFromText('CIRCULARSTRING(0 2, -1 1,0 0, 0.5 0, 1 0, 2 1, 1 2, 0.5 2, 0 2)') AS g ; 

st_astext
POINT(2.231 3.231)

SELECT ST_AsText(ST_centroid(g)) FROM ST_GeomFromText('CIRCULARSTRING(0 2, -1 1,0 0, 0.5 0, 1 0, 2 1, 1 2, 0.5 2, 0 2)') AS g ; 

st_astext

POINT(0.5 1)

SELECT ST_AsText(ST_centroid(g)) FROM ST_GeomFromText('COMPOUNDCURVE(CIRCULARSTRING(0 2, -1 1,0 0),(0 0, 0.5 0, 1 0), CIRCULARSTRING( 1 0, 2 1, 1 2),(1 2, 0.5 2, 0 2))' ) AS g; 

st_astext

POINT(0.5 1)

13. ST_ClosestPoint

ST_ClosestPoint -返回g1上最接近g2的二维点。 这是最短直线的第一点。

13.1. 概要

geometry ST_ClosestPoint(geometry g1, geometry g2); 

13.2. 描述

返回g1上最接近g2的二维点。 这是最短直线的第一点。

如果你有一个3D几何,你可能更喜欢使用ST_3DClosestPoint。

13.3. 样例

SELECT ST_AsText(ST_ClosestPoint(pt,line) ) AS cp_pt_line,ST_AsText(ST_ClosestPoint(line,pt )) As cp_line_pt FROM (SELECT 'POINT(100 100)'::geometry As pt, 'LINESTRING (20 80, 98 190, 110 180, 50 75 )'::geometry As line) As foo; 

SELECT ST_AsText(ST_ClosestPoint(ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20))) As ptwkt; 

在这里插入图片描述

14. ST_ClusterDBSCAN

ST_ClusterDBSCAN - 开窗函数,返回整数id为每个输入几何的聚类是基于2D实现的基于密度的应用程序空间聚类(DBSCAN)算法。

14.1. 概要

 integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints); 

14.2. 描述

返回每个输入几何图形的聚类数,基于带噪声的应用阳离子(DBSCAN)算法的基于密度的空间聚类的2D实现。 与ST_ClusterKMeans不同,它不需要指定集群的数量,而是使用所需的距离(eps)和密度(minpoints)参数来构建每个集群。

如果一个输入几何图形是以下任一种情况,它将被添加到集群中:

  • 一种“核心”几何图形,至少在最小点输入几何图形的eps距离内(包括它自己)
  • 一种“边界”几何图形,那是在eps距离的核心几何图形。

注意,在多个集群中,边界几何图形可能在核心几何图形的eps距离内; 在这种情况下,任何一种分配都是正确的,并且边界几何将被任意分配到一个可用的集群。 在这些情况下,用少于最小点的几何图形生成正确的集群是可能的。 当边界几何的赋值不明确时,如果在窗口定义中包含ORDER BY子句,重复调用ST_ClusterDBSCAN将产生相同的结果,但集群赋值可能与相同算法的其他实现不同。

不符合加入任何其他集群的条件的输入几何图形将被分配为NULL。

14.3. 样例

给每个多边形分配一个群集号,每个多边形之间的距离不超过50米。 每个集群至少需要2个多边形

SELECT name, ST_ClusterDBSCAN(geom, eps := 50, minpoints := 2) over () AS cid FROM boston_polys WHERE name > '' AND building > '' AND ST_DWithin(geom,ST_Transform(ST_GeomFromText('POINT (-71.04054 42.35141)', 4326), 26986),500); 

name bucket
Manulife Tower 0
Park Lane Seaport I 0
Park Lane Seaport II 0
Renaissance Boston Waterfront Hotel 0
Seaport Boston Hotel 0
Seaport Hotel & World Trade Center 0
Waterside Place 0
World Trade Center East 0
100 Northern Avenue 1
100 Pier 4 1
The Institute of Contemporary Art 1
101 Seaport 2
District Hall 2
One Marina Park Drive 2
Twenty Two Liberty 2
Vertex 2
Vertex 2
Watermark Seaport 2
Blue Hills Bank Pavilion NULL
World Trade Center West NULL

在这里插入图片描述

将具有相同簇号的包裹组合成单个几何形状。 这使用了命名参数调用

 SELECT cid, ST_Collect(geom) AS cluster_geom, array_agg(parcel_id) AS ids_in_cluster FROM (SELECT parcel_id, ST_ClusterDBSCAN(geom, eps := 0.5, minpoints := 5) over () AS cid, geom FROM parcels) sq GROUP BY cid; 

15. ST_ClusterIntersecting

ST_ClusterIntersecting —— 聚合。 返回一个数组,其中包含一组几何图形的连接组件

15.1. 概要

geometry[] ST_ClusterIntersecting(geometry set g); 

15.2. 描述

ST_ClusterIntersecting是一个聚合函数,它返回一个几何集合数组,其中每个几何集合表示一个相互连接的几何集合。

15.3. 样例

WITH testdata AS (SELECT unnest(ARRAY['LINESTRING (0 0, 1 1)'::geometry, 'LINESTRING (5 5, 4 4)'::geometry, 'LINESTRING (6 6, 7 7)'::geometry, 'LINESTRING (0 0, -1 -1)'::geometry, 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry]) AS geom) SELECT ST_AsText(unnest(ST_ClusterIntersecting(geom))) FROM testdata; 

st_astext
GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0)))
GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))

16. ST_ClusterKMeans

ST_ClusterKMeans -开窗函数,为每个输入几何图形所在的集群返回整数id。

16.1. 概要

integer ST_ClusterKMeans(geometry winset geom, integer number_of_clusters); 

16.2. 描述

为每个输入几何图形返回基于k-means簇号的2D距离。 用于聚类的距离是几何图形的质心之间的距离。

16.3. 样例

为示例生成虚拟包集

CREATE TABLE parcels AS SELECT lpad((row_number() over())::text,3,'0') As parcel_id, geom,('{residential, commercial}'::text[])[1 + mod(row_number()OVER(),2)] As type FROM ST_Subdivide(ST_Buffer('LINESTRING(40 100, 98 100, 100 150, 60 90)'::geometry,40, 'endcap=square'),12) As geom; 

在这里插入图片描述

按类型划分包裹集群

SELECT ST_ClusterKMeans(geom,3) over (PARTITION BY type) AS cid, parcel_id, type FROM parcels; 

cid parcel_id type
1 005 commercial
1 003 commercial
2 007 commercial
0 001 commercial
1 004 residential
0 002 residential
2 006 residential
知秋君
上一篇 2024-11-13 21:55
下一篇 2024-07-03 17:36

相关推荐