MATLAB调用urlread连接OTP服务器报错的解决咨询
问题场景
运行MATLAB代码调用generate_inputs_from_xls函数生成旅行时间矩阵,该函数通过symOTP模式连接本地OTP服务器,OTP启动命令如下:
C:\Users\len\Downloads\OTP\otp>java -Xmx2G -jar otp-2.3.0-shaded.jar --build --serve /C:/Users/len/Downloads/OTP/otp
执行代码[orig_n,start_t_exact,travel_times,acts,act_durations,time_windows,koord,types]=generate_inputs_from_xls('Input.xls','PT','symOTP',5);时触发urlread相关错误,错误栈:
Error using urlreadwrite_legacy
Error downloading URL. Your network connection may be down or your proxy settings improperly configured.
Error in urlreadwrite (line 88)
[output,status] = urlreadwrite_legacy(fcn,catchErrors,varargin{:});
Error in urlread (line 16)
[s,status] = urlreadwrite(mfilename,catchErrors,url,varargin{:});
Error in OTP_mivel_mennyi (line 18)
str = urlread(url);
Error in generate_inputs_from_xls (line 205)
travel_times(i,j)=OTP_mivel_mennyi(cellstr([num2str(koord(i,1),'%3.7f'),',',num2str(koord(i,2),'%3.7f')]),cellstr([num2str(koord(j,1),'%3.7f'),',',num2str(koord(j,2),'%3.7f')]),query_time+0.5);
排查与解决方案
1. 验证OTP服务器状态
- 打开浏览器访问
http://localhost:8080/otp/routers/default/plan,若能显示OTP规划页面,说明服务器正常;若无法访问:- 确认
--serve后的目录包含生成的graph.obj文件,若没有先单独执行--build生成图谱,再启动服务。 - 检查8080端口是否被占用,若被占用,启动命令添加
--port <新端口>,同时修改MATLAB代码中OTP请求的端口号。
- 确认
2. 重置MATLAB代理设置
- MATLAB可能继承系统代理导致无法访问本地服务,执行以下命令重置:
reset(weboptions); - 也可通过MATLAB主页→预设→Web取消勾选“使用系统代理服务器”,重启MATLAB后测试。
3. 替换过时的urlread函数
urlread为MATLAB旧函数,兼容性差,修改OTP_mivel_mennyi.m第18行代码:
原代码:
替换为:str = urlread(url);opts = weboptions('Timeout',30); % 设置超时时间避免请求失败 str = webread(url, opts);
4. 验证OTP请求URL合法性
- 在
OTP_mivel_mennyi函数中打印构造的url变量,复制到浏览器访问,确认是否返回正确的旅行时间数据。若浏览器能访问但MATLAB不行,重新检查代理或防火墙设置。
5. 排查防火墙拦截
- 本地防火墙、杀毒软件可能拦截MATLAB访问8080端口,暂时关闭防火墙或把MATLAB加入信任列表,测试连接是否恢复。
内容的提问来源于stack exchange,提问作者Mohammed Hajouj

