cggooglemapwidget.pro
10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
; docformat = 'rst'
;
; NAME:
; cgGoogleMapWidget
;
; PURPOSE:
; This is the driver for the cgGoogleMapWidget object, which is a compound widget
; object that obtains a Google static map from Google Maps and displays it in the
; program's draw widget window. It can be used either as a stand-alone program or
; to create a map image in draw widget in a larger widget program.
;
;******************************************************************************************;
; ;
; Copyright (c) 2012, by Fanning Software Consulting, Inc. All rights reserved. ;
; ;
; Redistribution and use in source and binary forms, with or without ;
; modification, are permitted provided that the following conditions are met: ;
; ;
; * Redistributions of source code must retain the above copyright ;
; notice, this list of conditions and the following disclaimer. ;
; * Redistributions in binary form must reproduce the above copyright ;
; notice, this list of conditions and the following disclaimer in the ;
; documentation and/or other materials provided with the distribution. ;
; * Neither the name of Fanning Software Consulting, Inc. nor the names of its ;
; contributors may be used to endorse or promote products derived from this ;
; software without specific prior written permission. ;
; ;
; THIS SOFTWARE IS PROVIDED BY FANNING SOFTWARE CONSULTING, INC. ''AS IS'' AND ANY ;
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ;
; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT ;
; SHALL FANNING SOFTWARE CONSULTING, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, ;
; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ;
; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ;
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ;
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;
;******************************************************************************************;
;
;+
; This is the driver for the cgGoogleMapWidget object, which is a compound widget
; object that obtains a Google static map from Google Maps and displays it in the
; program's draw widget window. It can be used either as a stand-alone program or
; to create a map image in draw widget in a larger widget program.
;
; This program implements a subset of the Google Static Map API, which can be found in
; more detail here: https://developers.google.com/maps/documentation/staticmaps/. The
; program works by building a URL for a map image. A connection to the Internet is
; required to then request a map image (in GIF, JPEG or PNG format) to be returned from
; Google Maps. The returned image is then read and loaded into a draw widget window
; of the right size for the returned map image. The default is to delete the image file
; that is created, but the user can also set keywords to retain the image that is downloaded
; from Google Maps. Users are able to control button and motion events in the resulting
; draw widget with their own event handler module. A cgMap coordinate object is created
; to establish a map reference coordinate system on top of the returned map image, allowing
; other map information to be drawn on top of the returned map image.
;
; :Categories:
; Graphics, Widgets
;
; :Params:
; parent: in, optional, type=long
; The identifier of the parent widget of the draw widget that is going to be
; created by the program. If not provided, the program will create its own
; top-level base widget as the parent.
;
; :Keywords:
; box_axes: in, optional, type=boolean, default=0
; Set this keyword to draw box axes around the Google Map.
; button_events: in, optional, type=boolean, default=0
; Set this keyword to turn button events on for the draw widget in the program.
; center_latitude: in, optional, type=float, default=40.60
; The center latitude of the requested Google map. If not provided, the latitude of
; Fort Collins, Colorado, home of Coyote. Latitudes are only recognized to four
; decimals values of precision.
; center_longitude: in, optional, type=float, default=-105.10
; The center longitude of the requested Google map. If not provided, the longitude of
; Fort Collins, Colorado, home of Coyote. Longitude are only recognized to four
; decimals values of precision.
; event_method: in, optional, type='string'
; The name of the event handler method for the draw widget. If you use this keyword,
; you will also need to write this event handler module. It gets sent one positional
; parameter, the event structure created by the draw widget.
; event_pro: in, optional, type='string'
; The name of an external event handler procedure for the draw widget. The event handler
; procedure gets sent one positional parameter, the event structure created by the draw widget.
; imagetype: in, optional, type=string, default='png32'
; The type of image format the Google map should be returned in. The default is
; a 32-bit full color PNG file. The image types are given in the Google Static Map
; API documentation and are as follows: png or png8, png32, gif, jpg, and jpg-baseline.
; keep_image: in, optional, type=boolean, default=0
; Set this keyword if you wish to save the Google map as an image when the object
; is destroyed.
; maptype: in, optional, type=string, default='terrain'
; Set this keyword to the type of map you wish to retrieve from Google Maps. The
; choices are listed in the Google Static Map API documentation and are: "roadmap",
; "terrain", "satellite", and "hybrid".
; markers: in, optional, type=structure
; A scalar or array of cgGoogleMapMarker structures. If present, the markers will
; be requested with the map from Google. The cgGoogleMapMarker structure is defined
; like this::
; struct = { cgGOOGLEMAPMARKER, $
; size: "", $ ; The marker size ("tiny", "small", "mid" or "normal")
; color: "", $ ; A color name as provided by cgColor.
; label: "", $ ; A single uppercase character label from the set {A-Z,0-9}.
; lats: Ptr_New(), $ ; A pointer to one or more latitude values.
; lons: Ptr_New() } ; A pointer to one or more longitude values.
; Note that the user will be responsible for freeing the pointers in the MARKERS
; structure. This program will not do that.
; motion_events: in, optional, type=boolean, default=0
; Set this keyword to turn motion events on for the draw widget in the program.
; tempDir: in, optional, type=string
; The directory where the image containing the Google map is written. By default,
; it is obtained from the environment like this: tempdir = GetEnv('IDL_TMPDIR').
; visiblemarkers: in, optional, type=boolean, default=1
; Set this keyword to 0 to temporarily turn off the display of the markers. Normally,
; markers are drawn (if present), unless this flag is set to 0.
; xsize: in, optional, type=int, default=600
; The X size of the program's draw widget. A maximum of 690 if box axes are requested
; and a maximum of 640 if no box axes are requested. Box axes require a 25 pixel border
; and the maximum size of a Google Map is 640 pixels.
; ysize: in, optional, type=int, default=600
; The Y size of the program's draw widget. A maximum of 690 if box axes are requested
; and a maximum of 640 if no box axes are requested. Box axes require a 25 pixel border
; and the maximum size of a Google Map is 640 pixels.
; zoomlevel: in, optional, type=integer, default=12
; The zoom level of the requested Google map. Should be an integer between 0 and 21.
;
; :Returns:
; The return value is an instance of a cgGoogleMapWidget object.
;
; :Examples:
; Used to put two markers on a map of Fort Collins, Colorado, in a stand-alone window::
; PRO cgGoogleMapWidget_Test
; marker1 = {cgGOOGLEMAPMARKER, 'normal', 'dodger blue', 'A', Ptr_New(40.600), Ptr_New(-105.100)}
; marker2 = {cgGOOGLEMAPMARKER, 'normal', 'purple', 'B', Ptr_New(40.605), Ptr_New(-105.105)}
; googleObject = cgGoogleMapWidget(MARKERS=[marker1, marker2], MAPTYPE='Terrain')
; END
;
; :Author:
; FANNING SOFTWARE CONSULTING::
; David W. Fanning
; 1645 Sheely Drive
; Fort Collins, CO 80526 USA
; Phone: 970-221-0438
; E-mail: david@idlcoyote.com
; Coyote's Guide to IDL Programming: http://www.idlcoyote.com
;
; :History:
; Change History::
; Written, 25 June 2012. DWF.
;
; :Copyright:
; Copyright (c) 2012, Fanning Software Consulting, Inc.
;-
FUNCTION cgGoogleMapWidget, parent, $
BOX_AXES=box_axes, $
BUTTON_EVENTS=button_events, $
CENTER_LATITUDE=centerLat, $
CENTER_LONGITUDE=centerLon, $
IMAGETYPE=imageType, $
KEEP_IMAGE=keep_image, $
EVENT_METHOD=event_method, $
EVENT_PRO=event_pro, $
MAPTYPE=maptype, $
MARKERS=markers, $
MOTION_EVENTS=motion_events, $
TEMPDIR=tempdir, $
VISIBLEMARKERS=visibleMarkers, $
XSIZE=xsize, $
YSIZE=ysize, $
ZOOMLEVEL=zoomlevel
mapObject = Obj_New('cgGoogleMapWidget', parent, $
BOX_AXES=box_axes, $
BUTTON_EVENTS=button_events, $
CENTER_LATITUDE=centerLat, $
CENTER_LONGITUDE=centerLon, $
IMAGETYPE=imageType, $
KEEP_IMAGE=keep_image, $
EVENT_METHOD=event_method, $
EVENT_PRO=event_pro, $
MAPTYPE=maptype, $
MARKERS=markers, $
MOTION_EVENTS=motion_events, $
TEMPDIR=tempdir, $
VISIBLEMARKERS=visibleMarkers, $
XSIZE=xsize, $
YSIZE=ysize, $
ZOOMLEVEL=zoomlevel)
IF Obj_Valid(mapObject) THEN RETURN, mapObject ELSE RETURN, Obj_New()
END