Место Детали Элементы

Выберите платформу: Android iOS JavaScript

Элементы «Подробная информация о месте» и «Компактный элемент подробной информации о месте» — это HTML-элементы, отображающие подробную информацию о месте:

  • Элемент PlaceDetailsElement поддерживает все визуализируемые данные о местах и ​​может включать несколько фотографий.
  • Элемент PlaceDetailsCompactElement предназначен для занятия минимального пространства и отображения краткой информации о месте, включая название, адрес, рейтинг и т. д. Он также может включать одну фотографию.

Элемент с подробными сведениями о месте

Щелкните по маркеру на карте, чтобы просмотреть подробную информацию о соответствующем месте в элементе «Подробная информация о месте».

Элемент PlaceDetailsElement поддерживает широкий спектр элементов контента, включая полные часы работы, веб-сайт, номер телефона, сводку на основе ИИ с возможностью возврата к редакционной сводке, основные характеристики для конкретных типов заведений, отзывы, а также код и списки характеристик.

Чтобы отобразить подробную информацию о месте на карте, добавьте элемент gmp-place-details к элементу gmp-map на HTML-странице. Добавьте дочерний элемент gmp-place-details-place-request для выбора места. Это может быть объект Place , идентификатор места или имя ресурса Place:

<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
    <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>
<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
  <div class="widget-container" slot="control-inline-start-block-start">
    <gmp-place-details>
      <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
      <gmp-place-all-content></gmp-place-all-content>
    </gmp-place-details>
  </div>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

Настройте содержимое

Вы можете управлять отображением содержимого конкретного места элементом gmp-place-details используя вложенный элемент gmp-place-content-config для выбора и настройки сведений о месте, как показано в этом примере:

<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
  <div class="widget-container" slot="control-inline-start-block-start">
    <gmp-place-details>
      <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
      <gmp-place-content-config>
        <gmp-place-address></gmp-place-address>
        <gmp-place-rating></gmp-place-rating>
        <gmp-place-type></gmp-place-type>
        <gmp-place-price></gmp-place-price>
        <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
        <gmp-place-opening-hours></gmp-place-opening-hours>
        <gmp-place-website></gmp-place-website>
        <gmp-place-phone-number></gmp-place-phone-number>
        <gmp-place-summary></gmp-place-summary>
        <gmp-place-type-specific-highlights></gmp-place-type-specific-highlights>
        <gmp-place-review-summary></gmp-place-review-summary>
        <gmp-place-reviews></gmp-place-reviews>
        <gmp-place-feature-list></gmp-place-feature-list>
        <gmp-place-media lightbox-preferred></gmp-place-media>
        <gmp-place-attribution light-scheme-color="gray" dark-scheme-color="white"></gmp-place-attribution>
      </gmp-place-content-config>
    </gmp-place-details>
  </div>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

Сам элемент gmp-place-content-config содержит ряд дочерних элементов контента, каждый из которых выбирает соответствующую информацию о месте для отображения: PlaceAddressElement выбирает адрес места, PlacePriceElement — уровень цены места и т. д. Порядок дочерних элементов не имеет значения, поскольку выбранные данные всегда отображаются в фиксированном, предопределенном порядке.

Некоторые из этих элементов можно дополнительно настроить с помощью атрибутов, специфичных для содержимого:

  • Элемент gmp-place-media используется для отображения одной фотографии и включает атрибут lightbox-preferred , который открывает фотографию во всплывающем окне при нажатии. Всплывающее окно по умолчанию отключено.
  • Элемент gmp-place-attribution используется для отображения источника фотографии. Атрибуты light-scheme-color и dark-scheme-color используются для установки цвета текста с указанием источника в светлом и темном режимах.
Для получения более подробной информации обо всех поддерживаемых элементах контента см. справочную документацию по PlaceContentConfigElement .

Для простоты элемент gmp-place-content-config можно заменить на gmp-place-all-content чтобы отобразить все сведения, доступные в элементе «Сведения о месте», или на gmp-place-standard-content чтобы отобразить стандартную конфигурацию.

Настройте внешний вид

Рекомендуемый диапазон ширины для элемента gmp-place-details составляет 250–400 пикселей. При ширине менее 250 пикселей отображение может быть некорректным. Установите высоту в соответствии с вашим приложением. Элемент Place Details предназначен для прокрутки в пределах отведенного пространства по мере необходимости.

Элемент gmp-place-details также поддерживает множество пользовательских свойств CSS для настройки цветов и шрифтов элемента. Подробнее см. раздел «Пользовательские стили в Places UI Kit» .

См. полный пример кода.

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector('gmp-place-details');
const placeDetailsRequest = document.querySelector('gmp-place-details-place-request');
const marker = document.querySelector('gmp-advanced-marker');
let center = { lat: 47.759737, lng: -122.250632 };
async function initMap() {
    // Request needed libraries.
    (await google.maps.importLibrary('maps'));
    (await google.maps.importLibrary('marker'));
    (await google.maps.importLibrary('places'));
    // Hide the map type control.
    map.innerMap.setOptions({ mapTypeControl: false });
    // Function to update map and marker based on place details
    const updateMapAndMarker = () => {
        if (placeDetails.place && placeDetails.place.location) {
            let adjustedCenter = offsetLatLngRight(placeDetails.place.location, -0.005);
            map.innerMap.panTo(adjustedCenter);
            map.innerMap.setZoom(16); // Set zoom after panning if needed
            marker.position = placeDetails.place.location;
            marker.collisionBehavior =
                google.maps.CollisionBehavior.REQUIRED_AND_HIDES_OPTIONAL;
            marker.style.display = 'block';
        }
    };
    // Set up map once widget is loaded.
    placeDetails.addEventListener('gmp-load', (event) => {
        updateMapAndMarker();
    });
    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', async (event) => {
        marker.position = null;
        event.stop();
        if (event.placeId) {
            // Fire when the user clicks a POI.
            placeDetailsRequest.place = event.placeId;
            updateMapAndMarker();
        }
        else {
            // Fire when the user clicks the map (not on a POI).
            console.log('No place was selected.');
            marker.style.display = 'none';
        }
    });
}
// Helper function to offset marker placement for better visual appearance.
function offsetLatLngRight(latLng, longitudeOffset) {
    const newLng = latLng.lng() + longitudeOffset;
    return new google.maps.LatLng(latLng.lat(), newLng);
}
initMap();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    display: flex; /* Use flexbox for layout */
    justify-content: center; /* Center the content horizontally */
    align-items: flex-start; /* Align items to the top */
    width: 100%;
}

h1 {
    font-size: 16px;
    text-align: center;
}

gmp-map {
    height: 500px;
}

gmp-place-details {
    border-radius: 0px;
    margin: 20px;
    width: 400px;
    height: 500px;
    margin-top: 0px;
}

gmp-advanced-marker {
    display: none;
}

.widget-container {
    min-width: 400px;
    overflow-y: none;
    overflow-x: none;
}

HTML

<!doctype html>
<html>
    <head>
        <title>Click on the map to view place details</title>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="style.css" />
        <script type="module" src="./index.js"></script>
    </head>
    <body>
        <gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
            <gmp-advanced-marker></gmp-advanced-marker>
        </gmp-map>
        <div class="widget-container" slot="control-inline-start-block-start">
            <gmp-place-details>
                <gmp-place-details-place-request
                    place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
                <gmp-place-all-content></gmp-place-all-content>
            </gmp-place-details>
        </div>
        <script>
            ((g) => {
                var h,
                    a,
                    k,
                    p = 'The Google Maps JavaScript API',
                    c = 'google',
                    l = 'importLibrary',
                    q = '__ib__',
                    m = document,
                    b = window;
                b = b[c] || (b[c] = {});
                var d = b.maps || (b.maps = {}),
                    r = new Set(),
                    e = new URLSearchParams(),
                    u = () =>
                        h ||
                        (h = new Promise(async (f, n) => {
                            await (a = m.createElement('script'));
                            e.set('libraries', [...r] + '');
                            for (k in g)
                                e.set(
                                    k.replace(
                                        /[A-Z]/g,
                                        (t) => '_' + t[0].toLowerCase()
                                    ),
                                    g[k]
                                );
                            e.set('callback', c + '.maps.' + q);
                            a.src =
                                `https://maps.${c}apis.com/maps/api/js?` + e;
                            d[q] = f;
                            a.onerror = () =>
                                (h = n(Error(p + ' could not load.')));
                            a.nonce =
                                m.querySelector('script[nonce]')?.nonce || '';
                            m.head.append(a);
                        }));
                d[l]
                    ? console.warn(p + ' only loads once. Ignoring:', g)
                    : (d[l] = (f, ...n) =>
                          r.add(f) && u().then(() => d[l](f, ...n)));
            })({ key: 'AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8', v: 'weekly' });
        </script>
    </body>
</html>

Детали места Компактный элемент

Щелкните по маркеру на карте, чтобы просмотреть подробную информацию о соответствующем месте в компактном элементе «Подробная информация о месте».

Элемент PlaceDetailsCompactElement отображает подробную информацию о выбранном месте, занимая минимальное пространство. Это может быть полезно в информационном окне, выделяющем место на карте, в социальных сетях, например, при обмене местоположением в чате, в качестве подсказки для выбора текущего местоположения или в статье в СМИ для ссылки на место на Google Maps. PlaceDetailsCompactElement может отображать название, адрес, рейтинг, тип, цену, значок доступности, статус открытия и одну фотографию. Он может отображаться горизонтально или вертикально, в зависимости от выбранного атрибута orientation .

В приведенном ниже фрагменте кода элемент gmp-place-details-compact вложен в элемент gmp-map с horizontal orientation . Дополнительный атрибут truncation-preferred обрезает определенное содержимое, чтобы оно помещалось на одной строке, а не переносилось на следующую. Элемент gmp-place-details-compact содержит дочерний элемент gmp-place-details-place-request для выбора места. Это может быть объект Place , идентификатор места или имя ресурса Place.

<gmp-map center="47.75972, -122.25094" zoom="19" map-id="DEMO_MAP_ID">
  <gmp-place-details-compact orientation = "horizontal" truncation-preferred slot="control-block-start-inline-center" >
    <gmp-place-details-place-request place = "ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
    <gmp-place-content-config>
        <gmp-place-media lightbox-preferred></gmp-place-media>
        <gmp-place-rating></gmp-place-rating>
        <gmp-place-type></gmp-place-type>
        <gmp-place-price></gmp-place-price>
        <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
        <gmp-place-open-now-status></gmp-place-open-now-status>
        <gmp-place-attribution light-scheme-color="gray" dark-scheme-color="white"></gmp-place-attribution>
    </gmp-place-content-config>
  </gmp-place-details-compact>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

Настройте содержимое

Вы можете управлять отображением содержимого конкретного места элементом gmp-place-details-compact используя вложенный элемент gmp-place-content-config для выбора и настройки сведений о месте. Сам элемент gmp-place-content-config содержит ряд дочерних элементов содержимого, и каждый из них выбирает соответствующие сведения о месте для отображения. Порядок дочерних элементов не имеет значения, поскольку выбранные сведения всегда отображаются в фиксированном предопределенном порядке. Некоторые из этих элементов можно дополнительно настроить с помощью атрибутов, специфичных для содержимого.

Для получения более подробной информации обо всех поддерживаемых элементах контента см. справочную документацию по PlaceContentConfigElement .

Для простоты элемент gmp-place-content-config можно заменить на gmp-place-all-content чтобы отобразить все сведения, доступные в элементе «Краткая информация о месте размещения», или на gmp-place-standard-content для отображения стандартной конфигурации.

Настройте внешний вид

Рекомендуемый диапазон ширины для элемента gmp-place-details-compact в вертикальной ориентации составляет 180–300 пикселей. Значения ширины менее 160 пикселей могут отображаться некорректно. Не задавайте фиксированную высоту.

Рекомендуемый диапазон ширины для элемента gmp-place-details-compact в горизонтальной ориентации составляет 180–500 пикселей. При ширине менее 160 пикселей изображение может отображаться некорректно. При ширине менее 350 пикселей миниатюрное изображение отображаться не будет. Не задавайте фиксированную высоту.

Элемент gmp-place-details-compact также поддерживает множество пользовательских свойств CSS для настройки цветов и шрифтов элемента. Подробнее см. в разделе «Пользовательские стили Places UI Kit» .

См. полный пример кода.

В этом примере демонстрируется программное добавление элемента PlaceDetailsCompactElement на карту с помощью элемента AdvancedMarkerElement .

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector('gmp-place-details-compact');
const placeDetailsRequest = document.querySelector('gmp-place-details-place-request');
const marker = document.querySelector('gmp-advanced-marker');
async function initMap() {
    // Request needed libraries.
    Promise.all([
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);
    const { InfoWindow } = (await google.maps.importLibrary('maps'));
    await window.customElements.whenDefined('gmp-map');
    // Set the inner map options.
    map.innerMap.setOptions({
        mapTypeControl: false,
        streetViewControl: false,
    });
    await window.customElements.whenDefined('gmp-advanced-marker');
    marker.collisionBehavior =
        google.maps.CollisionBehavior.REQUIRED_AND_HIDES_OPTIONAL;
    const infoWindow = new InfoWindow();
    infoWindow.addListener('close', () => {
        marker.position = null;
    });
    const showInfoWindow = () => {
        if (infoWindow.isOpen)
            return;
        infoWindow.setContent(placeDetails);
        infoWindow.open({ anchor: marker });
    };
    placeDetails.addEventListener('gmp-load', (event) => {
        // For the initial load case, with no user click, we fall back to the place's location, and ensure the map has a center set and the InfoWindow is show.
        // (The clicked POI LatLng will be a more natural marker position, when available.)
        if (!map.center) {
            map.center = marker.position = placeDetails.place.location;
            showInfoWindow();
        }
    });
    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', async (event) => {
        event.stop();
        if (event.placeId) {
            // When the user clicks a POI.
            marker.position = event.latLng;
            placeDetailsRequest.place = event.placeId;
            showInfoWindow();
        }
        else {
            // When the user clicks the map (not on a POI).
            marker.position = null;
            placeDetailsRequest.place = null;
            console.log('No place was selected.');
        }
    });
}
initMap();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

.container {
    display: flex;
    height: 100vh;
    width: 100%;
}

gmp-map {
    flex-grow: 1;
}

HTML

<!doctype html>
<html>
    <head>
        <title>Place Details Compact with Google Maps</title>
        <meta charset="utf-8" />
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="module" src="./index.js" defer></script>
        <!-- prettier-ignore -->
        <script>
      (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
              ({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});
    </script>
    </head>
    <body>
        <div class="container">
            <!-- map-id is required to use Advanced Markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
            <gmp-map zoom="17" map-id="DEMO_MAP_ID">
                <gmp-advanced-marker></gmp-advanced-marker>
            </gmp-map>
        </div>
        <!--
        The gmp-place-details-compact element is styled inline because it is
        conditionally rendered and moved into the info window, which is
        part of the map's shadow DOM.
        -->
        <gmp-place-details-compact
            orientation="horizontal"
            truncation-preferred
            style="
                width: 400px;
                padding: 0;
                margin: 0;
                border: none;
                background-color: transparent;
                color-scheme: light;
            ">
            <gmp-place-details-place-request
                place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
            <gmp-place-content-config>
                <gmp-place-media lightbox-preferred></gmp-place-media>
                <gmp-place-rating></gmp-place-rating>
                <gmp-place-type></gmp-place-type>
                <gmp-place-price></gmp-place-price>
                <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
                <gmp-place-open-now-status></gmp-place-open-now-status>
                <gmp-place-attribution
                    light-scheme-color="gray"
                    dark-scheme-color="white"></gmp-place-attribution>
            </gmp-place-content-config>
        </gmp-place-details-compact>
    </body>
</html>