动态分段的JavaScript实现【线性参考】

news2024/11/24 13:41:33

有许多很酷的 GIS 应用程序将海拔和距离结合在一起。 当用户沿着高程图拖动光标时,地图上的位置通常会更新。

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

在尝试将此功能构建到我的一个项目中时,我了解到它需要一种称为线性参考(Linear Referencing)的东西 — 有时候也称为动态分段(Dynamic Segmentation)。 下面介绍了线性参考是什么,以及我如何使用 JavaScript 和 PostGIS 将其合并到我现有的 GIS 应用程序中。

1、线性参考标准

我当前的 GPS 路线包含纬度、经度和海拔(即它们是 3 维点)。 我需要知道每个点距路线起点有多远,以便填充高程图的 x 轴。

幸运的是,GIS 社区已经提出了有关线性参考的标准。 该点距直线起点的距离(称为 m 值)可以存储为 GPS 点的第 3 维或第 4 维。

具有线性参考的几何图形的名称中包含 M,例如:

  • LINESTRING M:包含 3 维点(纬度、经度、线性参考)
  • LINESTING ZM:包含 4 维点(纬度、经度、海拔、线性参考)

2、JavaScript 计算线性参考

沿着 LINESTING 应用线性参考相当简单:只需循环沿线的每个点,计算距起点的距离,并将其附加到点的终点。

我使用了两个 JavaScript 库来帮助进行这些计算:

  • Turf – 我在 Node/JavaScript 中进行几何计算的首选地理空间库
  • Wellknown – MapBox 的另一个库,用于在 WKT 和 GeoJSON 之间进行转换

生成的 JavaScript 在第 5 行接受 WKT 中的 LINESTRING Z,在第 21 行使用 Turf 的距离函数计算引用,并在第 31 行返回更新的 LINESTING ZM。

const parse = require('wellknown')
const turf = require('@turf/turf')

// convert WKT to geoJSON (optional; required by Turf library)
const inputGeoJSON = parse(inputWKT).coordinates

// parse geoJSON into Turf LineString
const linestring = turf.lineString(inputGeoJSON)
  
// add linear referencing - loop through points and add 4th "M" dimension
let previousLength = 0 // track previous length
let previousCoord = null
linestring.geometry.coordinates.forEach( (currentCoord, index) => {
  
  const currentLength = 0

  // if first point set length to 0, otherwise append length to end of point array
  if (index===0) {
    currentCoord.push(0)
  } else {
    const distance = turf.distance(previousCoord, currentCoord, {units: 'miles'})
    currentCoord.push(previousCoord[3] + distance)
  }

  previousLength = currentLength
  previousCoord = currentCoord

})

// output back to WKT (including 4th dimension)
const updatedWKT = parse.stringify(linestring)

此 JavaScript 逻辑已打包到Node.js模块中,并且还发布在 GitHub 上,并在 README 中包含示例。

3、在 PostGIS 中存储参考几何图形

PostGIS 支持上面讨论的线性参考标准。 用于存储和查询几何图形的基本空间函数按预期工作,并且我使用 ST_GeomFromText() 插入我的 LINESTRING ZM 没有任何问题。

INSERT INTO sampletable(id, geom) VALUES(1, ST_GeomFromText('LINESTRING ZM (1 1 0 0, 1 2 1 1, 1 3 2 2, 2 2 3 3)'));

4、在 WKT 中检索几何图形

我很快了解到 GeoJSON 不支持 4 维几何图形。因此,在从 PostGIS 导出几何图形时,我必须使用 WKT 格式,以便可以包含高程和参考(通过 ST_AsText() 函数完成)。

SELECT id, ST_AsText(geom) FROM sampletable;

5、将 WKT 发送到前端

GeoJSON 通常是我通过 REST API 编码几何图形的方式,但在这种情况下,我必须以 WKT 格式传输几何图形。 这样我的点的所有 4 维都可以包含在内(记住,GeoJSON 仅支持 3 维!)。

在这里插入图片描述

幸运的是,主要的地图库支持从 WKT 本地或通过插件导入几何图形。 前面提到的 Wellknown JavaScript 库是另一个在需要时在 WKT 和 GeoJSON 之间进行转换的好工具。


原文链接:动态分段的JS实现 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java排序算法之插入排序

文章目录 📋插入排序概念📖实现步骤🔖代码示例 📈总结 📋插入排序概念 插入排序(Insertion Sort)是一种简单直观的排序算法。它将数组划分为已排序和未排序两个部分,每次从未排序部分…

iTOP-RK3568开发板Docker 安装 Ubuntu 18.04

Docker 下载安装 Ubuntu18.04,输入以下命令: sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04,输入以下命令: docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数:容器的…

Shell脚本学习-shift语句的使用

[rootvm1 scripts]# help shift shift: shift [n]Shift positional parameters.Rename the positional parameters $N1,$N2 ... to $1,$2 ... If N isnot given, it is assumed to be 1.Exit Status:Returns success unless N is negative or greater than $#.说明&#xff1a…

vue解决跨域访问问题(个人学习笔记六)

目录 友情提醒第一章、跨越问题解决1.1)什么是跨域问题?1.2)第一种解决方式:后端设置允许跨域访问1.3)第二种解决方式:前端配置代理 第二章、配置代理服务器2.1)配置简单代理服务器2.2&#xff…

GPT-AI 使用的技术概览

ChatGPT 使用的技术概览 智心AI-3.5/4模型,联网对话,MJ快速绘画 从去年 OpenAI 发布 ChatGPT 以来,AI 的能力再次惊艳了世人。在这样的一个时间节点,重新去学习相关技术显得很有必要。 ChatGPT 的内容很多,我计划采用…

Git下载与安装

文章目录 一、Git下载二、Git安装1.双击下载好的安装包进行安装2.Next3.选择Git的安装目录(不要带有中文和空格)→Next4.Next5.Next6.Next7.Next8.Next9.Next10.Next11.Next12.Next13.Next14.Next15.Next16.Install17.等待安装18.Finish19.鼠标光标放到系统桌面右击看到如下图所…

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言 在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们…

Java那些“锁”事 - 公平锁和非公平锁

在Java中,锁可以分为公平锁(Fair Lock)和非公平锁(Nonfair Lock),它们的区别在于线程获取锁的顺序是否遵循公平性原则。 公平锁 公平锁是指多个线程按照它们发出请求的顺序获取锁,即先到先得的原…

QT:当登录成功时,关闭登录界面,跳转到新的界面中

1> 继续完善登录框,当登录成功时,关闭登录界面,跳转到新的界面中 widget.h #include "widget.h" //#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent)//, ui(new Ui::Widget) {//ui->setu…

Cesium态势标绘专题-集结地(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

IOS自动化测试环境搭建教程

目录 一、前言 二、环境依赖 1、环境依赖项 2、环境需求与支持 三、环境配置 1、xcode安装 2、Git安装 3、Homebrew安装(用brew来安装依赖) 4、npm和nodejs安装 5、libimobiledevice安装 6、idevicesinstaller安装 7、ios-deploy安装 8、Ca…

DRS 迁移本地mysql 到华为云

准备工作: 源端的IP地址(公网),用户明和密码。如果通过公网迁移,需要在安全组放通drs访问源端数据库的3306端口。目标端的IP地址,用户名和密码。 创建DRS迁移任务 创建迁移任务 登录华为云控制台。单击管…

自恢复保险丝(PPTC)的金属材料说明

保险丝大家都是知道的,但保险丝当中的自恢复保险丝(PPTC)可能就不太了解的。 其实PPTC自恢复保险丝与大家所认识的保险丝一样,都是起到限流作用,达到电路防护效果。简单来说就是一旦电路中的电流超过所规定的电流时&am…

MixFormerV2: Efficient Fully Transformer Tracking

摘要 基于变压器的跟踪器在标准基准测试上取得了很强的精度。然而,它们的效率仍然是在GPU和CPU平台上实际部署的一个障碍。在本文中,为了克服这一问题,我们提出了一个完全变压器跟踪框架,称为MixFormerV2,没有任何密集…

SpringBoot 配置⽂件

1.配置文件作用 整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如: 数据库的连接信息(包含⽤户名和密码的设置);项⽬的启动端⼝;第三⽅系统的调⽤秘钥等信息;⽤于发现和定位问题的普通⽇…

mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目

m系列 mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目 gptlink 项目是一个前后端一体化的 chatgpt 开源项目 gptlink 项目地址:https://github.com/gptlink/gptlink 安装 php 8.0 版本: brew install php8.0安装完成后提示如下&#xff…

面向对象之_多态_1

目录 一. 多态 多态是什么 二. 多态的构成条件 1. 虚函数 2. 虚函数重写(隐藏) 3. 父类型的引用或者指针调用 4. 多态的特殊情况 1) 子类可以不加 virtual 关键字 2) 协变 三. 关键字 1. virtual 2. final 3. override 四. 多态的原理 1. 虚…

【MST+离线】CF1851 G

Problem - G - Codeforces 题意&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int N2e510; const int mod1e97;int a[N]; struct node {int x, y, val;bool operator < (const node &k) const {return …

疾风计划-程序设计基础-期末考试-05

擀面皮 有一块1x1的方形面团&#xff08;不考虑面团的厚度&#xff09;&#xff0c;其口感值为0。擀面师傅要将其擀成一个N x M&#xff08;纵向长N&#xff0c;横向宽M&#xff09;的面皮。师傅的擀面手法娴熟&#xff0c;每次下手&#xff0c;要么横向擀一下&#xff08;使得…

Ubuntu 20.04下的录屏与视频剪辑软件

ubuntu20.04下的录屏与视频剪辑 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 2、设置录制窗口参数 3、开始录制 二、视频剪辑软件kdenlive的安装 1、安装 2、启动 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 &#xff08;1&#xff09;直接在终端输入以下命…