使用高德API获取公交线路数据,无需代码

下面内容包括:

  1. 如何使用高德API获取线路数据,无需代码
  2. 如何将获取下来的线路数据处理成geodataframe

线路数据获取

  • 网址(高德开放平台): https://lbs.amap.com/demo/javascript-api/example/bus-info/search-bus-route
  • 打开网址后替换右侧的js代码(放在了文章的最后)
    • 替换数据: 1. 城市(js代码修改) 2. 线路(直接在面板输入)
  • 点击运行js代码(一定要点击运行,有个运行按钮),在中间的地图组件中会呈现查询到的线路,并会弹出"保存文件”,在此修改文件名,文件为json格式

线路数据处理

  • 上面的数据都是一条一条线路获取的,将其全部放在同一个文件夹
  • python代码处理
import json
import geopandas as gpd
from shapely.geometry import LineString
import glob
import math
# 读取 JSON 文件
# 获取当前目录下所有的 JSON 文件
json_files = glob.glob('./data/*.json')# 高德gcj-02 转4326
# 公交坐标数据转化
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率def gcj02towgs84(lng, lat):"""GCJ02(火星坐标系)转GPS84:param lng:火星坐标系的经度:param lat:火星坐标系纬度: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):"""判断是否在国内,不在国内不做偏移:param lng::param lat::return:"""if lng < 72.004 or lng > 137.8347:return Trueif lat < 0.8293 or lat > 55.8271:return Truereturn Falsedef coordinates(c):lng,lat = c.split(',')lng,lat = float(lng),float(lat)wlng,wlat = gcj02towgs84(lng,lat)return wlng,wlat
# 使用示例
gcj02_lng, gcj02_lat = 116.481499, 39.990475  # 示例GCJ-02坐标
wgs84_lng, wgs84_lat = gcj02towgs84(gcj02_lng, gcj02_lat)
print(f"WGS 84坐标:经度={wgs84_lng}, 纬度={wgs84_lat}")# 数据处理
# 准备用于构建 GeoDataFrame 的数据
gdf_data = []for file_path in json_files:with open(file_path, 'r') as file:# 解析 JSON 文件json_list = json.load(file)# 遍历列表中的每个字典元素for json_data in json_list:if 'path' in json_data:  # 检查每个字典元素中是否有 'path' 键line_coords = [gcj02towgs84(point['lng'], point['lat']) for point in json_data['path']]# line_string = LineString(line_coords)# line_coords = [(point['lng'], point['lat']) for point in json_data['path']]line_string = LineString(line_coords)gdf_data.append({'id': json_data.get('id', ''),'type': json_data.get('type', ''),'name': json_data.get('name', ''),'geometry': line_string})# 创建 GeoDataFrame
gdf = gpd.GeoDataFrame(gdf_data, crs='EPSG:4326')
# 显示 GeoDataFrame
gdf.plot()
gdf.to_file('./公交线路json/101-102-103_line.geojson',driver='GeoJSON',encoding='utf-8')

<!doctype html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><title>公交线路查询</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css"/> <style type="text/css">html,body,#container{height:100%;}</style>
</head>
<body>
<div id="container"></div>
<div class="input-card" style='width:18rem;'><label style='color:grey'>公交线路查询</label><div class="input-item"><div class="input-item-prepend"><span class="input-item-text" >线路名称</span></div><input id='BusLineName' type="text" value='101' ></div><input id="search" type="button" class="btn" value="查询" />
</div><script type="text/javascript"src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值&plugin=AMap.LineSearch"></script>
<script language="javascript">/** 该示例主要流程分为三个步骤* 1. 首先调用公交路线查询服务(lineSearch)* 2. 根据返回结果解析,输出解析结果(lineSearch_Callback)* 3. 在地图上绘制公交线路()*/var map = new AMap.Map("container", {resizeEnable: true,center: [116.397428, 39.90923],//地图中心点zoom: 13 //地图显示的缩放级别});var linesearch;/*公交线路查询*/function lineSearch() {var busLineName = document.getElementById('BusLineName').value;if(!busLineName) return;//实例化公交线路查询类,只取回一条路线linesearch = new AMap.LineSearch({pageIndex: 1,city: '宿迁',pageSize: 2,extensions: 'all'});//搜索“536”相关公交线路linesearch.search(busLineName, function(status, result) {map.clearMap()if (status === 'complete' && result.info === 'OK') {lineSearch_Callback(result);} else {alert(result);}});}/*公交路线查询服务返回数据解析概况*/
/*公交路线查询服务返回数据解析概况*/
function lineSearch_Callback(data) {var lineArr = data.lineInfo;var lineNum = data.lineInfo.length;if (lineNum == 0) {alert("未找到相关线路信息。");} else {for (var i = 0; i < lineNum; i++) {var pathArr = lineArr[i].path;var stops = lineArr[i].via_stops;var startPot = stops[0].location;var endPot = stops[stops.length - 1].location;if (i == 0) { // 作为示例,只绘制一条线路drawbusLine(startPot, endPot, pathArr);}}// 下载查询到的公交线路数据download(JSON.stringify(lineArr, null, 4), 'busLineData.json', 'application/json');}
}/*绘制路线*/function drawbusLine(startPot, endPot, BusArr) {//绘制起点,终点new AMap.Marker({map: map,position: startPot, //基点位置icon: "https://webapi.amap.com/theme/v1.3/markers/n/start.png",zIndex: 10});new AMap.Marker({map: map,position: endPot, //基点位置icon: "https://webapi.amap.com/theme/v1.3/markers/n/end.png",zIndex: 10});//绘制乘车的路线busPolyline = new AMap.Polyline({map: map,path: BusArr,strokeColor: "#09f",//线颜色strokeOpacity: 0.8,//线透明度isOutline:true,outlineColor:'white',strokeWeight: 6//线宽});map.setFitView();}lineSearch();document.getElementById('search').onclick = lineSearch;function download(data, filename, type) {var file = new Blob([data], {type: type});if (window.navigator.msSaveOrOpenBlob) {// IE10+window.navigator.msSaveOrOpenBlob(file, filename);} else {// Othersvar a = document.createElement("a"),url = URL.createObjectURL(file);a.href = url;a.download = filename;document.body.appendChild(a);a.click();setTimeout(function() {document.body.removeChild(a);window.URL.revokeObjectURL(url);  }, 0); }
}</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329103.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python常用函数】一文让你彻底掌握Python中的numpy.append函数

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。本文和你一起来探索Python中的append函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处…

java SSM水质历史数据可视化设计myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM水质历史数据可视化设计是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

本地部署 Ollama

本地部署 Ollama 0. Ollama 能帮我们做什么1. 下载 Ollama2. 安装 Ollama3. 使用 Ollama4. Ollama 和 Langchain 的集成 0. Ollama 能帮我们做什么 在本地启动并运行大型语言模型。 运行 Llama 2、Code Llama 和其他模型。自定义并创建自己的。 1. 下载 Ollama 访问 https:…

opencv期末练习题(6)附带解析

滑动块调整图像灰度 import cv2 import numpy as np """ 滑动块调整图像灰度1. 读取图片&#xff0c;并转为灰度图 2. 定义启动滑块和阈值滑块 3. 只有启动滑块的值为1时&#xff0c;拖动阈值滑块才生效 4. 根据阈值滑块的值实时对图像进行二值化操作 "&qu…

分布式事务理论及Seata实践

分布式事务简介 事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。事务的四个特征&#xff08;ACID&#xff09; …

element-ui table height 属性导致界面卡死

问题: 项目上&#xff0c;有个点击按钮弹出抽屉的交互, 此时界面卡死 原因分析: 一些场景下(父组件使用动态单位/弹窗、抽屉中使用), element-ui 的 table 会循环计算高度值, 导致界面卡死 github 上的一些 issues 和解决方案: Issues ElemeFE/element GitHub 官方讲是升…

Rockchip平台双屏异显功能实现(基于Android13)

Rockchip平台双屏异显功能实现(基于Android13) 1. 异显实现方案 Rockchip SDK平台支持两种不同的异显方案&#xff1a;Android Presentation和Android Activity指定屏幕启动。 使用Android Presentation方案&#xff0c;需要在APP开发中调用相应接口以使指定视图&#xff08…

SRv6简介

文章目录 SR&#xff0c;分段路由IPv6 SRv6&#xff0c;简单来理解&#xff0c;其实就是 SRIPv6。 SRv6(Segment Routing v6&#xff0c;基于IPv6转发平面的段路由)是基于源路由理念而设计的在网络上转发数据包的一种协议。其核心思想是将报文转发路径切割成不同的段&#xff…

Fowsniff

靶场搭建 遇到扫描不到的情况&#xff0c;可以尝试改靶机的网络为NAT模式&#xff0c;在靶机启动时按”esc“&#xff0c;进入Advanced options for Ubantu&#xff0c;选择recovery mode&#xff0c;选择network&#xff0c;按方向键”→“&#xff0c;OK&#xff0c;然后res…

1/7文章

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;具有运动模糊的大规模场景的混合神经绘制1、研究背景2、方法提出3、相关方法3.1、混合神经渲染模型&#xff08;Hybrid Neural Re…

第2章 JavaScript基本语法

学习目标 了解什么是变量&#xff0c;能够说出变量的概念 掌握变量的命名规则&#xff0c;能够为变量命名 掌握变量的声明与赋值&#xff0c;能够声明变量并为其赋值 熟悉数据类型的分类&#xff0c;能够说出JavaScript中有哪些数据类型 掌握常用的基本数据类型&#xff0c…

新晋程序员的2023:挫折、收获与未来展望

2023年&#xff0c;对我而言&#xff0c;是一个崭新的开端&#xff0c;也是一个丰富的挑战。毕业后&#xff0c;我跌跌撞撞走入了编程世界&#xff0c;虽然这年经历了很多坎坷&#xff0c;但也收获了许多。让我向你们介绍一下我刚毕业的这一年的编程之旅。 我与编程的故事开始…