目标
我正在尝试构建一个应用程序,从而将整个世界 map 分成大量的六边形。这些六边形一旦生成,将始终覆盖 map 上的同一区域。然后,在给定某些地理坐标的情况下,如果这些坐标位于其边界内,则将在 map 上绘制六边形。这些六边形必须非常小,每边大约为0.5mm。 50m-这是主要问题。
第一次尝试
我的第一个想法是预先生成一个六边形网格,其中每个十六进制都将是不可见的,并且在确定坐标是否在边界内之后,只需更改六边形的样式即可。如果六角形边的长度确实很大(几百公里),则此方法有效。但是,在我的情况下,即使试图绘制很小的六边形,应用程序也会耗尽内存,即使是在 map 的较小部分也是如此。
// Attempting to cover the whole map in small hexagons
turf.hexGrid([-179.99, -89.99, 179.99, 89.99], 0.2);
初次尝试,但带有扭曲
我的第二个想法是使用
mask
的hexGrid()
选项,这样我仍然会生成具有不变六边形坐标的十六进制网格,但是只会尝试在较小的 map 区域(例如在 map 上可见的区域)内渲染六边形。这似乎也不可能,因为即使生成这样的网格(也没有在 map 上渲染)也证明会消耗太多资源。// Attempting to cover the whole map in small hexagons only within a given area (mask)
turf.hexGrid([-179.99, -89.90, 178.99, 88.90], 30, {
mask: polygon([[[20, 60], [21, 60], [22, 62], [22, 63], [20, 60]]]),
});
但是,这将产生非常偏斜的六边形,这使我相信尝试为整个世界生成十六进制网格通常不是一个好主意。
乐观计算
我的最后一次尝试是在 map 的左上角生成一个六边形,并使用其坐标来计算该第一个六边形与任何给定坐标之间可容纳多少个六边形。
这些计算几乎可以正常工作,但是由于四舍五入或者可能是我在计算距离(手动)时出现了错误,因此坐标距离第一个六边形越远,定位的偏差就越大。
现实生活中的示例
与我想要实现的最接近的示例是在名为“Run a Empire”的运行游戏中。六角形网格似乎按需加载,并且仅围绕该区域位于该区域。从网格的外观看,该网格没有任何间隙,会阻止六边形完美连接。
另外一个有趣的问题是,在世界 map 上绘制六边形会使它们向北偏斜。在上述游戏中(在下面的截图中)似乎没有发生这种情况。这是否意味着六边形的大小是硬编码的,或者它们是在不发生偏斜的不同 map 投影上绘制的?
主要问题
在给定地理坐标(如GPS位置)的情况下,如何可靠地生成六边形网格,以便在根据另一组坐标生成另一个六边形网格时,这两个网格将完全重叠?我愿意解决任何工具,不一定要使用Turf或Mapbox。
最佳答案
我建议生成一个包含所有六边形的矢量层,并使用地理数据库动态加载它们以执行地理查询。
放置销的点的交点将返回其下的六边形,如果使用缓冲区,还可以在其周围添加更多的六边形。
WGS84的边界是-180.0000,-90.0000、180.0000、90.0000(我知道这很明显)
资料来源:https://spatialreference.org/ref/epsg/wgs-84/
这意味着您需要从那里开始,估算您需要/想要创建的六边形的数量。
根据https://planetcalc.com/7721/,以米为单位的炉膛半径为6378137。
假设您想要一个由6个等边三角形组成的六边形,这意味着要得到一个边长约50米的六边形,它的宽度应为100m(假设平边水平放置)。
现在我们可以说在赤道处需要大约63781个六边形,让我们简化为63800,360/63800 = 0.00564 ...所以我建议从0.0055度的赤道点偏移开始。
要强调的一件事是,WGS84是一个大地水准面,而不是球形(像我们的星球一样),因此最终表示形式可能会有所扩展。
更新:要自动生成网格,貌似您也可以使用Quantum GIS
https://github.com/rldhont/Quantum-GIS/blob/master/python/plugins/processing/algs/grass7/description/v.mkgrid.txt
https://grass.osgeo.org/grass76/manuals/v.mkgrid.html
关于maps - 如何在世界 map 上可靠地生成六边形网格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55798256/