发布时间:2025-12-10 19:34:41 浏览次数:1
OSM获取城市路网 runtime error: Query ran out of memory in “recurse” at line 11. It would need at least 96 MB of RAM to continue 解决方法[亲测有效]OSM获取城市路网,转换为MATSim路网文件一、OSM获取城市路网参考资料1:https://blog.csdn.net/symoriaty/article/details/103946796参考资料2:https://zhuanlan.zhihu.com/p/157849066Step1
参考资料1:https://blog.csdn.net/symoriaty/article/details/103946796
参考资料2:https://zhuanlan.zhihu.com/p/157849066
https://www.overpass-api.de/query_form.html
<osm-script><query type="relation"><has-kv k="boundary" v="administrative"/><has-kv k="name:zh" v="重庆市"/></query><print/></osm-script>【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
得到interpreter文件,打开得到重庆市ID:913069
<osm-script timeout="1800" element-limit="100000000"> <union> <area-query ref="3600913069"/> <recurse type="node-relation" into="rels"/> <recurse type="node-way"/> <recurse type="way-relation"/> </union> <union> <item/> <recurse type="way-node"/> </union> <print mode="body"/></osm-script> 不同的城市将area-query ref=”3600913069″中的数值改为3600000000+ID
有的城市会出现运行错误:runtime error: Query ran out of memory in “recurse”
runtime error: Query ran out of memory in "recurse" at line 11. It would need at least 96 MB of RAM to continue. 将element-limit调大即可解决,如改为element-limit=”500000000″
参考资料:https://blog.csdn.net/Afinezyboy666/article/details/79356789?spm=1001.2014.3001.5501
OsmToNetworkUtil.java
package MyCode;import org.matsim.api.core.v01.Scenario;import org.matsim.core.config.Config;import org.matsim.core.config.ConfigUtils;import org.matsim.core.network.io.NetworkWriter;import org.matsim.core.scenario.ScenarioUtils;import org.matsim.core.utils.geometry.CoordinateTransformation;import org.matsim.core.utils.io.OsmNetworkReader;import org.matsim.core.network.algorithms.NetworkCleaner;import java.io.UncheckedIOException;import MyCode.WGS84toMercator;public class OsmToNetworkUtil { public static void main(String[] args){ Config config = ConfigUtils.createConfig(); Scenario scenario = ScenarioUtils.loadScenario(config); CoordinateTransformation trans = new WGS84toMercator(); OsmNetworkReader osmReader = new OsmNetworkReader(scenario.getNetwork(), trans); String dir = "/Users/frank/Downloads/"; // 请在这个文件夹中放入你的地图文件 String osmFile = "cq.osm"; // 输入文件 String networkFile = "cq.xml"; // 输出文件 try{ osmReader.parse(dir+osmFile); new NetworkCleaner().run(scenario.getNetwork()); new NetworkWriter(scenario.getNetwork()).write(dir+networkFile); System.out.println("Done writing!"); System.out.println("Please find network file in "+dir+networkFile); } catch(UncheckedIOException e){ e.toString(); } }} 其中,输入文件为第一步下载所得路网文件直接重命名为xxx.osm
WGS84toMercator.java
package MyCode;import org.matsim.api.core.v01.Coord;import org.matsim.core.utils.geometry.CoordinateTransformation;public class WGS84toMercator implements CoordinateTransformation { @Override public Coord transform(Coord coord) { double x = coord.getX() *20037508.342789/180; double y = Math.log(Math.tan((90+coord.getY())*Math.PI/360))/(Math.PI/180); y = y *20037508.34789/180; return new Coord(x, y); }}