feixian_weifajianguan/OpenAuth.App/ServiceApp/ShpGeo/GeoTiffManagerApp.cs

550 lines
23 KiB
C#
Raw Normal View History

2026-02-03 16:00:02 +08:00
using System.Globalization;
using System.Text.RegularExpressions;
using Infrastructure;
using NetTopologySuite.Geometries;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.Interface;
using OpenAuth.App.ServiceApp.ShpGeo.Request;
using OpenAuth.App.ServiceApp.ShpGeo.Response;
using OpenAuth.App.ServiceApp.ShpGeo.Utils;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
namespace OpenAuth.App.ServiceApp.ShpGeo;
public class GeoTiffManagerApp : SqlSugarBaseApp<GeoTiffManager, SugarDbContext>
{
public GeoTiffManagerApp(ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<GeoTiffManager> repository, IAuth auth) : base(unitWork, repository, auth)
{
}
// 影像管理列表
public async Task<Response<PageInfo<List<GeoTiffManager>>>> LoadPage(GeoTiffManagerReq req)
{
RefAsync<int> totalCount = 0;
var sources = await base.Repository.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(req.key), a => a.DataTable.Contains(req.key))
.Select<GeoTiffManager>(a => new GeoTiffManager
{
Id = a.Id,
CreateTime = a.CreateTime,
UpdateTime = a.UpdateTime,
DataTable = a.DataTable,
TiffPath = a.TiffPath,
ShpPath = a.ShpPath,
DateDir = a.DateDir,
LayerName = a.LayerName,
StoreName = a.StoreName,
AccessUrl = a.AccessUrl
})
.ToPageListAsync(req.page, req.limit, totalCount);
return new Response<PageInfo<List<GeoTiffManager>>>
{
Result = new PageInfo<List<GeoTiffManager>>
{
Items = sources,
Total = totalCount
}
};
}
/// <summary>
/// 影像管理详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public GeoTiffManager Get(string id)
{
return Repository.GetById(id);
}
/// <summary>
/// 影像更新
/// </summary>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<Response<List<string>>> UpdateGeoTiff()
{
var geoContext = GeoContext.Instance;
var workspace = geoContext.Workspace;
// 影像存放目录
var tiffDir = geoContext.TiffDir; // 配置TIF目录到目录tiff
var geoserver = geoContext.GeoserverUrl;
var tiffStoreNamePrefix = geoContext.TiffStoreNamePrefix;
// 1. 先行查找shp(压缩包形式) 2. 解压 3. 读取shp记录tif位置 4. 取得日期目录取得tif文件路径信息
// 5. 判断是否已经入库(全路径匹配) 6. 若没有入库边界图形和tif信息一起存入tif表中
var dirInfo = new DirectoryInfo(tiffDir);
var db = Repository.AsSugarClient();
// 获取所有文件,包括子目录中的文件
var zipFiles = dirInfo.GetFiles("*.shp", SearchOption.AllDirectories);
var errorList = new List<string>();
foreach (var fileInfo in zipFiles) //所有边界文件
{
var shpDir = fileInfo.DirectoryName; // zip所有目录
Console.WriteLine("shp路径" + fileInfo.FullName);
// 取得shp中数据
var shpData = ShapeUtil.ReadAllGeometry(fileInfo.FullName);
foreach (var data in shpData)
{
// shp 中字段有 Shape Image LayerName 日期暂时没有
// chengguo 日期(区域 * ntif zip
// tiff 文件全路径
var geometry1 = (Geometry)data["Geometry"]; // 图形
//var tifName = data["LayerName"].ToString(); //abc.tif 影像名称
var relativeTifPath = data["Image"].ToString(); // TIF 相对路径 or 相对路径
if (string.IsNullOrEmpty(relativeTifPath)) // 没有路径,跳过
{
continue;
}
var tifName = Path.GetFileName(relativeTifPath); // tif名称
if (string.IsNullOrEmpty(tifName))
{
continue;
}
// \\\\192.168.10.100\\c\\ChengGuoFinal
string tiffPath;
var isRelativePath = false;
// 判断相对路径还是绝对路径
if (Regex.IsMatch(relativeTifPath, "^[a-zA-Z]")) // 若是绝对路径
{
tiffPath = relativeTifPath;
}
else
{
isRelativePath = true;
tiffPath = "C:\\ChengGuoFinal\\tiff" + relativeTifPath;
}
// todo 验证tiff 存不存修改 相对路径时,不用特别修改
var tempAccessPath = "";
var isNetworkFile = false;
// 关于如果tif不存在如何处理
if (tiffDir.Contains(".")) // 包含IP
{
isNetworkFile = true;
// \无人机巡飞影像数据\20241012\沂南县\20241012沂南15-19_0.2.tif
// \\\\192.168.10.100\\c\\ChengGuoFinal
// C:\ChengGuoFinal\tiff\无人机巡飞影像数据\20250112\费县\20250112费县1-2-0.2.tif
tempAccessPath = tiffPath.Replace("C:\\ChengGuoFinal\\tiff\\", tiffDir)
.Replace("c:\\ChengGuoFinal\\tiff", tiffDir);
if (!File.Exists(tempAccessPath))
{
// todo 临时注释
continue;
}
//tiffPath = tempAccessPath;
}
else if (!File.Exists(tiffPath))
{
continue;
}
tiffPath = tiffPath.Replace("\\", "/"); // 统一路径分隔符 反斜杠换成斜杠
var tiffName = Path.GetFileNameWithoutExtension(tiffPath);
//var tempPath = isRelativePath ? relativeTifPath : tiffPath;
// 路径完全相同,不需要处理
var exist = await Repository.AsQueryable()
.Where(t => t.TiffPath.Equals(tiffPath)).AnyAsync();
if (exist)
{
continue;
}
// todo C:\ChengGuoFinal\tiff
var shpPath = fileInfo.FullName.Replace( tiffDir,"C:\\ChengGuoFinal\\tiff\\")
.Replace( tiffDir,"c:\\ChengGuoFinal\\tiff");
// tiff 文件路径不同,但日期文件夹相同 更新tiff
// todo 取得日期目录
var dateDir = Path.GetFileName(Path.GetDirectoryName(shpPath));
if (Path.GetFileNameWithoutExtension(shpPath).Equals("polygon")) // 针对使用qm生成的边界
{
// 存在多个日期时,前下划线之前
dateDir = dateDir.Split("_")[0];
}
// 以zip文件存在
// 新图层名称.. TIF名称中含有.
tiffName = tiffName
.Replace(".tif", "")
.Replace("_", "")
.Replace(".", "")
.Replace("aux", "");
var layerName = tiffName + DateTime.Now.ToString("yyyyMMddHHmmss");
// 新栅格仓库名称
var storeName = tiffStoreNamePrefix + tiffName +
DateTime.Now.ToString("yyyyMMddHHmmss");
var record = new GeoTiffManager
{
ShpPath = shpPath,
TiffPath = tiffPath,
DateDir = dateDir,
UpdateTime = DateTime.Now,
LayerName = layerName,
StoreName = storeName,
geometry = geometry1.AsText()
};
// 开启事务
//await db.Ado.BeginTranAsync();
var tableName = "tiff" + layerName;
// todo 传入坐标
// 新发布tiff
var isSuccess = await GeoUtil.PublishExternalGeoTIFF("", tiffPath, storeName, layerName);
if (!isSuccess.Result)
{
errorList.Add(tiffPath);
continue;
//throw new Exception("tiff影像发布失败");
}
record.CreateTime = DateTime.Now;
record.Id = Guid.NewGuid().ToString();
record.DataTable = tableName;
//record.CountyName = tiffFileInfo.Directory?.Name;
var tiffLayerInfoResponse = await GeoUtil.GetTiffLayerInfo("", storeName, layerName);
var bbox = tiffLayerInfoResponse.Result.bbox;
var srs = tiffLayerInfoResponse.Result.srs;
var accessUrl =
$"{geoserver}/{workspace}/wms?service=WMS&version=1.1.0&request=GetMap&layers={workspace}:{layerName}&bbox={bbox}&width=768&height=571&srs={srs}&styles=&format=application/openlayers";
record.AccessUrl = accessUrl;
await Repository.AsInsertable(record).ExecuteCommandAsync();
// 判断是否存在对应图层组 如不存在则创建,如果存在,则添加图层
var date = DateTime.ParseExact(dateDir, "yyyyMMdd", CultureInfo.InvariantCulture);
var year = date.Year;
var week = date.GetWeekOfYear();
var layerGroupName = $"{year}-{week}";
// todo 取出图层组图层
// 判断图层组是否存在
if (await GeoUtil.ExistLayerGroup("", layerGroupName))
{
await GeoUtil.AddLayersToLayerGroup("", layerGroupName, new List<string> { layerName });
}
else
{
var layers = $"<layer>{workspace}:{layerName}</layer>";
await GeoUtil.publishLayerGroup("", layers, layerGroupName);
}
// 下载图片
/*try
{
const string fixedBbox =
"117.34046403513817,34.331716698906675,119.27763051149853,36.263686454243626";
var layerGroupThumbPath = "C:\\FileSystem\\web\\geoserver\\group";
// 创建目标目录(如果不存在)
if (!Directory.Exists(layerGroupThumbPath))
{
Directory.CreateDirectory(layerGroupThumbPath);
}
var layerGroupThumb = layerGroupName + ".png";
// 完整的目标文件路径
string filePath = Path.Combine(layerGroupThumbPath, layerGroupThumb);
var pngLink =
$"{geoserver}/{workspace}/wms?service=WMS&version=1.1.0&request=GetMap&layers={workspace}:{layerGroupName}&bbox={fixedBbox}&width=4096&height=4096&srs=EPSG:4326&styles=&TRANSPARENT=TRUE&format=image%2Fpng";
using (var client = new HttpClient())
{
using (var response = await client.GetAsync(pngLink))
{
response.EnsureSuccessStatusCode(); // 确保请求成功
// 将图片数据写入文件
await using (var fileStream =
new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
await response.Content.CopyToAsync(fileStream);
}
}
}
Console.WriteLine($"图片已成功下载到: {filePath}");
}
catch (Exception e)
{
Console.WriteLine(e);
}*/
}
}
// 提交事务
//await db.Ado.CommitTranAsync();
if (errorList.Count > 0)
{
return new Response<List<string>>
{
Result = errorList,
Message = "以下影像tif发布失败" + string.Join(",", errorList)
};
}
return new Response<List<string>>
{
Result = new List<string>()
};
}
public string Test(string storeName, string layerName)
{
var tiffLayerInfoResponse = GeoUtil.GetTiffLayerInfo1("", storeName, layerName);
return tiffLayerInfoResponse.Result.ToString();
//var db = Repository.AsSugarClient();
//db.DbMaintenance.TruncateTable("parse_shpinfo_text3");
}
public async Task<PageInfo<List<TifInfo>>> GetIntersects(GeoTiffManagerReq req)
{
using var db = Repository.AsSugarClient();
var sql =
$@"select id as ""tifId"", layer_name as ""tifName"", access_url as ""accessUrl"" from geo_tiff_manager where ST_Intersects('{req.TargetShape}'::geometry,geometry)";
var geoserverUrl = GeoUtil.GeoserverUrl;
var workspace = GeoUtil.Workspace;
var geoserverAccess =
@$"{geoserverUrl}/{workspace}/wms?service=WMS&version=1.1.0&request=GetMap&layers={workspace}:LAYER_NAME&styles=&bbox={{bbox-epsg-3857}}&width=256&height=256&srs=EPSG:3857&format=image/png&TRANSPARENT=TRUE";
RefAsync<int> totalCount = 0;
var result = await db.SqlQueryable<TifInfo>(sql).ToPageListAsync(req.page, req.limit, totalCount);
foreach (var tifInfo in result)
{
tifInfo.AccessUrl = geoserverAccess.Replace("LAYER_NAME", tifInfo.TifName);
}
return new PageInfo<List<TifInfo>>()
{
Items = result
};
}
/// <summary>
/// 影像创建图层组
/// </summary>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<Response<bool>> GroupGeoTiff(string type)
{
string layer = "";
if ("0".Equals(type))
{
string myworkspace = "mylayergroup";
var exist = await GeoUtil.ExistWorkspace(myworkspace);
if (exist.Result)
{
await GeoUtil.DeleteWorkspace(myworkspace);
}
await GeoUtil.CreateWorkspace(myworkspace);
var geoContext = GeoContext.Instance;
// 影像存放目录
var tiffDir = "C:\\合图数据\\1031合图"; // 配置目录
var geoserver = geoContext.GeoserverUrl;
var tiffStoreNamePrefix = geoContext.TiffStoreNamePrefix;
// todo 1。 先行查找shp(压缩包形式) 2。解压 3。读取shp记录tif位置 4。取得日期目录取得tif文件路径信息
// todo 5. 判断是否已经入库(全路径匹配) 6。若没有入库边界图形和tif信息一起存入tif表中
var dirInfo = new DirectoryInfo(tiffDir);
var db = Repository.AsSugarClient();
// 获取所有文件,包括子目录中的文件
var zipFiles = dirInfo.GetFiles("*.tif", SearchOption.AllDirectories);
foreach (var fileInfo in zipFiles)
{
var shpDir = fileInfo.DirectoryName; // tif所有目录
string filename = fileInfo.FullName;
var tiffName = Path.GetFileNameWithoutExtension(filename);
// 新图层名称.. TIF名称中含有.
var layerName = tiffName.Replace(".", "").Replace("aux", "") + DateTime.Now.ToString("yyyyHHmmss");
// 新栅格仓库名称
var storeName = tiffStoreNamePrefix + tiffName +
DateTime.Now.Millisecond;
// 新发布tiff
var isSuccess = await GeoUtil.PublishSingleGeoTIFF(myworkspace, filename, storeName, layerName);
layer = layer + "<layer>" + myworkspace + ":" + layerName + "</layer>";
if (!isSuccess.Result)
{
// throw new Exception("tiff影像发布失败");
}
}
await GeoUtil.publishLayerGroup(myworkspace, layer, "linyiAllYingxiang");
return new Response<bool>
{
Result = true
};
}
else
{
string myworkspace = "yaoganlayergroup";
var exist = await GeoUtil.ExistWorkspace(myworkspace);
if (exist.Result)
{
await GeoUtil.DeleteWorkspace(myworkspace);
}
await GeoUtil.CreateWorkspace(myworkspace);
var geoContext = GeoContext.Instance;
// 影像存放目录
var tiffDir = "C:\\合图数据\\遥感影像全市"; // 配置目录
var geoserver = geoContext.GeoserverUrl;
var tiffStoreNamePrefix = geoContext.TiffStoreNamePrefix;
// todo 1。 先行查找shp(压缩包形式) 2。解压 3。读取shp记录tif位置 4。取得日期目录取得tif文件路径信息
// todo 5. 判断是否已经入库(全路径匹配) 6。若没有入库边界图形和tif信息一起存入tif表中
var dirInfo = new DirectoryInfo(tiffDir);
var db = Repository.AsSugarClient();
// 获取所有文件,包括子目录中的文件
var zipFiles = dirInfo.GetFiles("*.tif", SearchOption.AllDirectories);
foreach (var fileInfo in zipFiles)
{
var shpDir = fileInfo.DirectoryName; // tif所有目录
string filename = fileInfo.FullName;
var tiffPath = shpDir + filename;
var tiffName = Path.GetFileNameWithoutExtension(filename);
// 新图层名称.. TIF名称中含有.
var layerName = tiffName.Replace(".", "") + DateTime.Now.ToString("yyyyHHmmss");
// 新栅格仓库名称
var storeName = tiffStoreNamePrefix + tiffName +
DateTime.Now.Millisecond;
// 新发布tiff
var isSuccess = await GeoUtil.PublishSingleGeoTIFF(myworkspace, filename, storeName, layerName);
layer = layer + "<layer>" + myworkspace + ":" + layerName + "</layer>";
if (!isSuccess.Result)
{
throw new Exception("tiff影像发布失败");
}
}
await GeoUtil.publishLayerGroup(myworkspace, layer, "yanganyingxiang");
return new Response<bool>
{
Result = true
};
}
}
public async Task<Response<bool>> DeleteTifStore(string stores)
{
var storeList = stores.Split(",").ToList();
var failList = new List<string>();
foreach (var se in storeList)
{
await Repository.DeleteAsync(u => u.StoreName == se);
// todo 删除图层
try
{
await GeoUtil.DeleteCoveragesStore("", se, true);
}
catch (Exception e)
{
Console.WriteLine(e);
failList.Add(se);
}
}
return new Response<bool>
{
Result = true,
Message = string.Join(",", failList)
};
}
public async Task<Response<bool>> UpdateLayerGroupThumb(string layerGroups, string bbox, int num, int height,
int width)
{
var geoContext = GeoContext.Instance;
var workspace = geoContext.Workspace;
var geoserver = geoContext.GeoserverUrl;
var layerGroupList = layerGroups.Split(",").ToList();
if (string.IsNullOrEmpty(bbox))
{
bbox = "117.34046403513817,34.331716698906675,119.27763051149853,36.263686454243626";
}
var coordinate = bbox.Split(",").Select(double.Parse).ToArray();
var minx = coordinate[0];
var miny = coordinate[1];
var maxx = coordinate[2];
var maxy = coordinate[3];
var stepX = (maxx - minx) / num;
var stepY = (maxy - miny) / num;
var layerGroupThumbPath = "C:\\FileSystem\\web\\geoserver\\group";
foreach (var layerGroupName in layerGroupList)
{
var tempPath = layerGroupThumbPath;
// 不同图层组,不同路径
tempPath = Path.Combine(layerGroupThumbPath, num.ToString());
tempPath = Path.Combine(tempPath, layerGroupName);
// 完整的目标文件路径
// 创建目标目录(如果不存在)
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
// 下载图片
try
{
for (var i = 0; i < num; i++)
{
for (var j = 0; j < num; j++)
{
var bboxCopy =
$"{minx + i * stepX},{miny + j * stepY},{minx + (i + 1) * stepX},{miny + (j + 1) * stepY}";
var layerGroupThumb = layerGroupName + "-" + i + "-" + j + ".png";
if (num == 1)
{
layerGroupThumb = layerGroupName + ".png";
}
// 完整的目标文件路径
string filePath = Path.Combine(tempPath, layerGroupThumb);
var pngLink =
$"{geoserver}/{workspace}/wms?service=WMS&version=1.1.0&request=GetMap&layers={workspace}:{layerGroupName}&bbox={bboxCopy}&width={width}&height={height}&srs=EPSG:4326&styles=&TRANSPARENT=TRUE&format=image%2Fpng";
using (var client = new HttpClient())
{
using (var response = await client.GetAsync(pngLink))
{
response.EnsureSuccessStatusCode(); // 确保请求成功
// 将图片数据写入文件
await using (var fileStream =
new FileStream(filePath, FileMode.Create, FileAccess.Write,
FileShare.None))
{
await response.Content.CopyToAsync(fileStream);
}
}
}
//Console.WriteLine($"图片已成功下载到: {filePath}");
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
return new Response<bool>
{
Result = true
};
}
public dynamic GetTifCrs(string filePath)
{
return GeoUtil.GetTifCrs(filePath);
}
}