èè
- å€ªç°æå¹³ïŒæ ªåŒäŒç€Ÿãã©ãã£ãã¯ãã¬ã€ã³ïŒ
- äŒè€ææ¯ ïŒæ±äº¬å€§åŠ çç£æè¡ç ç©¶æïŒ
ãæ¡å
ãã®èšäºã¯ã2020幎3æã«éå¬ãããæè¡æžå ž8ã®ããã«å·çããèšäºã®ãã©ããçã§ããBOOTHã«ãããŠã¯ããã®èšäºãå«ãæ§ã ãªå ¬å ±äº€éããŒã¿æŽ»çšæè¡ã玹ä»ãããééãšãã¹ã®ããŒã¿ãããã¯ãã2ãããªã³ã©ã€ã³è²©å£²ããŠãããŸãããã®èšäºãé¢çœãã£ããšããæ¹ã¯ããã®ä»ã«ãæ§ã ãªèšäºãæ²èŒããŠãããŸãã®ã§ãæ¯éBOOTHã«ãŠtechForMobilityã®å人èªãã芧äžããã
éè¡é »åºŠå³ãšã¯
ãã®èšäºã§ã¯ãå°åã«æäŸãããå ¬å ±äº€éãµãŒãã¹ã®å質ãçŽæçã«ææ¡ã§ããå ¬å ±äº€éã®éè¡é »åºŠå³ããGTFSããŒã¿ããäœæããææ³ã解説ããŸããéè¡é »åºŠå³ã¯1æ¥ã«èµ°ãå ¬å ±äº€éã®æ¬æ°ããå°å³äžã«ç·ã®å€ªããšæ°åã§è¡šçŸããŠãããå Žæããšã«å ¬å ±äº€éãååæäŸãããŠãããã©ããã確èªã§ããŸããäŸãã°ãæ6æããå€10æãŸã§30åããã«èµ°ã£ãŠããã°ã1æ¥ã®éè¡æ¬æ°ã¯35æ¬ãšãªããŸãããã®ãããéœåžéšã«ãããŠã¯1æ¥ã®æ¬æ°ã30æ¬ååŸããããšããæäœéã®ãµãŒãã¹ã¬ãã«ã«ãªãã§ããããæ6æããå€11æãŸã§10åããã«èµ°ã£ãŠããã°ã1æ¥ã®æ¬æ°ã¯103æ¬ã«ãªããŸããã€ãŸãã1æ¥100æ¬ãè¶ ããŠããã°ãæå»è¡šãããŸãæèããã«å ¬å ±äº€éãå©çšåºæ¥ãã®ã§ã¯ãªãã§ããããããã®èšäºã§äœæããéè¡é »åºŠå³ã¯ããã®ãããªå ¬å ±äº€éã®ç¶æ³ãçŽæçã«è¡šçŸãããã®ã§ãã亀éäºæ¥è ã®æŠç¥ç«æ¡ã®ã»ããèªæ²»äœãè¡ã亀éèšç»ãäœæ°ã¯ãŒã¯ã·ã§ãããªã©ã§ã®æŽ»çšãæåŸ ãããŸãã
åäœç°å¢
ãã®èšäºã¯ã以äžã®ç°å¢ã§åäœç¢ºèªãããŠãããŸãããããã®ã€ã³ã¹ããŒã«æ¹æ³ãåºæ¬çãªäœ¿ãæ¹ã¯å¥éå ¥éæžãªã©ããåç §ãã ããããããããå€å°ããŒãžã§ã³ãéã£ãŠãåäœãããšæããŸããæªç¢ºèªã§ãããåãœãããŠã§ã¢ã¯è€æ°ã®OSã«åããŠæäŸãããŠããã®ã§ãWindowsãLinuxã§ãã»ãŒåæ§ã«åäœãããšæããŸãã
- PostgreSQL 12.1
- PostGIS 3.0.0
- QGIS 3.10.1
- macOS Catalina 10.15.3
äžæºå: GTFSãã¡ã€ã«ã®æºå
ãã®èšäºã§ã¯ãäŸãšããŠå
Œ
±äº€éãªãŒãã³ããŒã¿ã»ã³ã¿ãŒããæäŸãããŠããæ±äº¬éœäº€éå±ãã¹é¢é£æ
å ±(GTFS-JP圢åŒ)ãå©çšããŸãããGTFS-JPã«æºæ ããGTFSãã¡ã€ã«ãªãã°åæ§ã®éè¡é »åºŠå³ãäœæã§ããŸãããã¹åæ
å ±ã«é¢ããŠã¯ãstops.txtãä¹ãå Žåäœã§æŽåãããããŒã¿æ§é ã«åçæïŒèŠªïŒãšä¹ãå ŽïŒåïŒãšãã芪åé¢ä¿ãèšå®ãããŠããããšãåæãšããŠããŸããåçæïŒèŠªïŒããå«ãŸãªãããŒã¿ã§ã¯ãSQLã«ããéèšåŠçãããç°¡æã«ãªããŸããä¹ãå ŽïŒåïŒããå«ãŸãªãããŒã¿ããè€æ°ã®GTFSãçµ±åããŠæ±ãå Žåã¯ãè€æ°ã®ä¹ãå Žæ
å ±ãåå¯ãããŠãåäžã®åçæïŒèŠªïŒã«æå±ããããã«äºåã«åŠçããå¿
èŠããããŸãããããŒã¿ã®ç¹æ§ãèŠæ¥µããªããåŠçããå¿
èŠãããããããã®èšäºã§ã¯å
·äœçãªæ¹æ³ã¯è§£èª¬ããŸããã
æé 1: GTFSãã¡ã€ã«ãPostgreSQLã«æå ¥ãã
éè¡é »åºŠå³ãäœæãã倧åæãšããŠãGTFSãã¡ã€ã«ããªãŒãã³ãœãŒã¹ã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§ããPostgreSQLã«æå ¥ããŸãã緯床çµåºŠããŒã¿ã®åŠçã®ããã«ãPostGISã䜿ããããã«ããŸãã
GTFSDBã®ã€ã³ã¹ããŒã«
ããŒã¿ããŒã¹ãžã®æå ¥ã«ã¯ãGTFSDBãšããããŒã«ãçšããŸããããã¯Pythonãå©çšããããŒã¿ããŒã¹ãžã®æå ¥ããŒã«ã§ããã®ãã«ãã®ããã«BuildoutãšããããŒã«ãçšããŸããããããããã¥ã¡ã³ãã«åŸã£ãŠã€ã³ã¹ããŒã«ããŸãã
$ pip3 install zc.buildout
$ buildout --version
buildout version 2.13.2
$ git clone https://github.com/OpenTransitTools/gtfsdb.git
$ cd gtfsdb
$ buildout install prod postgresql
ãã®æç¹ã§ãbin/gtfsdb-loadãšããŠGTFSDBãå®è¡ã§ããããã«ãªããŸãã
ããŒã¿ããŒã¹ã®åæå
PostgreSQLã«æ°ããããŒã¿ããŒã¹ãäœæããPostGISã䜿ããããã«æ¡åŒµæ©èœãèšå®ããŸããããŒã¿ããŒã¹åã¯é©å®èªã¿æ¿ããŠãã ããã
$ createdb gtfs-tobus
$ psql -d gtfs-tobus
gtfs-tobasu=# create extension postgis;
CREATE EXTENSION
gtfs-tobasu=# \q
æå ¥ã®å®è¡
äœæããããŒã¿ããŒã¹ã«å¯ŸããŠãããŠã³ããŒãããGTFSãã¡ã€ã«ãæå ¥ããŸããããŒã¿ããŒã¹ã®URLã«ãŠãŒã¶åãããŒã¿ããŒã¹åãèšå®ããã®ã§ãé©å®èªã¿æ¿ããŠãã ããããã®ã³ãã³ãã®å®è¡ãå®äºãããšãGTFSãPostgreSQLã«èªã¿èŸŒãŸããããšã«ãªããŸããGTFSãã¡ã€ã«ã®ãµã€ãºã«ãã£ãŠã¯å®äºãŸã§æ°åéãåŸ ã¡ãã ããã
$ bin/gtfsdb-load --database_url postgresql://[user]@localhost:5432/gtfs-tobus --is_geospatial GTFS.zip
ã¡ãªã¿ã«ãPostgreSQLã®URLã¯äžè¬çã«ä»¥äžã®ããã«è¡šçŸãããŸããèªèº«ã®ç°å¢ã«åãããŠãã ããã
postgresql://[user[:password]@][netloc][:port][,...][/dbname][?param1=value1&...]
æé 2: SQLã§åºéããšã®éè¡æ¬æ°ãéèš
åçæéã®ã©ã€ã³ãšãã®éãèµ°ãå ¬å ±äº€éæ©é¢ã®æ¬æ°ãéèšããããŒãã«ãäœæããŸãã
æåã«ãéèšçšã«æ°ããã¹ããŒãïŒåå空éã»ãã£ã¬ã¯ããªã®ãããªãã®ïŒãäœæããŸãã ãããŸã§ç»é²ãããŠããããŒã¿ã¯publicãšããã¹ããŒãã«ç»é²ãããŠãããšæããŸãããæ··åãé²ãããã«ãæ°ããéèšçšã®summaryã¹ããŒããäœæããŸãã
CREATE SCHEMA summary;
察象æ¥ã®stop_timesãæœåºããŠããŒãã«ã«æ ŒçŽ
éè¡é »åºŠå³äœæã®å¯Ÿè±¡ãšããæ¥ã®service_idäžèЧã¯ä»¥äžã®æ¹æ³ã§universal_calendarããŒãã«ããååŸåºæ¥ãŸããGTFSã§ã¯ãæ¬æ¥calendar.txtåã³calendar_dates.txtãè§£éããããšã§æ¥ä»ã«å¯Ÿå¿ããservice_idãååŸããã®ã§ãããGTFSDBãããŒã¿æå
¥æã«ãã®æé ãå®è¡ããuniversal_calendarãšããããŒãã«ã«æ¥ä»ããšã®service_idãæ ŒçŽããŠããã®ã§ãã·ã³ãã«ãªæ€çŽ¢ã§å¯Ÿè±¡æ¥ã®service_idäžèЧãååŸåºæ¥ãŸãã
SELECT
service_id
FROM
universal_calendar
WHERE
"date" = '2020-02-12'
;
察象æ¥ã«çŽä»ããstop_timesã®ã¿ãæœåºããsummary.stop_times_filteredãšããããŒãã«ã«æ ŒçŽããŸããWHEREç¯ã«ã¯ãå ã»ã©ã®service_idäžèЧååŸã®SQLããµãã¯ãšãªãšããŠçµã¿èŸŒã¿ãå éšçµåïŒINNER JOINïŒããtripsããŒãã«ã®service_idãçšããŠçµã蟌ã¿ãŸãããŸããstop_timesããŒãã«ã®stop_idã«ã¯ä¹ãå ŽïŒåïŒã®IDãæ ŒçŽãããŠããã®ã§ãããåŸã«å¿ èŠã«ãªããã芪ïŒparent_stationïŒã§ããåçæIDãstopsããŒãã«ãå éšçµåããŠååŸããŸãã
DROP TABLE IF EXISTS summary.stop_times_filtered;
CREATE TABLE summary.stop_times_filtered
AS
SELECT
stops.parent_station AS parent_stop_id,
stop_times.*
FROM
stop_times AS stop_times
INNER JOIN
trips AS trips
ON trips.trip_id = stop_times.trip_id
INNER JOIN
stops AS stops
ON stops.stop_id =stop_times.stop_id
WHERE
service_id IN (
SELECT
service_id
FROM
universal_calendar
WHERE
"date" = '2020-02-12'
)
;
飿¥åçæãã¢ã®ããŒãã«ãäœæ
åè»æå»ãæå³ããstop_timesãtrip_idããšã«ã°ã«ãŒãåãstop_sequenceé ã«äžŠã¹ãããšã§ã䟿åäœã®æå»è¡šãåºæ¥ãŸããããã§ã¯ãåè»æå»ã®æ
å ±ãåçæãšåçæã®åºéã®æ
å ±ã«èªã¿æ¿ããŸããããã§çšããŠããLEAD()ã¯Window颿°ãšåŒã°ããŠãã颿°ã®äžã€ã§ãããæ¡ä»¶ã§äžŠã¹ããšãã®nè¡åŸã®å€ãåŸãããšãåºæ¥ãŸããããã§ã¯ãtrip_idåäœã§åºåãã stop_sequenceã®é ã«äžŠã¹ããšãã®1è¡åŸã®stop_id, parent_stop_idã®å€ãåŸãŠããŸãããªããçµç¹ã®stop_timesã«ã¯æ¬¡ã®è¡ããªãã®ã§ãnext_stop_id, next_parent_stop_idã«ã¯ããã©ã«ãå€ãšããŠnullãèšå®ãããŸãã
DROP TABLE IF EXISTS summary.stop_pairs;
CREATE TABLE summary.stop_pairs
AS
SELECT
stop_times.stop_id AS prev_stop_id,
stop_times.parent_stop_id AS prev_parent_stop_id,
LEAD(stop_times.stop_id, 1, NULL) OVER(PARTITION BY trip_id ORDER BY stop_sequence) AS next_stop_id,
LEAD(stop_times.parent_stop_id, 1, NULL) OVER(PARTITION BY trip_id ORDER BY stop_sequence) AS next_parent_stop_id,
stop_sequence,
trip_id
FROM
summary.stop_times_filtered AS stop_times
order by
trip_id,
stop_sequence
;
ãããŸã§ã§åºåãããããŒã¿ã¯ã以äžã®ãããªããŒãã«ã«ãªããŸããå
šãŠã®äŸ¿ã®åçæã®åºéããšã«ãåã®åçæIDãšä¹ãå ŽIDãæ¬¡ã®åçæIDãšä¹ãå ŽIDãæ ŒçŽãããŠããããšãåãããŸãããªããçµç¹ã«ãããŠã¯æ¬¡ã®åçæãä¹ãå Žãããã©ã«ãå€ã®nullã«ãªããŸãã

飿¥åçæãã¢ã§éèšããåºéããšã®æ¬æ°ãæ ŒçŽããããŒãã«ãäœæ
ååçæIDïŒprev_parent_stop_idïŒã次åçæIDïŒnext_parent_stop_idïŒã§éèšïŒGROUP BYïŒããåçæåºéããšã®éè¡æ¬æ°ãæ±ããŸããWHEREç¯ã§ã¯ãçµç¹ã«ãããnullãèšå®ãããŠããããŒã¿ãé€å»ããåºéã®ã¿ãæœåºããŠããŸãã
DROP TABLE IF EXISTS summary.freq;
CREATE TABLE summary.freq
AS
SELECT
prev_parent_stop_id,
next_parent_stop_id,
count(*) as cnt
FROM
summary.stop_pairs
WHERE
next_parent_stop_id IS NOT null
GROUP BY
prev_parent_stop_id,
next_parent_stop_id
飿¥åçæãã¢ã«å°ç圢ç¶ãä»äžãã
åçæéã®æ
å ±ãå°å³åããããã«ã察å¿ããå°ç圢ç¶ãçŽä»ããŸããå°ç圢ç¶ã衚ãshapes.txtãå«ãGTFSããŒã¿ã®å Žåã¯ãéè·¯ã«æ²¿ã£ãããŒã¿ãäœãããšãå¯èœã§ãããããã§ã¯ãç°¡æãªæ¹æ³ãšããŠåçæéã®çŽç·ãå°ç圢ç¶ã«èšå®ããŠããŸããPostGISã®ST_MakeLine()颿°ã«ååçæã®äœçœ®æ
å ±ãæ¬¡åçæã®äœçœ®æ
å ±ãæž¡ããåããPostGISã®ST_SetSRID()颿°ã§é©åãªSRIDïŒGPSã«äœ¿ãããWGS84ã衚ã4326ïŒãèšå®ããçŽç·ã®ããŒã¿ãäœæããŠããŸãã
DROP TABLE IF EXISTS summary.freq_line;
CREATE TABLE summary.freq_line
AS
SELECT
freq.*,
prev_parent_stops.stop_name AS prev_name,
next_parent_stops.stop_name AS next_name,
ST_SetSRID(ST_MakeLine(prev_parent_stops.geom, next_parent_stops.geom),
4326) AS geom
FROM
summary.freq freq
INNER JOIN
stops AS prev_parent_stops
ON prev_parent_stops.stop_id = prev_parent_stop_id
INNER JOIN
stops AS next_parent_stops
ON next_parent_stops.stop_id = next_parent_stop_id
;
ãããŸã§ã®çµæãšããŠã以äžã®ãããªããŒãã«ãåŸãããŸããååŸãã¹åã®IDãšåç§°ãéè¡é »åºŠãçŽç·ã衚ãPostGISã®å°çããŒã¿ãæ ŒçŽãããŠããŸãã

æé 3: QGISã«ããŒã¿ãèªã¿èŸŒã¿æŽåœ¢ãã
QGISãèµ·åãæ°èŠãããžã§ã¯ããäœæããåŸã以äžã®æé ã§éè¡é »åºŠå³ã®äœæãé²ããŠãããŸãããã©ãã«ãé²ããããäœæ¥äžã¯é©å®ãããžã§ã¯ããä¿åããŠäžããã
QGISã«ãããŠå°çé¢ã¿ã€ã«å°å³ãå©çšå¯èœã«ãã
åœåå°çé¢ããæäŸãããŠããå°å³ããŒã¿ããä»åäœæããéè¡é »åºŠå³ã®èæ¯å³ãšããŠå©çšããŸããã¡ãã¥ãŒã®ãã¬ã€ã€ãâãããŒã¿ãœãŒã¹ãããŒãžã£ãâããã©ãŠã¶ããéãããXYZ Tilesããå³ã¯ãªãã¯ããæ°ããæ¥ç¶ããéžã³ãŸãã
ååããå°çé¢å°å³ïŒæ·¡è²ïŒããšããURLæ¬ã«https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.pngãèšå®ãOKãæŒããŸãã
ããŒã¿ãœãŒã¹ãããŒãžã£ã«è¿œå ããããå°çé¢å°å³ïŒæ·¡è²ïŒããããã«ã¯ãªãã¯ããããšã§ãå°çé¢å°å³ã衚瀺ãããŸããããŸã衚瀺ãããªãå Žåã¯ãæ¡å€§ãã¿ã³ãªã©ãçšããŠçž®å°ºã調æŽããããšã§è¡šç€ºãåºæ¥ãããã«ãªãããšããããŸããããŠã¹ãçšããŠå¯Ÿè±¡å°åã®ä»è¿ãæ¡å€§ããŸããã¿ã€ã«å°å³ãå©çšããã®ã§ãã¬ã³ããªã³ã°ã«ããã座æšåç §ç³»ã¯EPSG:3857ã䜿ãã®ãããã§ãããã
ãã¹åã»éè¡é »åºŠç·ã¬ã€ã€ãŒã远å ãã
PostgreSQLã®æ¥ç¶ãèšå®ããŸããã¡ãã¥ãŒã®ãã¬ã€ã€ãâãããŒã¿ãœãŒã¹ãããŒãžã£ãâããã©ãŠã¶ããéãããPostgreSQLããéžæããæ°èŠããæŒããŸãã
以äžã®ãããªèšå®ã§ãæ°ããPostGISæ¥ç¶ãäœæããå
¥ååŸãOKãã§ç¢ºå®ããŸãã
ååïŒä»»æã®åç§°ããã¹ãïŒlocalhostãããŒãïŒ5432ãããŒã¿ããŒã¹ïŒgtfs-tobus
æ°ãã«äœæããPostGISæ¥ç¶ãéžæãããç¶æ ã§ã(1)æ¥ç¶ ãæŒããŸããPostgreSQLã®ãŠãŒã¶åããã¹ã¯ãŒããå ¥åããŸããæ¥ç¶ã«æåãããšãpublicãšsummaryã®ã¹ããŒãããã®äžã«ããã€ãã®ããŒãã«ã衚瀺ãããŸãããã®äžãã(2)summary.freq_lineããŒãã«ãéžæã㊠(3)远å ã(4)public.stopsããŒãã«ãéžæã㊠(5)远å ããŸãã
QGISç»é¢ã«ãã¹åãšè·¯ç·ã衚瀺ãããŸãïŒè²ã¯ã©ã³ãã ïŒã
ãã®ç¶æ ã§ã¯ãåçæïŒèŠªïŒãšä¹ãå ŽïŒåïŒåæ¹ã衚瀺ãããŠããã®ã§ãåçæã®ã¿è¡šç€ºããããã«èšå®ããŸããã¬ã€ã€ã®ãstopsããå³ã¯ãªãã¯âããããã£ãã¯ãªãã¯ãã¬ã€ã€ããããã£ã®ç»é¢ãåŒã³åºããŸãã
ã¬ã€ã€ããããã£ã®ããœãŒã¹ããããã¯ãšãªãã«ãããåŒã³åºããŸãã

ã¯ãšãªãã«ãã®ããããã€ãç¹æã®ãã£ã«ã¿åŒãã«"location_type" = 1ãšå
¥åããOKã§ãŠã£ã³ããŠãéããŸãããã®ãŸãŸæå
¥åãå¯èœã§ãããå³äžã®ããã£ãŒã«ããæ¬ããlocation_typeãã¯ãªãã¯ãããæŒç®åããã*=*ãå
¥åããããšã§ããã¹ãªãå
¥åãåºæ¥ãŸãã

GTFSã®location_typeãã£ãŒã«ãã«ã¯ãåçæïŒèŠªïŒãªãã°1ãããšä¹ãå ŽïŒåïŒãªãã°0ãå ¥åãããŠããã®ã§ããããèšå®ããããšã§åçæã®ã¿ãQGISã®ç»é¢äžã«è¡šç€ºãããããã«ãªããŸãã
ãã¹åã®ã¹ã¿ã€ã«èšå®
ãã¹åã®è¡šç€ºã調æŽããŸããã¬ã€ã€ã®ãstopsããå³ã¯ãªãã¯âããããã£ãã¯ãªãã¯ãã¬ã€ã€ããããã£ã®ç»é¢ãåŒã³åºãããã·ã³ãããžããéžæããŸãããã·ã³ãã«ããŒã«ãŒããéžæãã[倧ãã]ã1.5ã[å¡ãã€ã¶ãè²]ãé»ã[ã¹ãããŒã¯ã¹ã¿ã€ã«]ããã³ãªãã«èšå®ããŠOKãæŒããŸãã
ãã¹åã®æç»ã¹ã¿ã€ã«ãå€ãããé»ãç¹ã§è¡šç€ºãããããã«ãªããŸãã
次ã«ãã¹åã®ã©ãã«ãšããŠãã¹ååã衚瀺ãããããã«èšå®ããŸããã¬ã€ã€ã®ãstopsããå³ã¯ãªãã¯âããããã£ãã¯ãªãã¯ãã¬ã€ã€ããããã£ã®ç»é¢ãåŒã³åºãããã©ãã«ããéžæããŸãããã©ãã«ãªããããåäžå®çŸ©ïŒsingleïŒãã«åãæ¿ããå€ãšããŠstop_nameãéžæããŸãããã©ã³ããã¹ã¿ã€ã«ããµã€ãºãè²ãé©å®éžæããŠOKãæŒããŸãã
èšå®ãããã©ã³ãã§ãã¹ååã衚瀺ãããããšã確èªã§ããŸãã

ããã«ãã®ã¹ã¿ã€ã«ãæ¹è¯ããŸããå床ã¬ã€ã€ããããã£ã®ç»é¢ãããã©ãã«ããéžæãã[ãããã¡]-[ããã¹ããããã¡ãæç»ãã]ããã§ãã¯ããŸããæåã®åšèŸºãèšå®ããè²ã§çžåããããå°å³äžã§ã©ãã«ãå€èªãããããªããŸãã
ããã«ãã©ãã«ã衚瀺ãããæ¡ä»¶ãèšå®ããæ¡å€§ãããšãã ã衚瀺ãããããã«èª¿æŽããŸãã[æç»]-[瞮尺ã«å¿ãã衚瀺èšå®]ããã§ãã¯ãã1:50000ãçž®å°åŽã®éçã«èšå®ããŠOKãæŒããŸãã
ãã®èšå®ã«ããã1:50000ããæ¡å€§ãããšãã ããçœã§çžåããã©ãã«ã衚瀺ãããããã«ãªããã¹ååãèŠããããªããŸãã
éè¡é »åºŠç·ã®ã¹ã¿ã€ã«èšå®
次ã«ãéè¡é »åºŠç·ã®è¡šç€ºã調æŽããŸããã¬ã€ã€ã®ãfreq_lineããå³ã¯ãªãã¯âããããã£ãã¯ãªãã¯ããã¬ã€ã€ããããã£ã®ç»é¢ãåŒã³åºãããã·ã³ãããžããéžæããŸãããã·ã³ãã«ã©ã€ã³ããéžæããè²ãéè²ãªã©åãããããè²ã«èšå®ããŸãã
次ã«ãã¹ãããŒã¯å¹ ãéè¡æ¬æ°ã«å¿ããå¹ ã«ãªãããã«èšå®ããŸããã¹ãããŒã¯å¹ èšå®æ¬ã®å³ç«¯ã«ããã¢ã€ã³ã³ãã¯ãªãã¯ãåºãŠããã¡ãã¥ãŒãããç·šéããéžæããåŒæååãã«ããåŒã³åºããŸãã
åŒå
¥åæ¬ã«ç·å¹
ã®èšç®åŒãå
¥åããŸããéè¡é »åºŠãcntãšãã倿°ã«æ ŒçŽãããŠããã®ã§ããã®å€ããç·å¹
ãèšç®ããŸããããã§ã¯ã("cnt"^0.8) * 0.04ãšå
¥åããŠOKãæŒããŸãã^ïŒãããïŒã¯ããã°ã©ãã³ã°èšèªã«ãããŠéä¹ã衚çŸããŸããæ¬æ°ãšç·å¹
ãæ¯äŸã«ããã0.8ä¹ããããšã§ãé »åºŠãå€ãè·¯ç·ãå°ãªãè·¯ç·ããããããã©ã³ã¹è¯ã衚瀺ããŠããŸãã
ãããŸã§ã®èšå®ã§ãéè¡é »åºŠã«å¿ããç·å¹ ã§è·¯ç·ã衚瀺ãããããã«ãªããŸãã
éè¡é »åºŠã®ã©ãã«èšå®
æåŸã«ãéè¡é »åºŠã®æ°å€ãç·ã«ä»éããã©ãã«ãšããŠè¡šç€ºããŸããåã³ã¬ã€ã€ã®ãfreq_lineãã®ã¬ã€ã€ããããã£ã®ç»é¢ãåŒã³åºãããã©ãã«ããéžæããŸãããåäžå®çŸ©ïŒsingleïŒããéžæããå€ãšããŠãcntããéžæããŸãããã©ã³ãããµã€ãºãé©å®èšå®ããŸãã
è²èšå®æ¬ã®å³ç«¯ã®ã¡ãã¥ãŒãã¯ãªãã¯ãããç·šéããéžæãåŒæååãã«ãã衚瀺ããŸãã
ç·ã®è²ãå°ãæãããå€ãèšå®ããããã«ãdarker(@symbol_color, 150)ãšå
¥åããŠOKãæŒããŸãã
[ãããã¡]-[ããã¹ããããã¡ãæç»ãã]ããã§ãã¯ãããµã€ãºãã0.5ãã«ããŸãã
ã©ãã«ãè·¯ç·æ²¿ãã®å·ŠåŽã«è¡šç€ºãããããã«ã[é 眮]-[ç·ã®åãã«äŸåããäœçœ®]ããã§ãã¯ããŸãã
ãããŸã§ã®æé ã§ãéè¡é »åºŠå³ã宿ããŸããããã®ããšãè²ã倪ããªã©ã®ãã©ã¡ãŒã¿ãŒã調æŽããªããããã®å°åã«ãµããããéè¡é »åºŠå³ãäœã£ãŠäžããã宿ããéè¡é »åºŠå³ã¯ãQGISã®ãšã¯ã¹ããŒãæ©èœã§ç»åãPDFãªã©ã«åºåããããšãåºæ¥ãŸãã
éè¡é »åºŠå³ã®äœæïŒå¿çšç·š
å°åã®äº€éã®å®æ ã衚çŸããããã«ã¯ããããŸã§è§£èª¬ããæè¡ãå¿çšããŠãããé«åºŠãªéè¡é »åºŠå³ãã€ããå¿ èŠãåºãŠããå ŽåããããŸããå ·äœçãªäœãæ¹ã«é¢ããŠã¯ããŒãžã®é¢ä¿ã§è§£èª¬åºæ¥ãªãã§ããããã³ããšãªããããª3ã€ã®äŸã以äžã«ç€ºããŸãã
Shapeã䜿ã£ãéè¡é »åºŠå³
GTFSDBã«ãã£ãŠäœæãããpatternsããŒãã«ã«ãGTFSãã¡ã€ã«ã«å«ãŸããshapes.txtã«ç»é²ãããŠããéè¡çµè·¯ã®åœ¢ç¶ïŒshapeïŒãPostGISã®LINESTRINGïŒå°ççãªæãç·ïŒãšããŠæ ŒçŽãããŠããŸããããããã¹ååºéããšã«åãåºãããšã§ããã¹åéãçŽç·ã§ã¯ãªãå®éã®é路圢ç¶ã«æ²¿ã£ã圢ã§éè¡é »åºŠå³ãäœæåºæ¥ãŸããéœåžåãæ¡å€§ããŠæããããšããªã©ã¯ããã®ç²ŸåºŠã®éè¡é »åºŠå³ããã£ãæ¹ãããã§ãããã
å®éã«äœæããShapeã䜿ã£ãå Žåã®éœãã¹ã®éè¡é »åºŠå³ïŒå¹³æ¥ïŒã®äŸã以äžã«ç€ºããŸãã
LINESTRINGã®åãåºãã«ã¯ãPostGISã®ST_LineLocatePoint()颿°ã§ãã¹åã®POINTãLINESTRINGã®ã©ã®äœçœ®ã«æãè¿ãããæ±ãããããåŒæ°ãšããŠST_LineSubstring()颿°ã§å®éã«åãåºããè¡ããŸããå®éã®äœæ¥ã«ãããŠã¯ãäºã€ã®ãã¹åéãçµã¶LINESTRINGã¯äžçš®é¡ãšã¯éããªãããã代衚ããLINESTRINGãéžæããå¿
èŠããããªã©æ§ã
ãªèª²é¡ããããããããã§ã¯è©³çްã¯èª¬æããŸããã
å°æ°ç¹ãèããéè¡é »åºŠå³
å°åã«ãã£ãŠã¯ããã¹ãæ¥ãã®ã¯ç¹å®ã®ææ¥ã ãããªã©1æ¥1䟿ãèµ°ããªããšãªã¢ããããŸãããã®ãããªå Žåã¯ãç¹å®ã®1æ¥ã®æ¬æ°ãå³ç€ºãããããããæéã®å¹³åæ¬æ°ã瀺ããæ¹ãå°åã®å ¬å ±äº€éã®çè§£ã«åœ¹ç«ã¡ãŸããäŸã§ã¯ãå®®åŽçäž²éåžã®GTFSããŒã¿ããããã®å°åã®è·¯ç·ãã¹ã®1æ¥ãããã®å¹³åæ¬æ°ã瀺ããŠããŸããå±±ééšã§ã¯ã1æ¥ã«1䟿ãèµ°ã£ãŠããªãããšãããåãããŸãã
è€æ°äºæ¥è ãè²åãããéè¡é »åºŠå³
è€æ°äºæ¥è ãç«¶åãããšãªã¢ã«ãããŠã¯ãäºæ¥è ããšã®é åããµãŒãã¹æ°Žæºãç¥ãããå ŽåããããŸããããããå Žåã¯ãéè¡é »åºŠå³ãäºæ¥è ããšã«è²åãããŠéããããšã§å°åå šäœã®å ¬å ±äº€éã®ç¶æ³ãææ¡ããããšãåºæ¥ãŸããäŸã§ã¯ã6äºæ¥è ãç«¶åãã岡山åžå ã®ãã¹ã®ç¶æ³ãå³ç€ºããŠããŸãã
ãŸãšã
ãã®èšäºã§ã¯ãéè¡é »åºŠå³ã®äœå³æ¹æ³ã解説ããŸãããå°åã®å ¬å ±äº€éã®ç¶æ³ãçŽæçã«ææ¡ããããŒã«ãšããŠæå¹ã§ãè¡æ¿ã®è·å¡ãªã©ã«ãã®å³ãèŠãããšãã€ã€ãè·¯ç·èšç»ã«èŸŒããæãããããããšåŒãåºãããªã©ãã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ãšããŠã®æ©èœã宿ããŠããŸããGTFSãå©çšããããšã§ãããŒã¿ããããã°åå°åã§ã»ãŒå ±éã®æ¹æ³ã§äœããããã«ãªã£ãã®ã§ãæ¯éãåå°ã§éè¡é »åºŠå³ãäœæããŠã¿ãŠäžããã







