limestone.cpp - limestone - A KDE marble commandline interface.
(HTM) git clone git://r-36.net/limestone
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
limestone.cpp (4939B)
---
1 /*
2 * Copy me if you can.
3 * by 20h
4 */
5
6 #include <QApplication>
7 #include <QUrl>
8 #include <QFileInfo>
9
10 #include <marble/MarbleWidget.h>
11 #include <marble/MarbleModel.h>
12
13 #include <unistd.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <libgen.h>
17 #include <locale.h>
18
19 char *argv0;
20
21 #include "arg.h"
22 #include "config.h"
23
24 using namespace Marble;
25
26 int
27 parseposition(char *s, float *lat, float *lon, float *alt)
28 {
29 char *sb = NULL, *s1 = NULL, *s2 = NULL, *sd = NULL,
30 *sd1 = NULL;
31 int isgood = 0;
32
33 sb = s;
34 for (; *sb == ' '; sb++);
35
36 sd = strstr(sb, "°");
37 s1 = strchr(s, ',');
38 if (sd > s1) {
39 *s1 = '.';
40 s1 = strchr(sb, ',');
41 }
42
43 if (s1 != NULL) {
44 *s1++ = '\0';
45 for (; *s1 == ' '; s1++);
46 s2 = strchr(s1, ',');
47 sd1 = strstr(s1, "°");
48 }
49
50 if (sd1 > s2) {
51 *s2 = '.';
52 s2 = strchr(s2, ',');
53 }
54
55 if (s2 != NULL) {
56 *s2++ = '\0';
57 for (; *s2 == ' '; s2++);
58 }
59
60 if (lat != NULL) {
61 *lat = strtof(sb, NULL);
62 isgood++;
63 if (sd != NULL) {
64 for (; *sd != 'W' && *sd != 'E' && *sd; sd++);
65 if (*sd == 'W')
66 *lat *= -1;
67 }
68 }
69 if (lon != NULL && s1 != NULL) {
70 *lon = strtof(s1, NULL);
71 isgood++;
72 if (sd1 != NULL) {
73 for (; *sd1 != 'S' && *sd1 != 'N' && *sd1; sd1++);
74 if (*sd1 == 'S')
75 *lon *= -1;
76 }
77 }
78 if (alt != NULL && s2 != NULL)
79 *alt = strtof(s2, NULL);
80
81 return (isgood > 1)? 0:1;
82 }
83
84 void
85 applystylestring(MarbleWidget *mw, char *sstr)
86 {
87 bool sv = false;
88 char *ss = NULL, *sp;
89
90 sp = ss = strdup(sstr);
91 if (ss == NULL)
92 return;
93
94 while (*ss) {
95 if (*ss >= 'A' && *ss <= 'Z') {
96 *ss = (*ss) - 'A' + 'a';
97 sv = true;
98 } else {
99 sv = false;
100 }
101
102 switch(*ss) {
103 case 'a':
104 mw->setShowAtmosphere(sv);
105 break;
106 case 'b':
107 mw->setShowBorders(sv);
108 break;
109 case 'c':
110 mw->setShowCompass(sv);
111 break;
112 case 'd':
113 mw->setShowClouds(sv);
114 break;
115 case 'e':
116 mw->setShowCities(sv);
117 break;
118 case 'f':
119 mw->setShowFrameRate(sv);
120 break;
121 case 'g':
122 mw->setShowGrid(sv);
123 break;
124 case 'h':
125 mw->setShowCrosshairs(sv);
126 break;
127 case 'i':
128 mw->setShowIceLayer(sv);
129 break;
130 case 'k':
131 mw->setShowBackground(sv);
132 break;
133 case 'l':
134 mw->setShowLakes(sv);
135 break;
136 case 'm':
137 mw->setShowOverviewMap(sv);
138 break;
139 case 'n':
140 mw->setShowTerrain(sv);
141 break;
142 case 'o':
143 mw->setShowOtherPlaces(sv);
144 break;
145 case 'p':
146 mw->setShowPlaces(sv);
147 break;
148 case 'r':
149 mw->setShowRelief(sv);
150 break;
151 case 's':
152 mw->setShowScaleBar(sv);
153 break;
154 case 't':
155 mw->setShowTileId(sv);
156 break;
157 case 'u':
158 mw->setShowRuntimeTrace(sv);
159 break;
160 case 'v':
161 mw->setShowRivers(sv);
162 break;
163 case 'w':
164 mw->setShowSunShading(sv);
165 break;
166 case 'y':
167 mw->setShowCityLights(sv);
168 break;
169 default:
170 continue;
171 };
172 ss++;
173 }
174 free(sp);
175 }
176
177 void
178 usage(void)
179 {
180 fprintf(stderr, "usage: %s [-h] "\
181 "[-k datafile] "\
182 "[-p lat,lon[,alt]] "\
183 "[-s stylestring] "\
184 "[-t theme] "\
185 "[-w winid] "\
186 "[-z zoomlevel] "\
187 "[URI]\n", basename(argv0));
188 exit(1);
189 }
190
191 int
192 main(int argc, char *argv[])
193 {
194 QApplication app(argc, argv);
195 MarbleWidget *mapwidget;
196 GeoDataCoordinates *gpos;
197 QFileInfo *qfilei;
198
199 char *kmlfile = NULL;
200 char *stylestring = NULL;
201 char *theme = "earth/googlemaps/googlemaps.dgml";
202
203 char *uri = NULL;
204 char *upath = NULL;
205 char *uscheme = NULL;
206 QUrl qurl;
207
208 float lat = 0.0, lon = 0.0, alt = 0.0;
209 int zoomlevel = 2200;
210 bool doposition = false;
211
212 char *winid = NULL;
213
214 setlocale(LC_NUMERIC, "C");
215
216 ARGBEGIN {
217 case 'h':
218 case 'v':
219 usage();
220 case 'k':
221 kmlfile = EARGF(usage());
222 break;
223 case 'p':
224 if (parseposition(EARGF(usage()), &lat, &lon, &alt))
225 usage();
226 doposition = true;
227 break;
228 case 's':
229 stylestring = EARGF(usage());
230 break;
231 case 't':
232 theme = EARGF(usage());
233 break;
234 case 'w':
235 winid = EARGF(usage());
236 break;
237 case 'z':
238 zoomlevel = atoi(EARGF(usage()));
239 break;
240 } ARGEND;
241
242 if (argc > 0)
243 uri = argv[0];
244
245 if (uri != NULL) {
246 qurl = QUrl(uri);
247 uscheme = qurl.scheme().toUtf8().data();
248 upath = qurl.path().toUtf8().data();
249
250 if (!strncmp(uri, "worldview:", 10)) {
251 if (parseposition(upath+1, &lat, &lon, &alt))
252 usage();
253 doposition = true;
254 } else if (!strncmp(uri, "geo:", 4)) {
255 if (parseposition(upath, &lat, &lon, &alt))
256 usage();
257 doposition = true;
258 } else {
259 fprintf(stderr, "URI scheme '%s' not supported.\n",
260 uscheme);
261 }
262 }
263
264 mapwidget = new MarbleWidget();
265 mapwidget->setMapThemeId(theme);
266
267 applystylestring(mapwidget, "ABCDfgHIKLmNoprStuVWY");
268 if (stylestring != NULL)
269 applystylestring(mapwidget, stylestring);
270
271 if (doposition) {
272 gpos = new GeoDataCoordinates(lon, lat, alt,
273 GeoDataCoordinates::Degree);
274 mapwidget->centerOn(*gpos);
275 }
276
277 mapwidget->setZoom(zoomlevel);
278 mapwidget->resize(400, 300);
279
280 if (kmlfile != NULL) {
281 qfilei = new QFileInfo(kmlfile);
282 mapwidget->model()->addGeoDataFile(
283 qfilei->absoluteFilePath());
284 }
285
286 mapwidget->show();
287
288 return app.exec();
289 }
290