Hi an alle, ich steh vor einem für mich noch unlösbarem problem 😁
Undzwar (achso vorne weg : Hab gegoogled und auch forumsuche benutzt)
:
Ich bin leidenschaftlicher Seegler und jetzt wollte ich mir gerne eine Methode schreiben, womit ich einfach 2 GPS Koordinaten eingebe (Komplette Welt) und es wird mir berechnet, welche Entfernung die beiden Koordinaten haben.
Es wäre sehr nett von euch,wenn ihr mir helfen würdet !
Liebe Grüße
stube
Auch anfänger haben "mal" ne frage 😁
http://www.informit.com/guides/content.asp?g=dotnet&seqNum=513&rl=1
http://www.codeproject.com/csharp/distancebetweenlocations.asp
Google-Dauer für beide Hits < 2 min 😉
😜 ich glaub ich habs mit google nicht drauf, deprimierend !
Auch anfänger haben "mal" ne frage 😁
Ok, danke schonmal, hat funktioniert, allerdings komm ich jetzt zu einem problem und ich hab wirklich danach gegoogled und nix gefunden 🙂 ich hoffe,dass jetzt nicht wieder ergebnisse bei google gepostet werden,dann häng ich mich auf wegen einer depression weil ich bei google nix finde 😉
also folgender code in der Klasse :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
public static class CDistanceBetweenLocations
{
public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
{
/*
The Haversine formula according to Dr. Math.
[URL]http://mathforum.org/library/drmath/view/51879.html[/URL]
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2(sqrt(a), sqrt(1-a))
d = R * c
Where
\* dlon is the change in longitude
\* dlat is the change in latitude
\* c is the great circle distance in Radians.
\* R is the radius of a spherical Earth.
\* The locations of the two points in
spherical coordinates (longitude and
latitude) are lon1,lat1 and lon2, lat2.
\*/
double dDistance = Double.MinValue;
double dLat1InRad = Lat1 * (Math.PI / 180.0);
double dLong1InRad = Long1 * (Math.PI / 180.0);
double dLat2InRad = Lat2 * (Math.PI / 180.0);
double dLong2InRad = Long2 * (Math.PI / 180.0);
double dLongitude = dLong2InRad - dLong1InRad;
double dLatitude = dLat2InRad - dLat1InRad;
// Intermediate result a.
double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) *
Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);
// Intermediate result c (great circle distance in Radians).
double c = 2.0 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a));
// Distance.
// const Double kEarthRadiusMiles = 3956.0;
const Double kEarthRadiusKms = 6376.5;
dDistance = kEarthRadiusKms * c;
return dDistance;
}
public static double Calc(string NS1, double Lat1, double Lat1Min,
string EW1, double Long1, double Long1Min, string NS2,
double Lat2, double Lat2Min, string EW2,
double Long2, double Long2Min)
{
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
double EW1Sign = NS1.ToUpper() == "E" ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper() == "N" ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper() == "E" ? 1.0 : -1.0;
return (Calc(
(Lat1 + (Lat1Min / 60)) * NS1Sign,
(Long1 + (Long1Min / 60)) * EW1Sign,
(Lat2 + (Lat2Min / 60)) * NS2Sign,
(Long2 + (Long2Min / 60)) * EW2Sign
));
}
public static void Main(string[] args)
{
if (args.Length < 12)
{
System.Console.WriteLine("usage: DistanceBetweenLocations" +
" N 43 35.500 W 80 27.800 N 43 35.925 W 80 28.318";);
return;
}
System.Console.WriteLine(Calc(
args[0],
System.Double.Parse(args[1]),
System.Double.Parse(args[2]),
args[3],
System.Double.Parse(args[4]),
System.Double.Parse(args[5]),
args[6],
System.Double.Parse(args[7]),
System.Double.Parse(args[8]),
args[9],
System.Double.Parse(args[10]),
System.Double.Parse(args[11])));
}
}
So Funktioniert auch alles soweit !
Das hier ist der Code von der ASPX seite :
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class gps1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Berechnen_Click(object sender, EventArgs e)
{
// CDistanceBetweenLocations Calculater = new CDistanceBetweenLocations();
Entfernung.Text = CDistanceBetweenLocations.Calc(Convert.ToDouble(long1.Text), Convert.ToDouble(lat1.Text), Convert.ToDouble(long2.Text), Convert.ToDouble(lat2.Text)).ToString();
}
}
Soweit, so gut !
Aber hier das Problem :
72 03 05 N <- Textbox 3
14 05 18 W <- Textbox 4
Kannst mir da auch wer weiterhelfen ?!
Danke schonmal im vorraus !!!
Auch anfänger haben "mal" ne frage 😁
ein alter codeschnippsel, hatte auhc ma das problem allerdings für routenplaner und koordinatenberechnung per luftlinie, müsste dir weiter helfen, gibt die entfernung in km aus, musste nur noch umrechnen in NM
Alt1 = Alt1*Math.PI/180; Long1 = Long1*Math.PI/180;
Alt2 = Alt2*Math.PI/180; Long2 = Long2*Math.PI/180;
if (Long1<Long2) { LaengenUnterschied = Long2 - Long1; }
else { LaengenUnterschied = Long1 - Long2; }
LaengenUnterschied = (Long1 - Long2);
Entfernung = Math.Round(1.852*60*Math.Acos((Math.Sin (Alt1)*Math.Sin(Alt2))+ Math.Cos(Alt1)*Math.Cos(Alt2)*Math.Cos(LaengenUnterschied))*180/Math.PI,2);
Hallo Stube,
ich arbeite privatan einem Projekt zur Darstellung des Sternenhimmls, da bekomme ich sehr viel mit Winkeln und Polarkoordinaten (wie geogr. Länge und Breite) zu tun. Ich habe für beidee bereits je eine Klasse entwickelt, aber die Distanz zwischen zwei Punkten bisher nicht als Funktion, den Code aber bereits zur internen Nutzung fertig...
Du hast mich gerade auf die Idee gebracht, das noch einzubauen -> ein sehr sinnvolles Feature!! Danke.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hallo,
hier mal die Solution für die dll mit den Klassen Angle und PolarPoint.
Für Dich wären die Methoden Angle.SetDegrees(short deg, short min, short sec) und PolarPointBase.DistanceTo(PolarPointBase pp) interessant. Da kannst Du abgucken oder einfach die Klassen benutzen, aber ich fürchte fast daß das für Deine Zwecke etwas "oversized" ist.
Edit: Die Entfernung kommt als Winkel raus, wenn Du km haben willst musst du das noch auf den Erdball umrechnen 😉
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
@DarkShadow81:
In deinem Code steht:
Entfernung = Math.Round(1.852*60*Math.Acos((Math.Sin (Alt1)*Math.Sin(Alt2))+ Math.Cos(Alt1)*Math.Cos(Alt2)*Math.Cos(LaengenUnterschied))*180/Math.PI,2);
Besonders fiel mir dabei das
1.852
auf. Da
Guck dir mal die Anwendung SportTracks an! Da kannst du deine GPS punkte importieren und in Google Maps usw. angucken 🙂 (http://www.zonefivesoftware.com/SportTracks/)
.unreal
Da hier anscheinend gerade die Spezialisten in Sachen Längen- und Breitengraden zusammengekommen sind, erlaube ich mir auch schnell eine Zusatzfrage 🙂
Zur Entfernungsberechnung zwischen 2 Städten verwende ich folgende Formel:
Entfernung = arccos(sin(B_lat)*sin(A_lat)+cos(B_lat)*cos(A_lat)*cos(B_lon - A_lon)) * Erdradius
So weit, so gut. Nun möchte ich eine Umkreissuche hinzufügen.
Dafür muß ich eine gegebene Entfernung zu einer Stadt (z.B. 30km) in einen Kleinkreis umrechnen.
Also eine kreisrunde Fläche auf einer Kugelgeometrie.
Mein Ansatz wäre nun gewesen die obige Formel umzustellen, aber dazu reicht mein Mathematik-Verständnis leider nicht aus :
Daher wäre ich um Unterstützung dankbar, die mir bei der Berechnung hilfreich ist.
@wdb.lizardking
Umkreissuche: dafür musst du doch wahrscheinlich sowieso jedes zu untersuchende Objekt testen. Berechne dabei die Entfernung zum Zentrum mithilfe Deiner Formel. Ist Sie kleiner als der Radius, hast Du einen Treffer.
Direkt an geogr. Position abzulesen ob Du in dem entsprechenden Kleinkreis bist, würde wahrscheinlich sowieso bedeuten, genau diesen Schritt einfach in eine Funktion zu kapseln, die dann nur noch einen Boolean zurückliefert...
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
@Darkshadow :
Wie muss ich z.B. den "Laengenunterschied" bestimmen,bzw. einbinden?
Ansonsten schonmal hilfreich,danke an alle bisher
Auch anfänger haben "mal" ne frage 😁
und ich bräuchte noch eine kleine unterstützung bei der sache von der eingabe !
Hier das gewünschte format....
72 03 05 N <- Textbox 3
14 05 18 W <- Textbox 4
ganz liebe grüße
stube
Auch anfänger haben "mal" ne frage 😁
Hi, letzte Frage, was steht in den beiden Variablen Alt1 und Alt2?
Wenn ich diese Frage noch beantwortet bekomme, verspreche ich nicht mehr zu nerven! 😉
mfg
Der olle Stube
Auch anfänger haben "mal" ne frage 😁
daten kommen aus diesem format (in meinem Falle aus einer mysqltabelle -> (GeoDb )
Hallo,
wenn Du die Klassen aus meinem oben angehangenen Code nutzt, sieht dioe Sache so aus, da kannst Du auch direkt die aus Deinem String geparsten Werte verwenden:
using MarsStein.Geometry;
//---------
Angle latitude = Angle.Create(78,5,17);
Angle longitude = Angle.Create(52,3,15);
PolarPoint p1 = new PolarPoint(longitude,latitude);
latitude.SetDegrees(72,3,5);
longitude.SetDegrees(-14,5,18); // <-- das "-" im ersten Parameter steht für West.
PolarPoint p2 = new PolarPoint(longitude,latitude);
AngleBase distanceAngle = p1.DistanceTo(p2);
double distanzAufDerErde = distanceAngle.Radians * ErdRadius;
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hi...mir ist das schon ziemlich peinlich,dass ich euch hier andauernd nerven muss... aber ich hab folgendes problem... ich hab jetzt folgenden code :
Das ist die klasse :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
public static class CDistanceBetweenLocations
{
public static double Calc(string NS1, double Lat1, double Lat1Min, string EW1, double Long1, double Long1Min, string NS2, double Lat2, double Lat2Min, string EW2, double Long2, double Long2Min)
{
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
double EW1Sign = NS1.ToUpper() == "E" ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper() == "N" ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper() == "E" ? 1.0 : -1.0;
return (Calc(
(Lat1 + (Lat1Min / 60)) * NS1Sign,
(Long1 + (Long1Min / 60)) * EW1Sign,
(Lat2 + (Lat2Min / 60)) * NS2Sign,
(Long2 + (Long2Min / 60)) * EW2Sign
));[IMG]wiefolgt[/IMG]
}
public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
{
/*double dDistance = Double.MinValue;
double dLat1InRad = Lat1 * (Math.PI / 180.0);
double dLong1InRad = Long1 * (Math.PI / 180.0);
double dLat2InRad = Lat2 * (Math.PI / 180.0);
double dLong2InRad = Long2 * (Math.PI / 180.0);
double dLongitude = dLong2InRad - dLong1InRad;
double dLatitude = dLat2InRad - dLat1InRad;
double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) + Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) * Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);*/
double LaengenUnterschied;
double Entfernung;
Lat1 = Lat1 * Math.PI / 180; Long1 = Long1 * Math.PI / 180;
Lat2 = Lat2 * Math.PI / 180; Long2 = Long2 * Math.PI / 180;
if (Long1 < Long2) { LaengenUnterschied = Long2 - Long1; }
else { LaengenUnterschied = Long1 - Long2; }
LaengenUnterschied = (Long1 - Long2);
Entfernung = Math.Round(1.852 * 60 * Math.Acos((Math.Sin(Lat1) * Math.Sin(Lat2)) + Math.Cos(Lat1) * Math.Cos(Lat2) * Math.Cos(LaengenUnterschied)) * 180 / Math.PI, 2);
return Entfernung;
}
public static void Main(string[] args)
{
if (args.Length < 12)
{
System.Console.WriteLine("usage: DistanceBetweenLocations" +
" N 43 35.500 W 80 27.800 N 43 35.925 W 80 28.318");
return;
}
System.Console.WriteLine(Calc(
args[0],
System.Double.Parse(args[1]),
System.Double.Parse(args[2]),
args[3],
System.Double.Parse(args[4]),
System.Double.Parse(args[5]),
args[6],
System.Double.Parse(args[7]),
System.Double.Parse(args[8]),
args[9],
System.Double.Parse(args[10]),
System.Double.Parse(args[11])));
}
}
Das ist die ASPX seite:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="gps1.aspx.cs" Inherits="gps1" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<form runat="server" id="Form1">
<table border="1" runat="server" id="Table1">
<tr>
<td>Koordinate 2:</td>
</tr>
<tr>
<td>Länge 1:</td>
<td style="width: 513px">
<asp:TextBox runat="server" ID="long1" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongMM1" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongSS1" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungl1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" Width="100px">
<asp:ListItem>Ost</asp:ListItem>
<asp:ListItem>West</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td>Breite 1:</td>
<td style="width: 513px">
<asp:TextBox runat="server" ID="lat1" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatMM1" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatSS1" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungb1" runat="server" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged" Width="100px">
<asp:ListItem>Nord</asp:ListItem>
<asp:ListItem>Süd</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td>Koordinate 2:</td>
</tr>
<tr>
<td>Länge 2:</td>
<td style="width: 513px">
<asp:TextBox ID="long2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongMM2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongSS2" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungb2" runat="server" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged" Width="100px">
<asp:ListItem>Ost</asp:ListItem>
<asp:ListItem>West</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td>Breite 2:</td>
<td style="width: 513px">
<asp:TextBox ID="lat2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatMM2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatSS2" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungl2" runat="server" OnSelectedIndexChanged="DropDownList4_SelectedIndexChanged" Width="100px">
<asp:ListItem>Nord</asp:ListItem>
<asp:ListItem>Süd</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td><asp:Button ID="Berechnen" Text="Berechnen" runat="server" OnClick="Berechnen_Click" /></td>
</tr>
</table>
<asp:Literal ID="Entfernung1" runat="server"></asp:Literal>
</form>
</asp:Content>
Und das hier ist der Code von der aspx seite:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class gps1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Berechnen_Click(object sender, EventArgs e)
{
// CDistanceBetweenLocations Calculater = new CDistanceBetweenLocations();
Entfernung1.Text = CDistanceBetweenLocations.Calc(ddlHimmelsrichtungb1.SelectedValue, Convert.ToDouble(lat1.Text), Convert.ToDouble(tbLatMM1.Text), Convert.ToDouble(tbLatSS1.Text), ddlHimmelsrichtungl1.SelectedValue, Convert.ToDouble(long1.Text), Convert.ToDouble(tbLongMM1.Text), Convert.ToDouble(tbLongSS1.Text), ddlHimmelsrichtungb2.SelectedValue, Convert.ToDouble(lat2.Text), Convert.ToDouble(tbLatMM2.Text), Convert.ToDouble(tbLatSS2.Text), ddlHimmelsrichtungl2.SelectedValue, Convert.ToDouble(long2.Text), Convert.ToDouble(tbLongMM2.Text), Convert.ToDouble(tbLongSS2.Text));
}
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void DropDownList4_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
so, jetzt soll man es am besten wie folgt eingeben können :
auch wenn ich euch endlos nerve...bitte helft mir....danke schonmal für alles bisherige und danke auch für alles kommende !!!
Auch anfänger haben "mal" ne frage 😁
Hallo Stube,
Du hast in Deinem letztem Post vergessen zu schreiben worin Dein aktuelles Problem eigentlich besteht... Also, was klappt denn noch nicht? Wenigstens ein Hinweis, damit man sich nicht durch den ganzen Code fressen muss um nach einem Fehler zu suchen, den man nicht kennt 8o
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
oh ^^ ja also mein problem ist, dass ich nicht weiß,wie ich das so umschreiben kann,dass man es so wie in dem unten angegebenem bild eingeben kann.
Außerdem sagt er hierbei (auszug aus gps1.aspx.cs)
Entfernung1.Text = CDistanceBetweenLocations.Calc(ddlHimmelsrichtungb1.SelectedValue, Convert.ToDouble(lat1.Text), Convert.ToDouble(tbLatMM1.Text), Convert.ToDouble(tbLatSS1.Text), ddlHimmelsrichtungl1.SelectedValue, Convert.ToDouble(long1.Text), Convert.ToDouble(tbLongMM1.Text), Convert.ToDouble(tbLongSS1.Text), ddlHimmelsrichtungb2.SelectedValue, Convert.ToDouble(lat2.Text), Convert.ToDouble(tbLatMM2.Text), Convert.ToDouble(tbLatSS2.Text), ddlHimmelsrichtungl2.SelectedValue, Convert.ToDouble(long2.Text), Convert.ToDouble(tbLongMM2.Text), Convert.ToDouble(tbLongSS2.Text));
"Keine Überladung für die Methode Calc erfordert 16-Argumente"
Auch anfänger haben "mal" ne frage 😁
Hallo,
Keine Überladung für die Methode Calc erfordert 16-Argumente
Das ist klar. Die Methode Calc erwartete ja auch nur 12 Argumente -> du hast keine Übergabegabeparameter für die Sekundenanteile!!
Ansonsten ist das glaube ich schon ganz ok wie's ist. In der Methode Calc solltest Du allerdings statt
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
das hier verwenden:
double NS1Sign = NS1.ToUpper().StartsWith("N") ? 1.0 : -1.0;
, sonst bist Du immer auf der Südhalbkugel, weil der übergebene String nicht "N" sonder "Nord" lautet 😁
EDIT: Hast Du Dir das Code-Beispiel aus meinem vorletzten Post mal angeschaut? Da wird Dir quasi die ganze Arbeit abgenommen!
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
danke, aber wie kann ich das denn machen,dass ich die sekundenanteile dabei habe ?
Auch anfänger haben "mal" ne frage 😁
Original von Stube
danke, aber wie kann ich das denn machen,dass ich die sekundenanteile dabei habe ? So:
public static double Calc(string NS1, double Lat1, double Lat1Min, double Lat1Sec, string EW1, double Long1, double Long1Min, double Long1Sec, string NS2, double Lat2, double Lat2Min, double Lat2Sec, string EW2, double Long2, double Long2Min, double Long2Sec)
{
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
double EW1Sign = NS1.ToUpper() == "E" ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper() == "N" ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper() == "E" ? 1.0 : -1.0;
return (Calc(
(Lat1 + (Lat1Min / 60) + (Lat1Sec/3600)) * NS1Sign,
(Long1 + (Long1Min / 60) + (Long1Sec/3600) * EW1Sign,
(Lat2 + (Lat2Min / 60) + (Lat2Sec/3600)) * NS2Sign,
(Long2 + (Long2Min / 60)+ (Long2Sec/3600)) * EW2Sign
));[IMG]wiefolgt[/IMG]
}
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Dann sieht es jetzt so aus bei mir :
public static double Calc(string NS1, double Lat1, double Lat1Min, double Lat1Sec, string EW1, double Long1, double Long1Min, double Long1Sec, string NS2, double Lat2, double Lat2Min, double Lat2Sec, string EW2, double Long2, double Long2Min, double Long2Sec)
{
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
double EW1Sign = NS1.ToUpper() == "E" ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper() == "N" ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper() == "E" ? 1.0 : -1.0;
return (Calc(
(Lat1 + (Lat1Min / 60) + (Lat1Sec/3600)) * NS1Sign, (Long1 + (Long1Min / 60) + (Long1Sec/3600) * EW1Sign, (Lat2 + (Lat2Min / 60) + (Lat2Sec/3600)) * NS2Sign, (Long2 + (Long2Min / 60)+ (Long2Sec/3600)) * EW2Sign));
}
public static void Main(string[] args)
{
if (args.Length < 12)
{
System.Console.WriteLine("usage: DistanceBetweenLocations" +
" N 43 35.500 W 80 27.800 N 43 35.925 W 80 28.318");
return;
}
[code]System.Console.WriteLine(Calc(
args[0],
System.Double.Parse(args[1]),
System.Double.Parse(args[2]),
args[3],
System.Double.Parse(args[4]),
System.Double.Parse(args[5]),
args[6],
System.Double.Parse(args[7]),
System.Double.Parse(args[8]),
args[9],
System.Double.Parse(args[10]),
System.Double.Parse(args[11])));[/code]
}
Bei dem System.Console.WriteLine sagt er jetzt jedoch mal wieder folgendes :
"Keine Überladung für die Methode Calc erfordert 12 Argumente" hmmm
Edit: und hinter das "EW1Sign," oben soll ich ne klammer machen,sagt er
also hier :
return (Calc(
(Lat1 + (Lat1Min / 60) + (Lat1Sec/3600)) * NS1Sign, (Long1 + (Long1Min / 60) + (Long1Sec/3600) *
EW1Sign, <- hier soll ne klammer hin ")"
(Lat2 + (Lat2Min / 60) + (Lat2Sec/3600)) * NS2Sign, (Long2 + (Long2Min / 60)+ (Long2Sec/3600)) * EW2Sign));
Auch anfänger haben "mal" ne frage 😁
Hallo,
das liegt daran, daß du die gleiche Funktion einemal mit 12 (im Main()) und eimal mit 16 Parametern aufrufst... Dann wäre es vielleicht besser, die Funktion Calc() in beiden Varianten stehen zu lassen. Oder Du übergibst die Sekundenanteile auch an Dein Main() und rufst dann mit allen 16 Parametern auf.
Die gleiche Funktion mit verschiedener Anzahl typisierter Parameter Aufrufen geht in C# nicht, aber dafür gibts ja eben die Polymorphie 😉
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
dankö,dankö,vielen dankö 🙂 super hilfe Thumbs Up
danke danke danke 🙂
Auch anfänger haben "mal" ne frage 😁
nen kleines problemchen habsch dann aber doch noch....
public static class CDistanceBetweenLocations
{
public static double Calc(string NS1, double Lat1, double Lat1Min, double Lat1Sec, string EW1, double Long1, double Long1Min, double Long1Sec, string NS2, double Lat2, double Lat2Min, double Lat2Sec, string EW2, double Long2, double Long2Min, double Long2Sec)
{
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
double EW1Sign = NS1.ToUpper() == "E" ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper() == "N" ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper() == "E" ? 1.0 : -1.0;
return (Calc(
(Lat1 + (Lat1Min / 60) + (Lat1Sec/3600)) * NS1Sign, (Long1 + (Long1Min / 60) + (Long1Sec/3600)) * EW1Sign, (Lat2 + (Lat2Min / 60) + (Lat2Sec/3600)) * NS2Sign, (Long2 + (Long2Min / 60)+ (Long2Sec/3600)) * EW2Sign));
}
public static void Main(string[] args)
{
if (args.Length < 12)
{
System.Console.WriteLine("usage: DistanceBetweenLocations" +
" N 43 35.500 W 80 27.800 N 43 35.925 W 80 28.318");
return;
}
System.Console.WriteLine(Calc(
args[0],
System.Double.Parse(args[1]),
System.Double.Parse(args[2]),
System.Double.Parse(args[3]),
args[4],
System.Double.Parse(args[5]),
System.Double.Parse(args[6]),
System.Double.Parse(args[7]),
args[8],
System.Double.Parse(args[9]),
System.Double.Parse(args[10]),
System.Double.Parse(args[11]),
args[12],
System.Double.Parse(args[13]),
System.Double.Parse(args[14]),
System.Double.Parse(args[15])));
}
}
Bei dem return Calc sagt er mir,dass Calc 4 Argumente fordert...was kann ich dagegen machen ?
Auch anfänger haben "mal" ne frage 😁
Hallo,
Bei dem return Calc sagt er mir,dass Calc 4 Argumente fordert...was kann ich dagegen machen ?
Du übergibst doch 4 Argumente. Ich habe Deinem Code folgende Dummyfunktion mit 4 Parametern hinzugefügt
public static double Calc(double Lat1,double Long1,double Lat2,double Long2)
{
// Hier soll wohl die "eigentliche" Arbeit passieren, ich hab zum testen einfach mal 0 zurückgegeben:
return 0;
}
und das dann kompiliert. Keinen Fehler festgestellt, ist so gelaufen.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Nach zahlreichem hin und her probieren gehts immernoch nit 😠
Ich zeig euch mal grade die Klasse :
using System;
public static class CDistanceBetweenLocations
{
//public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
//{
// return Math.Acos(Math.Sin(deg2rad(Lat1)) * Math.Sin(deg2rad(Lat2)) +
// Math.Cos(deg2rad(Lat1)) * Math.Cos(deg2rad(Lat2)) * Math.Cos(deg2rad(Long2 - Long1))) * 6371 / 1.825;
//}
//private static double deg2rad(double deg)
//{
// return (deg * Math.PI / 180.0);
//}
public static double Calc(string NS1, double Lat1, double Lat1Min, double Lat1Sec, string EW1, double Long1, double Long1Min, double Long1Sec, string NS2, double Lat2, double Lat2Min, double Lat2Sec, string EW2, double Long2, double Long2Min, double Long2Sec)
{
double NS1Sign = NS1.ToUpper().StartsWith("N") ? 1.0 : -1.0;
double EW1Sign = EW1.ToUpper().StartsWith("O") ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper().StartsWith("N") ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper().StartsWith("O") ? 1.0 : -1.0;
return distance(
(Lat1 + (Lat1Min / 60) + (Lat1Sec / 3600)) * NS1Sign,
(Long1 + (Long1Min / 60) + (Long1Sec / 3600)) * EW1Sign,
(Lat2 + (Lat2Min / 60) + (Lat2Sec / 3600)) * NS2Sign,
(Long2 + (Long2Min / 60) + (Long2Sec / 3600)) * EW2Sign, 'N');
}
public static void Main(string[] args)
{
if (args.Length < 12)
{
System.Console.WriteLine("usage: DistanceBetweenLocations" +
" N 43 35.500 W 80 27.800 N 43 35.925 W 80 28.318");
return;
}
System.Console.WriteLine(Calc(
args[0],
System.Double.Parse(args[1]),
System.Double.Parse(args[2]),
System.Double.Parse(args[3]),
args[4],
System.Double.Parse(args[5]),
System.Double.Parse(args[6]),
System.Double.Parse(args[7]),
args[8],
System.Double.Parse(args[9]),
System.Double.Parse(args[10]),
System.Double.Parse(args[11]),
args[12],
System.Double.Parse(args[13]),
System.Double.Parse(args[14]),
System.Double.Parse(args[15])));
}
private static double distance(double lat1, double long1, double lat2, double long2, char unit) {
double theta = long1 - long2;
double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
dist = Math.Acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
if (unit == 'K') {
dist = dist * 1.609344;
} else if (unit == 'N') {
dist = dist * 0.8684;
}
return (dist);
}
private static double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private static double rad2deg(double rad) {
return (rad / Math.PI * 180.0);
}
}
Das problem ist, dass er,wenn ich überall die gleichen koordinaten eingebe, trotzdem noch 172 Nautische Meilen Entfernung anzeigt... das kann ja schon gar nicht stimmen... alle anderen entfernungen werden natürlich auch falsch ausgegeben....
ich bin am verzweifeln
Auch anfänger haben "mal" ne frage 😁
Hallo Stube,
using System;
public static class CDistanceBetweenLocations
{
public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
{
return Math.Acos(Math.Sin(deg2rad(Lat1)) * Math.Sin(deg2rad(Lat2)) +
Math.Cos(deg2rad(Lat1)) * Math.Cos(deg2rad(Lat2)) * Math.Cos(deg2rad(Long2 - Long1))) * 6371 / 1.825;
}
private static double deg2rad(double deg)
{
return (deg * Math.PI / 180.0);
}
public static double Calc(string NS1, double Lat1, double Lat1Min, double Lat1Sec, string EW1, double Long1, double Long1Min, double Long1Sec, string NS2, double Lat2, double Lat2Min, double Lat2Sec, string EW2, double Long2, double Long2Min, double Long2Sec)
{
double NS1Sign = NS1.ToUpper().StartsWith("N") ? 1.0 : -1.0;
double EW1Sign = EW1.ToUpper().StartsWith("O") ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper().StartsWith("N") ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper().StartsWith("O") ? 1.0 : -1.0;
return Calc(
(Lat1 + (Lat1Min / 60) + (Lat1Sec / 3600)) * NS1Sign,
(Long1 + (Long1Min / 60) + (Long1Sec / 3600)) * EW1Sign,
(Lat2 + (Lat2Min / 60) + (Lat2Sec / 3600)) * NS2Sign,
(Long2 + (Long2Min / 60) + (Long2Sec / 3600)) * EW2Sign);
}
public static void Main(string[] args)
{
System.Console.WriteLine(Calc(
"N", 43, 35, 30, "W", 80, 27, 48, "N", 43, 35, 30, "W", 80, 27, 48));
Console.ReadLine();
}
}
liefert bei mir das gewünschte Ergebnis: Die Koordinaten sind für beide Punkte gleich, und das Ergebnis ist null. Ändert man die Parameter, erhält man einen sinnvollen Wert. Ich habe zum Beispiel auch folgende Zeile probiert:
"N", 90, 0, 0, "W", 0, 0, 0, "S", 90, 0, 0, "W", 0, 0, 0 (Nordpol und Südpol)
und erhalte korrekterweise den halben Erdumfang.
Da das alles Code ist, der bei Dir schon drin stand, weiß ich jetzt wirklich nicht mehr wie ich Dir helfen soll -> bei mir klappt alles wie's soll.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
kannst du mir evtl auch den code von deiner aspx und aspx.cs seite geben ? ich krieg zu viel.....vielen dank.... 😠
Auch anfänger haben "mal" ne frage 😁
Hallo,
kannst du mir evtl auch den code von deiner aspx und aspx.cs seite geben ? ich krieg zu viel.....vielen dank.... 😠
hab ich nicht. hab nur die reine Funktion getestet, mit der Main() die in der Klasse steht 😦
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Könntest du evtl probieren obs bei dir mit folgenden codes funktioniert :
Aspx:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="gps1.aspx.cs" Inherits="gps1" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<form runat="server" id="Form1">
<table border="1" runat="server" id="Table1">
<tr>
<td>Koordinate 2:</td>
</tr>
<tr>
<td>Länge 1:</td>
<td style="width: 513px">
<asp:TextBox runat="server" ID="long1" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongMM1" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongSS1" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungl1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" Width="100px">
<asp:ListItem>Ost</asp:ListItem>
<asp:ListItem>West</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td>Breite 1:</td>
<td style="width: 513px">
<asp:TextBox runat="server" ID="lat1" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatMM1" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatSS1" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungb1" runat="server" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged" Width="100px">
<asp:ListItem>Nord</asp:ListItem>
<asp:ListItem>Süd</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td>Koordinate 2:</td>
</tr>
<tr>
<td>Länge 2:</td>
<td style="width: 513px">
<asp:TextBox ID="long2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongMM2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLongSS2" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungb2" runat="server" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged" Width="100px">
<asp:ListItem>Ost</asp:ListItem>
<asp:ListItem>West</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td>Breite 2:</td>
<td style="width: 513px">
<asp:TextBox ID="lat2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatMM2" runat="server" Width="50px"></asp:TextBox>
<asp:TextBox ID="tbLatSS2" runat="server" Width="50px"></asp:TextBox>
<asp:DropDownList ID="ddlHimmelsrichtungl2" runat="server" OnSelectedIndexChanged="DropDownList4_SelectedIndexChanged" Width="100px">
<asp:ListItem>Nord</asp:ListItem>
<asp:ListItem>Süd</asp:ListItem>
</asp:DropDownList></td>
</tr>
<tr>
<td><asp:Button ID="Berechnen" Text="Berechnen" runat="server" OnClick="Berechnen_Click" /></td>
</tr>
</table>
<asp:Literal ID="Entfernung1" runat="server"></asp:Literal>
</form>
</asp:Content>
und Aspx.Cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class gps1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Berechnen_Click(object sender, EventArgs e)
{
// CDistanceBetweenLocations Calculater = new CDistanceBetweenLocations();
Entfernung1.Text = CDistanceBetweenLocations.Calc(ddlHimmelsrichtungb1.SelectedValue,
Convert.ToDouble(lat1.Text), Convert.ToDouble(tbLatMM1.Text),
Convert.ToDouble(tbLatSS1.Text), ddlHimmelsrichtungl1.SelectedValue,
Convert.ToDouble(long1.Text), Convert.ToDouble(tbLongMM1.Text),
Convert.ToDouble(tbLongSS1.Text), ddlHimmelsrichtungb2.SelectedValue,
Convert.ToDouble(lat2.Text), Convert.ToDouble(tbLatMM2.Text),
Convert.ToDouble(tbLatSS2.Text), ddlHimmelsrichtungl2.SelectedValue,
Convert.ToDouble(long2.Text), Convert.ToDouble(tbLongMM2.Text),
Convert.ToDouble(tbLongSS2.Text)).ToString();
}
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void DropDownList4_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
Auch anfänger haben "mal" ne frage 😁
Hallo,
hatte gar nicht gesehn dass Du eine MasterPage verwendest. Postest Du die bitte auch?
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Unbenannte Seite</title>
</head>
<body>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</body>
</html>
oups 😁
Auch anfänger haben "mal" ne frage 😁
Hallo,
Du hast in der aspx-Datei die ID's für ddlHimmelsrichtungb2 und ddlHimmelsrichtungl2 vertauscht 😉
Sowas sollte man mit dem Debugger aber eigentlich finden 🤔
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
*kopfschüttel* oh man...danke marsstein marsstein ist hier glaubsch mein retter 😁 hab dir noch ne pm geschickt 🙂
Auch anfänger haben "mal" ne frage 😁
Hallo...
Habe mir eine Klasse geschrieben (auch mit Hilfe eures Codes Gps Koordinaten eingeben und entfernung bestimmen - danke!) die Entfernungen usw ausrechnet...
Die Koordinaten, Postleitzahlen usw befinden sich in einer Datenbank.
ich möchte jetzt die 2 Punkte auf einer Karte (wie hier: http://www.koordinaten.de/cgi-ko/stadt_entfernung.cgi) anzeigen...
wie kann ich das realisieren.
Brauche das nicht fürs Web sondern normale Windows Anwendung...
Vielen Dank schonmal
Hallo,
find ich lustig, dass dieser "alte" Thread wiederbelebt wurde 🙂
Ich habe mir damals eine (mehr schlecht als rechte) Funktion geschrieben, die als Eingabeparameter zwei Klassen erwartet, die im Grunde nur die zwingend notwendigen Daten kapseln.
GeoPoint point = Geographischer Punkt aus deiner Datenbank mit Längen- und Breitengrad.
GeoMap map = Geographische Daten deiner ausgewählten Karte. Desto genauer du die Extremwerte der Karte bezüglich Längen- und Breitengrad weißt, desto genauer sollte der angezeigte Punkt in der Karte werden.
public static Point ScaleToScreen(GeoPoint point, GeoMap map)
{
double diff = map.Max.Longtitude - map.Min.Longtitude;
double fact = map.SizeX / (diff);
double plocal = (point.Longtitude - map.Min.Longtitude);
double x = plocal * fact;
diff = map.Max.Latitude - map.Min.Latitude;
fact = map.SizeY / (diff);
plocal = (point.Latitude - map.Min.Latitude);
double y = plocal * fact;
return new Point(Convert.ToInt32(x), Convert.ToInt32(y));
}
klingt gut...
nur wo bekomme ich so ne map her oder lege die daten dahinter?
Wie ist diese Frage gemeint?
Wenn du beispielsweise mit deinem Programm Orte auf einer Deutschlandkarte anzeigen willst, dann mußt du dir eine passende Karte besorgen.
Man sollte sich bei "geliehenen" Grafiken jedoch auf freie Versionen beschränken sonst fängt man sich auch noch eine Klage ein.
Wikipedia.org bietet freie Grafiken, aber für Geobelange eine sehr magere Auswahl.
Beispielsweise eine Deutschlandkarte
Und dann entsprechend die Maxima der Karte (Links, Rechts,Oben,Unten) in deinem Programm mitgeben, damit eine Skalierung erfolgen kann.
Um das zu realisieren benötige ich ja dann die 4 extremwerte von Deutschland oder?
Also den westlichsten Punkt mache ich dann an y = 0 fest, den Südlichsten an x = 0 den Nördlichsten an z.b. y = 400 und den Östlichsten an x = 400.
Und dann kann ich meine Koordinaten richtig einzeichnen weil die Daten ja im richtigen Verhältniss an der Karte (oder nur weiße Fläche - is ja egal) hängen.
Oder hab ich was falsch verstanden?
Wie hänge ich die Infos an die Karte/Fläche?
MfG
edit
passt schon.. erstmal richtig ueberlegen 😁
Hat super geklappt.....
Werd die Klasse fertig machen und dann posten..
Danke
Glückwunsch 😉
Woher beziehst du die Stammdaten für dein Geographieprogramm?
Benutzt du vielleicht OpenGeoDB oder eher was kommerzielles?
Genau!
OpenGeoDB!
Hab von OpenGeoDB die mySQL Daten verwendet...
Funktioniert alles sehr gut - Danke nochmal...
Hallo,
ich beschäftige mich auch gerade ein wenig mit GPS und der Bestimmung von Entfernungen. Insbesondere interessiere ich mich für die Genauigkeit der Ergebnisse.
Wenn ich die Angaben von Längen- und Breitgrad in Grad, Minute und Sekunde habe, kann die maximale Genauigkeit 30m betragen kann. Der Grund: ein Grad (edit: Sekunde natürlich) entspricht etwa 30m. Meine Frage ist nun, geben die GPS-Empfänger auch genauere Informationen über die Position aus, als die GPS-Software anzeigt - oder geht es nicht genauer?
Vielen Dank
nordside