2015-06-25 104 views
3

我使用Postgis与GPS数据,并试图找出一个圆形的GPS坐标和半径(米),包含另一个。Postgis - 一个圆圈包含另一个

我可以,如果我不使用GPS坐标来做到这一点,但只是点上的图形,但如果我用纬度和经度点代替这不起作用:

-- A circle within a circle 
SELECT ST_Contains(bigc,smallc) As bigcontainssmall 
FROM (SELECT ST_Buffer(ST_MakePoint(21, 38)::geography, 40) As smallc, 
     ST_Buffer(ST_MakePoint(21, 39)::geography, 400) AS bigc) foo; 

思考?

+0

什么是 “不工作” 是什么意思?你得到一个空的结果或错误?请提供一些真实的GPS数据来显示您的问题。 – Patrick

+1

我在这里没有'ST_Contains(地理,地理)'。您正在使用哪种PostGIS版本?我只有'ST_Contains(几何,几何)'。另外,你确定你不需要'ST_ContainsProperly'或'ST_Within'吗? –

+0

如果您不确定地理与几何的关系,请参阅http://gis.stackexchange.com/q/6681/12379 –

回答

5

我的办法是:

  1. 分配CRS(坐标参考系统)的GPS数据(我假设他们是在WGS84,从而SRID 4326)通过SRID(ST_SetSRID(your_geom, 4326)做到这一点)
  2. 然后(唯一可能的,如果您分配了SRID 4326),将它们转换成地理(::geography做到这一点),以使设置在米缓冲区radiae,
  3. 并将他们回到几何(::geometry做到这一点)为st_contains功能工作

查询:

SELECT ST_Contains(bigc::geometry,smallc::geometry) as bigcontainssmall 
from (select 
st_buffer(ST_SetSRID(ST_MakePoint(-71.10434, 42.31506),4326)::geography,40) as smallc, 
st_buffer(ST_SetSRID(ST_MakePoint(-71.10434, 42.31507),4326)::geography,400) as bigc) foo