如何计算具有特定中心的正方形多边形?
How to calculate a square polygon with a specific center?
我有一个点的 WGS 84 坐标,我需要创建一个以上述点为中心的“正方形”多边形。顶点定义如下:
a N a
W *---------+---------* E
|
|a
|
X
|
|a
|
W *---------+---------* E
a S a
X
是起点,a
是以米为单位的给定距离。
- 由于点坐标与其他地理信息一起存储在 BigQuery 中,因此最好在查询中计算这些多边形。我可以使用 BigQuery 的 geography functions 生成它们吗? (我没有找到一种方法来计算从起点 X 米到 N/E/S/W 的点的坐标)。
- 如果 #1 不可行,我可以使用哪些 Python 库和方法来做到这一点?
好吧,这不是正方形,由于球面畸变,两个顶角之间的距离将短于 2a
并且不同于两个底角之间的距离,并且不同于侧角之间的距离。但是如果 a
足够小,它足够接近正方形,并且在合理的误差范围内你可以做到。我认为在 BigQuery 中执行此操作并避免显式三角函数的最简单方法是采用较小的偏移量、测量距离并按比例采用较大的偏移量:
-- computes distance in degrees along parallel at specified latitude
create temp function _to_lng_degrees(lat FLOAT64, a FLOAT64) AS
(
a / ST_Distance(ST_GeogPoint(0, lat), ST_GeogPoint(1, lat))
);
-- computes distance in degrees along meridian
create temp function _to_lat_degrees(a FLOAT64) AS
(
a / ST_Distance(ST_GeogPoint(0, 0), ST_GeogPoint(0, 1))
);
create temp function rect(point GEOGRAPHY, a FLOAT64) AS
((
SELECT ST_MakePolygon(ST_MakeLine(
[ST_GeogPoint(x - dx, y - dy), ST_GeogPoint(x + dx, y - dy),
ST_GeogPoint(x + dx, y + dy), ST_GeogPoint(x - dx, y + dy),
ST_GeogPoint(x - dx, y - dy)]))
FROM (
SELECT ST_X(point) x, _to_lng_degrees(ST_Y(point), a) dx,
ST_Y(point) y, _to_lat_degrees(a) dy)
));
select rect(ST_GeogPoint(-122.1555771, 47.6858382), 1000)
我有一个点的 WGS 84 坐标,我需要创建一个以上述点为中心的“正方形”多边形。顶点定义如下:
a N a
W *---------+---------* E
|
|a
|
X
|
|a
|
W *---------+---------* E
a S a
X
是起点,a
是以米为单位的给定距离。
- 由于点坐标与其他地理信息一起存储在 BigQuery 中,因此最好在查询中计算这些多边形。我可以使用 BigQuery 的 geography functions 生成它们吗? (我没有找到一种方法来计算从起点 X 米到 N/E/S/W 的点的坐标)。
- 如果 #1 不可行,我可以使用哪些 Python 库和方法来做到这一点?
好吧,这不是正方形,由于球面畸变,两个顶角之间的距离将短于 2a
并且不同于两个底角之间的距离,并且不同于侧角之间的距离。但是如果 a
足够小,它足够接近正方形,并且在合理的误差范围内你可以做到。我认为在 BigQuery 中执行此操作并避免显式三角函数的最简单方法是采用较小的偏移量、测量距离并按比例采用较大的偏移量:
-- computes distance in degrees along parallel at specified latitude
create temp function _to_lng_degrees(lat FLOAT64, a FLOAT64) AS
(
a / ST_Distance(ST_GeogPoint(0, lat), ST_GeogPoint(1, lat))
);
-- computes distance in degrees along meridian
create temp function _to_lat_degrees(a FLOAT64) AS
(
a / ST_Distance(ST_GeogPoint(0, 0), ST_GeogPoint(0, 1))
);
create temp function rect(point GEOGRAPHY, a FLOAT64) AS
((
SELECT ST_MakePolygon(ST_MakeLine(
[ST_GeogPoint(x - dx, y - dy), ST_GeogPoint(x + dx, y - dy),
ST_GeogPoint(x + dx, y + dy), ST_GeogPoint(x - dx, y + dy),
ST_GeogPoint(x - dx, y - dy)]))
FROM (
SELECT ST_X(point) x, _to_lng_degrees(ST_Y(point), a) dx,
ST_Y(point) y, _to_lat_degrees(a) dy)
));
select rect(ST_GeogPoint(-122.1555771, 47.6858382), 1000)