WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Avstånd mellan städer (https://www.wn.se/forum/showthread.php?t=28280)

linus1 2008-03-31 18:15

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..?

Kristoffer G 2008-03-31 19:19

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).

totoo 2008-04-01 00:00

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!

Robert 2008-04-01 00:03

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


totoo 2008-04-01 00:57

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.

Robert 2008-04-01 08:28

Citat:

Originally posted by totoo@Apr 1 2008, 00:57
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.
Jotack jag vet då denna funktion är plockad ifrån en sådan app som jag gjorde. Den som används för ovanstående är den som jag inte kommer på namnet på just nu (sitter inte hemma) men det är den i särklass vanligaste standarden i gps'er mm, den kan heta som det står i kommentaren, dvs NMEA(WGS-84)

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... :)


Alla tider är GMT +2. Klockan är nu 06:00.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson