Sql 为什么PostGIS将所有点堆叠在一起?(使用ST_DWithin查找1000米半径范围内的所有结果)

Sql 为什么PostGIS将所有点堆叠在一起?(使用ST_DWithin查找1000米半径范围内的所有结果),sql,postgresql,postgis,Sql,Postgresql,Postgis,PostGIS/PostgreSQL新手…如有任何帮助,将不胜感激 我在postgres db中有两个表,别名为gas和ev。我试图选择一个特定的加油站(gas.site_id=11949),并将所有电动汽车/替代燃料充电站定位在1000米半径范围内。但是,当我运行下面的程序时,PostGIS会返回许多电动汽车站点,这些站点在地图中相互堆叠(参见屏幕截图) 有人知道为什么会这样吗?如何让PostGIS可视化指定加油站1000米半径范围内的点 with myplace as ( SELECT

PostGIS/PostgreSQL新手…如有任何帮助,将不胜感激

我在postgres db中有两个表,别名为gas和ev。我试图选择一个特定的加油站(gas.site_id=11949),并将所有电动汽车/替代燃料充电站定位在1000米半径范围内。但是,当我运行下面的程序时,PostGIS会返回许多电动汽车站点,这些站点在地图中相互堆叠(参见屏幕截图)

有人知道为什么会这样吗?如何让PostGIS可视化指定加油站1000米半径范围内的点

with myplace as (
  SELECT gas.geom 
  from nj_gas gas 
  where gas.site_id = 11949 limit 1)
select myplace.*, ev.* 
from alt_fuel ev, myplace 
where ST_DWithin(ev.geom1, myplace.geom, 1000)

该函数不使用
几何体
类型化参数计算距离(以米为单位)

从文件中:

对于几何图形:距离以定义的单位指定 几何图形的空间参考系。对于此函数,请执行以下操作: 从某种意义上说,源几何图形必须具有相同的坐标 投影,具有相同的SRID

因此,如果要以米为单位计算距离,则必须使用数据类型
geography

对于地理位置,单位为米,测量默认为 使用_spheroid=true,为了更快地检查,请使用_spheroid=false进行测量 沿着球体

总而言之,您必须转换几何图形的数据类型。此外,您的查询看起来还不错—考虑到您的数据是正确的:-)

样本数据:

CREATE TABLE t1 (id INT, geom GEOGRAPHY);
INSERT INTO t1 VALUES (1,'POINT(-4.47 54.22)');

CREATE TABLE t2 (geom GEOGRAPHY);
INSERT INTO t2 VALUES ('POINT(-4.48 54.22)'),('POINT(-4.41 54.18)');
质疑

WITH j AS (
  SELECT geom FROM t1 WHERE id = 1 LIMIT 1)
SELECT ST_AsText(t2.geom) 
FROM j,t2 WHERE ST_DWithin(t2.geom, j.geom, 1000);

     st_astext      
--------------------
 POINT(-4.48 54.22)
(1 Zeile)

当选择
myplace.*
ev.*
时,您正在交叉连接这些表,并让PostgreSQL返回这两个表的笛卡尔乘积

因此,
myplace
中只有一行,
geom
将与
alt_fuel
的每一行合并(即,结果集将在两个表的每一个可能组合中都有两个表的所有列);由于结果集因此有两个几何列,因此您的客户端应用程序可能会选择第一个或一个名为
geom
(与
alt\u fuel.geom1
)的列来显示

我看不出您对结果集中的
myplace.geom
感兴趣,所以我建议运行

WITH
  myplace as (
    SELECT gas.geom 
    FROM   nj_gas gas 
    WHERE  gas.site_id = 11949
    LIMIT  1
  )

SELECT ev.* 
FROM   alt_fuel AS ev
JOIN   myplace AS mp
  ON   ST_DWithin(ev.geom1, mp.geom, 1000)  -- ST_DWithin(ev.geom1::GEOGRAPHY, mp.geom::GEOGRAPHY, 1000)
;
如果出于某种原因,您还希望显示
myplace.geom
以及站点,则必须使用
myplace
上的
SELECT*
将上述内容与
;请注意,您还必须提供与
alt_fuel.*
相同的列列表和结构(相同的数据类型!)(或者更好的是,在
中选择
联合[ALL]
)的另一侧


注意有关单位的信息;如果你的数据不是投影在一个基于米的CRS(而是在地理参考系统中,‘LunLaT’),使用CAST到<代码>地理< /代码>有<代码> STydIn < /C> >把输入当作米(用球代数代替平面(欧几里得))! 使用以下方法解决:

WITH
  myplace as (
    SELECT geom as g
    FROM   nj_gas  
    WHERE  site_id = 11949 OR site_id = 11099 OR site_id = 11679 or site_id = 480522
  ), myresults AS (
SELECT ev.* 
FROM   alt_fuel AS ev
JOIN   myplace AS mp
  ON   ST_DWithin(ev.geom, mp.g, 0.1))
select * from myresults```

Thanks so much for your help @ThingumaBob and @JimJones ! Greatly appreciate it.

有没有可能它可视化了
myplace.geom
几何图形而不是
ev.geom1
?它确实可视化了myplace,但是有没有一种方法可以同时可视化“myplace”和附近的电动汽车站?谢谢你的帮助!:)施法有助于限制返回结果的数量,这在概念上是有意义的——但由于某种原因,PostGIS中显示的点仍然像施法前的屏幕截图中那样相互堆叠。你知道为什么会发生这种情况吗?你能分享一些数据,这样我们就可以测试你的查询了吗?我使用的数据集是来自以下方面的CSV:1)和2)如果有帮助的话?对不起,我不能完全确定你的要求——如果我能更具体一点,请告诉我@JimJones@amb我只是在我的答案中添加了一个随机的例子。要么你的数据有错误,要么你的可视化工具在捉弄你——PostGIS不是问题:)新年快乐学究注:
ST_DWithin
根据基础CRS的单位计算接近度;如果数据被投影在合适的基于仪表的CRS中,输入和输出也是基于米的。考虑检查姐妹板关于空间数据的问题和使用它的软件!关于投影单位,你是对的。这确实是可能的-尽管我从未见过这种情况发生:-D谢谢你的留言+1谢谢你的回复!pgadmin中返回的结果在我运行该查询时显示正确的结果,但是我的可视化工具没有将“join”识别为命令,因此我仍然无法显示结果。有没有其他方法可以在没有join语句的情况下显示ev站点@ThingumaBob@amb使用交叉连接符号和过滤器,即只需从问题中运行您自己的查询,而无需选择
myplace.*
JOIN
s是RDB的基础,您使用的软件有什么问题?如果删除myplace,我会得到一个错误,上面写着“查询中找不到几何体列”*
WITH
  myplace as (
    SELECT geom as g
    FROM   nj_gas  
    WHERE  site_id = 11949 OR site_id = 11099 OR site_id = 11679 or site_id = 480522
  ), myresults AS (
SELECT ev.* 
FROM   alt_fuel AS ev
JOIN   myplace AS mp
  ON   ST_DWithin(ev.geom, mp.g, 0.1))
select * from myresults```

Thanks so much for your help @ThingumaBob and @JimJones ! Greatly appreciate it.