使用postGIS选择边界框?


36

我想创建一个查询,以选择所有使用postGIS的方法及其在边界框中存在的节点。边界框应包括渗透的所有详细信息,“-bounding-box”命令将检索该细节。

有什么办法吗?

Answers:


36

对于渗透文档,我看到命令选项

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

对于PostGIS,您可以使用ST_MakeEnvelope(left,bottom,right,top,srid)来构建一个边界框,然后使用&&边界框运算符来查找边界框相交的位置:

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

SRID 4326适用于WGS84纬度/经度,仅PostGIS 1.5才需要;以后的版本可以省略。


谢谢。ST_MakeEnvelope函数需要另一个参数srid。我不知道该放在哪里。
uriel 2012年

1
看起来您正在使用需要该参数的PostGIS 1.5。我认为SRID被忽略,因此任何值都可能产生相同的结果。如果您有经/纬度数据,则通常应使用SRID为4326。–
Mike T

1
如今,大多数工具使您可以在加载OSM数据时为其选择SRID。默认的OSM SRID是3857(球形墨卡托)。大多数纬度/经度数据的默认SRID是SRID 4326(纬度/经度AKA WGS84)。例如,如果使用SRID 3857加载数据,则必须执行从LAT / LON WGS84到3857的转换:ST_Transform(ST_MakeEnvelope(LON1,LAT1,LON2,LAT2,4326),3857)一些工具(例如imposm3)当前仅支持SRID 3857
Justin Swanhart 2014年

请注意,&&运算符不会为您转换SRID。确保您制作的信封与测试几何图形具有相同的SRID,否则请自行对其进行转换。trac.osgeo.org/postgis/ticket/2320
尼尔森

1
&&运算符的计算速度比ST_Intersects慢
caiohamamura 2015年

8

我认为应该是这样的:PostGIS中的边界框是由

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

该查询将对子查询使用ST_Intersection。

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

我或多或少从PostGIS帮助页面中获取了此信息。在Ways
表中,与上面类似(但使用ST_Dimension()= 1)设计的第二个查询应该获得该方法。

HTH,Micha


你好谢谢!怎么了?我需要在<srid>中插入什么?和“ .geom”(第4行)似乎无效,应该存在吗?
uriel 2012年

抱歉,我错过了您上周的评论。srid是坐标参考系统代码。即以色列的2039年。该.geom除了提取“的GeometryCollection的几何部分,您可能是正确的,它不是在这里需要。
米莎

5

有一个话题在这里它类似于您的问题在这里 ...

ST_Intersection —(T)返回表示geomA和geomB共享部分的几何。地理实现将转换为几何以进行交点,然后转换回WGS84。

1.您还可以在此处获得有关几何构造函数的一些信息。

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

路口

2. 此处有关交集相交的其他信息:PostGIS-ST_Intersects,ST_Intersection ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

路口

我希望它可以帮助您...


0

这是@Micha的代码的注释。

的坐标对应POLYGON遵循顺时针(或逆时针)顺序:再次左上,右上,右下,左下,左上。

因此,顺时针方向,函数调用应为:

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

或逆时针方向:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
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.