Help us understand the problem. What is going on with this article?

国土交通省のデータを使って、緯度経度から市区町村までを取り出す

More than 5 years have passed since last update.

FrogApps 技術ブログ始めました!
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps


ここ数年、位置情報を使ったアプリ・サービスが増えましたが、GPSから取得出来る緯度経度だけではデータとして使いにくい事があります。

GoogleのGeocodingサービスなどで、緯度経度から住所への変換ができますが、件数や速度の問題があります。

そこで、国土交通省のデータを元に、緯度経度から住所への変換を行ってみましょう。

国土数値情報ダウンロードサービス

から全都道府県を選択。最新の情報を全都道府県分選択します。

PostGISのセットアップ

http://trac.osgeo.org/postgis/wiki/UsersWikiPostGIS20Ubuntu1204 を参考にPostGISをインストールしてください。

sudo -u postgres psql template1
CREATE USER vagrant WITH PASSWORD 'vagrant';
CREATE DATABASE gis WITH ENCODING = 'UTF-8'
    LC_CTYPE = 'en_US.utf8' LC_COLLATE = 'en_US.utf8'
    TEMPLATE template0;
GRANT ALL PRIVILEGES ON DATABASE gis TO vagrant;

sudo -u postgres psql gis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/postgis.sql
sudo -u postgres psql gis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/spatial_ref_sys.sql 

shpファイルからPostGISへ取り込み

sudo aptitude install unzip nkf

# すべてのZIPファイルを解凍
find ./ -name "*.zip" -type f -print0 | xargs -0 -I {} unzip {}

# shpファイルからSQLへ変換
shp2pgsql -c N03-13_01_130401.shp shapes > geo.sql
find ./ -name "*.shp" -type f -print0 | xargs -0 -I {} shp2pgsql -W "SHIFT-JIS" -a {} shapes | nkf -W >> geo.sql

# 取り込み
psql gis < geo.sql 

検索

時計台の位置情報

psql gis

SET client_encoding = 'UTF8';
SELECT n03_001,n03_002,n03_003,n03_004 FROM shapes WHERE ST_Within(ST_GeomFromText('POINT(141.35358861111  43.062555)'), geom);

 n03_001 | n03_002 | n03_003 | n03_004 
---------+---------+---------+---------
 北海道  |         | 札幌市  | 中央区

テーブルへ変換

PostGISを使えば比較的簡単にできるのですが、変換の為にProduction環境にPostGISを配置するのは面倒です。

なので、先に緯度経度から行政区の変換マップを作りました。
https://github.com/FrogAppsDev/jpcities からダウンロードしてください。

検索がしやすいようにGeohashでインデックスしています。精度は荒いですが大体の位置を把握するには役にたつと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away