paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4210] Add menus for maps source (Google, OSM or MS


From: Pascal Brisset
Subject: [paparazzi-commits] [4210] Add menus for maps source (Google, OSM or MS) and policy (no http, no cache or both)
Date: Wed, 30 Sep 2009 20:29:31 +0000

Revision: 4210
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4210
Author:   hecto
Date:     2009-09-30 20:29:31 +0000 (Wed, 30 Sep 2009)
Log Message:
-----------
 Add menus for maps source (Google, OSM or MS) and policy (no http, no cache or 
both)

Modified Paths:
--------------
    paparazzi3/trunk/sw/ground_segment/cockpit/gcs.ml
    paparazzi3/trunk/sw/lib/ocaml/gm.ml
    paparazzi3/trunk/sw/lib/ocaml/gm.mli

Modified: paparazzi3/trunk/sw/ground_segment/cockpit/gcs.ml
===================================================================
--- paparazzi3/trunk/sw/ground_segment/cockpit/gcs.ml   2009-09-30 01:05:33 UTC 
(rev 4209)
+++ paparazzi3/trunk/sw/ground_segment/cockpit/gcs.ml   2009-09-30 20:29:31 UTC 
(rev 4210)
@@ -138,12 +138,9 @@
       save_map geomap dest nw se
 
 
-(************ Google Maps handling *****************************************)
+(************ Google, OSM Maps handling 
*****************************************)
 module GM = struct
-  let active_http = fun x -> 
-    Gm.no_http := not x
-
-  (** Fill the visible background with Google tiles *)
+  (** Fill the visible background with Google, OSM tiles *)
   let fill_tiles = fun geomap -> 
     ignore (Thread.create MapGoogle.fill_window geomap)
 
@@ -154,7 +151,7 @@
     auto := x;
     update geomap      
 
-(** Creates a calibrated map from the Google tiles (selected region) *)
+(** Creates a calibrated map from the Google, OSM tiles (selected region) *)
   let map_from_tiles = fun (geomap:G.widget) () ->
     match geomap#region with
       None -> GToolbox.message_box "Error" "Select a region (shift-left drag)"
@@ -324,9 +321,9 @@
    "-mercator", Arg.Unit (fun () -> projection:=G.Mercator),"Switch to (Google 
Maps) Mercator projection, default";
    "-mplayer", Arg.Set_string mplayer, "Launch mplayer with the given argument 
as X plugin";
    "-no_alarm", Arg.Set no_alarm, "Disables alarm page";
-   "-no_google_http", Arg.Set Gm.no_http, "Switch off Google Maps downloading";
+   "-no_google_http", Arg.Unit (fun () -> Gm.set_policy Gm.NoHttp), "Switch 
off Google Maps downloading";
    "-ortho", Arg.Set_string get_bdortho, "IGN tiles path";
-   "-osm", Arg.Unit (fun () -> Gm.maps_source := Gm.OSM), "Use OpenStreetMap 
database (default is Google)";
+   "-osm", Arg.Unit (fun () -> Gm.set_maps_source Gm.OSM), "Use OpenStreetMap 
database (default is Google)";
    "-particules", Arg.Set display_particules, "Display particules";
     "-plugin", Arg.Set_string  plugin_window, "External X application 
(launched with the id of the plugin window as argument)";
    "-ref", Arg.Set_string geo_ref, "Geographic ref (e.g. 'WGS84 43.605 
1.443')";
@@ -364,24 +361,45 @@
   (* Maps handling *)
   let map_menu = geomap#factory#add_submenu "Maps" in
   let map_menu_fact = new GMenu.factory ~accel_group map_menu in
-  ignore (map_menu_fact#add_item "Load" ~key:GdkKeysyms._M ~callback:(load_map 
geomap));
+  ignore (map_menu_fact#add_item "Load User Map" ~key:GdkKeysyms._M 
~callback:(load_map geomap));
   if !edit then
     ignore (map_menu_fact#add_item "Calibrate" ~key:GdkKeysyms._C 
~callback:(EditFP.calibrate_map geomap editor_frame accel_group));
 
+  (* Choose the map source *)
+  let maps_source_menu = map_menu_fact#add_submenu "Maps Source" in
+  let maps_source_fact = new GMenu.factory maps_source_menu in
+  let group = ref None in
+  List.iter
+    (fun maps_source ->
+      let callback = fun b -> if b then Gm.set_maps_source maps_source in
+      let menu_item = maps_source_fact#add_radio_item ~group: !group ~callback 
(Gm.string_of_maps_source maps_source) in
+      group := menu_item#group)
+    Gm.maps_sources;  
+
+  (* Choose the map policy *)
+  let maps_policy_menu = map_menu_fact#add_submenu "Maps Policy" in
+  let maps_policy_fact = new GMenu.factory maps_policy_menu in
+  let group = ref None in
+  List.iter
+    (fun policy ->
+      let callback = fun b -> if b then Gm.set_policy policy in
+      let menu_item = maps_policy_fact#add_radio_item ~group: !group ~callback 
(Gm.string_of_policy policy) in
+      group := menu_item#group)
+    Gm.policies;
+
   (* Google fill menu entry and toolbar button *)
   let callback = fun _ -> GM.fill_tiles geomap in
-  ignore (map_menu_fact#add_item "GoogleMaps Fill" ~key:GdkKeysyms._G 
~callback);
+  ignore (map_menu_fact#add_item "Maps Fill" ~key:GdkKeysyms._G ~callback);
   let b = GButton.button ~packing:geomap#toolbar#add () in
   ignore (b#connect#clicked callback);
   let pixbuf = GdkPixbuf.from_file (Env.gcs_icons_path // "googleearth.png") in
   ignore (GMisc.image ~pixbuf ~packing:b#add ());
-  let tooltips = GData.tooltips () in    
+  let tooltips = GData.tooltips () in
   tooltips#set_tip b#coerce ~text:"Google maps fill";
 
-  ignore (map_menu_fact#add_check_item "GoogleMaps Http" ~key:GdkKeysyms._H 
~active:true ~callback:GM.active_http);
-  ignore (map_menu_fact#add_check_item "GoogleMaps Auto" ~active:!GM.auto 
~callback:(GM.active_auto geomap));
+  ignore (map_menu_fact#add_check_item "Maps Auto" ~active:!GM.auto 
~callback:(GM.active_auto geomap));
   ignore (map_menu_fact#add_item "Map of Region" ~key:GdkKeysyms._R 
~callback:(map_from_region geomap));
-  ignore (map_menu_fact#add_item "Map of Google Tiles" ~key:GdkKeysyms._T 
~callback:(GM.map_from_tiles geomap));
+  ignore (map_menu_fact#add_item "Dump map of Tiles" ~key:GdkKeysyms._T 
~callback:(GM.map_from_tiles geomap));
   ignore (map_menu_fact#add_item "Load sector" ~callback:(Sectors.load 
geomap));
   
   (** Connect Google Maps display to view change *)

Modified: paparazzi3/trunk/sw/lib/ocaml/gm.ml
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/gm.ml 2009-09-30 01:05:33 UTC (rev 4209)
+++ paparazzi3/trunk/sw/lib/ocaml/gm.ml 2009-09-30 20:29:31 UTC (rev 4210)
@@ -40,9 +40,13 @@
     height : float (* Latitude difference *)
   }
 
-type maps_source = Google | OSM
+type maps_source = Google | OSM | MS
+let maps_sources = [Google; OSM; MS]
+let string_of_maps_source = function
+    Google -> "Google" | OSM -> "OSM" | MS -> "MS"
 
 let maps_source = ref Google
+let set_maps_source = fun s -> maps_source := s
 
 let mkdir = fun d ->
   if not (Sys.file_exists d) then
@@ -156,7 +160,7 @@
       let fi = files.(i) in
       let fi_key = try Filename.chop_extension fi with _ -> fi in
       if fi_key <> "" && is_prefix fi_key f then
-       (tile_of_key fi_key, !cache_path // fi)
+       (tile_of_key fi_key, dir // fi)
       else
        loop (i+1)
     else
@@ -181,20 +185,46 @@
   done;
   (!x, !y, n-1)
 
+let ms_key = fun key ->
+  let n = String.length key in
+  let ms_key = String.create (n-1) in
+  for i = 1 to n - 1 do
+    ms_key.[i-1] <-
+      match key.[i] with
+       'q' -> '0'
+      |        'r' -> '1'
+      | 's' -> '3'
+      | 't' -> '2'
+      | _ -> invalid_arg "Gm.ms_key"
+  done;
+  ms_key
+    
+
 let url_of_tile_key = fun maps_source s -> 
   let (x, y, z) = xyz_of_qsrt s in
   match maps_source with
     Google -> sprintf "http://khm0.google.com/kh/v=45&x=%d&s=&y=%d&z=%d"; x y z
   | OSM ->    sprintf "http://tile.openstreetmap.org/%d/%d/%d.png"; z x y
+  | MS ->    sprintf 
"http://a0.ortho.tiles.virtualearth.net/tiles/a%s.jpeg?g=%d"; (ms_key s) (z+32)
 
+
 let get_cache_dir = function
     Google -> !cache_path (* Historic ! Should be // Google *)
   | OSM -> !cache_path // "OSM"
+  | MS -> !cache_path // "MS"
   
 
 exception Not_available
 
-let no_http = ref false
+type policy = CacheOrHttp | NoHttp | NoCache
+let string_of_policy = function
+    CacheOrHttp -> "CacheOrHttp"
+  | NoHttp -> "NoHttp"
+  | NoCache -> "NoCache"
+let policies = [CacheOrHttp; NoHttp; NoCache]
+let policy = ref CacheOrHttp
+let set_policy = fun p ->
+  policy := p
 
 let remove_last_char = fun s -> String.sub s 0 (String.length s - 1)
 
@@ -202,9 +232,12 @@
 let get_image = fun key ->
   let cache_dir = get_cache_dir !maps_source in
   mkdir cache_dir;
-  try get_from_cache cache_dir key with
+  try
+    if !policy = NoCache then raise Not_found;
+    get_from_cache cache_dir key
+  with
     Not_found ->
-      if !no_http then raise Not_available;
+      if !policy = NoHttp then raise Not_available;
       let rec loop = fun k ->
        if String.length k >= 1 then
          let url = url_of_tile_key !maps_source k in

Modified: paparazzi3/trunk/sw/lib/ocaml/gm.mli
===================================================================
--- paparazzi3/trunk/sw/lib/ocaml/gm.mli        2009-09-30 01:05:33 UTC (rev 
4209)
+++ paparazzi3/trunk/sw/lib/ocaml/gm.mli        2009-09-30 20:29:31 UTC (rev 
4210)
@@ -35,7 +35,9 @@
     height : float (* Latitude difference *)
   }
 
-type maps_source = Google | OSM
+type maps_source = Google | OSM | MS
+val string_of_maps_source : maps_source -> string
+val maps_sources : maps_source list
       
 val tile_of_geo : Latlong.geographic -> int -> tile_t
 (** [tile_string geo zoom] Returns the tile description containing a
@@ -46,17 +48,21 @@
    named tile. *)
 
 val cache_path : string ref
-val no_http : bool ref
-(** Initialized to false. Set to use only the cache *)
 
-val maps_source : maps_source ref
+type policy =  CacheOrHttp | NoHttp | NoCache
+val string_of_policy : policy -> string
+val policies : policy list
+val set_policy : policy -> unit
+(** Initialized to CacheOrHttp using cache and http access *)
+
+val set_maps_source : maps_source -> unit
 (** Initialized to Google *)
 
 exception Not_available
 
 val get_image : string -> tile_t * string
 (** [get_image key] Returns the tile description and the image file name.
-   May raise [Not_available] *)
+    May raise [Not_available] *)
 
 val get_tile : Latlong.geographic -> int -> tile_t*string
 (** [get_tile geo zoom] May raise [Not_available] *)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]