From 723654183327ba59c1038120407a272e2c022269 Mon Sep 17 00:00:00 2001 From: Christian Schmitt Date: Sun, 3 Mar 2013 14:17:37 +0100 Subject: [PATCH] Add points of interest (POI) database to FGPositioned. Useful for maps and GPS instruments. Can display country, city, towns and villages names worldwide. --- src/Navaids/CMakeLists.txt | 4 +- src/Navaids/NavDataCache.cxx | 13 ++++- src/Navaids/poidb.cxx | 106 +++++++++++++++++++++++++++++++++++ src/Navaids/poidb.hxx | 40 +++++++++++++ src/Navaids/positioned.cxx | 2 + src/Navaids/positioned.hxx | 1 + 6 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/Navaids/poidb.cxx create mode 100644 src/Navaids/poidb.hxx diff --git a/src/Navaids/CMakeLists.txt b/src/Navaids/CMakeLists.txt index 5d15dd3d4..d611e1c16 100644 --- a/src/Navaids/CMakeLists.txt +++ b/src/Navaids/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES navdb.cxx navlist.cxx navrecord.cxx + poidb.cxx positioned.cxx procedure.cxx route.cxx @@ -25,6 +26,7 @@ set(HEADERS navdb.hxx navlist.hxx navrecord.hxx + poidb.hxx positioned.hxx procedure.hxx route.hxx @@ -41,4 +43,4 @@ if (NOT SYSTEM_SQLITE) list(APPEND HEADERS sqlite3.h) endif() -flightgear_component(Navaids "${SOURCES}" "${HEADERS}") \ No newline at end of file +flightgear_component(Navaids "${SOURCES}" "${HEADERS}") diff --git a/src/Navaids/NavDataCache.cxx b/src/Navaids/NavDataCache.cxx index aeb70cc30..2010743cd 100644 --- a/src/Navaids/NavDataCache.cxx +++ b/src/Navaids/NavDataCache.cxx @@ -60,6 +60,7 @@ #include "PositionedOctree.hxx" #include #include +#include "poidb.hxx" #include #include @@ -949,7 +950,7 @@ public: bool transactionAborted; sqlite3_stmt_ptr beginTransactionStmt, commitTransactionStmt, rollbackTransactionStmt; - SGPath aptDatPath, metarDatPath, navDatPath, fixDatPath, + SGPath aptDatPath, metarDatPath, navDatPath, fixDatPath, poiDatPath, carrierDatPath, airwayDatPath; sqlite3_stmt_ptr readPropertyQuery, writePropertyQuery, @@ -1070,6 +1071,7 @@ FGPositioned* NavDataCache::NavDataCachePrivate::loadById(sqlite3_int64 rowid) case FGPositioned::COUNTRY: case FGPositioned::CITY: case FGPositioned::TOWN: + case FGPositioned::VILLAGE: { FGPositioned* wpt = new FGPositioned(rowid, ty, ident, pos); return wpt; @@ -1145,6 +1147,9 @@ NavDataCache::NavDataCache() d->fixDatPath = SGPath(globals->get_fg_root()); d->fixDatPath.append("Navaids/fix.dat.gz"); + + d->poiDatPath = SGPath(globals->get_fg_root()); + d->poiDatPath.append("Navaids/poi.dat.gz"); d->carrierDatPath = SGPath(globals->get_fg_root()); d->carrierDatPath.append("Navaids/carrier_nav.dat.gz"); @@ -1176,6 +1181,7 @@ bool NavDataCache::isRebuildRequired() isCachedFileModified(d->metarDatPath) || isCachedFileModified(d->navDatPath) || isCachedFileModified(d->fixDatPath) || + isCachedFileModified(d->poiDatPath) || isCachedFileModified(d->airwayDatPath)) { SG_LOG(SG_NAVCACHE, SG_INFO, "NavCache: main cache rebuild required"); @@ -1237,6 +1243,11 @@ void NavDataCache::doRebuild() navDBInit(d->navDatPath); stampCacheFile(d->navDatPath); SG_LOG(SG_NAVCACHE, SG_INFO, "nav.dat load took:" << st.elapsedMSec()); + + st.stamp(); + poiDBInit(d->poiDatPath); + stampCacheFile(d->poiDatPath); + SG_LOG(SG_NAVCACHE, SG_INFO, "poi.dat load took:" << st.elapsedMSec()); loadCarrierNav(d->carrierDatPath); stampCacheFile(d->carrierDatPath); diff --git a/src/Navaids/poidb.cxx b/src/Navaids/poidb.cxx new file mode 100644 index 000000000..bfc7c81ef --- /dev/null +++ b/src/Navaids/poidb.cxx @@ -0,0 +1,106 @@ +// poidb.cxx -- points of interest management routines +// +// Written by Christian Schmitt, March 2013 +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include "poidb.hxx" + +using std::string; + +static FGPositioned::Type +mapPOITypeToFGPType(int aTy) +{ + switch (aTy) { + case 10: return FGPositioned::COUNTRY; + case 12: return FGPositioned::CITY; + case 13: return FGPositioned::TOWN; + case 14: return FGPositioned::VILLAGE; + default: + throw sg_range_exception("Unknown POI type", "FGNavDataCache::readPOIFromStream"); + } +} + + + +namespace flightgear +{ + +static PositionedID readPOIFromStream(std::istream& aStream, + FGPositioned::Type type = FGPositioned::INVALID) +{ + NavDataCache* cache = NavDataCache::instance(); + + int rawType; + aStream >> rawType; + if (aStream.eof() || (rawType == '#')) { + return 0; + } + + double lat, lon; + std::string name; + aStream >> lat >> lon; + getline(aStream, name); + + SGGeod pos(SGGeod::fromDeg(lon, lat)); + name = simgear::strutils::strip(name); + + // the type can be forced by our caller, but normally we use the value + // supplied in the .dat file + if (type == FGPositioned::INVALID) { + type = mapPOITypeToFGPType(rawType); + } + if (type == FGPositioned::INVALID) { + return 0; + } + + PositionedID r = cache->createPOI(type, name, pos); + return r; +} + +// load and initialize the POI database +bool poiDBInit(const SGPath& path) +{ + sg_gzifstream in( path.str() ); + if ( !in.is_open() ) { + SG_LOG( SG_NAVAID, SG_ALERT, "Cannot open file: " << path.str() ); + return false; + } + + in >> skipcomment; + + while (!in.eof()) { + readPOIFromStream(in); + in >> skipcomment; + } // of stream data loop + + return true; +} + +} // of namespace flightgear diff --git a/src/Navaids/poidb.hxx b/src/Navaids/poidb.hxx new file mode 100644 index 000000000..cfbf3b92d --- /dev/null +++ b/src/Navaids/poidb.hxx @@ -0,0 +1,40 @@ +// poidb.cxx -- points of interest management routines +// +// Written by Christian Schmitt, March 2013 +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + + +#ifndef _FG_POIDB_HXX +#define _FG_POIDB_HXX + + +#include + + +// forward decls +class SGPath; + +namespace flightgear +{ + +// load and initialize the POI database +bool poiDBInit(const SGPath& path); + +} // of namespace flightgear + +#endif // _FG_NAVDB_HXX diff --git a/src/Navaids/positioned.cxx b/src/Navaids/positioned.cxx index ee60aca80..450c755d9 100644 --- a/src/Navaids/positioned.cxx +++ b/src/Navaids/positioned.cxx @@ -131,6 +131,7 @@ FGPositioned::Type FGPositioned::typeFromName(const std::string& aName) {"country", COUNTRY}, {"city", CITY}, {"town", TOWN}, + {"village", VILLAGE}, // aliases {"gnd", FREQ_GROUND}, @@ -191,6 +192,7 @@ const char* FGPositioned::nameForType(Type aTy) case COUNTRY: return "country"; case CITY: return "city"; case TOWN: return "town"; + case VILLAGE: return "village"; default: return "unknown"; } diff --git a/src/Navaids/positioned.hxx b/src/Navaids/positioned.hxx index aeaea6f12..4943c964b 100644 --- a/src/Navaids/positioned.hxx +++ b/src/Navaids/positioned.hxx @@ -85,6 +85,7 @@ public: COUNTRY, CITY, TOWN, + VILLAGE, LAST_TYPE } Type; -- 2.39.5