Какой запрос к API карт поможет мне получить координаты для нахожедения кратчайшего пути от А в Б с помощью алгоритма A*
Мне необходимо получить данные в пределах полигона от API например: OpenStreetMap для того, чтобы использовать алгоритм нахожедения кратчайшего пути от A до B. Моя основная идея - сделать такой запрос, который предоставит мне список всех координат внутри полигона, после чего распознать какие координаты являются дорогами, построить граф и прогнать алгоритм A*. Однако количество координат внутри полигона может быть бесконечным.
Мой проект - это оптимизация маршрутов доставки и мне важно, чтобы на вход алгоритма поступали реальные данные.
Вот код, который я пытался сделать для получения матрицы координат заданного полигона:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
public class RouteOptimizer
{
public static void Main(string[] args)
{
GetCoordinatesMatrix(32.3338, 34.8445, 32.3197, 34.8715);
}
public static /*double[,]*/ void GetCoordinatesMatrix(double lat1, double lon1, double lat2, double lon2)
{
string query = @"
(
node(" + lat1 + "," + lon1 + "," + lat2 + "," + lon2 + "); way(" + lat1 + ", " + lon1 + ", " + lat2 + ", " + lon2 + "); rel(" + lat1 + ", " + lon1 + ", " + lat2 + ", " + lon2 + "););out meta;";
query = string.Format(query, lat1, lon1, lat2, lon2);
var client = new RestClient("https://overpass-api.de/api/interpreter");
var request = new RestRequest("POST");
request.AddParameter("application/x-www-form-urlencoded", query, ParameterType.RequestBody);
var response = client.Execute(request);
dynamic responseJson = JsonConvert.DeserializeObject<dynamic>(response.Content);
JArray elementsArray = (JArray)responseJson.elements;
var nodes = elementsArray.SelectTokens("$[?(@.type == 'node')]");
var ways = elementsArray.SelectTokens("$[?(@.type == 'way')]");
var relations = elementsArray.SelectTokens("$[?(@.type == 'relation')]");
var coordinates = new List<Tuple<double, double>>();
foreach (var node in nodes)
{
double lat = node["lat"].Value<double>();
double lon = node["lon"].Value<double>();
Console.WriteLine($"Latitude: {lat}, Longitude: {lon}");
coordinates.Add(Tuple.Create(lat, lon));
}
//foreach (var way in ways)
//{
// var wayNodes = way.SelectTokens("$.nodes[*]").Select(n => (long)n).ToList();
// var coords = wayNodes.Select(n => nodes.ElementAt((int)n)).Select(n => Tuple.Create(n["lat"].Value<double>(), n["lon"].Value<double>()));
// Console.WriteLine($"Way ID: {way["id"]}, Coordinates: {string.Join(", ", coords)}");
// coordinates.AddRange(coords);
//}
//foreach (var relation in relations)
//{
// double lat = relation.center.lat;
// double lon = relation.center.lon;
// coordinates.Add(Tuple.Create(lat, lon));
//}
//double[,] matrix = new double[coordinates.Count, 2];
//for (int i = 0; i < coordinates.Count; i++)
//{
// matrix[i, 0] = coordinates[i].Item1;
// matrix[i, 1] = coordinates[i].Item2;
//}
//return matrix;
}
}
Части которые закоментированы, имеют ошибки.
При запуске ошибка: response.Content = 'response.Content' threw an exception of type 'System.NullReferenceException'
dynamic responseJson = JsonConvert.DeserializeObject<dynamic>(response.Content);
Спасибо)