【问题标题】:Calculating bounding box from latitude and longitude pairs从纬度和经度对计算边界框
【发布时间】:2020-05-04 22:37:16
【问题描述】:

Google 会返回当前的 lat 和 lon,但会计算左下方的 lat 和 lon 以及右上方的 lat 和 lon。我一直无法弄清楚它是如何计算的。

有人知道这是否是静态距离吗?百分比差异?是怎么计算的?

伊利诺伊州芝加哥

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

纽约

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

更新:

知道从中心到左侧和右侧的距离为 103.5 英里,从中心到上下边界的距离为 103.5 英里。

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

我假设 PostGIS 有这个功能?

【问题讨论】:

  • 城市多边形的矩形边界。
  • 当我看着它们时,它们似乎比城市边界所需的距离更远。你确定吗?
  • 它们看起来非常接近我:geocodezip.com/geoxml3_test/v3_BoundsVsGeocoder.html(纽约市的边界看起来比绝对要求的要大一些,但展示城市似乎是合理的。

标签: sql postgresql google-maps gis postgis


【解决方案1】:

如数据所示,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 在所有维度上的大小不同:使用 GEOMETRYGEOGRAPHY 的计算方式不同,结果也不同。 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)

延伸阅读:

【讨论】:

  • 如何仅用邮政编码的点坐标计算bbox?
  • @arilwan 嘿。你的意思是如何绘制bbox?在这个答案中,我可能使用了 pgAdmin 几何查看器。另一种方法是使用QGIS 可视化几何图形:stackoverflow.com/a/59841814/2275388
  • @arilwan 另一个用于调试目的的选项,如果您没有安装 pgAdmin 4,是在 WKT 查看器中复制您的几何图形的 WKT,例如:arthur-e.github.io/Wicket/sandbox-gmaps3.html,这里是 pgadmin 4 查看器:blog.rustprooflabs.com/2018/09/pgadmin4-geometry-viewer
  • 你让我开心。我已经安装了 pgAdmin 4。
  • @ari 回答您的问题:是的,一个矩形需要 5 个点:) 第一个和最后一个是相同的,因此很清楚多边形的闭合位置。
猜你喜欢
  • 2011-03-17
  • 2014-08-29
  • 1970-01-01
  • 2013-01-16
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多