目录
- 项目背景与目标
- 技术选型说明
- 天地图地图服务接入
- Leaflet 地图基础搭建
- 免费运动场所数据获取与处理
- 场所数据可视化标注实现
- 交互功能扩展
- 完整示例代码
- 总结与后续扩展
1. 项目背景与目标
- 目标:构建一个基于网页的互动地图,展示长沙市内的免费运动场所(如公共篮球场、健身点、跑步道等)。
- 用途:方便市民了解周边运动资源,促进健康生活方式。
- 特色:利用 Leaflet 作为轻量级开源 GIS 库,结合天地图高质量底图,实现地图可视化展示。
2. 技术选型说明
技术/工具 | 说明 |
---|---|
Leaflet | 开源 JavaScript 地图库,轻量、易用 |
天地图(Tianditu) | 中国权威的地图服务平台,支持多种地图类型 |
GeoJSON | 标准地理空间数据格式,用于存储运动场所位置 |
HTML/CSS/JS | 前端基础技术,搭建页面与交互 |
3. 天地图地图服务接入
天地图提供的地图服务接口包括矢量地图、影像地图等,支持 WMTS/XYZ 等多种协议。
- 天地图URL示例(矢量图):
http://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=你的天地图密钥
- 获取天地图密钥:需要注册天地图开发者账号并申请。
4. Leaflet 地图基础搭建
在 HTML 中引入 Leaflet 样式和脚本:
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"></script>
初始化地图示例:
const map = L.map('map').setView([28.2282, 112.9388], 12); // 长沙中心点经纬度
5. 免费运动场所数据获取与处理
- 数据来源可以是公开政府数据、开放平台API或者自己采集整理的GeoJSON文件。
- 示例结构:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "橘子洲篮球场",
"type": "篮球场",
"address": "长沙市岳麓区橘子洲头"
},
"geometry": {
"type": "Point",
"coordinates": [112.917, 28.199]
}
}
// 其他运动场所...
]
}
6. 场所数据可视化标注实现
用 Leaflet 的 L.geoJSON
加载并渲染点标注:
L.geoJSON(sportsData, {
pointToLayer: (feature, latlng) => {
return L.marker(latlng, {
icon: L.icon({
iconUrl: 'basketball-icon.png', // 根据类型可切换图标
iconSize: [32, 32]
})
});
},
onEachFeature: (feature, layer) => {
layer.bindPopup(`<strong>${feature.properties.name}</strong><br/>${feature.properties.address}`);
}
}).addTo(map);
7. 交互功能扩展
- 图层控制:切换运动场所类别图层(篮球场、跑道、健身区等)。
- 搜索功能:基于地名或场所名快速定位。
- 热力图展示:展示运动场所分布密度。
- 路径规划:引导用户步行或驾车到场所。
8. 完整示例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>长沙免费运动场所地图</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" />
<style>
#map { height: 100vh; }
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"></script>
<script>
// 初始化地图
const map = L.map('map').setView([28.2282, 112.9388], 12);
// 添加天地图矢量图底图
L.tileLayer('http://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=你的天地图密钥', {
maxZoom: 18,
subdomains: ['0','1','2','3','4','5','6','7'],
attribution: '天地图'
}).addTo(map);
// 示例运动场所GeoJSON数据
const sportsData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "橘子洲篮球场",
"type": "篮球场",
"address": "长沙市岳麓区橘子洲头"
},
"geometry": {
"type": "Point",
"coordinates": [112.917, 28.199]
}
},
{
"type": "Feature",
"properties": {
"name": "岳麓山健身区",
"type": "健身区",
"address": "长沙市岳麓区岳麓山"
},
"geometry": {
"type": "Point",
"coordinates": [112.945, 28.225]
}
}
]
};
// 加载运动场所数据
L.geoJSON(sportsData, {
pointToLayer: (feature, latlng) => {
return L.marker(latlng);
},
onEachFeature: (feature, layer) => {
layer.bindPopup(`<strong>${feature.properties.name}</strong><br/>${feature.properties.address}`);
}
}).addTo(map);
</script>
</body>
</html>
9. 总结与后续扩展
- 结合 Leaflet 与天地图,实现了长沙免费运动场所的可视化展示。
- 可以后续引入更多数据、丰富交互和美化UI。
- 进一步结合用户定位、路径规划、统计分析,打造智能运动生活地图。
如果你需要,我可以帮你写更完整的多图层管理、搜索定位、热力图绘制等进阶功能示例,或者帮你设计后端数据接口,随时告诉我!
发表回复