如何获取postGIS中给定gps坐标范围内的所有建筑物名称?

时间:2012-12-02 06:20:50

标签: postgresql range coordinates distance postgis

即时制作全景查看器,连接到postgres数据库,我需要下载给定范围内的建筑物名称,街道名称,兴趣点。 如果你能对这件事情有所了解,我真的很感激。

此致

2 个答案:

答案 0 :(得分:3)

由于您没有给我们一些表规格,因此需要一个人为的例子。

WITH yourpoint AS (
    SELECT
        st_transform(st_setsrid(st_makepoint(yourlon, yourlat), 4326), yourgeomsrid) AS point
)
SELECT 
    building.name
FROM 
    building, yourpoint
WHERE
    ST_Dwithin(building.the_geom, yourpoint.point, 400)

现在,让我们来看看有趣的部分。首先,我们需要一个几何体来适应您在正确坐标系中的给定点。我创建了一个产生这样一个点的子语句(CTE)。不过,也许这一点在您的数据库中。

重要提示:要计算距离,您指定的点和几何必须位于同一坐标系中。因此,我用st_makepoint封装了st_setsrid,它将坐标系信息添加到该点。 GPS通常在WGS84中,其SRID为4326.现在,我们必须将该点转换为点数据的坐标系 - 因此您必须知道SRID。

找到附近建筑物的所有魔法都发生在WHERE条款中。 ST_Dwithin查找距离小于400(以坐标系为单位测量)的所有几何图形。

有关详细信息,请参阅the postgis manual


修改

如果您的坐标位于WGS84中,则应使用地理数据类型:

WITH yourpoint AS (
    SELECT
        geography(st_setsrid(st_makepoint(yourlon, yourlat), 4326)) AS point
)
SELECT 
    building.name
FROM 
    building, yourpoint
WHERE
    ST_Dwithin(Geography(building.the_geom), yourpoint.point, 400)

答案 1 :(得分:2)

尝试

select * FROM 
    LayerName
WHERE
    ST_Dwithin(LayerName.the_geom, 
    GeomFromText('POINT(x,y)',-1)
    , radius)

layerName是你的图层, 来自GPS的x,y, -1是你的srid, radius是缓冲区的半径(double)