using System; using System.Data; using System.Dynamic; using System.IO.Compression; using System.Text; using DocumentFormat.OpenXml.Bibliography; using DocumentFormat.OpenXml.EMMA; using DocumentFormat.OpenXml.Office.CustomUI; using Infrastructure; using Infrastructure.Extensions; using Microsoft.Extensions.Options; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using NetTopologySuite.IO.Esri; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.BaseApp.Shape.Request; using OpenAuth.App.BasicQueryService; using OpenAuth.App.FormScheme; using OpenAuth.App.FormScheme.FormHelpers; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.App.ServiceApp.ShpGeo.Request; using OpenAuth.App.Shape.Request; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using Org.BouncyCastle.Ocsp; using SqlSugar; using Shapefile = NetTopologySuite.IO.Esri.Shapefile; namespace OpenAuth.App.BaseApp.Shape; public class ShpLayerSourceApp : SqlSugarBaseApp { private readonly string _filePath; private readonly FormSchemeApp _formSchemeApp; private readonly ISqlSugarClient _client; CommonDataManager _commonDataManager; public ShpLayerSourceApp(ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth, FormSchemeApp formSchemeApp, IOptions setOptions, ISqlSugarClient client, CommonDataManager commonDataManager) : base(unitWork, repository, auth) { _filePath = setOptions.Value.UploadPath; if (string.IsNullOrEmpty(_filePath)) { _filePath = AppContext.BaseDirectory; } _formSchemeApp = formSchemeApp; _client = client; _commonDataManager = commonDataManager; } public async Task> Add(ShpLayerSource obj) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) { throw new CommonException("登录已过期", Define.INVALID_TOKEN); } ShpLayerSource source = obj; source.CreateTime = DateTime.Now; source.Id = Guid.NewGuid().ToString(); source.CreateId = loginContext.User.Id.ToString(); var flag = await base.Repository.InsertAsync(source); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } public async Task>>> LoadPage(ShpLayerSourceReq req) { RefAsync totalCount = 0; var sources = await base.Repository.AsQueryable() .Where(c => c.Status.Equals(1)) .WhereIF(!string.IsNullOrEmpty(req.name), a => a.Name.Contains(req.name)) .ToPageListAsync(req.page, req.limit, totalCount); return new Response>> { Result = new PageInfo> { Items = sources, Total = totalCount } }; } public ShpLayerSource Get(string id) { return base.Repository.GetById(id); } public Response CreateTable(string tableName) { //using (var db = this.CodeClient("", _configuration)) using (var db = base.Repository.AsSugarClient()) { // 原生SQL建表语句 /* string createTableSql = @" CREATE TABLE demo_demo_haha ( id varchar(64) NOT NULL, enterprise_id varchar(255) , geom geometry(GEOMETRY), CONSTRAINT demo_haha_pkey_hahah PRIMARY KEY (id) );"; // 执行建表语句 db.Db.Ado.ExecuteCommand(createTableSql); db.Commit();*/ db.Ado.BeginTran(); // todo 校验表名存不存,若存在重新生成表名 // db.DbMaintenance.IsAnyTable(tableName,false); var typeBuilder = db.DynamicBuilder() .CreateClass(tableName, new SugarTable() { TableName = tableName, TableDescription = "测试动态类型建表" }); List dbColumnInfoList = new List(); DbColumnInput col = new DbColumnInput(); // 添加主键 col.DbColumnName = "id"; col.DataType = "varchar"; col.Length = 36; col.IsNullable = 0; col.IsPrimarykey = 1; col.ColumnDescription = "主键"; dbColumnInfoList.Add(col); // 添加几何字段 col = new DbColumnInput(); col.DbColumnName = "geom"; col.DataType = "geometry(GEOMETRY, 4326)"; col.IsNullable = 1; col.ColumnDescription = "几何图形"; dbColumnInfoList.Add(col); dbColumnInfoList.ForEach(u => { typeBuilder.CreateProperty(u.DbColumnName, typeof(string), new SugarColumn() { IsPrimaryKey = u.IsPrimarykey == 1, IsIdentity = u.IsIdentity == 1, ColumnDataType = u.DataType, Length = u.Length, IsNullable = u.IsNullable == 1, DecimalDigits = u.DecimalDigits, ColumnDescription = u.ColumnDescription, }); }); db.CodeFirst.InitTables(typeBuilder.BuilderType()); db.Ado.CommitTran(); Console.WriteLine("Table created successfully."); return new Response() { Code = 200, Result = true, Message = "创建成功" }; } } public byte[] QueryMapbox(QueryMapboxReq req) { QueryVectorTileByTableReq reqCopy = new QueryVectorTileByTableReq(); reqCopy.x = req.x; reqCopy.y = req.y; reqCopy.z = req.z; string serviceId = req.serviceId; // todo 根据serviceId // todo 查询表名 //reqCopy.table = ""; // throw new Exception("未查询到表名"); return _formSchemeApp.QueryVectorTileByTable(reqCopy); } [Obsolete("不再使用")] public async Task CreateGISLayer(string zipFilePath, string tableName, string srid, string serverName) { // _filePath 调试时路径:D:\vs\project\基础框架后端svn\OpenAuth.WebApi\bin\Debug\net6.0 Console.WriteLine("项目基本目录:" + _filePath); //zipFilePath = "C:\\Users\\Admin\\Desktop\\4490.zip"; zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".")) + "extract"; Console.WriteLine("解压根目录:" + extractPath); await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } string shpFileName = fileName[0]; //Console.WriteLine($"{shpFileName}"); // shpFile 文件路径 string shpFile = Path.Combine(extractPath, shpFileName); //Console.WriteLine($"{shpFile}"); // 动态类型插入 using (var db = Repository.AsSugarClient()) { if (db.DbMaintenance.IsAnyTable(tableName, false)) { throw new Exception(tableName + "已存在"); } // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); var typeBuilder = db.DynamicBuilder().CreateClass(tableName, new SugarTable() { TableName = tableName, TableDescription = serverName + "图斑" }); List dbColumnInfoList = new List(); DbColumnInput col = new DbColumnInput(); // 添加主键 col.DbColumnName = "id"; col.DataType = "varchar"; col.Length = 36; col.IsNullable = 0; col.IsPrimarykey = 1; col.ColumnDescription = "主键"; dbColumnInfoList.Add(col); // 添加几何字段 col = new DbColumnInput(); col.DbColumnName = "geom"; col.DataType = "geometry(GEOMETRY, " + srid + ")"; col.IsNullable = 1; col.ColumnDescription = "几何图形"; dbColumnInfoList.Add(col); // 外键 col = new DbColumnInput(); col.DbColumnName = "relation_id"; col.Length = 36; col.DataType = "varchar"; col.IsNullable = 1; col.ColumnDescription = "关联图层表字段"; dbColumnInfoList.Add(col); dbColumnInfoList.ForEach(u => { typeBuilder.CreateProperty(u.DbColumnName, typeof(string), new SugarColumn() { IsPrimaryKey = u.IsPrimarykey == 1, IsIdentity = u.IsIdentity == 1, ColumnDataType = u.DataType, Length = u.Length, IsNullable = u.IsNullable == 1, DecimalDigits = u.DecimalDigits, ColumnDescription = u.ColumnDescription, }); }); db.CodeFirst.InitTables(typeBuilder.BuilderType()); // end createTable var loginContext = _auth.GetCurrentUser(); // 新建图层表记录 string layerId = Guid.NewGuid().ToString(); ShpLayerSource layerSource = new ShpLayerSource() { Id = layerId, Name = serverName, // 图层名称 RelationTable = tableName, // 数据表表名 Srid = srid, // 空间参考 CreateTime = DateTime.Now, CreateId = loginContext.User.Id.ToString() }; db.Insertable(layerSource).AS("shp_layer_source") .InsertColumns("Id", "Name", "RelationTable", "Srid", "CreateTime", "CreateId").ExecuteCommand(); foreach (var geometry in Shapefile.ReadAllGeometries(shpFile)) { var insertObj = new Dictionary { { "id", Guid.NewGuid().ToString() }, { "geom", geometry.AsBinary() }, { "relation_id", layerId } }; int insertCount = db.Insertable(insertObj) .AS(tableName) // 指定目标表名 .InsertColumns("id", "geom", "relation_id") // 指定要插入的列 .ExecuteCommand(); } // 提交事务 db.Ado.CommitTran(); } Console.WriteLine("shp录入完成"); // 刪除解压文件 DeleteFile(extractPath); return "ok"; } private static async Task UnZip(string zipFilePath, string extractPath) { await Task.Run(() => { Directory.CreateDirectory(extractPath); // 设置字符编码 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var gbk = Encoding.GetEncoding("utf-8"); using (var archive = ZipFile.OpenRead(zipFilePath)) { // 列举ZIP文件中的条目 foreach (var entry in archive.Entries) { var xxx = gbk.GetString(Encoding.Default.GetBytes(entry.FullName)); Console.WriteLine(xxx); } // 提取ZIP文件中的所有文件到指定目录 foreach (var entry in archive.Entries) { if (entry.Name != string.Empty) { // 确保完整路径存在 entry.FullName 是否可以编码 var fixedEntryName = entry.FullName.Replace("/", ""); var destinationPath = Path.GetFullPath(Path.Combine(extractPath, fixedEntryName)); Console.WriteLine("解压文件路径:" + destinationPath); if (!destinationPath.StartsWith(Path.GetFullPath(extractPath) + Path.DirectorySeparatorChar)) { throw new UnauthorizedAccessException("试图提取的文件超出了目标文件夹的路径边界。"); } // 提取条目到目标路径 entry.ExtractToFile(destinationPath, overwrite: true); } } } // 遍历解压目录,是否有shp后缀的文件 if (!Directory.Exists(extractPath)) { throw new Exception("文件解压失败"); } }); } private static void DeleteFile(string extractPath) { try { // 递归删除目录和其内容 Directory.Delete(extractPath, true); Console.WriteLine("解压目录删除成功"); } catch (IOException ex) { Console.WriteLine("解压目录不能删除: " + ex.Message); } catch (UnauthorizedAccessException ex) { Console.WriteLine("没有权限删除解压目录: " + ex.Message); } } [Obsolete("测试方法是可行,已无用")] public async Task TestReadShpFeature(string filePath) { filePath = Path.Combine(_filePath, filePath); // 确保ZIP文件存在 if (!File.Exists(filePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = filePath.Substring(0, filePath.LastIndexOf(".")) + "extract"; await UnZip(filePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 string[] fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); // 使用ShapefileDataReader读取.shp文件 using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { while (dataReader.Read()) { /* for (var i = 0; i < dataReader.FieldCount; i++) { Console.WriteLine(dataReader.GetName(i)); Console.WriteLine(dataReader.GetValue(i)); } */ // 获取DbfDataReader,用于读取属性信息 var dbfReader = dataReader.DbaseHeader; for (var i = 0; i < dbfReader.Fields.Length; i++) { Console.Write(dbfReader.Fields[i].Name + " "); Console.Write(dbfReader.Fields[i].Type + " "); Console.Write(" " + dbfReader.Fields[i].Length); Console.WriteLine(); } break; } } Console.WriteLine("结束运行"); /*var shpReader = Shapefile.OpenRead(shpFile); foreach (var field in shpReader.Fields) { Console.Write(field.Name + " "); Console.Write(field.FieldType); Console.Write(" " + field.Length); Console.WriteLine(" " + field.Value); }*/ /*var y = Shapefile.ReadAllFeatures(shpFile); foreach (var feature in y) { }*/ return "ok"; } private static string MapDbaseTypeToPostgresString(char dbaseType) { return dbaseType switch { 'C' => "varchar", 'N' => "numeric", 'L' => "boolean", 'D' => "date", 'M' => "text", _ => "unknown" }; } public async Task> ParseShpInfo(string zipFilePath, string serviceName, string tableName, string srid) { using var db = Repository.AsSugarClient(); // 开启事务 if (db.DbMaintenance.IsAnyTable(tableName)) { throw new Exception("表名已存在"); } // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } var exist = await db.Queryable() .Where(c => c.RelationTable.Equals(tableName)) .Where(c => c.Status.Equals(1)) // 已发布 .CountAsync(); if (exist > 0) { throw new Exception(tableName + "关联图层已发布"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 string[] fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); var shapeType = Shapefile.GetShapeType(shpFile); var shpInfo = new ShpInfo(); switch (shapeType) { case ShapeType.Point: shpInfo.DataType = "点"; break; case ShapeType.Polygon: shpInfo.DataType = "面"; break; case ShapeType.PolyLine: shpInfo.DataType = "线"; break; default: throw new Exception("不支持的shp类型: " + shapeType); } List attrs = new List(); // 添加自定义字段 var geom = new DataTableAttr { Name = "Geometry", Type = string.Concat("geometry(GEOMETRY, ", srid.AsSpan(srid.LastIndexOf(":", StringComparison.Ordinal) + 1), ")") }; attrs.Add(geom); using (var reader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { // 获取DbfDataReader,用于读取属性信息 var dbfReader = reader.DbaseHeader; foreach (var dbaseFieldDescriptor in dbfReader.Fields) { DataTableAttr attr = new DataTableAttr(); attr.Name = dbaseFieldDescriptor.Name; attr.Length = dbaseFieldDescriptor.Length; attr.Type = MapDbaseTypeToPostgresString(dbaseFieldDescriptor.DbaseType); attrs.Add(attr); } } shpInfo.Headers = attrs; // 创建图层记录 var loginContext = _auth.GetCurrentUser(); var layerId = Guid.NewGuid().ToString(); var layerSource = new ShpLayerSource() { Id = layerId, // guid主键 Name = serviceName, // 图层名称 RelationTable = tableName, // 数据表表名 ShpPath = zipFilePath, Srid = srid, // 空间参考 CreateTime = DateTime.Now, CreateId = loginContext.User.Id.ToString() }; await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 插入图层记录 await db.Insertable(layerSource).AS("shp_layer_source") .InsertColumns("Id", "Name", "RelationTable", "ShpPath", "Srid", "CreateTime", "CreateId") .ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); shpInfo.TableName = tableName; return new Response() { Result = shpInfo, Message = "ok" }; } public async Task> CreateDataTable(ShpInfo shpInfo) { using var db = Repository.AsSugarClient(); var tableName = shpInfo.TableName; // 校验 表是否存在 var exist = await db.Queryable() .Where(c => c.RelationTable.Equals(tableName)) .Where(c => c.Status.Equals(1)) // 已发布 .CountAsync(); if (exist > 0) { throw new Exception(tableName + "关联图层已发布"); } // 查询未发布图层 var shpLayerSource = await db.Queryable() .Where(c => c.Name.Equals(shpInfo.serviceName)) .Where(c => c.Status.Equals(0)) .FirstAsync(); if (shpLayerSource.IsNullOrEmpty()) { throw new Exception("未执行shp解析"); } // 创建数据表 var typeBuilder = db.DynamicBuilder().CreateClass(tableName, new SugarTable() { TableName = tableName, TableDescription = shpInfo.serviceName + "图斑" }); //添加主键 typeBuilder.CreateProperty("geom_id", typeof(string), new SugarColumn() { IsPrimaryKey = true, IsIdentity = false, ColumnDataType = "varchar", Length = 36, ColumnDescription = "主键", }); shpInfo.Headers.ForEach(u => { typeBuilder.CreateProperty(u.RefName, typeof(string), new SugarColumn() { IsPrimaryKey = false, IsIdentity = false, ColumnDataType = u.Type, IsNullable = true, Length = u.Length, ColumnDescription = u.InitName, }); }); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 创建表 db.CodeFirst.InitTables(typeBuilder.BuilderType()); // 插入图斑数据 var shpPath = shpLayerSource.ShpPath; var extractPath = shpPath.Substring(0, shpPath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("未找到shp文件"); } string shpFileName = fileName[0]; // shpFile 文件路径 string shpFile = Path.Combine(extractPath, shpFileName); var rows = new List>(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { while (dataReader.Read()) { var insertObj = new Dictionary { { "geom_id", Guid.NewGuid().ToString() } }; for (int i = 0, j = 0; i < dataReader.FieldCount; i++) { if (shpInfo.Headers[j].Name.Equals(dataReader.GetName(i))) { insertObj.Add(shpInfo.Headers[j++].RefName, dataReader.GetValue(i)); } } rows.Add(insertObj); } } // 批量插入 var cols = new string[shpInfo.Headers.Count + 1]; for (var i = 0; i < shpInfo.Headers.Count; i++) { cols[i] = shpInfo.Headers[i].RefName; } cols[^1] = "geom_id"; await db.Insertable(rows) .AS(tableName) // 指定目标表名 .InsertColumns(cols) // 指定要插入的列 .ExecuteCommandAsync(); // 更新图层记录 var shpLayerSourceRecord = new ShpLayerSource { // 设置主键 Id = shpLayerSource.Id, // 设置图层发布状态 Status = 1 }; await db.Updateable(shpLayerSourceRecord).IgnoreNullColumns().ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); return new Response() { Result = true, Message = "ok" }; } /// /// 发布图层 /// /// /// public async Task> PublishLayer(PublishLayerReq publishLayerReq) { var shpLayerSource = publishLayerReq.MapTo(); // 设置主键 shpLayerSource.Id = Guid.NewGuid().ToString(); // 设置发布状态 shpLayerSource.Status = 1; var loginContext = _auth.GetCurrentUser(); shpLayerSource.CreateId = loginContext.User.Id.ToString(); shpLayerSource.CreateTime = DateTime.Now; using var db = Repository.AsSugarClient(); await db.Ado.BeginTranAsync(); await db.Insertable(shpLayerSource).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); return new Response() { Result = true, Message = "发布成功" }; } /// /// 图层更新 /// /// /// public async Task> UpdateLayer(UpdateLayerReq updateLayerReq) { var db = Repository.AsSugarClient(); await db.Ado.BeginTranAsync(); var record = updateLayerReq.MapTo(); await db.Updateable(record).IgnoreNullColumns().ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); return new Response() { Result = true, Message = "更新成功" }; } /// /// 删除图层 /// /// /// public async Task> DeleteLayer(string id) { var db = Repository.AsSugarClient(); await db.Ado.BeginTranAsync(); await db.Deleteable().Where(c => c.Id.Equals(id)).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); return new Response() { Result = true, Message = "删除成功" }; } public async Task>>> GetShapeData(ShapePageReq req) { var whereSql = ""; if (!req.FieldName.IsNullOrEmpty()) { whereSql += "where " + req.FieldName + " in ("; whereSql = req.FieldValue.Aggregate(whereSql, (current, item) => current + ("'" + item + "',")); whereSql = string.Concat(whereSql.AsSpan(0, whereSql.Length - 1), ")"); } using var db = Repository.AsSugarClient(); /* var sql = $"SELECT gid,ST_AsText(geom) as geom " + $"FROM {req.TableName} {whereSql} LIMIT {req.limit} OFFSET ({req.limit} * ({req.page} - 1))"; */ var sql = $"SELECT gid,ST_AsText(geom) as geom " + $"FROM {req.TableName} {whereSql} LIMIT {req.limit} OFFSET ({req.limit} * ({req.page} - 1))"; var result = await db.Ado.SqlQueryAsync(sql); return new Response>> { Result = new PageInfo> { Items = result, Total = result.Count } }; } public async Task>> SaveShapeData(ShapeDataForm req) { var wktReader = new WKTReader(); var rows = new List>(); var ids = new List(); foreach (var wkt in req.Data) { var geometry = wktReader.Read(wkt); var id = Guid.NewGuid().ToString(); ids.Add(id); var insertObj = new Dictionary { { req.GuidFieldName, id }, { req.GeometryFieldName, geometry.AsBinary() } }; rows.Add(insertObj); } using (var db = Repository.AsSugarClient()) { await db.Ado.BeginTranAsync(); await db.Insertable(rows).AS(req.TableName).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); } return new Response>() { Result = ids, Message = "ok" }; } #region 前端地图配置 /// /// 查询配置 /// public async Task> LoadSettingConfig(string code) { var info = await base.Repository.ChangeRepository>().AsQueryable() .Where(r => r.Code == code) .FirstAsync(); return new Response { Result = info }; } /// /// 添加配置 /// public async Task> AddSettingConfig(FrontendSettingConfig obj) { var flag = await base.Repository.ChangeRepository>().InsertAsync(obj); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } /// /// 更新配置 /// /// public async Task> UpdateSettingConfig(FrontendSettingConfig obj) { bool flag = await base.Repository.ChangeRepository>().UpdateAsync(u => new FrontendSettingConfig { CodeValue = obj.CodeValue, }, u => u.Code == obj.Code); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } /// /// 删除配置 /// /// public async Task> DeleteSettingConfig(string code) { var flag = await base.Repository.ChangeRepository>() .DeleteAsync(r => r.Code == code); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } #endregion public async Task>> GetIllegalShapeData(string caseid, string category) { // 违法用地 非法采矿 耕地非粮化 重点问题 巡察审计 var tableName = "drone_caseinfo_single"; var caseNo = "case_no"; switch (category) { case "非法采矿卫片下发": tableName = "drone_caseinfo_wpxf"; break; case "非法采矿工作管理": tableName = "drone_caseinfo_minerals"; caseNo = "tubannum_base"; break; case "耕地非粮化": tableName = "drone_caseinfo_gdflh"; break; case "重点问题\u2160类": tableName = "drone_caseinfo_zdwt1"; break; case "重点问题\u2161类": tableName = "drone_caseinfo_zdwt2"; break; case "巡察审计": tableName = "drone_caseinfo_xcsj"; break; case "生态保护红线监管": tableName = "drone_caseinfo_sthx"; break; case "生态修复": tableName = "drone_caseinfo_stxf"; break; case "设施农用地": tableName = "drone_ssnyd"; caseNo = "xiangmu_no"; break; } using var db = Repository.AsSugarClient(); var sql = $"SELECT s.gid,ST_AsText(geom) as geom,c.{caseNo} as caseno FROM drone_shp_data s left join {tableName} c on s.relid = c.\"Id\" where c.\"Id\" = '{caseid}'"; var result = await db.Ado.SqlQueryAsync(sql); return new Response>() { Result = result, Message = "ok" }; } #region 案件审核,上传shp /// /// 违法用地 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpData(string zipFilePath,string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoSingle cinfo = new DroneCaseInfoSingle(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.is_intact = 1; cinfo.synchronoustime = DateTime.Now; cinfo.handle_status_id = 0; cinfo.handle_status_name = "待接收"; cinfo.is_jieshou = 0; cinfo.is_closed = 0; cinfo.is_delete = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); if (type != null) { cinfo.typeid = type.ItemDetailId; } //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { var aa = dataReader.GetValue(2).ToString(); var bb= dataReader.GetValue(0).ToString(); decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); cinfo.address = cinfo.countyname+" " + cinfo.streetname+" " + cinfo.communityname; } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid)+i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoSingle.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 非粮化 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpDataFLH(string zipFilePath, string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoFLH cinfo = new DroneCaseInfoFLH(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.is_intact = 1; cinfo.synchronoustime = DateTime.Now; cinfo.handle_status_id = 0; cinfo.handle_status_name = "待接收"; cinfo.is_jieshou = 0; cinfo.is_closed = 0; cinfo.is_delete = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); if (type != null) { cinfo.typeid = type.ItemDetailId; } //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { var aa = dataReader.GetValue(2).ToString(); var bb = dataReader.GetValue(0).ToString(); decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); cinfo.address = cinfo.countyname + " " + cinfo.streetname + " " + cinfo.communityname; } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid) + i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoFLH.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 重点问题1 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpDataZDWT1(string zipFilePath, string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoZdwt1 cinfo = new DroneCaseInfoZdwt1(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.is_intact = 1; cinfo.synchronoustime = DateTime.Now; cinfo.handle_status_id = 0; cinfo.handle_status_name = "待接收"; cinfo.is_jieshou = 0; cinfo.is_closed = 0; cinfo.is_delete = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); if (type != null) { cinfo.typeid = type.ItemDetailId; } //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { var aa = dataReader.GetValue(2).ToString(); var bb = dataReader.GetValue(0).ToString(); decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); cinfo.address = cinfo.countyname + " " + cinfo.streetname + " " + cinfo.communityname; } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid) + i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoZdwt1.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 重点问题2 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpDataZDWT2(string zipFilePath, string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoZdwt2 cinfo = new DroneCaseInfoZdwt2(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.is_intact = 1; cinfo.synchronoustime = DateTime.Now; cinfo.handle_status_id = 0; cinfo.handle_status_name = "待接收"; cinfo.is_jieshou = 0; cinfo.is_closed = 0; cinfo.is_delete = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); if (type != null) { cinfo.typeid = type.ItemDetailId; } //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { var aa = dataReader.GetValue(2).ToString(); var bb = dataReader.GetValue(0).ToString(); decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); cinfo.address = cinfo.countyname + " " + cinfo.streetname + " " + cinfo.communityname; } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid) + i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoZdwt2.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 巡查审计 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpDataXCSJ(string zipFilePath, string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoXcsj cinfo = new DroneCaseInfoXcsj(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.is_intact = 1; cinfo.synchronoustime = DateTime.Now; cinfo.handle_status_id = 0; cinfo.handle_status_name = "待接收"; cinfo.is_jieshou = 0; cinfo.is_closed = 0; cinfo.is_delete = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); if (type != null) { cinfo.typeid = type.ItemDetailId; } //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { var aa = dataReader.GetValue(2).ToString(); var bb = dataReader.GetValue(0).ToString(); decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); cinfo.address = cinfo.countyname + " " + cinfo.streetname + " " + cinfo.communityname; } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid) + i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoXcsj.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 卫片下发 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpDataWPXF(string zipFilePath, string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoSatellite cinfo = new DroneCaseInfoSatellite(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.is_intact = 1; cinfo.synchronoustime = DateTime.Now; cinfo.handle_status_id = 0; cinfo.handle_status_name = "待接收"; cinfo.is_jieshou = 0; cinfo.is_closed = 0; cinfo.is_delete = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); if (type != null) { cinfo.typeid = type.ItemDetailId; } //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { var aa = dataReader.GetValue(2).ToString(); var bb = dataReader.GetValue(0).ToString(); decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); cinfo.address = cinfo.countyname + " " + cinfo.streetname + " " + cinfo.communityname; } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid) + i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoSatellite.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 矿产 /// /// /// /// /// /// public async Task> UpdateCaseInfoShpDataMinerals(string zipFilePath, string srid) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { int i = 0; while (dataReader.Read()) { DroneCaseInfoMinerals cinfo = new DroneCaseInfoMinerals(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); //cinfo.createusername = _user.Name.ToString(); cinfo.is_illegal = 1; cinfo.xiafatime_base = DateTime.Now; cinfo.handle_status_id = 1; cinfo.is_closed = 0; cinfo.case_description = dataReader.GetValue(2).ToString(); if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.weifaarea_base = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.centerlng_base = dataReader.GetValue(3).ToString(); cinfo.centerlat_base = dataReader.GetValue(4).ToString(); JObject xzqh = GetOrgAreaByPoint(lng, lat); var cc = (string)xzqh["countyid"]; cinfo.countyid = xzqh["countyid"].ToString(); cinfo.countyname = xzqh["countyname"].ToString(); cinfo.streetid = xzqh["streetid"].ToString(); cinfo.streetname = xzqh["streetname"].ToString(); cinfo.communityid = xzqh["communityid"].ToString(); cinfo.communityname = xzqh["communityname"].ToString(); } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { Random random = new Random(); bool isUnique; var prefix = "KC"; do { var caseno = prefix + cinfo.countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //图斑数据drone_shp_data DroneShpData model = new DroneShpData(); model.relid = cinfo.Id; model.createtime = DateTime.Now; model.createuser = _user.Name; //获取主键 string _gid = _commonDataManager.GetMaxKeyVal("gid", "drone_shp_data", 1); model.gid = int.Parse(_gid) + i;//转为数字类型 i++; cinfo.geomid = model.gid.ToString(); //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_shp_data set geom = '{geometryForWgs84.AsText()}' where gid = '{model.gid}';"); } model.geom = null; sql.AppendFormat($" update drone_shp_data set area = st_area(st_transform(ST_SetSRID(geom,4326), 4527)) where gid = '{model.gid}';"); shplist.Add(model); datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { await uow.DroneCaseInfoMinerals.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } /// /// 根据经纬度获取组织机构 /// /// /// /// public JObject GetOrgAreaByPoint(decimal lng, decimal lat) { //县id string countyid = ""; string countyname = ""; //镇id string streetid = ""; string streetname = ""; //村id string communityid = ""; string communityname = ""; //SqlSugar实例 using (var db = Repository.AsSugarClient()) { //查询坐标属于哪个县 StringBuilder sql = new StringBuilder(); sql.AppendFormat($" SELECT xzqdm,xzqmc FROM \"shp_drone_county\" where ST_Within(st_geomfromtext('POINT({lng} {lat})',4326), ST_SetSRID(geom,4326))"); var countyList = db.SqlQueryable(sql.ToString()).ToList(); if (countyList.Count > 0) { //县名称 countyname = countyList[0].xzqmc; //县id countyid= countyList[0].xzqdm; } //查询坐标属于哪个镇 sql = new StringBuilder(); sql.AppendFormat($" SELECT xzqdm,xzqmc FROM \"shp_drone_town\" where ST_Within(st_geomfromtext('POINT({lng} {lat})',4326), ST_SetSRID(geom,4326))"); var streetList = db.SqlQueryable(sql.ToString()).ToList(); if (streetList.Count > 0) { //镇名称 streetname = streetList[0].xzqmc; //镇id streetid= streetList[0].xzqdm; } if (!string.IsNullOrEmpty(streetid)) { //查询组织机构属于哪个村 sql = new StringBuilder(); sql.AppendFormat($" SELECT zldwdm,zldwmc FROM \"shp_drone_community\" where ST_Within(st_geomfromtext('POINT({lng} {lat})',4326), ST_SetSRID(geom,4326))"); var communityidList = db.SqlQueryable(sql.ToString()).ToList(); if (communityidList.Count > 0) { //村名称 communityname = communityidList[0].zldwmc; //村id communityid= communityidList[0].zldwdm; } } //拼接json数据,返回到前台 JObject obj = new JObject(); obj.Add("countyid", countyid); obj.Add("countyname", countyname); obj.Add("streetid", streetid); obj.Add("streetname", streetname); obj.Add("communityid", communityid); obj.Add("communityname", communityname); return obj; } } #endregion #region 导入shp数据新版 /// /// 违法用地 /// /// /// /// /// /// public async Task> importCaseInfoShpData(string zipFilePath, string srid,string subjectname) { var _user = _auth.GetCurrentUser().User; using var db = Repository.AsSugarClient(); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 取得文件完全路径 zipFilePath = Path.Combine(_filePath, zipFilePath); // 确保ZIP文件存在 if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("ZIP文件未找到。"); } // 打开ZIP存档 取除后缀之前的字符串 var extractPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf(".", StringComparison.Ordinal)) + "extract"; // 解压文件 await UnZip(zipFilePath, extractPath); var searchPattern = "*.shp"; // 设置你想要遍历的文件后缀名 var fileName = Directory.GetFiles(extractPath, searchPattern, SearchOption.AllDirectories); if (fileName.IsEmpty()) { throw new Exception("压缩文件中无shp文件"); } var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); List datalist = new List(); List shplist = new List(); StringBuilder geomSql = new StringBuilder(); //批量更新面积 StringBuilder sql = new StringBuilder(); Random random = new Random(); //批次号 var pici = DateTime.Now.ToString("yyyyMMssHHmmss") + random.Next(1000, 9999).ToString(); // string countyid = ""; using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { while (dataReader.Read()) { DroneCaseInfoImport cinfo = new DroneCaseInfoImport(); cinfo.Id = Guid.NewGuid().ToString(); cinfo.createtime = DateTime.Now; cinfo.createuser = _user.Id.ToString(); cinfo.createusername = _user.Name.ToString(); cinfo.case_description = dataReader.GetValue(2).ToString(); cinfo.subjectname = subjectname; cinfo.picihao = pici; if (dataReader.IsDBNull(6)) { throw new Exception("图斑面积不能为空"); } else { cinfo.area = dataReader.GetValue(6).ToString(); } if (dataReader.IsDBNull(7)) { throw new Exception("图斑来源不能为空"); } else { cinfo.tubanlaiyuan = dataReader.GetValue(7).ToString(); } cinfo.typename = dataReader.GetValue(5).ToString(); //类型id var type = db.Queryable().Where(r => r.ItemName == cinfo.typename && r.ItemCode == "DRONE_CASE_TYPE").First(); //坐标及行政区划 if (dataReader.IsDBNull(3) || dataReader.IsDBNull(4)) { throw new Exception("坐标不能为空"); } else { decimal lng = Convert.ToDecimal(dataReader.GetValue(3).ToString()); decimal lat = Convert.ToDecimal(dataReader.GetValue(4).ToString()); cinfo.lng = lng; cinfo.lat = lat; JObject xzqh = GetOrgAreaByPoint(lng, lat); countyid = xzqh["countyid"].ToString(); } //案件编号 if (!dataReader.IsDBNull(1)) { var caseinfo = _client.Queryable().Where(r => r.case_no == dataReader.GetValue(1).ToString()).ToList(); if (caseinfo.Count > 0) { throw new Exception("图斑编号" + dataReader.GetValue(1).ToString() + "已存在,请重新整理数据"); } else { cinfo.case_no = dataReader.GetValue(1).ToString(); } } else { bool isUnique; var prefix = type?.Prefix; do { var caseno = prefix + countyid + DateTime.Now.ToString("yyyyMMdd") + random.Next(1000, 9999).ToString(); var count = db.Queryable().Where(c => c.case_no == caseno).Count(); isUnique = count == 0; } while (!isUnique); } //geom if (!dataReader.IsDBNull(0)) { var geometry = (Geometry)dataReader.GetValue(0); if (!geometry.IsValid) { throw new Exception("图斑" + cinfo.case_no + "未闭合,请重新整理数据"); } var geometryForWgs84 = GeometryFactory.Default.WithSRID(int.Parse(srid)) .CreateGeometry(geometry); geomSql.AppendFormat($" update drone_caseinfo_import set geom = '{geometryForWgs84.AsText()}' where \"Id\" = '{cinfo.Id}';"); } datalist.Add(cinfo); } } using (var uow = base.UnitWork.CreateContext()) { //await uow.DroneCaseInfoSingle.InsertRangeAsync(datalist); await uow.DroneShpData.InsertRangeAsync(shplist); await uow.Db.Ado.ExecuteCommandAsync(geomSql.ToString()); //await uow.Db.Ado.ExecuteCommandAsync(sql.ToString()); var flag = uow.Commit(); return new Response() { Result = flag, Message = "ok" }; } } #endregion }