阅读:5093回复:5
[求助]在Postgis中计算两个点之间的距离怎么得到以米为单位表示的结果?Postgis中有一个ST_Distance()的功能,可以很方便的计算两个几何体之间的距离,但是发现一个问题,可能是因为坐标系没有设置好的原因,计算出来的结果都是以度表示的,当然您可以说用ST_Distance_sphere()来得到以米为单位表示的结果,但这个只能计算两个点之间的距离,没法计算任何两个几何体,比如一条线和点之间的距离。 有用过的朋友请不吝赐教! |
|
1楼#
发布于:2008-03-20 15:44
你计算得到的结果是由你的空间数据库中存储的数据的格式决定的,你存储的时候,存储的如果是经纬度或者其他坐标系统下的其他度形式的数据,那么返回的就是度单位的。在默认情况下,postgis中设置的坐标系统索引是2或者128,你需要确定你的数据属于哪个坐标系统。换句话说,ST_DISTANCE函数针对的是数字,单位和你在坐标系统下设置的单位是一样的。 |
|
|
2楼#
发布于:2008-03-24 15:15
楼上说的设置坐标系我还不太清楚如何实现。我的例子按西安坐标系做的: --4610:西安地理坐标系的SRID --创建几个宾馆POI |
|
3楼#
发布于:2008-03-24 15:27
在存储数据时,肯定要存储原始经纬度数据,因此使用了GEOGCS的4610,然后在计算距离时,我把它转换到投影坐标系,但是和它自己内置的函数计算出来的结果有一定误差:
|
|
4楼#
发布于:2008-03-24 15:39
在存储数据时,肯定要存储原始经纬度数据,因此使用了GEOGCS的4610,然后在计算距离时,我把它转换到投影坐标系,但是和它自己内置的函数计算出来的结果有一定误差: select name,st_distance(st_transform(geom,2335),st_transform(PointFromText('POINT(120.11 30.2)',4610),2335)) as d1 ,st_distance_sphere(geom,PointFromText('POINT(120.11 30.2)',4610)) as d2 , name d1 d2 d3 "黄龙饭店"; 8925.57814433592; 8944.01067215277; 18.4325278168526 |
|
5楼#
发布于:2008-04-02 22:34
兄弟 上次正好有事没有回应你,深感抱歉; 我研究了下你的问题 发现我以前的方式并不一定适合所有情况,需要不同的算法。在postgis中,你说的差值是由于采用了不同的投影系统造成的。坐标系统有两种:地理坐标系,投影坐标系,不同的投影坐标系下通过postgis本身的函数计算出来的距离因采用不同的算法而有所差别,这个是很难避免的,只能尽量减少。所以在使用数据之前,最好同时在统一的参照下入库,然后再是使用。这样可以避免差值问题。 |
|
|