using System.Data; using System.Reflection.PortableExecutable; using ClosedXML.Excel; using System.Text.Json.Nodes; using Infrastructure; using Infrastructure.Utils; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using NetTopologySuite; using NetTopologySuite.Geometries; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.FormModule; using OpenAuth.App.Interface; using OpenAuth.App.ServiceApp.LayerManagerApp.Request; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using SqlSugar; using DocumentFormat.OpenXml.Bibliography; using OpenAuth.App.Request; using System.IO; using DocumentFormat.OpenXml.Math; using Microsoft.AspNetCore.Http; using NPOI.SS.Formula.Functions; using OpenAuth.App.FormScheme.FormHelpers; using System.Text; using System.IO.Compression; using NetTopologySuite.IO; using NetTopologySuite.Features; using OSGeo.OGR; using Shapefile = NetTopologySuite.IO.Esri.Shapefile; using Org.BouncyCastle.Ocsp; using Infrastructure.Extensions; 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 + "'"; var cloumnlist = _client.Ado.SqlQuery(sql); result.Add("head", cloumnlist); string names = ""; string geoms = ""; for (int i = 0; i < cloumnlist.Count; i++) { var name = cloumnlist[i]; if (name.Contains("geom")) { geoms = name; } else { names = names +"\""+ name + "\","; } } string sql1 = $"select " + names + "ST_AsText(" + geoms + ") as " + geoms + $" from " + tablename + " where 1=1 "; 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; } var result1 = _client.Ado.SqlQuery(sql1); result.Add("data", result1); 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 NetTopologySuite.Features.Feature(geometry, attributes); features.Add(feature); // 导出 SHP 文件及其关联文件 ExportToShapefileFour(shpFilePath, features); // 将文件打包成 ZIP CreateZipFromShapefiles(shpFilePath, shpFilePathzip); } return response; } public NetTopologySuite.Geometries.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>(); // 遍历每一行 for (int row = 1; row <= rowCount; row++) { 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, currentRow.GetCell(col).ToInt()); } 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 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>(); // 将文件复制到内存流 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>(); // 遍历每一行 for (int row = 1; row <= rowCount; row++) { var currentRow = sheet.GetRow(row); if (currentRow == null) continue; Dictionary map = new Dictionary(); Dictionary dict = new Dictionary(); // 读取列 var flag = false; 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, currentRow.GetCell(col).ToInt()); } 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.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); return new Response> { Result = res }; } } catch (Exception ex) { return null; } } [HttpPost] public async Task AddUploadExcel(UploadExcelReq req) { if (req.file == null || req.file.Length == 0) { return false; } try { using (var stream = new MemoryStream()) { string sq2 = "delete from " + req.tableName; _client.Ado.ExecuteCommand(sq2); // 将文件复制到内存流 req.file.CopyTo(stream); stream.Position = 0; 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]; 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>(); // 遍历每一行 for (int row = 1; row <= rowCount; row++) { 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, currentRow.GetCell(col).ToInt()); } 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(req.tableName).ExecuteCommand(); //await GeoUtil.CreateStoreAndLayer("", "EPSG:4326", req.tableName, ""); // 返回结果 return true; } } catch (Exception ex) { return false; } } public async Task> uploadSldStyle(string styleName, string tablename,string filepath) { Response response = new Response(); var flag = await GeoUtil.ExistStyle("", styleName); if (flag) { response.Message = "样式已存在"; response.Result = false; return response; } var sldpath = Path.Combine(_filePath, filepath); var flag1 = await GeoUtil.PublishSldStyle(sldpath, styleName); await GeoUtil.UpdateStyle("", tablename, styleName); if (flag1) { response.Message = "发布成功"; response.Result = flag1; return response; } else { response.Message = "发布失败"; response.Result = false; 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文件"); } 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; while (dataReader.Read()) { count++; 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 = (NetTopologySuite.Geometries.Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); insertObj.Add("geom", geometryForWgs84.AsText()); break; } if (header.Equals(colName)) { 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(); } catch (Exception ex) { throw new CommonException(ex.Message, 500); } return new Response { Result = true }; } 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; while (dataReader.Read()) { count++; 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 = (NetTopologySuite.Geometries.Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); insertObj.Add("geom", geometryForWgs84.AsText()); break; } if (header.Equals(colName)) { 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>(); 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; while (dataReader.Read()) { count++; Console.WriteLine("记录行:" + count); var insertObj = new Dictionary(); // 读取列 Dictionary dict = new Dictionary(); // 读取列 var flag = false; for (int i = 0; i < dataReader.FieldCount; i++) { var colName = dataReader.GetName(i); if (colName.ToLower().Equals("geometry")) { var geometry = (NetTopologySuite.Geometries.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)); } 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 = (NetTopologySuite.Geometries.Geometry)dataReader.GetValue(i); var geometryForWgs84 = GeometryFactory.Default.WithSRID(4326) .CreateGeometry(geometry); insertObj.Add("geom", geometryForWgs84.AsText()); break; } if (header.Equals(colName)) { insertObj.Add(header, dataReader.GetValue(i)); break; } } } if (flag) { dicts.Add(dict); continue; } 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(); Dictionary res = new Dictionary(); res.Add("nowData", dicts); res.Add("originData", dynamics); return new Response> { Result = res }; } catch (Exception ex) { throw new CommonException(ex.Message, 500); } } }