在postgres数据库求点到直线的距离
用数学方法在postgres数据库求点到直线的距离
需求:求一个点到某个线段所在直线的距离。即,过该点向线段所在直线做垂线,求点到垂足距离。
但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.从数据库中取数进行运算
自己算
更多推荐
所有评论(0)