需求:求一个点到某个线段所在直线的距离。即,过该点向线段所在直线做垂线,求点到垂足距离。

但postgis自带的ST_Distance()和()都是求点到线段的长度,不能用。找了很久都没找到对应的函数,只好依靠自己数学知识自己写(有知道什么函数可以用的麻烦告诉我一声,谢啦 TAT)

1.找到可以用的数学原理——向量叉乘

叉乘(Cross Product)又称向量积(Vector Product)。

在空间中有两个向量: ,,二者的夹角为。

\vec{a}= (x_{1},y_{1},z_{1}) 从代数角度计算:

\vec{a}\times \vec{b}= (y_{a}z_{b}-z_{a}y_{b},z_{a}x_{b}-x_{a}z_{b},x_{a}y_{b}-y_{a}x_{b})

从几何角度计算:( 为  与  所构成平面的单位向量)

 

\vec{a}\times \vec{b}= |\vec{a}| |\vec{b}|sin\theta \vec{n}

其运算结果是一个向量,并且与这两个向量都垂直,是这两个向量所在平面的法线向量。

叉积的数值(绝对值)就表示以两向量为边长的平行四边形的面积。

 则所求距离为平行四边形的高 

   

h= ||\vec{a}|sin\theta \vec{n}|=|\frac{|\vec{a}\times \vec{b}|}{|\vec{b}|}|=\frac{|x_{a}y_{b}-y_{a}x_{b}|}{\sqrt{{x_{b}}^{2}+{{y_{b}}^{2}}

 

h=\frac{|(x_{1}-x_{p})(y_{2}-y_{1})-(y_{1}-y_{p})(x_{2}-x_{1})|}{\sqrt {({x_{2}-x_{1})^{2}+({y_{2}-y_{1})^{2}}}

2.将大地坐标系转换为对应的投影坐标系

前置:设置geomrtry的坐标系为4326:

UpdateGeometrySRID(varchar table_name, varchar column_name, integer srid);

UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid);

UpdateGeometrySRID(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid);

select UpdateGeometrySRID('schema1', 'table1', 'geom', 4326);

select * from geometry_columns where f_table_schema = 'schema1';

目标地点在(126.11E,46.7N)附近,所以使用'WGS_1984_UTM_Zone_52N'坐标系:

st_asewkt(ST_Transform(geom ,'WGS_1984_UTM_Zone_52N'))

参考:我国常用的投影坐标系_ArcGIS中的坐标系_韦先波的博客-CSDN博客

如何利用PostGIS正确计算距离和面积_阳光__小好的博客-CSDN博客

3.从数据库中取数进行运算

自己算

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: