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); } } }
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(); }