1

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

问候,

4

2 回答 2

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_makepointwith st_setsrid,它将坐标系信息添加到该点。GPS 通常位于具有 SRID 4326 的 WGS84 中。现在,我们必须将该点转换为您的点数据的坐标系 - 因此您必须知道 SRID。

找到附近建筑物的所有魔法都发生在该WHERE子句中。ST_Dwithin查找彼此之间距离小于 400(以您的坐标系单位测量)的所有几何图形。

有关详细信息,请参阅postgis 手册


编辑

如果您的坐标在 WGS84 中,则应使用 geography 数据类型:

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)
于 2012-12-02T07:36:07.723 回答
2

尝试

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

layerName 是您的图层,x,y 来自 GPS,-1 是您的 srid,半径是您的缓冲区的半径(双精度)

于 2012-12-02T07:57:18.340 回答