OpenLayers 精確經過三個點的曲線繪制

OpenLayers 精確經過三個點的曲線繪制

根據您的需求,我將提供一個使用 OpenLayers 繪制精確經過三個指定點的曲線解決方案。對于三個點的情況,我們可以使用 二次貝塞爾曲線三次樣條插值,確保曲線精確通過所有控制點。

實現方案

下面是一個完整的實現,使用二次貝塞爾曲線算法生成平滑曲線,確保曲線精確通過所有三個控制點:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>OpenLayers 精確經過三個點的曲線</title><script src="https://cdn.jsdelivr.net/npm/ol@7.3.0/dist/ol.js"></script><link href="https://cdn.jsdelivr.net/npm/ol@7.3.0/ol.css" rel="stylesheet"><style>.map {width: 100%;height: 500px;}</style>
</head>
<body><div id="map" class="map"></div><script>// 1. 指定要經過的三個頂點(經緯度坐標)const controlPoints = [[116.3, 39.9],    // 北京[118.8, 37.5],    // 青島[121.4, 31.2]     // 上海];// 2. 坐標轉換工具const transformToMercator = (points) => points.map(point => ol.proj.transform(point, 'EPSG:4326', 'EPSG:3857'));// 3. 二次貝塞爾曲線算法(關鍵函數)function quadraticBezierCurve(start, control, end, segments = 50) {const result = [];for (let t = 0; t <= 1; t += 1 / segments) {// 二次貝塞爾公式: B(t) = (1-t)2P0 + 2(1-t)tP1 + t2P2const x = Math.pow(1 - t, 2) * start[0] + 2 * (1 - t) * t * control[0] + Math.pow(t, 2) * end[0];const y = Math.pow(1 - t, 2) * start[1] + 2 * (1 - t) * t * control[1] + Math.pow(t, 2) * end[1];result.push([x, y]);}return result;}// 4. 計算控制點位置(確保曲線經過三個點)function calculateControlPoint(p0, p1, p2) {// 控制點位置計算方法:// 假設中間點p1是曲線上的點,則控制點C的位置可以通過以下公式計算:// p1 = 0.52 * p0 + 2 * 0.5 * 0.5 * C + 0.52 * p2// 解得:C = 2 * p1 - 0.5 * (p0 + p2)return [2 * p1[0] - 0.5 * (p0[0] + p2[0]),2 * p1[1] - 0.5 * (p0[1] + p2[1])];}// 5. 創建地圖與渲染const map = new ol.Map({target: 'map',layers: [new ol.layer.Tile({ source: new ol.source.OSM() })],view: new ol.View({center: ol.proj.transform([119, 34], 'EPSG:4326', 'EPSG:3857'),zoom: 5})});// 6. 轉換坐標并計算貝塞爾曲線const mercatorPoints = transformToMercator(controlPoints);const start = mercatorPoints[0];const middle = mercatorPoints[1];const end = mercatorPoints[2];// 計算控制點const controlPoint = calculateControlPoint(start, middle, end);// 生成貝塞爾曲線const curvePoints = quadraticBezierCurve(start, controlPoint, end, 100);// 7. 創建曲線要素與樣式const curveFeature = new ol.Feature({geometry: new ol.geom.LineString(curvePoints)});curveFeature.setStyle(new ol.style.Style({stroke: new ol.style.Stroke({color: 'rgba(255, 0, 0, 0.8)',width: 4,lineCap: 'round',lineJoin: 'round'})}));// 8. 添加控制點標記const vectorSource = new ol.source.Vector();vectorSource.addFeature(curveFeature);controlPoints.forEach((point, index) => {const mercatorPoint = transformToMercator([point])[0];vectorSource.addFeature(new ol.Feature({geometry: new ol.geom.Point(mercatorPoint),style: new ol.style.Style({image: new ol.style.Circle({radius: 8,fill: new ol.style.Fill({ color: 'blue' }),stroke: new ol.style.Stroke({ color: 'white', width: 2 })}),text: new ol.style.Text({text: `${index + 1}`,font: '14px Arial',fill: new ol.style.Fill({ color: 'black' }),offsetY: -15})})}));});// 9. 添加控制點標記(顯示計算出的控制點)vectorSource.addFeature(new ol.Feature({geometry: new ol.geom.Point(controlPoint),style: new ol.style.Style({image: new ol.style.Circle({radius: 6,fill: new ol.style.Fill({ color: 'rgba(0, 128, 0, 0.6)' }),stroke: new ol.style.Stroke({ color: 'white', width: 1 })}),text: new ol.style.Text({text: '控制點',font: '12px Arial',fill: new ol.style.Fill({ color: 'black' }),offsetY: 15})})}));map.addLayer(new ol.layer.Vector({ source: vectorSource }));</script>
</body>
</html>

核心技術解析

  1. 二次貝塞爾曲線算法

    • 對于三個點的情況,二次貝塞爾曲線是最適合的選擇
    • 曲線公式:B(t) = (1-t)2P0 + 2(1-t)tP1 + t2P2,其中P0和P2是起點和終點,P1是控制點
  2. 控制點計算

    • 為了確保曲線經過中間點,我們通過數學方法計算出合適的控制點位置
    • 控制點公式:C = 2 * P1 - 0.5 * (P0 + P2),其中P1是需要經過的中間點
  3. 曲線精度控制

    • segments 參數控制曲線的分段數
    • 值越大,曲線越平滑,但計算量也會增加

使用與調整

  1. 修改控制點

    • 編輯 controlPoints 數組,修改三個經緯度坐標點
    • 必須提供三個點才能生成曲線
  2. 調整曲線平滑度

    • 修改 quadraticBezierCurve 函數中的 segments 參數
    • 默認值為100,可根據需要增加或減少
  3. 樣式定制

    • 修改曲線的顏色、寬度和線型
    • 調整控制點標記的大小和顏色
      在這里插入圖片描述

這種方法生成的曲線能夠精確經過所有三個指定的點,同時保持整體的平滑性,非常適合需要精確路徑的地理可視化應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80265.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django緩存框架API

這里寫自定義目錄標題 訪問緩存django.core.cache.cachesdjango.core.cache.cache 基本用法cache.set(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get(key, defaultNone, versionNone)cache.add(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get_or_se…

Linux系統管理與編程17:自動化部署ftp服務

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 #virtual用戶管理&#xff1a;passerbyA、captain和admin三個虛擬用戶 # passerbyA只能看&#xff0c;captain可看讀寫上傳&#xff0c;但不能刪除。admin全部權限 [rootshell shell]…

2025python學習筆記

一.Python語言基礎入門 第一章 01.初識Python Python的起源&#xff1a; 1989年&#xff0c;為了打發圣誕節假期&#xff0c;Gudio van Rossum吉多范羅蘇姆&#xff08;龜叔&#xff09;決心開發一個新的解釋程序&#xff08;Python維形&#xff09;1991年&#xff0c;第一個…

STM32單片機的快速成長路徑規劃

一、基礎準備階段&#xff08;1-2周&#xff09; C語言核心技能 重點掌握&#xff1a;指針操作、結構體、枚舉、位操作、函數指針&#xff08;回調函數基礎&#xff09;實踐項目&#xff1a;通過51單片機或STM8完成LED控制、按鍵檢測等基礎項目&#xff0c;熟悉寄存器配置和調試…

torch.nn.init.uniform_

nn.init.uniform_ 是 PyTorch 中用于初始化張量&#xff08;tensor&#xff09;的一個函數&#xff0c;它的作用是將張量的值填充為從均勻分布中采樣的隨機數。 詳細說明&#xff1a; 函數&#xff1a; torch.nn.init.uniform_(tensor, a0., b1.)tensor&#xff1a;需要被初始…

Spring MVC中跨域問題處理

在Spring MVC中處理跨域問題可以通過以下幾種方式實現&#xff0c;確保前后端能夠正常通信&#xff1a; 方法一&#xff1a;使用 CrossOrigin 注解 適用于局部控制跨域配置&#xff0c;直接在Controller或方法上添加注解。 示例代碼&#xff1a; RestController CrossOrigin…

基本句子結構

以下是英語句子五種基本結構的詳細解釋&#xff0c;并附上系動詞的全面分類及示例&#xff1a; ?1. 主謂結構&#xff08;SV&#xff09;? ?結構&#xff1a;主語&#xff08;Subject&#xff09; 不及物動詞&#xff08;Intransitive Verb&#xff09;?核心&#xff1a;…

游戲引擎學習第264天:將按鈕添加到分析器

回顧并為今天的工作做鋪墊 隨著時間的推移&#xff0c;我們的分析器&#xff08;profiler&#xff09;變得越來越強大。我通常會問大家是否記得我們要做什么&#xff0c;今天我們要做的似乎是按鈕相關的功能。 今天的目標是實現按鈕功能。我們從昨天留下的地方繼續&#xff0…

大節點是選擇自建機房還是托管機房

選擇PCDN大節點自建機房還是托管機房&#xff0c;需綜合考量資金實力、技術能力、運維需求、業務規模及合規要求。以下為具體分析&#xff1a; 自建機房的適用場景與考量因素 資金與技術門檻高 自建機房需投入服務器、存儲、網絡設備等硬件&#xff0c;以及機房建設、電力、散…

【SpringBoot】SpringBoot中使用AOP實現日志記錄功能

前言一、AOP基本概念二、項目準備三、實現日志記錄切面1、創建自定義日志注解2、實現日志切面3、配置AOP 四、使用示例1. 在Controller中使用2. 在Service中使用 六、高級配置1. 日志內容格式化2. 異步日志記錄3. 日志脫敏處理 七、代理類生成的核心邏輯問題1&#xff1a; 既然…

linux中的常用命令(一)

目錄 常用的快捷鍵 1- tab鍵:命令或者路徑提示及補全&#xff1b; 2-ctrlc:放棄當前輸入&#xff0c;終止當前任務或程序 3-ctrll;清屏 4-ctrlinsert:復制 5-鼠標右鍵:粘貼&#xff1b; 6-altc:斷開連接/ctrlshift r 重新連接 7-alt1/2/3/等&#xff1a;切換回話窗口 8-上下鍵…

Pycharm(十九)深度學習

一、深度學習概述 1.1 什么是深度學習 深度學習是機器學習中的一種特殊方法,它使用稱為神經網絡的復雜結構,特別是“深層”的神經網絡,來學習和做出預測。深度學習特別適合處理大規模和高維度的數據,如圖像、聲音和文本。深度學習、機器學習和人工智能之間的關系如下圖所…

多視圖密集對應學習:細粒度3D分割的自監督革命

原文標題&#xff1a;Multi-view Dense Correspondence Learning (MvDeCor) 引言 在計算機視覺與圖形學領域&#xff0c;3D形狀分割一直是一個基礎且具有挑戰性的任務。如何在標注稀缺的情況下&#xff0c;實現對3D模型的細粒度分割&#xff1f;近期&#xff0c;斯坦福大學視覺…

Vue——前端vue3項目使用漢字轉拼音

在 Vue3 項目中&#xff0c;可以通過以下 第三方 JavaScript 包 實現漢字轉拼音。這些包均兼容 Vue3&#xff0c;且無需依賴后端處理&#xff1a; 推薦方案 1. pinyin-pro 特點&#xff1a;功能強大、支持多音字、聲調、拼音匹配、輕量級&#xff08;~20KB&#xff09;。安裝…

批量統計PDF頁數,統計圖像屬性

軟件介紹&#xff1a; 1、支持批量統計PDF、doc\docx、xls\xlsx頁數 2、支持統計指定格式文件數量&#xff08;不填格式就是全部&#xff09; 3、支持統計JPG、JPEG、PNG圖像屬性 4、支持統計多頁TIF頁數、屬性 5、支持統計PDF、JPG畫幅 統計圖像屬性 「托馬斯的文件助手」…

LeetCode 每日一題 2025/5/5-2025/5/11

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄 5/5 790. 多米諾和托米諾平鋪5/6 1920. 基于排列構建數組5/7 3341. 到達最后一個房間的最少時間 I5/8 3342. 到達最后一個房間的最少時間 II5/9 3343. 統計平衡排列的數目5…

pytest自動化測試執行環境切換的兩種解決方案

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、痛點分析 在實際企業的項目中&#xff0c;自動化測試的代碼往往需要在不同的環境中進行切換&#xff0c;比如多套測試環境、預上線環境、UAT環境、線上環…

visual studio 2015 安裝閃退問題

參考鏈接&#xff1a; VS2012安裝時啟動界面一閃而過問題解決辦法 visual studio 2015 安裝閃退問題

RocketMQ Kafka區別

架構 ZooKeeper&#xff1a;管理 Broker 注冊、分區 Leader 選舉及消費者組狀態。Broker&#xff1a;存儲 Partition數據&#xff0c;每個 Partition 為獨立日志文件。Producer/Consumer&#xff1a;通過 ZooKeeper獲取路由信息&#xff0c;實現消息分發與消費。 NameServer&am…

MySQL進階篇2_SQL優化、鎖

文章目錄 1 SQL優化1.1插入數據優化1.2主鍵優化頁分裂頁合并主鍵設計原則 1.3order by設計優化1.4group by設計優化小理解 1.5limit設計優化順序IO和隨機IO小疑惑 1.6count設計優化1.7update優化關于隱式事務事務的DML操作 鎖全局鎖表級鎖表鎖元數據鎖意向鎖 行級鎖鎖的釋放條件…