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/157849066

Step1.获取所需城市ID

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>

得到interpreter文件,打开得到重庆市ID:913069

Step2.根据城市ID下载路网数据

<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"

二、OSM路网文件转换为MATSim所需路网文件

参考资料: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);
    }

}
posted @ 2021-02-28 20:01  飞翔的Frank  阅读(903)  评论(0编辑  收藏  举报