[PostgreSQL] osm2pgsql
์ด์ ํฌ์คํธ
https://blog.naver.com/sssang97/223746834114
osm2pgsql์ OSM์ PostgreSQL์ ๋ถ์ด์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ converter๋ค.
์ด๊ฑฐ ์์ฒด๊ฐ ๋ ๋ฆฝ์ ์ธ ์์คํ ์ ์๋๊ณ , ์ด๊ฑธ๋ก ๋ฐ์ดํฐ๋ง Postgres์ ์ง์ด๋ฃ๊ณ PostGIS๋ฅผ ํตํด ์ขํ ์ฟผ๋ฆฌ๋ฅผ ์๋ ์์ผ๋ก ์์ฉํ๋ค.
๊ทธ๋์ ์ด๊ฑธ ์ฐ๋ ค๋ฉด PostGIS์ ๋ํ ์ฌ์ ์ง์์ด ์๊ณ , ์ค์น๋ ๋์ด์์ด์ผ ํ๋ค.
https://blog.naver.com/sssang97/223381620061
PBF ํ์ผ ์ค๋น
๊ฐ์ฅ ๋จผ์ ์ง๋ ํ์ผ์ด ํ์ํ๋ค.
์ ์ธ๊ณ์ ์ ์ฒด ์ง๋๊ฐ ํ์ํ๋ค๋ฉด ๋ค์ ๋ฏธ๋ฌ ์ฌ์ดํธ์์ ์ ๋นํ ๋ฐ์ผ๋ฉด ๋๋ค.
79gb ์ ๋ ๋๋๊น ๋๋ํ 100gb ์ ๋๋ ์ฌ์ ๊ณต๊ฐ์ ๋ฌ์ผ ํ๋ค.
https://planet.openstreetmap.org/pbf/planet-latest.osm.pbf
ํน์ ๊ตญ๊ฐ๋ค๋ง ์์ด๋ ๋๋ค๋ฉด ๋ค์ ์ฌ์ดํธ์์ ๋ถ๋ถ์งํฉ๋ค๋ง ๋ฐ์ ์๋ ์๋ค.
https://download.geofabrik.de/
์ผ๋จ ๋๋ ํ๊ตญ์ธก ๋ฐ์ดํฐ๋ง ๋ฐ์๋ค. ๋ฏธ๋ฌ ์ฌ์ดํธ๋ค ์ฑ๋ฅ์ด ์ข์ง ์์์ ์์๊ฑธ๋ก ๋ฐ์๋ ๊ฝค ์ค๋๊ฑธ๋ฆฐ๋ค.
wget -O data.pbf https://download.geofabrik.de/asia/south-korea-latest.osm.pbf

osm2pgsql ์ค์นํ๊ธฐ (in Linux)
์ด์ ์ง์ ์ค์นํด์ ๋๋ ค๋ณด์.
๋จผ์ cli๋ฅผ ์ค์นํ๊ณ
sudo apt-get install osm2pgsql

์คํ์ด ๋๋ฉด ์ ๊น๋ฆฐ ๊ฒ์ด๋ค.

์ ์ฅ ๋์์ผ๋ก ์ธ postgres์ ์์ ๊ณผ extension์ ๊น์์ค๋ค.
sudo -u postgres createuser osmuser
sudo -u postgres createdb --encoding=UTF8 --owner=osmuser osm
sudo -u postgres psql osm --command='CREATE EXTENSION postgis;'
sudo -u postgres psql osm --command='CREATE EXTENSION hstore;'
sudo -u postgres psql osm --command='ALTER USER osmuser WITH PASSWORD 'q1w2e3r4';'
์ ๊ธฐ๋ค๊ฐ ๋ฃ์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๋ ํ์ผ์ osm2pgsql๋ฅผ ํตํด ๊ฐ๊ณตํด์ postgres์ ์ ๋ก๋ํ๋ฉด ๋์ด๋ค.
osm2pgsql --database=osm --user=osmuser --password=q1w2e3r4 ./data.pbf

๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฉ ๋จน๊ณ ๋๋๊ฑฐ๋ผ ์คํ์๋ ์์ฒด๋ ๊ด์ฐฎ๋ค. ๊ธ๋ฐฉ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ db์ ๋ค์ด๊ฐ๋ฉด
๋ญ๊ฐ ์ด๋์ ๋ฆฌ ์๊ฒจ์์ ๊ฒ์ด๋ค.
planet_osm_point๊ฐ ๊ฐ๊ฐ์ ๋์, ๋ง์ ๋ฑ์ ๋ํ ์ขํ๊ฐ.
planet_osm_polygon์ด ์์ญ์ ๋ํ ๋ค๊ฐํ ๊ฐ.
planet_osm_lint์ด ์ , planet_osm_roads๊ฐ ๊ธธ ๋ฑ์ด๋ค.
์ ๊ธฐ ๋ค์ด๊ฐ์๋ ๋ฐ์ดํฐ๋ก ์ฟผ๋ฆฌ ๋ ๋ฆฌ๋ฉด์ ๊ฑฐ๋ฆฌ์ธก์ ์ด๋ ์ขํ๊ฐ ๊ฐ์ ธ์ค๊ณ ๊ทธ๋ฐ๊ฑธ ํ๋ฉด ๋๋ค.
๋จผ์ ํ์ฌ ์์น์์ ๊ฐ๊น์ด ๋์๋ ๋ง์์ ์ฐพ๋๊ฑฐ๋ถํฐ ํด๋ณด์.
planet_osm_point์ place๋ผ๋ ๊ฐ์ ํตํด ๊ฐ ์ง์ ๋ค์ ํน์ฑ์ ๋ถ๋ฅํด๋จ๋ค.
select distinct place from planet_osm_point;
city๊ฐ ์ผ๋ฐ์ ์ธ ๋์, ์, ๊ด์ญ์๋ค.
town์ด ๋ฆฌ, ๋, ๋ฉด ๋ฑ์ ํ์ ํ์ ๊ตฌ์ญ์ด๊ณ , ์ด๋์ ๋ ๋ญ ์๋ค.
๋จผ์ ์๋/๊ฒฝ๋ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์์ ํ๋ฒ ํด๋ณด๊ฒ ๋ค.
osm2pgsql์ ์๋/๊ฒฝ๋๊ฐ ์๋๋ผ Pseudo-Mercator๋ผ๋ ์กฐ๊ธ ๋ณํ ์ขํ๋ฒ์ ์ฌ์ฉํ๋ค. ๊ตฌ๊ธ๋งต์ด๋ OSM ๋ฑ๋ฑ ๋ง์ด ์ฐ๋ ๋ฐฉ์์ด๋ค.
์ง๋์์ ์ ๋นํ ์ขํ๋ฅผ ์ฐพ๊ฑฐ๋

๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ์ถ์ถํด๋ ๋๋ค.

๊ทธ๋ฆฌ๊ณ ํด๋น ์ขํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ดค๋ค.
SELECT name
FROM planet_osm_point
WHERE place = 'city'
ORDER BY ST_Distance(
way,
ST_Transform(
ST_SetSRID(ST_Point(127.255188, 37.429084), 4326),
3857
)
)
LIMIT 10;
์ข ๋ฒ๊ฑฐ๋กญ๊ธด ํ๋ฐ, ์ขํ ๊ฐ์ ์๋/๊ฒฝ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํํ ๋ค์์(SRID=4326), ์์ฒด ์ขํ๋ฒ์ผ๋ก ๋ณํํ๋(SRID=3857) ๊ณผ์ ์ ๊ฑฐ์ณค๋ค.
๊ทธ๋ฆฌ๊ณ ST_Distance๋ก ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์์น์ ๋์๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ๋ค.
์ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๊ฑด ๋จ์ํ ์์์ผ ๋ฟ์ด๊ณ , ์ค์ ์ฌ์ฉ๋ก์์๋ ์ ์ ํ์ง ์์ ์ ์๋ค.
๊ธฐ์ค ์ขํ๊ฐ ๋์ ๊ฒฝ๊ณ๋ผ๋ฉด, ํด๋น ๋์ ์ค์๋ณด๋ค ๋ ๊ฐ๊น์ด ๋ค๋ฅธ ๋์๋ก ์กํ๋ฒ๋ฆด ์๋ ์๊ณ , ์ธ๋ฑ์ค๋ ์ ํ์ง ์์ ๊ฒ์ด๋ค. ์ฌ์ฉ์ฌ๋ก์ ๋ง์ถฐ์ ์ต์ ํ๋ฅผ ํ๋ฉด ๋๋ค.
์๋ฌดํผ ์ด๋ฐ ์์ผ๋ก ์์ฉํ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://osm2pgsql.org/doc/manual.html
https://hub.docker.com/r/iboates/osm2pgsql
https://stackoverflow.com/questions/52180005/retrieve-closest-road-when-given-lat-long-using-osm-in-postgres-with-postgis