Какой запрос к API карт поможет мне получить координаты для нахожедения кратчайшего пути от А в Б с помощью алгоритма A*

Рейтинг: 0Ответов: 0Опубликовано: 31.03.2023

Мне необходимо получить данные в пределах полигона от 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);

Спасибо)

Ответы

Ответов пока нет.