Udostępnij przez


Przewodnik dla programistów Java REST SDK (wersja wstępna)

SDK Azure Maps for Java można zintegrować z aplikacjami i bibliotekami Java, aby tworzyć aplikacje powiązane z mapami i świadome lokalizacji. Azure Maps Java SDK zawiera interfejsy API do wyszukiwania, tras, renderowania, geolokalizacji, ruchu, stref czasowych i pogody. Te interfejsy API obsługują operacje takie jak wyszukiwanie adresu, planowanie trasy między różnymi współrzędnymi, uzyskiwanie geolokalizacji konkretnego adresu IP itp.

Uwaga

Java SDK Azure Maps oparty jest na wersji Java 8, z testowaniem i wsparciem na przyszłość do najnowszego wydania Java z długoterminowym wsparciem (obecnie Java 18). Lista wersji Java do pobrania znajduje się w sekcji Standardowe wersje Java.

Wymagania wstępne

Tip

Konto usługi Azure Maps można utworzyć programowo. Oto przykład przy użyciu interfejsu wiersza polecenia platformy Azure:

az maps account create --kind "Gen2" --account-name "myMapAccountName" --resource-group "<resource group>" --sku "G2"

Tworzenie projektu Maven

Następujący fragment kodu PowerShell demonstruje, jak używać PowerShell do utworzenia projektu maven. Najpierw uruchom polecenie maven, aby utworzyć projekt maven.

mvn archetype:generate "-DgroupId=groupId" "-DartifactId=DemoProject" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DarchetypeVersion=1.4" "-DinteractiveMode=false" 
Parameter Opis
-DGroupId Identyfikator grupy unikalnie identyfikuje Twój projekt wśród wszystkich projektów.
-DartifactId Nazwa projektu. Jest tworzony jako nowy folder.
-DarchetypeArtifactId rodzaj projektu maven-archetype-quickstart skutkuje przykładowym projektem.
-DinteractiveMode Ustawienie na false powoduje utworzenie pustego projektu Java z domyślnymi opcjami.

Instalowanie pakietów

Aby używać Azure Maps Java SDK, należy zainstalować wszystkie wymagane pakiety. Each service in Azure Maps is available in its own package. The Azure Maps services include Search, Render, Traffic, Weather, etc. You only need to install the packages for the service or services used in your project.

Po utworzeniu projektu Maven powinien istnieć plik pom.xml zawierający podstawowe informacje, takie jak identyfikator grupy, nazwa, identyfikator artefaktu. Następnie dodaj zależność dla każdej z usług Azure Maps, jak pokazano w poniższym przykładzie.

<dependency> 
  <groupId>com.azure</groupId> 
  <artifactId>azure-maps-search</artifactId> 
  <version>1.0.0-beta.1</version> 
</dependency> 
<dependency> 
  <groupId>com.azure</groupId> 
  <artifactId>azure-maps-route</artifactId> 
  <version>1.0.0-beta.1</version> 
</dependency> 
<dependency> 
  <groupId>com.azure</groupId> 
  <artifactId>azure-maps-render</artifactId> 
  <version>1.0.0-beta.1</version> 
</dependency> 
<dependency> 
  <groupId>com.azure</groupId> 
  <artifactId>azure-maps-traffic</artifactId> 
  <version>1.0.0-beta.1</version> 
</dependency> 
<dependency> 
  <groupId>com.azure</groupId> 
  <artifactId>azure-maps-weather</artifactId> 
  <version>1.0.0-beta.1</version> 
</dependency> 
<dependency> 
  <groupId>com.azure</groupId> 
  <artifactId>azure-maps-timezone</artifactId> 
  <version>1.0.0-beta.1</version> 
</dependency> 

Uruchom polecenie mvn clean install w projekcie, a następnie utwórz plik java o nazwie demo.java i zaimportuj potrzebne elementy z usługi Azure Maps do pliku:

cd DemoProject
New-Item demo.java

Tip

Jeśli uruchomienie mvn clean install skutkuje błędem, spróbuj uruchomić mvn clean install -U.

Usługi Azure Maps

Nazwa usługi pakiet Maven Próbki
Szukaj azure-maps-search wyszukiwanie przykładów
Trasowanie azure-maps-routing  przykłady routingu
Renderowanie azure-maps-rendering renderowanie przykładu
Geolokalizacja azure-maps-geolocation przykład geolokalizacji
Timezone azure-maps-timezone przykłady stref czasowych

Utwórz i uwierzytelnij klienta MapsSearchClient

Obiekt klienta używany do uzyskiwania dostępu do interfejsów API wyszukiwania Azure Maps wymaga albo obiektu AzureKeyCredential do uwierzytelniania przy użyciu klucza subskrypcji Azure Maps, albo obiektu TokenCredential z identyfikatorem klienta Azure Maps przy uwierzytelnianiu za pomocą Microsoft Entra ID. Aby uzyskać więcej informacji na temat uwierzytelniania, zobacz Authentication with Azure Maps (Uwierzytelnianie za pomocą usługi Azure Maps).

Używanie poświadczeń entra firmy Microsoft

Możesz uwierzytelnić się przy użyciu Microsoft Entra ID, korzystając z biblioteki Azure Identity. Aby użyć dostawcy DefaultAzureCredential, musisz dodać zależność mvn w pliku pom.xml.

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-identity</artifactId>
</dependency>

You need to register the new Microsoft Entra application and grant access to Azure Maps by assigning the required role to your service principal. Aby uzyskać więcej informacji, zobacz Hostowanie demona w zasobach spoza platformy Azure. The Application (client) ID, a Directory (tenant) ID, and a client secret are returned. Skopiuj te wartości i zapisz je w bezpiecznym miejscu. Są one potrzebne w poniższych krokach.

Set the values of the Application (client) ID, Directory (tenant) ID, and client secret of your Microsoft Entra application, and the map resource's client ID as environment variables:

zmienna środowiskowa Opis
AZURE_CLIENT_ID Identyfikator aplikacji (klienta) w zarejestrowanej aplikacji
AZURE_CLIENT_SECRET (tajny klucz klienta Azure) Wartość tajemnicy klienta w Twojej zarejestrowanej aplikacji
AZURE_TENANT_ID Directory (tenant) ID in your registered application
MAPS_CLIENT_ID Identyfikator klienta na koncie usługi Azure Map

Teraz możesz utworzyć zmienne środowiskowe w programie PowerShell, aby przechowywać następujące wartości:

$Env:AZURE_CLIENT_ID="<client-id>"
A$Env:AZURE_CLIENT_SECRET="<client-secret>"
$Env:AZURE_TENANT_ID="<tenant-id>"
$Env:MAPS_CLIENT_ID="<maps-client-id>"

Po skonfigurowaniu zmiennych środowiskowych możesz użyć ich w programie, aby zainicjować klienta AzureMapsSearch:

import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.maps.search.MapsSearchClient;
import com.azure.maps.search.MapsSearchClientBuilder;

public class Demo {
    public static void main( String[] args) {
        MapsSearchClientBuilder builder = new MapsSearchClientBuilder();
        DefaultAzureCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
        builder.credential(tokenCredential);
        builder.mapsClientId(System.getenv("MAPS_CLIENT_ID"));
        MapsSearchClient client = builder.buildClient();
    }
}

Ważne

Inne zmienne środowiskowe utworzone w poprzednim fragmencie kodu, choć nie są używane w przykładowym kodzie, są wymagane przez DefaultAzureCredential(). Jeśli nie ustawisz poprawnie tych zmiennych środowiskowych zgodnie z tymi samymi konwencjami nazewnictwa, wystąpią błędy czasu wykonywania. Na przykład, jeśli twój AZURE_CLIENT_ID jest brakujący lub nieprawidłowy, pojawi się błąd InvalidAuthenticationTokenTenant.

Używanie poświadczenia klucza subskrypcji

Możesz uwierzytelnić się przy użyciu klucza subskrypcji usługi Azure Maps. Klucz subskrypcji można znaleźć w sekcji Uwierzytelnianie na koncie usługi Azure Maps, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający klucz subskrypcji usługi Azure Maps w witrynie Azure Portal.

Teraz możesz tworzyć zmienne środowiskowe w PowerShell, aby przechowywać klucz subskrypcji.

$Env:SUBSCRIPTION_KEY="<subscription-key>"

Po utworzeniu zmiennej środowiskowej możesz uzyskać do niej dostęp w kodzie:

import com.azure.core.credential.AzureKeyCredential;
import com.azure.maps.search.MapsSearchClient;
import com.azure.maps.search.MapsSearchClientBuilder;

public class Demo {
    public static void main( String[] args) {

        // Use Azure Maps subscription key authentication
        MapsSearchClientBuilder builder = new MapsSearchClientBuilder();
        AzureKeyCredential keyCredential = new AzureKeyCredential(System.getenv("SUBSCRIPTION_KEY"));
        builder.credential(keyCredential);
        MapsSearchClient client = builder.buildClient();
    }
}

Wyszukiwanie przybliżone jednostki

Poniższy fragment kodu pokazuje, jak w prostej aplikacji konsolowej zaimportować pakiet azure-maps-search i przeprowadzić przybliżone wyszukiwanie "Starbucks" w pobliżu Seattle.

import java.io.IOException;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.models.GeoPosition;
// Enable the 2 imports below if you want to use AAD authentication 
// import com.azure.identity.DefaultAzureCredential;
// import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.maps.search.MapsSearchClient;
import com.azure.maps.search.MapsSearchClientBuilder;
import com.azure.maps.search.models.FuzzySearchOptions;
import com.azure.maps.search.models.SearchAddressResult;
import com.azure.maps.search.models.SearchAddressResultItem;

public class Demo {
    public static void main( String[] args) throws IOException {
    MapsSearchClientBuilder builder = new MapsSearchClientBuilder();
    
    // Instantiate with key credential. Get SUBSCRIPTION_KEY from environment variable: 
    AzureKeyCredential keyCredential = new AzureKeyCredential(System.getenv("SUBSCRIPTION_KEY"));
    builder.credential(keyCredential);
    
    // Or you can also instantiate with token credential: 
    // DefaultAzureCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
    // builder.credential(tokenCredential);
    // builder.mapsClientId(System.getenv("MAPS_CLIENT_ID"));
    MapsSearchClient client = builder.buildClient();
    
    // Fuzzy search with options: 
    SearchAddressResult results = client.fuzzySearch(new FuzzySearchOptions("starbucks", new GeoPosition(-122.34255, 47.61010)));
    
    // Print the search results:
    for (SearchAddressResultItem item : results.getResults()) {
              MapsSearchAddress address = item.getAddress();
             GeoPosition coordinate = item.getPosition();
             System.out.format(
                 "* %s, %s\\n" +
                 "  %s %s %s\\n" +
                 "  Coordinate: (%.4f, %.4f)\\n",
                 address.getStreetNumber(), address.getStreetName(),
                 address.getMunicipality(), address.getCountryCode(), address.getPostalCode(),
                 coordinate.getLatitude(), coordinate.getLongitude());
        }
    }
}

Ten fragment kodu demonstruje, jak utworzyć obiekt MapsSearchClient przy użyciu poświadczeń Azure. Rozpocznij od stworzenia instancji AzureKeyCredential używając klucza subskrypcji Azure Maps, następnie przekaż dane uwierzytelniające, aby stworzyć instancję MapsSearchClient. MapsSearchClient metody takie jak FuzzySearch mogą używać nazwy punktu zainteresowania (POI) "Starbucks" oraz współrzędnych GeoPosition(-122.31, 47.61).

Uruchom program z folderu projektu w wierszu poleceń.

java .\demo.java

Powinieneś zobaczyć listę adresów i wyników współrzędnych Starbucks:

* 1912, Pike Place
  Seattle US 98101
  Coordinate: (47.6102, -122.3425)
* 2118, Westlake Avenue
  Seattle US 98121
  Coordinate: (47.6173, -122.3378)
* 2601, Elliott Avenue
  Seattle US 98121
  Coordinate: (47.6143, -122.3526)
* 1730, Howell Street
  Seattle US 98101
  Coordinate: (47.6172, -122.3298)
* 220, 1st Avenue South
  Seattle US 98104
  Coordinate: (47.6003, -122.3338)
* 400, Occidental Avenue South
  Seattle US 98104
  Coordinate: (47.5991, -122.3328)
* 1600, East Olive Way
  Seattle US 98102
  Coordinate: (47.6195, -122.3251)
* 500, Mercer Street
  Seattle US 98109
  Coordinate: (47.6250, -122.3469)
* 505, 5Th Ave S
  Seattle US 98104
  Coordinate: (47.5977, -122.3285)
* 425, Queen Anne Avenue North
  Seattle US 98109
  Coordinate: (47.6230, -122.3571)

Wyszukaj adres

Wywołaj metodę , SearchAddress aby uzyskać współrzędną adresu. Zmodyfikuj główny program z przykładu w następujący sposób:

import java.io.IOException;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.models.GeoPosition;
// Enable the 2 imports below if you want to use AAD authentication 
// import com.azure.identity.DefaultAzureCredential;
// import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.maps.search.MapsSearchClient;
import com.azure.maps.search.MapsSearchClientBuilder;
import com.azure.maps.search.models.SearchAddressOptions;
import com.azure.maps.search.models.SearchAddressResult;
import com.azure.maps.search.models.SearchAddressResultItem;

public class Demo {
    public static void main( String[] args) throws IOException {
    MapsSearchClientBuilder builder = new MapsSearchClientBuilder();
    
    // Instantiate with key credential: 
    AzureKeyCredential keyCredential = new  
        AzureKeyCredential(System.getenv("SUBSCRIPTION_KEY"));
    builder.credential(keyCredential);
    
    // Or you can also instantiate with token credential: 
    // DefaultAzureCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
    // builder.credential(tokenCredential);
    // builder.mapsClientId(System.getenv("MAPS_CLIENT_ID"));
    
    MapsSearchClient client = builder.buildClient();
    client.searchAddress(new SearchAddressOptions("15127 NE 24th Street, Redmond, WA 98052"));
    
    // Search address with options and return top 5 results: 
    SearchAddressResult results = client.searchAddress(new SearchAddressOptions("1  
        Main Street").setCoordinates(new GeoPosition(-74.011454,  
        40.706270)).setRadiusInMeters(40000).setTop(5));
    
    // Print results: 
    if (results.getResults().size() > 0) {
        SearchAddressResultItem item = results.getResults().get(0);
        System.out.format("The coordinates is (%.4f, %.4f)", 
            item.getPosition().getLatitude(), item.getPosition().getLongitude());
        }
    }
}

W tym przykładzie metoda client.SearchAddress zwraca wyniki uporządkowane według wskaźnika pewności i wydrukowuje współrzędne pierwszego wyniku.

Usługa Azure Maps Search udostępnia również niektóre metody zapytań wsadowych. Te metody zwracają obiekty Long Running Operations (LRO). Żądania mogą nie zwracać wszystkich wyników od razu, więc użytkownicy mogą wybrać, czy chcą poczekać na zakończenie procesu, czy okresowo odpytywać o wynik, jak pokazano w metodzie wyszukiwania wstecznego w trybie wsadowym.

import java.util.ArrayList;
import java.util.List;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.models.GeoPosition;
// Enable the 2 imports below if you want to use AAD authentication
// import com.azure.identity.DefaultAzureCredential;
// import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.maps.search.MapsSearchClient;
import com.azure.maps.search.MapsSearchClientBuilder;
import com.azure.maps.search.models.BatchReverseSearchResult;
import com.azure.maps.search.models.ReverseSearchAddressBatchItem;
import com.azure.maps.search.models.ReverseSearchAddressOptions;
import com.azure.maps.search.models.ReverseSearchAddressResultItem;

public class Demo{
    public static void main( String[] args) throws IOException {
        MapsSearchClientBuilder builder = new MapsSearchClientBuilder();
        
        // Instantiate with key credential:
        AzureKeyCredential keyCredential = new 
        AzureKeyCredential(System.getenv("SUBSCRIPTION_KEY"));
        builder.credential(keyCredential);
        
        // Or you can also instantiate with token credential: 
        // DefaultAzureCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
        // builder.credential(tokenCredential);
        // builder.mapsClientId(System.getenv("MAPS_CLIENT_ID"));
        
        MapsSearchClient client = builder.buildClient();
        List<ReverseSearchAddressOptions> reverseOptionsList = new ArrayList<>();
        reverseOptionsList.add(new ReverseSearchAddressOptions(new GeoPosition(2.294911, 48.858561)));
        reverseOptionsList.add(new ReverseSearchAddressOptions(new GeoPosition(-122.34255, 47.61010)));
        reverseOptionsList.add(new ReverseSearchAddressOptions(new GeoPosition(-122.33817, 47.61559)).setRadiusInMeters(5000));
        BatchReverseSearchResult batchReverseSearchResult = 
        client.beginReverseSearchAddressBatch(reverseOptionsList).getFinalResult();
        for (ReverseSearchAddressBatchItem item : batchReverseSearchResult.getBatchItems()) {
            for (ReverseSearchAddressResultItem result : item.getResult().getAddresses()) {
                System.out.println(result.getAddress().getFreeformAddress());
            }
        }
    }
}