sinboy
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:4840回复:5

[求助]在Postgis中计算两个点之间的距离怎么得到以米为单位表示的结果?

楼主#
更多 发布于:2008-03-19 15:16
<P>Postgis中有一个ST_Distance()的功能,可以很方便的计算两个几何体之间的距离,但是发现一个问题,可能是因为坐标系没有设置好的原因,计算出来的结果都是以度表示的,当然您可以说用ST_Distance_sphere()来得到以米为单位表示的结果,但这个只能计算两个点之间的距离,没法计算任何两个几何体,比如一条线和点之间的距离。</P>
<P>有用过的朋友请不吝赐教!</P>
喜欢0 评分0
longhaibo1984
论坛版主
论坛版主
  • 注册日期2006-05-23
  • 发帖数120
  • QQ
  • 铜币560枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2008-03-20 15:44
<P>你计算得到的结果是由你的空间数据库中存储的数据的格式决定的,你存储的时候,存储的如果是经纬度或者其他坐标系统下的其他度形式的数据,那么返回的就是度单位的。在默认情况下,postgis中设置的坐标系统索引是2或者128,你需要确定你的数据属于哪个坐标系统。换句话说,ST_DISTANCE函数针对的是数字,单位和你在坐标系统下设置的单位是一样的。 </P>
只有想不到,没有做不到!
举报 回复(0) 喜欢(0)     评分
sinboy
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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编辑过]
举报 回复(0) 喜欢(0)     评分
sinboy
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2008-03-24 15:27
在存储数据时,肯定要存储原始经纬度数据,因此使用了GEOGCS的4610,然后在计算距离时,我把它转换到投影坐标系,但是和它自己内置的函数计算出来的结果有一定误差:
举报 回复(0) 喜欢(0)     评分
sinboy
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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编辑过]
举报 回复(0) 喜欢(0)     评分
longhaibo1984
论坛版主
论坛版主
  • 注册日期2006-05-23
  • 发帖数120
  • QQ
  • 铜币560枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2008-04-02 22:34
<P>兄弟</P>
<P>上次正好有事没有回应你,深感抱歉;</P>
<P>我研究了下你的问题</P>
<P>发现我以前的方式并不一定适合所有情况,需要不同的算法。在postgis中,你说的差值是由于采用了不同的投影系统造成的。坐标系统有两种:地理坐标系,投影坐标系,不同的投影坐标系下通过postgis本身的函数计算出来的距离因采用不同的算法而有所差别,这个是很难避免的,只能尽量减少。所以在使用数据之前,最好同时在统一的参照下入库,然后再是使用。这样可以避免差值问题。</P>
只有想不到,没有做不到!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部