如数据所示,BBOX 是根据左下角和右上角坐标计算的。您可以通过将 x 和 y 坐标从现有角复制到缺失角来创建 BBOX,即从左下角和右上角到左上角和右下角,例如左上角的y值与右上角的y值相同。
使用 PostGIS,您可以将此数据传递给ST_Envelope 函数,它会自动生成一个 BBOX。
芝加哥 BBOX:
SELECT ST_AsText(ST_MakeEnvelope(-89.8743648,40.3781136,-85.3852316,43.3781136,4326));
st_astext
-------------------------------------------------------------------------------------------------------------------------------
POLYGON((-89.8743648 40.3781136,-89.8743648 43.3781136,-85.3852316 43.3781136,-85.3852316 40.3781136,-89.8743648 40.3781136))
(1 Zeile)
如果您使用函数ST_Extent 对这个多边形进行逆向工程,您将获得与生成它时提供的相同坐标对:
SELECT ST_Extent('POLYGON((-89.8743648 40.3781136,-89.8743648 43.3781136,-85.3852316 43.3781136,-85.3852316 40.3781136,-89.8743648 40.3781136))')
st_extent
----------------------------------------------------
BOX(-89.8743648 40.3781136,-85.3852316 43.3781136)
(1 Zeile)
根据点创建 BBOX
围绕一个点创建 BBOX 的一种简单方法是使用 ST_Buffer 绘制一个缓冲区并将其用作 ST_Envelope 函数的参数,例如POINT(-87.6297982 41.8781136) - 伊利诺伊州芝加哥。
SELECT
ST_AsText(
ST_Envelope(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326),1)));
st_astext
-------------------------------------------------------------------------------------------------------------------------------
POLYGON((-88.6297982 40.8781136,-88.6297982 42.8781136,-86.6297982 42.8781136,-86.6297982 40.8781136,-88.6297982 40.8781136))
(1 Zeile)
如果您想知道为什么 BBOX 在所有维度上的大小不同:使用 GEOMETRY 和 GEOGRAPHY 的计算方式不同,结果也不同。 GEOGRAPHY 计算球面上的坐标(可能比GEOMETRY 慢得多)并使用米作为测量单位,而GEOGRAPHY 使用平面投影并使用 SRS 单位。
围绕一个点创建一个 100 英里(160.934 公里)的 BBOX:
SELECT
ST_AsText(
ST_Envelope(
ST_Rotate(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326)::GEOGRAPHY,160934)::GEOMETRY,0)));
st_astext
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((-89.5681600538661 40.4285062983098,-89.5681600538661 43.327349928921,-85.6903925527536 43.327349928921,-85.6903925527536 40.4285062983098,-89.5681600538661 40.4285062983098))
(1 Zeile)
只提取左下角和右上角
如果您只对 BBOX 的左下角和右上角感兴趣,请使用上述 ST_Extent。
SELECT
ST_Extent(
ST_Envelope(
ST_Rotate(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326)::GEOGRAPHY,160934)::GEOMETRY,0)));
st_extent
---------------------------------------------------------------------------
BOX(-89.5681600538661 40.4285062983098,-85.6903925527536 43.327349928921)
(1 Zeile)
延伸阅读: