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

有什么办法吗?

#1 楼

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

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


对于PostGIS,您可以使用ST_MakeEnvelope(左,下,右,上,srid)以构建一个边界框,然后&&边界框运算符查找边界框相交的位置: SRID 4326适用于WGS84纬度/经度,仅PostGIS 1.5才需要;以后的版本可以省略。

评论


谢谢。 ST_MakeEnvelope函数需要另一个参数srid。我不知道该放在那儿..有什么想法吗?

– uriel
2012年5月21日在22:32

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

– Mike T
2012年5月21日在22:43

如今,大多数工具使您可以在加载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年1月17日在22:03



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

–尼尔森
15年5月25日在20:33

&&运算符在计算上比ST_Intersects慢

– caiohamamura
2015年12月2日,0:02

#2 楼

我认为应该是这样的:
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

评论


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

– uriel
2012年5月21日在22:27



抱歉,我错过了您上周的评论。 srid是坐标参考系统代码。即以色列的2039年。 .geom附加项提取了“ GeometryCollection”的Geometry部分。您可能是对的,因为此处不需要。

– Micha
2012年5月29日5:54



#3 楼

这里有一个与您的问题相似的主题...


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;




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

#4 楼

这是@Micha的代码的注释。

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

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

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


或逆时针方向: br />