当前位置: 首页 > news >正文

OpenLayers 使用高德地图并绘制一些线,并用Android原生触发

这是一份OpenLayers使用高德地图并绘制一些线代码,这高德来源好像不太正规建议自己去开发者平台逛逛。代码都有注释我就不过多介绍了。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>OpenLayers Map</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@v10.0.0/ol.css"><script src="https://cdn.jsdelivr.net/npm/ol@v10.0.0/dist/ol.js"></script><style>html,body {margin: 0;height: 100%;}#map {position: absolute;top: 0;bottom: 0;width: 100%;}button {/* 定位按钮位置 */position: absolute;z-index: 10;}</style>
</head><body><div id="map"></div><button onclick="initDrawLines()">Draw Lines</button><script>//高德地图引用const gaode = new ol.layer.Tile({source: new ol.source.XYZ({url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'})});//OpenLayers使用核心方法const map = new ol.Map({target: 'map',layers: [gaode,],view: new ol.View({center: ol.proj.fromLonLat([116.3974, 39.9087]),zoom: 15,projection: 'EPSG:3857'})});// 计算平行线的功能function offsetLine(line, distance, side, lineCoordinates) {const coords = line.getCoordinates();const coord = coords[0];const nextCoord = coords[1];const dx = nextCoord[0] - coord[0];const dy = nextCoord[1] - coord[1];const length = Math.sqrt(dx * dx + dy * dy);const offsetX = (dy / length) * distance;const offsetY = -(dx / length) * distance;const offsetCoords = coords.map((coord, index) => {console.log('Line coordinates:', offsetX, offsetY, ol.proj.toLonLat([coord[0] + offsetX, coord[1] + offsetY]),);if (side === 'left') {return [coord[0] + offsetX, coord[1] + offsetY];} else {return [coord[0] - offsetX, coord[1] - offsetY];}});console.log('Line coordinates:', offsetCoords, "start", ol.proj.toLonLat(offsetCoords[0]), "end", ol.proj.toLonLat(offsetCoords[1]));lineCoordinates.push({ start: ol.proj.toLonLat(offsetCoords[0]), end: ol.proj.toLonLat(offsetCoords[1]) });return new ol.geom.LineString(offsetCoords);}// 绘制线条的函数function drawLines(lonA, latA, lonB, latB, numLines, distanceBetweenLines) {const pointA = ol.proj.fromLonLat([lonA, latA]);const pointB = ol.proj.fromLonLat([lonB, latB]);const mainLine = new ol.geom.LineString([pointA, pointB]);const vectorSource = new ol.source.Vector();let lineCoordinates = [];// 循环创建平行线for (let i = 1; i <= numLines; i++) {const offset = i * distanceBetweenLines;// 偏移左侧线const leftLine = offsetLine(mainLine, offset, 'left', lineCoordinates);const leftFeature = new ol.Feature(leftLine);vectorSource.addFeature(leftFeature);// 偏移右侧线const rightLine = offsetLine(mainLine, offset, 'right', lineCoordinates);const rightFeature = new ol.Feature(rightLine);vectorSource.addFeature(rightFeature);}// 主线const mainFeature = new ol.Feature(mainLine);vectorSource.addFeature(mainFeature);// 创建矢量图层const vectorLayer = new ol.layer.Vector({source: vectorSource,style: new ol.style.Style({stroke: new ol.style.Stroke({color: '#ffcc33',width: 2})})});map.setLayers([gaode, vectorLayer])// 返回线条的坐标return lineCoordinates;}// 初始化并调用 drawLines 函数function initDrawLines() {const latA = 39.9087;const lonA = 116.3974;const latB = 40;const lonB = 110;const numLines = 6;const distanceBetweenLines = 10;const coordinates = drawLines(lonA, latA, lonB, latB, numLines, distanceBetweenLines);console.log('Line coordinates:', coordinates);}</script>
</body></html>

Android

class MainActivity : AppCompatActivity() {@SuppressLint("SetJavaScriptEnabled")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val webView = findViewById<WebView>(R.id.webView)val astart = findViewById<EditText>(R.id.astart)val aend = findViewById<EditText>(R.id.aend)val bstart = findViewById<EditText>(R.id.bstart)val bend = findViewById<EditText>(R.id.bend)val sum = findViewById<EditText>(R.id.sum)val spacing = findViewById<EditText>(R.id.spacing)val quer = findViewById<Button>(R.id.quer)quer.setOnClickListener {webView.evaluateJavascript("javascript:drawLines(${astart.text}, ${aend.text}, ${bstart.text}, ${bend.text}, ${sum.text}, ${spacing.text})"){Log.e("WebAppInterface", "CSV 文件已保存到: ${convertJsonToCsv(it)}")}}val webSettings = webView.settingswebSettings.javaScriptEnabled = true// 加载HTML文件webView.loadUrl("file:///android_asset/index.html")}fun convertJsonToCsv(jsonString: String?): String {val csvData = StringBuilder()// CSV HeadercsvData.append("start_latitude,start_longitude,end_latitude,end_longitude\n")try {// 解析JSON数组val jsonArray = JSONArray(jsonString)for (i in 0 until jsonArray.length()) {val obj = jsonArray.getJSONObject(i)val startArray = obj.getJSONArray("start")val endArray = obj.getJSONArray("end")// 获取start和end的纬度和经度val startLatitude = startArray.getDouble(1)val startLongitude = startArray.getDouble(0)val endLatitude = endArray.getDouble(1)val endLongitude = endArray.getDouble(0)// 生成CSV行数据csvData.append(startLatitude).append(",").append(startLongitude).append(",").append(endLatitude).append(",").append(endLongitude).append("\n")}} catch (e: Exception) {e.printStackTrace()}return csvData.toString()}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ZK Rollup 的Sequencer
  • STM32通过I2C硬件读写MPU6050
  • Microsoft GraphRAG 执行流程
  • 【计算机硬件硬盘与储存设备】
  • 推荐一款开源特效制作软件(适用于Godot)
  • tcpdump入门——每种flag分别表示什么意思
  • ECMAScript6语法:默认参数和rest参数
  • 模型训练坎坷路--逐步提升模型准确率从40%到90%+
  • redis命令学习
  • 构建Docker镜像时,遇到从`deb.debian.org`下载软件包速度很慢
  • [论文笔记]ZeRO: Memory Optimizations Toward Training Trillion Parameter Models
  • 软考:软件设计师 — 13.数据结构
  • 【社区团购系统设计】
  • apache huidi 时间旅行Time Travel)机制
  • QT:QTableWidget 如何设置列的对齐方式?
  • android图片蒙层
  • Apache Spark Streaming 使用实例
  • java第三方包学习之lombok
  • java正则表式的使用
  • sessionStorage和localStorage
  • sublime配置文件
  • tensorflow学习笔记3——MNIST应用篇
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue 2.3、2.4 知识点小结
  • 产品三维模型在线预览
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 码农张的Bug人生 - 初来乍到
  • 跳前端坑前,先看看这个!!
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 以太坊客户端Geth命令参数详解
  • 终端用户监控:真实用户监控还是模拟监控?
  • 昨天1024程序员节,我故意写了个死循环~
  • # Redis 入门到精通(七)-- redis 删除策略
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #define用法
  • #vue3 实现前端下载excel文件模板功能
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (9)目标检测_SSD的原理
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (function(){})()的分步解析
  • (待修改)PyG安装步骤
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)N皇后问题
  • (五)activiti-modeler 编辑器初步优化
  • (五)关系数据库标准语言SQL
  • (转)ORM
  • .NET Core中Emit的使用
  • .NET MVC第三章、三种传值方式
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net6 webapi log4net完整配置使用流程
  • @SuppressLint(NewApi)和@TargetApi()的区别