一种多边形视觉中心算法库的改进【适用于标签放置】

一种多边形视觉中心算法库的改进

一、改进及优化

mapbox/polylabel 库提供了一种计算二维几何图形的视觉中心的算法和具体实现,使用该库可以进行计算一个面的视觉中心,用于将文字/图片标签/标注放置在二维几何图形的合适位置。

它解决的具体问题、场景,可以看下图:

在一个多边形上放置文本标签或工具提示的最佳位置通常位于其 【视觉中心】的某个位置,即多边形内部的一个点,周围有尽可能多的空间。

而计算这样一个视觉中心首先想到的是多边形质心。可以用一个简单快速的公式计算多边形中心,但如果形状是凹的或有一个洞,点可以落在形状外面。

请添加图片描述

mapbox/polylabel 库就是 解决 标签 放置的 位置不在面内的情况。

一般情况下,为了上标签的位置在面内,基本都是手动调整。

但是对于大量的面数据而言,手动调整显然是不合适的。

这就是 mapbox/polylabel 库的价值:自动计算合适的视觉中心位置,用于标签的放置。

但 mapbox/polylabel 时基于 js 开发的,且仅支持传递 GeoJSON 对象中的 Polygon 对象(仅支持传递一个面)。

这里对该库进行了改造和优化,主要包含以下几个方面:

1、整个库改用 typescript 开发。

2、引入 tinyqueue 源码并改造为 typescript。

3、支持 FeatureCollection、Feature、GeometryCollection、Polygon、MultiPolygon 等所有 GeoJSON 面类型的对象、数据。

4、动态精度。mapbox/polylabel 库的计算精度默认是 1.0。这里改造为通过计算传递进来的经纬度范围,生成适合的计算精度。使得计算动态匹配不同形状的几何数据。

5、当一个 GeoJSON 是多个面时,每个面都会计算出它的视觉中心,并暴露在 Properties 对象中。同时整个 GeoJSON 也有一个视觉中心。

6、提供了测试数据。

该库的名称为: polyvisualcenter

库地址为:https://www.npmjs.com/package/polyvisualcenter

具体使用方法可以参考 https://www.npmjs.com/package/polyvisualcenter 的说明。

二、算法与原理

一、难以接近的两极:计算地球上最远地区的算法
1、摘要

提出了一种计算球面上给定球面多边形的最大圆距离的算法。这是用来计算主要陆块中离海最远的地点,也称为难以接近的极点 (PIA),这个概念引起了探险家的兴趣。对于难以接近的欧亚极 (EPIA),结果显示直线计算的误差在 156 到 435 公里之间。虽然一般情况下,只有一个极对应于一个给定的海岸线,目前的计算表明,在海岸线定义固有的误差下,有两个位置是 EPIA 的候选位置,一个与鄂毕湾、孟加拉湾和阿拉伯海等距,另一个与鄂毕湾、孟加拉湾和渤海湾等距,这两个位置都位于最西北部中国新疆省。这些位置到海的距离是 2510 和 2514 公里,分别比一般认为的要近 120 公里。

2、引言

从历史上看,远离海洋、与世隔绝和难以接近有关。不可接近极点(PIA)被定义为距离特定海岸线最远的位置(图1)。这个概念最早由Vilhjalmur Stefansson(1920)提出,用来区分北极和北极最难以到达的地方。此后,它被广泛用来指南极洲离海最远的地方(例如 Ramseier,1966;Lambert,1971;Bonner,1987)。1958年,由Aleksei Treshnikov (Petrov, 1959)领导的第二次苏联南极考察队首次完成了这一探险挑战。

这个词也用来指地球上距离任何海洋最远的地方(Eurasian Pole of Inaccessibility,以下简称 EPIA),位于亚洲中部。像Cable & French (1944, p. 94) 等探险家将 Dsungarei 沙漠地区称为“地球上离海洋最远的地方”。

请添加图片描述

近年来,随着对南极洲(2007年1月19日)和欧亚大陆(Crane & Crane, 1987年)PIA的考察,人们对这一主题的兴趣越来越大,而学术文献仍然非常稀缺。虽然计算这种极点的图形方法早已为人所知,但随着数字海岸线和地理数据库的逐渐可用,对数值方法的需求正在增长。本文提出了一种简单的计算地球上最大陆块的PIA的方法。该方法的应用表明,在通常被认为是EPIA的位置上,误差在156 ~ 435 km之间(Crane & Crane, 1987)。

设计了一种迭代方法来计算与给定海岸线相关的PIA。对于每次迭代,由经度范围λmin、 λmax和纬度范围Фmin、 Фmax定义的一个依次较小的区域R以候选PIA位置λPIA、 ФPIA为中心定义。一开始,R对应搜索到的到海岸最大距离的位置的区域。然后在R中定义了Nλ × NФ节点组成的规则矩形网格。本文中显示的大多数结果使用Nλ = NФ = 21。然后计算这441个节点到海岸线的距离,并生成一个新的候选位置λ΄PIA、 Ф΄PIA(为使这一距离最大化的节点)。然后将R区域缩小一个√2因子,并以λ΄PIA、 Ф΄PIA为中心,迭代该过程。由于球面距离是位置λ 、Ф的连续函数,该算法保证收敛到到海岸距离的局部最大值,但不保证它是绝对最大值。将图2到图4中所示的连续结果映射到自动方法中,可以很容易地识别出是否遗漏了相关的局部最大值。如果多边形具有足够高的分辨率(就像地球海岸线的情况一样),那么在球坐标中,点与多边形之间的距离等于从点到所有多边形角的最小距离。

请添加图片描述

3、方法

球面地球上两点[λ0, Ф0]和[λ1, Ф1]之间的大圆距离d,可由球面三角余弦法则导出:

d_(x0,y0)^(x1,y1) = R_(E )∗arccos⁡(sin⁡(φ_0) * sin(φ_1) + cos(φ_0) * cos(φ_1) * cos(“λ” _1 *〖" λ" 〗_0))

其中R_(E )为地球的平均半径,取6372.7 km。根据定义,任意形状多边形(例如海岸线)有一个单一的PIA和3个等距最近的海岸线点(CSP)(参见图1)。

如果多边形的顶点分布不够密集,那么公式应该使用对应于从点到线段的距离。本工作中使用的海岸线多边形取自Wessel & Smith (1996;基于WGS-84椭球体,分辨率约为500米。这里使用的海岸线不包括湖泊和内海,如里海。它在河口和三角洲地区(河流和公海的边界)的随意性通常在10公里左右。实现上述算法的计算机代码是用ANSI C语言和C-shell Unix脚本编写的,可在网站http://cuba.ija.csic.es/*danielgc/PIA/上找到。天文台共核对了约80000个地理坐标,才计算出一个PIA,精度约为1公里,而一台标准个人电脑的计算时间约为110分钟。

4、结果

第一个迭代算法的执行使用Nλ = NФ = 201,为了获得一份详细的世界地图的距离海岸线(图2)。结果正确预测离海洋最远的点位于欧亚大陆中部,与北冰洋、黄海和阿拉伯海等距。当放大到欧亚大陆中部(图3和图4),一个相对不寻常的例子是两个本地具有相似峰值的极大值变得明显。分别处理这两个区域,得到两个EPIA候选点的位置(表1): EPIA1 距离海岸线(鄂毕湾、孟加拉湾和阿拉伯海)2510 + 10公里,而EPIA2 距离海岸线(墨西哥湾、孟加拉海湾和渤海海湾) 2514 + 7公里。由于孟加拉湾和阿拉伯海的CSPs位于三角洲地区,海岸线的确定存在固有的不确定性(图3)。根据这些地区的海岸线几何形状,这里将不确定性分别取为20和15 km。导致极点位置的不确定性约为其一半(表1)。因为这些不确定性值大于EPIA1和EPIA2之间到海洋的距离差,因此可以得出两个位置都是同样相对可信的。使用任何可用的GIS软件、谷歌Earth或类似的设施,都可以很容易地检查这些结果。

请添加图片描述

请添加图片描述

请添加图片描述

同样的技术也适用于其他陆地块,以及计算到太平洋海岸的最大距离的位置,得到的PIA位置如表1所示。只有格陵兰岛和南极洲的PIA显示比EPIA的不确定性更大,因为它们的海岸沿线存在冰川。英国PIA的位置受到韦斯顿湾东端不确定的影响,在那里,河流和海洋之间的界限很难界定。这同样发生在南美、北美和澳大利亚。非洲(最东部的中非共和国)和伊比利亚(马德里西南80公里)的PIA值较好确定(误差小于4公里),因为它们各自的CSP值都不与河口重合。

5、论欧亚大陆的不可接近极点

以前(未记录)的EPIA计算没有考虑到墨西哥湾作为海洋的一部分,得出的位置为46°16.8′N 86°40.2′E(见图4;这个位置距离北冰洋的Baydaratskaya湾、孟加拉湾和中国东部的渤海湾都为2648公里)。但是,将鄂毕湾排除为公海的一部分是没有依据的,所有可用的地图都显示水深10 - 12米,宽达80公里的鄂毕湾为海洋的一部分。将鄂毕湾作为海洋的一部分意味着EPIA的巨大转变,在与海岸线定义相关的不确定性中,有两种解决方案,如前一节所示。本文发现的两个候选极点将地球到海岸的最大距离缩短了130多公里,并将PIA的位置相对于以前的计算分别修正了435公里(EPIA1)和156公里(EPIA2)。在EPIA1的情况下,CSP也是从渤海湾(中国东部)到阿拉伯海的变化之一。这些结果质疑了1986年两位探险家唯一一次有记录的探索EPIA的尝试(Crane & Crane, 1987)。EPIA1位于Kokirqin山(3698米)附近,海拔大于2000米,地势高,难以进入,靠近中国与哈萨克斯坦和吉尔吉斯斯坦的边界。EPIA2位于海拔710米,位于乌如姆齐东北偏北174公里处。除了远离海洋,两极都位于世界上最大的内海盆地,这意味着没有河流与海洋的连接(Cable & French, 1944)。这在一定程度上是由于每年200 - 350毫米的低降水量导致的大陆性 造成的。这两个因素可能加剧了这一地区作为中国和西方文明之间的自然边界的历史孤立性。它在历史上的微弱存在主要与古丝绸之路的相对邻近(几百公里)有关。意料之中的是,该地区是世界上人口较少的地区之一,而在该地区扎根时间最长的民族维吾尔族,在语言上属于突厥语系,与讲汉语的人口相互联系。

6、结论

地球上距离海洋最远的地方位于中国西北部的新疆省。在海岸线定义固有的不确定性中,建议将两个地点作为不可接近极点:EPIA1 (44°18′1″N、81°51′31″E) 和 EPIA2(45°17′60″ N、88°8′24″ E)。EPIA1与鄂毕湾、孟加拉湾、阿拉伯海等距离2510 + 10 km, EPIA2与鄂毕湾、孟加拉湾、中国渤海等距离2514 + 7 km。EPIA1和EPIA2距离被普遍接受为 EPIA(图4)的点的位置分别为 435和156公里。地球上距离陆地最远的点 (极难达到的太平洋,或点Nemo)是48°52.6′S、 123°23.6′W, 2690 + 2公里远的莫土语努伊(复活节岛),马赫岛(Anctartica),和杜西岛(皮特凯恩群岛)海岸。用同样的方法计算的其他大陆块体的PIA列于表1。

7、参考

Bonner, W. N. (1987) Antarctic science and conservation—the historical background. Environment

International, 13, pp. 19 – 25.

Cable, M. & French, F. (1944) The Gobi Desert (New York: Macmillan).

Crane, R. & Crane, N. (1987) Journey To The Centre Of The Earth (London: Bantam Press).

Lambert, G., Ardouin, B., Brichet, E. & Lorius, C. (1971) Balance of 90Sr over Antarctica: existence of a

protected area, Earth and Planetary Science Letters, 11, pp. 317 – 323.

Petrov, V. P. (1959) Soviet expeditions in Antarctica, The Professional Geographer, 9, pp. 6 – 10.

Ramseier, R. O. (1966) Role of sintering in snow construction, Journal of Terramechanics, 3, pp. 41 – 50.

Stefansson, V. (1920) The region of maximum inaccessibility in the Arctic, Geographical Review, 10,

pp. 167 – 172.

Wessel, P. & Smith, W. H. F. (1996) A global self-consistent, hierarchical, high-resolution shoreline

database, Journal of Geophysical Research, 101, B4, 8741 – 8743.

二、应用与算法实现

算法实现的本质是利用四叉树。先计算 GeoJSON 对象的包围盒,然后利用四叉树原理、算法,然后去最大包围盒的中心点或先计算整个面的质心,作为第一个点,然后将包围盒分割为四个单元格,不断迭代(子单元格继续分割为四个单元格),取单元格的中心点 和 GeoJSON,计算该点到 GeoJSON 的距离。然后在这些点中,取出值为正(在 GeoJSON 的 面内部)且距离最大的点,则该点即为这个 GeoJSON 的视觉中心(最佳中心点)。

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

通过上图可以看到,相较于 ArcGIS、SuperMap 这样的 GIS 软件计算出来的 【视觉中心】,针对于不同形状的面数据,polyvisualcenter 库都是完胜的。

因此欢迎大家使用该库,如有问题,可以在评论区联系我。

该库的名称为: polyvisualcenter

库地址为:https://www.npmjs.com/package/polyvisualcenter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碳学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值