Cesium 使用 Turf 实现坐标点移动(偏移)

前言

在 gis 项目中,坐标点偏移算是常见需求了。我们通过设置统一的规则,让 poi 坐标进行一定量的偏移,从而达到保密的要求。

先给大家看看效果

可以看到,我先点击了 3 下距离偏移,让原始点位根据我提供的 200 米,400 米,600 米 进行了向右偏移并打了几个点

然后点击了方向角偏移,分别是 30,60,90,120 等,让原始点位根据我提供的方向角进行了偏移并打点

实际应用中就可以给坐标点加上距离和方向角的偏移,隐藏原始的坐标点位

实战教学

下面进行实战教学,这里我们借用了 Turf 库里面的 transformTranslate 函数来实现坐标点的移动(偏移)

首先需要安装 Turf,官方文档让我们使用 npm install @turf/turf 命令进行安装,可是我发现用 npm 这玩意 install 老是会报错,就像这样

所以我打算采取 yarn 安装

先全局安装 yarn

bash 复制代码
npm install -g yarn

验证是否安装成功

bash 复制代码
yarn - v

我本地已经提前安装过了 yarn,所以直接查询版本号

使用 yarn 安装 turf

bash 复制代码
yarn add @turf/turf

速度很快,一次成功

引入 turf

js 复制代码
import * as turf from "@turf/turf";

使用 turf

js 复制代码
// 创建一个点要素
const point = turf.point([113.39179694652559, 23.165830666454557]); // [经度, 纬度]

// 将点向东北方向(角度45度)平移100米
const newCoords = turf.transformTranslate(
  point,
  100, // 距离:100米
  45, // 方向角:45度(东北方向)
  { units: "meters" } // 选项:指定距离单位为米
);

console.log("原始点坐标:", point);
console.log("平移后点坐标:", newCoords);

注意!这里的 turf.pointturf.transformTranslate 方法并不会直接在地图上创建一个 poi 点位,他们只是创建了一个用于计算点位的实例方法,我们只需要通过获取它计算出来的经纬度的值,然后自己用于地图上进行打点

我们只需要取 geometry 下面的 coordinates 值即可

然后将获取的新坐标点打在地图上就好啦

参数解释

transformTranslate 函数共包含四个参数,分别是:geojson,distance,direction,options

geojson(GeoJSON):要平移的 GeoJSON 对象。可以是点(Point)、线(LineString)、面(Polygon)等任何 GeoJSON 几何类型或要素(Feature)。

distance(number):要平移的距离,负值表示相反方向移动。单位默认为公里(kilometers),如果想换成米的话需要将 options 选项设置为units: "meters"

direction(number):要平移的方向角,以十进制度数表示。角度以正北(0°)为起点,顺时针方向增加(90° 是东,180° 是南,270° 是西)。

options(Object):附加选项对象,其中又包含三个属性,分别为:units,zTranslation,mutate

go 复制代码
`units(string)`:距离(distance)的单位,可选值包括 'meters'(米)、'kilometers'(千米,此为默认值)、'miles'(英里)等。

`zTranslation(number)`: Z 轴方向(垂直方向)的平移量,单位与 distance 相同。用来偏移高程。注意:此平移仅当输入的 GeoJSON 数据本身包含高程信息(Z坐标)时才会生效。

`mutate(boolean)`: 是否直接修改输入的 GeoJSON 对象,而不是创建新对象。设置为 true可在处理大型数据时提升性能,但会改变原始数据。

参考资料

turf 官方文档:turfjs.org/docs/api/tr...

units 可选值:turfjs.org/docs/next/a...

相关推荐
benbenAItalk6 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885726 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12347 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易9 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周9 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师9 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9810 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan10 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡10 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒11 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端