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

550 lines
23 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}