一个快速加载面和多面数据的html测试页面(可以导出geojson数据文件)
背景可以快速的加载出面和多面的地理数据信息在测试的时候有时候需要知道数据具体在那一块然后进行一些相关内容的判断时候可以用具体如下效果如下代码具体如下!DOCTYPE html html langzh head meta charsetUTF-8 title GIS 调试平台 /title link relstylesheet hrefhttps://unpkg.com/leaflet1.9.4/dist/leaflet.css / link relstylesheet hrefhttps://unpkg.com/leaflet-draw1.0.4/dist/leaflet.draw.css / style html,body{ margin:0; padding:0; } #map{ width:100%; height:100vh; } .panel{ position:absolute; top:10px; left:10px; width:460px; z-index:9999; background:white; padding:12px; border-radius:8px; box-shadow: 0 2px 10px rgba(0,0,0,.3); } textarea{ width:100%; height:140px; font-size:12px; } button{ margin:4px; } .title{ font-size:18px; font-weight:bold; } .small{ color:#666; font-size:12px; } /style /head body div idmap/div div classpanel div classtitle GIS 调试平台 /div div classsmall 支持 Point / LineString / Polygon / MultiPolygon /div textarea idinput MULTIPOLYGON ( ( (127.8463 46.3968, 127.8459 46.3874, 127.8445 46.3781, 127.8463 46.3968) ), ( (127.83 46.39, 127.82 46.38, 127.81 46.39, 127.83 46.39) ) ) /textarea br button onclickloadData() 加载WKT /button button onclickclearAll() 清空 /button button onclickexportGeoJSON() 导出GeoJSON /button textarea idoutput/textarea /div script srchttps://unpkg.com/leaflet1.9.4/dist/leaflet.js/script script srchttps://unpkg.com/leaflet-draw1.0.4/dist/leaflet.draw.js/script script /** * 初始化地图 */ const map L.map(map) .setView( [30,120], 5 ); /** * ArcGIS影像 */ L.tileLayer( https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}, { maxZoom:19 } ).addTo(map); /** * 数据图层 */ const drawnItems new L.FeatureGroup(); map.addLayer(drawnItems); /** * 绘制工具 */ const drawControl new L.Control.Draw({ edit:{ featureGroup:drawnItems }, draw:{ polygon:true, polyline:true, marker:true, rectangle:true, circle:false, circlemarker:false } }); map.addControl(drawControl); /** * 绘制完成 */ map.on( L.Draw.Event.CREATED, function(e){ drawnItems.addLayer(e.layer); syncOutput(); }); map.on( draw:edited, syncOutput ); map.on( draw:deleted, syncOutput ); /** * 坐标解析 */ function parseLine(str){ return str .trim() .split(,) .map(item{ let arr item .trim() .split(/\s/) .map(Number); return [ arr[1], arr[0] ]; }); } /** * POINT */ function loadPoint(wkt){ let body wkt .replace(/^POINT\s*/i,) .replace(/[()]/g,); let arr body .trim() .split(/\s/) .map(Number); let marker L.marker( [ arr[1], arr[0] ] ); drawnItems.addLayer(marker); map.setView( [ arr[1], arr[0] ], 14 ); } /** * LINESTRING */ function loadLine(wkt){ let body wkt .replace(/^LINESTRING\s*/i,) .replace(/[()]/g,); let line L.polyline( parseLine(body), { color:red, weight:3 } ); drawnItems.addLayer(line); map.fitBounds( line.getBounds() ); } /** * POLYGON */ function loadPolygon(wkt){ let body wkt .replace(/^POLYGON\s*/i,) .replace(/\(\(/,) .replace(/\)\)/,); let polygon L.polygon( parseLine(body), { color:blue, fillOpacity:.3 } ); drawnItems.addLayer(polygon); map.fitBounds( polygon.getBounds() ); } /** * MULTIPOLYGON解析 */ function extractMultiPolygons(str){ let result[]; let depth0; let current; let polys[]; for(let c of str){ if(c(){ depth; if(depth3) continue; } if(c)){ depth--; if(depth2){ polys.push(current); current; continue; } } if(depth3){ currentc; } } return polys.map(p{ return [ p.replace(/\(|\)/g,) ]; }); } function loadMultiPolygon(wkt){ let body wkt .replace(/^MULTIPOLYGON\s*/i,) .trim(); let polygons extractMultiPolygons(body); let layers[]; polygons.forEach(p{ let polygon L.polygon( parseLine(p[0]), { color:green, fillOpacity:.3 } ); drawnItems.addLayer(polygon); layers.push(polygon); }); if(layers.length){ map.fitBounds( L.featureGroup(layers) .getBounds() ); } } /** * 主加载入口 */ function loadData(){ let wkt document .getElementById(input) .value .trim(); drawnItems.clearLayers(); let type wkt .split(/\s|\(/)[0] .toUpperCase(); try{ switch(type){ case POINT: loadPoint(wkt); break; case LINESTRING: loadLine(wkt); break; case POLYGON: loadPolygon(wkt); break; case MULTIPOLYGON: loadMultiPolygon(wkt); break; default: alert( 暂不支持:type ); } syncOutput(); }catch(e){ console.error(e); alert( 解析失败:e.message ); } } /** * 输出GeoJSON */ function syncOutput(){ let json drawnItems.toGeoJSON(); document .getElementById(output) .value JSON.stringify( json, null, 2 ); } /** * 导出文件 */ function exportGeoJSON(){ let data JSON.stringify( drawnItems.toGeoJSON(), null, 2 ); let blob new Blob( [data], { type:application/json } ); let url URL.createObjectURL(blob); let a document.createElement(a); a.hrefurl; a.download gis-data.geojson; a.click(); URL.revokeObjectURL(url); } function clearAll(){ drawnItems.clearLayers(); syncOutput(); } /script /body /html导出手绘GEOJSON数据文件测试页面代码如下!DOCTYPE html html langzh head meta charsetUTF-8 / titleGIS 编辑器 v3/title link relstylesheet hrefhttps://unpkg.com/leaflet1.9.4/dist/leaflet.css/ link relstylesheet hrefhttps://unpkg.com/leaflet-draw1.0.4/dist/leaflet.draw.css/ style body { margin:0; font-family: Arial; } #map { height: 100vh; } .panel { position: absolute; top: 10px; left: 10px; width: 420px; z-index: 9999; background: #fff; padding: 10px; border-radius: 6px; box-shadow: 0 2px 10px rgba(0,0,0,.2); } button { margin: 4px 4px 4px 0; } textarea { width: 100%; height: 120px; font-size: 12px; } /style /head body div idmap/div div classpanel bGIS 编辑器 点、线、面/b div button onclickexportGeoJSON() 导出GeoJSON/button button onclickclearAll() 清空/button /div div stylemargin-top:8px; bGeoJSON 输出/b textarea idoutput/textarea /div /div script srchttps://unpkg.com/leaflet1.9.4/dist/leaflet.js/script script srchttps://unpkg.com/leaflet-draw1.0.4/dist/leaflet.draw.js/script script /* 1. 初始化地图 */ const map L.map(map).setView([30, 120], 5); L.tileLayer( https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}, { maxZoom: 19 } ).addTo(map); /* 2. 图层管理 */ const drawnItems new L.FeatureGroup(); map.addLayer(drawnItems); /* 3. 绘制工具核心 */ const drawControl new L.Control.Draw({ position: topright, edit: { featureGroup: drawnItems, remove: true }, draw: { polygon: { allowIntersection: false, showArea: true }, polyline: true, rectangle: true, marker: true, circle: false, circlemarker: false } }); map.addControl(drawControl); /* 4. 绘制完成事件 */ map.on(L.Draw.Event.CREATED, function (event) { const layer event.layer; drawnItems.addLayer(layer); syncOutput(); }); map.on(draw:edited, syncOutput); map.on(draw:deleted, syncOutput); /* 5. GeoJSON 输出同步 */ function syncOutput(){ const geojson drawnItems.toGeoJSON(); document.getElementById(output).value JSON.stringify(geojson, null, 2); } /* 6. 导出 GeoJSON 文件 */ function exportGeoJSON(){ const data drawnItems.toGeoJSON(); const blob new Blob( [JSON.stringify(data, null, 2)], { type: application/json } ); const url URL.createObjectURL(blob); const a document.createElement(a); a.href url; a.download gis-draw.geojson; a.click(); URL.revokeObjectURL(url); } /* 7. 清空 */ function clearAll(){ drawnItems.clearLayers(); syncOutput(); } /* 8. 初始化输出 */ syncOutput(); /script /body /html好了至此就可以实现快速加载点线面数据和导出数据文件了加载GEOJSON文件数据内容!DOCTYPE html html langzh head meta charsetUTF-8 titleWebGIS Editor 加载GeoJSON文件/title link relstylesheet hrefhttps://unpkg.com/leaflet1.9.4/dist/leaflet.css link relstylesheet hrefhttps://unpkg.com/leaflet-draw1.0.4/dist/leaflet.draw.css style html,body{ margin:0; height:100%; } #map{ width:100%; height:100%; } .panel{ position:absolute; top:10px; left:10px; width:380px; background:white; padding:12px; z-index:9999; border-radius:8px; box-shadow: 0 2px 10px rgba(0,0,0,.25); } button{ margin:4px; } textarea{ width:100%; height:120px; } /style /head body div idmap/div div classpanel h3 WebGIS 编辑器 v4 /h3 input typefile idfileInput accept.geojson,.json / br button onclickloadFile() 加载GeoJSON /button button onclickexportGeoJSON() 导出GeoJSON /button button onclickclearLayer() 清空 /button hr b 当前GeoJSON /b textarea idoutput/textarea /div script srchttps://unpkg.com/leaflet1.9.4/dist/leaflet.js/script script srchttps://unpkg.com/leaflet-draw1.0.4/dist/leaflet.draw.js/script script /*********************************** * 1. 初始化地图 ***********************************/ const map L.map(map) .setView( [30,120], 5 ); L.tileLayer( https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}, { maxZoom:19 }) .addTo(map); /*********************************** * 2. 图层管理 ***********************************/ const drawnItems new L.FeatureGroup(); map.addLayer( drawnItems ); /*********************************** * 3. 绘制工具 ***********************************/ const drawControl new L.Control.Draw({ edit:{ featureGroup:drawnItems }, draw:{ marker:true, polyline:true, polygon:{ allowIntersection:false, showArea:true }, rectangle:true, circle:false, circlemarker:false } }); map.addControl(drawControl); /*********************************** * 4. 手绘完成 ***********************************/ map.on( L.Draw.Event.CREATED, function(e){ let layere.layer; drawnItems.addLayer(layer); syncGeoJSON(); } ); map.on( draw:edited, syncGeoJSON ); map.on( draw:deleted, syncGeoJSON ); /*********************************** * 5. 加载GeoJSON文件 ***********************************/ function loadFile(){ const file document .getElementById(fileInput) .files[0]; if(!file){ alert( 请选择geojson文件 ); return; } const reader new FileReader(); reader.onloadfunction(e){ try{ let json JSON.parse( e.target.result ); let layer L.geoJSON( json, { style:function(){ return { color:#3388ff, weight:2, fillOpacity:0.3 } }, pointToLayer:function( feature, latlng ){ return L.marker(latlng); }, onEachFeature:function( feature, layer ){ // 保存属性 layer.feature feature; } } ); layer.eachLayer( function(l){ drawnItems.addLayer(l); } ); map.fitBounds( layer.getBounds() ); syncGeoJSON(); } catch(err){ alert( GeoJSON解析失败 ); console.error(err); } }; reader.readAsText(file); } /*********************************** * 6. 输出GeoJSON ***********************************/ function syncGeoJSON(){ let json drawnItems.toGeoJSON(); document .getElementById(output) .value JSON.stringify( json, null, 2 ); } /*********************************** * 7. 导出GeoJSON ***********************************/ function exportGeoJSON(){ let data drawnItems.toGeoJSON(); let blob new Blob( [ JSON.stringify( data, null, 2 ) ], { type: application/json } ); let url URL.createObjectURL(blob); let a document.createElement(a); a.hrefurl; a.download export.geojson; a.click(); URL.revokeObjectURL(url); } /*********************************** * 8. 清空 ***********************************/ function clearLayer(){ drawnItems.clearLayers(); syncGeoJSON(); } syncGeoJSON(); /script /body /html

相关新闻

Git 日常开发常用命令全攻略:从入门到实战

Git 日常开发常用命令全攻略:从入门到实战

一份覆盖日常开发 90% 场景的 Git 命令速查手册前言对于每一位开发者来说,Git 是必备的生存技能。无论是个人项目的版本管理,还是团队多人协同开发,Git 都是行业统一的标准工具。很多新手只会简单的 add、commit、push,遇到代码冲…

2026/7/22 6:30:13 阅读更多 →
嵌入式多核通信实战:硬件Mailbox原理、中断与轮询模式详解

嵌入式多核通信实战:硬件Mailbox原理、中断与轮询模式详解

1. 从硬件邮箱到高效IPC:嵌入式多核通信的实战基石在嵌入式多核处理器的世界里,不同处理器核心(比如Cortex-A系列的应用处理器和Cortex-M系列的实时协处理器)或者同一个核心上运行的不同任务之间,如何安全、高效地“对…

2026/7/22 6:30:13 阅读更多 →
C++日期类实现:运算符重载与面向对象编程实践

C++日期类实现:运算符重载与面向对象编程实践

1. 项目概述&#xff1a;为什么我们需要一个“日期类”&#xff1f;在C的日常开发中&#xff0c;处理日期和时间是绕不开的坎。无论是记录日志、计算任务周期&#xff0c;还是处理用户输入的生辰八字&#xff0c;你总得和年月日打交道。系统自带的<ctime>库用起来总感觉隔…

2026/7/22 6:30:13 阅读更多 →

最新新闻

C++构造与析构异常处理:RAII机制与noexcept最佳实践

C++构造与析构异常处理:RAII机制与noexcept最佳实践

1. 项目概述&#xff1a;为什么C的构造与析构异常如此棘手&#xff1f;在C的世界里&#xff0c;异常处理机制是构建健壮、容错性高软件的重要基石。然而&#xff0c;当异常与对象的“生”&#xff08;构造函数&#xff09;和“死”&#xff08;析构函数&#xff09;交织在一起时…

2026/7/22 7:14:32 阅读更多 →
中医知识库数字化:构建智能检索与知识图谱系统

中医知识库数字化:构建智能检索与知识图谱系统

1. 项目概述&#xff1a;中医知识库的数字化探索"知壹网-中医资源库"这个项目名称已经清晰地揭示了它的核心定位——一个专注于中医领域的知识聚合平台。作为一名在医疗信息化领域工作多年的从业者&#xff0c;我见证过太多昙花一现的中医数据库项目&#xff0c;而这…

2026/7/22 7:14:32 阅读更多 →
Cursor 的烂输出变成好代码,这 10 个 Prompt 改造让我省了 80% 改稿时间

Cursor 的烂输出变成好代码,这 10 个 Prompt 改造让我省了 80% 改稿时间

不是 Cursor 不够好——是你给它的信息不够好&#xff0c;它只能乱猜。 下面 10 个技巧&#xff0c;每一个都附有原理解释和 before/after 对比。全是后端场景&#xff0c;没有废话。 10 个 Cursor Prompt 技巧速查 图&#xff1a;10 个技巧按场景分类&#xff0c;按需取用 技巧…

2026/7/22 7:14:32 阅读更多 →
RocketMQ生产者核心概念与启动流程详解

RocketMQ生产者核心概念与启动流程详解

1. RocketMQ生产者核心概念解析在分布式消息系统中&#xff0c;生产者(Producer)作为消息的源头&#xff0c;承担着创建和发送消息的重要职责。RocketMQ的生产者实现基于发布-订阅模式&#xff0c;通过特定的启动流程与消息集群建立连接。让我们先理解几个关键概念&#xff1a;…

2026/7/22 7:14:32 阅读更多 →
C++异常处理:从RAII到异常安全,打造工业级健壮代码

C++异常处理:从RAII到异常安全,打造工业级健壮代码

1. 项目概述&#xff1a;为什么我们需要“后悔药”&#xff1f;在C的世界里写程序&#xff0c;就像在现实世界里开着一辆没有刹车的车。你小心翼翼地规划路线&#xff0c;但路上总会有你预料不到的坑洼、突然窜出的行人&#xff0c;或者系统本身的路面塌陷。当你的程序遇到一个…

2026/7/22 7:14:32 阅读更多 →
Dockerfile核心指令详解与最佳实践指南

Dockerfile核心指令详解与最佳实践指南

1. Dockerfile基础概念解析Dockerfile是Docker生态中的核心构建脚本&#xff0c;它本质上是一个纯文本文件&#xff0c;包含了一系列用于构建Docker镜像的指令。每一条指令都会在镜像中创建一个新的层&#xff08;layer&#xff09;&#xff0c;这些层最终堆叠形成完整的容器镜…

2026/7/22 7:13:31 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统&#xff0c;尤其是像TI C6000系列这样的高性能DSP开发中&#xff0c;我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动&#xff0c;但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案&#xff1f; 在数字化协作环境中&#xff0c;消息通知系统的重要性不言而喻明。但现实情况是&#xff0c;企业级通知方案往往需要复杂的API对接&#xff08;如企业微信、钉钉、飞书&#xff09;&#xff0c;个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点"&#xff0c;乙方听到的是"少做几页"。甲方说"不要太复杂"&#xff0c;乙方理解成"别放图表了"。结果交过去&#xff0c;甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里&#xff0c;是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻