OfflineRegionDefinition decodeOfflineRegionDefinition(const std::string& region) { rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator> doc; doc.Parse<0>(region.c_str()); if (doc.HasParseError() || !doc.HasMember("style_url") || !doc["style_url"].IsString() || !doc.HasMember("bounds") || !doc["bounds"].IsArray() || doc["bounds"].Size() != 4 || !doc["bounds"][0].IsDouble() || !doc["bounds"][1].IsDouble() || !doc["bounds"][2].IsDouble() || !doc["bounds"][3].IsDouble() || !doc.HasMember("min_zoom") || !doc["min_zoom"].IsDouble() || (doc.HasMember("max_zoom") && !doc["max_zoom"].IsDouble()) || !doc.HasMember("pixel_ratio") || !doc["pixel_ratio"].IsDouble()) { throw std::runtime_error("Malformed offline region definition"); } std::string styleURL { doc["style_url"].GetString(), doc["style_url"].GetStringLength() }; LatLngBounds bounds = LatLngBounds::hull( LatLng(doc["bounds"][0].GetDouble(), doc["bounds"][1].GetDouble()), LatLng(doc["bounds"][2].GetDouble(), doc["bounds"][3].GetDouble())); double minZoom = doc["min_zoom"].GetDouble(); double maxZoom = doc.HasMember("max_zoom") ? doc["max_zoom"].GetDouble() : INFINITY; float pixelRatio = doc["pixel_ratio"].GetDouble(); return { styleURL, bounds, minZoom, maxZoom, pixelRatio }; }
OfflineRegionDefinition decodeOfflineRegionDefinition(const std::string& region) { rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator> doc; doc.Parse<0>(region.c_str()); // validation auto hasValidBounds = [&] { return doc.HasMember("bounds") && doc["bounds"].IsArray() && doc["bounds"].Size() == 4 && doc["bounds"][0].IsDouble() && doc["bounds"][1].IsDouble() && doc["bounds"][2].IsDouble() && doc["bounds"][3].IsDouble(); }; auto hasValidGeometry = [&] { return doc.HasMember("geometry") && doc["geometry"].IsObject(); }; if (doc.HasParseError() || !doc.HasMember("style_url") || !doc["style_url"].IsString() || !(hasValidBounds() || hasValidGeometry()) || !doc.HasMember("min_zoom") || !doc["min_zoom"].IsDouble() || (doc.HasMember("max_zoom") && !doc["max_zoom"].IsDouble()) || !doc.HasMember("pixel_ratio") || !doc["pixel_ratio"].IsDouble() || (doc.HasMember("include_ideographs") && !doc["include_ideographs"].IsBool())) { throw std::runtime_error("Malformed offline region definition"); } // Common properties std::string styleURL { doc["style_url"].GetString(), doc["style_url"].GetStringLength() }; double minZoom = doc["min_zoom"].GetDouble(); double maxZoom = doc.HasMember("max_zoom") ? doc["max_zoom"].GetDouble() : INFINITY; float pixelRatio = doc["pixel_ratio"].GetDouble(); bool includeIdeographs = doc.HasMember("include_ideographs") ? doc["include_ideographs"].GetBool() : true; if (doc.HasMember("bounds")) { return OfflineTilePyramidRegionDefinition{ styleURL, LatLngBounds::hull( LatLng(doc["bounds"][0].GetDouble(), doc["bounds"][1].GetDouble()), LatLng(doc["bounds"][2].GetDouble(), doc["bounds"][3].GetDouble())), minZoom, maxZoom, pixelRatio, includeIdeographs }; } else { return OfflineGeometryRegionDefinition{ styleURL, mapbox::geojson::convert<Geometry<double>>(doc["geometry"].GetObject()), minZoom, maxZoom, pixelRatio, includeIdeographs }; }; }
static inline const LatLng latLngForProjectedMeters(const ProjectedMeters projectedMeters) { double latitude = (2 * std::atan(std::exp(projectedMeters.northing / util::EARTH_RADIUS_M)) - (M_PI / 2)) * util::RAD2DEG; double longitude = projectedMeters.easting * util::RAD2DEG / util::EARTH_RADIUS_M; latitude = std::fmin(std::fmax(latitude, -util::LATITUDE_MAX), util::LATITUDE_MAX); return LatLng(latitude, longitude); }
void Map::resetPosition() { CameraOptions options; options.angle = 0; options.center = LatLng(0, 0); options.zoom = 0; transform->jumpTo(options); update(Update::Zoom); }
void MapPage::evalSetPolylineAndFitBounds(const QList<QPointF> &apoly) const { QString cmd = "var poly=[];"; for (int i=0; i<apoly.length(); i++) { cmd += "poly.push(" + LatLng(apoly[i]) + ");"; } cmd += "curRoute.setPolylineAndFitBounds(poly);"; // qDebug() << "evalSetPolylineAndFitBounds()" << cmd; this->mainFrame()->evaluateJavaScript(cmd); }
static LatLng latLngForProjectedMeters(const ProjectedMeters& projectedMeters) { double latitude = (2 * std::atan(std::exp(projectedMeters.northing / util::EARTH_RADIUS_M)) - (M_PI / 2.0)) * util::RAD2DEG; double longitude = projectedMeters.easting * util::RAD2DEG / util::EARTH_RADIUS_M; latitude = util::clamp(latitude, -util::LATITUDE_MAX, util::LATITUDE_MAX); longitude = util::clamp(longitude, -util::LONGITUDE_MAX, util::LONGITUDE_MAX); return LatLng(latitude, longitude); }
void MapPage::evalJoinWithCurRoute(const MapRoute &amapRoute) const { QString cmd = "var poly=[];"; for (int i=0; i<amapRoute.getPolyline().length(); i++) { cmd += "poly.push(" + LatLng(amapRoute.getPolyline().at(i)) + ");"; } cmd += QString("var len=%1;").arg(amapRoute.getDistanceInMeter()); cmd += "curRoute.joinWithCurRoute(poly,len);"; // qDebug() << "evalJoinWithCurRoute=" << cmd; this->mainFrame()->evaluateJavaScript(cmd); }
void extend(const LatLng& point) { sw = LatLng(std::min(point.latitude(), sw.latitude()), std::min(point.longitude(), sw.longitude())); ne = LatLng(std::max(point.latitude(), ne.latitude()), std::max(point.longitude(), ne.longitude())); }
LatLng center() const { return LatLng((sw.latitude() + ne.latitude()) / 2, (sw.longitude() + ne.longitude()) / 2); }
LatLng northwest() const { return LatLng(north(), west()); }
LatLng southeast() const { return LatLng(south(), east()); }
void Map::resetPosition() { transform->setAngle(0); transform->setLatLng(LatLng(0, 0)); transform->setZoom(0); update(Update::Zoom); }
void MapPage::evalSetPrevPos(QPointF aprevPos) const { QString cmd = "curRoute.setPrevPos(" + LatLng(aprevPos) + ");"; qDebug() << "evalSetPrevPos()" << cmd; this->mainFrame()->evaluateJavaScript(cmd); }