Контуры зданий и входы

Используйте API геокодирования, чтобы получить контуры зданий и входы, чтобы улучшить визуализацию данных при рендеринге карты.

Для этого включите в запрос на геокодирование дополнительный параметр, чтобы возвращать пары координат широты и долготы, которые определяют либо контур здания, либо вход. Используйте результаты ваших запросов, чтобы нарисовать контуры зданий и указать входы в здания на карте.

  • Контур здания — это набор пар координат широты и долготы, которые определяют двумерный многоугольник, представляющий площадь поверхности земли, покрытую зданием.
  • Вход в здание представляет собой единую пару координат широты и долготы, которая определяет местоположение точки входа и выхода в определенное место.

Использование и покрытие

Вы можете использовать сервис для возврата контурных полигонов для одного места в одном запросе. Это означает, что запрос на геокодирование на уровне города, например Лондона, Великобритания, не возвращает все контуры зданий в этом районе. В таких случаях служба вернет стандартный ответ геокодирования без очертаний зданий и входов. В частности, сервис генерирует контуры и входы только для следующих типов мест:

Поддерживаемые типы мест

Здание

Входы

premise

premise

subpremise

subpremise

point_of_interest

point_of_interest

street_address

Хотя эта функция доступна для использования во всех регионах, ее покрытие зависит от региона. Кроме того, вам следует ожидать получения ответов API, которые содержат контур здания, но не содержат входных данных. В этом случае сервис вернет ответ геокодирования с контуром здания, но без массива входных данных. Служба постоянно работает над улучшением зоны покрытия входов.

Запросить подробности

Получить контуры зданий и координаты входа можно в следующих видах запросов:

Для любого из этих запросов вы указываете этот параметр: extra_computations=BUILDING_AND_ENTRANCES .

Пример запроса

Следующий запрос использует геокодирование места для получения информации о входе и контуре ресторана в Маунтин-Вью, Калифорния, США:

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

Пример ответа

В большинстве случаев ответ возвращает поля, соответствующие одному зданию, но в некоторых случаях ответ может содержать несколько элементов, например достопримечательности, занимающие несколько зданий. Элементы ответа включают в себя два массива:

Массив buildings[] со следующими полями:

  • place_id

    Уникальный идентификатор здания. Дополнительную информацию см. в обзоре идентификаторов мест .

  • building_outlines[]

    Массив контуров, связанных со зданием. Этот массив имеет только одну запись. Каждый объект в building_outlines[] имеет следующее поле:

    • display_polygon

    Кодировка GeoJSON многоугольника, который приблизительно соответствует площади поверхности земли, покрытой зданием, с использованием формата RFC 7946.

Массив entrances[] со следующими полями:

  • location

    Координаты широты/долготы входа.

  • building_place_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"
    }
  ],
}

Отображение контуров зданий на карте

API JavaScript имеет встроенную поддержку отображения полигонов и мультиполигонов в формате 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)
    }
}

Используя приведенный выше код, контур здания, возвращаемый API геокодирования в примере ответа ранее в этом документе, отображается на карте следующим образом:

Контур здания на карте

Краевые случаи

Вы также можете столкнуться со следующими крайними случаями; однако приведенный выше пример кода по-прежнему будет работать для них:

  1. Ответ с несколькими контурами зданий.
  2. Один объект building_outlines представляющий несколько полигонов.

Например, ответ для идентификатора места 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, мы можем отобразить на карте оба контура:

На карте отображены два контура здания

Обратная связь

Это экспериментальная функция. Мы будем признательны за обратную связь по адресу Building-in-geocoding-feedback-channel@google.com .