{"id":99,"date":"2026-05-19T00:13:05","date_gmt":"2026-05-18T15:13:05","guid":{"rendered":"https:\/\/udri.or.jp\/topics\/?p=99"},"modified":"2026-05-20T14:10:02","modified_gmt":"2026-05-20T05:10:02","slug":"conveyal-r5","status":"publish","type":"post","link":"https:\/\/udri.or.jp\/topics\/2026\/05\/19\/conveyal-r5\/","title":{"rendered":"Conveyal R5\u3067\u516c\u5171\u4ea4\u901a\u5230\u9054\u570f\u89e3\u6790"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/udri.or.jp\/topics\/2026\/04\/07\/gtfs\/\" data-type=\"link\" data-id=\"https:\/\/udri.or.jp\/topics\/2026\/04\/07\/gtfs\/\">\u524d\u8a18\u4e8b<\/a>\u3067\u306f\u3001OpenTripPlanner\u3068QGIS\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u3088\u308a\u3001GTFS\u306b\u542b\u307e\u308c\u308b\u30d0\u30b9\u30eb\u30fc\u30c8\u3084\u505c\u7559\u6240\u306e\u7c21\u5358\u8868\u793a\u3092\u8a66\u307f\u305f\u304c\u3001\u5230\u9054\u570f\u89e3\u6790\uff08isochrone\uff09\u3092\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u3001OTP\u30921\u7cfb\u306b\u843d\u3068\u3055\u306a\u304f\u3066\u306f\u306a\u3089\u306a\u304b\u3063\u305f\u308a\uff08\u73fe\u5728\u306eOTP\u30d0\u30fc\u30b8\u30e7\u30f32.9\uff09\u306a\u304b\u306a\u304b\u5384\u4ecb\u306a\u30cf\u30de\u308a\u70b9\u304c\u51fa\u3066\u304d\u305f\u305f\u3081\u3001\u3082\u3046\u4e00\u3064\u306e\u89e3\u6790\u30a8\u30f3\u30b8\u30f3Conveyal\u793e\u306eR5\u3092\u4f7f\u3063\u3066\u307f\u308b\u3002<\/p>\n\n\n\n<ul class=\"article-toc\">\n  <li><a href=\"#r5_tool\">1.\u5fc5\u8981\u30c4\u30fc\u30eb<\/a><\/li>\n  <li><a href=\"#r5_folder\">2.R5\u306e\u4f5c\u696d\u30d5\u30a9\u30eb\u30c0\u6574\u5099<\/a><\/li>\n  <li><a href=\"#template\">3.\u89e3\u6790\u7528\u30d7\u30ed\u30b0\u30e9\u30e0\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/a><\/li>\n  <li><a href=\"#example\">4.\u89e3\u6790\u5b9f\u884c\u4f8b<\/a><\/li>\n  <li><a href=\"#isochrone\">5.\u5230\u9054\u570f\u8868\u793a<\/a><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"r5_tool\">\uff11\uff0e\u5fc5\u8981\u30c4\u30fc\u30eb<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Python\uff08\u63a8\u5968\uff1a3.11\u7cfb\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python\u516c\u5f0f\u30b5\u30a4\u30c8\uff1a<br><a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/www.python.org\/downloads\/?utm_source=chatgpt.com\">Python Downloads<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u521d\u3081\u3066Python\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306a\u3089\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6642\u306b\u3000<strong> Add Python to PATH<\/strong> \u306b\u30c1\u30a7\u30c3\u30af\u3092\u5165\u308c\u308b\u3002<br>\u203bWindows\u306a\u3089\u3001\u76f4\u63a53.11.9\u306e\u5b9f\u884c\u578b\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3067\u3082\u3088\u3044<br><a href=\"https:\/\/www.python.org\/ftp\/python\/3.11.9\/python-3.11.9-amd64.exe\" data-type=\"link\" data-id=\"https:\/\/www.python.org\/ftp\/python\/3.11.9\/python-3.11.9-amd64.exe\" target=\"_blank\" rel=\"noreferrer noopener\">Python 3.11.9 Windows installer (64-bit)<\/a><br><br>\u203b2\u3064\u4ee5\u4e0a\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u5171\u5b58\u3055\u305b\u308b\u306a\u3089\u3001<strong>Add Python to PATH<\/strong>\u3000\u3092\u5165\u308c\u305a\u306b\u3000c:\\Python311 \u306a\u3069\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3057\u3001\u305d\u3053\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3002\uff08R5\u5b9f\u884c\u6642\u306b\u6307\u5b9a\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u30b3\u30de\u30f3\u30c9\u30d7\u30ed\u30f3\u30d7\u30c8\u3067\u78ba\u8a8d\u3002\u3000python --version \n\u203bD:\u30c9\u30e9\u30a4\u30d6\u306bPython311\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3057\u3001\u305d\u3053\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u5834\u5408\u306e\u78ba\u8a8d\u3002\nD:\\Python311\\python --version<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Java\uff08\u63a8\u5968\uff1aJava 17 LTS\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">R5 \u306f\u5185\u90e8\u3067 Java \u3092\u5229\u7528\u3057\u3066\u52d5\u4f5c\u3059\u308b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/adoptium.net\/temurin\/releases\/?utm_source=chatgpt.com\">Eclipse Temurin Downloads<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u30b3\u30de\u30f3\u30c9\u30d7\u30ed\u30f3\u30d7\u30c8\u3067\u78ba\u8a8d\u3002\u3000java -version\u3000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. r5py \u95a2\u9023\u30e9\u30a4\u30d6\u30e9\u30ea<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30b3\u30de\u30f3\u30c9\u30d7\u30ed\u30f3\u30d7\u30c8\u3067\u4ee5\u4e0b\u3092\u5b9f\u884c\u3059\u308b\u3002<br>pip install r5py geopandas pyogrio<br>\u203b\u4f7f\u7528\u3059\u308bPython\u3092\u660e\u793a\u3057\u305f\u3044\u5834\u5408\u306f\u3001<br><strong>\u216e:\\Python311\\Scripts\\<\/strong>pip install r5py geopandas pyogrio \u306a\u3069<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"r5_folder\">\uff12. R5\u306e\u4f5c\u696d\u30d5\u30a9\u30eb\u30c0\u6574\u5099<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f5c\u696d\u7528\u30d5\u30a9\u30eb\u30c0\u3092 \uff08\u3053\u3053\u3067\u306f\u5916\u90e8SSD\u306b\u3000r5\u30d5\u30a9\u30eb\u30c0\u4f5c\u6210\uff09\u7528\u610f<br>\uff08\u4f8b\u3048\u3070\uff09D:\u00a5r5<br>\u3053\u306e\u4e0b\u306b\u3001kiyobus\u306a\u3069\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3057\u3001GTFS\u3068OSM\u30c7\u30fc\u30bf\u3092\u914d\u7f6e\u3002<br>\u540c\u3058\u30d5\u30a9\u30eb\u30c0\u306b\u3001\u51fa\u529b\u7528 output\u3000\u30d5\u30a9\u30eb\u30c0\u3068\u3000\u30ad\u30e3\u30c3\u30b7\u30e5\u7528\u3000cache\u3000\u30d5\u30a9\u30eb\u30c0\u306a\u3069\u3082\u4f5c\u6210\u3057\u3066\u304a\u304f\u3068\u3088\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"template\">\uff13\uff0e\u89e3\u6790\u7528\u30d7\u30ed\u30b0\u30e9\u30e0\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u30d5\u30a1\u30a4\u30eb\u4f4d\u7f6e\u3084\u89e3\u6790\u3057\u305f\u3044\u5834\u6240\u60c5\u5831\u3001\u51fa\u529b\u5148\u306a\u3069\u3092\u6c7a\u3081\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002<br>make_iso.py\u3000\u30d5\u30a1\u30a4\u30eb\u306e\u5192\u982d\u306b\u4e0b\u8a18\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u914d\u7f6e\u3057\u3066\u304a\u304f\u3068\u3088\u3044\uff08\u308f\u304b\u308a\u3084\u3059\u3044\uff09\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OSM\u30d5\u30a1\u30a4\u30eb<\/li>\n\n\n\n<li>GTFS\u30d5\u30a1\u30a4\u30eb<\/li>\n\n\n\n<li>\u76ee\u7684\u5730\uff08\u6e05\u702c\u99c5\u306a\u3069\uff09<\/li>\n\n\n\n<li>\u51fa\u767a\u5730\u70b9<\/li>\n\n\n\n<li>\u51fa\u767a\u6642\u523b<\/li>\n\n\n\n<li>\u51fa\u529b\u5148<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\"># ============================================<br># R5 \u5230\u9054\u6642\u9593\u89e3\u6790\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<br># \u304d\u3088\u30d0\u30b9gtfs\u3067\u3042\u308b\u5834\u6240\uff08Origin01\uff09\u304b\u3089\u6e05\u702c\u99c5\u307e\u3067<br># Origin01\u306e\u5ea7\u6a19\u306f\u3001QGIS\u3068QGIS-GO\u304b\u3089\u53d6\u5f97<br># ============================================<br><br>import datetime<br><br>import geopandas as gpd<br>import r5py<br><br>from shapely.geometry import Point<br><br># ============================================<br># OSM \/ GTFS<br># ============================================<br><br>OSM_FILE = r\"D:\/r5\/kiyobus\/kanto-260511.osm.pbf\"<br><br>GTFS_FILE = r\"D:\/r5\/kiyobus\/kiyobus.gtfs.zip\"<br><br># ============================================<br># \u51fa\u529b\u5148<br># ============================================<br><br>OUTPUT_FILE = r\"D:\/r5\/kiyobus\/output\/travel_time.gpkg\"<br><br># ============================================<br># \u76ee\u7684\u5730\uff08\u6e05\u702c\u99c5\uff09<br># ============================================<br><br>DEST_NAME = \"KiyoseStation\"<br><br>DEST_LON = 139.5265<br>DEST_LAT = 35.7857<br><br># ============================================<br># \u51fa\u767a\u5730\u70b9<br># ============================================<br><br>ORIGIN_NAME = \"Origin01\"<br><br>ORIGIN_LON = 139.497806<br>ORIGIN_LAT = 35.775772<br><br># ============================================<br># \u51fa\u767a\u6642\u523b<br># ============================================<br><br>DEPARTURE_YEAR = 2026<br>DEPARTURE_MONTH = 5<br>DEPARTURE_DAY = 19<br><br>DEPARTURE_HOUR = 8<br>DEPARTURE_MINUTE = 0<br><br># ============================================<br># \u6761\u4ef6<br># ============================================<br><br>MAX_TRAVEL_MINUTES = 60<br><br>TRANSPORT_MODES = [\"WALK\", \"TRANSIT\"]<br><br># ============================================<br># \u6b69\u884c\u901f\u5ea6\uff08m\/s\uff09<br># ============================================<br><br>WALK_SPEED = 1.0<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted\"># ============================================<br># R5 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u751f\u6210\uff08\u5192\u982d\u306b\u7d9a\u304f\u672c\u4f53\uff09<br># ============================================<br><br>print(\"R5 network \u4f5c\u6210\u4e2d...\")<br><br>network = r5py.TransportNetwork(<br>    OSM_FILE,<br>    [GTFS_FILE]<br>)<br><br>print(\"R5 network \u4f5c\u6210\u5b8c\u4e86\")<br><br># ============================================<br># \u76ee\u7684\u5730<br># ============================================<br><br>destinations = gpd.GeoDataFrame(<br>    {<br>        \"id\": [DEST_NAME]<br>    },<br>    geometry=[<br>        Point(DEST_LON, DEST_LAT)<br>    ],<br>    crs=\"EPSG:4326\"<br>)<br><br># ============================================<br># \u51fa\u767a\u5730\u70b9<br># ============================================<br><br>origins = gpd.GeoDataFrame(<br>    {<br>        \"id\": [ORIGIN_NAME]<br>    },<br>    geometry=[<br>        Point(ORIGIN_LON, ORIGIN_LAT)<br>    ],<br>    crs=\"EPSG:4326\"<br>)<br><br># ============================================<br># \u5230\u9054\u6642\u9593\u8a08\u7b97<br># ============================================<br><br>print(\"\u5230\u9054\u6642\u9593\u8a08\u7b97\u4e2d...\")<br><br>travel_times = r5py.TravelTimeMatrix(<br>    transport_network=network,<br><br>    origins=origins,<br>    destinations=destinations,<br><br>    transport_modes=TRANSPORT_MODES,<br><br>    departure=datetime.datetime(<br>        DEPARTURE_YEAR,<br>        DEPARTURE_MONTH,<br>        DEPARTURE_DAY,<br>        DEPARTURE_HOUR,<br>        DEPARTURE_MINUTE<br>    ),<br><br>    max_time=datetime.timedelta(<br>        minutes=MAX_TRAVEL_MINUTES<br>    )<br>)<br><br># ============================================<br># \u7d50\u679c\u8868\u793a<br># ============================================<br><br>print(travel_times)<br><br># ============================================<br># \u4fdd\u5b58<br># ============================================<br><br>travel_times.to_file(<br>    OUTPUT_FILE,<br>    driver=\"GPKG\"<br>)<br>origins.to_file(<br>    r\"D:\/r5\/kiyobus\/output\/origins.gpkg\",<br>    driver=\"GPKG\"<br>)<br><br>destinations.to_file(<br>    r\"D:\/r5\/kiyobus\/output\/destinations.gpkg\",<br>    driver=\"GPKG\"<br>)<br>origins.to_file(<br>    r\"D:\/r5\/kiyobus\/output\/origins.gpkg\",<br>    driver=\"GPKG\"<br>)<br><br>print(\"===================================\")<br>print(\"\u51fa\u529b\u5b8c\u4e86\")<br>print(OUTPUT_FILE)<br>print(\"===================================\")<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"example\">\uff14\uff0e\u89e3\u6790\u5b9f\u884c\u4f8b<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Python\u306e\u5b9f\u884c\nD:\\Python311\\python D:\\r5\\kiyobus\\make_iso.py\n\u203bjava\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u306a\u3069\u306e\u30a8\u30e9\u30fc\u304c\u51fa\u305f\u5834\u5408\u306f\u3001set JAVA_HOME=C:\\java\u3000\u306a\u3069\u3067\n\u4e00\u6642\u7684\u306bJAVA_HOME\u3000\u306e\u5834\u6240\u3092\u8a2d\u5b9a\n\n\u5b9f\u884c\u6210\u529f\u3059\u308b\u3068\n\u51fa\u529b\u5b8c\u4e86\nD:\/r5\/kiyobus\/output\/travel_time.gpkg\n\u306a\u3069\u3067\u7d42\u4e86\u3059\u308b\u3002\n\n\u51fa\u529b\u3055\u308c\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u3001QGIS\u306b\u30c9\u30e9\u30c3\u30b0\u3001\u307e\u305f\u306f\u30ec\u30a4\u30e4\u30fc\u2192\u30ec\u30a4\u30e4\u30fc\u8ffd\u52a0\u2192\u30d9\u30af\u30bf\u30fc\u30ec\u30a4\u30e4\u8ffd\u52a0<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"591\" src=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-1-1024x591.png\" alt=\"\" class=\"wp-image-114\" srcset=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-1-1024x591.png 1024w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-1-300x173.png 300w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-1-768x443.png 768w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-1.png 1036w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u56f3\u306f\u3001\u5e73\u65e58\u6642\u53f0\u306b\u3001\u9752\u3072\u3057\u5f62\u306e\u4f4d\u7f6e\u304b\u3089\u8d64\u3072\u3057\u5f62\u306e\u4f4d\u7f6e\u307e\u3067\u79fb\u52d5\u3059\u308b\u3068\u304d\u306b\u3001\u4f55\u5206\u767a\u306e\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30d0\u30b9\u306b\u4e57\u308b\u304b\u3001\u3092\u8868\u793a\u3057\u305f\u3082\u306e\u3002\u30bf\u30a4\u30df\u30f3\u30b0\u306b\u5408\u308f\u306a\u3044\u3068\u3001\u6b69\u304f\u3068\u3044\u3046\u7d50\u679c\u3082\u51fa\u305b\u308b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"isochrone\">\uff15\uff0e\u5230\u9054\u570f\u8868\u793a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08\uff11\uff09\u30c7\u30fc\u30bf\u6e96\u5099<br>QGIS-GO\u306b\u30d7\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u3066\u3044\u308b\u300c\u5317\u6d77\u9053\u62d3\u6b96\u30d0\u30b9\uff08\u4e00\u822c\u8def\u7dda\u30d0\u30b9\u30fb\u5404\u753a\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30d0\u30b9\uff09\u300d\u3092\u4f7f\u3046\u3002\u30eb\u30fc\u30c8\u3068\u505c\u7559\u6240\u56f3\u306f\u3001\u4e0b\u56f3\u306e\u3068\u304a\u308a\u3002\u3053\u306e\u30c7\u30fc\u30bf\u3092\u4f7f\u3063\u3066\u3001\u5e2f\u5e83\u99c560\u5206\u570f\u3092\u8868\u793a\u3059\u308b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"842\" height=\"685\" src=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-2.png\" alt=\"\" class=\"wp-image-123\" srcset=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-2.png 842w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-2-300x244.png 300w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-2-768x625.png 768w\" sizes=\"auto, (max-width: 842px) 100vw, 842px\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u203bgtfs\u30c7\u30fc\u30bf\u306f\u3001\uff08\u30e6\u30fc\u30b6\u540d\uff09\\AppData\\Local\\Temp\\GTFSGo\u3000\u304b\u3089\u5165\u624b<br>r5\u30d5\u30a9\u30eb\u30c0\u5185\u306b\u3001hokkaido\u30d5\u30a9\u30eb\u30c0\u3001\u305d\u306e\u4e2d\u306b\u3001OSM\u30c7\u30fc\u30bf\uff08hokkaido\uff09\u3068gtfs\u30c7\u30fc\u30bf\u3068\u3001output\u30d5\u30a9\u30eb\u30c0\u3092\u683c\u7d0d\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"628\" height=\"67\" src=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-3.png\" alt=\"\" class=\"wp-image-124\" srcset=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-3.png 628w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-3-300x32.png 300w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08\uff12\uff09\u30d7\u30ed\u30b0\u30e9\u30e0<strong>make_hokkaido_iso.py<\/strong><br>\u307e\u305a\u8a2d\u5b9a\u90e8\u5206\u306e\u307f\uff08\u30d7\u30ed\u30b0\u30e9\u30e0\u5192\u982d\uff09<br>\u203b\u592a\u5b57\u90e8\u5206\u306f\u3001\u5404\u81ea\u306e\u30d5\u30a9\u30eb\u30c0\u69cb\u6210\u306b\u3088\u3063\u3066\u5909\u66f4\u3059\u308b\u3053\u3068<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># ============================================<br># R5 \u5317\u6d77\u9053 \u5230\u9054\u570f\u89e3\u6790<br># \u5e2f\u5e83\u99c5 \u2192 \u5404\u5730\u70b9<br># \u51ac\u5b63\u30fb\u5e73\u65e5\u671d\u30e2\u30c7\u30eb<br># ============================================<br><br>import datetime<br>import os<br><br>import geopandas as gpd<br>import pandas as pd<br>import r5py<br><br>from shapely.geometry import Point<br><br># ============================================<br># \u5165\u529b\u30c7\u30fc\u30bf<br># ============================================<br><br>OSM_FILE = \"<strong>D:\/r5\/hokkaido\/hokkaido-260518.osm.pbf<\/strong>\"<br><br>GTFS_FILE = \"<strong>D:\/r5\/hokkaido\/hokkaido_gtfs.zip<\/strong>\"<br><br># ============================================<br># \u51fa\u529b\u5148<br># ============================================<br><br>OUTPUT_FILE = (<br>    \"<strong>D:\/r5\/hokkaido\/output\/<\/strong>\"<br>    \"obihiro_travel_time_points.gpkg\"<br>)<br><br># ============================================<br># \u51fa\u767a\u5730\uff08\u5e2f\u5e83\u99c5\uff09<br># ============================================<br><br>ORIGIN_NAME = \"ObihiroStation\"<br><br>ORIGIN_LON = 143.2033288<br>ORIGIN_LAT = 42.9174467<br><br># ============================================<br># \u51fa\u767a\u6642\u523b<br># \u51ac\u5b63\u30fb\u6708\u66dc\u671d\uff08\u30c7\u30fc\u30bf\u3092\u6301\u30642023\/1\/16\u306b\u8a2d\u5b9a\uff09<br># ============================================<br><br>DEPARTURE_YEAR = 2023<br>DEPARTURE_MONTH = 1<br>DEPARTURE_DAY = 16<br><br>DEPARTURE_HOUR = 8<br>DEPARTURE_MINUTE = 0<br><br># ============================================<br># \u89e3\u6790\u6761\u4ef6<br># ============================================<br><br>MAX_TRAVEL_MINUTES = 120<br><br>TRANSPORT_MODES = [\"WALK\", \"TRANSIT\"]<br><br># ============================================<br># \u51ac\u5b63\u6b69\u884c\u30e2\u30c7\u30eb<br># \uff08\u7a4d\u96ea\u30fb\u51cd\u7d50\u3092\u60f3\u5b9a\uff09<br># ============================================<br><br>WALK_SPEED = 0.7<br><br>MAX_WALK_MINUTES = 15<br><br># ============================================<br># \u30e1\u30c3\u30b7\u30e5\u7bc4\u56f2<br># \uff08\u307e\u305a\u306f\u5e2f\u5e83\u5468\u8fba\uff09<br># ============================================<br><br>MIN_LON = 142.85<br>MAX_LON = 143.45<br><br>MIN_LAT = 42.75<br>MAX_LAT = 43.05<br><br># ============================================<br># \u30e1\u30c3\u30b7\u30e5\u9593\u9694<br># \u7d041km<br># ============================================<br><br>GRID_STEP = 0.01<\/pre>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u89e3\u6790\u7528\u30e1\u30c3\u30b7\u30e5\u3092\u4f5c\u308b\uff08\u4eca\u56de\u306f\u30011km\u30e1\u30c3\u30b7\u30e5\u3067\uff09<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># ============================================<br># \u30e1\u30c3\u30b7\u30e5\u751f\u6210<br># ============================================<br><br>print(\"\u30e1\u30c3\u30b7\u30e5\u751f\u6210\u4e2d...\")<br><br>destination_points = []<br><br>lon = MIN_LON<br><br>while lon &lt;= MAX_LON:<br><br>    lat = MIN_LAT<br><br>    while lat &lt;= MAX_LAT:<br><br>        destination_points.append({<br>            \"id\": f\"{lon:.4f}_{lat:.4f}\",<br>            \"geometry\": Point(lon, lat)<br>        })<br><br>        lat += GRID_STEP<br><br>    lon += GRID_STEP<br><br># ============================================<br># destinations GeoDataFrame<br># ============================================<br><br>destinations = gpd.GeoDataFrame(<br>    destination_points,<br>    crs=\"EPSG:4326\"<br>)<br><br>print(destinations.head())<br><br>print(\"destination\u6570:\", len(destinations))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08\uff13\uff09\u5b9f\u884c\u30b3\u30de\u30f3\u30c9<br><strong>D:\\Python311\\python.exe D:\\r5\\hokkaido\\<\/strong>make_hokkaido_iso.py<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9f\u884c\u3059\u308b\u3068\u3001\u5e2f\u5e83\u99c5\u5468\u8fba1km\u30e1\u30c3\u30b7\u30e5\u3092\u4f5c\u6210\u3059\u308b<br>\u30e1\u30c3\u30b7\u30e5\u751f\u6210\u4e2d\u2026<br>id geometry<br>0 142.8500_42.7500 POINT (142.85 42.75)<br>1 142.8500_42.7600 POINT (142.85 42.76)<br>2 142.8500_42.7700 POINT (142.85 42.77)<br>3 142.8500_42.7800 POINT (142.85 42.78)<br>4 142.8500_42.7900 POINT (142.85 42.79)<br>destination\u6570: 1891<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08\uff14\uff09\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u7d9a\u304d\uff08\u8ffd\u52a0\uff09\uff5eOrigin\uff08\u5e2f\u5e83\u99c5\uff09\u4f5c\u6210<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># ============================================<br># Origin\uff08\u5e2f\u5e83\u99c5\uff09<br># ============================================<br><br>origins = gpd.GeoDataFrame(<br>    {<br>        \"id\": [ORIGIN_NAME]<br>    },<br>    geometry=[<br>        Point(ORIGIN_LON, ORIGIN_LAT)<br>    ],<br>    crs=\"EPSG:4326\"<br>)<br><br>print(origins)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9f\u884c\u3059\u308b\u3068\u3001\u8a2d\u5b9a\u3057\u305forigin\u304c\u51fa\u529b\u3055\u308c\u308b<br>           id                 geometry<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">0 ObihiroStation POINT (143.202 42.9178)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08\uff15\uff09\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a08\u7b97\uff08\u672c\u4f53\uff09\u8ffd\u8a18\uff5eTravelTimeMatrix<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># ============================================<br># STEP 3: R5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4f5c\u6210<br># ============================================<br><br>print(\"===================================\")<br>print(\"STEP 3: R5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4f5c\u6210\u4e2d...\")<br>print(\"OSM\u3068GTFS\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\")<br>print(\"===================================\")<br><br>network = r5py.TransportNetwork(<br>    OSM_FILE,<br>    [GTFS_FILE]<br>)<br><br>print(\"R5 network \u4f5c\u6210\u5b8c\u4e86\")<br><br><br># ============================================<br># STEP 4: \u5230\u9054\u6642\u9593\u8a08\u7b97<br># ============================================<br><br>print(\"===================================\")<br>print(\"STEP 4: \u5230\u9054\u6642\u9593\u8a08\u7b97\u4e2d...\")<br>print(\"\u5e2f\u5e83\u99c5\u304b\u3089\u5404\u30e1\u30c3\u30b7\u30e5\u5730\u70b9\u3078\u306e\u6240\u8981\u6642\u9593\u3092\u8a08\u7b97\u3057\u3066\u3044\u307e\u3059\")<br>print(\"===================================\")<br><br>travel_times = r5py.TravelTimeMatrix(<br>    transport_network=network,<br>    origins=origins,<br>    destinations=destinations,<br>    transport_modes=[<br>        r5py.TransportMode.WALK,<br>        r5py.TransportMode.TRANSIT<br>    ],<br>    departure=datetime.datetime(<br>        DEPARTURE_YEAR,<br>        DEPARTURE_MONTH,<br>        DEPARTURE_DAY,<br>        DEPARTURE_HOUR,<br>        DEPARTURE_MINUTE<br>    ),<br>    max_time=datetime.timedelta(minutes=MAX_TRAVEL_MINUTES),<br>    max_time_walking=datetime.timedelta(minutes=MAX_WALK_MINUTES)<br>)<br><br>print(travel_times.head())<br>print(\"===================================\")<br>print(\"NaN\u3067\u306a\u3044\u5730\u70b9\u6570:\")<br>print(travel_times[\"travel_time\"].notna().sum())<br><br>print(\"===================================\")<br>print(\"\u6700\u5c0f travel_time:\")<br>print(travel_times[\"travel_time\"].min())<br><br>print(\"===================================\")<br>print(\"NaN\u3067\u306a\u3044\u884c\u30b5\u30f3\u30d7\u30eb:\")<br>print(<br>    travel_times[<br>        travel_times[\"travel_time\"].notna()<br>    ].head(20)<br>)<br><br><br># ============================================<br># STEP 5: geometry\u3092\u7d50\u5408<br># ============================================<br><br>print(\"===================================\")<br>print(\"STEP 5: \u5230\u9054\u6642\u9593\u306b\u5730\u70b9geometry\u3092\u7d50\u5408\u4e2d...\")<br>print(\"===================================\")<br><br># TravelTimeMatrix\u306e destination id \u3068 destinations \u306e id \u3092\u7d50\u5408<br>result = destinations.merge(<br>    travel_times,<br>    left_on=\"id\",<br>    right_on=\"to_id\",<br>    how=\"left\"<br>)<br><br># ============================================<br># NaN\u9664\u5916<br># ============================================<br><br>result = result[<br>    result[\"travel_time\"].notna()<br>].copy()<br><br>print(\"===================================\")<br>print(\"NaN\u9664\u5916\u5f8c:\")<br>print(len(result))<br><br>print(result.head())<br><br><br># ============================================<br># STEP 6: \u51fa\u529b<br># ============================================<br><br>print(\"===================================\")<br>print(\"STEP 6: GeoPackage\u51fa\u529b\u4e2d...\")<br>print(\"===================================\")<br><br>os.makedirs(os.path.dirname(OUTPUT_FILE), exist_ok=True)<br><br>result.to_file(<br>    OUTPUT_FILE,<br>    driver=\"GPKG\"<br>)<br><br>print(\"===================================\")<br>print(\"\u51fa\u529b\u5b8c\u4e86\")<br>print(OUTPUT_FILE)<br>print(\"===================================\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08\uff16\uff09obihiro_travel_time_points.gpkg\u3000\u3092QGIS\u8868\u793a<br>\u30ec\u30a4\u30e4\u8ffd\u52a0\u3000\u30d9\u30af\u30bf\u30fc\u30ec\u30a4\u30e4\u8ffd\u52a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30b7\u30f3\u30dd\u30ed\u30b8\uff5eGraduated\u3000\u306b\u3057\u3001\u5024\u306ftravel_time \u7b49\u9593\u9694\u5206\u985e\u3000\u30af\u30e9\u30b9\u65706\u3050\u3089\u3044\u3067<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8d64 \u2192 \u9ec4 \u2192 \u7dd1 \u2192 \u9752\u3000\u306a\u3069<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"991\" height=\"724\" src=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-4.png\" alt=\"\" class=\"wp-image-136\" srcset=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-4.png 991w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-4-300x219.png 300w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-4-768x561.png 768w\" sizes=\"auto, (max-width: 991px) 100vw, 991px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u30e9\u30b9\u30bf\u30e1\u30cb\u30e5\u30fc\u304b\u3089\u7b49\u9ad8\u7dda\u3092\u8a08\u7b97<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1007\" height=\"678\" src=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-5.png\" alt=\"\" class=\"wp-image-138\" srcset=\"https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-5.png 1007w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-5-300x202.png 300w, https:\/\/udri.or.jp\/topics\/wp-content\/uploads\/2026\/05\/image-5-768x517.png 768w\" sizes=\"auto, (max-width: 1007px) 100vw, 1007px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a18\u4e8b\u3067\u306f\u3001OpenTripPlanner\u3068QGIS\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u3088\u308a\u3001GTFS\u306b\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-99","post","type-post","status-publish","format-standard","hentry","category-notes"],"_links":{"self":[{"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/posts\/99","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/comments?post=99"}],"version-history":[{"count":31,"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/posts\/99\/revisions"}],"predecessor-version":[{"id":145,"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/posts\/99\/revisions\/145"}],"wp:attachment":[{"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/media?parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/categories?post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/udri.or.jp\/topics\/wp-json\/wp\/v2\/tags?post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}