Can display country, city, towns and villages names worldwide.
navdb.cxx
navlist.cxx
navrecord.cxx
+ poidb.cxx
positioned.cxx
procedure.cxx
route.cxx
navdb.hxx
navlist.hxx
navrecord.hxx
+ poidb.hxx
positioned.hxx
procedure.hxx
route.hxx
list(APPEND HEADERS sqlite3.h)
endif()
-flightgear_component(Navaids "${SOURCES}" "${HEADERS}")
\ No newline at end of file
+flightgear_component(Navaids "${SOURCES}" "${HEADERS}")
#include "PositionedOctree.hxx"
#include <Airports/apt_loader.hxx>
#include <Navaids/airways.hxx>
+#include "poidb.hxx"
#include <Airports/parking.hxx>
#include <Airports/gnnode.hxx>
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,
case FGPositioned::COUNTRY:
case FGPositioned::CITY:
case FGPositioned::TOWN:
+ case FGPositioned::VILLAGE:
{
FGPositioned* wpt = new FGPositioned(rowid, ty, ident, pos);
return wpt;
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");
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");
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);
--- /dev/null
+// 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 <simgear/compiler.h>
+#include <simgear/debug/logstream.hxx>
+#include <simgear/math/sg_geodesy.hxx>
+#include <simgear/misc/sg_path.hxx>
+#include <simgear/structure/exception.hxx>
+#include <simgear/misc/sgstream.hxx>
+
+#include <Navaids/NavDataCache.hxx>
+#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
--- /dev/null
+// 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 <simgear/compiler.h>
+
+
+// forward decls
+class SGPath;
+
+namespace flightgear
+{
+
+// load and initialize the POI database
+bool poiDBInit(const SGPath& path);
+
+} // of namespace flightgear
+
+#endif // _FG_NAVDB_HXX
{"country", COUNTRY},
{"city", CITY},
{"town", TOWN},
+ {"village", VILLAGE},
// aliases
{"gnd", FREQ_GROUND},
case COUNTRY: return "country";
case CITY: return "city";
case TOWN: return "town";
+ case VILLAGE: return "village";
default:
return "unknown";
}
COUNTRY,
CITY,
TOWN,
+ VILLAGE,
LAST_TYPE
} Type;