我正在制作一个全景查看器,连接到 postgres 数据库,我需要下载给定范围内的建筑物名称、街道名称、兴趣点。如果你能对这件事有所了解,我真的很感激。
问候,
我正在制作一个全景查看器,连接到 postgres 数据库,我需要下载给定范围内的建筑物名称、街道名称、兴趣点。如果你能对这件事有所了解,我真的很感激。
问候,
由于您没有给我们一些表格规格,因此必须做一个人为的例子。
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
with 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)
尝试
select * FROM
LayerName
WHERE
ST_Dwithin(LayerName.the_geom,
GeomFromText('POINT(x,y)',-1)
, radius)
layerName 是您的图层,x,y 来自 GPS,-1 是您的 srid,半径是您的缓冲区的半径(双精度)