gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:48:59 24 4
gpt4 key购买 nike

Google 返回的是当前的经纬度,但是左下角的经纬度和右上角的经纬度是计算出来的。我一直无法弄清楚它是如何计算的。

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

伊利诺伊州芝加哥

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 有这方面的功能?

最佳答案

如数据所示,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)

enter image description here

如果您使用函数 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)

enter image description here

如果您想知道为什么 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)

enter image description here

只提取左下角和右上角

如果您只对 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)

进一步阅读:

关于sql - 从纬度和经度对计算边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com