FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Hej.
Jag håller på med ett litet script och behöver räkna ut hur långt det är från Stad (a) till stad (B) fågelvägen i Sverige. Hur löser jag detta lättast? Dela upp sverige i ett koordinatsystem på en X & Y-axel, där sedan en ruta mellan de olika axlarna blir 10km. Då kan jag få reda på det i 10tal KM..? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Har WN som tidsfördriv
|
Skulle man inte kunna använda google maps för detta? Har för mig att det finns möjlighet för det... kan ha fel dock.
Edit* http://maps.google.se/ Där kan du plocka ut en vägbeskrivning från punkt a till punkt b. Borde inte vara så krångligt att bygga upp din egen google maps funktion där du räknar ut avståndet mellan punkt a till punkt b (inte fågelvägen dock). |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Mycket flitig postare
|
Du kan ju plocka fram en godtycklig koordinatdatabas för svenska orter, typ sådana som är anpassade för GEOIP. Sedan tar du reda på vad det är för projektion, och sedan kan du räkna om koordinaterna och få ut avstånd.
Dock kan det säkerligen ibland fela på flera mil eftersom man har en (1) koordinat per stad - och staden kan ju vara flera mil i radie, och har man otur kan koordinaten finnas i stadens utkant. Men det fungerar! |
|||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Klarade millennium-buggen
|
Uhm, har en gammal kod för detta, dock i vb.net, men det ska väl inte vara alltför svårt att se hur man gör?:
Kod:
Public Function nGetDistance(ByVal nLat1 As Double, ByVal nLong1 As Double, ByVal nLat2 As Double, ByVal nLong2 As Double) As Double 'Returns the distance in kilometers between two set of coordinates. Coordinates must be converted to decimals first (use sDegreesToDecimalPos()) Const kEarthRadiusKms As Double = 6376.5 Dim nDistance As Double = Double.MinValue Dim nLat1InRad As Double = nLat1 * (Math.PI / 180) Dim nLong1InRad As Double = nLong1 * (Math.PI / 180) Dim nLat2InRad As Double = nLat2 * (Math.PI / 180) Dim nLong2InRad As Double = nLong2 * (Math.PI / 180) Dim nLongitude As Double = nLong2InRad - nLong1InRad Dim nLatitude As Double = nLat2InRad - nLat1InRad Dim a As Double = Math.Pow(Math.Sin(nLatitude / 2), 2) + Math.Cos(nLat1InRad) * Math.Cos(nLat2InRad) * Math.Pow(Math.Sin(nLongitude / 2), 2) Dim c As Double = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)) nDistance = kEarthRadiusKms * c Return nDistance End Function Public Function sConvert_DegreesToDecimalPos(ByVal nDegrees As Int32, ByVal nMinutes As Int32, ByVal nSeconds As Int32) As Decimal 'Converts the recieved NMEA(WGS-84) location to a decimal number. (DEGREES+(MINUTES+(SECONDS)/60)/60) Return nDegrees + (nMinutes + (nSeconds) / 60) / 60 End Function |
|||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Mycket flitig postare
|
För att informationen ska vara korrekt så måste det vara samma projekton. Koordinaterna kan alltså vara framtagna enligt olika modeller, och matematiken bör anpassas därefter.
|
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Klarade millennium-buggen
|
Citat:
edit: glömde säga att bilden på kartan måste givetvis vara framtagen korrekt även den + att den måste kalibreras. Det här var den del som jag upplevde gav mest kli i skallen... ![]() |
|||
![]() |
![]() |
Svara |
|
|