海拔批量查询 + 批量 KML 生成工具-WPS 插件 TableGIS 新功能

通信工程师的 WPS 地理数据处理工具箱,新增海拔查询和批量 KML 生成两大功能。


一、项目简介

TableGIS 是一个嵌入 WPS 表格的地理数据处理插件,面向无线网络优化工程师。插件集成了坐标转换、度分秒换算、距离方位角计算、扇区/覆盖圆 KML 生成等功能。最近新增了海拔批量查询独立批量 KML 生成工具两个模块。

  • 项目类型:WPS 加载项 (jsaddon)
  • 运行环境:Windows + WPS Office
  • 核心技术:JavaScript (WPS API) + C++ (Win32 原生桌面应用)

二、功能一:海拔批量查询

2.1 功能介绍

海拔查询功能可以从选中的经纬度数据批量获取海拔值,数据源为 Open-Meteo 免费高程 API(基于 SRTM 90m 精度 DEM 数据),取代手动逐个查询的繁琐过程。

2.2 使用方法

  1. 在 WPS 表格中选中两列数据(经度列 + 纬度列)
  2. 点击 TableGIS 选项卡 → 海拔查询分组 → 海拔查询按钮
  3. 等待查询完成,结果自动复制到剪贴板
  4. 在右侧空白列直接粘贴即可

2.3 技术实现

API 接口https://api.open-meteo.com/v1/elevation

请求方式为 GET,参数格式 latitude=lat1,lat2&longitude=lon1,lon2,返回 JSON:

json 复制代码
{
  "elevation": [1246.0, 64.0, 328.5]
}

核心实现:按每批次 100 个坐标分组请求,批次间延迟 1 秒避免触发频率限制。异步串行处理,全部完成后统一输出结果。

javascript 复制代码
function fetchBatch(batchIndex) {
    var batch = batches[batchIndex];
    var apiUrl = "https://api.open-meteo.com/v1/elevation?" +
        "latitude=" + batch.lats.join(",") +
        "&longitude=" + batch.lons.join(",");
    // XHR GET 请求,解析 elevation 数组
    // 批次间延迟 1 秒:setTimeout(() => fetchBatch(batchIndex + 1), 1000)
}

2.4 使用限制

限制项 说明
最大行数 100 行
列要求 恰好 2 列(经度、纬度)
坐标范围 经度 -180~180,纬度 -90~90
批次间隔 1 秒/批次,避免 API 限流
超时时间 15 秒/请求

2.5 错误处理

  • HTTP 429:提示"请求太频繁,请稍后重试"
  • HTTP 400:提示"请求参数错误"
  • HTTP 5xx:提示"服务器暂时不可用"
  • 超时:标记为"查询超时"
  • 无效坐标:标记为"无效坐标"

三、新增功能二:批量 KML 生成工具

3.1 功能介绍

批量 KML 工具是一个独立 Windows 桌面程序 (LanhanTools.exe),点击 WPS 插件中的"批量KML"按钮即可启动。支持从 CSV/XLSX 文件导入站点数据,生成符合 Google Earth / 奥维地图格式的 KML 图层文件。

3.2 程序架构

工具采用 C++ 原生 Win32 开发,无第三方 UI 框架,界面轻量(220×345 像素,置顶显示,Win11 圆角)。通过 3 个标签页处理不同 KML 场景:

复制代码
TG图层工具(左侧标签栏)
  ├── Tab 0: 路测KML    --- 信号电平 → 彩色覆盖圆 KML
  ├── Tab 1: 扇形KML    --- 工参数据 → 图标点 KML
  └── Tab 2: 模板管理  --- RSRP/SINR 颜色模板

3.3 路测 KML(Tab 0)

将路测信号数据按强度区间着色,生成圆形覆盖 KML 图层。

操作流程

  1. 点击 浏览 加载 CSV 文件(自动检测 UTF-8 BOM / UTF-16 LE / GBK 编码)
  2. 选择 经度列、纬度列、电平列(支持自动识别表头关键词:lon/lat/rssi/rsrp 等)
  3. 选择 颜色模板 或自定义范围颜色
  4. 设置覆盖圆 半径(默认 50 米)
  5. 点击 生成KML

内置颜色模板

模板名称 电平范围 (dBm)
4G城区 7段:-145-105-100-98-96-90-80~-20
4G农村 6段:-145-110-105-100-95-80-20
5G模板 6段:-145-105-98-96-93-80-20
SINR模板 6段:-145-20-30102040

模板保存为 templates.json(UTF-8 BOM 格式),存储在 exe 同级目录。每个范围的颜色可点击打开系统颜色选择器 自由设置,范围值修改后自动前后传递(改一行的最大值自动更新下一行的最小值)。支持添加/删除范围行,超过一屏自动出现滚动条。

覆盖圆生成算法

使用 Haversine 球面几何公式计算圆周上 36 个顶点的经纬度坐标,组成闭合多边形:

cpp 复制代码
double lat2 = asin(sin(lat1)*cos(d) + cos(lat1)*sin(d)*cos(bearing));
double lng2 = lng1 + atan2(sin(bearing)*sin(d)*cos(lat1),
                           cos(d) - sin(lat1)*sin(lat2));

3.4 扇形 KML(Tab 1)

适用于基站工参表的扇区覆盖可视化,生成带图标的点 KML。

图标选择器

点击"选择图标"按钮弹出图标选择窗口,提供三大类合计 300+ 种图标

图标系列 数量 示例
Pushpin 8 色 黄/绿/蓝/红/紫/橙/粉/白
Paddle 8色×38标签 空白、A-Z、0-9、星号
Shapes 86 种 医院、餐厅、机场、学校、加油站...

图标网格 8 列排列,支持滚动浏览,选中高亮蓝色边框。图标 URL 指向 Google Maps KML 官方 CDN。

KML 输出包含 <ExtendedData> 元数据标签,将 CSV 中的其他列(如站点名、地址、类型等)作为附加属性嵌入每个点位。

3.5 模板管理(Tab 2)

集中管理颜色模板。左侧下拉框选择模板,右侧列表展示所有范围(带颜色块预览),支持添加/删除/编辑范围。修改后点击"保存模板"即可持久化。

3.6 KML 输出示例

生成的 KML 文件包含按信号范围分组的 Folder 结构,每个点位一个 Placemark,Polygon 使用模板颜色填充:

xml 复制代码
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>路测覆盖图层</name>
    <Style id="range_0">
      <PolyStyle><color>ff0000ff</color></PolyStyle>
    </Style>
    <Folder>
      <name>-100 ~ -98 dBm</name>
      <Placemark>
        <name>Point 1</name>
        <styleUrl>#range_0</styleUrl>
        <Polygon>
          <altitudeMode>clampToGround</altitudeMode>
          <outerBoundaryIs>
            <LinearRing>
              <coordinates>113.264,23.129,0 ...(36 个顶点)</coordinates>
            </LinearRing>
          </outerBoundaryIs>
        </Polygon>
      </Placemark>
    </Folder>
  </Document>
</kml>

兼容平台:Google Earth / 奥维互动地图 / 图新地球 (LSV) / ArcGIS Earth / QGIS


四、WPS 插件 KML 工具组

新增功能已整合到插件"KML工具"分组,共 4 个按钮:

按钮 功能
kml临时打开 在 Google Earth 中快速预览选中坐标
扇区KML 工参表 → 扇区覆盖 KML(按频段分组着色)
覆盖圆KML 站点经纬度 → 圆形覆盖图层(可自定义半径)
批量KML 启动独立批量 KML 生成工具

五、安装方法

  1. TableGIS这里下载
  2. 关闭所有 WPS 窗口后运行安装程序
  3. 重启 WPS,顶部出现 TableGIS 选项卡

提示:安装包自动注册到 WPS 加载项目录,支持 64 位 WPS


六、参考资料


*本文由 TableGIS 插件开发者撰写。如有问题或建议,欢迎私信交流。

jiaqi0425_000@163.com

相关推荐
大神15731 小时前
重磅免费开放!基于B/S模式的Peach-Editor电子病历编辑器正式上线
javascript·编辑器·web
tedcloud1238 小时前
RTK部署教程:构建稳定的AI Workflow环境
服务器·javascript·人工智能·typescript·ocr
咩咦8 小时前
C++学习笔记28:静态成员应用:不用循环求1到n的和
c++·学习笔记·类和对象·static·构造函数·oj·静态成员
EllinY8 小时前
CF2217E Definitely Larger 题解
c++·笔记·算法·构造
筠筠喵呜喵9 小时前
Linux软件开发性能优化
linux·c++·性能优化
Bruce_kaizy9 小时前
c++ linux环境编程——文件io介绍以及open 、write 、read 三剑客深度详解
linux·服务器·c++·ubuntu·操作系统·文件io
PAK向日葵11 小时前
我用 C++ 写了一个轻量级 Python 虚拟机,刚刚开源
c++·python·开源
玖釉-11 小时前
下一个排列:从字典序到原地算法的完整推导
数据结构·c++·windows·算法
枕星而眠12 小时前
数据结构八大排序详解(一):四大简单排序
c语言·数据结构·c++·后端