예제 #1
0
void TiePointLayerImp::drawLabels(const vector<TiePoint>& points, double sceneSymbolSize,
                                  const int viewableBounds[4]) const
{
   double dRotation = 0.0;

   ViewImp* pView = dynamic_cast<ViewImp*>(getView());
   VERIFYNRV(pView != NULL);

   PerspectiveView* pPerspectiveView = dynamic_cast<PerspectiveView*>(pView);
   if (pPerspectiveView != NULL)
   {
      dRotation = pPerspectiveView->getRotation() * PI / 180.0;
   }

   double textScale = sceneSymbolSize / mSymbolSize;

   LocationType offset;
   sceneSymbolSize *= 1.2; // push the label off the symbol a little
   offset.mX = cos(dRotation) * sceneSymbolSize + 0.5;
   offset.mY = sin(dRotation) * sceneSymbolSize + 0.5;

   QFont font = QApplication::font();
   font.setBold(false);
   font.setPointSize(12);

   vector<TiePoint>::const_iterator pPoint;
   for (pPoint = points.begin(); pPoint != points.end(); ++pPoint)
   {
      LocationType point = getPoint(*pPoint);
      if (isInBounds(point, viewableBounds))
      {
         point += offset;

         QString strText;
         strText.sprintf("%d", pPoint-points.begin()+1);

         LocationType screenCoord;
         translateDataToScreen(point.mX, point.mY, screenCoord.mX, screenCoord.mY);

         int screenX = static_cast<int>(screenCoord.mX);
         int screenY = pView->height() - static_cast<int>(screenCoord.mY);
         pView->renderText(screenX, screenY, strText, font);
      }
   }
}
예제 #2
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();
}