yuu_nkjm blog
2011-02-11(Fri) [長年日記] 編集
[Programming] プログラミングコンテストの過去問ができるオンラインジャッジシステム
- Saratov State University :: Online Contester
- Sphere Online Judge (SPOJ)
- University of Aizu Online Judge System
- Welcome To PKU JudgeOnline
- Practice and Learn - Google Code Jam
上記リストは,アリさんマークのプログラミングコンテストチャレンジブックのリストを参考にしました.

[ツッコミを入れる]
2011-02-10(Thu) [長年日記] 編集
[MABS][CitySim][MATSim][OSM] OpenStreetMap(OSM オープンストリートマップ)のデータを道路ネットワークに変換する
以下,書きかけ
道路ネットワークのデータが欲しいというとき,OpenStreetMapがなかなか便利.緯度経度だけでなく道路の接続状況も分かるし,取り扱いが簡単.基盤地図情報|国土地理院も使ったことがあるけど,道路と道路の結合情報をどのように作るのが良いのかが分からない.
マルチエージェント交通シミュレーションツールボックスMATSim(Multi-Agent Transport Simulation)には,OpenStreetMap形式のデータを変換する機能がある.この変換方法は日本の座標系と合っていないようだが,ネットワークの生成はできた.なお,MATSimはJavaで書かれたプログラムであるため,予めJavaをインストールしておく必要がある.
ダウンロード
- OpenStreetMapにアクセスする.OpenStreetMap Japanからのたどり方はよく分からないので,http://www.openstreetmap.org/からアクセス.
- 適当なエリアに移動する.
- エクスポートタブを選択する.
- エクスポートするファイル形式で,OSM XMLデータを選択する.
- 「別の範囲を指定する」を選択する.地図上でエクスポートしたい範囲を選択する.
- 出力ボタンを押す.map.ocmという名前でダウンロードされる.

道路ネットワークに変換
-
MATSimで使える形に変換するには,以下の様にする.MATSimは,公式サイトからダウンロードする.0.2以外でNetworkFromOSMクラスが用意されているかは分かりません.
java -cp matsim-0.2.0.jar org/matsim/evacuation/tutorial/NetworkFromOSM map.osm network.xml
-
作成した道路ネットワークデータの定義はwww.matsim.org/files/dtd/network_v1.dtdである.
<!ELEMENT network (nodes,links)> <!ATTLIST network name CDATA #IMPLIED type CDATA #IMPLIED capDivider CDATA #IMPLIED xml:lang NMTOKEN "de-CH"> <!ELEMENT nodes (node)*> <!ELEMENT links (link)*> <!ATTLIST links capperiod CDATA #IMPLIED effectivecellsize CDATA "7.5" effectivelanewidth CDATA "3.75" capPeriod CDATA #IMPLIED capDivider CDATA #IMPLIED capdivider CDATA #IMPLIED> <!ELEMENT node EMPTY> <!ATTLIST node id CDATA #REQUIRED x CDATA #REQUIRED y CDATA #REQUIRED type CDATA #IMPLIED origid CDATA #IMPLIED> <!ELEMENT link EMPTY> <!ATTLIST link id CDATA #REQUIRED from CDATA #REQUIRED to CDATA #REQUIRED length CDATA #REQUIRED freespeed CDATA #REQUIRED capacity CDATA #REQUIRED permlanes CDATA #REQUIRED oneway CDATA #FIXED "1" volume CDATA #IMPLIED origid CDATA #IMPLIED nt_category CDATA #IMPLIED nt_type CDATA #IMPLIED type CDATA #IMPLIED modes CDATA "car">
- シミュレーションをする上で,linkとlinkの連結情報(fromノードとtoノード)があるのが便利.
- MATSimの緯度-平面直角座標系変換はドイツ(?つまり日本以外)を基準にした変換を行っている.自分の欲しい地図データに適した変換を行うには,ちょっとプログラムを書く必要がある.CoordinateTransformationというクラスを継承して,自前で変換ルールを書く.一部を付録として末尾に掲載.MATSimのモジュール使わなくても,OSMプロジェクトでJava用のデータ処理ライブラリが用意されてる気がするが,未調査.
緯度・経度と平面直角座標の変換
世界測地系,日本測地系,平面直角座標系,緯度経度のあれこれ
付録:日本測地系用の変換プログラムの一部
// 道路ネットワークを作成するクラス public class NetworkFromOSMKyoto { public static void main(String[] args) throws SAXException, ParserConfigurationException, IOException { (snip) Scenario sc = new ScenarioImpl(); Network net = sc.getNetwork(); // 自分で作成した変換ルールをネットワークリーダーに渡す. CoordinateTransformation ct = new CoordinateTransformationKyoto(); OsmNetworkReader onr = new OsmNetworkReader(net, ct); onr.parse(osm); new NetworkWriter(net).write(networkFileTmp, networkDtd); new NetworkWriter(net).write(dbNetworkFileTmp, dbNetworkDtd); (snip) } }
import jp.jasminesoft.gcat.scalc.DMSconv; import jp.jasminesoft.gcat.scalc.LatLong2XY; import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.geometry.CoordImpl; import org.matsim.core.utils.geometry.CoordinateTransformation; // 日本測地系用の変換ルール public class CoordinateTransformationKyoto implements CoordinateTransformation { @Override public Coord transform(Coord coord) { LatLong2XY latLong2XY = new LatLong2XY(6); double lat = DMSconv.deg2dms((float) coord.getY()); double lon = DMSconv.deg2dms((float) coord.getX()); latLong2XY.setLatitude(lat); latLong2XY.setLongitude(lon); // TODO nkjm X-Y coord on Matsim and X-Y coord in Japan is // different. double convX = latLong2XY.getY(); double convY = latLong2XY.getX(); return new CoordImpl(convX, convY); } }
[ツッコミを入れる]
2011-02-07(Mon) [長年日記] 編集
[bash][Linux][bat][Windows] リダイレクトいろいろ
標準エラー出力のみをパイプに出力する
command 2>&1 >/dev/null | command2
ちなみに,Windowsでは/dev/nullはnulが相当する.
command 2>&1 >nul | command2
「標準出力 → ファイル,標準エラー → 画面,ファイル」に出力する.「とあるプログラムの標準出力が膨大であり,画面には出したくないがファイルに保存はしたい.標準エラーは大事なので,画面にもファイルにも出力したい」という状況なので,こんなことがしたい.
基本的にリダイレクトを頑張りつつ,teeコマンドに流し込む作戦.
command 3>&1 1>&2 2>&3|tee hoge.log
1(commandの標準出力の中身)→標準エラー出力
2(commandの標準エラーの中身)→標準出力(パイプに渡される.teeにより画面とファイルに出力される)
3(空)→標準出力
teeの-aオプションを使ってもいけるか.
command 2>&1 1>hoge.log|tee -a hoge.log
1(commandの標準出力の中身)→hoge.log
2(commandの標準エラーの中身)→標準出力(パイプに渡される.teeにより画面に出力され,-aオプションによりファイルに追記される)
参考ページ
[ツッコミを入れる]