2023年全国村级点位矢量制作思路与分享
引言
遇到一个网友提问,是需要所在地区的村经纬度.
因此分享一下我自己在前几个月制作的2023年全国村级点位数据的制作过程和相关数据。
处理思路
要知道全国村的分布情况,那首先我们需要知道都有哪些村?可以通过统计局的网站查询。
那有了村的名字,又怎么获取村的坐标了?地理编码。
因此,我们需要先获取村名字,再进行编码,就可以获取村的分布点位矢量了。
处理步骤
获取村级名称
打开统计局的网站(https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html),就可以查看各个行政区域的名称、隶属关系和区划代码了:
这个网页并没有反爬手段,而且都只是简单的html标签,所以是可以批量获取的。获取后的数据还需要经过一些数据清洗工作,才能进行地理编码。
我已经把几个年份的弄好了,有需要可以看我的这个github仓库https://github.com/ruiduobao/gaode_MAP_CUN ,在CUN这个文件夹直接下载:
因为全国同名村非常多,处理后的表格应该用全名:
地理编码
有了村的名称后,我们就可以使用高德的地理编码来获取村级矢量的分布了。
首先去高德开放平台(https://lbs.amap.com/)注册开发者账号,
获取高德的key,普通用户有5000次免费额度。我找朋友搞了一个企业账户,是30万次(有条件可以搞个企业版)。
地理编码部分,我写了个代码来获取点位的经纬度,可以参考一下:
import pandas as pd
import requests
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor, as_completed
# 高德API的配置
GAODE_API_KEY = ''
GAODE_GEOCODE_URL = 'https://restapi.amap.com/v3/geocode/geo'
OUTPUT_DIR = r'F:\ruiduobao\map.ruiduobao.com\单个csv'
CSV_PATH = r'F:\ruiduobao\map.ruiduobao.com\1.原始数据area_code_2023_cun1.csv'
# 读取CSV文件
df = pd.read_csv(CSV_PATH)
# 定义获取经纬度的函数
def get_location(row):
full_name = row['全名']
url = f"{GAODE_GEOCODE_URL}?address={full_name}&key={GAODE_API_KEY}"
try:
response = requests.get(url)
if response.status_code == 200:
geocode_data = response.json()
if geocode_data and geocode_data['geocodes']:
location = geocode_data['geocodes'][0]['location']
return location.split(',')
else:
return ('获取失败', '获取失败')
else:
return ('获取失败', '获取失败')
except requests.RequestException:
return ('获取失败', '获取失败')
# 使用线程池来加速请求处理
with ThreadPoolExecutor(max_workers=30) as executor: # 可以调整max_workers参数来增加或减少线程数
# 将每一行数据提交给线程池
futures = [executor.submit(get_location, row) for index, row in df.iterrows()]
# 初始化进度条
progress = tqdm(as_completed(futures), total=len(futures), desc="Processing", unit="row")
# 收集结果,并且在进度条中更新进度
for future in progress:
result = future.result() # 获取线程结果
index = futures.index(future) # 获取任务对应的索引
try:
longitude, latitude = result
df.at[index, '经度'] = longitude
df.at[index, '纬度'] = latitude
except Exception as exc:
df.at[index, '经度'] = '获取失败'
df.at[index, '纬度'] = '获取失败'
print(f"{index} generated an exception: {exc}")
# 写回更新后的CSV文件
df.to_csv(CSV_PATH, index=False)
火星坐标系转换
由于我国行业政策原因,通过地理编码获取的经纬度是火星坐标系,有偏移,下面绿色点是通过高德获取到的村级点位(有偏移),红色是wgs84坐标系。
把火星坐标转为WGS84的工具,我比较推荐Geohy,但是这个工具的官方在线版本已经不提供转wgs84
但我们可以在github上找未改动的geohey的版本(https://github.com/ruiduobao/qgis-geohey-toolbox),下载插件再本地安装,即可使用。
全国大概是60多万个村级点,等待10分钟左右即可全部转为wgs84的矢量。
数据分享
这个是我已经处理好的村级点位数据。
百度云数据链接:https://pan.baidu.com/s/1xYjoA5ZVFJAytQ110ZNQaw?pwd=4444
提取码:4444
总结
总结一下技术路线,要获取全国村级点位矢量,需要:
(1)统计局先获得全国各级行政区名称和代码名称(用爬虫或者github)
(2)用高德的地理编码,获取每一个村级点的经纬度(火星坐标系)
(3)将火星坐标系再转为WGS84坐标系,有多种工具可以选择,这里我使用的qgis插件geohey。