选择边界框内的所有点


11

我以前曾问过这个问题,但我尝试的答案却无效。

我想查询边界框内的所有OSM方式。OSM数据是使用默认的球形墨卡托导入的。我正在使用LAT / LON查询,因此转换

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

运行此命令时,出现以下错误:

错误:WHERE的参数必须为布尔型,而不是几何第3行:WHERE ST_Transform(ST_MakeEnvelope(37.808264,37.804339,-12 ...


1
提供指向您已阅读并用于构建查询的旧问题的链接。
user30184

您在ST_MakeEnvelope()中的坐标顺序看起来不像是这种格式,即xmin,ymin,xmax,ymax
Artwork21'1

@ artwork21我在ST_MakeEnvelope中使用纬度/经度。错了吗 我需要将其转换为其他格式吗?我认为这就是ST_Transform所做的
theartofbeing

1
抱歉,我不得不再次阅读包括架构文档在内的高级手册wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways。Planet_osm_ways不包含几何形状,对最终用户而言毫无用处。它用于系统。没有机会从该表进行边界框查询。使用诸如planet_osm_roads之类的表,这是可能的。planet_osm_roads.geom仍然不存在,因为从模式中可以看到,它被命名为planet_osm_roads.way。
user30184

1
否。我说过您不能从planet_osm_ways进行边界框查询,因为该表没有任何几何形状。请参阅:ID,节点,标签,待定-它们都不包含几何。表_line,_point,_polygon和_roads都可以。我试图强调所有几何表中的几何列都被命名为“ way”,而不是“ geom”或其他名称。
user30184

Answers:


14

您的语句有三个问题,尽管错误消息仅暗示了其中的一部分...“ WHERE必须为boolean类型”意味着您提供给WHERE的信息不会评估为布尔结果。

  1. ST_MakeEnvelope按以下顺序询问其参数:xmin, ymin, xmax, ymax, srid

    您错误地传入ymax, ymin, xmax, xmin, srid

  2. 必须在哪里评估为布尔值:

    要确定几何图形和包络线是否有任何共同元素,应按以下方式构造WHERE:WHERE geom && envelope_geom否则,可以使用ST_Contains

    要确定几何图形是否包含在包络中:`WHERE ST_Contains(envelope_geom,geom)

    您没有提供任何比较方法WHERE

  3. 表“ planet_osm_ways”不包含任何几何列,尽管“ planet_osm_roads”确实包含名为“ way”的几何列。

    您可以从相关的planet_osm_nodes.lat和planet_osm_nodes.lon表'planet_osm_ways'中创建一个几何列。

使用“ planet_osm_roads”,它显示了如何对带有几何列的表使用边界框:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

或将其更改为此:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.