C# :: Aufgabe #399

3 Lösungen Lösungen öffentlich

Stände von Koordinaten (Standort) im Umkreis von x km ermitteln

Anfänger - C# von Gustl - 21.05.2021 um 17:06 Uhr
Erstelle eine Funktion, eventuell mit Hilfe einer Datenbank, welche über die Parameter Location (Latitude & Longitude) und Radius in Kilometer alle Städte in dem Umkreis mit den Koordinaten ausgibt.

Oder eine Liste mit den Koordinaten in diesem Umkreis. Somit können dann die Städte in einer GeoDatenbank ermittelt werden.

Lösungen:

vote_ok
von JKooP (18070 Punkte) - 21.05.2021 um 19:59 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

const double AverageDistance = 111.3;
const double Rad = Math.PI / 180; // 0.01745

Dictionary<string, Location> locations = new()
{
    { "Frankfurt Main", new Location(50.053764, 8.637086) },
    { "Mainz", new Location(50.001231, 8.276251) },
    { "Darmstadt", new Location(49.872775, 8.651177) },
    { "Würzburg", new Location(49.79245, 9.932966) },
    { "Heidelberg", new Location(49.398752, 8.672434) },
    { "Mannheim", new Location(49.489591, 8.467236) },
    { "Stuttgart", new Location(48.778449, 9.180013) },
};

var compare = new Location(49.00689, 8.403653); // Karlsruhe
var radius = 70.0;

locations.Where(x => Distance(x.Value, compare) <= radius).Select(x => new {loc = x.Key, dis = Math.Round(Distance(x.Value, compare),1) })
    .ToList().ForEach(x => Console.WriteLine($"{x.loc}: {x.dis} km"));

static double Distance(Location loc1, Location loc2)
{
    var lat = Math.Cos((loc1.Lat + loc2.Lat) / 2 * Rad); // Verbesserungswert Längenkreise
    var x = AverageDistance * lat * (loc1.Lon - loc2.Lon);
    var y = AverageDistance * (loc1.Lat - loc2.Lat);
    return Math.Sqrt(x * x + y * y);
}

record Location(double Lat, double Lon);
vote_ok
von hollst (13980 Punkte) - 22.05.2021 um 18:47 Uhr
Quellcode ausblenden C#-Code
using static System.Console;

static bool distance_less_than_R(Point ref_point, Point city, double radius) =>
    (ref_point.X - city.X) * (ref_point.X - city.X) + 
    (ref_point.Y - city.Y) * (ref_point.Y - city.Y) < radius * radius ? true : false;
    
//test mit 100 zufallsstaedten
Point[] locations = new Point[100];
double xmin = 0.0, ymin = 0.0, xmax = 100.0, ymax = 100.0; //Begrenzungsgebiet in km
System.Random rand = new System.Random();

for (var i = 0; i < locations.Length; i++)  {
    Point p = new Point();
    p.X = xmin + (xmax - xmin) * rand.NextDouble();
    p.Y = ymin + (ymax - ymin) * rand.NextDouble();
    locations[i] = p;
}

double radius = 20.0; //km

for (var i = 0; i < locations.Length; i++)  {    
    Point pref = new Point() { X = locations[i].X, Y = locations[i].Y };
    for (var j = 0; j < locations.Length; j++)  {
        Point city = new Point() { X = locations[j].X, Y = locations[j].Y };
        if (j != i && distance_less_than_R(pref, city, radius))
            WriteLine($"city {j, 2} liegt im {radius} km Umkreise von city {i, 2}");
    }           
}

WriteLine("ready");
ReadKey();

record Point  {
    public double X;
    public double Y;
}
vote_ok
von hollst (13980 Punkte) - 29.06.2021 um 08:30 Uhr
Quellcode ausblenden C#-Code
/*
Erstelle eine Funktion, eventuell mit Hilfe einer Datenbank, 
welche über die Parameter Location (Latitude & Longitude) und Radius in Kilometer 
alle Städte in dem Umkreis mit den Koordinaten ausgibt.

Oder eine Liste mit den Koordinaten in diesem Umkreis. 
Somit können dann die Städte in einer GeoDatenbank ermittelt werden. 
*/
//https://www.kompf.de/gps/distcalc.html
//using System;

using static System.Console;

static bool distance_less_than_radius(Point ref_point, Point city, double radius) =>
    (ref_point.X - city.X) * (ref_point.X - city.X) + 
    (ref_point.Y - city.Y) * (ref_point.Y - city.Y) < 
    radius * radius ? 
    true : false;
    
//test mit 100 zufallsstaedten
Point[] locations = new Point[100];
double xmin = 0.0, ymin = 0.0, xmax = 100.0, ymax = 100.0; //Begrenzungsgebiet in km²
System.Random random = new System.Random();

for (var i = 0; i < locations.Length; i++)  {
    Point p = new Point();
    p.X = xmin + (xmax - xmin) * random.NextDouble();
    p.Y = ymin + (ymax - ymin) * random.NextDouble();
    locations[i] = p;
}

double radius = 20.0; //km

for (var i = 0; i < locations.Length; i++)  {    
    Point pref = new Point() { X = locations[i].X, Y = locations[i].Y };
    for (var j = 0; j < locations.Length; j++)  {
        Point city = new Point() { X = locations[j].X, Y = locations[j].Y };
        if (j != i && distance_less_than_radius(pref, city, radius))
            WriteLine($"city {j, 2} liegt im {radius} km Umkreise von city {i, 2}");
    }           
}

WriteLine("ready");
ReadKey();

record Point  {
    public double X;
    public double Y;
}