はじめに
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との組み合わせ
-
search/building_name
で建物を検索し、座標を取得 -
search/building_pos
でその座標から詳細なテナント情報を取得
ac_premium APIとの連携
-
data-coding/ac_premium
で住所を正規化し、建物情報を取得 - 建物の座標を使って
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の豊富な機能をご利用いただけるので、本格導入前の検証にぜひご活用ください。
関連記事
- ZENRIN Maps APIのジオコーディングでマンション名やテナント名まで取得できる!住所入力の精度向上とUX改善
- ZENRIN Maps API 郵便番号検索API(postcode) - 仕様・実装・活用・UX向上ガイド
- ZENRIN Maps API 建物・テナント名検索API(building_name) - 仕様・実装・活用・UX向上ガイド
- ZENRIN Maps API 住所正規化API(ac_standard) - 仕様・実装・活用・UX向上ガイド
※本記事で使用しているAPIキーやURLはサンプルです。実際の導入時には、公式サイトから取得した正式なAPIキーを使用してください。