Utilizzare le API Places e Geocoding con gli stili basati sui dati per i confini

Seleziona la piattaforma: Android iOS JavaScript

Sviluppatori dello Spazio economico europeo (SEE)

Puoi utilizzare l'API Places e l'API Geocoding nell'API Maps JavaScript per cercare regioni e ottenere maggiori informazioni sui luoghi. L'API Geocoding e l'API Places sono alternative potenti e stabili per ottenere gli ID luogo. Se utilizzi già gli ID luogo, puoi riutilizzarli facilmente con lo stile basato sui dati per i confini.

Aggiungi Places e Geocoding alle tue app API Maps JavaScript nei seguenti modi:

Utilizzare l'API Places

Puoi utilizzare Ricerca di testo (nuova) per ottenere un ID luogo che includa i dati della regione utilizzando includedType per specificare il tipo di regione da restituire. L'utilizzo dell'API Text Search (New) per richiedere solo ID luogo non comporta alcun addebito. Scopri di più.

Questa mappa di esempio mostra come effettuare una richiesta searchByText per ottenere l'ID luogo per Trinidad, CA, quindi applicare lo stile al confine:

TypeScript

async function findBoundary() {
    const request = {
        query: 'Trinidad, CA',
        fields: ['id', 'location'],
        includedType: 'locality',
        locationBias: center,
    };

    const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary;
    //@ts-ignore
    const { places } = await Place.searchByText(request);

    if (places.length) {
        const place = places[0];
        styleBoundary(place.id);
        map.setCenter(place.location);
    } else {
        console.log('No results');
    }
}

function styleBoundary(placeid) {
    // Define a style of transparent purple with opaque stroke.
    const styleFill = {
        strokeColor: '#810FCB',
        strokeOpacity: 1.0,
        strokeWeight: 3.0,
        fillColor: '#810FCB',
        fillOpacity: 0.5
    };

    // Define the feature style function.
    featureLayer.style = (params) => {
        if (params.feature.placeId == placeid) {
            return styleFill;
        }
    };
}

JavaScript

async function findBoundary() {
  const request = {
    query: "Trinidad, CA",
    fields: ["id", "location"],
    includedType: "locality",
    locationBias: center,
  };
  const { Place } = await google.maps.importLibrary("places");
  //@ts-ignore
  const { places } = await Place.searchByText(request);

  if (places.length) {
    const place = places[0];

    styleBoundary(place.id);
    map.setCenter(place.location);
  } else {
    console.log("No results");
  }
}

function styleBoundary(placeid) {
  // Define a style of transparent purple with opaque stroke.
  const styleFill = {
    strokeColor: "#810FCB",
    strokeOpacity: 1.0,
    strokeWeight: 3.0,
    fillColor: "#810FCB",
    fillOpacity: 0.5,
  };

  // Define the feature style function.
  featureLayer.style = (params) => {
    if (params.feature.placeId == placeid) {
      return styleFill;
    }
  };
}

Visualizza il codice sorgente dell'esempio completo

TypeScript

let map;
let featureLayer;
let center;

async function initMap() {
    const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;

    center = {lat: 41.059, lng: -124.151}; // Trinidad, CA

    map = new Map(document.getElementById('map') as HTMLElement, {
        center: center,
        zoom: 15,
        // In the cloud console, configure this Map ID with a style that enables the
        // "Locality" Data Driven Styling type.
        mapId: 'a3efe1c035bad51b', // <YOUR_MAP_ID_HERE>,
    });

    featureLayer = map.getFeatureLayer('LOCALITY');

    findBoundary();
}
async function findBoundary() {
    const request = {
        query: 'Trinidad, CA',
        fields: ['id', 'location'],
        includedType: 'locality',
        locationBias: center,
    };

    const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary;
    //@ts-ignore
    const { places } = await Place.searchByText(request);

    if (places.length) {
        const place = places[0];
        styleBoundary(place.id);
        map.setCenter(place.location);
    } else {
        console.log('No results');
    }
}

function styleBoundary(placeid) {
    // Define a style of transparent purple with opaque stroke.
    const styleFill = {
        strokeColor: '#810FCB',
        strokeOpacity: 1.0,
        strokeWeight: 3.0,
        fillColor: '#810FCB',
        fillOpacity: 0.5
    };

    // Define the feature style function.
    featureLayer.style = (params) => {
        if (params.feature.placeId == placeid) {
            return styleFill;
        }
    };
}
initMap();

JavaScript

let map;
let featureLayer;
let center;

async function initMap() {
  const { Map } = await google.maps.importLibrary("maps");

  center = { lat: 41.059, lng: -124.151 }; // Trinidad, CA
  map = new Map(document.getElementById("map"), {
    center: center,
    zoom: 15,
    // In the cloud console, configure this Map ID with a style that enables the
    // "Locality" Data Driven Styling type.
    mapId: "a3efe1c035bad51b", // <YOUR_MAP_ID_HERE>,
  });
  featureLayer = map.getFeatureLayer("LOCALITY");
  findBoundary();
}

async function findBoundary() {
  const request = {
    query: "Trinidad, CA",
    fields: ["id", "location"],
    includedType: "locality",
    locationBias: center,
  };
  const { Place } = await google.maps.importLibrary("places");
  //@ts-ignore
  const { places } = await Place.searchByText(request);

  if (places.length) {
    const place = places[0];

    styleBoundary(place.id);
    map.setCenter(place.location);
  } else {
    console.log("No results");
  }
}

function styleBoundary(placeid) {
  // Define a style of transparent purple with opaque stroke.
  const styleFill = {
    strokeColor: "#810FCB",
    strokeOpacity: 1.0,
    strokeWeight: 3.0,
    fillColor: "#810FCB",
    fillOpacity: 0.5,
  };

  // Define the feature style function.
  featureLayer.style = (params) => {
    if (params.feature.placeId == placeid) {
      return styleFill;
    }
  };
}

initMap();

Utilizzare il completamento automatico di Places per trovare regioni

Il widget Place Autocomplete offre un modo pratico per consentire agli utenti di cercare regioni. Per configurare il widget Place Autocomplete in modo che restituisca solo le regioni, imposta types su (regions), come mostrato nel seguente snippet:

// Set up the Autocomplete widget to return only region results.
const autocompleteOptions = {
  fields: ["place_id", "type"],
  strictBounds: false,
  types: ["(regions)"],
};

Visualizzare i dettagli di un luogo per una regione

I dati sui dettagli del luogo per una regione possono essere molto utili. Ad esempio, puoi:

  • Cerca gli ID luogo del confine in base ai nomi dei luoghi.
  • Ottieni l'area visibile per lo zoom su un confine.
  • Recupera il tipo di elemento per il confine (ad esempio locality).
  • Ottieni l'indirizzo formattato, che si risolve in "Nome luogo, Stato, Paese" nella regione degli Stati Uniti (ad esempio, "Ottumwa, IA, USA").
  • Ricevi altri dati utili, come le foto.

La seguente funzione di esempio trova il confine di Trinidad, CA, e centra la mappa sul risultato:

La seguente chiamata di funzione di esempio fetchFields() per ottenere i dettagli del luogo incluso place.geometry.viewport, quindi chiama map.fitBounds() per centrare la mappa sul poligono di confine selezionato.

    async function getPlaceDetails(placeId) {
        // Use place ID to create a new Place instance.
        const place = new google.maps.places.Place({
            id: placeId,
        });

        // Call fetchFields, passing the data fields you want.
        await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'geometry', 'type'] });

        // Zoom to the boundary polygon.
        let viewport = place.geometry.viewport;
        map.fitBounds(viewport, 155);

        // Print some place details to the console.
        const types = place.types;
        console.log("Feature type: " + types[0]);
        console.log("Formatted address: " + place.formattedAddress);
    }

Utilizzare l'API Geocoding

L'API Geocoding ti consente di convertire gli indirizzi in coordinate geografiche e viceversa. I seguenti utilizzi si combinano bene con gli stili basati sui dati per i confini:

  • Utilizza il geocoding per ottenere il riquadro per una regione.
  • Applica il filtro dei componenti alla chiamata Geocoding per ottenere gli ID luogo per le aree amministrative 1-4, la località o il codice postale.
  • Utilizza la geocodifica inversa per trovare gli ID luogo in base alle coordinate di latitudine/longitudine o restituisci gli ID luogo per tutti i componenti di una determinata posizione.

Ottieni l'area visibile per una regione

Il servizio di geocodifica può accettare un ID luogo e restituire un'area visibile, che puoi trasferire alla funzione map.fitBounds() per eseguire lo zoom su un poligono di confine sulla mappa. L'esempio seguente mostra l'utilizzo del servizio di geocodifica per ottenere una finestra, quindi la chiamata di map.fitBounds():

// Set up the geocoder.
geocoder = new google.maps.Geocoder();

...

// Call Geocoding API and zoom to the resulting bounds.
function zoomToPolygon(placeid) {
    geocoder
        .geocode({ placeId: placeid })
        .then(({ results }) => {
            map.fitBounds(results[0].geometry.viewport, 155);
        })
        .catch((e) => {
            console.log('Geocoder failed due to: ' + e)
        });
}

Utilizzare la geocodifica inversa

La geocodifica inversa può essere utilizzata per trovare gli ID luogo. La seguente funzione del servizio di geocodifica restituisce gli ID luogo per tutti i componenti dell'indirizzo in corrispondenza delle coordinate di latitudine/longitudine specificate:

// Set up the geocoder.
geocoder = new google.maps.Geocoder();

...

// Call Geocoding API.
function getPlaceIds(latLng) {
    geocoder
        .geocode({ latLng })
        .then(({ results }) => {
            console.log('Geocoding result:');
            console.log(results[0]);
            console.log(results[0].place_id);
            console.log(results[0].address_components);
        })
        .catch((e) => {
            console.log('Geocoder failed due to: ' + e)
        });
}

Ecco la chiamata al servizio web di geocodifica inversa equivalente:

```html
https://maps.googleapis.com/maps/api/geocode/json?key="YOUR_API_KEY"&latlng=41.864182,-87.676930
```

Per utilizzare il geocoding inverso con il filtro dei componenti per ottenere il componente dell'indirizzo per uno o più dei seguenti tipi nella località specificata:

  • administrativeArea
  • country
  • locality
  • postalCode

La funzione di esempio successiva mostra l'utilizzo del servizio di geocodifica, l'aggiunta di limitazioni dei componenti con la geocodifica inversa per ottenere tutti i componenti dell'indirizzo nella posizione specificata solo per il tipo locality:

// Set up the geocoder.
geocoder = new google.maps.Geocoder();

...

function getPlaceIdWithRestrictions(latLng) {
    geocoder
        .geocode({ latLng,
            componentRestrictions: {
              country: "US",
              locality: "chicago",
            },
        })
        .then(({ results }) => {
            console.log('Geocoding result with restriction:');
            console.log(results[0]);
            console.log(results[0].place_id);
            console.log(results[0].address_components);
            console.log(results[0].address_components[1].types[0]);
            console.log(results[0].address_components[1].long_name);
        })
        .catch((e) => {
            console.log('getPlaceId Geocoder failed due to: ' + e)
        });
}

Questa è la chiamata al servizio web di geocodifica inversa equivalente:

```html
    https://maps.googleapis.com/maps/api/geocode/json?key="YOUR_API_KEY"&latlng=41.864182,-87.676930&result_type=locality
```