在 turfjs 中创建多个多边形的联合的最快方法是什么?

2024-04-02

我有这样的东西,但对于大集合来说,速度非常慢:

    let unionize = (triangles) => {
        if(triangles.length == 0) {
            return null
        }

        let ret = triangles[0].feature

        triangles.forEach((t, index) => {
            if(index > 0) {
                ret = turf.union(t, t)
            }
        })

        return ret
    }

瓶颈在于联合。它必须将每个多边形的所有坐标与所有坐标进行比较,以避免重复条目。 正在接听@Fergals https://stackoverflow.com/questions/66590054/quickly-merge-many-contiguous-polygons-in-javascript/75974925#75974925想法,这是用 JS 实现的这种方法。而且速度更快

allGeometries是有效的 GeoJSON 多边形几何体的数组。该函数也考虑内环。

function fasterUnion(allGeometries) {
  const mid = Math.floor(allGeometries.length / 2);
  let group1 = allGeometries.slice(0, mid);
  let group2 = allGeometries.slice(mid);

  while (group1.length > 1) {
    group1 = unionGroup(group1);
  }
  while (group2.length > 1) {
    group2 = unionGroup(group2);
  }

  let result;
  if (group1.length === 1 && group2.length === 1) {
    result = turf.union(group1[0], group2[0]);
  } else if (group1.length === 1) {
    result = group1[0];
  } else {
    result = group2[0];
  }

  return result;
}

function unionGroup(group) {
  let newGroup = [];
  for (let i = 0; i < group.length; i += 2) {
    let a = group[i];
    let b = i + 1 < group.length ? group[i + 1] : null;
    if (b) {
      newGroup.push(turf.union(a, b));
    } else {
      newGroup.push(a);
    }
  }
  return newGroup;
}

另一种可能的方法是创建一个空间索引,如 R-Tree 和类似的库RBush https://github.com/mourner/rbush。由于联合的昂贵部分是将所有坐标相互比较并消除重复项,因此加快速度的一种方法是排除坐标比较,我们可以安全地假设这些坐标的多边形不重叠。可以使用 R 树来快速(粗略)地找出哪些多边形重叠、哪些多边形不重叠。 RBush提供了两种方法,search() and collide()可以用于此目的。一旦我们知道哪些多边形不重叠,就不需要为它们执行昂贵的并集操作。我们只需比较重叠的多边形的坐标即可。最后,我们只需要将并集的结果(一个Polygon)与RBush识别出的不重叠的多边形(可能有多个多边形)放入一个多边形中,这就是数组理解,因为a中的几何体GeoJSON https://geojson.org/无非就是以某种方式组合在一起的奇特数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 turfjs 中创建多个多边形的联合的最快方法是什么? 的相关文章

随机推荐

  • 无法导入模块“lambda_function”:没有名为“flatten_json”的模块

    运行 lambda 代码时出现以下错误 我正在使用名为的库 from flatten json import flatten 我试图寻找 lambda 层 但在网上没有找到 请告诉我是否有人以前使用过这个或建议任何替代方案 缺少 flatt
  • jQuery:有没有一种方法可以自动向动态生成的 HTML 添加属性,就像 live() 处理事件一样?

    我有一个如下所示的列表 ul li a href example url 1 Link 1 a li li a href example url 2 Link 2 a li li a href example url 3 Link 3 a
  • 项目上线时Manager Bean不返回

    我有一个使用 JPA 的 JSF 项目 我这样做 从 mysql 数据库检索一些数据 然后将数据绘制在图表中 Locally works pretty fine as you can see here So I deploy the pro
  • 解决Tomcat中的Bind异常

    自一年以来 我们一直在 Apache Tomcat 8 0 36 服务器上运行 Java 8 Web 应用程序 从过去的几天来看 有时当我们重新启动 Tomcat 服务器时 应用程序无法运行 日志显示 Https 端口的地址绑定异常 我尝试
  • 有什么可能的方法从沙盒应用程序运行 clang 编译器吗?

    好的 这个问题相当简单 我有一个沙盒 OSX 应用程序 我希望用户能够编译一些 C 代码 无论他输入什么 但每当我尝试拨打电话时 usr bin env clang the path to the source c 我在日志中收到以下错误
  • 插入按钮没有将数据插入数据库,并且根本没有给出错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 这是包含插入方法的类 我先填充字段 然后创建属性 然后插入方法 然后转到另一个类并创建插入按钮 请帮忙 根本没有给出错误 usin
  • 如何请求Android用户通过点击启用蓝牙?

    from http developer android com guide topics connectivity bluetooth html http developer android com guide topics connect
  • 仅使用 HTML 和 CSS 创建下拉按钮?

    是否可以仅使用 HTML 和 CSS 创建一个带有下拉菜单的按钮 a Take Action a ul li action 1 li li action 2 li ul 单击链接时 悬停也可以 但首选单击 我希望显示 ul actions
  • 抽象声明中没有参数名称?

    这是 F 中抽象成员的典型声明 abstract member createEmployee string gt string gt Employee 您定义参数类型 但不定义它们的名称 没有名字 在实现接口时如何知道每个参数是什么 换句话
  • 如何使用 Kotlin 就地过滤列表?

    在 Java 中 我可以使用以下代码从列表中删除项目 private void filterList List
  • 消除录音曲目中当前播放曲目的声音

    我希望使用远程 IO 进行音频录制和播放 我对核心音频的理解很差 因为我遵循惊人的音频开源 http theamazingaudioengine com 到目前为止 我可以使用相同的代码进行录制和播放 现在我尝试通过麦克风录制并通过 iPh
  • 特定接口上的 TCP/IP 连接

    我想使用两个网络路由之一连接到服务器 一个人会怎样做呢 我在 Google 上搜索了很多 常见的答案是修改路由表 但这并没有什么帮助 因为目的地只有一个 IP 地址 大多数示例都具有具有单个网卡的客户端和具有多个网卡的服务器 但在本例中情况
  • Shell 正则表达式到行尾

    我有一个像这样的小例子的文件 mode dev 该文件中某处的注释中有一个 变量 我想在 Shell 脚本中使用正则表达式获取值 到目前为止我的代码 bin bash conf lt etc test conf Get the file c
  • 队列上的 IEnumerable 迭代器是否应该使项目出列

    我创建了一个自定义通用队列 它实现了通用 IQueue 接口 该接口使用 System Collections Generic 命名空间中的通用队列作为私有内部队列 示例已清除不相关的代码 public interface IQueue
  • 您应该如何从源代码控制构建数据库?

    SO 社区 wiki 上有一些关于数据库对象是否应该进行版本控制的讨论 然而 我还没有看到太多关于为数据库对象创建构建自动化过程的最佳实践的讨论 对于我的团队来说 这一直是一个有争议的讨论点 特别是因为开发人员和 DBA 在评估数据库部署自
  • 如何在 ElasticSearch 中基于正则表达式过滤令牌

    对于 ElasticSearch 查询 我们希望以不同的方式处理单词 即仅由字母组成的标记 和非单词 为此 我们尝试定义两个分析器 返回单词或非单词 例如 我们有描述五金店产品的文档 name Torx drive T9 category
  • 字符串搜索算法

    对于两种字符串搜索算法 KMP和后缀树 在什么情况下优选哪种 举一些实际的例子 如果您必须回答很多查询 例如 大海捞针是否存在 则后缀树会更好 如果您只需在另一个字符串中搜索一个字符串 而不需要执行很多次 那么 KMP 会更好 后缀树是一种
  • SwiftUI - 将 SceneKit 场景添加到 MacOS 项目

    目标 使用 UIViewRepresentable 将 SceneKit 场景添加到 SwiftUI MacOS 项目 不是 Catalyst 我做了什么 当目标是 SwiftUI iOS 时 以下代码可以正常工作 但是当目标是 MacOS
  • Node教程一对多无加载远程服务器Stream Spinner动不停

    我对在项目中使用所需的 Kurrento 很陌生 但是当我克隆 git hub 上为 Kurento 提供的教程并遵循 one2Many 调用的说明时 首先 adapter js 的软件包损坏了 因为我成功解决了它们 但之后出现了一个问题
  • 在 turfjs 中创建多个多边形的联合的最快方法是什么?

    我有这样的东西 但对于大集合来说 速度非常慢 let unionize triangles gt if triangles length 0 return null let ret triangles 0 feature triangles