1. 项目简介
本工具支持通过高德地图API实现Excel批量地址转坐标、坐标转地址,并可在地图上可视化标记,支持表格内容编辑、导出。适用于地理信息批量处理、数据校验等场景。
2. 功能概述
- Excel文件上传,自动解析表头和数据。
- 地址转坐标:批量将地址列转为经纬度坐标。
- 坐标转地址:批量将坐标列转为详细地址。
- 地图可视化:所有结果可在高德地图上自动标记。
- 表格可编辑:所有单元格(包括坐标、地址)均可直接编辑。
- 城市代码自定义:支持下拉/输入选择城市,自动切换地理编码范围。
- 导出Excel:可导出编辑后的完整数据。
- 进度与状态提示:操作过程有进度条和状态提示。
3. 使用步骤
3.1 获取高德地图Web服务Key
- 注册并登录高德开放平台.
- 创建应用,获取Web服务Key。
3.2 打开工具页面
- 在页面顶部输入你的高德地图Web服务Key,点击“更新Key”。
- 选择或输入城市(支持下拉和手动输入),点击“更新城市”。
3.3 上传Excel文件
- 拖拽或点击选择Excel文件(支持
.xlsx、.xls)。 - 文件上传后,自动解析表头和数据,显示在表格中。
3.4 地址转坐标
- 在“选择地址列”下拉框中选择包含地址的列。
- 点击“获取坐标”,系统自动批量获取经纬度,进度条实时显示。
- 获取到的坐标会自动填入表格,并在地图上标记。
3.5 坐标转地址
- 在“选择坐标列”下拉框中选择包含坐标的列。
- 点击“获取地址”,系统自动批量获取详细地址,进度条实时显示。
- 获取到的地址会自动填入表格,并在地图上标记。
3.6 表格编辑与导出
- 所有单元格会在最后新增两列(包括坐标、地址)均可直接编辑,内容实时同步。
- 点击“导出Excel”可导出当前编辑后的完整数据。
4. 注意事项
- API Key和城市请根据实际需求填写,避免频繁请求导致高德API限流。
- 城市选择支持下拉和手动输入,常用城市已内置,更多城市可自行扩展。
- 地图边界已放大为中国全境,可自由拖拽查看全国范围。
- 支持大批量数据处理,虽然做了
随机延迟功能,但还是建议分批操作以防API限流。
5. 代码实现
系统操作截图:
下面为完整的前端HTML+JS代码,直接保存为
html即可使用。
模拟数据以扬州为例
城市编码也可以使用中文,如:扬州市、321、32100。详细接口文档参考高德web服务地址解析
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Excel地址坐标转换工具</title>
<!-- 引入高德地图JavaScript API -->
<script
type="text/javascript"
src="https://webapi.amap.com/maps?v=1.4.15&key=7cad1eef18edbb65ef7060e41a70e45f"
></script>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.header {
background: white;
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
.api-key-section {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 15px;
}
.api-key-section input {
flex: 1;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
.api-key-section button {
padding: 8px 15px;
background-color: #28a745;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.api-key-section button:hover {
background-color: #218838;
}
.main-container {
display: flex;
gap: 20px;
height: calc(100vh - 160px);
}
.left-panel {
width: 50vw;
min-width: 350px;
max-width: 50vw;
background: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column;
}
.right-panel {
width: 50vw;
min-width: 350px;
max-width: 50vw;
background: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
overflow: hidden;
display: flex;
flex-direction: column;
}
.upload-section {
border: 2px dashed #ccc;
padding: 8px 10px;
text-align: center;
margin: 12px 20px 8px 20px;
border-radius: 8px;
font-size: 14px;
}
.upload-section.dragover {
border-color: #007bff;
background-color: #f8f9fa;
}
.controls {
margin: 0 20px 10px 20px;
padding: 10px;
background-color: #f8f9fa;
border-radius: 5px;
}
.controls select,
.controls button {
margin: 5px;
padding: 8px 15px;
border: 1px solid #ddd;
border-radius: 4px;
}
.controls button {
background-color: #007bff;
color: white;
cursor: pointer;
}
.controls button:hover {
background-color: #0056b3;
}
.controls button:disabled {
background-color: #6c757d;
cursor: not-allowed;
}
.progress {
margin: 0 20px 10px 20px;
padding: 8px;
background-color: #e9ecef;
border-radius: 4px;
display: none;
}
.progress-bar {
width: 100%;
height: 18px;
background-color: #dee2e6;
border-radius: 10px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background-color: #007bff;
width: 0%;
transition: width 0.3s ease;
}
.table-container {
flex: 1;
margin: 0 20px 20px 20px;
overflow-y: auto;
border: 1px solid #ddd;
border-radius: 4px;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
th,
td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
height: 36px;
min-width: 80px;
max-width: 300px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
position: relative;
}
.table-input {
width: 100%;
height: 100%;
border: none;
background: transparent;
padding: 0 4px;
font-size: 12px;
box-sizing: border-box;
outline: none;
}
th {
background-color: #f2f2f2;
font-weight: bold;
position: sticky;
top: 0;
z-index: 10;
}
.status {
margin: 0 20px 10px 20px;
padding: 8px;
border-radius: 4px;
}
.status.success {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.status.error {
background-color: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.status.info {
background-color: #d1ecf1;
color: #0c5460;
border: 1px solid #bee5eb;
}
#map {
width: 100%;
flex: 1;
min-height: 400px;
height: 100%;
}
.map-info {
padding: 12px 15px;
background-color: #f8f9fa;
border-bottom: 1px solid #dee2e6;
}
.map-info h3 {
margin: 0 0 8px 0;
color: #495057;
}
.map-info p {
margin: 4px 0;
color: #6c757d;
font-size: 13px;
}
</style>
</head>
<body>
<!-- 头部区域 -->
<div class="header">
<h1>Excel地址坐标转换工具</h1>
<div class="api-key-section">
<label for="apiKeyInput">高德地图Web服务Key:</label>
<input type="text" id="apiKeyInput" placeholder="请输入您的高德地图Web服务Key" />
<button onclick="updateApiKey()">更新Key</button>
<label for="cityCodeInput">城市:</label>
<input
list="cityList"
id="cityCodeInput"
placeholder="请输入城市名或代码"
value="扬州市"
style="width: 120px"
/>
<datalist id="cityList">
<option value="北京市" data-code="010"></option>
<option value="上海市" data-code="021"></option>
<option value="广州市" data-code="020"></option>
<option value="深圳市" data-code="0755"></option>
<option value="南京市" data-code="025"></option>
<option value="扬州市" data-code="321"></option>
<option value="重庆市" data-code="023"></option>
<option value="天津市" data-code="022"></option>
<option value="成都市" data-code="028"></option>
<option value="西安市" data-code="029"></option>
<option value="武汉市" data-code="027"></option>
<option value="苏州市" data-code="0512"



最低0.47元/天 解锁文章
9942

被折叠的 条评论
为什么被折叠?



