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

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

楼主#
更多 发布于:2008-03-19 15:16

Postgis中有一个ST_Distance()的功能,可以很方便的计算两个几何体之间的距离,但是发现一个问题,可能是因为坐标系没有设置好的原因,计算出来的结果都是以度表示的,当然您可以说用ST_Distance_sphere()来得到以米为单位表示的结果,但这个只能计算两个点之间的距离,没法计算任何两个几何体,比如一条线和点之间的距离。

有用过的朋友请不吝赐教!

喜欢0 评分0
默认头像
论坛版主
论坛版主
  • 注册日期2006-05-23
  • 发帖数120
  • QQ
  • 铜币560枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2008-03-20 15:44

你计算得到的结果是由你的空间数据库中存储的数据的格式决定的,你存储的时候,存储的如果是经纬度或者其他坐标系统下的其他度形式的数据,那么返回的就是度单位的。在默认情况下,postgis中设置的坐标系统索引是2或者128,你需要确定你的数据属于哪个坐标系统。换句话说,ST_DISTANCE函数针对的是数字,单位和你在坐标系统下设置的单位是一样的。

只有想不到,没有做不到!
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2008-03-24 15:15

楼上说的设置坐标系我还不太清楚如何实现。我的例子按西安坐标系做的:

--4610:西安地理坐标系的SRID

--创建几个宾馆POI
create table t_poi_hotel(name varchar(20)) WITH (OIDS=TRUE);;
select addGeometryColumn('public','t_poi_hotel','geom',4610,'POINT',2);
insert into t_poi_hotel values('黄龙饭店',PointFromText('POINT(120.11727 30.28019)',4610));
insert into t_poi_hotel values('香格里拉大酒店',PointFromText('POINT(120.12445 30.27925)',4610));
insert into t_poi_hotel values('望湖宾馆',PointFromText('POINT(120.11387 30.27203)',4610));
insert into t_poi_hotel values('如家快捷酒店',PointFromText('POINT(120.11701 30.27184)',4610));
insert into t_poi_hotel values('华侨饭店',PointFromText('POINT(120.12354 30.27051)',4610));

[此贴子已经被作者于2008-3-24 15:20:41编辑过]
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2008-03-24 15:27
在存储数据时,肯定要存储原始经纬度数据,因此使用了GEOGCS的4610,然后在计算距离时,我把它转换到投影坐标系,但是和它自己内置的函数计算出来的结果有一定误差:
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数28
  • QQ
  • 铜币59枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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 ,
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;

name                             d1                          d2                                   d3
------------------------------------------------------------------------------------------------

"黄龙饭店";             8925.57814433592;   8944.01067215277;    18.4325278168526
"香格里拉大酒店";   8903.24787960095;   8920.84106905693;    17.5931894559781
"望湖宾馆";             8001.29947488579;   8017.97819059034;    16.6787157045428
"如家快捷酒店";      8000.07702644348;   8016.56322149293;    16.486195049446
"华侨饭店";             7931.93572304011;   7947.50854791024;     15.5728248701353

[此贴子已经被作者于2008-3-24 15:41:54编辑过]
举报 回复(0) 喜欢(0)     评分
默认头像
论坛版主
论坛版主
  • 注册日期2006-05-23
  • 发帖数120
  • QQ
  • 铜币560枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2008-04-02 22:34

兄弟

上次正好有事没有回应你,深感抱歉;

我研究了下你的问题

发现我以前的方式并不一定适合所有情况,需要不同的算法。在postgis中,你说的差值是由于采用了不同的投影系统造成的。坐标系统有两种:地理坐标系,投影坐标系,不同的投影坐标系下通过postgis本身的函数计算出来的距离因采用不同的算法而有所差别,这个是很难避免的,只能尽量减少。所以在使用数据之前,最好同时在统一的参照下入库,然后再是使用。这样可以避免差值问题。

只有想不到,没有做不到!
举报 回复(0) 喜欢(0)     评分
默认头像

返回顶部