Avatar billede sorenmt84 Juniormester
25. september 2023 - 21:26 Der er 4 kommentarer og
1 løsning

Udregn afstand mellem 2 koordinater - virker ikke med variabler

Jeg har fundet dette finde stykke kode som udregner en afstand mellem to punkter/koordinater - Så længe jeg indtaster koordinaterne direkte ind i funktionen, som i eksemplet nedenfor, så virker det perfekt, men jeg vil jeg bruge nogle variabler til udregningen i stedet - og så fejler det - ved at udregningen bliver forkert og den distance jeg får er helt hen i vejret.

Følgende skal give afstanden i kilometer:
distance(32.9697, -96.80322, 29.46786, -98.53506, "K")

Den vil jeg gerne have til at se sådan her ud i stedet:
distance(Request.form("lat"), Request.form("lon"), rs("lat"), rs("lon"), "K")

Form felterne henter en aktuel lokation på brugeren og ser blot sådan her ud
<input type="text" name="lat"><input type="text" name="lon">

rs("lat") og rs("lon") henter data fra min sql db.
Felterne er lavet med data typen varchar(12)

Jeg har haft problemer med at finde en datatype til felterne hvor det blev accepteret at der er et punktum i nummeret - og samtidig ikke vil få "distance"  funktionen til at fejle helt, ved at den siger at der er mismach i datatypen (hvis jeg f.eks. laver feltet til et tekstfelt)
Mine input felter er også text, men laver jeg dem om til numbers erstattes punktum med komma og det dur heller ikke.

Jeg er virkelig løbet panden mod en mur og syntes snart jeg har prøvet alverdens krumspring for at få det til at virke.
Mit bedste bud er at den måde dataen leveres til funktion på er forkert og derfor er udregningen skæv - og det må være både dataen fra form felterne og fra databasen det går galt med, for erstatter jeg et af koordinatsættene med en fast tekst, så er udregningen stadig forkert

F.eks sådan her:
distance(Request.form("lat"), Request.form("lon"), 56.183463532, 9.78537071, "K")


Kan du hjælpe mig med en løsning?
<%

':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::                                                                        :::
':::  This routine calculates the distance between two points (given the    :::
':::  latitude/longitude of those points). It is being used to calculate    :::
':::  the distance between two location using GeoDataSource(TM)              :::
':::  products.                                                              :::
':::                                                                        :::
':::  Definitions:                                                          :::
':::    South latitudes are negative, east longitudes are positive          :::
':::                                                                        :::
':::  Passed to function:                                                    :::
':::    lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees)  :::
':::    lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees)  :::
':::    unit = the unit you desire for results                              :::
':::          where: 'M' is statute miles (default)                        :::
':::                  'K' is kilometers                                      :::
':::                  'N' is nautical miles                                  :::
':::                                                                        :::
':::  Worldwide cities and other features databases with latitude longitude  :::
':::  are available at https://www.geodatasource.com                        :::
':::                                                                        :::
':::  For enquiries, please contact sales@geodatasource.com                  :::
':::                                                                        :::
':::  Official Web site: https://www.geodatasource.com                      :::
':::                                                                        :::
':::  GeoDataSource.com (C) All Rights Reserved 2022                        :::
':::                                                                        :::
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

const pi = 3.14159265358979323846

Function distance(lat1, lon1, lat2, lon2, unit)
  Dim theta, dist
  If lat1 = lat2 And lon1 = lon2 Then
    distance = 0
  Else
    theta = lon1 - lon2
    dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta))
    dist = acos(dist)
    dist = rad2deg(dist)
    distance = dist * 60 * 1.1515
    Select Case ucase(unit)
      Case "K"
        distance = distance * 1.609344
      Case "N"
        distance = distance * 0.8684
    End Select
  End If
End Function


'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function get the arccos function from arctan function    :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function acos(rad)
  If Abs(rad) <> 1 Then
    acos = pi/2 - Atn(rad / Sqr(1 - rad * rad))
  ElseIf rad = -1 Then
    acos = pi
  End If
End function


'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function converts decimal degrees to radians            :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function deg2rad(Deg)
  deg2rad = cdbl(Deg * pi / 180)
End Function

'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function converts radians to decimal degrees            :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function rad2deg(Rad)
  rad2deg = cdbl(Rad * 180 / pi)
End Function

response.write distance(32.9697, -96.80322, 29.46786, -98.53506, "M") & " Miles<br>"
response.write distance(32.9697, -96.80322, 29.46786, -98.53506, "K") & " Kilometers<br>"
response.write distance(32.9697, -96.80322, 29.46786, -98.53506, "N") & " Nautical Miles<br>"
%>
Avatar billede arne_v Ekspert
26. september 2023 - 00:28 #1
Du henter variable fra form og fra database.

Du konverterer dem til double.

Du printer dem for at vaere sikker paa at de er korrekte.

Du kalder distance og faar resultatet.
Avatar billede sorenmt84 Juniormester
26. september 2023 - 11:00 #2
Det er muligt at jeg gør noget forkert, men hvis jeg forsøger med CDbl(Request.form("lat")) - så fjerner den mit punktum så mit output bliver 329697 i stedet for 32.9697
Avatar billede erikjacobsen Ekspert
26. september 2023 - 12:34 #3
Sådan gør man på dansk. Tænk: decimal-komma. Hvis tallet stod som 32,9697 i databasen, og du så laver en CDbl på den streng, så vil det passe. Punktummet bliver opfattet som 1000-tals separator, der jo egentlig bare kan fjernes.

Du kan måske stille din server til "engelsk" notation i stedet for "dansk". På engelsk er det "decimal-point", altså punktum, og komma anvendes til 1000-tals separator.

Men du kan måske også bare lave en string-replace så "." bliver ",".

( og det har ingenting at gøre med at du i koden kan skrive distance(32.9697, -96.80322, 29.46786, -98.53506, "M") - der har komma en anden betydning, og vi skal bruger "decimal-point" )
Avatar billede arne_v Ekspert
26. september 2023 - 14:59 #4
Man kan også sætte locale.

Utestet eksempel:

<%
s1 = "1234.56"
s2 = "1234,56"
Response.Write CDbl(s1) & " " & CDbl(s2) & "<br>"
Session.LCID = 1030
Response.Write CDbl(s1) & " " & CDbl(s2) & "<br>"
Session.LCID = 1033
Response.Write CDbl(s1) & " " & CDbl(s2) & "<br>"
%>
Avatar billede sorenmt84 Juniormester
26. september 2023 - 21:58 #5
Tak Arne_v

Tricket med Session.LCID = 1033 løste problemet :-D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester