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 { public GeoTiffManagerApp(ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth) : base(unitWork, repository, auth) { } // 影像管理列表 public async Task>>> LoadPage(GeoTiffManagerReq req) { RefAsync totalCount = 0; var sources = await base.Repository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(req.key), a => a.DataTable.Contains(req.key)) .Select(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>> { Result = new PageInfo> { Items = sources, Total = totalCount } }; } /// /// 影像管理详情 /// /// /// public GeoTiffManager Get(string id) { return Repository.GetById(id); } /// /// 影像更新 /// /// /// public async Task>> 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(); 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 日期(区域 * n(tif) 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 { layerName }); } else { var layers = $"{workspace}:{layerName}"; 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> { Result = errorList, Message = "以下影像tif发布失败:" + string.Join(",", errorList) }; } return new Response> { Result = new List() }; } 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>> 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 totalCount = 0; var result = await db.SqlQueryable(sql).ToPageListAsync(req.page, req.limit, totalCount); foreach (var tifInfo in result) { tifInfo.AccessUrl = geoserverAccess.Replace("LAYER_NAME", tifInfo.TifName); } return new PageInfo>() { Items = result }; } /// /// 影像创建图层组 /// /// /// public async Task> 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 + "" + myworkspace + ":" + layerName + ""; if (!isSuccess.Result) { // throw new Exception("tiff影像发布失败"); } } await GeoUtil.publishLayerGroup(myworkspace, layer, "linyiAllYingxiang"); return new Response { 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 + "" + myworkspace + ":" + layerName + ""; if (!isSuccess.Result) { throw new Exception("tiff影像发布失败"); } } await GeoUtil.publishLayerGroup(myworkspace, layer, "yanganyingxiang"); return new Response { Result = true }; } } public async Task> DeleteTifStore(string stores) { var storeList = stores.Split(",").ToList(); var failList = new List(); 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 { Result = true, Message = string.Join(",", failList) }; } public async Task> 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 { Result = true }; } public dynamic GetTifCrs(string filePath) { return GeoUtil.GetTifCrs(filePath); } }