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

有许多很酷的 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mars3d绘制区域范围(面+边框)

1、图例(绿色面区域白色边框) 2、代码 1)、绘制区域ts文件 import { mapLayerCollection } from /hooks/cesium-map-init /*** 安全防護目標* param map*/ export const addSafetyProtection async (map) > {const coverDatas await m…

浅谈智能电容器在低压配电网末端的应用

安科瑞 华楠 摘要:电容器优化配置和投切是配电网络优化的一项重要内容。电容器优化配置,侧重对电容器优化投切的各种算法进行了详细评述,分析了各种算法的特点及存在的问题,以促进该研究领域的进一步发展。 关键词:电…

【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试

**本文由博主本人整理自第六届字节跳动青训营(后端组),首发于稀土掘金:🔗Go语言工程实践之测试 | 青训营 目录 一、概述 1、回归测试 2、集成测试 3、单元测试 二、单元测试 1、流程 2、规则 3、单元测试的例…

网络传输层协议:UDP和TCP

背景知识 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -…

SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交

场景 SpringBootRedis自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数): SpringBootRedis自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)_redis防刷_霸道流氓气质的博客-CSDN博客 以下接口幂等性的实现方式与上面博客类似,…

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

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

第十四届蓝桥杯大赛青少年省赛C++组试题真题 2023年5月

一、选择题 第 1 题 单选题 C中,bool类型的变量占用字节数为 ( )。 A. 1 B. 2 C. 3 D. 4 第 2 题 单选题 以下关于C结构体的说法,正确的是 ( )。 A. 结构体中只能包含成员变量,不能包含成员函数 B. 结构体不能从另一个结构体继承 …

【C#】医学实验室云LIS检验信息系统源码 采用B/S架构

基于B/S架构的医学实验室云LIS检验信息系统,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问,技术架构:Asp.NET CORE 3.1 MVC SQLserver Redis等。 一、系统概况 本系统是将各种生化、免疫、…

CAN协议

一、何为CAN? CAN的全称为Controller Area Network,也就是控制局域网络,简称为CAN。CAN最早是由德国BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。BOSCH主要是做汽车电子的,因…

javafx实现自定义的数据拖拽

效果 代码 package cn.juhe.zjsb.test;import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.SnapshotParameters; import javafx.scene.control.Button; import javafx.scene.control.TextField; impo…

《MySQL45讲》笔记—一条SQL查询语句是如何执行的、一条SQL更新语句是如何执行的

整体架构 server层包括连接器、查询缓存、分析器、优化器、执行器;存储引擎层负责数据的存储和提取,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎,如果在…

CAXA中.exb或者.dwg文件保存为PDF

通常CAXAZ中的文件为.exb或者.dwg格式,我们想打印或者保存为PDF文件格式,那么就用一下的方法: CAXA文件如图所示: 框选出你要打印的图纸!!!! 我们选择"菜单"->"…

iptable防火墙

防火墙 防火墙的主要功能是隔离,决定数据是否可以被外网访问以及哪些数据可以进入内。 它主要部署在网络边缘或者主机边缘,应用在网络层。 防火墙的安全技术: 1、入侵检测系统:检测数威胁,病毒,木马,不…

下拉框可筛选可树状多选组件

实际效果图片 父页面 <el-form-item label"转发&#xff1a;" :label-width"formLabelWidth" class"formflex_item"><el-select ref"select" :clearable"true" clear"clearSelect" remove-tag"r…

UI设计工具都有哪些好用的推荐?

对于UI设计的初学者来说&#xff0c;掌握一个实用且易于使用的界面UI软件是非常重要的。今天&#xff0c;我整理了四个易于使用的界面UI软件。让我们看看。 即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&#xff0c;…

Kubernetes 的核心概念:Pod、Service 和 Namespace 解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HTML及其标签详解

文章目录 一、HTML简介1、网页1>什么是网页2>什么是HTML 2、Web标准1>为什么需要Web标准2>Web标准的构成 3、HTML语法规范1>基本语法2>标签关系 二、HTML标签1、基本标签2、标题标签3、段落和换行标签4、文本格式化标签5、< div>和< span>标签6、…

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具&#xff1a;Ubuntu下Questasim10.7安装&#xff08;64bit&#xff09;全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接&#xff0c;后面激活文件参考的第二个 另外…

生成式人工智能新政策发布:AI进入规范时代!

最近&#xff0c;国家发布了《生成式人工智能服务管理暂行办法》。该条例于8月15日开始施行&#xff0c;使得AI应用进入规范化管理。该法明确了适用于提供生成文本、图片、音频、视频等内容的服务&#xff0c;鼓励人工智能技术在各行业、各领域的创新应用&#xff0c;生成积极健…

flask中redirect、url_for、endpoint介绍

flask中redirect、url_for、endpoint介绍 redirect 在 Flask 中&#xff0c;redirect() 是一个非常有用的函数&#xff0c;可以使服务器发送一个HTTP响应&#xff0c;指示客户端&#xff08;通常是浏览器&#xff09;自动导航到新的 URL。基本上&#xff0c;它是用来重定向用…