1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZENRIN Maps API 建物座標検索API(building_pos)- 仕様・実装・活用・UX向上ガイド

Last updated at Posted at 2025-08-23

はじめに

ECサイトやWebサービスの住所入力フォームで、「建物名を入力したら、その建物内のテナントや部屋まで自動的に候補表示される」機能を実装したいと思ったことはありませんか?

ZENRIN Maps APIの「search/building_pos」エンドポイントは、緯度経度座標から建物内のテナント情報や部屋情報を検索できる強力なAPIです。特に高層ビルやマンションなど、複数のテナントや部屋が存在する建物において、階数別・部屋別の詳細情報を取得できます。

本記事では、実際の住所入力フォームでの実装例を交えながら、このAPIの活用方法を詳しく解説します。

ZENRIN Maps API 2ヶ月無料お試しID

ZENRIN Maps APIを実際に試してみたい方は、2ヶ月無料のお試しIDをご利用いただけます!

📝 お申し込みはこちら
👉 ZENRIN Maps APIの始め方

お試し期間中は、本記事で紹介する機能をはじめ、ZENRIN Maps APIの豊富な機能をご利用いただけます。

「search/building_pos」APIの特徴

  • 座標ベースの検索: 緯度経度を指定するだけで、その位置の建物内情報を取得
  • テナント情報・部屋名称の取得: オフィスビルのテナント名、マンションの部屋番号など詳細な情報
  • ソート機能: 階数順(floor_sort)などでソートして取得可能
  • 建物形状情報: オプションで建物の形状、面積、周辺長なども取得可能

※本APIはプレミアムAPIとなっており、利用するには別途契約が必要です。

API仕様

エンドポイント

GET/POST https://[domain]/search/building_pos

Content-Type: application/x-www-form-urlencoded

リクエストパラメータ

パラメータ名 必須 デフォルト 内容・例
position array[number] - 座標を指定(例: [139.767125, 35.681236])
「経度,緯度」の順で指定
building_shape boolean - false 建物形状、面積、周辺長の取得有無
true: 取得する / false: 取得しない
sort_attribute array[string] - 昇順 attribute内の出力順を指定(複数指定可)
例: ["floor_sort"] で階数順にソート
(name、floor_sort、tenant_room_name等)
pastmap_year array[integer] - - 過去地図年度を指定(複数指定可)※premium
※本パラメータを利用するには別途契約が必要
※地域と提供年の組み合わせは過去地図データ提供地区一覧表を参照
datum string - JGD 入出力座標の測地系を指定
JGD: 世界測地系
TOKYO: 日本測地系
TOKYO_NAVI: 日本測地系(ゼンリン ナビ地図)

レスポンス構造

レスポンスはJSON形式で、以下のような階層構造を持ちます:

{
  "status": "OK",
  "result": {
    "item": [
      {
        "zid": "307803340446770134",
        "id": "0000307803340446770134",
        "zid_attr": "307899581268587801",
        "id_attr": "0000307899581268587801",
        "building_name": "〇〇〇〇広尾",
        "building_name_read": null,
        "building_name_read_through": null,
        "building_type": 3,
        "building_use": "3003",
        "building_use_level": "B",
        "post_code": "000-0000",
        "address_code": "131030260050001600003",
        "address": "東京都港区南麻布〇〇〇〇",
        "room_count": 25,
        "parking_exist_flag": 0,
        "building_top_floor_num": 5,
        "building_bottom_floor_num": 1,
        "position": [
          139.7235715061,
          35.6515671115
        ],
        "pastmap_id": null,
        "pastmap_year": null,
        "attribute": [
          {
            "zid_attr": "307899581268587805",
            "id_attr": "0000307899581268587805",
            "name": "〇〇〇〇",
            "name_read": null,
            "name_read_through": null,
            "building_type": 1,
            "tenant_floor_type": 1,
            "tenant_floor": "2F",
            "tenant_floor_num": 2,
            "tenant_room_name": null
          },
          ...
        ],
        "attribute_count": 25
      }
    ]
  }
}

レスポンス項目詳細

result.item(建物情報)

フィールド名 説明
zid string 建物ZID(建物等の地物毎にふられるパーマネントID)
id string ID(地物)建物ZIDを0パディングして22桁に揃えた文字列
zid_attr string 属性ZID(建物や地物内のテナント施設等といった属性情報毎にふられるパーマネントID)
id_attr string ID(属性)属性ZIDを0パディングして22桁に揃えた文字列
building_name string 建物名称
building_name_read string 建物名称読み ※常にnull
building_name_read_through string 建物名称読み下し
building_type integer 建物・テナント等を判別する区分
1:テナント 3:建物
building_use string 建物用途コード
building_use_level string 建物用途の推定情報
BまたはX:ゼンリン住宅地図データと他社出典データ
D:ゼンリン住宅地図データ
post_code string 郵便番号
address_code string 住所コード
address string 住所
room_count integer 部屋数
parking_exist_flag integer 駐車場有無
0:未調査 1:あり(一般車両)
2:あり(一般車両、大型車両)
building_top_floor_num integer 建物の最上階数
(最上階が存在しない場合は0、最上階が不明な場合は-1)
building_bottom_floor_num integer 建物の地下階数
(地下階が存在しない場合は0、地下階数が不明な場合は-1)
position array[number] 座標 [経度, 緯度]
pastmap_id integer 過去地図管理ID(過去地図データの場合のみ)※premium
pastmap_year integer 過去地図年度(過去地図データの場合のみ)※premium
attribute array[object] テナント・部屋情報の配列
attribute_count integer テナント・部屋レコード数

building_shape=true 指定時の追加フィールド

フィールド名 説明
building_shape string 建物形状ポリゴン(GeoJSON形式)
shape_area number 建物面積(単位:m² 平方メートル)
shape_length number 建物形状ポリゴンより計算した周辺長(単位:m メートル)

attribute内の項目(テナント・部屋情報)

フィールド名 説明
zid_attr string 属性ZID(テナント・部屋ごとの固有ID)
id_attr string ID(属性)属性ZIDを0パディングして22桁に揃えた文字列
name string テナント・入居者名称
name_read string テナント・入居者名称読み ※常にnull
name_read_through string テナント・入居者名称読み下し
building_type integer 建物・テナント等を判別する区分
1:テナント 2:個人表札 3:建物
tenant_floor_type integer 階数種別(該当階の地上、地下などの種別)
0:無効値 1:地上 2:地下 3:中地上 4:中地下 5:屋上
tenant_floor string テナント・部屋の階数(例: "2F", "B1")
tenant_floor_num integer テナント・部屋の階数数値
tenant_room_name string 部屋名称・部屋番号

実装例:住所入力フォームでの活用

1. 建物選択時にテナント・部屋情報を取得

以下は、Vue.jsで実装した住所入力フォームでの活用例です:

// getRooms - 建物の座標からテナント・部屋情報を取得
const getRooms = async (lat, lng) => {
  // APIパス
  const apiPath = 'https://[domain]/search/building_pos';
  
  // パラメータ設定
  const apiParams = {
    position: [lng, lat],  // 注意:経度、緯度の順
    building_shape: false,  // 建物形状は不要
    sort_attribute: ['floor_sort']  // 階数順でソート
  };
  
  // APIリクエスト
  const response = await fetch(apiPath + '?' + new URLSearchParams(apiParams), {
    method: 'GET',
    headers: {
      'x-api-key': 'YOUR_API_KEY'
    }
  });
  
  const result = await response.json();
  
  // レスポンスからテナント・部屋情報を抽出
  if (result.result?.item?.[0]?.attribute) {
    const rooms = result.result.item[0].attribute
      .filter(item => item.tenant_room_name || item.name)
      .map(item => {
        // 部屋名を作成
        let room_name = '';
        if (item.tenant_room_name && item.name) {
          room_name = `${item.tenant_room_name} : ${item.name}`;
        } else if (item.tenant_room_name) {
          room_name = item.tenant_room_name;
        } else if (item.name) {
          room_name = item.name;
        }
        
        return {
          name: room_name,
          floor: item.tenant_floor || ''
        };
      });
    
    return rooms;
  }
  
  return [];
};

2. 階数でフィルタリング

取得したテナント・部屋情報を階数でフィルタリングする例:

// 階数リストを作成(重複なし)
const floorOptions = computed(() => {
  const keyword = state.form.floor?.trim() || '';
  
  // room_optionsからfloor値を抽出し、重複を除去
  let floors = state.form.room_options
    .map(room => room.floor)
    .filter(floor => floor !== undefined && floor !== null && floor !== '')
    .filter((floor, index, self) => self.indexOf(floor) === index);
  
  // キーワードでフィルタリング
  if (keyword) {
    return floors.filter(floor => floor.startsWith(keyword));
  }
  
  return floors;
});

// 選択された階数の部屋のみ表示
const filteredRoomOptions = computed(() => {
  const keyword = state.form.room?.trim() || '';
  let rooms = state.form.room_options;
  
  // 階数が選択されていれば、その階数の部屋のみ表示
  if (state.form.floor) {
    rooms = rooms.filter(room => room.floor === state.form.floor);
  }
  
  // 部屋名でフィルタリング
  if (keyword) {
    return rooms.filter(room => room.name && room.name.includes(keyword));
  }
  
  return rooms;
});

3. UIでの表示例

<template>
  <!-- 階数入力 -->
  <div>
    <label for="floor">階数</label>
    <input v-model="state.form.floor" type="text" id="floor" />
    
    <!-- 階数候補リスト -->
    <ul v-if="floorOptions.length > 0">
      <li v-for="floor in floorOptions" :key="floor" @click="selectFloor(floor)">
        {{ floor }}
      </li>
    </ul>
  </div>
  
  <!-- 部屋・テナント入力 -->
  <div>
    <label for="room">部屋・テナント名</label>
    <input v-model="state.form.room" type="text" id="room" />
    
    <!-- 部屋候補リスト -->
    <ul v-if="filteredRoomOptions.length > 0">
      <li v-for="room in filteredRoomOptions" :key="room.name" @click="selectRoom(room)">
        {{ room.name }}
        <small v-if="room.floor">({{ room.floor }})</small>
      </li>
    </ul>
  </div>
</template>

活用シーン

1. ECサイトの配送先入力

  • マンション名を入力後、部屋番号まで自動補完
  • 高層ビルでの階数・テナント名の自動入力
  • 配送ミスの削減と入力時間の短縮

2. 不動産情報サービス

  • 物件情報の詳細表示
  • ビル内のテナント一覧表示
  • 空室情報の管理

3. 企業向け住所管理システム

  • 取引先企業の詳細な所在地管理
  • 訪問先の階数・部屋番号の事前確認
  • 社内の拠点管理

他のAPIとの連携

building_name APIとの組み合わせ

  1. search/building_nameで建物を検索し、座標を取得
  2. search/building_posでその座標から詳細なテナント情報を取得

ac_premium APIとの連携

  1. data-coding/ac_premiumで住所を正規化し、建物情報を取得
  2. 建物の座標を使ってsearch/building_posで詳細情報を取得

まとめ

ZENRIN Maps APIのsearch/building_posは、座標から建物内の詳細情報を取得できる強力なAPIです。特に以下のような場面で威力を発揮します:

  • 住所入力の効率化: 建物名入力後、自動的に階数・部屋番号まで補完
  • 入力精度の向上: テナント名や部屋番号の正確な入力をサポート
  • UXの向上: ユーザーの入力負担を大幅に削減

本記事で紹介した実装例を参考に、ぜひ自社のサービスに組み込んでみてください。

ZENRIN Maps API 2ヶ月無料お試しIDのご案内

本記事でご紹介したZENRIN Maps APIの機能を実際にお試しいただけます!

📝 お申し込みはこちら
👉 ZENRIN Maps APIの始め方

お試し期間中は、ZENRIN Maps APIの豊富な機能をご利用いただけるので、本格導入前の検証にぜひご活用ください。

関連記事


※本記事で使用しているAPIキーやURLはサンプルです。実際の導入時には、公式サイトから取得した正式なAPIキーを使用してください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?