GoogleMaps
Example using GoogleMaps static API to display the map of given location
GoogleMaps.h
#ifndef _GoogleMaps_GoogleMaps_h
#define _GoogleMaps_GoogleMaps_h
#include <CtrlLib/CtrlLib.h>
#include <Web/Web.h>
using namespace Upp;
#define LAYOUTFILE <GoogleMaps/GoogleMaps.lay>
#include <CtrlCore/lay.h>
#define IMAGECLASS GoogleMapsImg
#define IMAGEFILE <GoogleMaps/GoogleMaps.iml>
#include <Draw/iml_header.h>
void SetGoogleMapsKey(const char *key);
String GetGoogleMap(double center_x, double center_y, int zoom, int cx, int cy,
const char *format = "png", String *error = NULL);
Image GetGoogleMapImage(double center_x, double center_y, int zoom, int cx, int cy,
const char *format = "png", String *error = NULL);
double CvDeg(double deg, double minutes, double seconds);
Pointf GoogleMapsPixelToGps(Pointf center, int zoom, Point diff);
Pointf GoogleMapsPixelToGps(Pointf center, int zoom, Size sz, Point p);
Pointf GoogleMapsGpsToPixelDiff(Pointf center, int zoom, Pointf gps);
Pointf GoogleMapsGpsToPixel(Pointf center, int zoom, Size sz, Pointf gps);
Pointf ScanGPS(const char *s);
String FormatGPSX(double x);
String FormatGPSY(double y);
String FormatGPS(Pointf p);
bool MapDlg(Pointf& p);
#endif
Main.cpp
#include "GoogleMaps.h"
GUI_APP_MAIN {
// Following key was obtained for U++ project, please get your owen key if you want to use
// GoogleMaps API here (it is free): http://code.google.com/intl/cs/apis/maps/signup.html
SetGoogleMapsKey("ABQIAAAAXHmSFgmVIbMZDJ5RhfPINBSBetkRueiarolywVmVT7jJWZRGvBQFIvrtty50ivBLt4YApjpEVXW8Hw");
Pointf p(0, 51.477222);
if(MapDlg(p))
Exclamation("Marker position " + FormatGPS(p));
}
GoogleMaps.cpp
#include "GoogleMaps.h"
using namespace Upp;
#define LLOG(x) // LOG(x)
String apikey = "";
void SetGoogleMapsKey(const char *key)
{
apikey = key;
}
String GetGoogleMap(double center_x, double center_y, int zoom, int cx, int cy,
const char *format, String *error)
{
String request;
request << "http://maps.google.com/maps/api/staticmap?center=" <<
AsString(center_y) << ',' << AsString(center_x) <<
"&zoom=" << zoom <<
"&size=" << cx << 'x' << cy <<
"&format=" << format <<
"&sensor=false&key=" << apikey;
return HttpClientGet(request, NULL, error);
}
Image GetGoogleMapImage(double center_x, double center_y, int zoom, int cx, int cy,
const char *format, String *error)
{
return StreamRaster::LoadStringAny(GetGoogleMap(center_x, center_y, zoom, cx, cy, format, error));
}
double CvDeg(double deg, double minutes, double seconds)
{
return deg + (double)minutes / 60 + seconds / 3600;
}
static void sFetch(double& a, double *x, int& ii)
{
a = CvDeg(x[0], x[1], x[2]);
ii = 0;
}
int CharFilterH(int c)
{
return c == 'e' || c == 'E' ? 'r' : c == '\'' || c == '\"' ? '@' : c;
}
Pointf ScanGPS(const char *s)
{
String h = Filter(s, CharFilterH);
Pointf r = Null;
double x[3];
CParser p(h);
x[0] = x[1] = x[2] = 0;
int ii = 0;
while(!p.IsEof()) {
if(p.IsDouble()) {
if(ii < 3)
x[ii++] = p.ReadDouble();
else {
if(IsNull(r.y))
sFetch(r.y, x, ii);
else {
sFetch(r.x, x, ii);
break;
}
x[ii++] = p.ReadDouble();
}
}
else
if(p.Char('W') || p.Char('w')) {
if(x[0] > 0)
x[0] = -x[0];
sFetch(r.x, x, ii);
}
else
if(p.Char('r'))
sFetch(r.x, x, ii);
else
if(p.Char('S') || p.Char('s')) {
if(x[0] > 0)
x[0] = -x[0];
sFetch(r.y, x, ii);
}
else
if(p.Char('N') || p.Char('n'))
sFetch(r.y, x, ii);
else
p.SkipTerm();
}
if(!IsNull(r.y) && IsNull(r.x))
sFetch(r.x, x, ii);
return r;
}
String FormatDegree(double d, int decimals)
{
if(IsNull(d))
return Null;
d = modulo(d + 180, 360) - 180;
char sign = (d < 0 ? '-' : '+');
if(d < 0) d = -d;
int deg = ffloor(d);
String cd = ToCharset(CHARSET_DEFAULT, "%c%ERROR: Invalid UTF-8 sequence: "`,` CHARSET`_UTF8`)
|