【postgis】函数记录一丢丢-st_simplify、ST_SimplifyPreserveTopology

本文介绍了几何数据简化的方法,包括ST_Simplify和ST_SimplifyPreserveTopology两个函数的使用细节及参数说明。前者用于基本的几何简化,后者则在简化的同时保持拓扑关系不变,避免创建无效几何形状。

抽希函数。

st_simplify(geometry geom, float distanceTolerance);

第一个参数几何字段,第二个是容差,单位是数据拥有的坐标系单位。比如wgs84,单位就是°。

 

 

 

 

http://www.postgis.net/docs/ST_Simplify.html 

http://www.postgis.net/docs/ST_SimplifyPreserveTopology.html

 ST_SimplifyPreserveTopology对线的处理,没有效果图,因为处理后,线变为了多线,所以没法保存。

ERROR:  Geometry type (LineString) does not match column type (MultiLineString),可以用函数ST_Multi对ST_SimplifyPreserveTopology的处理结果(LineString)进行转换,使之成为MultiLineString。

st_simplify还重载了三个参数,第3个参数,如果为true,相当于加了一个规则,删点会比false少一些,解释看官方文档。

 

来自官方文档:

geometry ST_Simplify(geometry geomA, float tolerance, boolean preserveCollapsed);

The "preserve collapsed" flag will retain objects that would otherwise be too small given the tolerance. For example, a 1m long line simplified with a 10m tolerance. If the preserve flag is given, the line will not disappear. This flag is useful for rendering engines, to avoid having large numbers of very small objects disappear from a map leaving surprising gaps.

 

geometry ST_SimplifyPreserveTopology(geometry geomA, float tolerance);

Returns a "simplified" version of the given geometry using the Douglas-Peucker algorithm. Will avoid creating derived geometries (polygons in particular) that are invalid. Will actually do something only with (multi)lines and (multi)polygons but you can safely call it with any kind of geometry. Since simplification occurs on a object-by-object basis you can also feed a GeometryCollection to this function.

Performed by the GEOS module.

<think>好的,我现在需要给用户介绍PostGIS中的ST_MinDistance函数。首先,我得回忆下这个函数的作用和用法,确保自己理解正确。 ST_MinDistance,顾名思义,应该是计算两个几何对象之间的最小距离。但具体细节可能需要注意。比如,是否支持不同的几何类型?点、线、面之间的计算是否有差异?还有,这个函数如何处理不同坐标系或者投影? 接下来,我得确认函数的语法。记得PostGIS函数通常参数是两个几何对象,比如ST_MinDistance(geom1, geom2)。那返回的是最小距离的数值,单位应该和几何对象的空间参考致。 然后,需要考虑边界情况。比如,如果两个几何对象有相交的部分,这时候最小距离是否为0?因为如果几何相交,那它们至少有个公共点,所以距离应该是0。这点需要验证,但根据函数的名字,应该会正确返回0。 另外,可能用户会想知道这个函数ST_Distance的区别。ST_Distance通常返回两个几何之间的最小距离,但可能在某些情况下,比如几何集合,处理方式不同?或者ST_MinDistance是否更底层?或者可能两者其实是相同的,但需要确认文档。 还需要注意,这个函数是否在3D几何上有效,或者只处理2D?例如,如果几何包含Z坐标,函数是否会考虑进去?可能大多数情况下是2D计算,除非特别说明。 然后,我应该举几个例子来帮助用户理解。例如,两个点之间的最小距离就是它们的直线距离;点和线之间是点到线的最短距离;两个多边形之间则是边界之间的最近距离。但如果多边形重叠,结果就是0。 可能还需要提到性能问题。比如,对于大型数据集,使用ST_MinDistance可能效率不高,这时候可能需要空间索引来优化。但用户的问题可能暂时不涉及性能,所以可能放在后面或者简要提及。 另外,函数的错误处理。如果传入的几何对象无效,或者为空,函数会返回什么?可能抛出错误或者返回NULL?需要确认文档中的说明,但假设函数会返回NULL或者报错,提醒用户确保几何有效性。 还有坐标系的问题,如果两个几何对象的空间参考不同,是否会自动转换?或者需要先转换为同坐标系?这可能会影响结果,所以需要提醒用户注意坐标系的致性。 总结下,回答的结构应该包括函数的作用、语法、支持的几何类型、返回值、示例以及注意事项。需要确保信息准确,结构清晰,帮助用户逐步理解。</think>PostGIS 的 **ST_MinDistance** 函数用于计算两个几何对象之间的最小距离,其逻辑与实现细节如下: --- ### 1. **函数定义** - **语法**:`ST_MinDistance(geometry geomA, geometry geomB)` - **返回值**:浮点数,表示两个几何之间的最小欧氏距离(单位与空间参考系统致)。 - **支持类型**:点、线、面、多点、多线、多面等几何类型。 --- ### 2. **核心逻辑** #### (1)基本规则 - **非空检查**:若任几何为空(`NULL` 或 `EMPTY`),返回 `NULL`。 - **相交判断**:若两几何相交(存在公共点),最小距离为 `0`。 - **计算方式**: - **点与点**:直接计算两点坐标的欧氏距离。 - **点与线**:计算点到线段的最短垂直距离(若垂足在线段内)或两端点的最近距离。 - **线与线**:遍历所有线段对,计算最短距离。 - **面与其他几何**:仅计算边界之间的最小距离(内部重叠时返回 `0`)。 #### (2)优化策略 - **索引加速**:若存在空间索引(如GiST),函数会自动过滤远距离几何,减少计算量。 - **几何分解**:对复杂几何(如多边形、集合),递归分解为子几何(如边、点)逐对计算。 --- ### 3. **示例说明** #### 示例1:点与点的距离 ```sql SELECT ST_MinDistance( ST_GeomFromText('POINT(0 0)'), ST_GeomFromText('POINT(3 4)') ); -- 返回 5.0(勾股定理计算) ``` #### 示例2:点与线的最短距离 ```sql SELECT ST_MinDistance( ST_GeomFromText('POINT(2 2)'), ST_GeomFromText('LINESTRING(0 0, 4 0)') ); -- 返回 2.0(垂线距离) ``` #### 示例3:面与面相交 ```sql SELECT ST_MinDistance( ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), ST_GeomFromText('POLYGON((3 3, 3 8, 8 8, 8 3, 3 3))') ); -- 返回 0.0(面边界相交) ``` --- ### 4. **注意事项** - **坐标系致性**:确保两几何使用相同的空间参考(SRID),否则需先转换。 - **性能影响**:对大规模数据,建议结合空间索引(如 `&&` 运算符)缩小计算范围。 - **3D几何**:仅计算X/Y平面距离,忽略Z坐标(需使用扩展函数处理三维场景)。 --- ### 5. **与 ST_Distance 的区别** - **ST_MinDistance**:底层优化算法,直接返回最小距离。 - **ST_Distance**:可能调用 `ST_MinDistance`,但更通用(支持更多参数,如测地线距离)。 通过上述逻辑,**ST_MinDistance** 可高效处理各类几何对象的最小距离计算,适用于空间分析、邻近查询等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值