住所検索APIの作成

郵便番号から住所検索するAPIを作成します。
アプリケーションなどから呼び出し、自動的に住所入力を補完する際に便利なAPIです。

動作環境

・ PHP5以上
・ sqlite3

汎用性を考慮して、フレームワークなどは使用しません。
レンタルサーバ等ではsqliteが使用できない場合があるので、事前にご確認ください。

 

郵便番号データのダウンロード

まず最初に、郵便局のサイトから全国の郵便番号データ(CSV)をダウンロードします。
「都道府県一覧」の「全国一括」を選択してください。

郵便番号データダウンロード
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html

ken_all.zip というZIPデータを解凍すると、KEN_ALL.CSV が出てきます。

1. CSVの不要なデータを削除したいので、Excelで表示し、10番目以降の列を削除します。
2. CSVデータの文字コードをShift-JISからUTF8に変換します。(miエディタなどを使用)

 

データベースの作成

1. データーベースの作成

sqlite3 zipcode.sqlite

2. テーブルの作成

create table zipcode(
gov_code,
old_zipcode,
zipcode,
kana_prefectures,
kana_municipality,
kana_town_area,
prefectures,
municipality,
town_area
);

3. インデックスの作成

create index zipcode_index on zipcode(zipcode);

4. CSVからsqliteデータベースに変換

sqlite3 -separator , zipcode.sqlite ".import KEN_ALL.CSV zipcode"

 

PHPプログラム

郵便番号クエリ(q)を受け取り、住所データをJSON形式で返答します。
郵便番号はハイフン無しの7桁数値です。

<?php
$zipcode = $_GET['q'];

if (empty($zipcode) || !is_numeric($zipcode) || mb_strlen($zipcode) != 7) {
    $error = array();
    $error['code'] = 400;
    $error['message'] = 'Bad Request';
    echo(json_encode($error));
    return;
}

$db = new PDO('sqlite:zipcode.sqlite');
$sql = sprintf('SELECT * FROM zipcode WHERE zipcode = \'%s\';', $zipcode);
$query = $db->prepare($sql);
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);

$response = array();
if (!empty($result)) {
    $response['code'] = 200;
    $response['data'] = $result[0];
} else {
    $response['code'] = 404;
    $response['message'] = 'Not Found';
}
echo(json_encode($response));

 

htaccessの編集
# PHPの拡張子なしアクセス
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php

# sqliteファイルのアクセス禁止
<Files ~ "(\.sqlite|db)$">
deny from all
</Files>

 

動作テスト
https://hoge.com/zipcode?q=1000000
{
    "code": 200,
    "data": {
        "gov_code": "13101",
        "old_zipcode": "100",
        "zipcode": "1000000",
        "kana_prefectures": "トウキョウト",
        "kana_municipality": "チヨダク",
        "kana_town_area": "イカニケイサイガナイバアイ",
        "prefectures": "東京都",
        "municipality": "千代田区",
        "town_area": "以下に掲載がない場合"
    }
}

お問い合わせ

気軽にご相談ください。
ご予算に応じて柔軟に対応させて頂きます。