#include "googleTile.h" #include #include #include #include #include #include using std::string; #define M_PI 3.1415926 googleTile::googleTile() { } googleTile::~googleTile() { } void googleTile::ExportGeoPng(cv::Mat _pan, TileInfo info, std::string dir, std::string name) { // 保存全景图 string png_path = dir + "/" + name + ".png"; cv::imwrite(png_path, _pan); // 写入kml string kml_path = dir + "/" + name + ".kml"; std::ofstream kml_file(kml_path); // 写入 KML 文件的头部 kml_file << "" << std::endl; kml_file << "" << std::endl; kml_file << "" << std::endl; // 写入 GroundOverlay 元素 kml_file << "" << std::endl; kml_file << " My Panoramic Image" << std::endl; kml_file << " " << std::endl; kml_file << " " << name + ".png" << "" << std::endl; kml_file << " " << std::endl; // 使用四个角点计算 LatLonBox kml_file << " " << std::endl; kml_file << " " << info.north << "" << std::endl; // 经度范围 kml_file << " " << info.south << "" << std::endl; kml_file << " " << info.east << "" << std::endl; // 纬度范围 kml_file << " " << info.west << "" << std::endl; kml_file << " " << std::endl; // 写入 KML 文件的尾部 kml_file << "" << std::endl; kml_file << "" << std::endl; kml_file << "" << std::endl; kml_file.close(); } void googleTile::ExportTile(cv::Mat _pan, TileInfo info, std::string dir, std::string name) { // 计算四至的瓦片编号 TileIndex westNorth = LatLonToTile(info.west, info.north, 10); int a = 0; } TileIndex googleTile::LatLonToTile(double latitude, double longitude, int zoomLevel) { // 将纬度转换为墨卡托投影 double latRad = latitude * M_PI / 180.0; double sinLat = sin(latRad); // 计算经度的瓦片编号(0-2^zoomLevel) int xTile = static_cast((longitude + 180.0) / 360.0 * pow(2.0, zoomLevel)); // 计算纬度的瓦片编号(0-2^zoomLevel) int yTile = static_cast((1.0 - log((1.0 + sinLat) / (1.0 - sinLat)) / (2.0 * M_PI)) / 2.0 * pow(2.0, zoomLevel)); return TileIndex{ xTile, yTile, zoomLevel }; }