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