【问题标题】:Postgis - one circles contains anotherPostgis - 一个圈子包含另一个圈子
【发布时间】:2015-06-25 02:47:30
【问题描述】:

我正在使用带有 gps 数据的 postgis,并试图确定一个具有 GPS 坐标和半径(以米为单位)的圆是否包含另一个圆。

如果我不使用 GPS 坐标,我可以做到这一点,而只是使用图表上的点,但如果我用 lat 和 lon 点代替,这将不起作用:

-- 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;

想法?

【问题讨论】:

  • “不起作用”是什么意思?你得到一个空的结果还是一个错误?请提供一些真实的 GPS 数据来说明您的问题。
  • 我这里没有ST_Contains(geography, geography)。您正在使用哪个 PostGIS 版本?我只有ST_Contains(geometry, geometry)。另外,您确定不要ST_ContainsProperlyST_Within
  • 如果您不确定地理与几何,请参阅gis.stackexchange.com/q/6681/12379

标签: postgresql postgis coordinate-systems


【解决方案1】:

我的方法是:

  1. 通过 SRID 将 CRS(坐标参考系统)分配给 gps 数据(我假设它们在 WGS84 中,因此是 srid 4326)(ST_SetSRID(your_geom, 4326) 这样做)
  2. 然后(仅当您分配了 srid 4326 时才可能)将它们投射到地理(::geography 执行此操作)以启用以米为单位设置缓冲区半径,
  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

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多