int main(int argc, const char* argv[]) { try { Timer timer; const char* symbolFileName = "./symbols.xmap"; const char* rulesFileName = "./rules.xml"; const char* inOsmFileName = "./in.osm"; const char* outXmapFileName = "./out.xmap"; if (argc > 1) { for (int i = 1; i < argc; ++i) { if (std::string(argv[i]) == "-i") { inOsmFileName = argv[++i]; checkFileName(inOsmFileName,argv[0]); } else if (std::string(argv[i]) == "-o") { outXmapFileName = argv[++i]; checkFileName(outXmapFileName,argv[0]); } else if (std::string(argv[i]) == "-s") { symbolFileName = argv[++i]; checkFileName(symbolFileName,argv[0]); } else if (std::string(argv[i]) == "-r") { rulesFileName = argv[++i]; checkFileName(rulesFileName,argv[0]); } else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h" || std::string(argv[i]) == "help") { printUsage(argv[0]); return 0; } else { printUsage(argv[0]); throw Error("Unknown option '" + std::string(argv[i]) + "'"); } } } info("Using files:"); info("\t* input OSM file - " + std::string(inOsmFileName)); info("\t* output XMAP file - " + std::string(outXmapFileName)); info("\t* symbol set XMAP file - " + std::string(symbolFileName)); info("\t* rules file - " + std::string(rulesFileName)); XmlTree inXmapDoc(symbolFileName); XmlElement inXmapRoot = inXmapDoc.getChild("map"); XmlTree inOsmDoc(inOsmFileName); XmlElement inOsmRoot = inOsmDoc.getChild("osm"); const double min_supported_version = 0.5; const double max_supported_version = 0.6; double version = inOsmRoot.getAttribute<double>("version"); if (version < min_supported_version || version > max_supported_version) { throw Error("OSM data version %.1f isn't supported" + std::to_string(version)); } XmlElement bounds = inOsmRoot.getChild("bounds"); if (bounds.isEmpty()) { throw Error("No bounds"); } double x = bounds.getAttribute<double>("minlon") + bounds.getAttribute<double>("maxlon"); x /= 2; double y = bounds.getAttribute<double>("minlat") + bounds.getAttribute<double>("maxlat"); y /= 2; Coords geographic_ref_point(x,y); Georeferencing georef(inXmapRoot, geographic_ref_point); Main::transform = CoordsTransform(georef); SymbolIdByCodeMap symbolIds(inXmapRoot); Main::rules = Rules(rulesFileName,symbolIds); osmToXmap(inOsmRoot,outXmapFileName,symbolFileName,georef); info("\nExecution time: " + std::to_string(timer.getCurTime()) + " sec."); } /* catch (const char * msg) { std::cerr << "ERROR: " << msg << std::endl; } */ catch (std::exception& error) { std::cerr << "ERROR: " << error.what() << std::endl; return 1; } }
bool TemplateTrack::postLoadConfiguration(QWidget* dialog_parent, bool& out_center_in_view) { is_georeferenced = true; // If no track CRS is given by the template file, ask the user if (!track.hasTrackCRS()) { if (map->getGeoreferencing().isLocal()) { track_crs_spec.clear(); } else { SelectCRSDialog dialog( map->getGeoreferencing(), dialog_parent, SelectCRSDialog::TakeFromMap | SelectCRSDialog::Local | SelectCRSDialog::Geographic, tr("Select the coordinate reference system of the track coordinates") ); if (dialog.exec() == QDialog::Rejected) return false; track_crs_spec = dialog.currentCRSSpec(); } Georeferencing* track_crs = new Georeferencing(); if (!track_crs_spec.isEmpty()) track_crs->setProjectedCRS(QString{}, track_crs_spec); track_crs->setTransformationDirectly(QTransform()); track.setTrackCRS(track_crs); } // If the CRS is geographic, ask if track should be loaded using map georeferencing or ad-hoc georeferencing track_crs_spec = track.getTrackCRS()->getProjectedCRSSpec(); bool crs_is_geographic = track_crs_spec.contains(QLatin1String("+proj=latlong")); // TODO: should that be case insensitive? if (crs_is_geographic) { TaskDialog georef_dialog(dialog_parent, tr("Opening track ..."), tr("Load the track in georeferenced or non-georeferenced mode?"), QDialogButtonBox::Abort); QString georef_text = tr("Positions the track according to the map's georeferencing settings."); if (!map->getGeoreferencing().isValid()) georef_text += QLatin1Char(' ') + tr("These are not configured yet, so they will be shown as the next step."); QAbstractButton* georef_button = georef_dialog.addCommandButton(tr("Georeferenced"), georef_text); QAbstractButton* non_georef_button = georef_dialog.addCommandButton(tr("Non-georeferenced"), tr("Projects the track using an orthographic projection with center at the track's coordinate average. Allows adjustment of the transformation and setting the map georeferencing using the adjusted track position.")); georef_dialog.exec(); if (georef_dialog.clickedButton() == georef_button) is_georeferenced = true; else if (georef_dialog.clickedButton() == non_georef_button) is_georeferenced = false; else // abort return false; } // If the CRS is local, show positioning dialog if (track_crs_spec.isEmpty()) { is_georeferenced = false; TemplatePositioningDialog dialog(dialog_parent); if (dialog.exec() == QDialog::Rejected) return false; transform.template_scale_x = dialog.getUnitScale(); if (!dialog.useRealCoords()) { transform.template_scale_x /= (map->getScaleDenominator() / 1000.0); } transform.template_scale_y = transform.template_scale_x; updateTransformationMatrices(); out_center_in_view = dialog.centerOnView(); } // If the track is loaded as georeferenced and the transformation parameters // were not set yet, it must be done now if (is_georeferenced && (!map->getGeoreferencing().isValid() || map->getGeoreferencing().isLocal())) { // Set default for real world reference point as some average of the track coordinates Georeferencing georef(map->getGeoreferencing()); georef.setGeographicRefPoint(track.calcAveragePosition()); // Show the parameter dialog GeoreferencingDialog dialog(dialog_parent, map, &georef); dialog.setKeepGeographicRefCoords(); if (dialog.exec() == QDialog::Rejected || map->getGeoreferencing().isLocal()) return false; } // If the track is loaded as not georeferenced, // the map coords for the track coordinates have to be calculated if (!is_georeferenced && crs_is_geographic) calculateLocalGeoreferencing(); else track.changeMapGeoreferencing(map->getGeoreferencing()); return true; }