最初に結論を書いておきます。
こちらの記事に書いた osm2pgsql を利用して立ち上げたタイルサーバーでは、pbfファイルを作るのは非常に難しいです。
以下は、この結論になるに至るまでに調べたこととかを備忘録代わりに書いておきます。
動機
さて、まず、タイルサーバーでpbfファイルを作りたいなと思った動機です。
避難所検索@伊勢というオフラインマップを利用したAndroidアプリをリリースしているのですが、このアプリで使うオフライン用の地図データが、 pbf ファイルをもとにして、map ファイルという形で作成されます( なお、作り方については、こちらの記事などを参照してください)。
この、pbfファイルは、通常のOpenStreetMap のデータファイル(.osmファイル、xml形式)をバイナリでまとめたものになります。 タイルサーバーは常に最新の地図データになるように更新しているので、これをもとにpbfファイルを作れれば、簡単に最新のオフライン用地図データを作れるんじゃないかな?と思ったのが動機です。
最初のトライ
OpenStrretMap の osmosis のドキュメントに --read-apidb ってオプションを使って xml ファイルに書き出す例が載ってるので、それに従って試してみます。 この時、pbf で出力したいなら、 --write-pbf オプションを指定すればいいみたい。
試してみると
osm@map:~$ osmosis --read-apidb database="gis" user="osm" --write-pbf file="jm.osm.pbf" 1 25, 2019 11:22:54 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Osmosis Version 0.44.1 1 25, 2019 11:22:55 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Preparing pipeline. 1 25, 2019 11:22:55 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Launching pipeline execution. 1 25, 2019 11:22:55 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Pipeline executing, waiting for completion. 1 25, 2019 11:22:55 午前 org.openstreetmap.osmosis.core.pipeline.common.ActiveTaskManager waitForCompletion 重大: Thread for task 1-read-apidb failed org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (サーバーは、パスワード・ベースの認証を要求しました、しかし、いかなるパスワードも提供されませんでした。) at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:243) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128) at org.openstreetmap.osmosis.apidb.common.DatabaseContext2.executeWithinTransaction(DatabaseContext2.java:89) at org.openstreetmap.osmosis.apidb.v0_6.ApidbReader.run(ApidbReader.java:105) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (サーバーは、パスワード・ベースの認証を要求しました、しかし、いかなるパスワードも提供されませんでした。) at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1551) at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1390) at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1046) at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202) ... 5 more Caused by: org.postgresql.util.PSQLException: サーバーは、パスワード・ベースの認証を要求しました、しかし、いかなるパスワードも提供されませんでした。 at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:444) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:173) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64) at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:136) at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29) at org.postgresql.jdbc3.Jdbc3Connection.<init>(Jdbc3Connection.java:24) at org.postgresql.Driver.makeConnection(Driver.java:393) at org.postgresql.Driver.connect(Driver.java:267) at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1558) at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1547) ... 8 more 1 25, 2019 11:22:55 午前 org.openstreetmap.osmosis.core.Osmosis main 重大: Execution aborted. org.openstreetmap.osmosis.core.OsmosisRuntimeException: One or more tasks failed. at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.waitForCompletion(Pipeline.java:146) at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:92) at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:328) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:408) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:351) at org.codehaus.classworlds.Launcher.main(Launcher.java:31) osm@map:~$
Exceptionの山。
何が悪いんだろうか?と思って、ネットであれこれ調べると read-pgsql ってオプションもあることがわかりました。
xml - Using osmosis to convert POSTGIS Table to .OSM - Stack Overflow
なので、これに切り替えて試すも、結果は同じ、Exceptionの山。 その後、host, user, password とかを変えていろいろと試してみたけど、一向にできません。
原因を調べる
Exception をよく見ると、認証で引っかかっている模様です。 そういえば、こちらの記事でセットアップしたのだけど、Postgres のユーザーにはパスワードを付けた覚えがありません。
でも、下記のリファレンスを見ても、--read-apidb で特段のオプション指定がないと、パスワードなしで接続する模様です。
https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.47#--read-apidb_.28--rd.29
さて、何が起こっているんだろうか?
考えてみる
ちょっと立ち止まって、少し考えてみました。
psql でデータベースに接続するときは、osmユーザー(OSのユーザー)でログインしていれば、
psql -d gis
のようにデータベース名だけ指定すれば問題なく接続できます。これって、なんででしょうか?
これは、PostgreSQL の認証周りを調べないとよくわからないぞ。 ということで、PostgreSQL の認証周りを調べてみることにしました。
PostgreSQL の認証
どこから見つけた情報かはもう忘れてしまいましたが、 pg_hba.conf というファイルでユーザー認証を制御しているらしいということがわかりました。
今のタイルサーバーだと、 /etc/postgresql/9.5/main に pg_hba.conf というファイルがありました。
で、デフォルトの設定を確認すると
# Database administrative login by Unix domain socket local all postgres peer # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5
となっていました。
この設定内容がどういうことなんだろうかと、わからないながらマニュアルと見比べていくと、 ネットワーク経由の場合(hostの行が該当)は、md5認証(パスワード認証の一種)になっており、 パスワードが未設定の場合は、常にPostgreSQLへの接続に失敗する、と書いてありました。
これが原因でしょう、きっと。
一方、psqlでの接続は、localが使われてるっぽい。なので、Unixユーザーがosmに切り替わっていれば、peerで認証されるので、そのままPostgresqlのユーザーとしてosmが使われ、 パスワードなしだから、接続できる、ってことのようです。
認証方法の変更(pg_hba.conf の編集)
さて、osmosis での接続時は -h でホストを指定するので常にネットワーク経由での接続じゃないかと推測されます。なので、この設定ファイルを変更してやればよさげです。 ちなみに、dbユーザーにパスワードを付けるという選択肢もあるけど、タイルサーバーの更新スクリプト周りも変えることになるとはまりそうなので、こっちは採用しませんでした。
ということで、pg_hba.conf を編集します。
# "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host gis osm 127.0.0.1/32 trust host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5
host 接続の対象データベースが gis でユーザーが osm の場合のみ信頼するように trust を付けました。
変更内容を有効にするため、postgreSQL を再起動します。
mor@map:/etc/postgresql/9.5/main$ sudo /etc/init.d/postgresql restart [ ok ] Restarting postgresql (via systemctl): postgresql.service. mor@map:/etc/postgresql/9.5/main$
これで再度試してみます。
二回目のトライ
さて、再度試してみましたが、結果は変わらず Exception の山。
osm@map:~$ osmosis --read-apidb database="gis" user="osm" --write-pbf file="jm.osm.pbf" 1 25, 2019 11:48:21 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Osmosis Version 0.44.1 1 25, 2019 11:48:22 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Preparing pipeline. 1 25, 2019 11:48:22 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Launching pipeline execution. 1 25, 2019 11:48:22 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Pipeline executing, waiting for completion. 1 25, 2019 11:48:22 午前 org.openstreetmap.osmosis.core.pipeline.common.ActiveTaskManager waitForCompletion 重大: Thread for task 1-read-apidb failed org.openstreetmap.osmosis.core.OsmosisRuntimeException: Unable to create resultset. at org.openstreetmap.osmosis.apidb.common.DatabaseContext.executeQuery(DatabaseContext.java:429) at org.openstreetmap.osmosis.apidb.v0_6.impl.SchemaVersionValidator.validateDBVersion(SchemaVersionValidator.java:82) at org.openstreetmap.osmosis.apidb.v0_6.impl.SchemaVersionValidator.validateVersion(SchemaVersionValidator.java:55) at org.openstreetmap.osmosis.apidb.v0_6.ApidbReader.runImpl(ApidbReader.java:74) at org.openstreetmap.osmosis.apidb.v0_6.ApidbReader$1.doInTransactionWithoutResult(ApidbReader.java:110) at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:33) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131) at org.openstreetmap.osmosis.apidb.common.DatabaseContext2.executeWithinTransaction(DatabaseContext2.java:89) at org.openstreetmap.osmosis.apidb.v0_6.ApidbReader.run(ApidbReader.java:105) at java.lang.Thread.run(Thread.java:748) Caused by: org.postgresql.util.PSQLException: ERROR: relation "schema_migrations" does not exist ポジション: 21 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:403) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:283) at org.openstreetmap.osmosis.apidb.common.DatabaseContext.executeQuery(DatabaseContext.java:424) ... 9 more 1 25, 2019 11:48:22 午前 org.openstreetmap.osmosis.core.Osmosis main 重大: Execution aborted. org.openstreetmap.osmosis.core.OsmosisRuntimeException: One or more tasks failed. at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.waitForCompletion(Pipeline.java:146) at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:92) at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:328) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:408) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:351) at org.codehaus.classworlds.Launcher.main(Launcher.java:31) osm@map:~$
ただ、接続はできたっぽくて、Exception の中身が違ってきてます。
一応、--read-pgsqlも試してみると、
osm@map:~$ osmosis --read-pgsql database="gis" user="osm" --dataset-dump --write-pbf file="jm.osm.pbf" 1 25, 2019 11:49:28 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Osmosis Version 0.44.1 1 25, 2019 11:49:28 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Preparing pipeline. 1 25, 2019 11:49:28 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Launching pipeline execution. 1 25, 2019 11:49:28 午前 org.openstreetmap.osmosis.core.Osmosis run 情報: Pipeline executing, waiting for completion. 1 25, 2019 11:49:28 午前 org.openstreetmap.osmosis.core.pipeline.common.ActiveTaskManager waitForCompletion 重大: Thread for task 1-read-pgsql failed org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT version FROM schema_info]; nested exception is org.postgresql.util.PSQLException: ERROR: relation "schema_info" does not exist ポジション: 21 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:237) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:407) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:464) at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:472) at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:477) at org.openstreetmap.osmosis.pgsnapshot.common.SchemaVersionValidator.validateDBVersion(SchemaVersionValidator.java:64) at org.openstreetmap.osmosis.pgsnapshot.common.SchemaVersionValidator.validateVersion(SchemaVersionValidator.java:47) at org.openstreetmap.osmosis.pgsnapshot.v0_6.impl.PostgreSqlDatasetContext.initialize(PostgreSqlDatasetContext.java:99) at org.openstreetmap.osmosis.pgsnapshot.v0_6.impl.PostgreSqlDatasetContext.iterate(PostgreSqlDatasetContext.java:197) at org.openstreetmap.osmosis.dataset.v0_6.DumpDataset.process(DumpDataset.java:48) at org.openstreetmap.osmosis.pgsnapshot.v0_6.PostgreSqlDatasetReader.run(PostgreSqlDatasetReader.java:53) at java.lang.Thread.run(Thread.java:748) Caused by: org.postgresql.util.PSQLException: ERROR: relation "schema_info" does not exist ポジション: 21 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:403) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:283) at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:209) at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:209) at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:441) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396) ... 11 more 1 25, 2019 11:49:29 午前 org.openstreetmap.osmosis.core.Osmosis main 重大: Execution aborted. org.openstreetmap.osmosis.core.OsmosisRuntimeException: One or more tasks failed. at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.waitForCompletion(Pipeline.java:146) at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:92) at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:328) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:408) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:351) at org.codehaus.classworlds.Launcher.main(Launcher.java:31) osm@map:~$
微妙にExceptionの中身が違ってきてますね。
いずれにせよ、schemaがどうこうってメッセージがでてます。なんだこれ?
調査
調べてみると、そのももずばりで困ってる人がいました。
Postgis DB to osm pbf file - OSM Help
でも、回答なしです。
もうちょっと調べると、インポート時の話ですが、read-pgsql の時の Exception と似たことで困ってるのがありました。
Osmosis: import .osm to postgresql fails - OSM Help
この回答を見ると、schemaを作れ、とあります。
ん? なんだその話。
最初にタイルサーバーを立ち上げたときの手順にはそんなの載ってなかったはずです。
ということで、上記コメント内のリンクをたどると、ありました。
Osmosis/PostGIS Setup - OpenStreetMap Wiki
でも、この手順って、まんま OpenStreetMap のデータベースを作成する手順なんで、今のものと互換性あるんでしょうか?
で、気になったので、上記のドキュメントに載っている osmosis_dir/script/pgsnapshot_schema_0.6.sql なんてのの中身を見てみようと思い、 実際に今のタイルサーバーにインストール済みの osmosis について調べると
mor@map:~$ dpkg -L osmosis /. /etc /etc/osmosis /etc/osmosis/log4j.properties /etc/osmosis/plexus.conf /usr /usr/bin /usr/bin/osmosis /usr/share /usr/share/doc /usr/share/doc/osmosis /usr/share/doc/osmosis/examples /usr/share/doc/osmosis/examples/pgsnapshot_schema_0.6.sql /usr/share/doc/osmosis/examples/contrib /usr/share/doc/osmosis/examples/contrib/apidb_0.6_osmosis_xid_indexing.sql /usr/share/doc/osmosis/examples/contrib/apidb_0.6.sql /usr/share/doc/osmosis/examples/contrib/dump_apidb.sh /usr/share/doc/osmosis/examples/contrib/replicate_osm_file.sh /usr/share/doc/osmosis/examples/contrib/CreateGeometryForWays.sql /usr/share/doc/osmosis/examples/pgsnapshot_schema_0.6_upgrade_4-5.sql /usr/share/doc/osmosis/examples/pgsnapshot_schema_0.6_bbox.sql /usr/share/doc/osmosis/examples/pgsimple_schema_0.6_bbox.sql /usr/share/doc/osmosis/examples/pgsnapshot_and_pgsimple.txt /usr/share/doc/osmosis/examples/pgsnapshot_schema_0.6_upgrade_5-6.sql /usr/share/doc/osmosis/examples/pgsimple_schema_0.6_linestring.sql /usr/share/doc/osmosis/examples/pgsimple_load_0.6.sql /usr/share/doc/osmosis/examples/munin /usr/share/doc/osmosis/examples/munin/osm_replication_lag /usr/share/doc/osmosis/examples/munin/README /usr/share/doc/osmosis/examples/munin/osm_replication.conf /usr/share/doc/osmosis/examples/pgsnapshot_load_0.6.sql /usr/share/doc/osmosis/examples/pgsnapshot_schema_0.6_action.sql /usr/share/doc/osmosis/examples/pgsimple_schema_0.6.sql /usr/share/doc/osmosis/examples/pgsimple_schema_0.6_action.sql /usr/share/doc/osmosis/examples/pgsnapshot_schema_0.6_linestring.sql /usr/share/doc/osmosis/examples/fix_line_endings.sh /usr/share/doc/osmosis/copyright /usr/share/doc/osmosis/changelog.Debian.gz /usr/share/doc/osmosis/README /usr/share/man /usr/share/man/man1 /usr/share/man/man1/osmosis.1.gz /usr/share/osmosis /usr/share/osmosis/osmosis-apidb-0.44.1.jar /usr/share/osmosis/osmosis-hstore-jdbc-0.44.1.jar /usr/share/osmosis/osmosis-core-0.44.1.jar /usr/share/osmosis/osmosis-dataset-0.44.1.jar /usr/share/osmosis/osmosis-xml-0.44.1.jar /usr/share/osmosis/osmosis-pbf-0.44.1.jar /usr/share/osmosis/osmosis-replication-http-0.44.1.jar /usr/share/osmosis/osmosis-areafilter-0.44.1.jar /usr/share/osmosis/osmosis-extract-0.44.1.jar /usr/share/osmosis/osmosis-set-0.44.1.jar /usr/share/osmosis/osmosis-pgsnapshot-0.44.1.jar /usr/share/osmosis/osmosis-pgsimple-0.44.1.jar /usr/share/osmosis/osmosis-pbf2-0.44.1.jar /usr/share/osmosis/osmosis-tagfilter-0.44.1.jar /usr/share/osmosis/osmosis-replication-0.44.1.jar /usr/share/osmosis/osmosis-osm-binary-0.44.1.jar /usr/share/osmosis/osmosis-tagtransform-0.44.1.jar mor@map:~$
/usr/share/doc/osmosis/examples にインストールされていますね。 で、実際に中を見てみると、下記のような今のテーブル構成と全然異なっています。
osm@map:~$ psql -d gis psql (9.5.14) Type "help" for help. gis=> \d List of relations Schema | Name | Type | Owner --------+--------------------+-------+---------- public | geography_columns | view | postgres public | geometry_columns | view | osm public | planet_osm_line | table | osm public | planet_osm_nodes | table | osm public | planet_osm_point | table | osm public | planet_osm_polygon | table | osm public | planet_osm_rels | table | osm public | planet_osm_roads | table | osm public | planet_osm_ways | table | osm public | raster_columns | view | postgres public | raster_overviews | view | postgres public | spatial_ref_sys | table | osm (12 rows) gis=>
ということで、単純に examples 以下の sql を実行してもいろいろと問題になりそうな予感ばかりが立ちます。 さて、どうしたものかな。
スキーマ
ということで、もうちょっと調べてみると、OpenStretMap のデータベースって1種類じゃなくて、用途に応じて何種類もスキーマがあるということがわかりました。
Databases and data access APIs - OpenStreetMap Wiki
なるほど、そういうことか。
でもって、osm2pgsql で使ってるスキーマは、レンダリングに特化したもので、osm データ(xmlやpbf)の取得には適さないそうです。
- openstreetmap - pgsql2osm? How to generate osm files from osm2pgsql database? - Geographic Information Systems Stack Exchange
- https://docs.getmaps.io/osm-faq/pgsql2osm-how-to-generate-osm-files-from-osm2pgsql-database/
- pgsql2osm vs (not) osmosis / Development / OpenStreetMap Forum
- [OSM-dev] problem with osmosis to apply changeset to postgresql db
ということで、今使っているタイルサーバーのスキーマと osmosis でpbf出力を行う際に想定しているスキーマが異なるので、簡単には pbf ファイルが作れないということがわかりました。 ついでに、 --read-apidb と --read-pgsql オプションでは想定しているスキーマも異なっていたようです。
まとめ
たぶん OpenStreetMap 界隈でサーバー扱ってる人には、このようなことは当たり前なんでしょうけど、初心者にはハードルが高いです。どこかに情報がまとまって落ちてるとありがたいです(が、そこを見つけるのもまだ一苦労なんだろうな、きっと)。 さすがに、調べに調べた挙句、できなかったのでちょっと疲れました。
とはいえ、オフラインマップ用のデータを更新していかないといけないので、めげずに次の方法を探ることにします。