指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得する方法　TerraMap APIを使って

# 指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得する方法

## ユースケース
- 店舗や施設周辺のエリア分析を行いたい
- 指定エリア周辺にポスティングでチラシを配布したい
場合などに、

指定地点から半径 x メートルに含まれる町丁目ポリゴンを地図に描画したり人口や世帯などの統計データの数値を参考にして意思決定を行うことがあります。

今回はそういったケースをWebシステムで実現する際に必要になると思われることを取り上げます。
その中でも特に「指定地点から半径 x メートルの範囲に含まれる町丁目ポリゴンを取得する」という部分に注目します。

## 実現方法
まずはTerraMap APIを使わない場合の実現方法について考えてみます。
指定地点から半径 x メートルの範囲に含まれる町丁目ポリゴンを取得するには
- 町丁目ポリゴンデータの準備
- 指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得するの機能の実装

といったことが必要になります。
一つの例として、PostgreSQLやMySQLなどのデータベースにジオメトリデータをインポートし、空間演算の関数を使用して実装していく方法が考えられます。
ローカル環境のQGISにShapefileをインポートして実現する方法などもありますが、今回はWebシステムで実現する方法ということで除外します。
また、すでにあるサービスを利用して簡単に実現する方法の一つとして、[地図で見る統計（jSTAT MAP）](https://jstatmap.e-stat.go.jp/jstatmap/main/trialstart.html)を使う方法もあります。まずは地図で見る統計（jSTAT MAP）を見てみるのもいいかもしれません。

しかし、「自社システムとして開発したい」「年収データを使いたい」「郵便番号エリアのポリゴンが必要」などの場合、jSTAT MAPでは実現できないのでデータの用意や機能の実装など行っていく必要が出てきます。

今回はそういった手間を省いて実現できる[TerraMap API](https://www.mapmarketing.co.jp/terramap-api?grid=q-02 "地図システム開発支援API TerraMap API")を使って「指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得する」方法をご紹介します。

## TerraMap APIについて
TerraMap APIは、エリアマーケティングデータ（ポリゴン、住所、統計データ）を自社で用意せずに自社システムに組み込みたい方向けの地図システム開発支援Web APIです。
指定地点から半径xメートルに含まれるポリゴンを取得するといった空間演算の機能も利用することが可能です。
人口や世帯などの国勢調査データをはじめ、年収別世帯数推計データなどのjSTAT MAPにはない統計データも使用することができます。
[TerraMap API](https://www.mapmarketing.co.jp/terramap-api?grid=q-02 "地図システム開発支援API TerraMap API")

https://www.mapmarketing.co.jp/terramap-api?grid=q-02

## TerraMap APIを使って、指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得してみる
では実際に、TerraMap APIを使って、指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得してみます。
PHPでリクエストする例をご紹介しますが、他のサーバーサイドプログラムでもTerraMap APIにリクエストすることができます。
以下のようなリクエストを送るだけで、データの用意や範囲内のポリゴンの取得機能の実装などをすることなく簡単に指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得することができます。

### PHPでcURL関数を使ってリクエストする例
```php:request_sample.php
<?php

// パラメータをJSON形式でセット
$params = json_encode([
    "layer_id" => "00104",       // レイヤーは町丁目を指定
    "area_type" => "circle",     // エリアタイプは円を指定
    "center_lat" => 35.6720557,  // 中心点緯度
    "center_lng" => 139.6596281, // 中心点経度
    "radius" => [1000],          // 半径を1kmで指定
    "output" => "polygon,point", // ポリゴンと住所情報を出力する
]);

$ch = curl_init();
// Content-TypeとAPIキーをセット。APIキーはダミーです
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'X-API-KEY: your_api_key']); 
// POSTメソッドを指定
curl_setopt($ch, CURLOPT_POST, true);
// パラメータをセット
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
// URLはダミーです
curl_setopt($ch, CURLOPT_URL, 'https://tmapi.example.jp/api/area'); 

$response = curl_exec($ch);

curl_close($ch);
```

### レスポンス結果
ジオメトリを含むデータは以下の様にGeoJSON形式でレスポンスされます。
ポリゴンの座標値が続いて長くなるので一部のみ掲載します。
```json
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "area": {
          "area": 0.2007340142607987
        },
        "geocode": "13112001606",
        "points": [
          [
            "東京都",
            "世田谷区",
            "代田６丁目"
          ]
        ]
      },
      "geometry": {
        "type": "MultiPolygon",
        "coordinates": [
          [
            [
              [
                139.665413202536,
                35.6651199470495
              ],
              [
                139.665407957177,
                35.6650825751151
              ],
              [
                139.665470556221,
                35.6650056603209
              ],
```

### 地図にポリゴンを描画するには？
取得したポリゴンを地図に描画する例として別の記事がありますので、そちらをご確認ください。
[OpenLayersを使ってOpenStreetMapに町丁目ポリゴンを表示してみる(OpenLayers v6)](https://qiita.com/4gou/items/d914c277ae96158b2165)

### 人口や世帯などの国勢調査データを取得するには？
人口や世帯などの国勢調査データを取得方法についてはまた別途ご紹介します。

## まとめ

自分でデータの準備や機能開発をおこない、指定地点から半径 x メートルに含まれる町丁目ポリゴンを取得する方法を実現することもできますが、TerraMap APIを利用することでデータの準備や機能開発、管理メンテナンスの手間を抑えて実現することができます。