建築物輪廓和入口

使用 Geocoding API 取得建築物輪廓和入口,以便在繪製地圖時強化資料視覺化。

如要這麼做,請在地理編碼要求中加入額外參數,以便傳回定義建築物輪廓或入口的經緯度座標組合。使用要求的輸出內容,在地圖上繪製建築物輪廓並標示建築物入口。

  • 建築物輪廓是經緯度座標組合的集合,用於定義 2D 多邊形,代表建築物所涵蓋的地球表面積。
  • 建築物入口單一經緯度座標組合,用於定義進入地點的入口和出口位置。

使用率和涵蓋率

您可以使用這項服務,在單一要求中傳回單一地點的輪廓多邊形。也就是說,如果您要求城市層級地理編碼 (例如倫敦,英國),系統不會傳回該地區內的所有建築物輪廓。在這種情況下,服務會傳回標準的地址代碼回應,但不會包含建築物輪廓或入口。具體來說,這項服務只會針對下列地點類型產生輪廓和入口:

支援的地點類型

建築物

進入

premise

premise

subpremise

subpremise

point_of_interest

point_of_interest

street_address

雖然這項功能適用於所有地區,但涵蓋範圍因地區而異。此外,您應該會收到含有建築物輪廓但沒有入口資料的 API 回應。在這種情況下,服務會傳回包含建築物輪廓的地理編碼回應,但沒有入口資料陣列。這項服務會持續改善入口涵蓋範圍。

要求詳細資料

您可以透過下列類型的要求取得建築物輪廓和入口座標:

針對這類要求,您必須提供以下參數:extra_computations=BUILDING_AND_ENTRANCES

要求範例

以下查詢會使用地點地理編碼功能,取得位於美國加州 Mountain View 的餐廳入口和輪廓資訊:

https://maps.googleapis.com/maps/api/geocode/json?place_id=ChIJ4TTDdzS3j4AR78EQgu5EADA&extra_computations=BUILDING_AND_ENTRANCES&key=YOUR_API_KEY

回應範例

在大多數情況下,回應會傳回對應至單一建築物的欄位,但在某些情況下,回應可能會有多個元素,例如佔據多個建築物的興趣點。回應元素包含兩個陣列:

buildings[] 陣列,包含下列欄位:

  • place_id

    建築物的專屬 ID。詳情請參閱地點 ID 總覽

  • building_outlines[]

    與建築物相關的輪廓陣列。這個陣列只有一個項目。building_outlines[] 中的每個物件都包含下列欄位:

    • display_polygon

    使用 RFC 7946 格式,將建築物所涵蓋的地球表面積近似估算為多邊形的 GeoJSON 編碼

entrances[] 陣列,包含下列欄位:

  • location

    入口的緯度/經度座標。

  • building_place_id

    包含入口的建築物地點 ID。這與地理編碼結果的地點 ID 不同,除非地理編碼結果是建築物本身。系統不一定會填入這個參數。

上述查詢的回應顯示建築物陣列中有一座入口和一個多邊形項目:

{
  "entrances": [
    {
      "location": {
        "lat": 37.3925065,
        "lng": -122.0799465
      },
      "building_place_id": "ChIJVeHddzS3j4ARFZJVu4Cf27o"
    }
  ],
  "buildings" : [
    {
      "building_outlines" : [
        {
          "display_polygon" : {
            "coordinates" : [
              [
                [
                    -122.080188246116,
                    37.3926407183216
                ],
                [
                    -122.080281351765,
                    37.3924887558601
                ],
                [
                    -122.080023707261,
                    37.392390122414
                ],
                [
                    -122.079926266852,
                    37.3925369491992
                ],
                [
                    -122.080188246116,
                    37.3926407183216
                ]
              ]
            ],
            "type" : "Polygon"
          }
        }
      ],
      "place_id" : "ChIJVeHddzS3j4ARFZJVu4Cf27o"
    }
  ],
}

在地圖上顯示建築物輪廓

JavaScript API 內建支援功能,可顯示 RFC 7946 格式的多邊形和多邊形集合。方法如下:

  1. 使用多邊形資料建構地圖項目物件。
  2. 為多邊形套用樣式。
  3. 將地圖項目附加至 JavaScript 地圖物件。

buildings 陣列中的每個物件都包含 building_outlines 陣列中的單一物件。以下範例說明如何在地圖上顯示建築物輪廓:

//This function takes an argument of 'buildings', which is the buildings[] array returned by the API.
async function displayBuildingOutline(buildings) {
    try {
        //Import the Google Maps Data library.
        const { Data } = await google.maps.importLibrary("maps")
        //Loop though the array of building outlines.
        buildings.forEach(building => {
            const features = []
            const buildingOutlines = building.building_outlines;
            //Add each building outline to a Feature object, and push this to an array of Features.
            buildingOutlines.forEach(buildingOutline => {
                const feature = {
                    type: "Feature",
                    properties: {},
                    geometry: buildingOutline.display_polygon
                }
                features.push(feature);
            });
            //Create a new Google Maps Data object, and apply styling.
            //We also assume the reference to the map on the page is named 'map'.
            //This applies the Data object to the map on the page.
            outlineLayer = new google.maps.Data({
                map,
                style: {
                    strokeColor: "#0085cc",
                    strokeOpacity: 1,
                    strokeWeight: 2,
                    fillColor: "#88d4fc",
                    fillOpacity: 0.5,
                },
            });
            //Add the array of Features created earlier to the Data object, as GeoJson.
            outlineLayer.addGeoJson({
                type: "FeatureCollection",
                features: features,
            });
        });
    } catch (e) {
        console.log('Building outlines failed. Error: ' + e)
    }
}

使用上述程式碼時,地圖上會顯示 Geocoding API 在本文件中傳回的範例回應內所傳回的建築物輪廓,如下所示:

在地圖上顯示的建築物輪廓

極端案例

您也可能會遇到下列極端情況,不過上述範例程式碼仍可用於這些情況:

  1. 回應包含多個建築物輪廓。
  2. 單一 building_outlines 物件,代表多個多邊形。

舉例來說,地點 ID ChIJGxgH9QBVHBYRl13JmZ0BFgo 的回應包含兩個 building_outlines[] 陣列結果:

"buildings": [
    {
        "building_outlines": [
            {
                "display_polygon": {
                    "coordinates": [
                        [
                            [
                                44.3313253363354,
                                13.636033631612
                            ],
                            [
                                44.3312576355624,
                                13.6362094887862
                            ],
                            [
                                44.3310854239923,
                                13.6361461767801
                            ],
                            [
                                44.3311531250111,
                                13.6359703194634
                            ],
                            [
                                44.3313253363354,
                                13.636033631612
                            ]
                        ]
                    ],
                    "type": "Polygon"
                }
            }
        ],
        "place_id": "ChIJ24NWUBhUHBYRSEmPBFa1wgc"
    },
    {
        "building_outlines": [
            {
                "display_polygon": {
                    "coordinates": [
                        [
                            [
                                44.330737534504,
                                13.6357057440832
                            ],
                            [
                                44.3307248314371,
                                13.6357390350529
                            ],
                            [
                                44.3306985591742,
                                13.635729486373
                            ],
                            [
                                44.3307114066013,
                                13.6356960265536
                            ],
                            [
                                44.330737534504,
                                13.6357057440832
                            ]
                        ]
                    ],
                    "type": "Polygon"
                }
            }
        ],
        "place_id": "ChIJpzQOABlUHBYRxiOC9goY1fE"
    }
]

使用上述 JavaScript 程式碼範例,我們可以在地圖上算繪出兩個輪廓:

在地圖上顯示兩個建築物輪廓

意見回饋

這是實驗功能。歡迎透過 buildings-in-geocoding-feedback-channel@google.com 與我們聯絡,提供寶貴意見。