]> git.mxchange.org Git - flightgear.git/commitdiff
Launcher shows polygon/polyline data
authorJames Turner <zakalawe@mac.com>
Thu, 26 Nov 2015 16:48:23 +0000 (16:48 +0000)
committerJames Turner <zakalawe@mac.com>
Fri, 27 Nov 2015 23:02:42 +0000 (23:02 +0000)
src/GUI/BaseDiagram.cxx
src/GUI/BaseDiagram.hxx
src/GUI/QtLauncher.cxx

index 8a1c8e163cf580a443430d71ae1d47a6bdb65109..8626a67df78f21ce748db96db6eeb1bd81de3b75 100644 (file)
@@ -30,6 +30,7 @@
 #include <Navaids/navrecord.hxx>
 #include <Navaids/positioned.hxx>
 #include <Airports/airport.hxx>
+#include <Navaids/PolyLine.hxx>
 
 #include "QtLauncher_fwd.hxx"
 
@@ -112,6 +113,8 @@ void BaseDiagram::paintEvent(QPaintEvent* pe)
     QTransform t(transform());
     p.setTransform(t);
 
+    paintCoastlines(&p);
+
     paintNavaids(&p);
 
     paintContents(&p);
@@ -132,6 +135,81 @@ void BaseDiagram::paintAirplaneIcon(QPainter* painter, const SGGeod& geod, int h
     painter->drawPixmap(airplaneIconRect, pix);
 }
 
+void BaseDiagram::paintCoastlines(QPainter* painter)
+{
+    QTransform xf = painter->transform();
+    QTransform invT = xf.inverted();
+
+    SGGeod topLeft = unproject(invT.map(rect().topLeft()), m_projectionCenter);
+    SGGeod viewCenter = unproject(invT.map(rect().center()), m_projectionCenter);
+    SGGeod bottomRight = unproject(invT.map(rect().bottomRight()), m_projectionCenter);
+
+    double drawRangeNm = std::max(SGGeodesy::distanceNm(viewCenter, topLeft),
+                                  SGGeodesy::distanceNm(viewCenter, bottomRight));
+
+    flightgear::PolyLineList lines(flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm,
+                                                                      flightgear::PolyLine::COASTLINE));
+
+    QPen waterPen(QColor(64, 64, 255), 1);
+    waterPen.setCosmetic(true);
+    painter->setPen(waterPen);
+    flightgear::PolyLineList::const_iterator it;
+    for (it=lines.begin(); it != lines.end(); ++it) {
+        paintGeodVec(painter, (*it)->points());
+    }
+
+    lines = flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm,
+                                              flightgear::PolyLine::URBAN);
+    for (it=lines.begin(); it != lines.end(); ++it) {
+        fillClosedGeodVec(painter, QColor(192, 192, 96), (*it)->points());
+    }
+
+    lines = flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm,
+                                              flightgear::PolyLine::RIVER);
+
+    painter->setPen(waterPen);
+    for (it=lines.begin(); it != lines.end(); ++it) {
+        paintGeodVec(painter, (*it)->points());
+    }
+
+
+    lines = flightgear::PolyLine::linesNearPos(viewCenter, drawRangeNm,
+                                              flightgear::PolyLine::LAKE);
+
+    for (it=lines.begin(); it != lines.end(); ++it) {
+        fillClosedGeodVec(painter, QColor(128, 128, 255),
+                          (*it)->points());
+    }
+
+
+}
+
+void BaseDiagram::paintGeodVec(QPainter* painter, const flightgear::SGGeodVec& vec)
+{
+    QVector<QPointF> projected;
+    projected.reserve(vec.size());
+    flightgear::SGGeodVec::const_iterator it;
+    for (it=vec.begin(); it != vec.end(); ++it) {
+        projected.append(project(*it));
+    }
+
+    painter->drawPolyline(projected.data(), projected.size());
+}
+
+void BaseDiagram::fillClosedGeodVec(QPainter* painter, const QColor& color, const flightgear::SGGeodVec& vec)
+{
+    QVector<QPointF> projected;
+    projected.reserve(vec.size());
+    flightgear::SGGeodVec::const_iterator it;
+    for (it=vec.begin(); it != vec.end(); ++it) {
+        projected.append(project(*it));
+    }
+
+    painter->setPen(Qt::NoPen);
+    painter->setBrush(color);
+    painter->drawPolygon(projected.data(), projected.size());
+}
+
 class MapFilter : public FGPositioned::TypeFilter
 {
 public:
index 9cbb81102fbde8a45b8132e56235b086513a9297..153c0eda2471aaae7001c563a873dd4b9bf55f52 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <Navaids/positioned.hxx>
 #include <Airports/airport.hxx>
+#include <Navaids/PolyLine.hxx>
 
 #include "QtLauncher_fwd.hxx"
 
@@ -128,6 +129,9 @@ private:
     void paintNavaid(QPainter *painter,
                      const QTransform& t,
                      const FGPositionedRef &pos);
+    void paintCoastlines(QPainter *painter);
+    void paintGeodVec(QPainter *painter, const flightgear::SGGeodVec &vec);
+    void fillClosedGeodVec(QPainter *painter, const QColor &color, const flightgear::SGGeodVec &vec);
 };
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(BaseDiagram::IconOptions)
index 7c5478e94a46200d2ee01666f00c521d6e2f360d..583b2f2e1cf51589b3246cab751d53c06111284e 100644 (file)
@@ -64,6 +64,7 @@
 #include <Main/globals.hxx>
 #include <Navaids/NavDataCache.hxx>
 #include <Navaids/navrecord.hxx>
+#include <Navaids/SHPParser.hxx>
 
 #include <Main/options.hxx>
 #include <Main/fg_init.hxx>
@@ -344,12 +345,41 @@ void initApp(int& argc, char** argv)
     }
 }
 
-bool runLauncherDialog()
+void loadNaturalEarthFile(const std::string& aFileName,
+                          flightgear::PolyLine::Type aType,
+                          bool areClosed)
 {
-    sglog().setLogLevels( SG_ALL, SG_INFO );
+    SGPath path(globals->get_fg_root());
+    path.append( "Geodata" );
+    path.append(aFileName);
+    flightgear::PolyLineList lines;
+    flightgear::SHPParser::parsePolyLines(path, aType, lines, areClosed);
+    flightgear::PolyLineList::iterator it;
+    for (it=lines.begin(); it != lines.end(); ++it) {
+        (*it)->addToSpatialIndex();
+    }
+}
+
+void loadNaturalEarthData()
+{
+    SGTimeStamp st;
+    st.stamp();
+
+    loadNaturalEarthFile("ne_10m_coastline.shp", flightgear::PolyLine::COASTLINE, false);
+    loadNaturalEarthFile("ne_10m_rivers_lake_centerlines.shp", flightgear::PolyLine::RIVER, false);
+    loadNaturalEarthFile("ne_10m_lakes.shp", flightgear::PolyLine::LAKE, true);
 
-    initQtResources(); // can't be called inside a namespaceb
+    qDebug() << "load basic data took" << st.elapsedMSec();
 
+
+    st.stamp();
+    loadNaturalEarthFile("ne_10m_urban_areas.shp", flightgear::PolyLine::URBAN, true);
+
+    qDebug() << "loading urban areas took:" << st.elapsedMSec();
+}
+
+bool runLauncherDialog()
+{
     // startup the nav-cache now. This pre-empts normal startup of
     // the cache, but no harm done. (Providing scenery paths are consistent)
 
@@ -364,6 +394,8 @@ bool runLauncherDialog()
     // will happen as normal
     http->init();
 
+    loadNaturalEarthData();
+
     // setup scenery paths now, especially TerraSync path for airport
     // parking locations (after they're downloaded)