地图初步可以显示

This commit is contained in:
2026-07-20 16:05:32 +08:00
parent 838aaba43d
commit 05569053e4
13 changed files with 20954 additions and 64 deletions
+1
View File
@@ -1 +1,2 @@
/.idea /.idea
+4 -3
View File
@@ -8,15 +8,16 @@ if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_LIST_DIR})
include(third_party/build_infra/start.cmake) include(third_party/build_infra/start.cmake)
set(test_maplibre_rely QMapLibre_qt_5_15_2) set(test_maplibre_rely global::QMapLibre_qt_5_15_2)
library_is_installed_with_rely(global ok ${test_maplibre_rely}) library_is_installed_with_rely(ok ${test_maplibre_rely})
if (${ok}) if (${ok})
include(${CMAKE_SOURCE_DIR}/main.cmake) include(${CMAKE_SOURCE_DIR}/main.cmake)
else () else ()
message("test_maplibre 依赖未安装! 请运行 test_maplibre_env 目标安装所需第三方依赖") message("test_maplibre 依赖未安装! 请运行 test_maplibre_env 目标安装所需第三方依赖")
endif () endif ()
rcl_add_dependency_action_targets("test_maplibre_env" ${test_maplibre_rely})
include(third_party/build_infra/end.cmake) include(third_party/build_infra/end.cmake)
rcl_add_dependency_action_targets("test_maplibre_env" ${test_maplibre_rely})
else () else ()
endif () endif ()
+36 -23
View File
@@ -1,29 +1,42 @@
set(dir ${CMAKE_CURRENT_LIST_DIR}/src)
block()
find_package(Qt5 REQUIRED COMPONENTS Widgets)
find_package(QMapLibre COMPONENTS Widgets REQUIRED)
set(dir module/test_maplibre)
file(GLOB_RECURSE srcs ${dir}/*.qrc ${dir}/*.c ${dir}/*.h ${dir}/*.cpp ${dir}/*.hpp)
add_executable(test_maplibre ${srcs})
target_link_libraries(test_maplibre PRIVATE Qt5::Widgets QMapLibre::Widgets)
target_compile_definitions(test_maplibre PRIVATE QT_MAPLIBRE_STATIC)
target_compile_definitions(test_maplibre PRIVATE QT_MAPLIBRE_STATIC WIN32_LEAN_AND_MEAN NOMINMAX)
if(WIN32)
target_link_libraries(test_maplibre PRIVATE ws2_32)
endif()
if(MSVC)
target_compile_options(test_maplibre PRIVATE /utf-8)
endif()
set_property(TARGET test_maplibre PROPERTY AUTOMOC ON)
set_property(TARGET test_maplibre PROPERTY AUTOUIC ON)
set_property(TARGET test_maplibre PROPERTY AUTORCC ON)
endblock()
find_package(Qt5 REQUIRED COMPONENTS Widgets)
find_package(QMapLibre COMPONENTS Widgets REQUIRED)
#set(osgEarth_DIR "D:/ae/cached_external_library/vs2019_Debug_global/install/osgearth/lib/cmake/osgearth")
file(GLOB_RECURSE srcs ${dir}/*.qrc ${dir}/*.c ${dir}/*.h ${dir}/*.cpp ${dir}/*.hpp) block()
add_executable(test_maplibre ${srcs}) set(rely osgearth)
target_link_libraries(test_maplibre PRIVATE Qt5::Widgets QMapLibre::Widgets) rcl_load_dependency_environment(osg_earth ${rely})
set(dir module/test_osg_earth)
file(GLOB_RECURSE srcs ${dir}/*.qrc ${dir}/*.c ${dir}/*.h ${dir}/*.cpp ${dir}/*.hpp)
target_compile_definitions(test_maplibre PRIVATE QT_MAPLIBRE_STATIC) add_executable(test_osg_earth ${srcs})
find_package(osgEarth CONFIG REQUIRED)
target_link_libraries(test_osg_earth PRIVATE osgEarth::osgEarth)
target_compile_definitions(test_maplibre PRIVATE QT_MAPLIBRE_STATIC WIN32_LEAN_AND_MEAN NOMINMAX) if(MSVC)
if(WIN32) target_compile_options(test_osg_earth PRIVATE /utf-8)
target_link_libraries(test_maplibre PRIVATE ws2_32) endif()
endif() rcl_unload_dependency_environment(osg_earth ${rely})
if(MSVC) endblock()
target_compile_options(test_maplibre PRIVATE /utf-8)
endif()
set_property(TARGET test_maplibre PROPERTY AUTOMOC ON)
set_property(TARGET test_maplibre PROPERTY AUTOUIC ON)
set_property(TARGET test_maplibre PROPERTY AUTORCC ON)
+19
View File
@@ -0,0 +1,19 @@
$env:OSGEARTH_HTTP_DEBUG = "1"
$env:OSGEARTH_CACHE_DEBUG = "1"
$base = "D:\ae\cached_external_library\vs2019_Debug_osg_earth\install"
$osgearth_bin = "$base\osgearth\bin"
$osgearth_plugin = "$base\osgearth\bin\osgPlugins-3.6.5"
$osg_bin = "$base\openscenegraph\bin"
$gdal_bin = "$base\gdal\bin"
$curl_bin = "$base\curl\bin"
$proj_bin = "$base\proj\bin"
$zlib_bin = "$base\zlib\bin"
$geos_bin = "$base\geos\bin"
$jpeg_bin = "$base\jpeg\bin"
$tiff_bin = "$base\tiff\bin"
$png_bin = "$base\png\bin"
$env:Path = "$png_bin;$tiff_bin;$jpeg_bin;$geos_bin;$zlib_bin;$proj_bin;$curl_bin;$gdal_bin;$osgearth_bin;$osg_bin;$env:Path"
+4
View File
@@ -0,0 +1,4 @@
$bin1 = "D:\ae\cached_external_library\vs2019_Debug_global\install\QMapLibre_qt_5_15_2\bin"
$env:Path = "$bin1"
File diff suppressed because it is too large Load Diff
+164
View File
@@ -0,0 +1,164 @@
#include <cstddef>
#include <iostream>
#include <string>
#include <vector>
#include <osg/ArgumentParser>
#include <osg/Notify>
#include <osgDB/FileUtils>
#include <osgDB/Registry>
#include <osgViewer/Viewer>
#include <osgEarth/Controls>
#include <osgEarth/EarthManipulator>
#include <osgEarth/GLUtils>
#include <osgEarth/MapNode>
#include <osgEarth/Viewpoint>
#include <osgEarth/XYZ>
#ifdef _WIN32
#include <windows.h>
#endif
namespace ui = osgEarth::Util::Controls;
struct Tile_Source {
std::string name;
std::string url;
};
class Tile_Source_Controller {
public:
explicit Tile_Source_Controller(osgEarth::Map* map) : map_(map) {}
void add_source(Tile_Source source, bool visible) {
osg::ref_ptr<osgEarth::XYZImageLayer> layer = new osgEarth::XYZImageLayer();
layer->setName(source.name);
layer->setURL(source.url);
layer->setProfile(osgEarth::Profile::create(osgEarth::Profile::SPHERICAL_MERCATOR));
layer->setVisible(visible);
map_->addLayer(layer.get());
sources_.emplace_back(std::move(source));
layers_.emplace_back(std::move(layer));
}
void select(std::size_t index) {
for (std::size_t i = 0; i < layers_.size(); ++i) {
layers_[i]->setVisible(i == index);
}
status_->setText(std::string("Current: ") + sources_[index].name);
}
void set_status(ui::LabelControl* status) {
status_ = status;
}
[[nodiscard]] std::size_t size() const {
return sources_.size();
}
[[nodiscard]] const std::string& name(std::size_t index) const {
return sources_[index].name;
}
private:
osgEarth::Map* map_;
std::vector<Tile_Source> sources_;
std::vector<osg::ref_ptr<osgEarth::XYZImageLayer>> layers_;
ui::LabelControl* status_;
};
class Select_Tile_Source_Handler : public ui::ControlEventHandler {
public:
Select_Tile_Source_Handler(Tile_Source_Controller& controller, std::size_t index)
: controller_(controller), index_(index) {}
void onClick(ui::Control*) {
controller_.select(index_);
}
private:
Tile_Source_Controller& controller_;
std::size_t index_;
};
ui::Control* create_tile_source_panel(Tile_Source_Controller& controller) {
auto* grid = new ui::Grid();
grid->setBackColor(0.0f, 0.0f, 0.0f, 0.72f);
grid->setPadding(10.0f);
grid->setChildSpacing(6.0f);
grid->setAbsorbEvents(true);
unsigned int row = 0;
grid->setControl(0, row++, new ui::LabelControl("Tile source"));
for (std::size_t i = 0; i < controller.size(); ++i) {
auto* button = grid->setControl(
0,
row++,
new ui::ButtonControl(
controller.name(i),
new Select_Tile_Source_Handler(controller, i)
)
);
button->setHorizFill(true, 220.0f);
}
auto* status = grid->setControl(
0,
row,
new ui::LabelControl("Current: OpenStreetMap")
);
controller.set_status(status);
return grid;
}
int main(int argc, char** argv) {
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
#endif
const std::string install_root =
"D:/ae/cached_external_library/vs2019_Debug_osg_earth/install";
osgDB::FilePathList plugin_paths{
install_root + "/osgearth/bin/osgPlugins-3.6.5",
install_root + "/openscenegraph/bin/osgPlugins-3.6.5"
};
auto* registry = osgDB::Registry::instance();
registry->setLibraryFilePathList(plugin_paths);
osg::setNotifyLevel(osg::NOTICE);
if (registry->getReaderWriterForExtension("png") == nullptr) {
std::cerr << "无法加载 OSG PNG 插件,请检查 osgdb_pngd.dll 和它依赖的 DLL\n";
return 1;
}
osgEarth::initialize();
osg::ArgumentParser args(&argc, argv);
osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map();
Tile_Source_Controller tile_sources(map.get());
tile_sources.add_source(
{
"OpenStreetMap",
"https://tile.openstreetmap.org/{z}/{x}/{y}.png"
},
true
);
tile_sources.add_source(
{
"OpenTopoMap",
"https://[abc].tile.opentopomap.org/{z}/{x}/{y}.png"
},
false
);
tile_sources.add_source(
{
"Esri World Imagery",
"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"
},
false
);
osg::ref_ptr<osgEarth::MapNode> map_node = new osgEarth::MapNode(map.get());
osgViewer::Viewer viewer(args);
viewer.setUpViewInWindow(100, 100, 1280, 720);
viewer.setRealizeOperation(new osgEarth::GL3RealizeOperation());
viewer.getCamera()->setSmallFeatureCullingPixelSize(-1.0f);
viewer.setSceneData(map_node.get());
ui::ControlCanvas::getOrCreate(&viewer)->addControl(
create_tile_source_panel(tile_sources)
);
osg::ref_ptr<osgEarth::EarthManipulator> manipulator =
new osgEarth::EarthManipulator(args);
viewer.setCameraManipulator(manipulator.get());
manipulator->setViewpoint(
osgEarth::Viewpoint(
"Beijing",
116.4074,
39.9042,
0.0,
0.0,
-90.0,
1500000.0
),
0.0
);
return viewer.run();
}
+2 -1
View File
@@ -25,4 +25,5 @@ fetch_repo() {
} }
fetch_repo "$remote_root/ae/build_infra" "master" "third_party/build_infra" fetch_repo "$remote_root/ae/build_infra" "master" "third_party/build_infra"
fetch_repo "$remote_root/ae/CPP_Core" "master" "third_party/CPP_Core" fetch_repo "$remote_root/ae/CPP_Core" "master" "third_party/CPP_Core"
-37
View File
@@ -1,37 +0,0 @@
$ErrorActionPreference = "Stop"
$scriptDir = $PSScriptRoot
if ( [string]::IsNullOrWhiteSpace($scriptDir))
{
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
}
$root = (Resolve-Path -LiteralPath (Join-Path $scriptDir "..")).Path
Set-Location -LiteralPath $root
$origin = git remote get-url origin
$origin = $origin.TrimEnd("/")
$remoteRoot = $origin -replace "/[^/]+(\.git)?$", ""
$remoteRoot = $remoteRoot -replace "/[^/]+$", ""
echo "remoteRoot $remoteRoot"
function Fetch-Repo
{
param(
[string]$Repo,
[string]$Branch,
[string]$Dir
)
if (Test-Path -LiteralPath $Dir -PathType Container)
{
git -C $Dir rev-parse --is-inside-work-tree *> $null
git -C $Dir remote set-url origin $Repo
git -C $Dir fetch origin $Branch
git -C $Dir checkout $Branch
git -C $Dir pull --ff-only origin $Branch
}
else
{
git clone --branch $Branch --single-branch $Repo $Dir
}
}
Fetch-Repo "$remoteRoot/ae/build_infra" -Branch "master" "third_party/build_infra"
Fetch-Repo "$remoteRoot/ae/CPP_Core" -Branch "master" "third_party/CPP_Core"