说明
日常随记,若有问题之处欢迎大家指正,共同进步,BIUBIUBIU~~~
目标:获取全国火车站经纬度和火车站所属城市信息
有需要数据文件的,**注意看评论区获取。创作不易,请大家点赞收藏,给我定期更新的动力Biu~Biu~Biu~**
最新进展1:我已在2024年4月更新一次数据,本次相较于2023年11月,新增了63个站点数据。
最新进展2:我已在2025年2月17更新一次数据,本次相较于2024年4月,新增了94个站点数据。
步骤说明:
第一步:获取全国火车站名称数据
网上先找到全国火车站站点数据(百度资源挺多),我这边找到的站点数据:
第二步:火车站数据预处理
对火车站数据进行预处理,转换为便于后面获取经纬度的格式。这里是直接纯前端实现,加上高德地图对于个人开发者的免费配额限制(地理编码日调用量上限5000,并发30),另外了解到高德地理编码JS API支持批量和单个两种转换模式,批量模式是调用一次接口只能转10个地点,所以将火车站数据转换为三位数组,然后遍历三位数组,逐批次调批量转换接口获取经纬度后在浏览器控制台输出(没生成文件),开发者只需每次复制下控制台的输出内容再合并起来即可。大概结果如下:
//第3层,长度为11
[
//第2层,长度为30,因为高德接口并发为30
[
//第1层,长度为10,因为高德批量接口,一次只能转10个
["北京北","北京东","北京","北京南","北京大兴","北京西","北京朝阳","重庆北","重庆","重庆南"],
["重庆西","上海","上海南","上海虹桥","上海西","天津北","天津","天津南","天津西","滨江"],
["百浪","班猫箐","北营","长春","长春南","长春西","成都东","成都南","成都","成都西"],
//...
],
//...
]
第三步:获取高德key及页面引入地图
1、先去高德开放平台注册申请个人key和安全密钥;注册好账号后,依次点击“右上角控制台-左边应用管理-我的应用-创建新应用-创建好后,选择添加Key-服务平台选择Web端(JS API)-提交”,即可获得key和安全密钥。
2、前端index.html页面内引入高德地图JS
<!--高德JS-->
<script type="text/javascript">
window._AMapSecurityConfig = {
securityJsCode:'填写申请的安全密钥',
}
</script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=填写申请的key&plugin=AMap.Geocoder"></script>
第四步:获取火车站经纬度
1、遍历3维度数组,调用”批量地理编码“接口
//高德-批量-3维度数组,需依次调11次接口
function queryStationThree() {
try{
AMap.plugin('AMap.Geocoder', function() {
const geocoder = new AMap.Geocoder({});
let stationLL= [];
let nowCur = 1;//依次将值设为1,2,3,4,5,6,7,8,9,10,11后,调11次此接口
//THREE_DIM 就是三维数组
let datas = THREE_DIM.slice(nowCur - 1,nowCur);
console.log("第",nowCur, "批次地理位置");
datas.forEach((twos, indexP) => {
twos.forEach((names, indexT) => {
const addresses = names.map(name => (`${name}站`));//批量每次最多查询10个
geocoder.getLocation(addresses, function(status, result) {
if (status === 'complete' && result.info === 'OK') {
// result中对应详细地理坐标信息,result.geocodes为批量地址地理编码数据
result.geocodes.forEach((item, index) => {
stationLL.push({
name: names[index],
lat:item?.location?.lat || '',
lng:item?.location?.lng || '',
gCode: item?.adcode || '',
gCity: item?.addressComponent?.city || '',
gCityCode:item?.addressComponent?.citycode || '',
})
});
}
})
})
})
//延迟5s,待这批300个站点经纬度获取成功后,复制控制台输出的结果即可
setTimeout(()=>{
console.log(JSON.stringify(stationLL));
console.log(stationLL.length);//前10次的长度都是300,第11次的长度为263
}, 5000);
})
}catch(e) {
console.error(e);
}
}
2、406个异常数据处理
实际在通过“批量转换”全量数据后,有些站点没有转换成功,尝试过再调批量接口转换也失败,所以改成对这些数据通过“单个转换”模式,结果证明是可以获取到的。所以这里先是对全量数据筛选,找出一场数据集合,然后根据并发30限制,将这些数据按照30个为一组,组合成二位数组
[//第2层,长度为14
[//第1层:长度为30
{"name":"钢城","lat":"","lng":"","gCode":"","gCity":"","gCityCode":""},
{"name":"广南卫","lat":"","lng":"","gCode":"","gCity":"","gCityCode":""},
{"name":"金马村","lat":"","lng":"","gCode":"","gCity":"","gCityCode":""},
//...
],
//...
]
然后遍历二维度数组,调用”单个地理编码“接口
//高德-单个-2维度数组14次
function queryStationSingle() {
try{
AMap.plugin('AMap.Geocoder', function() {
const geocoder = new AMap.Geocoder({});
let stationLL= [];
let nowCur = 1;//依次将值设为1,2,3,4,5,6,7,8,9,10,11,12,13,14后,调14次此接口
//TWO_DIM_SINGLE 就是二维数组
let datas = TWO_DIM_SINGLE.slice(nowCur - 1,nowCur);
console.log("第",nowCur, "批次地理位置");
datas[0].forEach((itemS, indexP) => {
geocoder.getLocation(`${itemS.name}站`, function(status, result) {
if (status === 'complete' && result.info === 'OK') {
let item = result.geocodes[0];
stationLL.push({
name: itemS.name,
lat:item?.location?.lat || '',
lng:item?.location?.lng || '',
gCode: item?.adcode || '',
gCity: item?.addressComponent?.city || '',
gCityCode:item?.addressComponent?.citycode || '',
})
}
})
})
//延迟5s,待这批30个站点经纬度获取成功后,复制控制台输出的结果即可
setTimeout(()=>{
console.log(JSON.stringify(stationLL));
console.log(stationLL.length);//前13次的长度都是30,第14次的长度为16
}, 5000);
})
}catch(e) {
console.error(e);
}
}
3、将两轮处理的数据进行整合,即可得到3263个站点经纬度数据集合。
最总拿到的数据为:
[//3262个
{"name":"北京北","lat":39.945258,"lng":116.353015,"gCode":"110102","gCity":"北京市","gCityCode":"010"},
{"name":"北京东","lat":39.9028,"lng":116.484487,"gCode":"110105","gCity":"北京市","gCityCode":"010"},
//...
]
总结
以上就是H5+高德地图获取到全国火车站经纬度信息的过程,处理形式上肯定非最优,仅是个人的经历记录。对于最终生成的数据文件,我已上传至网盘,如有需要的看评论区或者直接私聊我,我会尽快发送。