コード例 #1
0
ファイル: Kml.cpp プロジェクト: Tom-VdE/opticks
void Kml::generateGroundOverlayLayer(Layer* pLayer, bool visible, int order, const Layer* pGeoLayer, int frame)
{
   VERIFYNRV(pGeoLayer != NULL && pLayer != NULL);
   PerspectiveView* pView = dynamic_cast<PerspectiveView*>(pLayer->getView());
   VERIFYNRV(pView != NULL);

   // block adding current actions to the view's undo buffer
   UndoLock lock(pView);
   double originalAngle = pView->getRotation();

   // get rotation for north up
   double angle(0.0);
   RasterElement* pRaster = dynamic_cast<RasterElement*>(pGeoLayer->getDataElement());  // get the primary raster element
   VERIFYNRV(GeoAlgorithms::getAngleToNorth(pRaster, pView, angle) != false);
   pView->rotateTo(angle);

   // since north up only rotates, check for left-right reversed
   LocationType ll, ul, ur, lr;
   pView->getVisibleCorners(ll, ul, ur, lr);
   bool imageFlipped(ll.mX > ur.mX);
   if (imageFlipped)
   {
      pView->flipHorizontal();
   }
   pView->refresh();

   XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* pGroundOverlay = mXml.addElement("GroundOverlay");
   mXml.pushAddPoint(pGroundOverlay);
   string name = pLayer->getDisplayName();
   if (name.empty())
   {
      name = pLayer->getName();
   }
   if (frame >= 0)
   {
      name += " frame " + StringUtilities::toDisplayString(frame+1);
   }
   mXml.addText(name, mXml.addElement("name"));
   mXml.addText(pLayer->getDisplayText(), mXml.addElement("description"));
   mXml.addText(visible ? "1" : "0", mXml.addElement("visibility"));
   mXml.addText(QString::number(order).toAscii().data(), mXml.addElement("drawOrder"));
   QString layerId = QString::fromStdString(pLayer->getId());
   if (mExportImages)
   {
      QByteArray bytes(5 * 1024 * 1024, '\0');
      QBuffer buffer(&bytes);
      QString fileName = layerId;
      if (frame >= 0)
      {
         fileName += QString("/frame%1").arg(frame);
         mXml.pushAddPoint(mXml.addElement("TimeStamp"));
         QDateTime dt = QDateTime::currentDateTime();
         dt.setTime(QTime(0, 0, frame));
         mXml.addText(dt.toString(Qt::ISODate).toStdString(), mXml.addElement("when"));
         mXml.popAddPoint();
      }
      fileName += ".png";
      if (ImageHandler::getSessionItemImage(pLayer, buffer, "PNG", frame))
      {
         mImages[fileName] = bytes;
         mXml.pushAddPoint(mXml.addElement("Icon"));
         mXml.addText(fileName.toStdString(), mXml.addElement("href"));
         mXml.popAddPoint();
      }
   }
   else
   {
      layerId = QUrl::toPercentEncoding(layerId);
      QString imageUrl(QString("http://localhost:%1/images/%2.png").arg(KMLServer::getSettingKmlServerPort()).arg(
         layerId));
      if (frame >= 0)
      {
         imageUrl += QString("?frame=%1").arg(frame);
         mXml.pushAddPoint(mXml.addElement("TimeStamp"));
         QDateTime dt = QDateTime::currentDateTime();
         dt.setTime(QTime(0, 0, frame));
         mXml.addText(dt.toString(Qt::ISODate).toStdString(), mXml.addElement("when"));
         mXml.popAddPoint();
      }
      mXml.pushAddPoint(mXml.addElement("Icon"));
      mXml.addText(imageUrl.toStdString(), mXml.addElement("href"));
      mXml.popAddPoint();
   }
   generateBoundingBox(pGeoLayer);

   // add ExtendedData
   const DynamicObject* pMeta = pLayer->getDataElement()->getMetadata();
   VERIFYNRV(pMeta);
   const DataVariant& ked(pMeta->getAttributeByPath("KML/ExtendedData"));
   if (ked.isValid())
   {
      std::string kedString = ked.toXmlString();
      XmlReader reader(Service<MessageLogMgr>()->getLog(), false);
      XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* kedDoc = reader.parseString(ked.toXmlString());
      if (kedDoc != NULL)
      {
         XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* pKedNode = kedDoc->getDocumentElement();
         if (pKedNode != NULL)
         {
            bool extraPop = false;
            if (std::string(A(pKedNode->getNodeName())) != "ExtendedData")
            {
               mXml.pushAddPoint(mXml.addElement("ExtendedData"));
               extraPop = true;
            }
            pKedNode = mXml.peekAddPoint()->getOwnerDocument()->importNode(pKedNode, true);
            mXml.peekAddPoint()->appendChild(pKedNode);
            if (extraPop)
            {
               mXml.popAddPoint();
            }
         }
      }
   }

   mXml.popAddPoint(); // GroundOverlay

   // restore original rotation
   if (imageFlipped)
   {
      pView->flipHorizontal();
   }
   pView->rotateTo(originalAngle);
   pView->refresh();
}