You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Maps C# SDK是否支持获取基准点与目标点集的最近点?

Azure Maps C# SDK 获取最近点的实现方案

目前Azure Maps官方C# SDK(如Azure.Maps.Search、Azure.Maps.Routing等包)没有直接封装对应Spatial Post Closest Point的方法,你可以通过以下两种方式实现需求:

1. 直接调用REST API

利用Azure密钥认证,在C#中直接发起HTTP请求调用Spatial Post Closest Point接口,支持批量目标点的最近点计算。示例代码如下:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

var subscriptionKey = Environment.GetEnvironmentVariable("SUBSCRIPTION_KEY") ?? string.Empty;
var baseUrl = "https://atlas.microsoft.com/spatial/closestPoint/json";

// 构造请求参数与请求体
var requestParams = new Dictionary<string, string>
{
    {"api-version", "2023-06-01"},
    {"subscription-key", subscriptionKey}
};

var requestBody = new
{
    Point = new { Latitude = 47.6062, Longitude = -122.3321 }, // 基准点
    Points = new[] // 目标点集合
    {
        new { Latitude = 47.6101, Longitude = -122.3347 },
        new { Latitude = 47.6095, Longitude = -122.3308 },
        new { Latitude = 47.6051, Longitude = -122.3315 }
    }
};

var jsonBody = JsonSerializer.Serialize(requestBody);

using var httpClient = new HttpClient();
var requestUri = new UriBuilder(baseUrl)
{
    Query = string.Join("&", requestParams.Select(kv => $"{kv.Key}={kv.Value}"))
}.Uri;

var request = new HttpRequestMessage(HttpMethod.Post, requestUri);
request.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

var response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();

var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);

// 解析并输出最近点信息
var closestPoint = result.GetProperty("closestPoint");
Console.WriteLine($"最近点坐标: ({closestPoint.GetProperty("latitude").GetDouble():F4}, {closestPoint.GetProperty("longitude").GetDouble():F4})");

2. 本地计算最近点(适用于小规模目标点集合)

如果目标点数量较少,可在本地通过Haversine公式计算几何距离,筛选出基准点的最近点。示例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;

// 坐标实体类
public class GeoCoordinate
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

// 计算两点间Haversine距离(单位:米)
public static double CalculateHaversineDistance(GeoCoordinate point1, GeoCoordinate point2)
{
    const double EarthRadius = 6371000; // 地球半径(米)
    var dLat = ToRadians(point2.Latitude - point1.Latitude);
    var dLon = ToRadians(point2.Longitude - point1.Longitude);
    var a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
            Math.Cos(ToRadians(point1.Latitude)) * Math.Cos(ToRadians(point2.Latitude)) *
            Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
    var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
    return EarthRadius * c;
}

private static double ToRadians(double degrees)
{
    return degrees * Math.PI / 180;
}

// 使用示例
var basePoint = new GeoCoordinate { Latitude = 47.6062, Longitude = -122.3321 };
var targetPoints = new List<GeoCoordinate>
{
    new GeoCoordinate { Latitude = 47.6101, Longitude = -122.3347 },
    new GeoCoordinate { Latitude = 47.6095, Longitude = -122.3308 },
    new GeoCoordinate { Latitude = 47.6051, Longitude = -122.3315 }
};

var closestPoint = targetPoints
    .Select(p => new { Point = p, Distance = CalculateHaversineDistance(basePoint, p) })
    .OrderBy(item => item.Distance)
    .First();

Console.WriteLine($"最近点坐标: ({closestPoint.Point.Latitude:F4}, {closestPoint.Point.Longitude:F4}),距离: {closestPoint.Distance:F2}米");

内容的提问来源于stack exchange,提问作者Its_Me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:12:40