你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Maps适用于 .NET 的搜索客户端库 - 版本 1.0.0-beta.4
Azure Maps搜索是一个库,可以查询位置、兴趣点或几何区域内的搜索。
源代码 | API 参考文档 | REST API 参考文档 | 产品文档
入门
安装包
使用 NuGet 安装适用于 .NET 的客户端库:
dotnet add package Azure.Maps.Search --prerelease
先决条件
必须具有 Azure 订阅和Azure Maps帐户。
若要创建新的Azure Maps帐户,可以使用 Azure 门户、Azure PowerShell或 Azure CLI。 下面是使用 Azure CLI 的示例:
az maps account create --kind "Gen2" --account-name "myMapAccountName" --resource-group "<resource group>" --sku "G2"
验证客户端
可通过两种方式对客户端进行身份验证:共享密钥身份验证和 Azure AD。
共享密钥身份验证
- 转到“Azure Maps帐户>身份验证”选项卡
- “共享密钥身份验证”部分下的“复制
Primary Key
”或Secondary Key
// Create a SearchClient that will authenticate through Subscription Key (Shared key)
AzureKeyCredential credential = new AzureKeyCredential("<My Subscription Key>");
MapsSearchClient client = new MapsSearchClient(credential);
Azure AD 身份验证
若要与 Azure Maps 服务交互,需要创建 MapsSearchClient 类的实例。 使用 Azure 标识库可以轻松添加 Azure Active Directory 支持,以便使用相应的 Azure 服务对 Azure SDK 客户端进行身份验证。
若要使用 AAD 身份验证,请将 、 CLIENT_ID
和 CLIENT_SECRET
设置为TENANT_ID
环境变量,并调用 DefaultAzureCredential()
方法来获取凭据。 CLIENT_ID
和 CLIENT_SECRET
是可以访问Azure Maps帐户的服务主体 ID 和机密。
我们还需要Azure Maps客户端 ID,该 ID 可从“Azure Active Directory 身份验证”部分中的“身份验证”选项卡>Azure Maps页>获取。
// Create a MapsSearchClient that will authenticate through AAD
DefaultAzureCredential credential = new DefaultAzureCredential();
string clientId = "<My Map Account Client Id>";
MapsSearchClient client = new MapsSearchClient(credential, clientId);
共享访问签名 (SAS) 身份验证
共享访问签名 (SAS) 令牌是使用 JSON Web 令牌 (JWT) 格式创建的身份验证令牌,通过加密签名来证明应用程序对 Azure Maps REST API 的身份验证。
在集成 SAS 令牌身份验证之前,我们需要安装 Azure.ResourceManager
并 Azure.ResourceManager.Maps
(版本 1.1.0-beta.2
或更高版本) :
dotnet add package Azure.ResourceManager
dotnet add package Azure.ResourceManager.Maps --prerelease
在代码中,我们需要为 Azure Maps SDK 和 ResourceManager 导入以下行:
using Azure.Core.GeoJson;
using Azure.Maps.Search;
using Azure.Maps.Search.Models;
using Azure.Core;
using Azure.ResourceManager;
using Azure.ResourceManager.Maps;
using Azure.ResourceManager.Maps.Models;
然后,可以通过列出 Sas API 获取 SAS 令牌并将其 MapsSearchClient
分配给 。 在以下代码示例中,我们提取特定的 maps 帐户资源,并在执行代码时创建 1 天的过期时间的 SAS 令牌。
// Get your azure access token, for more details of how Azure SDK get your access token, please refer to https://learn.microsoft.com/en-us/dotnet/azure/sdk/authentication?tabs=command-line
TokenCredential cred = new DefaultAzureCredential();
// Authenticate your client
ArmClient armClient = new ArmClient(cred);
string subscriptionId = "MyMapsSubscriptionId";
string resourceGroupName = "MyMapsResourceGroupName";
string accountName = "MyMapsAccountName";
// Get maps account resource
ResourceIdentifier mapsAccountResourceId = MapsAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, accountName);
MapsAccountResource mapsAccount = armClient.GetMapsAccountResource(mapsAccountResourceId);
// Assign SAS token information
// Every time you want to SAS token, update the principal ID, max rate, start and expiry time
string principalId = "MyManagedIdentityObjectId";
int maxRatePerSecond = 500;
// Set start and expiry time for the SAS token in round-trip date/time format
DateTime now = DateTime.Now;
string start = now.ToString("O");
string expiry = now.AddDays(1).ToString("O");
MapsAccountSasContent sasContent = new MapsAccountSasContent(MapsSigningKey.PrimaryKey, principalId, maxRatePerSecond, start, expiry);
Response<MapsAccountSasToken> sas = mapsAccount.GetSas(sasContent);
// Create a SearchClient that will authenticate via SAS token
AzureSasCredential sasCredential = new AzureSasCredential(sas.Value.AccountSasToken);
MapsSearchClient client = new MapsSearchClient(sasCredential);
关键概念
MapsSearchClient
用于:
- 与Azure Maps终结点通信以查询地址或位置点
- 与Azure Maps终结点通信,请求一组实体的几何数据,例如城市或国家/地区大纲
- 与Azure Maps终结点通信,以在单个或多个几何图形内执行自由表单搜索
通过查看我们的示例了解详细信息
线程安全
我们保证所有客户端实例方法都是线程安全的,并且彼此独立 (准则) 。 这可确保重用客户端实例的建议始终是安全的,即使在线程之间也是如此。
其他概念
客户端选项 | 访问响应 | 长时间运行的操作 | 处理失败 | 诊断 | 嘲笑 | 客户端生存期
示例
可以使用我们的 示例熟悉不同的 API。
获取多边形示例
// Get Addresses
Response<SearchAddressResult> searchResult = await client.SearchAddressAsync("Seattle");
// Extract geometry ids from addresses
string geometry0Id = searchResult.Value.Results[0].DataSources.Geometry.Id;
string geometry1Id = searchResult.Value.Results[1].DataSources.Geometry.Id;
// Extract position coordinates
GeoPosition positionCoordinates = searchResult.Value.Results[0].Position;
// Get polygons from geometry ids
PolygonResult polygonResponse = await client.GetPolygonsAsync(new[] { geometry0Id, geometry1Id });
// Get polygons objects
IReadOnlyList<PolygonObject> polygonList = polygonResponse.Polygons;
模糊搜索示例
Response<SearchAddressResult> fuzzySearchResponse = await client.FuzzySearchAsync("coffee", new FuzzySearchOptions
{
Coordinates = new GeoPosition(121.56, 25.04),
Language = SearchLanguage.EnglishUsa
});
// Print out the possible results
Console.WriteLine("The possible results for coffee shop:");
foreach (SearchAddressResultItem result in fuzzySearchResponse.Value.Results)
{
Console.WriteLine("Coordinate: {0}, Address: {1}",
result.Position, result.Address.FreeformAddress);
}
反向搜索十字街地址示例
var reverseResult = await client.ReverseSearchCrossStreetAddressAsync(new ReverseSearchCrossStreetOptions
{
Coordinates = new GeoPosition(121.0, 24.0),
Language = SearchLanguage.EnglishUsa
});
搜索结构化地址示例
var address = new StructuredAddress
{
CountryCode = "US",
StreetNumber = "15127",
StreetName = "NE 24th Street",
Municipality = "Redmond",
CountrySubdivision = "WA",
PostalCode = "98052"
};
Response<SearchAddressResult> searchResult = await client.SearchStructuredAddressAsync(address);
SearchAddressResultItem resultItem = searchResult.Value.Results[0];
Console.WriteLine("First result - Coordinate: {0}, Address: {1}",
resultItem.Position, resultItem.Address.FreeformAddress);
在几何图形内搜索示例
GeoPolygon sfPolygon = new GeoPolygon(new[]
{
new GeoPosition(-122.43576049804686, 37.752415234354402),
new GeoPosition(-122.4330139160, 37.706604725423119),
new GeoPosition(-122.36434936523438, 37.712059855877314),
new GeoPosition(-122.43576049804686, 37.7524152343544)
});
GeoPolygon taipeiPolygon = new GeoPolygon(new[]
{
new GeoPosition(121.56, 25.04),
new GeoPosition(121.565, 25.04),
new GeoPosition(121.565, 25.045),
new GeoPosition(121.56, 25.045),
new GeoPosition(121.56, 25.04)
});
// Search coffee shop in Both polygons, return results in en-US
Response<SearchAddressResult> searchResponse = await client.SearchInsideGeometryAsync("coffee", new GeoCollection(new[] { sfPolygon, taipeiPolygon }), new SearchInsideGeometryOptions
{
Language = SearchLanguage.EnglishUsa
});
// Get Taipei Cafe and San Francisco cafe and print first place
SearchAddressResultItem taipeiCafe = searchResponse.Value.Results.Where(addressItem => addressItem.SearchAddressResultType == "POI" && addressItem.Address.Municipality == "Taipei City").First();
SearchAddressResultItem sfCafe = searchResponse.Value.Results.Where(addressItem => addressItem.SearchAddressResultType == "POI" && addressItem.Address.Municipality == "San Francisco").First();
Console.WriteLine("Possible Coffee shop in the Polygons:");
Console.WriteLine("Coffee shop address in Taipei: {0}", taipeiCafe.Address.FreeformAddress);
Console.WriteLine("Coffee shop address in San Francisco: {0}", sfCafe.Address.FreeformAddress);
示例搜索地址
Response<SearchAddressResult> searchResult = await client.SearchAddressAsync("Seattle");
SearchAddressResultItem resultItem = searchResult.Value.Results[0];
Console.WriteLine("First result - Coordinate: {0}, Address: {1}",
resultItem.Position, resultItem.Address.FreeformAddress);
疑难解答
常规
与 Azure Maps 服务交互时,语言服务返回的错误对应于为 REST API 请求返回的相同 HTTP 状态代码。
例如,如果尝试使用无效坐标进行搜索,则会返回错误,指示“请求错误”。400
后续步骤
供稿
有关构建、测试和参与此库的详细信息,请参阅 CONTRIBUTING.md 。
本项目欢迎贡献和建议。 大多数贡献要求你同意贡献者许可协议 (CLA),并声明你有权(并且确实有权)授予我们使用你的贡献的权利。 有关详细信息,请访问 <cla.microsoft.com>。
提交拉取请求时,CLA 机器人将自动确定你是否需要提供 CLA,并相应地修饰 PR(例如标签、注释)。 直接按机器人提供的说明操作。 只需使用 CLA 对所有存储库执行一次这样的操作。
此项目采用了 Microsoft 开放源代码行为准则。 有关详细信息,请参阅行为准则常见问题解答,或如果有任何其他问题或意见,请与 联系。