从纬度和经度对计算边界框

use*_*677 1 sql gis postgresql google-maps postgis

谷歌返回当前的纬度和经度,但计算左下纬度和经度以及右上纬度和经度。我一直无法弄清楚它是如何计算的。

有谁知道它是否是静态距离?百分比差异?它是如何计算的?

伊利诺伊州芝加哥

current lat 41.8781136
current lon -87.6297982 
lower left lat  40.3781136
lower left lon  -89.8743648   
upper right lat 43.3781136
upper right lon -85.3852316
Run Code Online (Sandbox Code Playgroud)

纽约

current lat 40.7127753
current lon -74.0059728
lower left lat  39.2127753
lower left lon  -76.26396172
upper right lat 42.2127753
upper right lon -71.74798388
Run Code Online (Sandbox Code Playgroud)

更新:

知道它从中心到左侧和右侧是 103.5 英里,并且知道它从中心到顶部和底部边界是 103.5 英里。

使用当前的经纬度点,如何计算左下角和右上角的点?

我假设 PostGIS 有这个功能?

Jim*_*nes 6

正如数据所表明的,BBOX 是根据左下角和右上角的坐标计算的。您可以通过将x和y坐标从现有角复制到缺失角来创建BBOX,即从左下角和右上角到左上角和右下角,例如左上角的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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您使用该函数对该多边形进行逆向工程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)
Run Code Online (Sandbox Code Playgroud)

基于点创建BBOX

围绕一个点创建 BBOX 的一种简单方法是绘制一个缓冲区ST_Buffer并将其用作ST_Envelope函数的参数,例如POINT(-87.6297982 41.8781136)- Chicago, IL。

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您想知道为什么 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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

仅提取左下角和右上角

如果您只对 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)
Run Code Online (Sandbox Code Playgroud)

进一步阅读: