1. GtkGreatCircle.ex

-- 
-- GtkEarthDistance.ex 
-- 
include std/math.e 
include GtkEngine.e 
 
global function Great_Circle_Distance(atom LA1,atom LO1,atom LA2,atom LO2, integer miles = 1) 
-- given starting and destination latitude and longitude coordinates in degrees 
-- returns distance between the two points (default: miles = 1) or km (miles = 0) 
-- uses spherical law of cosines 
atom D, DLO=deg2rad(LO2-LO1), R=6371.02 -- mean earth radius in km  
LA1=deg2rad(LA1) LO1=deg2rad(LO1) LA2=deg2rad(LA2) LO2=deg2rad(LO2) 
D = arccos( sin(LA1) * sin(LA2) + cos(LA1) * cos(LA2) * cos(DLO)) * R  
if miles then D/= 1.609 end if 
return D 
end function 
 
constant units = {"miles", "km" }, CITY = 1, LA = 2, LO = 3,  
LALO={{"Wellington AU", 41.3, 174.7}, {"Auckland AU", 37.0, 174.7},{"Sydney  AU", 33.7, 151.3}, 
{"Lyons GA USA", 32.2, 82.3},{"Tacoma, WA USA", 47.3, 122.5}, {"New York, NY USA", 40.7, 74.0}, 
{"Seattle, WA USA", 47.6, 122.3},{"Macon, GA USA",	32.8, 83.6},{"Vidalia, GA USA", 32.2, 82.4},  
{"Atlanta GA USA",  33.8, 84.4},{"London UK", 51.5, 0.1},         
{"Los Angeles, CA USA",	32.1, 18.2}} 
 
object cities = {} 
    for i = 1  to length(LALO) do cities=append(cities,LALO[i][CITY]) end for 
 
constant    
win=create(GtkWindow,"title=Distance Between Cities,border_width=10,position=1,$destroy=Quit"),   
panel=create(GtkBox, "orientation=HORIZONTAL,spacing=10"), 
cb1=create(GtkComboBoxText, "tooltip text=Select Starting Location\nSelect OK button to update"),    
cb2=create(GtkComboBoxText, "tooltip text=Select Ending Location\nSelect OK button to update"), 
cb3=create(GtkComboBoxText, "tooltip text=Select Unit of Measure, $changed=CalcDist"), 
Dist=create(GtkEntry,"width chars=20, placeholder text=Distance"), 
btnbox=create(GtkButtonBox,"spacing=5"),  
btn1=create(GtkButton,"gtk-ok","CalcDist"), btn2=create(GtkButton,"gtk-quit","Quit") 
add(win,panel)  add(panel,{cb1,cb2,cb3, Dist})    
pack_end(panel,btnbox)  add(btnbox,{btn1, btn2}) 
set(cb1, "text active") set(cb2, "text active") set(cb3,"text active") 
for i = 1 to length(cities) do set(cb1,"append text",cities[i]) set(cb2,"append text",cities[i]) end for 
for i = 1  to length(units)  do set(cb3, "append text", units[i]) end for 
show_all(win)   
main()   
 
global function CalcDist() 
integer f=get(cb1,"active"),t=get(cb2,"active"),u=get(cb3,"active")  
sequence um ="" -- unit of measure 
if u = 1 then um="miles" else  um="km" u=0  end if 
atom D = Great_Circle_Distance(LALO[f][LA],LALO[f][LO],LALO[t][LA], LALO[t][LO],u) 
object DD={D} DD=append(DD, sprintf("%s", {um})) 
set(Dist,"text", text:format("[.3] []", DD) )  
return 1 
end function 
new topic     » topic index » view message » categorize

2. Re: GtkGreatCircle.ex

Nice, but there's a discrepancy - the program reports LAX to ATL to be 3771 miles, while iflightplanner claims 1686 nm or about 1940 statute miles.

new topic     » goto parent     » topic index » view message » categorize

3. Re: GtkGreatCircle.ex

irv said...

Nice, but there's a discrepancy - the program reports LAX to ATL to be 3771 miles, while iflightplanner claims 1686 nm or about 1940 statute miles.

-- quick fix replace the Los Angeles LALO sequence with: 
{"Los Angeles, CA USA",	34.0522, 118.2437}   
-- renders 1931.788 miles or 1679 nmi from Atlanta to Los Angeles. 
-- I will recheck all LALO sequences and update the LALO sequence if needed 
-- perhaps I should use nautical miles instead of miles in the routine 
new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu