修复了高德地图不显示的问题

Release-dev
chenzenghui 2025-05-02 13:19:00 +08:00
parent fa8395cdf2
commit 25c5a65f4b
17 changed files with 258 additions and 362 deletions

View File

@ -40,29 +40,17 @@ namespace LAMPMainWidget {
mUi->setupUi(dynamic_cast<QMainWindow*>(this)); mUi->setupUi(dynamic_cast<QMainWindow*>(this));
setupWindow(); setupWindow();
setupTaskWindow(); setupTaskWindow();
setupShowMessage();
this->show();// 强制显示窗口
setupLayers(); setupLayers();
setupStatusBar(); setupStatusBar();
setupActions(); setupActions();
setRightToolbox(); setRightToolbox();
mUi->panAction->trigger(); mUi->panAction->trigger();
mUi->layerList->setCurrentItem(mLayerList.first()); mUi->layerList->setCurrentItem(mLayerList.first());
this->show();// 强制显示窗口
// 绑定消息显示
RasterMessageShow::RasterWidgetMessageShow* messageshow = RasterMessageShow::RasterWidgetMessageShow::getInstance(this);
messageshow->bandingTextBrowserMessage(this->mUi->textBrowserMessage);
connect(mUi->actioncloseAllRasterFile, SIGNAL(triggered()), this, SLOT(onactioncloseAllRasterFile_triggered()));
this->mUi->toolBar->hide();
this->mUi->dockWidget_Map->hide();
this->mUi->dockWidget->hide();
this->mUi->statusbar->hide();
this->mUi->dockWidget_2->hide();
this->mUi->dockWidget_3->hide();
} }
RasterMainWidget::~RasterMainWidget() { RasterMainWidget::~RasterMainWidget() {
@ -74,8 +62,7 @@ namespace LAMPMainWidget {
delete mCenterLabel; delete mCenterLabel;
} }
void void RasterMainWidget::setupTaskWindow() {
RasterMainWidget::setupTaskWindow() {
mUi->taskTable->setColumnCount(5); mUi->taskTable->setColumnCount(5);
mUi->taskTable->setHorizontalHeaderLabels(QStringList{ mUi->taskTable->setHorizontalHeaderLabels(QStringList{
"名称", "范围", "zoom值", "数据源", "进度" "名称", "范围", "zoom值", "数据源", "进度"
@ -83,8 +70,7 @@ namespace LAMPMainWidget {
mUi->taskTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); mUi->taskTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
} }
void void RasterMainWidget::setupActions() {
RasterMainWidget::setupActions() {
mMapActionGroup->addAction(mUi->panAction); mMapActionGroup->addAction(mUi->panAction);
mMapActionGroup->addAction(mUi->zoomInAction); mMapActionGroup->addAction(mUi->zoomInAction);
mMapActionGroup->addAction(mUi->zoomOutAction); mMapActionGroup->addAction(mUi->zoomOutAction);
@ -157,11 +143,10 @@ namespace LAMPMainWidget {
} }
} }
void void RasterMainWidget::initMaps() {
RasterMainWidget::initMaps() { if (mMaps.isEmpty()) {
if (false&&mMaps.isEmpty()) {
mMaps = QHash<QString, MapLayer*>{ mMaps = QHash<QString, MapLayer*>{
{"Openstreet地图", new TmsLayer(OSTNormalMap, "ostnormalmap", mMapConvas)}, //{"Openstreet地图", new TmsLayer(OSTNormalMap, "ostnormalmap", mMapConvas)},
{"高德地图", new TmsLayer(GaodeNormapMap, "gaodenormalmap", mMapConvas)} {"高德地图", new TmsLayer(GaodeNormapMap, "gaodenormalmap", mMapConvas)}
}; };
} }
@ -188,6 +173,16 @@ namespace LAMPMainWidget {
} }
void RasterMainWidget::setupShowMessage()
{
// 绑定消息显示
RasterMessageShow::RasterWidgetMessageShow* messageshow = RasterMessageShow::RasterWidgetMessageShow::getInstance(this);
messageshow->bandingTextBrowserMessage(this->mUi->textBrowserMessage);
connect(mUi->actioncloseAllRasterFile, SIGNAL(triggered()), this, SLOT(onactioncloseAllRasterFile_triggered()));
}
QWidget* RasterMainWidget::spacerWiget(int width) const { QWidget* RasterMainWidget::spacerWiget(int width) const {
auto spacer = new QWidget{}; auto spacer = new QWidget{};
spacer->setHidden(true); spacer->setHidden(true);
@ -197,18 +192,15 @@ namespace LAMPMainWidget {
return spacer; return spacer;
} }
void void RasterMainWidget::panHandle(bool checked) {
RasterMainWidget::panHandle(bool checked) {
mMapConvas->selectTool(QString{ "pan_tool" }); mMapConvas->selectTool(QString{ "pan_tool" });
} }
void void RasterMainWidget::zoomInHandle(bool checked) {
RasterMainWidget::zoomInHandle(bool checked) {
mMapConvas->selectTool(QString{ "zoomin_tool" }); mMapConvas->selectTool(QString{ "zoomin_tool" });
} }
void void RasterMainWidget::zoomOutHandle(bool checked) {
RasterMainWidget::zoomOutHandle(bool checked) {
mMapConvas->selectTool(QString{ "zoomout_tool" }); mMapConvas->selectTool(QString{ "zoomout_tool" });
} }
@ -219,36 +211,30 @@ namespace LAMPMainWidget {
void void RasterMainWidget::sponsorHandle(bool checked) {
RasterMainWidget::sponsorHandle(bool checked) {
auto* window = new SponsorWindow(dynamic_cast<QWidget*>(this)); auto* window = new SponsorWindow(dynamic_cast<QWidget*>(this));
window->exec(); window->exec();
window->deleteLater(); window->deleteLater();
} }
void void RasterMainWidget::refreshHandle(bool checked) {
RasterMainWidget::refreshHandle(bool checked) {
mMapConvas->refreshMap(); mMapConvas->refreshMap();
} }
void void RasterMainWidget::selectHandle(bool checked) {
RasterMainWidget::selectHandle(bool checked) {
mMapConvas->selectTool(QString{ "select_tool" }); mMapConvas->selectTool(QString{ "select_tool" });
} }
void void RasterMainWidget::centerChangedHandle(LAMPMainWidget::PointXY pos) {
RasterMainWidget::centerChangedHandle(LAMPMainWidget::PointXY pos) {
mCenterText->setText(QString("lon:%1, lat:%2").arg(pos.x()).arg(pos.y())); mCenterText->setText(QString("lon:%1, lat:%2").arg(pos.x()).arg(pos.y()));
} }
void void RasterMainWidget::zoomChangedHandle(int zoom) {
RasterMainWidget::zoomChangedHandle(int zoom) {
mZoomText->setText(QString("%1").arg(zoom)); mZoomText->setText(QString("%1").arg(zoom));
mScaleText->setText(QString("1cm:%1m").arg(this->mMapConvas->scale())); mScaleText->setText(QString("1cm:%1m").arg(this->mMapConvas->scale()));
} }
void void RasterMainWidget::clickedHandle(LAMPMainWidget::PointXY pos) {
RasterMainWidget::clickedHandle(LAMPMainWidget::PointXY pos) {
QString posText = QString("%1, %2").arg(pos.x()).arg(pos.y()); QString posText = QString("%1, %2").arg(pos.x()).arg(pos.y());
if (mSetLeftTop) { if (mSetLeftTop) {
mUi->leftTopText->setText(posText); mUi->leftTopText->setText(posText);
@ -260,23 +246,20 @@ namespace LAMPMainWidget {
} }
} }
void void RasterMainWidget::leftTopClickedHandle() {
RasterMainWidget::leftTopClickedHandle() {
mSetLeftTop = true; mSetLeftTop = true;
mUi->selectAction->trigger(); mUi->selectAction->trigger();
} }
void void RasterMainWidget::rightBottomClickedHandle() {
RasterMainWidget::rightBottomClickedHandle() {
mSetLeftTop = false; mSetLeftTop = false;
mUi->selectAction->trigger(); mUi->selectAction->trigger();
} }
void void RasterMainWidget::layerChanged(QListWidgetItem* current, QListWidgetItem* previous) {
RasterMainWidget::layerChanged(QListWidgetItem* current, QListWidgetItem* previous) {
auto mapName = current->text(); auto mapName = current->text();
if (!mMaps.contains(mapName)) { if (!mMaps.contains(mapName)) {
qDebug() << mapName << "不支持"; qDebug() << mapName << u8"不支持";
return; return;
} }
@ -284,7 +267,7 @@ namespace LAMPMainWidget {
auto i = mMaps.begin(); auto i = mMaps.begin();
for (; i != mMaps.end(); ++i) { for (; i != mMaps.end(); ++i) {
if (i.key() == mapName) { if (i.key() == mapName) {
i.value()->setVisiblity(true); i.value()->setVisiblity(true); // 切换图层为显示模式
qDebug() << i.key() << i.value()->isVisible(); qDebug() << i.key() << i.value()->isVisible();
continue; continue;
} }
@ -292,23 +275,21 @@ namespace LAMPMainWidget {
i.value()->setVisiblity(false); i.value()->setVisiblity(false);
} }
mMapConvas->addLayer(layer); mMapConvas->addLayer(layer);//图层开始显示
mMapConvas->setCurrentLayer(layer->id()); mMapConvas->setCurrentLayer(layer->id());
mMapConvas->refreshMap(); mMapConvas->refreshMap();//刷新地图
zoomChangedHandle(mMapConvas->zoomValue()); zoomChangedHandle(mMapConvas->zoomValue());// 更新zoom值
centerChangedHandle(mMapConvas->mapCenter()); centerChangedHandle(mMapConvas->mapCenter());// 更新中心坐标
} }
void void RasterMainWidget::createDownloadTask() {
RasterMainWidget::createDownloadTask() {
auto taskWindow = new TaskWindow(dynamic_cast<QWidget*>(this)); auto taskWindow = new TaskWindow(dynamic_cast<QWidget*>(this));
taskWindow->exec(); taskWindow->exec();
taskWindow->deleteLater(); taskWindow->deleteLater();
} }
void void RasterMainWidget::changeTaskTable(int row, int col, QString text) {
RasterMainWidget::changeTaskTable(int row, int col, QString text) {
mUi->taskTable->takeItem(row, col); mUi->taskTable->takeItem(row, col);
mUi->taskTable->setItem(row, col, new QTableWidgetItem(text)); mUi->taskTable->setItem(row, col, new QTableWidgetItem(text));
} }
@ -325,14 +306,14 @@ namespace LAMPMainWidget {
mMapConvas->selectTool("addplane_tool"); mMapConvas->selectTool("addplane_tool");
} }
void RasterMainWidget::onactioncloseAllRasterFile_triggered() void RasterMainWidget::onactioncloseAllRasterFile_triggered()
{ {
CloseAllGDALRaster(); CloseAllGDALRaster();
} }
QTableWidget* RasterMainWidget::getTaskTable() QTableWidget* RasterMainWidget::getTaskTable()
{ {
return this->mUi->taskTable; return this->mUi->taskTable;
} }
} }

View File

@ -44,7 +44,7 @@ namespace LAMPMainWidget {
void initMaps(); void initMaps();
void setRightToolbox(); void setRightToolbox();
void initToolbox(); void initToolbox();
void setupShowMessage();
protected: protected:
/// 各处处理函数 /// 各处处理函数
@ -75,7 +75,7 @@ namespace LAMPMainWidget {
void onactioncloseAllRasterFile_triggered(); void onactioncloseAllRasterFile_triggered();
private: private:
Ui::RasterMainWidget* mUi; Ui::RasterMainWidget* mUi;
MapCanvas* mMapConvas; MapCanvas* mMapConvas;//地图容器
QLineEdit* mScaleText; QLineEdit* mScaleText;
QLabel* mScaleLabel; QLabel* mScaleLabel;
QLineEdit* mCenterText; QLineEdit* mCenterText;

View File

@ -12,8 +12,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>898</width> <width>906</width>
<height>580</height> <height>609</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -84,8 +84,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>898</width> <width>906</width>
<height>22</height> <height>23</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="projectMenu"> <widget class="QMenu" name="projectMenu">
@ -117,11 +117,15 @@
<property name="title"> <property name="title">
<string>工具</string> <string>工具</string>
</property> </property>
<addaction name="actioncloseAllRasterFile"/>
</widget> </widget>
<widget class="QMenu" name="helpMenu"> <widget class="QMenu" name="helpMenu">
<property name="title"> <property name="title">
<string>帮助</string> <string>帮助</string>
</property> </property>
<addaction name="tutorialAction"/>
<addaction name="srcAction"/>
<addaction name="separator"/> <addaction name="separator"/>
</widget> </widget>
<addaction name="projectMenu"/> <addaction name="projectMenu"/>
@ -134,9 +138,6 @@
</widget> </widget>
<widget class="QStatusBar" name="statusbar"/> <widget class="QStatusBar" name="statusbar"/>
<widget class="QToolBar" name="toolBar"> <widget class="QToolBar" name="toolBar">
<property name="enabled">
<bool>false</bool>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>toolBar</string> <string>toolBar</string>
</property> </property>
@ -378,85 +379,11 @@ p, li { white-space: pre-wrap; }
</layout> </layout>
</widget> </widget>
</widget> </widget>
<widget class="QDockWidget" name="dockWidget_Map"> <action name="actioncloseAllRasterFile">
<property name="layoutDirection"> <property name="text">
<enum>Qt::LeftToRight</enum> <string>释放影像文件</string>
</property> </property>
<property name="windowTitle"> </action>
<string>地图窗口</string>
</property>
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="QWidget" name="dockWidgetContents_5">
<widget class="QTabWidget" name="tabWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>502</width>
<height>274</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="mapTab">
<attribute name="title">
<string>地图</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QGridLayout" name="mapCanvasLayout"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="taskTab">
<attribute name="title">
<string>任务</string>
</attribute>
<widget class="QWidget" name="gridLayoutWidget_5">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1431</width>
<height>871</height>
</rect>
</property>
<layout class="QGridLayout" name="taskLayout">
<item row="0" column="0">
<widget class="QTableWidget" name="taskTable"/>
</item>
</layout>
</widget>
</widget>
</widget>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>906</width>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="toolsMenu">
<property name="title">
<string>工具</string>
</property>
<addaction name="actioncloseAllRasterFile"/>
</widget>
<addaction name="toolsMenu"/>
</widget>
<action name="tutorialAction"> <action name="tutorialAction">
<property name="text"> <property name="text">
<string>使用教程</string> <string>使用教程</string>
@ -593,11 +520,6 @@ p, li { white-space: pre-wrap; }
<string>飞机</string> <string>飞机</string>
</property> </property>
</action> </action>
<action name="actioncloseAllRasterFile">
<property name="text">
<string>释放影像文件</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="../RasterMainWidgetGUI.qrc"/> <include location="../RasterMainWidgetGUI.qrc"/>

View File

@ -9,8 +9,7 @@ namespace LAMPMainWidget {
initCache(); initCache();
} }
QString QString GaodeNormalProvider::tileUrl(const LAMPMainWidget::PointXY& pos, int zoom) const {
GaodeNormalProvider::tileUrl(const LAMPMainWidget::PointXY& pos, int zoom) const {
QString urlFmt = { R"(http://wprd01.is.autonavi.com/appmaptile?style=6&x=%1&y=%2&z=%3)" }; QString urlFmt = { R"(http://wprd01.is.autonavi.com/appmaptile?style=6&x=%1&y=%2&z=%3)" };
return QString(urlFmt).arg(pos.x()).arg(pos.y()).arg(zoom); return QString(urlFmt).arg(pos.x()).arg(pos.y()).arg(zoom);

View File

@ -84,8 +84,7 @@ namespace LAMPMainWidget {
setZoomValue(zoom); setZoomValue(zoom);
} }
void void MapCanvas::resizeEvent(QResizeEvent* event) {
MapCanvas::resizeEvent(QResizeEvent* event) {
updateViewExtent(true); updateViewExtent(true);
} }
@ -97,19 +96,17 @@ namespace LAMPMainWidget {
QGraphicsView::mouseMoveEvent(event); QGraphicsView::mouseMoveEvent(event);
} }
void void MapCanvas::refreshMap() {
MapCanvas::refreshMap() {
QMapIterator<QString, MapLayer*> iterator(mLayers); QMapIterator<QString, MapLayer*> iterator(mLayers);
while (iterator.hasNext()) { while (iterator.hasNext()) {
iterator.next(); iterator.next();
iterator.value()->map()->setViewExtent(mViewExtent); iterator.value()->map()->setViewExtent(mViewExtent);//设置当前图层的可视范围
iterator.value()->update(); iterator.value()->update();//更新当前图层的显示内容
} }
mScene->update(); mScene->update();
} }
void void MapCanvas::addLayer(MapLayer* const layer) {
MapCanvas::addLayer(MapLayer* const layer) {
if (!layer) if (!layer)
return; return;
@ -119,15 +116,14 @@ namespace LAMPMainWidget {
} }
mLayers.insert(layer->id(), layer); mLayers.insert(layer->id(), layer);
if (mLayers.count() == 1) { if (mLayers.count() == 1) {//判断是否是第唯一个图层
setCurrentLayer(layer->id()); setCurrentLayer(layer->id());
} }
mScene->addItem(layer->map()); mScene->addItem(layer->map());//将当前图层添加到场景中
refreshMap(); refreshMap();
} }
void void MapCanvas::setZoomValue(const int zoom) {
MapCanvas::setZoomValue(const int zoom) {
mZoomValue = normalizeZoom(zoom); mZoomValue = normalizeZoom(zoom);
zoomChanged(mZoomValue); zoomChanged(mZoomValue);
@ -142,8 +138,7 @@ namespace LAMPMainWidget {
updateViewExtent(true); updateViewExtent(true);
} }
void void MapCanvas::updateViewExtent(bool reset) {
MapCanvas::updateViewExtent(bool reset) {
if (!mCurrentLayer) { if (!mCurrentLayer) {
qDebug() << "未设置当前图层,视图区域无法更新"; qDebug() << "未设置当前图层,视图区域无法更新";
return; return;
@ -161,7 +156,7 @@ namespace LAMPMainWidget {
mViewExtent.translate(offset.x(), offset.y()); mViewExtent.translate(offset.x(), offset.y());
} }
else { else {
qDebug() << "视图区域更新 平移范围 x ,y "<<-mDragRect.width()<<" , "<<-mDragRect.height() ; qDebug() << "视图区域更新 平移范围 x ,y " << -mDragRect.width() << " , " << -mDragRect.height();
/// 视图偏移并重置偏移属性 /// 视图偏移并重置偏移属性
mViewExtent.translate(-mDragRect.width(), -mDragRect.height()); mViewExtent.translate(-mDragRect.width(), -mDragRect.height());
mDragRect.setRect(0, 0, 0, 0); mDragRect.setRect(0, 0, 0, 0);
@ -178,33 +173,29 @@ namespace LAMPMainWidget {
refreshMap(); refreshMap();
} }
void void MapCanvas::setCrs(const CRS* const crs) {
MapCanvas::setCrs(const CRS* const crs) {
mCrs = crs; mCrs = crs;
crsChanged(); crsChanged();
updateViewExtent(true); updateViewExtent(true);
} }
void void MapCanvas::setCurrentLayer(const QString& id) {
MapCanvas::setCurrentLayer(const QString& id) {
if (!mLayers.contains(id)) { if (!mLayers.contains(id)) {
qWarning() << "未添加图层=>" << id; qWarning() << "未添加图层=>" << id;
return; return;
} }
mCurrentLayer = mLayers[id]; mCurrentLayer = mLayers[id];
if (!mCrs) { if (!mCrs) {
setCrs(&mCurrentLayer->crs()); setCrs(&mCurrentLayer->crs());//设置当前图层的坐标系,后期考虑继续拆分
} }
updateViewExtent(true); updateViewExtent(true);// 更新视图区域
} }
double double MapCanvas::scale() const {
MapCanvas::scale() const {
return logicalDpiX() * resolution() * 39.37 / 100;; return logicalDpiX() * resolution() * 39.37 / 100;;
} }
double double MapCanvas::resolution() const {
MapCanvas::resolution() const {
if (!mCurrentLayer) { if (!mCurrentLayer) {
qWarning() << "未设置当前图层,无法获取分辨率"; qWarning() << "未设置当前图层,无法获取分辨率";
return 0; return 0;
@ -213,8 +204,7 @@ namespace LAMPMainWidget {
return mCurrentLayer->resolution(); return mCurrentLayer->resolution();
} }
int int MapCanvas::zoomValue() const {
MapCanvas::zoomValue() const {
if (!mCurrentLayer) { if (!mCurrentLayer) {
qWarning() << "未设置当前图层默认返回zoom值为0"; qWarning() << "未设置当前图层默认返回zoom值为0";
return 0; return 0;
@ -223,8 +213,7 @@ namespace LAMPMainWidget {
return mCurrentLayer->zoomValue(); return mCurrentLayer->zoomValue();
} }
int int MapCanvas::normalizeZoom(const int zoom) const {
MapCanvas::normalizeZoom(const int zoom) const {
int z{}; int z{};
if (zoom <= kMinZoomValue) { if (zoom <= kMinZoomValue) {
z = kMinZoomValue; z = kMinZoomValue;
@ -239,8 +228,7 @@ namespace LAMPMainWidget {
return z; return z;
} }
PointXY PointXY MapCanvas::pixel2Lonlat(const QPointF& point) const {
MapCanvas::pixel2Lonlat(const QPointF& point) const {
QPointF scenePoint = mapToScene(QPoint{ static_cast<int>(point.x()), static_cast<int>(point.y()) }); QPointF scenePoint = mapToScene(QPoint{ static_cast<int>(point.x()), static_cast<int>(point.y()) });
QPointF mapPoint{ scenePoint.x() * resolution(), scenePoint.y() * resolution() }; QPointF mapPoint{ scenePoint.x() * resolution(), scenePoint.y() * resolution() };
PointXY crsPoint = mCrs->inverse(PointXY{ mapPoint }); PointXY crsPoint = mCrs->inverse(PointXY{ mapPoint });
@ -248,8 +236,7 @@ namespace LAMPMainWidget {
return crsPoint; return crsPoint;
} }
bool bool MapCanvas::selectTool(const QString& tool) {
MapCanvas::selectTool(const QString& tool) {
if (!mMapTools.contains(tool)) { if (!mMapTools.contains(tool)) {
qWarning() << QString("%1工具不存在").arg(tool); qWarning() << QString("%1工具不存在").arg(tool);
return false; return false;
@ -274,8 +261,7 @@ namespace LAMPMainWidget {
} }
} }
void void MapCanvas::setupTools() {
MapCanvas::setupTools() {
auto panTool = new MapToolPan(this); auto panTool = new MapToolPan(this);
mMapTools.insert(panTool->id(), panTool); mMapTools.insert(panTool->id(), panTool);

View File

@ -162,7 +162,7 @@ namespace LAMPMainWidget {
void mouseMoveEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override;
protected: protected:
QGraphicsScene* mScene; QGraphicsScene* mScene; // 场景对象
QRectF mMapExtent; QRectF mMapExtent;
QRectF mViewExtent; QRectF mViewExtent;
QRectF mDragRect; QRectF mDragRect;

View File

@ -10,16 +10,20 @@
namespace LAMPMainWidget { namespace LAMPMainWidget {
void /// <summary>
MapCanvasMap::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { /// 重写paint函数绘制图层的内容
/// </summary>
/// <param name="painter"></param>
/// <param name="option"></param>
/// <param name="widget"></param>
void MapCanvasMap::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
if (!mLayer->provider().hasContent()) { if (!mLayer->provider().hasContent()) {
return; return;
} }
painter->drawImage(mViewExtent.topLeft(), mLayer->provider().preparedImage()); painter->drawImage(mViewExtent.topLeft(), mLayer->provider().preparedImage());
} }
QRectF QRectF MapCanvasMap::boundingRect() const {
MapCanvasMap::boundingRect() const {
auto width = mViewExtent.size().width(); auto width = mViewExtent.size().width();
auto height = mViewExtent.size().height(); auto height = mViewExtent.size().height();
return mViewExtent + QMarginsF(1024, 1024, 1024, 1024); return mViewExtent + QMarginsF(1024, 1024, 1024, 1024);

View File

@ -16,7 +16,7 @@ class MapCanvasMap : public QGraphicsItem {
~MapCanvasMap() override = default; ~MapCanvasMap() override = default;
public: public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; //图层绘制函数
QRectF boundingRect() const override; QRectF boundingRect() const override;

View File

@ -5,30 +5,28 @@
namespace LAMPMainWidget { namespace LAMPMainWidget {
size_t size_t writeData(void* content, size_t size, size_t nmemb, void* userp) {
writeData(void *content, size_t size, size_t nmemb, void *userp) { size_t realSize{ size * nmemb };
size_t realSize{size * nmemb}; auto userRes = static_cast<QByteArray*>(userp);
auto userRes = static_cast<QByteArray *>(userp);
if (!userRes) { if (!userRes) {
qDebug() << "无效的数据存储对象"; qDebug() << "无效的数据存储对象";
return 0; return 0;
} }
userRes->append(static_cast<char *>(content), int(realSize)); userRes->append(static_cast<char*>(content), int(realSize));
return realSize; return realSize;
} }
const QString Network::kUserAgent{"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"}; const QString Network::kUserAgent{ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0" };
QByteArray QByteArray Network::httpRequest(const QString& url) {
Network::httpRequest(const QString &url) {
QByteArray result{}; QByteArray result{};
if (url.isEmpty()) { if (url.isEmpty()) {
qDebug() << QString("url为空"); qDebug() << QString("url为空");
return result; return result;
} }
CURL *curl = curl_easy_init(); CURL* curl = curl_easy_init();
if (!curl) { if (!curl) {
qDebug() << "无法初始化curl句柄"; qDebug() << "无法初始化curl句柄";
return result; return result;
@ -48,19 +46,18 @@ Network::httpRequest(const QString &url) {
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
return result; return result;
} }
QByteArray QByteArray Network::httpsRequest(const QString& url) {
Network::httpsRequest(const QString &url) {
QByteArray result{}; QByteArray result{};
if (url.isEmpty()) { if (url.isEmpty()) {
qDebug() << QString("url为空"); qDebug() << QString(u8"url为空");
return result; return result;
} }
CURL *curl = curl_easy_init(); CURL* curl = curl_easy_init();
if (!curl) { if (!curl) {
qDebug() << "无法初始化curl句柄"; qDebug() << u8"无法初始化curl句柄";
return result; return result;
} }
@ -73,13 +70,13 @@ Network::httpsRequest(const QString &url) {
CURLcode res = curl_easy_perform(curl); CURLcode res = curl_easy_perform(curl);
if (CURLE_OK != res) { if (CURLE_OK != res) {
qDebug() << QString("%1 =>请求异常, %2").arg(url).arg(curl_easy_strerror(res)); qDebug() << QString(u8"%1 =>请求异常, %2").arg(url).arg(curl_easy_strerror(res));
result.clear(); // 请求失败时,清空接受到的数据 result.clear(); // 请求失败时,清空接受到的数据
} }
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
return result; return result;
} }
} }

View File

@ -17,8 +17,7 @@
namespace LAMPMainWidget namespace LAMPMainWidget
{ {
void void DownloadTask::run()
DownloadTask::run()
{ {
auto currentLayer = dynamic_cast<const TmsLayer*>(mTaskInfo.layer); auto currentLayer = dynamic_cast<const TmsLayer*>(mTaskInfo.layer);
auto provider = dynamic_cast<const TmsProvider*>(&currentLayer->provider()); auto provider = dynamic_cast<const TmsProvider*>(&currentLayer->provider());
@ -53,14 +52,13 @@ namespace LAMPMainWidget
double progress = static_cast<double>(completed) / count; double progress = static_cast<double>(completed) / count;
auto progessStr = QString("%1").arg(progress * 100); auto progessStr = QString("%1").arg(progress * 100);
mTaskInfo.display->takeItem(mRowId, 4); mTaskInfo.display->takeItem(mRowId, 4);
mTaskInfo.display->setItem(mRowId, 4,new QTableWidgetItem(QString("%1").arg(progress * 100))); mTaskInfo.display->setItem(mRowId, 4, new QTableWidgetItem(QString("%1").arg(progress * 100)));
// mTaskInfo.display->resizeColumnsToContents(); // mTaskInfo.display->resizeColumnsToContents();
// mTaskInfo.display->horizontalHeader()->setStretchLastSection(true); // mTaskInfo.display->horizontalHeader()->setStretchLastSection(true);
} }
} }
void void DownloadTask::generateCommonRow()
DownloadTask::generateCommonRow()
{ {
auto provider = dynamic_cast<const TmsProvider*>(&mTaskInfo.layer->provider()); auto provider = dynamic_cast<const TmsProvider*>(&mTaskInfo.layer->provider());
mRowId = mTaskInfo.display->rowCount(); mRowId = mTaskInfo.display->rowCount();
@ -71,24 +69,21 @@ namespace LAMPMainWidget
mTaskInfo.display->setItem(mRowId, 3, new QTableWidgetItem(provider->id())); mTaskInfo.display->setItem(mRowId, 3, new QTableWidgetItem(provider->id()));
} }
void void DownloadTask::generateErrorRow()
DownloadTask::generateErrorRow()
{ {
generateCommonRow(); generateCommonRow();
mTaskInfo.display->setItem(mRowId, 4, new QTableWidgetItem("任务新建失败")); mTaskInfo.display->setItem(mRowId, 4, new QTableWidgetItem("任务新建失败"));
mTaskInfo.display->resizeColumnsToContents(); mTaskInfo.display->resizeColumnsToContents();
} }
void void DownloadTask::generateSuccessRow()
DownloadTask::generateSuccessRow()
{ {
generateCommonRow(); generateCommonRow();
mTaskInfo.display->setItem(mRowId, 4, new QTableWidgetItem("0.0%")); mTaskInfo.display->setItem(mRowId, 4, new QTableWidgetItem("0.0%"));
mTaskInfo.display->resizeColumnsToContents(); mTaskInfo.display->resizeColumnsToContents();
} }
QString QString DownloadTask::getExtentStr()
DownloadTask::getExtentStr()
{ {
auto leftTop = mTaskInfo.extent.topLeft(); auto leftTop = mTaskInfo.extent.topLeft();
auto rightBottom = mTaskInfo.extent.bottomRight(); auto rightBottom = mTaskInfo.extent.bottomRight();
@ -112,8 +107,7 @@ namespace LAMPMainWidget
delete mUi; delete mUi;
} }
void void TaskWindow::setupWindow()
TaskWindow::setupWindow()
{ {
setFixedSize(size()); setFixedSize(size());
auto currentLayer = dynamic_cast<const TmsLayer*>(mParent->mMapConvas->currentLayer()); auto currentLayer = dynamic_cast<const TmsLayer*>(mParent->mMapConvas->currentLayer());
@ -129,8 +123,7 @@ namespace LAMPMainWidget
QString("%1, %2").arg(mParent->mRightBottom.x()).arg(mParent->mRightBottom.y())); QString("%1, %2").arg(mParent->mRightBottom.x()).arg(mParent->mRightBottom.y()));
} }
void void TaskWindow::setupAction()
TaskWindow::setupAction()
{ {
QObject::connect(mUi->exitBtn, &QPushButton::clicked, this, &TaskWindow::close); QObject::connect(mUi->exitBtn, &QPushButton::clicked, this, &TaskWindow::close);
QObject::connect(mUi->createBtn, &QPushButton::clicked, this, &TaskWindow::createTask); QObject::connect(mUi->createBtn, &QPushButton::clicked, this, &TaskWindow::createTask);
@ -140,8 +133,7 @@ namespace LAMPMainWidget
this, &TaskWindow::setupZoomValue); this, &TaskWindow::setupZoomValue);
} }
void void TaskWindow::createTask()
TaskWindow::createTask()
{ {
if (!taskInfoCheck()) { if (!taskInfoCheck()) {
return; return;
@ -162,12 +154,11 @@ namespace LAMPMainWidget
close(); close();
} }
void void TaskWindow::setupSaveDir()
TaskWindow::setupSaveDir()
{ {
auto saveDir = QFileDialog::getExistingDirectory(dynamic_cast<QWidget*>(this), "存储路径选择"); auto saveDir = QFileDialog::getExistingDirectory(dynamic_cast<QWidget*>(this), "存储路径选择");
if (saveDir.isEmpty()) { if (saveDir.isEmpty()) {
qWarning() << "未选择存储路径"; qWarning() << u8"未选择存储路径";
return; return;
} }
@ -175,15 +166,13 @@ namespace LAMPMainWidget
mUi->saveDirText->setText(mSavePath); mUi->saveDirText->setText(mSavePath);
} }
void void TaskWindow::setupTaskName(const QString& text)
TaskWindow::setupTaskName(const QString& text)
{ {
qDebug() << "任务名=>" << text; qWarning() << u8"任务名=>" << text;
mTaskName = text; mTaskName = text;
} }
bool bool TaskWindow::taskInfoCheck()
TaskWindow::taskInfoCheck()
{ {
if (mTaskName.isEmpty()) { if (mTaskName.isEmpty()) {
QMessageBox::critical(dynamic_cast<QWidget*>(this), "错误", "任务名称为空"); QMessageBox::critical(dynamic_cast<QWidget*>(this), "错误", "任务名称为空");
@ -198,11 +187,10 @@ namespace LAMPMainWidget
return true; return true;
} }
void void TaskWindow::setupZoomValue(int index)
TaskWindow::setupZoomValue(int index)
{ {
auto zoom = mUi->zoomValueCbx->itemData(index).toInt(); auto zoom = mUi->zoomValueCbx->itemData(index).toInt();
qDebug() << "设置下载任务zoom值=>" << zoom; qWarning() << u8"设置下载任务zoom值=>" << zoom;
mZoomValue = zoom; mZoomValue = zoom;
} }
} }

View File

@ -18,8 +18,7 @@ namespace LAMPMainWidget {
setProvider(TmsProviderFactory::create(provider)); setProvider(TmsProviderFactory::create(provider));
} }
double double TmsLayer::resolution() const {
TmsLayer::resolution() const {
auto pd = dynamic_cast<const TmsProvider*>(&provider()); auto pd = dynamic_cast<const TmsProvider*>(&provider());
auto sz = pd->tileSize(); auto sz = pd->tileSize();
double length = crs().extent().width(); double length = crs().extent().width();
@ -32,8 +31,7 @@ namespace LAMPMainWidget {
return result; return result;
} }
QRectF QRectF TmsLayer::extent() const {
TmsLayer::extent() const {
auto pd = dynamic_cast<const TmsProvider*>(&provider()); auto pd = dynamic_cast<const TmsProvider*>(&provider());
QSize sz = pd->tileSize(); QSize sz = pd->tileSize();
@ -41,14 +39,13 @@ namespace LAMPMainWidget {
int height = power2(zoomValue()) * sz.height(); int height = power2(zoomValue()) * sz.height();
//#ifdef DEBUG //#ifdef DEBUG
// qDebug() << "layer extent=>{width:" << width << ", height:" << height << "}"; qDebug() << "layer extent=>{width:" << width << ", height:" << height << "}";
//#endif //#endif
return { 0, 0, static_cast<qreal>(width), static_cast<qreal>(height) }; return { 0, 0, static_cast<qreal>(width), static_cast<qreal>(height) };
} }
void void TmsLayer::setZoomValue(int zoom) {
TmsLayer::setZoomValue(int zoom) {
int zoomValue{}; int zoomValue{};
if (zoom <= minZoom()) { if (zoom <= minZoom()) {
zoomValue = minZoom(); zoomValue = minZoom();
@ -63,8 +60,7 @@ namespace LAMPMainWidget {
mZoomValue = zoomValue; mZoomValue = zoomValue;
} }
bool bool TmsLayer::parseTiles(const QRectF& rect, int zoom, QHash<QPoint, QString>& tiles, QSize& size) const {
TmsLayer::parseTiles(const QRectF& rect, int zoom, QHash<QPoint, QString>& tiles, QSize& size) const {
auto pd = dynamic_cast<const TmsProvider*>(&provider()); auto pd = dynamic_cast<const TmsProvider*>(&provider());
auto tileSize = pd->tileSize(); auto tileSize = pd->tileSize();
@ -80,7 +76,7 @@ namespace LAMPMainWidget {
auto yMin = qFloor(mapLeftTop.y() / tileSize.height()); auto yMin = qFloor(mapLeftTop.y() / tileSize.height());
auto yMax = qFloor(mapRightBottom.y() / tileSize.height()); auto yMax = qFloor(mapRightBottom.y() / tileSize.height());
if ((xMin > xMax) || (yMin > yMax)) { if ((xMin > xMax) || (yMin > yMax)) {
qDebug() << "下载区边界错误"; qDebug() << u8"下载区边界错误";
return false; return false;
} }

View File

@ -4,26 +4,32 @@
#include <QDir> #include <QDir>
#include <QSqlQuery> #include <QSqlQuery>
#include <QSqlError> #include <QSqlError>
#include <QPointer>
#include <tmsprovider.h> #include <tmsprovider.h>
#include <network.h> #include <network.h>
#include <iostream>
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
namespace LAMPMainWidget namespace LAMPMainWidget
{ {
TileDownloadTask::TileDownloadTask(TileInfo tile, QObject* parent) TileDownloadTask::TileDownloadTask(TileInfo tile, tileReadyCallback cb, QObject* parent)
: QObject(parent), : QObject(parent),
mTile(std::move(tile)) mTile(std::move(tile)),
mCallback(cb)
{ {
// 程序初始化时注册如main函数或类构造函数
qRegisterMetaType<TileInfo>("TileInfo");
} }
void void TileDownloadTask::run()
TileDownloadTask::run()
{ {
Network web{}; Network web{};
QByteArray data = web.httpsRequest(mTile.url); QByteArray data = web.httpsRequest(mTile.url);
mTile.data = data; mTile.data = data;
tileReady(mTile); if (mCallback) {
mCallback(mTile);
}
else {}
} }
TmsProvider::TmsProvider(QObject* parent) TmsProvider::TmsProvider(QObject* parent)
@ -42,13 +48,12 @@ namespace LAMPMainWidget
delete mImage; delete mImage;
} }
bool bool TmsProvider::initCache()
TmsProvider::initCache()
{ {
mDbConn = QSqlDatabase::addDatabase("QSQLITE", id()); mDbConn = QSqlDatabase::addDatabase("QSQLITE", id());
mDbConn.setDatabaseName(mDbName); mDbConn.setDatabaseName(mDbName);
if (!mDbConn.open()) { if (!mDbConn.open()) {
qCritical() << "缓存数据库打开失败"; std::cout << u8"缓存数据库打开失败";
return false; return false;
} }
@ -71,8 +76,7 @@ namespace LAMPMainWidget
return true; return true;
} }
QByteArray QByteArray TmsProvider::getCache(const QPoint& pos, int zoom)
TmsProvider::getCache(const QPoint& pos, int zoom)
{ {
QByteArray res{}; QByteArray res{};
mDbConn.open(); mDbConn.open();
@ -87,7 +91,7 @@ namespace LAMPMainWidget
select.bindValue(":zoom", zoom); select.bindValue(":zoom", zoom);
select.bindValue(":position", QString("%1:%2").arg(pos.x()).arg(pos.y())); select.bindValue(":position", QString("%1:%2").arg(pos.x()).arg(pos.y()));
if (!select.exec()) { if (!select.exec()) {
qDebug() << pos << "查询失败=>" << select.lastError().text(); std::cout << pos.x()<<","<<pos.y() << "查询失败=>" << select.lastError().text().toUtf8().constData() << std::endl;
mDbConn.close(); mDbConn.close();
return res; return res;
} }
@ -101,11 +105,10 @@ namespace LAMPMainWidget
return res; return res;
} }
bool bool TmsProvider::addCache(const QPoint& pos, int zoom, QByteArray data)
TmsProvider::addCache(const QPoint& pos, int zoom, QByteArray data)
{ {
if (data.isEmpty()) { if (data.isEmpty()) {
qWarning() << "瓦片数据为空"; std::cout << "瓦片数据为空";
return false; return false;
} }
mDbConn.open(); mDbConn.open();
@ -121,7 +124,7 @@ namespace LAMPMainWidget
sql.bindValue(":data", data); sql.bindValue(":data", data);
if (!sql.exec()) { if (!sql.exec()) {
qCritical() << pos << "=>" << sql.lastError().text(); std::cout << pos.x() << "," << pos.y() << "=>" << sql.lastError().text().toUtf8().constData() << std::endl;
mDbConn.close(); mDbConn.close();
return false; return false;
} }
@ -130,15 +133,13 @@ namespace LAMPMainWidget
return true; return true;
} }
bool bool TmsProvider::cacheContains(const QPoint& pos, int zoom)
TmsProvider::cacheContains(const QPoint& pos, int zoom)
{ {
QByteArray res = getCache(pos, zoom); QByteArray res = getCache(pos, zoom);
return !res.isEmpty(); return !res.isEmpty();
} }
void void TmsProvider::createTask(const QRectF& rect, int zoom)
TmsProvider::createTask(const QRectF& rect, int zoom)
{ {
newImage(rect); newImage(rect);
@ -164,16 +165,30 @@ namespace LAMPMainWidget
tileReady(tile); tileReady(tile);
continue; continue;
} }
/* 原始写法遇到了跨线程信号槽失效问题,这里修改为回调函数方式
auto* task = new TileDownloadTask(tile); auto* task = new TileDownloadTask(tile);
QObject::connect(task, &TileDownloadTask::tileReady, this, &TmsProvider::tileReady); if (!QObject::connect(task, SIGNAL(tileReady(TileInfo)), this, SLOT(tileReady(TileInfo)))) {
qDebug() << "连接失败:" << QObject::tr(qPrintable(Q_FUNC_INFO));
}
QThreadPool::globalInstance()->start(task); QThreadPool::globalInstance()->start(task);
*/
// 回调函数版本
QPointer<TmsProvider> safeThis(this);
auto* task = new TileDownloadTask(tile, [safeThis]( TileInfo info) {
if (safeThis) { // 自动检测对象是否存活
QMetaObject::invokeMethod(safeThis.data(), [safeThis, info] {
safeThis->tileReady(info);
}, Qt::QueuedConnection); // 强制主线程执行[6](@ref)
}
});
QThreadPool::globalInstance()->start(task);
} }
} }
} }
void void TmsProvider::tileReady(TileInfo tile)
TmsProvider::tileReady(TileInfo tile)
{ {
if (!cacheContains(tile.position, tile.zoom)) { if (!cacheContains(tile.position, tile.zoom)) {
addCache(tile.position, tile.zoom, tile.data); addCache(tile.position, tile.zoom, tile.data);
@ -190,8 +205,7 @@ namespace LAMPMainWidget
painter.drawImage(QPointF(xPos, yPos), img); painter.drawImage(QPointF(xPos, yPos), img);
} }
void void TmsProvider::newImage(const QRectF& rect)
TmsProvider::newImage(const QRectF& rect)
{ {
QSize imgSize{ int(rect.width()), int(rect.height()) }; QSize imgSize{ int(rect.width()), int(rect.height()) };
if (!mImage || imgSize != mImage->size()) { if (!mImage || imgSize != mImage->size()) {

View File

@ -27,7 +27,8 @@ namespace LAMPMainWidget
QString url; QString url;
QByteArray data; QByteArray data;
}; };
// 在结构体定义后声明
Q_DECLARE_METATYPE(TileInfo);
/* /*
* *
*/ */
@ -39,7 +40,9 @@ namespace LAMPMainWidget
void tileReady(TileInfo tile); void tileReady(TileInfo tile);
public: public:
explicit TileDownloadTask(TileInfo tile, QObject* parent = nullptr); using tileReadyCallback = std::function<void( TileInfo )>;
explicit TileDownloadTask(TileInfo tile, tileReadyCallback=nullptr, QObject* parent = nullptr);
TileDownloadTask(const TileDownloadTask& other) = delete; TileDownloadTask(const TileDownloadTask& other) = delete;
TileDownloadTask(TileDownloadTask&& other) = delete; TileDownloadTask(TileDownloadTask&& other) = delete;
TileDownloadTask& operator=(const TileDownloadTask& other) = delete; TileDownloadTask& operator=(const TileDownloadTask& other) = delete;
@ -47,11 +50,15 @@ namespace LAMPMainWidget
~TileDownloadTask() override = default; ~TileDownloadTask() override = default;
public: public:
void run() override; void run() override;
protected: protected:
TileInfo mTile; TileInfo mTile;
private:
tileReadyCallback mCallback;
}; };
class TmsProvider : public LayerProvider class TmsProvider : public LayerProvider

View File

@ -4,8 +4,7 @@
namespace LAMPMainWidget namespace LAMPMainWidget
{ {
PointXY PointXY WebMercator::forward(const LAMPMainWidget::PointXY& point) const
WebMercator::forward(const LAMPMainWidget::PointXY& point) const
{ {
PointXY result{}; PointXY result{};
PointXY originXy = CRS::forward(point); PointXY originXy = CRS::forward(point);
@ -17,8 +16,7 @@ namespace LAMPMainWidget
return result; return result;
} }
PointXY PointXY WebMercator::inverse(const LAMPMainWidget::PointXY& point) const
WebMercator::inverse(const LAMPMainWidget::PointXY& point) const
{ {
PointXY originXy{}; PointXY originXy{};
QSizeF sz = extent().size(); QSizeF sz = extent().size();
@ -29,14 +27,12 @@ namespace LAMPMainWidget
return CRS::inverse(originXy); return CRS::inverse(originXy);
} }
QString QString WebMercator::proj4Cvt() const
WebMercator::proj4Cvt() const
{ {
return QString{"+proj=webmerc +datum=WGS84"}; return QString{"+proj=webmerc +datum=WGS84"};
} }
QString QString WebMercator::wktDef() const
WebMercator::wktDef() const
{ {
return QString{ return QString{
R"( R"(

View File

@ -24,6 +24,12 @@
<Filter Include="RasterLayer"> <Filter Include="RasterLayer">
<UniqueIdentifier>{1a65f538-c16c-4824-895f-105eb2fc502e}</UniqueIdentifier> <UniqueIdentifier>{1a65f538-c16c-4824-895f-105eb2fc502e}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="gaodelayer">
<UniqueIdentifier>{7c9ae80d-da53-409c-805d-a3cc2c821574}</UniqueIdentifier>
</Filter>
<Filter Include="OpenstreetLayer">
<UniqueIdentifier>{bce9c1c4-57d0-42e5-bd9e-681fe17e9f00}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtRcc Include="RasterMainWidgetGUI.qrc"> <QtRcc Include="RasterMainWidgetGUI.qrc">
@ -37,9 +43,6 @@
<ClCompile Include="RasterMainWidget\crs.cpp"> <ClCompile Include="RasterMainWidget\crs.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="RasterMainWidget\gaodenormalprovider.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RasterMainWidget\imgwriter.cpp"> <ClCompile Include="RasterMainWidget\imgwriter.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -91,9 +94,6 @@
<ClCompile Include="RasterMainWidget\network.cpp"> <ClCompile Include="RasterMainWidget\network.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="RasterMainWidget\ostnormalprovider.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RasterMainWidget\pointxy.cpp"> <ClCompile Include="RasterMainWidget\pointxy.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -124,20 +124,17 @@
<ClCompile Include="PrintMessage_C.cpp"> <ClCompile Include="PrintMessage_C.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="RasterMainWidget\gaodenormalprovider.cpp">
<Filter>gaodelayer</Filter>
</ClCompile>
<ClCompile Include="RasterMainWidget\ostnormalprovider.cpp">
<Filter>OpenstreetLayer</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="RasterMainWidget\crs.h"> <ClInclude Include="RasterMainWidget\crs.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="RasterMainWidget\gaodesatelliteprovider.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="RasterMainWidget\googlechinanormalprovider.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="RasterMainWidget\googlechinasatelliteprovider.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="RasterMainWidget\imgwriter.h"> <ClInclude Include="RasterMainWidget\imgwriter.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -213,20 +210,23 @@
<ClInclude Include="RasterMainWidgetGUICFunAPI.h"> <ClInclude Include="RasterMainWidgetGUICFunAPI.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="RasterMainWidget\gaodesatelliteprovider.h">
<Filter>gaodelayer</Filter>
</ClInclude>
<ClInclude Include="RasterMainWidget\googlechinanormalprovider.h">
<Filter>gaodelayer</Filter>
</ClInclude>
<ClInclude Include="RasterMainWidget\googlechinasatelliteprovider.h">
<Filter>gaodelayer</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="RasterMainWidget\gaodenormalprovider.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="RasterMainWidget\layerprovider.h"> <QtMoc Include="RasterMainWidget\layerprovider.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="RasterMainWidget\mapcanvas.h"> <QtMoc Include="RasterMainWidget\mapcanvas.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="RasterMainWidget\ostnormalprovider.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="RasterMainWidget\RasterMainWidget.h"> <QtMoc Include="RasterMainWidget\RasterMainWidget.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
@ -242,6 +242,12 @@
<QtMoc Include="RasterWidgetMessageShow.h"> <QtMoc Include="RasterWidgetMessageShow.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="RasterMainWidget\gaodenormalprovider.h">
<Filter>gaodelayer</Filter>
</QtMoc>
<QtMoc Include="RasterMainWidget\ostnormalprovider.h">
<Filter>OpenstreetLayer</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="RasterMainWidget\proj.db" /> <None Include="RasterMainWidget\proj.db" />

BIN
图像结构.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB