using System.Data; using System.IO.Compression; using System.Text; using DocumentFormat.OpenXml.InkML; using Infrastructure; using Infrastructure.Utils; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using NetTopologySuite; using NetTopologySuite.Features; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.FormScheme.FormHelpers; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.App.ServiceApp.LayerManagerApp.Request; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using SqlSugar; using Shapefile = NetTopologySuite.IO.Esri.Shapefile; namespace OpenAuth.App.ServiceApp.LayerManagerApp; public class LayerApp : SqlSugarBaseApp { private readonly string _filePath; private readonly ISqlSugarClient _client; public LayerApp(ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth, IOptions setOptions, ISqlSugarClient client) : base(unitWork, repository, auth) { _client = client; _filePath = setOptions.Value.UploadPath; if (string.IsNullOrEmpty(_filePath)) { _filePath = AppContext.BaseDirectory; } } public async Task> UploadExcel(LayerReq req) { using var db = Repository.AsSugarClient(); var excelPath = Path.Combine(_filePath, req.FilePath); // excel名称 var excelFileName = Path.GetFileNameWithoutExtension(excelPath); // 使用NPOI读取Excel文件 using (var fileStream = new FileStream(excelPath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook; if (Path.GetExtension(excelPath).Equals(".xls")) { workbook = new HSSFWorkbook(fileStream); } else { workbook = new XSSFWorkbook(fileStream); } // var sheet = workbook.GetSheetAt(0); // 获取总行数 var rowCount = sheet.LastRowNum; if (rowCount < 3) { throw new Exception("只有两行表头"); } // 获取总列数 var columnCount = sheet.GetRow(0).LastCellNum; var headers = new List(); // 遍历表头 var chineseRow = sheet.GetRow(0); var englishRow = sheet.GetRow(1); for (var j = 0; j < columnCount; j++) { var header = new DataTableAttr { InitName = chineseRow.GetCell(j).ToString(), // 中文表头 RefName = englishRow.GetCell(j).ToString()?.ToLower(), // 英文表头 // 字段类型 Type = "string", // 原始字段名称 Name = englishRow.GetCell(j).ToString(), // 字段长度 Length = 64 }; headers.Add(header); } var keys = headers.Select(a => a.RefName).ToList(); if (!keys.Contains("lng") || !keys.Contains("lat")) { throw new Exception("缺少经纬度字段"); } var typeBuilder = db.DynamicBuilder().CreateClass(req.DataTable, new SugarTable() { TableName = req.DataTable, TableDescription = req.ServerName + "图斑" }); //添加主键 typeBuilder.CreateProperty("id", typeof(string), new SugarColumn() { IsPrimaryKey = true, IsIdentity = false, ColumnDataType = "varchar", Length = 36, ColumnDescription = "主键", }); //添加主键 typeBuilder.CreateProperty("geometry", typeof(string), new SugarColumn() { IsPrimaryKey = false, IsIdentity = false, // ColumnDataType = "geometry(GEOMETRY)", ColumnDataType = string.Concat("geometry(GEOMETRY,", req.SpatialRef.AsSpan(req.SpatialRef.LastIndexOf(":", StringComparison.Ordinal) + 1), ")"), ColumnDescription = "图斑", }); headers.ForEach(u => { if (!u.RefName.Equals("lng") && !u.RefName.Equals("lat")) { typeBuilder.CreateProperty(u.RefName, typeof(string), new SugarColumn() { IsPrimaryKey = false, IsIdentity = false, IsNullable = true, Length = u.Length, ColumnDescription = u.InitName, }); } }); // 开启事务 await db.Ado.BeginTranAsync(IsolationLevel.ReadCommitted); // 创建表 //db.CodeFirst.InitTables(typeBuilder.BuilderType()); var cols = new string[headers.Count]; for (var i = 0; i < headers.Count; i++) { if (headers[i].RefName.Equals("lng")) { cols[i] = "geometry"; } else if (headers[i].RefName.Equals("lat")) { cols[i] = "id"; } else { cols[i] = headers[i].RefName; } } var objs = new List>(1001); var num = 0; // 遍历数据行 for (var i = 2; i < rowCount; i++) { var row = sheet.GetRow(i); if (row == null) { continue; } var data = new Dictionary(); // 遍历列 string lat = null, lng = null; for (var j = 0; j < columnCount; j++) { var cell = row.GetCell(j); if (cell == null) { continue; } var cellValue = cell.ToString(); switch (headers[j].RefName) { case "lat": lat = cellValue; continue; case "lng": lng = cellValue; continue; default: data[headers[j].RefName] = cellValue; break; } } if (lat != null && lng != null) { var geography = NtsGeometryServices.Instance.CreateGeometryFactory( int.Parse(req.SpatialRef.Substring( req.SpatialRef.IndexOf(":", StringComparison.Ordinal) + 1))); var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat))); data["geometry"] = point.AsText(); } data["id"] = Guid.NewGuid().ToString(); objs.Add(data); if (num++ == 999) { await db.Insertable(objs) .AS(req.DataTable) // 指定目标表名 .InsertColumns(cols) // 指定要插入的列 .ExecuteCommandAsync(); num = 0; objs.Clear(); } } await db.Insertable(objs) .AS(req.DataTable) // 指定目标表名 .InsertColumns(cols) // 指定要插入的列 .ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); workbook.Close(); // 关于图层发布失败后,如何处理? // excel 矢量点发布图层 var response = await GeoUtil.CreateStoreAndLayer("", req.SpatialRef, req.DataTable, ""); // todo 保存图层信息 var dmLayer = new DmLayer() { Id = Guid.NewGuid().ToString(), SeverName = req.ServerName, SpatialRef = req.SpatialRef, SeverType = req.SeverType, // 服务类型 StoreType = "", //存储类型 DataSourceType = req.DataSourceType, TableRef = req.DataTable, ShapeType = req.ShapeType, StyleName = req.StyleName, // 样式名称 Description = req.Description, // 描述 Screenshot = req.Screenshot // 截图 }; await Repository.AsSugarClient().Insertable(dmLayer).ExecuteCommandAsync(); } return new Response { Result = true }; } public async Task> UploadShape(LayerReq req) { try { } catch (Exception ex) { throw new CommonException(ex.Message, 500); } return new Response { Result = true }; } public Response> TableDataByTableName(string tablename, string type, string keyword, string keyvalue, int page, int pagesize) { Dictionary result = new Dictionary(); // string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tablename + "'"; string sqlcom = $"SELECT \r\n\r\n\r\n c.column_name AS \"columnName\", pgd.description AS \"comment\" \r\nFROM \r\n information_schema.columns c\r\nLEFT JOIN \r\n " + $"pg_catalog.pg_description pgd ON pgd.objoid = c.table_name::regclass::oid \r\n AND pgd.objsubid = c.ordinal_position\r\nWHERE \r\n c.table_name ='" + tablename + "';"; //var cloumnlist = _client.Ado.SqlQuery(sql); var coment = _client.Ado.SqlQuery(sqlcom); //result.Add("head", cloumnlist); result.Add("headName", coment); string names = ""; string geoms = ""; for (int i = 0; i < coment.Count; i++) { var name = coment[i].columnName; if (name.Contains("geom")) { geoms = name; } else { names = names + "\"" + name + "\","; } } string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tablename + " where 1=1 "; string sql2 = ""; if (string.IsNullOrEmpty(keyword) || string.IsNullOrEmpty(keyvalue)) { sql1 = sql1 + "limit " + pagesize + " offset " + (page - 1) * pagesize; } else { sql1 = sql1 + " and " + keyword + " like '%" + keyvalue + "%'" + "limit " + pagesize + " offset " + (page - 1) * pagesize; sql2 = " and " + keyword + " like '%" + keyvalue + "%'"; } string sqlcount = $"select count(*) from " + tablename + " where 1=1 "; var count = _client.Ado.GetInt(sqlcount + sql2); var result1 = _client.Ado.SqlQuery(sql1); result.Add("data", result1); result.Add("total", count); return new Response> { Result = result }; } public Response TempeleteByTableName(string tablename, int type, string shpFilePath, string shpFilePathzip) { Response response = new Response(); string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tablename + "'"; var cloumnlist = _client.Ado.SqlQuery(sql); if (type == 0) { try { HSSFWorkbook workbook = new HSSFWorkbook(); IFont font = workbook.CreateFont(); //创建一个字体样式对象 font.FontName = "Microsoft YaHei"; //和excel里面的字体对应 font.Boldweight = (short)FontBoldWeight.Bold; //字体加粗 font.FontHeightInPoints = 12; //字体大小 ICellStyle style1 = workbook.CreateCellStyle(); //创建样式对象 style1.BorderBottom = BorderStyle.Thin; style1.BorderLeft = BorderStyle.Thin; style1.BorderRight = BorderStyle.Thin; style1.BorderTop = BorderStyle.Thin; style1.Alignment = HorizontalAlignment.Center; style1.VerticalAlignment = VerticalAlignment.Center; style1.SetFont(font); //将字体样式赋给样式对象 // 创建一个数值格式的CellStyle ICellStyle numericStyle = workbook.CreateCellStyle(); // 创建一个数据格式对象 IDataFormat dataFormat = workbook.CreateDataFormat(); var font11 = workbook.CreateFont(); font11.FontName = "Microsoft YaHei"; font11.FontHeightInPoints = 12; // 设置单元格格式为数值型 numericStyle.DataFormat = dataFormat.GetFormat("0.00"); numericStyle.BorderBottom = BorderStyle.Thin; numericStyle.BorderLeft = BorderStyle.Thin; numericStyle.BorderRight = BorderStyle.Thin; numericStyle.BorderTop = BorderStyle.Thin; numericStyle.Alignment = HorizontalAlignment.Center; numericStyle.VerticalAlignment = VerticalAlignment.Center; numericStyle.SetFont(font11); ISheet sheet = workbook.CreateSheet("Sheet0"); IRow rowHeader = sheet.CreateRow(0); rowHeader.Height = 20 * 30; for (int i = 0; i < cloumnlist.Count + 1; i++) { if (i == cloumnlist.Count) { rowHeader.CreateCell(i); rowHeader.Cells[i].CellStyle = style1; rowHeader.Cells[i].SetCellValue("lng"); } else { var header = cloumnlist[i]; if (header.Contains("geom")) { rowHeader.CreateCell(i); rowHeader.Cells[i].CellStyle = style1; rowHeader.Cells[i].SetCellValue("lat"); } else { rowHeader.CreateCell(i); rowHeader.Cells[i].CellStyle = style1; rowHeader.Cells[i].SetCellValue(header); } } } response.Result = new MemoryStream(); workbook.Write(response.Result); workbook = null; response.Result.Close(); response.Result.Dispose(); response.Code = 200; response.Message = "获取成功"; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } } if (type == 1) { List features = new List(); var attributes = new AttributesTable(); string wkt = "POINT(117.968055555555 35.4761111111111)"; var geometry = ParseGeometry(wkt); for (int i = 0; i < cloumnlist.Count; i++) { var header = cloumnlist[i]; if (header.Contains("geom")) { continue; } attributes.Add(header, 11); } IFeature feature = new Feature(geometry, attributes); features.Add(feature); // 导出 SHP 文件及其关联文件 ExportToShapefileFour(shpFilePath, features); // 将文件打包成 ZIP CreateZipFromShapefiles(shpFilePath, shpFilePathzip); } return response; } public Geometry ParseGeometry(string wkt) { if (string.IsNullOrEmpty(wkt)) { return null; } var reader = new WKTReader(); return reader.Read(wkt); } public void ExportToShapefileFour(string shpPath, List features) { //var geometryFactory = new GeometryFactory(); //// 写入 CPG 文件(定义字符编码) //var cpgPath = System.IO.Path.ChangeExtension(shpPath, "cpg"); //File.WriteAllText(cpgPath, "UTF-8", Encoding.UTF8); //// 获取 SHP 文件头 //var header = ShapefileDataWriter.GetHeader(features[0], features.Count); //// 创建 ShapefileDataWriter //var shapeFileWriter = new ShapefileDataWriter(shpPath, geometryFactory) //{ // Header = header //}; //// 写入 SHP 文件 //shapeFileWriter.Write(features); // 写入 CPG 文件(定义字符编码) string prjStr = @"GEOGCS[""GCS_China_Geodetic_Coordinate_System_2000"",DATUM[""D_China_2000"",SPHEROID[""CGCS2000"",6378137.0,298.257222101]],PRIMEM[""Greenwich"",0.0],UNIT[""Degree"",0.0174532925199433]]"; var cpgPath = Path.ChangeExtension(shpPath, "prj"); File.WriteAllText(cpgPath, prjStr, Encoding.UTF8); Shapefile.WriteAllFeatures(features, shpPath, encoding: Encoding.UTF8); } public void CreateZipFromShapefiles(string shpPath, string zipPath) { var files = new List { Path.ChangeExtension(shpPath, "cpg"), shpPath, Path.ChangeExtension(shpPath, "shx"), Path.ChangeExtension(shpPath, "dbf"), Path.ChangeExtension(shpPath, "prj") }; using (var zipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Create)) { foreach (var file in files) { if (File.Exists(file)) { zipArchive.CreateEntryFromFile(file, Path.GetFileName(file)); } } } } public async Task UploadExcel1(string tableName, IFormFile file) { if (file == null || file.Length == 0) { return false; } try { using (var stream = new MemoryStream()) { // 将文件复制到内存流 file.CopyTo(stream); stream.Position = 0; IWorkbook workbook; if (Path.GetExtension(file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) { workbook = new XSSFWorkbook(stream); // 处理 .xlsx 文件 } else { workbook = new HSSFWorkbook(stream); } // var sheet = workbook.GetSheetAt(0); // 获取总行数 var rowCount = sheet.LastRowNum; if (rowCount < 1) { throw new Exception("没有数据"); } var currentRow1 = sheet.GetRow(0); var cols = new string[currentRow1.LastCellNum]; for (int i = 0; i < currentRow1.LastCellNum; i++) { var cell1 = currentRow1.GetCell(i); cols[i] = cell1.ToString(); } var result = new List(); List> listmap = new List>(); // 遍历每一行 var maxid = nextid(tableName, "Id"); for (int row = 1; row <= rowCount; row++) { maxid++; var currentRow = sheet.GetRow(row); if (currentRow == null) continue; Dictionary map = new Dictionary(); string lat = null, lng = null; for (int col = 0; col < currentRow.LastCellNum; col++) { var cell = currentRow.GetCell(col); if (cell == null) { continue; } string head = cols[col]; var cellValue = cell.ToString(); if ("id".Equals(head.ToLower())) { map.Add(head, maxid); } switch (head) { case "lat": lat = cellValue; continue; case "lng": lng = cellValue; continue; case "Id": continue; case "id": continue; case "ID": continue; default: map.Add(head, cellValue); break; } } // 遍历列 if (lat != null && lng != null) { var geography = NtsGeometryServices.Instance.CreateGeometryFactory( int.Parse("4326")); var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat))); map["geom"] = point.AsText(); } listmap.Add(map); } _client.Insertable(listmap).AS(tableName).ExecuteCommand(); await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", tableName, ""); // 返回结果 return true; } } catch (Exception ex) { return false; } } public bool UpdateTableData(UpdateTableReq req) { string tableName = req.TableName; string id = ""; var list = req.list; string sql = "update " + tableName + " set "; string sql1 = ""; string num = ""; for (int i = 0; i < list.Count; i++) { var map = list[i]; if ("id".Equals(map["name"].ToString().ToLower())) { num = map["name"].ToString(); id = map["value"].ToString(); continue; } if (map["name"].ToString().ToLower().Contains("time")) { continue; } if (map["value"] != null) { sql1 = sql1 + "\"" + map["name"] + "\" = '" + map["value"] + "',"; } } var sql2 = sql1.Substring(0, sql1.Length - 1) + " where 1=1 and \"" + num + "\"=" + id; _client.Ado.ExecuteCommand(sql + sql2); return true; } public bool AddTableData(UpdateTableReq req) { string tableName = req.TableName; string id = ""; var list = req.list; string sql = "insert into " + tableName + " ( "; string sql1 = ""; string sql2 = ""; string num = ""; for (int j = 0; j < list.Count; j++) { var map = list[j]; if ("id".Equals(map["name"].ToString().ToLower())) { id = map["name"].ToString(); } } var maxid = nextid(req.TableName, id); for (int i = 0; i < list.Count; i++) { maxid++; var map = list[i]; if ("id".Equals(map["name"].ToString().ToLower())) { sql1 = sql1 + "\"" + map["name"] + "\","; sql2 = sql2 + maxid + ","; continue; } if (map["name"].ToString().ToLower().Contains("time")) { continue; } if (map["value"] != null) { sql1 = sql1 + "\"" + map["name"] + "\","; sql2 = sql2 + "'" + map["value"] + "'" + ","; } } var sql3 = sql1.Substring(0, sql1.Length - 1) + ") values(" + sql2.Substring(0, sql2.Length - 1) + ")"; _client.Ado.ExecuteCommand(sql + sql3); return true; } public bool UpdateTableData1(UpdateTableReq req) { string tableName = req.TableName; string id = ""; var list = req.list; string sql = "update " + tableName + " set "; string num = ""; for (int i = 0; i < list.Count; i++) { var map = list[i]; string sql1 = ""; foreach (KeyValuePair kvp in map) { string key = kvp.Key; object value = kvp.Value; if ("id".Equals(key.ToString().ToLower())) { num = key; id = value.ToString(); continue; } if (key.ToLower().Contains("time")) { continue; } if (value != null) { sql1 = sql1 + "\"" + key + "\" = '" + value + "',"; } // 处理键值对 } var sql2 = sql1.Substring(0, sql1.Length - 1) + " where 1=1 and \"" + num + "\"=" + id; _client.Ado.ExecuteCommand(sql + sql2); } return true; } public async Task>> UploadExcel2(string tableName, IFormFile file) { if (file == null || file.Length == 0) { return null; } try { using (var stream = new MemoryStream()) { List dynamics = new List(); List> dicts = new List>(); List> errordicts = new List>(); // 将文件复制到内存流 file.CopyTo(stream); stream.Position = 0; IWorkbook workbook; if (Path.GetExtension(file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) { workbook = new XSSFWorkbook(stream); // 处理 .xlsx 文件 } else { workbook = new HSSFWorkbook(stream); } // var sheet = workbook.GetSheetAt(0); // 获取总行数 var rowCount = sheet.LastRowNum; if (rowCount < 1) { throw new Exception("没有数据"); } var currentRow1 = sheet.GetRow(0); var cols = new string[currentRow1.LastCellNum]; string ids = ""; for (int i = 0; i < currentRow1.LastCellNum; i++) { var cell1 = currentRow1.GetCell(i); cols[i] = cell1.ToString(); if (cell1.ToString().ToLower().Equals("gid")) { ids = cell1.ToString(); } } var result = new List(); List> listmap = new List>(); // 遍历每一行 var maxid = nextid(tableName, ids); var tablelist = tablestruc(tableName); for (int row = 1; row <= rowCount; row++) { maxid++; var currentRow = sheet.GetRow(row); if (currentRow == null) continue; Dictionary map = new Dictionary(); Dictionary dict = new Dictionary(); Dictionary errorData = new Dictionary(); // 读取列 var flag = false; string lat = null, lng = null; var flag1 = false; for (int col = 0; col < currentRow.LastCellNum; col++) { var cell = currentRow.GetCell(col); if (cell == null) { continue; } string head = cols[col]; var cellValue = cell.ToString(); for (int i = 0; i < tablelist.Count; i++) { string cloName = tablelist[i].ColumnName; string cloType = tablelist[i].Type; if (head.ToLower().Equals(cloName.ToLower()) && "gid".Equals(head.ToLower())) { dict.Add(head, cellValue); errorData.Add(head, cellValue); if (cloType.Contains("int")) { map.Add(head, maxid); } if (cloType.Contains("character")) { map.Add(head, Guid.NewGuid().ToString()); } break; } if (head.Contains("geom")) { break; } if (head.Contains("time")) { break; } if (head.Equals(cloName)) { var dictres = dealType(cloName, cloType, head, cellValue); if ((bool)dictres["flag"]) { map.Add(head, dictres["data"]); dict.Add(head, cellValue); errorData.Add(head, cellValue); } else { errorData.Add(head, "error" + cellValue); dict.Add(head, cellValue); flag1 = true; } } } switch (head) { case "lat": lat = cellValue; dict.Add(head, cellValue); errorData.Add(head, cellValue); continue; case "lng": lng = cellValue; dict.Add(head, cellValue); errorData.Add(head, cellValue); continue; default: break; } } if (flag1) { errordicts.Add(errorData); continue; } // 遍历列 if (lat != null && lng != null) { var geography = NtsGeometryServices.Instance.CreateGeometryFactory( int.Parse("4326")); var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat))); map.Add("geom", point.AsText()); } var geometryForWgs84 = map["geom"]; string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tableName + "'"; var cloumnlist = _client.Ado.SqlQuery(sql); string names = ""; string geoms = ""; for (int l = 0; l < cloumnlist.Count; l++) { var name = cloumnlist[l]; if (name.Contains("geom")) { geoms = name; } else { names = names + "\"" + name + "\","; } } string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tableName + " where geom='" + geometryForWgs84 + "'"; var obj = _client.Ado.SqlQuerySingle(sql1); if (obj != null) { dynamics.Add(obj); dict.Add("geom", geometryForWgs84); flag = true; } if (flag) { dicts.Add(dict); continue; } listmap.Add(map); } _client.Insertable(listmap).AS(tableName).ExecuteCommand(); // 返回结果 Dictionary res = new Dictionary(); res.Add("nowData", dicts); res.Add("originData", dynamics); res.Add("errorData", errordicts); return new Response> { Result = res }; } } catch (Exception ex) { return new Response> { Result = null, Message = ex.Message, Code = 500 }; } } [HttpPost] public async Task>> AddUploadExcel(UploadExcelReq req) { if (req.file == null || req.file.Length == 0) { return null; } try { using (var stream = new MemoryStream()) { string sq2 = "delete from " + req.tableName; _client.Ado.ExecuteCommand(sq2); // 将文件复制到内存流 req.file.CopyTo(stream); stream.Position = 0; List> errordicts = new List>(); IWorkbook workbook; if (Path.GetExtension(req.file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) { workbook = new XSSFWorkbook(stream); // 处理 .xlsx 文件 } else { workbook = new HSSFWorkbook(stream); } // var sheet = workbook.GetSheetAt(0); // 获取总行数 var rowCount = sheet.LastRowNum; if (rowCount < 1) { throw new Exception("没有数据"); } var currentRow1 = sheet.GetRow(0); var cols = new string[currentRow1.LastCellNum]; string ids = ""; for (int i = 0; i < currentRow1.LastCellNum; i++) { var cell1 = currentRow1.GetCell(i); cols[i] = cell1.ToString(); if (cell1.ToString().ToLower().Equals("gid")) { ids = cell1.ToString(); } } var result = new List(); List> listmap = new List>(); // 遍历每一行 var maxid = nextid(req.tableName, ids); var tablelist = tablestruc(req.tableName); // 遍历每一行 for (int row = 1; row <= rowCount; row++) { maxid++; var currentRow = sheet.GetRow(row); if (currentRow == null) continue; Dictionary map = new Dictionary(); Dictionary errorData = new Dictionary(); string lat = null, lng = null; var flag1 = false; for (int col = 0; col < currentRow.LastCellNum; col++) { var cell = currentRow.GetCell(col); if (cell == null) { continue; } string head = cols[col]; var cellValue = cell.ToString(); for (int i = 0; i < tablelist.Count; i++) { string cloName = tablelist[i].ColumnName; string cloType = tablelist[i].Type; if (head.ToLower().Equals(cloName.ToLower()) && "gid".Equals(head.ToLower())) { errorData.Add(head, cellValue); if (cloType.Contains("int")) { map.Add(head, maxid); } if (cloType.Contains("character")) { map.Add(head, Guid.NewGuid().ToString()); } break; } if (head.Contains("geom")) { break; } if (head.Contains("time")) { break; } if (head.Equals(cloName)) { var dictres = dealType(cloName, cloType, head, cellValue); if ((bool)dictres["flag"]) { map.Add(head, dictres["data"]); errorData.Add(head, cellValue); } else { errorData.Add(head, "error" + cellValue); flag1 = true; } } } switch (head) { case "lat": lat = cellValue; errorData.Add(head, cellValue); continue; case "lng": lng = cellValue; errorData.Add(head, cellValue); continue; default: break; } } if (flag1) { errordicts.Add(errorData); continue; } if (lat != null && lng != null) { var geography = NtsGeometryServices.Instance.CreateGeometryFactory( int.Parse("4326")); var point = geography.CreatePoint(new Coordinate(double.Parse(lng), double.Parse(lat))); map["geom"] = point.AsText(); } listmap.Add(map); } _client.Insertable(listmap).AS(req.tableName).ExecuteCommand(); //await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", req.tableName, ""); // 返回结果 Dictionary res = new Dictionary(); res.Add("errorData", errordicts); return new Response> { Result = res }; } } catch (Exception ex) { return new Response> { Result = null, Message = ex.Message, Code = 500 }; } } public async Task> GetSldFilePath(string tablename) { Response response = new Response(); string sql = $"select * from sldfile_record where name='" + tablename + "'"; var filepath = _client.Ado.SqlQuerySingle(sql); response.Result = filepath; return response; } public async Task> uploadSldStyle(string styleName, string tablename, string filepath, string fileid) { Response response = new Response(); var sldpath = Path.Combine(_filePath, filepath); var flag = await GeoUtil.ExistStyle("", tablename); var flag1 = false; if (flag) { flag1 = await GeoUtil.UpdateSldStyle(filepath, tablename); await GeoUtil.UpdateStyle("", tablename, tablename); } else { flag1 = await GeoUtil.PublishSldStyle(sldpath, tablename); await GeoUtil.UpdateStyle("", tablename, tablename); } string sql = $"select count(*) from sldfile_record where name='" + tablename + "'"; var count = _client.Ado.GetInt(sql); if (count > 0) { string updatesql = $"update sldfile_record set filepath='" + filepath + "',styleName='" + tablename + "',fileid='" + fileid + "' where name='" + tablename + "'"; _client.Ado.ExecuteCommand(updatesql); } else { string id = Guid.NewGuid().ToString(); string insertsql = $"insert into sldfile_record(id,name,filepath,stylename,fileid) values('" + id + "','" + tablename + "','" + filepath + "','" + tablename + "'," + fileid + "')"; _client.Ado.ExecuteCommand(insertsql); } if (flag1) { response.Message = "发布成功"; response.Result = flag1; return response; } else { response.Message = "发布失败"; response.Result = false; response.Code = 500; return response; } } public async Task>> UploadShape2(string zipFilePath, string tableName ) { try { string sq2 = "delete from " + tableName; _client.Ado.ExecuteCommand(sq2); string srd = ""; using var db = Repository.AsSugarClient(); // 开启事务 // 取得文件完全路径 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文件"); } List> errordicts = new List>(); var shpFileName = fileName[0]; var shpFile = Path.Combine(extractPath, shpFileName); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { var dbfReader = dataReader.DbaseHeader; List headlist = new List(); string ids = ""; foreach (var dbaseFieldDescriptor in dbfReader.Fields) { headlist.Add(dbaseFieldDescriptor.Name); if ("gid".Equals(dbaseFieldDescriptor.Name.ToLower())) { ids = dbaseFieldDescriptor.Name; } } Console.WriteLine("记录数" + dataReader.RecordCount); //throw new Exception("失败"); var objs = new List>(1001); var num = 0; int count = 0; var maxid = nextid(tableName, ids); var tablelist = tablestruc(tableName); while (dataReader.Read()) { maxid++; count++; Console.WriteLine("记录行:" + count); var map = new Dictionary(); var errorData = new Dictionary(); var flag1 = false; // 读取列 for (int i = 0; i < dataReader.FieldCount; i++) { var colName = dataReader.GetName(i); if (dataReader.GetValue(i) == null) { map.Add(colName, dataReader.GetValue(i)); errorData.Add(colName, dataReader.GetValue(i)); continue; } for (int l = 0; l < tablelist.Count; l++) { string cloName = tablelist[l].ColumnName; string cloType = tablelist[l].Type; if (colName.ToLower().Equals(cloName.ToLower()) && "gid".Equals(colName.ToLower())) { errorData.Add(colName, dataReader.GetValue(i)); if (cloType.Contains("int")) { map.Add(colName, maxid); } if (cloType.Contains("character")) { map.Add(colName, Guid.NewGuid().ToString()); } break; } if (colName.ToLower().Contains("time")) { break; } if (colName.ToLower().Equals("geometry")) { var geometry = (Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); map.Add("geom", geometryForWgs84.AsText()); errorData.Add("geom", geometryForWgs84.AsText()); break; } if (colName.ToLower().Equals(cloName.ToLower())) { var dictres = dealType(cloName, cloType, "", dataReader.GetValue(i).ToString()); if ((bool)dictres["flag"]) { map.Add(colName, dictres["data"]); errorData.Add(colName, dataReader.GetValue(i)); } else { errorData.Add(colName, dataReader.GetValue(i)); flag1 = true; } } } } objs.Add(map); if (num++ == 999) { await db.Insertable(objs) .AS(tableName) // 指定目标表名 .ExecuteCommandAsync(); num = 0; objs.Clear(); } } // 读取末尾 await db.Insertable(objs) .AS(tableName) // 指定目标表名 .ExecuteCommandAsync(); } await db.Ado.CommitTranAsync(); Dictionary res = new Dictionary(); res.Add("errorData", errordicts); return new Response> { Result = res }; } catch (Exception ex) { throw new CommonException(ex.Message, 500); } } public async Task> UploadShape3(string zipFilePath, string tableName ) { try { string srd = ""; using var db = Repository.AsSugarClient(); // 开启事务 // 取得文件完全路径 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); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { var dbfReader = dataReader.DbaseHeader; List headlist = new List(); foreach (var dbaseFieldDescriptor in dbfReader.Fields) { headlist.Add(dbaseFieldDescriptor.Name); } Console.WriteLine("记录数" + dataReader.RecordCount); //throw new Exception("失败"); var objs = new List>(1001); var num = 0; int count = 0; var maxid = nextid(tableName, "Id"); while (dataReader.Read()) { count++; maxid++; Console.WriteLine("记录行:" + count); var insertObj = new Dictionary(); // 读取列 for (int i = 0; i < dataReader.FieldCount; i++) { var colName = dataReader.GetName(i); for (int k = 0; k < headlist.Count; k++) { var header = headlist[k]; if (colName.ToLower().Contains("time")) { break; } if (colName.ToLower().Equals("geometry")) { var geometry = (Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); insertObj.Add("geom", geometryForWgs84.AsText()); break; } if (header.Equals(colName)) { if (header.Equals("Id")) { insertObj.Add(header, maxid); break; } else { insertObj.Add(header, dataReader.GetValue(i)); break; } } } } objs.Add(insertObj); if (num++ == 999) { await db.Insertable(objs) .AS(tableName) // 指定目标表名 .ExecuteCommandAsync(); num = 0; objs.Clear(); } } // 读取末尾 await db.Insertable(objs) .AS(tableName) // 指定目标表名 .ExecuteCommandAsync(); } await db.Ado.CommitTranAsync(); await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", tableName, ""); } catch (Exception ex) { throw new CommonException(ex.Message, 500); } return new Response { Result = true }; } 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("文件解压失败"); } }); } public async Task>> UploadShape1(string zipFilePath, string tableName ) { try { string srd = ""; using var db = Repository.AsSugarClient(); // 开启事务 // 取得文件完全路径 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 dynamics = new List(); List> dicts = new List>(); List> errordicts = new List>(); using (var dataReader = new ShapefileDataReader(shpFile, GeometryFactory.Default)) { var dbfReader = dataReader.DbaseHeader; List headlist = new List(); string ids = ""; foreach (var dbaseFieldDescriptor in dbfReader.Fields) { headlist.Add(dbaseFieldDescriptor.Name); if ("gid".Equals(dbaseFieldDescriptor.Name.ToLower())) { ids = dbaseFieldDescriptor.Name; } } Console.WriteLine("记录数" + dataReader.RecordCount); //throw new Exception("失败"); var objs = new List>(1001); var num = 0; int count = 0; var maxid = nextid(tableName, ids); var tablelist = tablestruc(tableName); while (dataReader.Read()) { count++; maxid++; Console.WriteLine("记录行:" + count); var map = new Dictionary(); var errorData = new Dictionary(); var flag1 = false; // 读取列 Dictionary dict = new Dictionary(); // 读取列 var flag = false; for (int i = 0; i < dataReader.FieldCount; i++) { var colName = dataReader.GetName(i); if (dataReader.GetValue(i) == null) { map.Add(colName, dataReader.GetValue(i)); errorData.Add(colName, dataReader.GetValue(i)); continue; } for (int l = 0; l < tablelist.Count; l++) { string cloName = tablelist[l].ColumnName; string cloType = tablelist[l].Type; if (colName.ToLower().Equals(colName.ToLower()) && "gid".Equals(colName.ToLower())) { errorData.Add(colName, dataReader.GetValue(i)); if (cloType.Contains("int")) { map.Add(colName, maxid); } if (cloType.Contains("character")) { map.Add(colName, Guid.NewGuid().ToString()); } break; } if (colName.ToLower().Contains("time")) { break; } if (colName.ToLower().Equals("geometry")) { var geometry = (Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); map.Add("geom", geometryForWgs84.AsText()); errorData.Add("geom", geometryForWgs84.AsText()); break; } if (colName.ToLower().Equals(colName.ToLower())) { var dictres = dealType(cloName, cloType, "", dataReader.GetValue(i).ToString()); if ((bool)dictres["flag"]) { map.Add(colName, dictres["data"]); errorData.Add(colName, dataReader.GetValue(i)); } else { errorData.Add(colName, dataReader.GetValue(i)); flag1 = true; } } } if (colName.ToLower().Equals("geometry")) { var geometry = (Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); string sql = $"select column_name as name from INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'public' AND table_name ='" + tableName + "'"; var cloumnlist = _client.Ado.SqlQuery(sql); string names = ""; string geoms = ""; for (int l = 0; l < cloumnlist.Count; l++) { var name = cloumnlist[l]; if (name.Contains("geom")) { geoms = name; } else { names = names + "\"" + name + "\","; } } string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tableName + " where geom='" + geometryForWgs84.AsText() + "'"; var obj = _client.Ado.SqlQuerySingle(sql1); if (obj != null) { dynamics.Add(obj); dict.Add("geom", geometryForWgs84.AsText()); flag = true; } } else { dict.Add(colName, dataReader.GetValue(i)); } } if (flag1) { errordicts.Add(errorData); continue; } if (flag) { dicts.Add(dict); continue; } objs.Add(map); if (num++ == 999) { await db.Insertable(objs) .AS(tableName) // 指定目标表名 .ExecuteCommandAsync(); num = 0; objs.Clear(); } } // 读取末尾 await db.Insertable(objs) .AS(tableName) // 指定目标表名 .ExecuteCommandAsync(); } await db.Ado.CommitTranAsync(); Dictionary res = new Dictionary(); res.Add("nowData", dicts); res.Add("originData", dynamics); res.Add("errorData", errordicts); return new Response> { Result = res }; } catch (Exception ex) { throw new CommonException(ex.Message, 500); } } public int nextid(string tablename, string id) { string sql = "select max(\"" + id + "\") from " + tablename; var maxid = _client.Ado.GetInt(sql); return maxid; } public List tablestruc(string tableName) { string tableStruc = $"\t\t\r\nSELECT \r\n c.column_name AS \"ColumnName\",\r\n c.data_type AS \"Type\"\r\n\r\nFROM \r\n " + $" information_schema.columns c\r\nLEFT JOIN \r\n pg_catalog.pg_description pgd ON pgd.objoid = c.table_name::regclass::oid \r\n " + $" AND pgd.objsubid = c.ordinal_position\r\nWHERE \r\n c.table_name = '" + tableName + "'; "; return _client.Ado.SqlQuery(tableStruc); } public Dictionary dealType(string cloum, string type, string head, string data) { Dictionary dict = new Dictionary(); string str = ""; bool flag = false; double d = 0.0; float f = 0.0f; int i = 0; Object obj = null; switch (type) { case "real": flag = float.TryParse(data, out f); obj = f; break; case "integer": flag = Int32.TryParse(data, out i); obj = i; break; case "numeric": flag = double.TryParse(data, out d); obj = d; break; case "bigint": flag = Int32.TryParse(data, out i); obj = i; break; case "double precision": flag = double.TryParse(data, out d); obj = d; break; case "character varying": flag = true; obj = data; break; case "date": flag = true; obj = new DateTime(); break; case "timestamp without time zone": flag = true; obj = new Timestamp(); break; default: flag = false; break; } dict.Add("flag", flag); dict.Add("data", obj); return dict; } }