RGeo:在墨卡托投影上绘制大圆

问题描述 投票:0回答:1

我需要在地图上描绘出多个形状,每个形状都被指定为两个长/纬度坐标之间的一种线条。我一直在将这些线分解/插值/分割成一系列点,并将这些点绘制到使用墨卡托投影的 Google 地图(通过 GeoJSON)上,并将其存储在 postgresql-postgis 数据库中。

我已经解决了恒向线和顺时针参数的这个问题,但我完全不知道如何追踪大圆。我一直在使用 RGeo 来协助处理其他线类型,并且预计事情会比我发现的容易得多。

如何在两个坐标之间绘制具有可定义步数的大圆路径?

在深夜编码的狂热中,我将一些代码示例从 C 和 JavaScript 移植到了 Ruby。具体来自 OGR 这是一个基本上很好的解决方案,但至少可以说它不是一个可靠的解决方案,因为我正在构建的一些多边形线已经开始重叠,或者没有在会聚线之间留下预期的间隙。

我认为使用球形工厂中的答案行,但尝试将线串从球形工厂转换为墨卡托工厂只会给我一条带有两个点的线。

spherical_factory = RGeo::Geographic.spherical_factory(srid: 4326)
point1 = spherical_factory.point(YOUR_LONGITUDE1, YOUR_LATITUDE1)
point2 = spherical_factory.point(YOUR_LONGITUDE2, YOUR_LATITUDE2)
great_circle = spherical_factory.line(point1, point2)
# TODO: Split the great_circle

我什至尝试过 ChatGPT 寻求建议,它为我提供了调用不存在的 LineString#interpolate 函数的精彩代码。我真的很想要一个像这样简单的解决方案。

如果没有任何建议,我可能会尝试从起始坐标递归生成一个递增的圆,并从相交点构建直线。

ruby geojson rgeo mercator great-circle
1个回答
0
投票

听着,伙计,绘制大圆圈可不是在丛林中散步。这有点棘手,因为它们是球体表面上最短的路径,对吧?所以,您处理的是球面三角学,而不是平坦的内陆道路。

现在,在 PostGIS 中,您通常会在球体上使用 ST_Segmentize geom 函数将点添加到大圆线上。该函数采用线串和点之间的最大距离,然后通过添加顶点来稠化线条。无论是恒向线还是大圆,都没有关系。它只是填补了空白。

但是既然您正在与 Ruby 和 RGeo 进行较量,那么您将会获得一些乐趣。 RGeo 没有像 ST_Segmentize 这样开箱即用的功能,伙计。你必须卷起袖子,亲自动手做一些数学运算。

您可能想尝试以下方法:

使用半正矢公式或类似公式计算点之间的方位角和距离。 然后,使用这些来计算沿大圆的中间点。文森特(Vincenty)这个家伙想出了一些可以提供帮助的公式。 获得方位角和距离后,您可以使用这些值从上一个点沿着方位角投影设定距离的新点,从而计算序列中的下一个点,并迭代此过程以创建直线。 将这些点转换为墨卡托投影并绘制它们。 你的球面到墨卡托的转换只给你两点,因为这就是你开始的地方。您需要在转换线条之前对其进行分段。因此,您需要首先沿着大圆创建点,然后将它们投影到您的地图上。

现在,如果这一切听起来像狗的早餐,而你的代码要四处走动,你可以尝试使用“proj”库,它可以处理坐标系之间的投影和转换,可能会帮你省去麻烦。

如果所有其他方法都失败了,并且您感觉自己像一条惊呆了的鲻鱼,那么您可能想咨询一下在 Ruby 中更擅长地理空间知识的人。或者,给 Python 一个树瘤——它有一堆用于此类事情的库,比如 Shapely 或 Pyproj。可能会让你的生活变得更轻松,而不是与 Ruby 较劲。

别再喝咖啡了,伙计。太多会让你崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.