+FGNavList::TypeFilter* FGNavList::locFilter()
+{
+ static TypeFilter tf(FGPositioned::ILS, FGPositioned::LOC);
+ return &tf;
+}
+
+FGNavList::TypeFilter* FGNavList::ndbFilter()
+{
+ static TypeFilter tf(FGPositioned::NDB);
+ return &tf;
+}
+
+FGNavList::TypeFilter* FGNavList::navFilter()
+{
+ static TypeFilter tf(FGPositioned::VOR, FGPositioned::LOC);
+ return &tf;
+}
+
+FGNavList::TypeFilter* FGNavList::tacanFilter()
+{
+ static TacanFilter tf;
+ return &tf;
+}
+
+FGNavList::TypeFilter* FGNavList::mobileTacanFilter()
+{
+ static TypeFilter tf(FGPositioned::MOBILE_TACAN);
+ return &tf;
+}
+
+FGNavRecordRef FGNavList::findByFreq( double freq,
+ const SGGeod& position,
+ TypeFilter* filter )
+{
+ flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
+ int freqKhz = static_cast<int>(freq * 100 + 0.5);
+ PositionedIDVec stations(cache->findNavaidsByFreq(freqKhz, position, filter));
+ if (stations.empty()) {
+ return NULL;
+ }
+
+// now walk the (sorted) results list to find a usable, in-range navaid
+ SGVec3d acCart(SGVec3d::fromGeod(position));
+ double min_dist
+ = FG_NAV_MAX_RANGE*SG_NM_TO_METER*FG_NAV_MAX_RANGE*SG_NM_TO_METER;
+
+ BOOST_FOREACH(PositionedID id, stations) {
+ FGNavRecordRef station = FGPositioned::loadById<FGNavRecord>(id);
+ if (!filter->pass(station)) {
+ continue;