Python应用指南:利用高德地图API实现路径规划

高德路径规划API是一套基于HTTP协议的接口服务,旨在为开发者提供便捷的路径规划解决方案。该API支持多种出行方式,包括步行、公交和驾车,能够满足不同场景下的路径查询需求。通过调用这些API,用户可以获得从起点到终点的最优路径建议,以及详细的行驶距离和预计时间等信息。API返回的数据格式灵活,支持JSON和XML两种格式,便于开发者根据自身应用的需求进行解析和处理。

本篇文章就来实现对高德路径API的调用,并展示如何处理返回的数据,最终实现路径规划结果的可视化呈现。

先讲一下方法思路,一共三个步骤;

方法思路

  1. 确认不同路径规划 API URL数据结构,并根据配置参数构建请求URL
  2. 坐标转换——高德坐标系(GCJ-02) to WGS84
  3. 输出shp图层和csv结果

我们先看步行的路径规划的请求API:路径规划-基础 API 文档-开发指南-Web服务 API|高德地图API

https://restapi.amap.com/v3/direction/walking?origin=116.434307,39.90909&destination=116.434446,39.90816&key=<用户的key>

参考服务示例,我们需要输入并配置的参数包括key,orign(起点坐标)、desination(终点坐标)、output 选json、origin_id (起点 POI ID)与destination_id (目的地 POI ID)填不填都可以,有需求的可以填一下,可以提高路径规划的精度。

        parameters = {'key': api_key,'origin': from_location,'destination': to_location,'output': 'json'}

首先通过高德API拾取坐标器拾取需要研究的路径的起末点坐标:坐标拾取器 | 高德地图API,这里挑了两个起末点坐标作为示例;

('121.430041,31.154579', '121.318910,31.193987'),  # 上海南站 -> 虹桥火车站
('121.492466,31.225879', '121.508419,31.084134'),  # 人民广场 -> 复旦大学

步行路径规划

步行路径规划 API 可以规划100km 以内的步行通勤方案,并且返回通勤方案的数据。最大支持 100km 的步行路线规划;

完整代码#运行环境Python 3.11

# -*- coding: utf-8 -*-
import requests
import json
import geopandas as gpd
import pandas as pd
from shapely.geometry import LineString, Point
import glob
import math# 高德GCJ02(火星坐标系)转GPS84
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, wlatdef route_planning(api_key, routes):all_gdfs = []all_dfs = []for i, (from_location, to_location) in enumerate(routes):url = 'https://restapi.amap.com/v3/direction/walking'parameters = {'key': api_key,'origin': from_location,'destination': to_location,'output': 'json'}response = requests.get(url, params=parameters)data = json.loads(response.text)if data['status'] == '1':route = data['route']paths = route['paths']if paths:path = paths[0]distance = path['distance']duration = path['duration']steps = path['steps']print(f"步行路线规划 {i+1}:")all_coordinates = []step_data = []for step in steps:instruction = step['instruction']distance = step['distance']duration = step['duration']polyline = step['polyline']print(f"指令: {instruction}, 距离: {distance}米, 时间: {duration}秒, 路径: {polyline}")# 转换坐标coordinates_list = [coordinates(c) for c in polyline.split(';')]all_coordinates.extend(coordinates_list)# 将数据添加到列表step_data.append({'指令': instruction,'距离': distance,'时间': duration,'路径': polyline})# 创建LineStringgeometry = LineString(all_coordinates)# 创建GeoDataFramegdf = gpd.GeoDataFrame(index=[i], geometry=[geometry])gdf['distance'] = distancegdf['duration'] = durationgdf['route_id'] = i  # 添加一个标识符来区分不同的路线# 保存为SHP文件gdf.to_file(f'route_{i}.shp', driver='ESRI Shapefile')# 保存为CSV文件df = pd.DataFrame(step_data)df['route_id'] = i  # 添加一个标识符来区分不同的路线df['label'] = f'步行路线规划{i+1}'  # 添加标签df.to_csv(f'route_{i}.csv', index=False, encoding='utf-8-sig')all_gdfs.append(gdf)all_dfs.append(df)print(f"路径 {i+1} 已保存为 route_{i}.shp 和 route_{i}.csv")else:print(f"未找到路径 {i+1}")else:print(f"路线规划失败 {i+1}: {data['info']}")# 合并所有GeoDataFramecombined_gdf = gpd.GeoDataFrame(pd.concat(all_gdfs, ignore_index=True))combined_gdf.to_file('combined_routes.shp', driver='ESRI Shapefile')# 合并所有DataFramecombined_df = pd.concat(all_dfs, ignore_index=True)combined_df.to_csv('combined_routes.csv', index=False, encoding='utf-8-sig')print("所有路径已合并并保存为 combined_routes.shp 和 combined_routes.csv")if __name__ == '__main__':api_key = '你的key'  # 替换为你的高德地图API密钥# 定义多个起终点对routes = [('121.430041,31.154579', '121.318910,31.193987'),  # 上海南站 -> 虹桥火车站('121.492466,31.225879', '121.508419,31.084134'),  # 人民广场 -> 复旦大学# 可以继续添加更多的起终点对]route_planning(api_key, routes)

结果会输出每个路径的单独shp和csv,和合并后的结果为 combined_routes.shp 和 combined_outes.csv;

在调用高德路径规划API并获取到步行路径的详细数据后,我们可以将这些数据在地图上进行可视化,看到步行的具体路径;

同样的,驾车路径规划参考服务示例,我们需要输入并配置的参数包括key、orign(起点坐标)、desination(终点坐标)、output 选json,其他的例如waypoints(途径点)、province(车牌)、strategy(驾车选择策略,驾车策略有20种,详见文档,本脚本选择是''11'')等一些参数,可以参考高德的API文档进行配置,这里不再赘述;

驾车路径规划

驾车路径规划 API 可以规划以小客车、轿车通勤出行的方案,并且返回通勤方案的数据。

完整代码#运行环境Python 3.11

# -*- coding: utf-8 -*-
import requests
import json
import geopandas as gpd
import pandas as pd
from shapely.geometry import LineString, Point
import math# 高德GCJ02(火星坐标系)转GPS84
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, wlatdef driving_planning(api_key, routes):all_gdfs = []all_dfs = []for i, (from_location, to_location) in enumerate(routes):url = 'https://restapi.amap.com/v3/direction/driving'parameters = {'key': api_key,'origin': from_location,'destination': to_location,'strategy': '11','output': 'json'}response = requests.get(url, params=parameters)data = json.loads(response.text)if data['status'] == '1':route = data['route']paths = route['paths']if paths:path = paths[0]distance = path['distance']duration = path['duration']steps = path['steps']print(f"驾车路线规划 {i+1}:")all_coordinates = []step_data = []for step in steps:instruction = step['instruction']distance = step['distance']duration = step['duration']polyline = step['polyline']print(f"指令: {instruction}, 距离: {distance}米, 时间: {duration}秒, 路径: {polyline}")# 转换坐标coordinates_list = [coordinates(c) for c in polyline.split(';')]all_coordinates.extend(coordinates_list)# 将数据添加到列表step_data.append({'指令': instruction,'距离': distance,'时间': duration,'路径': polyline})# 创建LineStringgeometry = LineString(all_coordinates)# 创建GeoDataFramegdf = gpd.GeoDataFrame(index=[i], geometry=[geometry])gdf['distance'] = distancegdf['duration'] = durationgdf['route_id'] = i  # 添加一个标识符来区分不同的路线# 保存为SHP文件gdf.to_file(f'driving_route_{i}.shp', driver='ESRI Shapefile')# 保存为CSV文件df = pd.DataFrame(step_data)df['route_id'] = i  # 添加一个标识符来区分不同的路线df['label'] = f'驾车路线规划{i+1}'  # 添加标签df.to_csv(f'driving_route_{i}.csv', index=False, encoding='utf-8-sig')all_gdfs.append(gdf)all_dfs.append(df)print(f"路径 {i+1} 已保存为 driving_route_{i}.shp 和 driving_route_{i}.csv")else:print(f"未找到路径 {i+1}")else:print(f"路线规划失败 {i+1}: {data['info']}")# 合并所有GeoDataFramecombined_gdf = gpd.GeoDataFrame(pd.concat(all_gdfs, ignore_index=True))combined_gdf.to_file('combined_driving_routes.shp', driver='ESRI Shapefile')# 合并所有DataFramecombined_df = pd.concat(all_dfs, ignore_index=True)combined_df.to_csv('combined_driving_routes.csv', index=False, encoding='utf-8-sig')print("所有路径已合并并保存为 combined_driving_routes.shp 和 combined_driving_routes.csv")if __name__ == '__main__':api_key = '你的key'  # 替换为你的高德地图API密钥# 定义多个起终点对routes = [('121.596168,31.194734', '121.42837,31.230395'),  # 示例起终点('121.387047,31.108427', '121.506295,31.281965'),  # 示例起终点# 可以继续添加更多的起终点对]driving_planning(api_key, routes)

同样的 ,结果会输出每个路径的单独shp和csv,和合并后的结果为 combined_driving_routes.shp 和 combined_driving_routes.csv,在调用高德路径规划API并获取到驾车路径的详细数据后,我们可以将这些数据在地图上进行可视化,看到驾车的具体路径;

骑行路径规划参考服务示例,我们需要参数就更少了,只需要输入并配置的参数包括key、orign(起点坐标)、desination(终点坐标)、output 选json即可;

骑行路径规划

骑行路径规划用于规划骑行通勤方案,规划时会考虑天桥、单行线、封路等情况。最大支持 500km 的骑行路线规划。

完整代码#运行环境Python 3.11

# -*- coding: utf-8 -*-
import requests
import json
import geopandas as gpd
import pandas as pd
from shapely.geometry import LineString, Point
import math# 高德GCJ-02坐标转换为WGS-84坐标
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率def gcj02towgs84(lng, lat):"""将GCJ-02坐标转换为WGS-84坐标。:param lng: 火星坐标系的经度:param lat: 火星坐标系的纬度:return: WGS-84坐标系的经度和纬度"""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):"""计算坐标偏移量(纬度方向)。:param lng: 经度:param lat: 纬度:return: 纬度偏移量"""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):"""计算坐标偏移量(经度方向)。:param lng: 经度:param lat: 纬度:return: 经度偏移量"""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):"""将字符串形式的坐标转换为浮点数,并进行坐标转换。:param c: 坐标字符串,格式为 "经度,纬度":return: 转换后的WGS-84坐标"""lng, lat = c.split(',')lng, lat = float(lng), float(lat)wlng, wlat = gcj02towgs84(lng, lat)return wlng, wlatdef bicycling_planning(api_key, routes):"""实现骑行路径规划,并将结果保存为SHP和CSV文件。:param api_key: 高德地图API密钥:param routes: 起终点对列表,每个元素是一个元组 (from_location, to_location)"""all_gdfs = []all_dfs = []for i, (from_location, to_location) in enumerate(routes):# 构建请求URL和参数url = 'https://restapi.amap.com/v4/direction/bicycling'parameters = {'key': api_key,'origin': from_location,'destination': to_location,'output': 'json'}# 发送请求response = requests.get(url, params=parameters)data = json.loads(response.text)if data['errcode'] == 0:# 获取路径规划数据paths = data['data']['paths']if paths:path = paths[0]distance = path['distance']duration = path['duration']steps = path['steps']print(f"骑行路线规划 {i+1}:")all_coordinates = []step_data = []for step in steps:instruction = step['instruction']road = step['road']distance = step['distance']duration = step['duration']polyline = step['polyline']print(f"指令: {instruction}, 道路: {road}, 距离: {distance}米, 时间: {duration}秒, 路径: {polyline}")# 转换坐标coordinates_list = [coordinates(c) for c in polyline.split(';')]all_coordinates.extend(coordinates_list)# 将数据添加到列表step_data.append({'指令': instruction,'道路': road,'距离': distance,'时间': duration,'路径': polyline})# 创建LineStringgeometry = LineString(all_coordinates)# 创建GeoDataFramegdf = gpd.GeoDataFrame(index=[i], geometry=[geometry])gdf['distance'] = distancegdf['duration'] = durationgdf['route_id'] = i  # 添加一个标识符来区分不同的路线# 保存为SHP文件gdf.to_file(f'bicycling_route_{i}.shp', driver='ESRI Shapefile')# 保存为CSV文件df = pd.DataFrame(step_data)df['route_id'] = i  # 添加一个标识符来区分不同的路线df['label'] = f'骑行路线规划{i+1}'  # 添加标签df.to_csv(f'bicycling_route_{i}.csv', index=False, encoding='utf-8-sig')all_gdfs.append(gdf)all_dfs.append(df)print(f"路径 {i+1} 已保存为 bicycling_route_{i}.shp 和 bicycling_route_{i}.csv")else:print(f"未找到路径 {i+1}")else:print(f"路线规划失败 {i+1}: {data['errmsg']}")# 合并所有GeoDataFramecombined_gdf = gpd.GeoDataFrame(pd.concat(all_gdfs, ignore_index=True))combined_gdf.to_file('combined_bicycling_routes.shp', driver='ESRI Shapefile')# 合并所有DataFramecombined_df = pd.concat(all_dfs, ignore_index=True)combined_df.to_csv('combined_bicycling_routes.csv', index=False, encoding='utf-8-sig')print("所有路径已合并并保存为 combined_bicycling_routes.shp 和 combined_bicycling_routes.csv")if __name__ == '__main__':api_key = '你的key'  # 替换为你的高德地图API密钥# 定义多个起终点对routes = [('121.481453,31.154145', '121.534596,31.233022'),  # 示例起终点('121.49956,31.240278', '121.569872,31.328836'),  # 示例起终点# 可以继续添加更多的起终点对]# 调用骑行路径规划函数bicycling_planning(api_key, routes)

同样的 ,结果会输出每个路径的单独shp和csv,和合并后的结果为 combined_bicycling_routes.shp 和 combined_bicycling_routes.csv,在调用高德路径规划API并获取到骑行路径的详细数据后,我们可以将这些数据在地图上进行可视化,看到骑行的具体路径;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

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

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

相关文章

Flink CDC系列之:理解学习Kubernetes模式

Flink CDC系列之&#xff1a;理解学习Kubernetes模式 准备会话模式启动会话集群设置 Flink CDC提交 Flink CDC Job Kubernetes 是一种流行的容器编排系统&#xff0c;用于自动化计算机应用程序的部署、扩展和管理。Flink 的原生 Kubernetes 集成允许您直接在正在运行的 Kuberne…

SOEM(EtherCAT)主站API梳理

1. 适配器管理 ec_adaptert * ec_find_adapters(void); 功能&#xff1a;查找并返回系统中所有可用的EtherCAT适配器的列表。返回值&#xff1a;指向适配器列表的指针。如果没有找到适配器&#xff0c;则返回NULL。void ec_free_adapters(ec_adaptert * adapter); 功能&#x…

Taro React-Native Android apk 打包

一、打包 react native 之打包 Android的apk - 创客未来 - 博客园 react native 打包成Android 的apk安装包有两种方式&#xff0c;第一种方式是利用 Android studio 打包这里就不接介绍了。第二种是利用 react native 自身项目打包 1、生成签名 再一个空文件夹打开CMD&…

DevOps和CI/CD以及在微服务架构中的作用

DevOps 和 CI/CD 是现代软件开发和运维中两个重要的概念,它们之间有紧密的联系,但也有不同的侧重点。以下是对这两个概念的详细介绍和比较。 1. DevOps 定义: DevOps 是一种文化、运动和实践,旨在通过促进开发(Development)和运维(Operations)团队之间的协作,提升软…

深度学习数学基础之偏导数

深度学习数学基础之偏导数 偏导数的详细解释与实例 定义 偏导数是多变量函数对其中一个变量的导数&#xff0c;同时固定其他变量。它是研究函数在多维空间内各个方向上局部变化性质的基本工具。对于函数 ( f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1​,x2​…

大数据之Kafka集群的安装部署

Kafka集群的安装部署是一个相对复杂但有序的过程&#xff0c;涉及多个步骤和配置。以下是一个详细的Kafka集群安装部署指南&#xff1a; 一、前期准备 硬件与软件要求 确保集群中的每台服务器都满足Kafka的硬件要求&#xff0c;包括CPU、内存和磁盘空间。安装Java运行时环境&a…

论文阅读(二十三):Squeeze-and-Excitation Networks

文章目录 1.介绍2.原理3.代码4.SE模块的应用 论文&#xff1a;Squeeze-and-Excitation Networks   论文链接&#xff1a;Squeeze-and-Excitation Networks   代码链接&#xff1a;Github 1.介绍 卷积算子使网络能够在每一层的局部感受野中融合空间&#xff08;spatial&…

视频智能分析平台LiteAIServer摄像机视频分析软件下载检测工业排污

在全球环境保护与可持续发展的大潮中&#xff0c;工业排污的有效监控与管理成为了衡量一个国家或地区绿色发展能力的重要指标。面对这一挑战&#xff0c;视频智能分析平台LiteAIServer以其创新的技术手段&#xff0c;为工业排污监管开辟了新路径&#xff0c;展现了科技在环保领…

《MYSQL实战45讲》将脏页刷进磁盘时导致的性能抖动

脏页 当修改数据时&#xff0c;如果数据在内存中&#xff0c;就会直接在内存中修改&#xff0c;并且将操作记录在redolog中&#xff0c;这时就可以直接返回了。这时这个内存中的数据页与磁盘中的数据是不同的&#xff0c;称为脏页。 flush Mysql将内存中的脏页刷新到磁盘称为…

【git】 git 删除了文件,如何找回

git 删除了文件&#xff0c;如何找回 使用 git revert 并不是恢复误删除文件的最佳方法&#xff0c;因为 git revert 通常用于撤销已经提交的更改&#xff08;生成一个反向提交&#xff09;。如果你误删除了文件&#xff0c;还未提交更改&#xff0c;或者已经提交但想恢复删除…

【Unity基础】初识UI Toolkit - 运行时UI

Unity中的UI工具包&#xff08;UI Toolkit&#xff09;不但可以用于创建编辑器UI&#xff0c;同样可以来创建运行时UI。 关于Unity中的UI系统以及使用UI工具包创建编辑器UI可以参见&#xff1a; 1. Unity中的UI系统 2. 初识UI Toolkit - 编辑器UI 本文将通过一个简单示例来…

Nginx 迁移到 Caddy:一次完整的反向代理配置迁移实践

文章目录 从零开始&#xff1a;Ubuntu 系统 Nginx 迁移到 Caddy 的完整指南一、背景介绍二、为什么选择 Caddy&#xff1f;三、安装 Caddy1. 使用官方包仓库安装2. 验证安装3. 配置系统服务 四、配置文件位置五、从 Nginx 迁移配置1. 原 Nginx 配置分析2. 转换为 Caddy 配置 六…

Docker Compose一键部署Spring Boot + Vue项目

目录 前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) …

动态代理:面向接口编程,屏蔽RPC处理过程

RPC远程调用 使用 RPC 时&#xff0c;一般的做法是先找服务提供方要接口&#xff0c;通过 Maven把接口依赖到项目中。在编写业务逻辑的时候&#xff0c;如果要调用提供方的接口&#xff0c;只需要通过依赖注入的方式把接口注入到项目中&#xff0c;然后在代码里面直接调用接口…

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图&#xff08;图2.2.1-1&#xff09; 2.2.2 系统功能表&#xff08;表2.2.2…

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (一)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得&#xff08;一&#xff09; 一、前言 鸿蒙官网文档中蓝牙部分&#xff0c;对于之前没有开发过蓝牙的同学&#xff0c;使用和查阅起来不是很方便。因为只是API的调用说明。并没有蓝牙整个调用流程的讲解&#xff0c;所以看起来会…

Go语言中数据类型与变量的用法

数据类型详解 在Go语言中&#xff0c;数据类型分为以下几类&#xff1a;基本类型、复合类型和特殊类型。理解这些数据类型可以帮助我们更高效地操作数据和设计程序。 1. 基本数据类型 基本数据类型包含数值类型、布尔类型和字符串类型。 1.1 整数类型 Go支持多种整数类型&…

Golang的多版本管理

Golang的多版本管理 一、 为什么需要多版本管理&#xff1f; 现代软件开发中&#xff0c;随着项目日益复杂&#xff0c;往往需要使用不同的Golang版本来适配不同的依赖库或者框架。同时&#xff0c;不同的项目也可能需要不同的Golang版本来编译和执行。因此&#xff0c;多版本管…

解决milvus migration 迁移数据到出现数据丢失问题

在迁移数据的时候发现数据丢失 问题是数据在批量迁移的过程中&#xff0c;这个错误会被忽略掉 分析下来是因为buuferSize 设置的是500条数据&#xff0c;但是迁移工具对一次迁移的数据是是有大小限制的&#xff0c;如果500条数据的总大小大于4194304&#xff0c;就会导致数据…

Nop平台与SpringCloud的功能对比

Nop平台是根据可逆计算原理从零开始设计并实现的新一代的低代码平台&#xff0c;它的目标并不是针对少数固化的场景提供预置的开发脚手架和可视化设计工具&#xff0c; 而是打破描述式编程和传统命令式编程之间人为制造的藩篱&#xff0c;建立两者无缝相容的一种新的编程范式。…