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具有此功能吗?
答案 0 :(得分:6)
数据表明,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的简单方法是使用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单位。 / p>
在一个点周围创建一个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)
进一步阅读: