调用VROOM API获取优化坐标遇端口及HTTP错误求助
垃圾收集路线优化:VROOM API请求错误排查与修复
问题背景
我正在做垃圾收集路线优化的研究,流程是:从OpenStreetMaps获取坐标列表,用OSRM计算当前路线距离,生成VROOM格式的JSON文件后,通过HTTP请求调用VROOM获取优化后的坐标列表。但遇到了两个问题:
- 按文档指定3000端口请求时,返回500错误
- 本地用
npm run serve启动VROOM后,服务跑在9966端口,改端口请求后返回404错误
代码片段
import json import requests # Generate VROOM file: def generateVROOMFile(data): # Lists for vehicles and jobs vehicles = [] # (Initially, I will only implement one vehicle, for now, this list is useless) jobs = [] start_coord = [data.longitude[0], data.latitude[0]] # Garage position end_coord = [data.longitude.iloc[-1], data.latitude.iloc[-1]] # Landfill position # Add a single vehicle vehicle = { "id": 1, "start": start_coord, "end": end_coord, "steps": [ {"type": "start"} ] } # Adding steps for j in range(len(data.latitude) - 1): vehicle["steps"].append({"type": "job", "id": j+1}) vehicle["steps"].append({"type": "end"}) # Add the vehicle to the list of vehicles vehicles.append(vehicle) # Adding "jobs" for each coordinate for i in range(len(data.latitude) - 1): coord = [data.longitude[i], data.latitude[i]] job = { "id": i+1, "description": data.logradouro[i], "location": coord } jobs.append(job) # Create the VROOM object vroom_data = { "vehicles": vehicles, "jobs": jobs } # Save the data to a file with open(f'VROOM_{data.name}.json', 'w') as f: json.dump(vroom_data, f, indent=2) return vroom_data # Get optimized coordinates from VROOM def getOptimizedCoords(vroom_data): # Local address of the VROOM server vroom_url = 'http://localhost:3000' # Send a POST request to the local VROOM API response = requests.post(vroom_url, json=vroom_data) # Check if the request was successful (status 200) if response.status_code == 200: return response.json() else: print("Error querying VROOM API:", response.status_code) return None
错误原因分析
端口混淆:前端服务 vs API服务
npm run serve启动的是VROOM的Web前端演示界面,不是后台API服务。前端服务的9966端口没有提供优化请求的接口,所以会返回404。而文档里的3000端口是VROOM API服务(比如vroom-express)的默认端口,如果你没正确启动API服务,请求就会返回500。VROOM请求格式错误
手动给vehicle添加steps的写法不符合VROOM API规范。VROOM的核心是自动分配任务到车辆,不需要手动指定steps列表,这种手动指定的方式会导致API解析失败,触发500错误。
修复方案
1. 正确启动VROOM API服务
如果你用的是vroom-express(官方推荐的API封装),按以下步骤启动:
- 安装依赖:
npm install -g vroom-express - 启动服务:
vroom-express(默认端口3000)
确认服务启动后,用curl测试连通性:
curl http://localhost:3000
正常会返回VROOM的API说明信息。
2. 修正VROOM数据生成代码
去掉手动添加steps的逻辑,让VROOM自动处理任务分配:
def generateVROOMFile(data): vehicles = [] jobs = [] start_coord = [data.longitude[0], data.latitude[0]] # Garage position end_coord = [data.longitude.iloc[-1], data.latitude.iloc[-1]] # Landfill position # 简化车辆配置,不需要手动指定steps vehicle = { "id": 1, "start": start_coord, "end": end_coord } vehicles.append(vehicle) # 添加任务,注意任务id从1开始,避免和车辆id冲突 for i in range(len(data.latitude) - 1): coord = [data.longitude[i], data.latitude[i]] job = { "id": i + 1, "description": data.logradouro[i], "location": coord } jobs.append(job) vroom_data = { "vehicles": vehicles, "jobs": jobs } with open(f'VROOM_{data.name}.json', 'w') as f: json.dump(vroom_data, f, indent=2) return vroom_data
3. 修正API请求路径
vroom-express的优化接口路径是/optimize,所以需要修改请求URL:
def getOptimizedCoords(vroom_data): vroom_url = 'http://localhost:3000/optimize' response = requests.post(vroom_url, json=vroom_data) if response.status_code == 200: return response.json() else: # 打印响应内容,方便排查具体错误 print("Error response:", response.text) print("Error querying VROOM API:", response.status_code) return None
验证步骤
- 启动VROOM API服务后,运行代码生成JSON文件
- 用curl测试生成的JSON是否符合规范:
curl -X POST http://localhost:3000/optimize -H "Content-Type: application/json" -d @VROOM_xxx.json - 如果curl返回正常的优化结果,再运行Python代码即可获取优化后的坐标列表。
内容的提问来源于stack exchange,提问作者Vitor Fernandes Reis
相关产品推荐
相关产品推荐

