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

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

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

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

在空间中有两个向量: \large \vec{a}= (x_{a},y_{a},z_{a})\large \vec{b}= (x_{b},y_{b},z_{b}),二者的夹角为\large \theta

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

\large \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}= (y_{a}z_{b}-z_{a}y_{b},z_{a}x_{b}-x_{a}z_{b},x_{a}y_{b}-y_{a}x_{b})

从几何角度计算:( \large \vec{n}为 \large \vec{a} 与 \large \vec{b} 所构成平面的单位向量)

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

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

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

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

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

   \large 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= ||\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}}

 \large 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}}}

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.从数据库中取数进行运算

自己算

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐