蘇州高端網(wǎng)站建設(shè)解釋seo網(wǎng)站推廣
在現(xiàn)代城市的脈絡(luò)中,交通流量如同流動的血液,交通流量的動態(tài)變化對出行規(guī)劃和城市管理提出了更高的要求。為了應(yīng)對這一挑戰(zhàn),高德地圖推出了交通態(tài)勢查詢API,旨在為開發(fā)者提供一個強大的工具,用于實時獲取指定區(qū)域或道路的交通狀況。通過集成此API,應(yīng)用和服務(wù)可以及時響應(yīng)交通擁堵、事故等突發(fā)事件,從而幫助用戶優(yōu)化行程安排,提高出行效率,并為智能交通系統(tǒng)的構(gòu)建貢獻力量。本文聚焦于利用高德交通態(tài)勢查詢API中的矩形區(qū)域查詢功能,探索如何高效地獲取矩形范圍內(nèi)的路況信息和擁堵程度。
我們先來看一下官方的說明文檔和參數(shù)配置:交通態(tài)勢查詢-高級 API 文檔-開發(fā)指南-Web服務(wù) API | 高德地圖API
我們可以看到其中可以配置的參數(shù)有道路等級和矩形的左上右下的對角線坐標(biāo),這里的坐標(biāo)使用的需要是GCJ-02,另外對角線距離不能超過10公里,矩形區(qū)域內(nèi)交通態(tài)勢查詢:可選:JSON、XML,本文選擇了JSON格式,方便后面導(dǎo)出為shp格式,道路等級一般選擇6,這樣獲取的路況信息是最全的,有其他需求也可以自行調(diào)整;
roads可返回的所有可選道路信息;
先講一下方法思路,一共三個步驟;
方法思路
- 通過python寫一個根據(jù)中心點和半徑生成左上右下的對角線坐標(biāo)的腳本;
- 獲取對角線坐標(biāo);
- 寫入對角線坐標(biāo),并通過交通態(tài)勢查詢 API查詢數(shù)據(jù)保存到shp文件中;
第一步:根據(jù)配置中心點坐標(biāo)和半徑來生成矩形,并打印左上右下的對角線坐標(biāo);
這個需要使用高德的坐標(biāo)拾取器工具在地圖上選擇目標(biāo)區(qū)域的中心點坐標(biāo),通過配置一下中心坐標(biāo)和半徑距離,工具將自動生成左下和右上的對角線坐標(biāo);
完整代碼#運行環(huán)境 Python 3.11
from math import cos, radiansdef generate_rectangle(center_point, radius_km):"""通過中心點和半徑生成矩形范圍參數(shù):center_point: 中心點坐標(biāo) (格式: "經(jīng)度,緯度")radius_km: 半徑(單位:公里)返回:rectangle: 矩形范圍字符串 (格式: "左下角經(jīng)度,左下角緯度;右上角經(jīng)度,右上角緯度")"""try:# 解析中心點坐標(biāo)center_lon, center_lat = map(float, center_point.split(','))# 經(jīng)度1度約等于111公里,緯度1度約等于111*cos(緯度)公里# 將半徑轉(zhuǎn)換為度數(shù)lat_diff = radius_km / 111.0lon_diff = radius_km / (111.0 * cos(radians(center_lat)))# 計算矩形四個角的坐標(biāo)min_lon = center_lon - lon_diff # 左下角經(jīng)度min_lat = center_lat - lat_diff # 左下角緯度max_lon = center_lon + lon_diff # 右上角經(jīng)度max_lat = center_lat + lat_diff # 右上角緯度# 格式化為字符串,保留6位小數(shù)rectangle = f"{min_lon:.6f},{min_lat:.6f};{max_lon:.6f},{max_lat:.6f}"return rectangleexcept Exception as e:print(f"生成矩形范圍時出錯: {str(e)}")return Noneif __name__ == "__main__":# 示例:上海某點坐標(biāo)和1公里半徑center_point = "121.446433,31.22321" # 中心點坐標(biāo)radius = 2.0 # 半徑2公里# 生成矩形范圍rectangle = generate_rectangle(center_point, radius)if rectangle:print(f"中心點: {center_point}")print(f"半徑: {radius}公里")print(f"矩形范圍: {rectangle}")
將生成的左上和右下對角線坐標(biāo)應(yīng)用于下一個腳本中進行運行就可以得到shp文件,因為數(shù)據(jù)獲取限制,獲取半徑最好不要超過5公里;
第二步:輸入坐標(biāo)點參數(shù)后,通過高德地圖的交通態(tài)勢查詢API獲取結(jié)果并導(dǎo)出為JSON格式,并由JSON數(shù)據(jù)將被轉(zhuǎn)換為SHP文件導(dǎo)出,由于高德地圖使用的是GCJ-02坐標(biāo)系,因此在導(dǎo)出前腳本已自動將坐標(biāo)轉(zhuǎn)換為WGS84坐標(biāo)系;
完整代碼#運行環(huán)境 Python 3.11
import requests
import geopandas as gpd
from shapely.geometry import LineString
from datetime import datetime
import os
import math
import numpy as np
from shapely.ops import transform
from functools import partial# 坐標(biāo)轉(zhuǎn)換參數(shù)
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 長半軸
ee = 0.00669342162296594323 # 扁率def gcj02towgs84(lng, lat):"""GCJ02(火星坐標(biāo)系)轉(zhuǎn)GPS84:param lng:火星坐標(biāo)系的經(jīng)度:param lat:火星坐標(biāo)系緯度:return:"""if out_of_china(lng, lat):return lng, latdlat = transformlat(lng - 105.0, lat - 35.0)dlng = transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]def transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0return retdef transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0return retdef out_of_china(lng, lat):"""判斷是否在國內(nèi),不在國內(nèi)不做偏移"""if lng < 72.004 or lng > 137.8347:return Trueif lat < 0.8293 or lat > 55.8271:return Truereturn Falsedef transform_geometry(geom):"""轉(zhuǎn)換幾何對象的坐標(biāo)"""def transform_coords(x, y, z=None):wgs_x, wgs_y = gcj02towgs84(x, y)return wgs_x, wgs_yreturn transform(transform_coords, geom)def get_and_save_traffic_status(rectangle, key='你的key', output_dir='output'):try:# 初始化數(shù)據(jù)字典data = {'name': [],'status': [], # 路況狀態(tài)碼 (將轉(zhuǎn)換為double)'direction': [],'angle': [],'speed': [],'geometry': []}# 構(gòu)建API請求URLurl = f'https://restapi.amap.com/v3/traffic/status/rectangle?rectangle={rectangle}&output=json&extensions=all&key={key}&level=6'# 發(fā)送請求并獲取JSON響應(yīng)res = requests.get(url, timeout=10).json()# 遍歷每條道路數(shù)據(jù)for road in res['trafficinfo']['roads']:try:polylines = [(float(y[0]), float(y[1])) for y in[x.split(',') for x in road['polyline'].split(';')]]# 創(chuàng)建線幾何對象line = LineString(polylines)# 轉(zhuǎn)換為WGS84坐標(biāo)系wgs84_line = transform_geometry(line)data['geometry'].append(wgs84_line)data['name'].append(road.get('name', ''))# 將status轉(zhuǎn)換為float類型data['status'].append(float(road.get('status', '0')))data['direction'].append(road.get('direction', ''))data['angle'].append(float(road.get('angle', 0)))data['speed'].append(int(road.get('speed', 0)))except:continue# 創(chuàng)建GeoDataFrame對象gdf = gpd.GeoDataFrame(data, geometry='geometry', crs='EPSG:4326')# 確保status列為float64類型gdf['status'] = gdf['status'].astype(np.float64)# 創(chuàng)建輸出目錄os.makedirs(output_dir, exist_ok=True)# 生成文件名filename = f'traffic_status_{datetime.now().strftime("%Y%m%d%H%M%S")}_wgs84.shp'# 保存為shapefileoutput_path = os.path.join(output_dir, filename)gdf.to_file(output_path, encoding='utf-8')print(f"已保存WGS84坐標(biāo)系數(shù)據(jù)到: {output_path}")except Exception as e:print(f"處理出錯: {str(e)}")if __name__ == "__main__":rectangle = '121.425363,31.205192;121.467503,31.241228' # 替換生成的坐標(biāo)get_and_save_traffic_status(rectangle)
這里結(jié)果會保存在腳本所在目錄的output/traffic_status_2025xxxxxx_wgs84.shp,直接把導(dǎo)出結(jié)果在arcgis加載即可,其中的status字段是路況字段,在可視化的過程中,符號系統(tǒng)字段選擇status字段,這樣我們就可以在圖上直觀的看出擁堵的位置區(qū)域;
status | 路況 | 0:未知;1:暢通;2:緩行;3:擁堵 |
數(shù)據(jù)更新頻率參考高德的擁堵延時指數(shù)應(yīng)該是5分鐘自動刷新,可以通過增加腳本定時自動運行的邏輯來實現(xiàn)全時段監(jiān)測;
文章僅用于分享個人學(xué)習(xí)成果與個人存檔之用,分享知識,如有侵權(quán),請聯(lián)系作者進行刪除。所有信息均基于作者的個人理解和經(jīng)驗,不代表任何官方立場或權(quán)威解讀。