/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8/////////9/////////A void WGoogleMapEx::addWindIndicator(const WGoogleMap::Coordinate &pos, const double rotationDeg, const double speed, const WColor &color, const float opacity, const std::string &tooltip) { const double polelength = 60000; const double len10kn = 10000; const double dist10kn = 10000; point_ll_deg posi(longitude<>(pos.longitude()), latitude<>(pos.latitude())); std::vector<WGoogleMap::Coordinate> arrowpnts; // tip arrowpnts.push_back(WGoogleMap::Coordinate(posi.lat(), posi.lon())); // tail point_ll_deg pnt; point_at_distance(posi, polelength, 2.0 * M_PI * rotationDeg / 360.0, average_earth_radius, pnt); arrowpnts.push_back(WGoogleMap::Coordinate(pnt.lat(), pnt.lon())); for(size_t i=0; i<speed; i+=10) { const bool full = speed > (i + 5); point_at_distance(posi, polelength - i * dist10kn / 10.0, 2.0 * M_PI * rotationDeg / 360.0, average_earth_radius, pnt); const point_ll_deg pnt1 = pnt; arrowpnts.push_back(WGoogleMap::Coordinate(pnt1.lat(), pnt1.lon())); point_at_distance(pnt1, full ? len10kn : len10kn / 2.0, 2.0 * M_PI * (rotationDeg - 45) / 360.0, average_earth_radius, pnt); arrowpnts.push_back(WGoogleMap::Coordinate(pnt.lat(), pnt.lon())); arrowpnts.push_back(WGoogleMap::Coordinate(pnt1.lat(), pnt1.lon())); } addPolyline(arrowpnts, color, 2, opacity); }
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8/////////9/////////A void WGoogleMapEx::addArrow(const WGoogleMap::Coordinate &pos, const double rotationDeg, const WColor &color, const float opacity, const std::string &tooltip) { /* std::ostringstream strm; strm << "var pos = new google.maps.LatLng(" << pos.latitude() << ", " << pos.longitude() << "); " << "var arrow = new BDCCArrow(pos, " << rotationDeg << ", \"" << color.cssText() << "\", " << opacity << ", \"" << tooltip << "\"); " << jsRef() << ".map.addOverlay(arrow);"; doGmJavaScript(strm.str(), true); */ // second attempt point_ll_deg posi(longitude<>(pos.longitude()), latitude<>(pos.latitude())); // std::cout << "Arrow at " << boost::geometry::make_wkt(posi) << std::endl; std::vector<WGoogleMap::Coordinate> arrowpnts; // tail point_ll_deg pnt; point_at_distance(posi, 20000, 2.0 * M_PI * rotationDeg / 360.0, average_earth_radius, pnt); arrowpnts.push_back(WGoogleMap::Coordinate(pnt.lat(), pnt.lon())); // tip arrowpnts.push_back(WGoogleMap::Coordinate(posi.lat(), posi.lon())); // right point_at_distance(posi, 5000, 2.0 * M_PI * (rotationDeg + 30) / 360.0, average_earth_radius, pnt); arrowpnts.push_back(WGoogleMap::Coordinate(pnt.lat(), pnt.lon())); // left point_at_distance(posi, 5000, 2.0 * M_PI * (rotationDeg - 30) / 360.0, average_earth_radius, pnt); arrowpnts.push_back(WGoogleMap::Coordinate(pnt.lat(), pnt.lon())); // tip arrowpnts.push_back(WGoogleMap::Coordinate(posi.lat(), posi.lon())); addPolyline(arrowpnts, color, 2, opacity); }
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8/////////9/////////A void WGoogleMapEx::addMarker(const WGoogleMap::Coordinate &pos, const string &imgUrl) { std::ostringstream strm; strm << "var icon = new google.maps.Icon(G_DEFAULT_ICON);" << "icon.image = \"" << imgUrl << "\";" << "var marker = new google.maps.Marker(new google.maps.LatLng(" << pos.latitude() << ", " << pos.longitude() << "), icon);" << jsRef() << ".map.addOverlay(marker);"; doGmJavaScript(strm.str(), false); }
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8/////////9/////////A void WGoogleMapEx::zoomWindow(const WGoogleMap::Coordinate& topLeft, const WGoogleMap::Coordinate& rightBottom) { WGoogleMap::Coordinate topLeftC = topLeft; WGoogleMap::Coordinate rightBottomC = rightBottom; const WGoogleMap::Coordinate center ((topLeftC.latitude() + rightBottomC.latitude()) / 2.0, (topLeftC.longitude() + rightBottomC.longitude()) / 2.0); topLeftC = WGoogleMap::Coordinate(std::min(topLeftC.latitude(), rightBottomC.latitude()), std::min(topLeftC.longitude(), rightBottomC.longitude())); rightBottomC = WGoogleMap::Coordinate(std::max(topLeftC.latitude(), rightBottomC.latitude()), std::max(topLeftC.longitude(), rightBottomC.longitude())); std::stringstream strm; strm << "var bbox = new google.maps.LatLngBounds(new google.maps.LatLng(" << topLeftC.latitude() << ", " << topLeftC.longitude() << "), " << "new google.maps.LatLng(" << rightBottomC.latitude() << ", " << rightBottomC.longitude() << "));" << "var zooml = " << jsRef() << ".map.getBoundsZoomLevel(bbox);" << jsRef() << ".map.setCenter(new google.maps.LatLng(" << center.latitude() << ", " << center.longitude() << "), zooml);"; doGmJavaScript(strm.str(), true); }
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8/////////9/////////A void WGoogleMapEx::addCircle(const WGoogleMap::Coordinate &pos, const double radiusKm, const WColor &strokeColor, const size_t strokeWeightPx, const float strokeOpacity) { /* std::ostringstream strm; strm << "var pos = new google.maps.LatLng(" << pos.latitude() << ", " << pos.longitude() << "); " << "var circle = new BDCCCircle(pos, " << radiusKm << ", \"" << strokeColor.cssText() << "\", " << strokeWeightPx << ", " << strokeOpacity << ", " << std::boolalpha << doFill << ", \"" << fillColor.cssText() << "\", " << fillOpacity << ", \"" << tooltip << "\"); " << jsRef() << ".map.addOverlay(circle);"; doGmJavaScript(strm.str(), true); */ // workaround as long as we have the problem with the loading order of the javascript -> works only for one map per page static const double average_earth_radius = 6372795.0; point_ll_deg posi(longitude<>(pos.longitude()), latitude<>(pos.latitude())); std::cout << "Circle around " << boost::geometry::make_wkt(posi) << " radius " << radiusKm << " km" << std::endl; std::vector<WGoogleMap::Coordinate> circlepnts; const size_t steps = 50; for(size_t i=0; i<steps; ++i) { point_ll_deg perifer; point_at_distance(posi, radiusKm * 1000, 2 * M_PI * i / steps, average_earth_radius, perifer); circlepnts.push_back(WGoogleMap::Coordinate(perifer.lat(), perifer.lon())); } circlepnts.push_back(circlepnts.front()); assert(circlepnts.size() == steps + 1); addPolyline(circlepnts, strokeColor, strokeWeightPx, strokeOpacity); /* // second workaround: draw direcly here without using js lib std::ostringstream strm; strm << "var svgNS = \"http://www.w3.org/2000/svg\"; " << "var circle = document.createElementNS(svgNS, \"svg\"); " << "var center = " << jsRef() << ".map.fromLatLngToDivPixel(new google.maps.LatLng(" << pos.latitude() << ", " << pos.longitude() << ")); " << "var sz = " << jsRef() << ".map.getSize(); " << "var bnds = " << jsRef() << ".map.getBounds(); " << "var pxDiag = Math.sqrt((sz.width * sz.width) + (sz.height * sz.height)); " << "var mDiagKm = bnds.getNorthEast().distanceFrom(bnds.getSouthWest()) / 1000.0; " << "var pxPerKm = pxDiag/mDiagKm; " << "var w2 = " << strokeWeightPx << "/2.0; " << "var rPx = Math.round((" << radiusKm << " * pxPerKm) - w2); " // << "var rdrh = circle.suspendRedraw(10000); " // << "circle.setAttribute(\"visibility\",\"hidden\"); " << "if(rPx > 0 && rPx < 3000) " << "{" << " var ne = " << jsRef() << ".map.fromLatLngToDivPixel(bnds.getNorthEast()); " << " var sw = " << jsRef() << ".map.fromLatLngToDivPixel(bnds.getSouthWest()); " << " var wd = ne.x - sw.x; " << " var ht = sw.y - ne.y; " << " var l = sw.x; " << " var t = ne.y; " << " circle.setAttribute(\"width\", wd); " << " circle.setAttribute(\"height\", ht); " << " circle.setAttribute(\"style\", \"position:absolute; top:\"+ t + \"px; left:\" + l + \"px\"); " << " var cx = center.x-l; " << " var cy = center.y-t; " << " circle.setAttribute(\"overflow\", \"hidden\"); " << " circle.setAttribute(\"r\",rPx); " << " circle.setAttribute(\"cx\",cx); " << " circle.setAttribute(\"cy\",cy); " << " circle.setAttribute(\"visibility\",\"visible\"); " << "}" << jsRef() << ".map.getPane(G_MAP_MAP_PANE).appendChild(circle); "; // << "circle.unsuspendRedraw(rdrh); " // << "circle.forceRedraw(); "; doGmJavaScript(strm.str(), true); std::ofstream ofs("/tmp/gmcircle.js"); ofs << strm.str(); */ }
void googleMapClicked(WGoogleMap::Coordinate c) { std::cerr << "Clicked at coordinate (" << c.latitude() << "," << c.longitude() << ")"; }