你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Java REST SDK 开发人员指南(预览版)

Azure Maps Java SDK 可与 Java 应用程序和库集成,以生成与地图相关的位置感知应用程序。 Azure Maps Java SDK 包含用于搜索、路线规划、呈现、地理定位、交通、时区和天气的 API。 这些 API 支持搜索地址、在不同坐标之间规划路线、获取特定 IP 地址的地理位置等操作。

注意

Azure Maps Java SDK 以 Java 8 为基线,在最新 Java 长期支持版本(目前为 Java 18)推出之前可供测试并提供前向支持。 有关可供下载的 Java 版本列表,请参阅 Java 标准版本

先决条件

提示

可以通过编程方式创建 Azure Maps 帐户。下面是使用 Azure CLI 的示例:

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

创建 Maven 项目

以下 PowerShell 代码片段演示如何使用 PowerShell 创建 maven 项目。 首先,运行 maven 命令以创建一个 maven 项目:

mvn archetype:generate "-DgroupId=groupId" "-DartifactId=DemoProject" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DarchetypeVersion=1.4" "-DinteractiveMode=false" 
参数 说明
-DGroupId 组 ID 用于在所有项目中唯一标识你的项目
-DartifactId 项目名称。 它将创建为一个新文件夹。
-DarchetypeArtifactId 项目类型。 maven-archetype-quickstart 生成示例项目。
-DinteractiveMode 设置为 false 会生成一个带有默认选项的空白 Java 项目。

安装包

若要使用 Azure Maps Java SDK,需要安装所有必需的包。 Azure Maps 中的每个服务在其自身的包中提供。 Azure Maps 服务包括搜索、呈现、交通、天气等。只需安装你要在项目中使用的服务的包即可。

创建 maven 项目后,应会出现一个 pom.xml 文件,其中包含组 ID、名称、工件 ID 等基本信息。 接下来,为每项 Azure Maps 服务添加依赖项,如以下示例所示:

<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> 

对项目运行 mvn clean install,然后创建一个名为 demo.java 的 java 文件,并将所需的内容从 Azure Maps 导入该文件:

cd DemoProject
New-Item demo.java

提示

如果运行 mvn clean install 导致错误,请尝试运行 mvn clean install -U

Azure Maps 服务

Service name Maven 包 示例
搜索 azure-maps-search 搜索示例
路由 azure-maps-routing  路由示例
呈现 azure-maps-rendering 呈现示例
地理位置 azure-maps-geolocation 地理位置示例
时区 azure-maps-timezone 时区示例

创建 MapsSearchClient 并对其进行身份验证

使用 Azure Maps 订阅密钥时,用于访问 Azure Maps 搜索 API 的客户端对象需要使用一个 AzureKeyCredential 对象进行身份验证;在使用 Microsoft Entra ID 进行身份验证时,它需要一个包含 Azure Maps 客户端 ID 的 TokenCredential 对象。 有关身份验证的详细信息,请参阅向 Azure Maps 进行身份验证

使用 Microsoft Entra 凭据

可以使用 Azure 标识库对 Microsoft Entra ID 进行身份验证。 若要使用 DefaultAzureCredential 提供程序,需要在 pom.xml 文件中添加 mvn 依赖项:

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

需要注册新的 Microsoft Entra 应用程序,并通过向服务主体分配所需角色来授予对 Azure Maps 的访问权限。 有关详细信息,请参阅在非 Azure 资源上托管守护程序。 此时将返回应用程序(客户端)ID、目录(租户)ID 和 和客户端密码。 复制这些值并将其存储在安全位置。 在后续步骤中需要用到这些值。

将 Microsoft Entra 应用程序的应用程序(客户端)ID、目录(租户)ID 和客户端机密的值以及映射资源的客户端 ID 设置为环境变量:

环境变量 描述
AZURE_CLIENT_ID 已注册的应用程序中的应用程序(客户端)ID
AZURE_CLIENT_SECRET 已注册的应用程序中客户端密码的值
AZURE_TENANT_ID 已注册的应用程序中的目录(租户)ID
MAPS_CLIENT_ID Azure Maps 帐户中的客户端 ID

现在,可以在 PowerShell 中创建环境变量来存储这些值:

$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>"

设置环境变量后,可以在程序中使用它们来实例化 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();
    }
}

重要

虽然在上一个代码片段中创建的其他环境变量未用于代码示例,但 DefaultAzureCredential() 需要使用它们。 如果未使用相同的命名约定正确设置这些环境变量,则会出现运行时错误。 例如,如果 AZURE_CLIENT_ID 缺失或无效,则会出现 InvalidAuthenticationTokenTenant 错误。

使用订阅密钥凭据

可以使用 Azure Maps 订阅密钥进行身份验证。 可以在 Azure Maps 帐户的“身份验证”部分找到订阅密钥,如以下屏幕截图所示:

Screenshot showing your Azure Maps subscription key in the Azure portal.

现在,可以在 PowerShell 中创建环境变量来存储订阅密钥:

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

创建环境变量后,可以在代码中访问它:

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();
    }
}

模糊搜索实体

以下代码片段演示如何在简单的控制台应用程序中导入 azure-maps-search 包并在 Seattle 附近模糊搜索“Starbucks”:

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());
        }
    }
}

此代码片段演示如何使用 Azure 凭据创建 MapsSearchClient 对象。 首先使用 Azure Maps 订阅密钥实例化 AzureKeyCredential,然后传递凭据以实例化 MapsSearchClientFuzzySearchMapsSearchClient 方法可以使用兴趣点 (POI) 名称“Starbucks”和坐标 GeoPosition(-122.31, 47.61)。

在命令行中从项目文件夹执行程序:

java .\demo.java

你应会看到 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)

搜索地址

调用 SearchAddress 方法以获取地址的坐标。 如下所示修改示例中的 Main 程序:

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());
        }
    }
}

在此示例中,client.SearchAddress 方法返回按置信度分数排序的结果,并输出第一个结果的坐标。

Azure Maps 搜索还提供了一些批量查询方法。 这些方法将返回长时间运行的操作 (LRO) 对象。 请求可能不会立即返回所有结果,因此用户可以选择等待操作完成或定期查询结果,如批量反向搜索方法中所示:

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());
            }
        }
    }
}