阅读:5065回复:5
[求助]在Postgis中计算两个点之间的距离怎么得到以米为单位表示的结果?
<P>Postgis中有一个ST_Distance()的功能,可以很方便的计算两个几何体之间的距离,但是发现一个问题,可能是因为坐标系没有设置好的原因,计算出来的结果都是以度表示的,当然您可以说用ST_Distance_sphere()来得到以米为单位表示的结果,但这个只能计算两个点之间的距离,没法计算任何两个几何体,比如一条线和点之间的距离。</P>
<P>有用过的朋友请不吝赐教!</P> |
|
1楼#
发布于:2008-03-20 15:44
<P>你计算得到的结果是由你的空间数据库中存储的数据的格式决定的,你存储的时候,存储的如果是经纬度或者其他坐标系统下的其他度形式的数据,那么返回的就是度单位的。在默认情况下,postgis中设置的坐标系统索引是2或者128,你需要确定你的数据属于哪个坐标系统。换句话说,ST_DISTANCE函数针对的是数字,单位和你在坐标系统下设置的单位是一样的。 </P>
|
|
|
2楼#
发布于:2008-03-24 15:15
<P>楼上说的设置坐标系我还不太清楚如何实现。我的例子按西安坐标系做的:</P>
<P>--4610:西安地理坐标系的SRID</P> <P>--创建几个宾馆POI<br>create table t_poi_hotel(name varchar(20)) WITH (OIDS=TRUE);;<br>select addGeometryColumn('public','t_poi_hotel','geom',4610,'POINT',2);<br>insert into t_poi_hotel values('黄龙饭店',PointFromText('POINT(120.11727 30.28019)',4610));<br>insert into t_poi_hotel values('香格里拉大酒店',PointFromText('POINT(120.12445 30.27925)',4610));<br>insert into t_poi_hotel values('望湖宾馆',PointFromText('POINT(120.11387 30.27203)',4610));<br>insert into t_poi_hotel values('如家快捷酒店',PointFromText('POINT(120.11701 30.27184)',4610));<br>insert into t_poi_hotel values('华侨饭店',PointFromText('POINT(120.12354 30.27051)',4610));</P> [此贴子已经被作者于2008-3-24 15:20:41编辑过]
|
|
3楼#
发布于:2008-03-24 15:27
在存储数据时,肯定要存储原始经纬度数据,因此使用了GEOGCS的4610,然后在计算距离时,我把它转换到投影坐标系,但是和它自己内置的函数计算出来的结果有一定误差:
|
|
4楼#
发布于:2008-03-24 15:39
<P>在存储数据时,肯定要存储原始经纬度数据,因此使用了GEOGCS的4610,然后在计算距离时,我把它转换到投影坐标系,但是和它自己内置的函数计算出来的结果有一定误差:</P>
<P>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 , <br>st_distance_sphere(geom,PointFromText('POINT(120.11 30.2)',4610))-st_distance(st_transform(geom,2335),st_transform(PointFromText('POINT(120.11 30.2)',4610),2335)) as d3 from t_poi_hotel;</P> <P>name d1 d2 d3<br>------------------------------------------------------------------------------------------------</P> <P>"黄龙饭店"; 8925.57814433592; 8944.01067215277; <FONT color=#f70909>18.4325278168526</FONT><br>"香格里拉大酒店"; 8903.24787960095; 8920.84106905693; <FONT color=#f70909>17.5931894559781</FONT><br>"望湖宾馆"; 8001.29947488579; 8017.97819059034; <FONT color=#ff0000>16.6787157045428</FONT><br>"如家快捷酒店"; 8000.07702644348; 8016.56322149293; <FONT color=#ff0000>16.486195049446</FONT><br>"华侨饭店"; 7931.93572304011; 7947.50854791024; <FONT color=#f70909>15.5728248701353</FONT><br></P> [此贴子已经被作者于2008-3-24 15:41:54编辑过]
|
|
5楼#
发布于:2008-04-02 22:34
<P>兄弟</P>
<P>上次正好有事没有回应你,深感抱歉;</P> <P>我研究了下你的问题</P> <P>发现我以前的方式并不一定适合所有情况,需要不同的算法。在postgis中,你说的差值是由于采用了不同的投影系统造成的。坐标系统有两种:地理坐标系,投影坐标系,不同的投影坐标系下通过postgis本身的函数计算出来的距离因采用不同的算法而有所差别,这个是很难避免的,只能尽量减少。所以在使用数据之前,最好同时在统一的参照下入库,然后再是使用。这样可以避免差值问题。</P> |
|
|