using stdole; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.VCT.Entity; using KGIS.Framework.VCT.Helper; using KGIS.Framework.VCT.Enums; namespace Kingo.PluginServiceInterface.Helper.VCT { public class VCTToMDBHelper3 { public string RootPath { get; set; } public void VCTToMDB(string vctfilepath, bool iscreateidx = false) { int i = 0; try { if (string.IsNullOrEmpty(RootPath)) { throw new Exception("mdb保存路径错误!"); } if (!iscreateidx) { //判断VCT索引是否存在,不存在则创建索引 string vct_idx = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(vctfilepath), System.IO.Path.GetFileNameWithoutExtension(vctfilepath) + "_idx"); if (System.IO.Directory.Exists(vct_idx)) { DirectoryInfo root = new DirectoryInfo(vct_idx); FileInfo[] files = root.GetFiles(); //判断索引文件夹下是否存在idx索引文件,不存在则需要创建索引,存在则不创建 if (files != null && files.Length > 0 && files.Where(x => x.Extension.Equals(".idx", StringComparison.CurrentCultureIgnoreCase)).Count() > 0) { iscreateidx = false; } else { iscreateidx = true; } } else { iscreateidx = true; } } if (iscreateidx) { VCTIndexHelper vctindexhelper = new VCTIndexHelper(); vctindexhelper.CreateIdxByVCTFile(vctfilepath, false); } if (!Directory.Exists(RootPath)) { Directory.CreateDirectory(RootPath); //Directory.Delete(idxdirectory, true); } string mdbfilename = System.IO.Path.GetFileNameWithoutExtension(vctfilepath) + ".mdb"; string mdbpath = System.IO.Path.Combine(RootPath, mdbfilename); if (File.Exists(mdbpath)) { File.Delete(mdbpath); } VCTFileConvertHelper h = new VCTFileConvertHelper(); VctVectorData vctdata = h.GetVctVectorData(vctfilepath, false); string prj = GetprjStr(vctdata); //创建mdb CreateMdbFile(RootPath, mdbfilename, vctdata, prj); //开始导出数据到mdb //第一步,建varchar索引,放在内存中,bsm,开始位置,结束位置 using (System.IO.FileStream streamvct = System.IO.File.OpenRead(vctfilepath)) { long attributebeginposition = 0; Dictionary dicvarchar = new Dictionary(); Dictionary dicConstant = new Dictionary(); Dictionary dicRelationtable = new Dictionary(); Dictionary dicRepresentation = new Dictionary(); string lineStr = VCTIndexHelper.ReadLine(streamvct); //读到LINEBEGIN while (lineStr != null) { i++; lineStr = lineStr.Trim().ToUpper(); if (lineStr == "ATTRIBUTEBEGIN") { attributebeginposition = streamvct.Position; } else if (lineStr == "VARCHARBEGIN") { SetVarcharValueToDic(streamvct, dicvarchar, vctdata.VctHead.Separator); } //else if (lineStr == "CONSTANTBEGIN")//常量 //{ // SetConstantValueToDic(streamvct, dicConstant); //} //else if (lineStr == "RELATIONTABLEBEGIN")//值对应 //{ // SetRelationtableOrRepresentationValueToDic(streamvct, dicRelationtable, "RELATIONTABLEEND"); //} //else if (lineStr == "REPRESENTATIONBEGIN")//图形表现样式 //{ // SetRelationtableOrRepresentationValueToDic(streamvct, dicRepresentation, "REPRESENTATIONEND"); //} lineStr = VCTIndexHelper.ReadLine(streamvct); } using (ESRI.ArcGIS.ADF.ComReleaser comreleaser = new ESRI.ArcGIS.ADF.ComReleaser()) { //第二步,处理无图形的属性表数据 AccessWorkspaceFactory fac = new AccessWorkspaceFactory(); IWorkspace pWorkspace = fac.OpenFromFile(mdbpath, 0); IFeatureWorkspace pFeatureWorkSpace = pWorkspace as IFeatureWorkspace; comreleaser.ManageLifetime(fac); comreleaser.ManageLifetime(pWorkspace); comreleaser.ManageLifetime(pFeatureWorkSpace); if (vctdata.TableStructureList.Count(x => x.NoneGeometry) > 0) { var nonegeotable = vctdata.TableStructureList.Where(x => x.NoneGeometry).ToList(); streamvct.Position = attributebeginposition; InsertDataToNoneGeoTable(streamvct, vctdata, dicvarchar, pFeatureWorkSpace, nonegeotable); } string idxdir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(vctfilepath), System.IO.Path.GetFileNameWithoutExtension(vctfilepath) + "_idx"); //所有的topo线 Dictionary dictopoline = new Dictionary(); string idxfilepath = System.IO.Path.Combine(idxdir, "TopoArcs.idx"); if (File.Exists(idxfilepath))//缓存topo线集合 { ReadTopoArcsIDX(dictopoline, idxfilepath); } List templist = new List(); //插入空间图层 foreach (var item in vctdata.FeatureCodeTypeList) { VctTableStructureEntity ts = vctdata.TableStructureList.FirstOrDefault(x => x.TableName == item.AttributeTableName); if (ts == null) { continue; } idxfilepath = System.IO.Path.Combine(idxdir, item.AttributeTableName + ".idx"); if (templist.Count(x => x == idxfilepath) > 0)//记录已经处理过的索引文件,因为有相同属性表名的空间表,此时应该只处理一次 { continue; } else { templist.Add(idxfilepath); } if (!File.Exists(idxfilepath)) { continue; } InsertDataPointAndLine(streamvct, vctdata, dicvarchar, pFeatureWorkSpace, idxfilepath, dictopoline, dicConstant, dicRelationtable, dicRepresentation); } } } } catch (Exception ex) { var a = i; LogAPI.Debug(ex); throw ex; } } /// /// 获取prj字符串 /// 修改时间:2019.1.7 /// 修改原因:数慧验证我们的VCT坐标参考不正确,借鉴数慧公司处理方法,将坐标参考中 /// GEOGCS参数GCS_China_Geodetic_Coordinate_System_2000和DATUM['D_China_2000']默认设置,修改后仅支持GGCS2000坐标参考 /// 修改人:高山 /// /// /// public string GetprjStr(VctVectorData vctdata) { string prj = @"PROJCS['{0}',GEOGCS['GCS_China_Geodetic_Coordinate_System_2000',DATUM['D_China_2000',SPHEROID['{1}',{2},{3}]],PRIMEM['{4}',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['{5}'],PARAMETER['False_Easting',{6}],PARAMETER['False_Northing',{7}],PARAMETER['Central_Meridian',{8}],PARAMETER['Scale_Factor',{9}],PARAMETER['Latitude_Of_Origin',{10}],UNIT['Meter',1.0]]"; string prj0 = vctdata.VctHead.Spheroid.Split(',')[0]; string prjName = vctdata.VctHead.Spheroid.Split(',')[0] + "_" + vctdata.VctHead.Parameters.Split(',')[4] + "_Degree_GK_Zone_" + vctdata.VctHead.Parameters.Split(',')[5]; string prj1 = vctdata.VctHead.Spheroid.Split(',')[1]; string prj2 = vctdata.VctHead.Spheroid.Split(',')[2]; string prj3 = vctdata.VctHead.PrimeMeridian; string prj4 = vctdata.VctHead.Projection; //string prj4 = "Gauss_Kruger"; string prj5 = vctdata.VctHead.Parameters.Split(',')[2]; string prj6 = vctdata.VctHead.Parameters.Split(',')[3]; string prj7 = vctdata.VctHead.Parameters.Split(',')[0]; string prj8 = vctdata.VctHead.Parameters.Split(',')[1]; string prj9 = "0.0";// vctdata.VctHead.Parameters.Split(',')[1]; if (prj0.StartsWith("CGCS", StringComparison.CurrentCultureIgnoreCase)) { prj = string.Format(prj, prjName, prj0, prj1, prj2, prj3, prj4, prj5, prj6, prj7, prj8, prj9); } else//修改前构建坐标参考方式:为了兼容其他坐标参考VCT { prj = @"PROJCS['{0}',GEOGCS['GCS_{0}',DATUM['D_{0}',SPHEROID['{0}',{1},{2}]],PRIMEM['{3}',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['{4}'],PARAMETER['False_Easting',{5}],PARAMETER['False_Northing',{6}],PARAMETER['Central_Meridian',{7}],PARAMETER['Scale_Factor',{8}],PARAMETER['Latitude_Of_Origin',{9}],UNIT['Meter',1.0]]"; prj = string.Format(prj, prj0, prj1, prj2, prj3, prj4, prj5, prj6, prj7, prj8, prj9); } return prj; } /// /// 创建MDB /// /// /// /// /// public void CreateMdbFile(string mdbfolder, string mdbName, VctVectorData vectordata, string prj) { using (ESRI.ArcGIS.ADF.ComReleaser comreleaser = new ESRI.ArcGIS.ADF.ComReleaser()) { IWorkspaceFactory pFtWsFct = new AccessWorkspaceFactory(); IWorkspaceName workspaceName = pFtWsFct.Create(mdbfolder, mdbName, null, 0); IWorkspace pWorkSpace = (workspaceName as ESRI.ArcGIS.esriSystem.IName).Open() as IWorkspace; if (pWorkSpace == null) { new Exception("创建mdb数据库失败"); } IFeatureDataset targetFeatureDataset = null; comreleaser.ManageLifetime(pFtWsFct); //comreleaser.ManageLifetime(workspaceName); comreleaser.ManageLifetime(pWorkSpace); comreleaser.ManageLifetime(targetFeatureDataset); string datasetName = "TDBZSJJ"; if (!string.IsNullOrEmpty(datasetName)) { targetFeatureDataset = CreateFeatureDataset(pWorkSpace, datasetName, prj); //创建数据集 if (targetFeatureDataset == null) { new Exception("创建要素集失败"); } } List tcmclist = new List(); double MapScale = vectordata.VctHead.MapScale.ToDouble(); foreach (var item in vectordata.FeatureCodeTypeList) { if (tcmclist.Count(x => x == item.TCMC) > 0) { if (item.TCMC.Trim().Equals("ZJ", StringComparison.CurrentCultureIgnoreCase)) { continue; } else { int xh = 1; while (tcmclist.Count(x => x == item.TCMC) > 0) { item.TCMC = item.TCMC + xh; xh++; } } } tcmclist.Add(item.TCMC); CreateFeatureClassToMdb(pWorkSpace, vectordata.TableStructureList.FirstOrDefault(x => x.TableName == item.AttributeTableName), item, prj, MapScale, targetFeatureDataset); } if (vectordata.TableStructureList.Count(x => x.NoneGeometry == true) > 0) { var nonegeolist = vectordata.TableStructureList.Where(x => x.NoneGeometry == true).ToList(); foreach (var item in nonegeolist) { CreateTableToMdb(pWorkSpace, item); } } } } /// /// 缓存varchar /// /// /// /// public void SetVarcharValueToDic(FileStream stream, Dictionary dicvarchar, string Separator) { int linecount = 0; //streamvct.Position = 0; string linestr = string.Empty; long bsmPosition = 0; int bsm = 0; long tablebsmposition = stream.Position; linestr = VCTIndexHelper.ReadLine(stream).Trim(); while (!linestr.Equals("VARCHAREND", StringComparison.CurrentCultureIgnoreCase)) { try { if (string.IsNullOrWhiteSpace(linestr)) { continue; } //记录标识码的位置 if (linecount == 0) { bsm = int.Parse(linestr); } if (linecount == 1) { bsmPosition = tablebsmposition; } //当前线段结束 if (linestr.Equals(Separator, StringComparison.CurrentCultureIgnoreCase)) { VctPositionEntity positionentity = new VctPositionEntity(); positionentity.BeginPosition = bsmPosition; positionentity.EndPostion = tablebsmposition; dicvarchar.Add(bsm, positionentity); linecount = 0; continue; } linecount++; } finally { tablebsmposition = stream.Position; linestr = VCTIndexHelper.ReadLine(stream).Trim(); } } } /// /// 插入数据到无图形的属性表 /// /// /// /// /// /// /// private void InsertDataToNoneGeoTable(FileStream streamReader, VctVectorData vctdata, Dictionary dicvarchar, IFeatureWorkspace pFeatureWorkSpace, List nonegeotable) { using (ESRI.ArcGIS.ADF.ComReleaser comreleaser = new ESRI.ArcGIS.ADF.ComReleaser()) { IFields pFlds = null; ITable resulttable = null; ICursor ptableCursor = null; IRowBuffer pRowBuff = null; comreleaser.ManageLifetime(pFlds); comreleaser.ManageLifetime(resulttable); comreleaser.ManageLifetime(ptableCursor); comreleaser.ManageLifetime(pRowBuff); List ColumnNameList = null; string currenttablename = string.Empty; string linestr = string.Empty; long tablebsmposition = streamReader.Position; linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); while (!linestr.Equals("ATTRIBUTEEND", StringComparison.CurrentCultureIgnoreCase) && nonegeotable.Count > 0) { try { if (string.IsNullOrWhiteSpace(linestr)) { continue; } if (linestr.Equals("TABLEEND", StringComparison.CurrentCultureIgnoreCase)) { if (!string.IsNullOrEmpty(currenttablename) && nonegeotable.Count(x => x.TableName.ToUpper() == currenttablename.ToUpper()) > 0) { nonegeotable.Remove(nonegeotable.FirstOrDefault(x => x.TableName.ToUpper() == currenttablename.ToUpper())); } currenttablename = string.Empty; continue; } if (string.IsNullOrEmpty(currenttablename)) { currenttablename = linestr; if (nonegeotable.Count(x => x.TableName.ToUpper() == currenttablename.ToUpper()) <= 0) { currenttablename = string.Empty; } else { ColumnNameList = vctdata.TableStructureList.FirstOrDefault(x => x.TableName == currenttablename).Columns; resulttable = pFeatureWorkSpace.OpenTable(currenttablename); ptableCursor = resulttable.Insert(true); pFlds = ptableCursor.Fields; pRowBuff = resulttable.CreateRowBuffer(); } continue; } else { try { //插入属性 linestr = linestr.Substring(linestr.IndexOf(vctdata.VctHead.Separator) + 1); string[] ColumnValueArry = linestr.Split(vctdata.VctHead.Separator.ToArray()); //string tempysdm = ColumnValueArry[ColumnNameList.IndexOf(ColumnNameList.FirstOrDefault(x => x.ColumnName == "YSDM"))]; #region 属性赋值 SetAttributeValue(streamReader, vctdata, dicvarchar, pFlds, pRowBuff, ColumnNameList, ColumnValueArry); #endregion ptableCursor.InsertRow(pRowBuff); } catch (Exception ex) { LogAPI.Debug("导出VCT错误:表:" + currenttablename + "---" + ex); } } } finally { linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); } } } } private void ReadTopoArcsIDX(Dictionary dictopoline, string idxfilepath) { using (FileStream streamvct = System.IO.File.OpenRead(idxfilepath)) { string lineStr = VCTIndexHelper.ReadLine(streamvct); //读到LINEBEGIN while (lineStr != null) { lineStr = lineStr.Trim().ToUpper(); if (lineStr == "INDEXBEGIN") { lineStr = VCTIndexHelper.ReadLine(streamvct).Trim(); while (!lineStr.Equals("INDEXEND", StringComparison.CurrentCultureIgnoreCase)) { try { if (string.IsNullOrWhiteSpace(lineStr)) { continue; } string[] idxarry = lineStr.Split(',');//当前行索引 if (idxarry.Length != 7) { continue; } VCTIDXEntity idxentity = new VCTIDXEntity() { BSM = int.Parse(idxarry[0]), ShapePosition = long.Parse(idxarry[5]) }; dictopoline.Add(idxentity.BSM, idxentity); } finally { lineStr = VCTIndexHelper.ReadLine(streamvct).Trim(); } } break; } lineStr = VCTIndexHelper.ReadLine(streamvct).Trim(); } } } private void InsertDataPointAndLine(FileStream streamReader, VctVectorData vctdata, Dictionary dicvarchar, IFeatureWorkspace pFeatureWorkSpace, string idxfilepath, Dictionary dictopoline, Dictionary dicConstant, Dictionary dicRelationtable, Dictionary dicRepresentation) { using (FileStream streamvct = System.IO.File.OpenRead(idxfilepath)) { string lineStr = VCTIndexHelper.ReadLine(streamvct); //读到LINEBEGIN while (lineStr != null) { lineStr = lineStr.Trim().ToUpper(); if (lineStr == "INDEXBEGIN") { using (ESRI.ArcGIS.ADF.ComReleaser comreleaser = new ESRI.ArcGIS.ADF.ComReleaser()) { IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3; IFeatureClass resultFeatureClass = null; //向shape文件shape赋值 IFeatureCursor pFeatCur = null; IFeatureBuffer pFeatBuff = null; IFields pFlds = null; comreleaser.ManageLifetime(factory); comreleaser.ManageLifetime(resultFeatureClass); comreleaser.ManageLifetime(pFeatCur); comreleaser.ManageLifetime(pFeatBuff); comreleaser.ManageLifetime(pFlds); List ColumnNameList = null; string ysdm = string.Empty; string currenttablename = string.Empty; GeoTypeEnum geotype = GeoTypeEnum.ANNOTATION; byte[] buffer = new byte[256]; lineStr = VCTIndexHelper.ReadLine(streamvct).Trim(); while (!lineStr.Equals("INDEXEND", StringComparison.CurrentCultureIgnoreCase)) { try { if (string.IsNullOrWhiteSpace(lineStr)) { continue; } string[] idxarry = lineStr.Split(',');//当前行索引 if (idxarry.Length != 7) { continue; } //图斑索引文件对应的BSM //if (idxarry[0].Equals("526509")) //{ //} //else //{ // continue; //} streamReader.Position = long.Parse(idxarry[5]); List linelist = ReadLine(streamReader, buffer, 2);//前两行,标识码和要素代码 if (linelist == null || linelist.Count != 2 || linelist[0] != idxarry[0])//为空、没有两行、或者标识码不相等就不处理 { continue; } if (ysdm != linelist[1])//判断当前要素代码是否和上次打开的图层一致,不一致,重新打开图层 { var featurecodetype = vctdata.FeatureCodeTypeList.FirstOrDefault(x => x.Code == linelist[1]); if (featurecodetype == null) { featurecodetype = vctdata.FeatureCodeTypeList.FirstOrDefault(x => x.AttributeTableName == currenttablename); } ColumnNameList = vctdata.TableStructureList.FirstOrDefault(x => x.TableName == featurecodetype.AttributeTableName).Columns; currenttablename = featurecodetype.TCMC; geotype = featurecodetype.GeoType; resultFeatureClass = pFeatureWorkSpace.OpenFeatureClass(currenttablename); if (pFeatCur != null) { pFeatCur.Flush(); } pFeatCur = resultFeatureClass.Insert(true); pFlds = resultFeatureClass.Fields; pFeatBuff = resultFeatureClass.CreateFeatureBuffer(); } ysdm = linelist[1]; long shapeposition = streamReader.Position; //读取属性 string[] ColumnValueArry = null; long attributepos = long.Parse(idxarry[6]); if (attributepos > 0)//有属性 { streamReader.Position = attributepos; //插入属性 lineStr = VCTIndexHelper.ReadLine(streamReader); lineStr = RegexReplace(lineStr.Substring(lineStr.IndexOf(vctdata.VctHead.Separator) + 1)); ColumnValueArry = lineStr.Split(vctdata.VctHead.Separator.ToArray()); SetAttributeValue(streamReader, vctdata, dicvarchar, pFlds, pFeatBuff as IRowBuffer, ColumnNameList, ColumnValueArry); } //读取空间图形 streamReader.Position = shapeposition; switch (geotype) { case GeoTypeEnum.POINT: case GeoTypeEnum.LINE: case GeoTypeEnum.POLYGON: IGeometry geo = GetGeo(streamReader, factory, geotype, dictopoline); //if (geo.GeometryType == esriGeometryType.esriGeometryPolygon) //{ // if (IsSelfCross(geo)) // { // IsSimple(ref geo); // } //} pFeatBuff.Shape = geo;//.set_Value(pFlds.FindField("SHAPE"), geo); //ISpatialReferenceTolerance tolerance = (resultFeatureClass as ESRI.ArcGIS.Geodatabase.IGeoDataset).SpatialReference as ISpatialReferenceTolerance; break; case GeoTypeEnum.ANNOTATION: IAnnotationFeature2 pAnnoFeature = pFeatBuff as IAnnotationFeature2; if (ColumnValueArry != null) { pAnnoFeature.Status = esriAnnotationStatus.esriAnnoStatusPlaced; pAnnoFeature.Annotation = GetAnnotation(streamReader, factory, ColumnNameList, ColumnValueArry); } //pAnnoFeature.Annotation = GetAnnotation(streamReader, factory, dicConstant, dicRelationtable, dicRepresentation); break; default: break; } pFeatCur.InsertFeature(pFeatBuff); } catch { } //catch (Exception ex) //{ // LogAPI.Debug(ex); //} finally { lineStr = VCTIndexHelper.ReadLine(streamvct).Trim(); } } if (pFeatCur != null) { pFeatCur.Flush(); } //RepairGeometry(resultFeatureClass); } break; } lineStr = VCTIndexHelper.ReadLine(streamvct); } } } private string RegexReplace(string str) { return Regex.Replace(str, @"\t", "\r\n"); } /// /// 创建要素数据集 /// /// /// /// public IFeatureDataset CreateFeatureDataset(IWorkspace workspace, string datasetName, string prj) { try { IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; //创建要素集 IFeatureDataset featureDataset = featureWorkspace.CreateFeatureDataset(datasetName, GetSpatialReference(prj, workspace)); return featureDataset; } catch (Exception ex) { throw ex; } } public ISpatialReference GetSpatialReference(string prj, IWorkspace workspace) { //创建一个要素集创建一个投影 ISpatialReferenceFactory pSpatialRefFac = new SpatialReferenceEnvironmentClass(); ISpatialReference spatialReference; int s; //prj = "PROJCS['CGCS2000_3_Degree_GK_Zone_40',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]],PROJECTION['Gauss_Kruger'],PARAMETER['False_Easting',40500000.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',120.0],PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0],AUTHORITY['EPSG',4528]]"; /* * 修改人:高山 * 修改时间:2018.12.4 * 修改原因:北京评测部分公司此处是中文“高斯-克吕格投影”,此次pSpatialRefFac.CreateESRISpatialReference无法创建坐标参考 */ prj = prj.Replace("'", "\"").Replace("高斯-克吕格投影", "GAUSS_KRUGER"); pSpatialRefFac.CreateESRISpatialReference(prj, out spatialReference, out s); //确定是否支持高精度存储空间 Boolean supportsHighPrecision = false; IWorkspaceProperties workspaceProperties = (IWorkspaceProperties)workspace; IWorkspaceProperty workspaceProperty = workspaceProperties.get_Property (esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup, (int)esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage); if (workspaceProperty.IsSupported) { supportsHighPrecision = Convert.ToBoolean(workspaceProperty.PropertyValue); } //设置投影精度 IControlPrecision2 controlPrecision = (IControlPrecision2)spatialReference; controlPrecision.IsHighPrecision = supportsHighPrecision; //设置容差 ISpatialReferenceResolution spatialRefResolution = (ISpatialReferenceResolution)spatialReference; spatialRefResolution.ConstructFromHorizon(); spatialRefResolution.SetDefaultXYResolution(); double Tolerance = 0.0001; ISpatialReferenceTolerance tolerance = spatialReference as ISpatialReferenceTolerance; if (tolerance != null) { tolerance.XYTolerance = Tolerance; tolerance.ZTolerance = Tolerance; tolerance.MTolerance = Tolerance; } //(spatialReference as ISpatialReferenceResolution).set_XYResolution(true, 0.00005); return spatialReference; } /// /// 属性赋值 /// /// /// /// /// /// /// /// private void SetAttributeValue(FileStream streamReader, VctVectorData vctdata, Dictionary dicvarchar, IFields pFlds, IRowBuffer pRowBuff, List ColumnNameList, string[] ColumnValueArry) { for (int i = 0; i < ColumnNameList.Count; i++) { int findex = pFlds.FindField(ColumnNameList[i].ColumnName); if (findex == -1) { continue; } pRowBuff.set_Value(findex, DBNull.Value);//优先清空上一次的列值 if (string.IsNullOrEmpty(ColumnValueArry[i])) { continue; } ColumnValueArry[i] = GetReplaceDH(ColumnValueArry[i]); if (pFlds.Field[findex].Type == esriFieldType.esriFieldTypeDate) { try { DateTime? dt = null; if (ColumnValueArry[i].Length > 8 && ColumnValueArry[i].IndexOf('T') > 0) { dt = DateTime.ParseExact(ColumnValueArry[i], "yyyyMMddTHH:mm:ss", System.Globalization.CultureInfo.CurrentCulture); } else if (ColumnValueArry[i].Length == 8) { dt = DateTime.ParseExact(ColumnValueArry[i], "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture); } if (dt != null) { pRowBuff.set_Value(findex, dt.Value); } } catch (Exception) { } } else if (ColumnNameList[i].ColumnType == VctColumsTypeEnum.VARBIN) { if (!string.IsNullOrEmpty(ColumnValueArry[i])) { #region 外挂文件拷贝 string newpath = VarBinFileCoby(vctdata.TableStructureList[i].TableName, ColumnValueArry[i]); pRowBuff.set_Value(findex, newpath); #endregion } } else if (ColumnNameList[i].ColumnType == VctColumsTypeEnum.VARCHAR) { int varbsm; int.TryParse(ColumnValueArry[i], out varbsm); if (varbsm > 0 && dicvarchar.ContainsKey(varbsm)) { pRowBuff.set_Value(findex, GetVarcharValue(streamReader, dicvarchar[varbsm])); dicvarchar.Remove(varbsm); } else { pRowBuff.set_Value(findex, "");//优先清空上一次的列值 } } //屏蔽原因:北京数慧公司认为,VCT数据是什么,转MDB的时候就是什么,不应再对数据四舍五入 //修改原因:float和double类型的数据需要保留字段精度小数 修改人:高山 修改时间:2018.12.4 //else if (ColumnNameList[i].ColumnType == VctColumsTypeEnum.FLOAT) //{ //如果小数位数和当前列的精度一致,则不需要四舍五入,反之四舍五入 //if (ColumnValueArry[i].Length - ColumnValueArry[i].IndexOf(".") - 1 <= ColumnNameList[i].Precision) //{ // pRowBuff.set_Value(findex, ColumnValueArry[i]); //} //else //{ // float value = 0f; // if (float.TryParse(ColumnValueArry[i], out value)) // { // if (ColumnNameList[i].Precision > 0) // { // pRowBuff.set_Value(findex, Math.Round(value, ColumnNameList[i].Precision, MidpointRounding.AwayFromZero)); // } // else // { // pRowBuff.set_Value(findex, ColumnValueArry[i]); // } // } //} //} //else if (ColumnNameList[i].ColumnType == VctColumsTypeEnum.DOUBLE) //{ //如果小数位数和当前列的精度一致,则不需要四舍五入,反之四舍五入 // if (ColumnValueArry[i].Length - ColumnValueArry[i].IndexOf(".") - 1 <= ColumnNameList[i].Precision) // { // pRowBuff.set_Value(findex, ColumnValueArry[i]); // } // else // { // double value = 0; // if (double.TryParse(ColumnValueArry[i], out value)) // { // if (ColumnNameList[i].Precision > 0) // { // pRowBuff.set_Value(findex, Math.Round(value, ColumnNameList[i].Precision, MidpointRounding.AwayFromZero)); // } // else // { // pRowBuff.set_Value(findex, ColumnValueArry[i]); // } // } // } //} else { pRowBuff.set_Value(findex, ColumnValueArry[i]); } } } /// /// 创建图层到MDB /// /// /// /// /// private void CreateFeatureClassToMdb(IWorkspace pWorkspace, VctTableStructureEntity vctTableStructureEntity, VctFeatureCodeEntity featurecode, string prj, double ReferenceScale, IFeatureDataset targetFeatureDataset = null) { esriFeatureType esriFeatureTypetmp = esriFeatureType.esriFTSimple; try { IFeatureWorkspace pFeatureWorkSpace = pWorkspace as IFeatureWorkspace; if (featurecode.GeoType == GeoTypeEnum.ANNOTATION) { CreateAnnotationToMdb(pWorkspace, vctTableStructureEntity, featurecode, prj, ReferenceScale, targetFeatureDataset); return; } IObjectClassDescription ocDescription = new FeatureClassDescriptionClass(); IFeatureClassDescription fcDescription = (IFeatureClassDescription)ocDescription; IFields fields = ocDescription.RequiredFields; int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName); IField field = fields.get_Field(shapeFieldIndex); SetField(ref fields, vctTableStructureEntity); IGeometryDef geometryDef = field.GeometryDef; IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef; switch (featurecode.GeoType) { case GeoTypeEnum.POINT: geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; esriFeatureTypetmp = esriFeatureType.esriFTSimple; break; case GeoTypeEnum.LINE: geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline; esriFeatureTypetmp = esriFeatureType.esriFTSimple; break; case GeoTypeEnum.POLYGON: geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; esriFeatureTypetmp = esriFeatureType.esriFTSimple; break; case GeoTypeEnum.ANNOTATION: geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; esriFeatureTypetmp = esriFeatureType.esriFTAnnotation; break; default: break; } IFeatureClass resultFeatureClass = null; if (targetFeatureDataset != null) { resultFeatureClass = targetFeatureDataset.CreateFeatureClass(featurecode.TCMC, fields, ocDescription.InstanceCLSID, ocDescription.ClassExtensionCLSID, esriFeatureTypetmp, fcDescription.ShapeFieldName, ""); } else { geometryDefEdit.SpatialReference_2 = GetSpatialReference(prj, pFeatureWorkSpace as Workspace); IFieldChecker fieldChecker = new FieldCheckerClass(); IEnumFieldError enumFieldError = null; IFields validatedFields = null; //将传入字段 转成 validatedFields fieldChecker.ValidateWorkspace = (ESRI.ArcGIS.Geodatabase.IWorkspace)pFeatureWorkSpace; fieldChecker.Validate(fields, out enumFieldError, out validatedFields); resultFeatureClass = pFeatureWorkSpace.CreateFeatureClass(featurecode.TCMC, validatedFields, ocDescription.InstanceCLSID, ocDescription.ClassExtensionCLSID, esriFeatureTypetmp, fcDescription.ShapeFieldName, ""); } } catch (Exception ex) { throw ex; } } /// /// 创建属性表 /// /// /// private void CreateTableToMdb(IWorkspace pWorkspace, VctTableStructureEntity vctTableStructureEntity) { try { IFeatureWorkspace pFeatureWorkSpace = pWorkspace as IFeatureWorkspace; IFields fields = new FieldsClass(); SetField(ref fields, vctTableStructureEntity); ESRI.ArcGIS.esriSystem.UID uid = new ESRI.ArcGIS.esriSystem.UIDClass(); uid.Value = "esriGeoDatabase.Object"; IFieldChecker fieldChecker = new FieldCheckerClass(); IEnumFieldError enumFieldError = null; IFields validatedFields = null; //将传入字段 转成 validatedFields fieldChecker.ValidateWorkspace = (ESRI.ArcGIS.Geodatabase.IWorkspace)pFeatureWorkSpace; fieldChecker.Validate(fields, out enumFieldError, out validatedFields); ITable table = pFeatureWorkSpace.CreateTable(vctTableStructureEntity.TableName, validatedFields, uid, null, ""); } catch (Exception ex) { throw ex; } } /// /// 创建注记图层 /// /// /// /// /// /// private void CreateAnnotationToMdb(IWorkspace pWorkspace, VctTableStructureEntity vctTableStructureEntity, VctFeatureCodeEntity featurecode, string prj, double ReferenceScale, IFeatureDataset targetFeatureDataset = null) { try { IFeatureWorkspace pFeatureWorkSpace = pWorkspace as IFeatureWorkspace; // Create an annotation class and provide it with a name. ILabelEngineLayerProperties labelEngineLayerProperties = new LabelEngineLayerPropertiesClass(); IAnnotateLayerProperties annotateLayerProperties = (IAnnotateLayerProperties)labelEngineLayerProperties; annotateLayerProperties.Class = "Annotation Class 1"; // Get the symbol from the annotation class. Make any changes to its properties // here. ITextSymbol annotationTextSymbol = labelEngineLayerProperties.Symbol; ISymbol annotationSymbol = (ISymbol)annotationTextSymbol; // Create a symbol collection and add the default symbol from the // annotation class to the collection. Assign the resulting symbol ID // to the annotation class. ISymbolCollection symbolCollection = new SymbolCollectionClass(); ISymbolCollection2 symbolCollection2 = (ISymbolCollection2)symbolCollection; ISymbolIdentifier2 symbolIdentifier2 = null; symbolCollection2.AddSymbol(annotationSymbol, "Annotation Class 1", out symbolIdentifier2); labelEngineLayerProperties.SymbolID = symbolIdentifier2.ID; // Add the annotation class to a collection. IAnnotateLayerPropertiesCollection annotateLayerPropsCollection = new AnnotateLayerPropertiesCollectionClass(); annotateLayerPropsCollection.Add(annotateLayerProperties); // Create a graphics layer scale object. IGraphicsLayerScale graphicsLayerScale = new GraphicsLayerScaleClass(); graphicsLayerScale.ReferenceScale = ReferenceScale; graphicsLayerScale.Units = ESRI.ArcGIS.esriSystem.esriUnits.esriDecimalDegrees; // Create the overposter properties for the standard label engine. IOverposterProperties overposterProperties = new BasicOverposterPropertiesClass(); // Instantiate a class description object. IObjectClassDescription ocDescription = new AnnotationFeatureClassDescriptionClass(); IFeatureClassDescription fcDescription = (IFeatureClassDescription)ocDescription; // Get the shape field from the class description's required fields. IFields requiredFields = ocDescription.RequiredFields; int shapeFieldIndex = requiredFields.FindField(fcDescription.ShapeFieldName); IField shapeField = requiredFields.get_Field(shapeFieldIndex); IGeometryDef geometryDef = shapeField.GeometryDef; IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef; geometryDefEdit.SpatialReference_2 = GetSpatialReference(prj, pFeatureWorkSpace as Workspace); // Create the annotation layer factory. IAnnotationLayerFactory annotationLayerFactory = new FDOGraphicsLayerFactoryClass(); // Create the annotation feature class and an annotation layer for it. IAnnotationLayer annotationLayer = annotationLayerFactory.CreateAnnotationLayer (pFeatureWorkSpace, targetFeatureDataset, featurecode.TCMC, geometryDef, null, annotateLayerPropsCollection, graphicsLayerScale, symbolCollection, false, false, false, true, overposterProperties, ""); List fieldlist = GetField(vctTableStructureEntity); if (fieldlist != null && fieldlist.Count > 0) { IFeatureLayer featureLayer = (IFeatureLayer)annotationLayer; IFeatureClass featureClass = featureLayer.FeatureClass; foreach (var item in fieldlist) { if (featureClass.Fields.FindField(item.Name) == -1) { featureClass.AddField(item); } } } } catch (Exception ex) { throw ex; } } public List ReadLine(System.IO.FileStream fs, byte[] buffer, int lineCount = 1) { List valuelist = new List(); List linebytes = new List(); while (lineCount > 0) { int count = fs.Read(buffer, 0, buffer.Length); if (count == 0) { break; } for (int j = 0; j < count; j++) { if (buffer[j] == 10) { if (j > 0 && buffer[j - 1] == 13) { linebytes.RemoveAt(linebytes.Count - 1); } if (linebytes.Count > 0) { valuelist.Add(GetStrByByteArry(linebytes.ToArray())); linebytes.Clear(); } lineCount--; if (lineCount == 0) { fs.Seek(j - count + 1, SeekOrigin.Current); break; } } else { linebytes.Add(buffer[j]); } } } return valuelist; } public IGeometry GetGeo(FileStream streamReader, IGeometryFactory3 factory, GeoTypeEnum geotype, Dictionary dictopoline) { string geostr = string.Empty; byte[] geobytearry = null; switch (geotype) { case GeoTypeEnum.POINT: geobytearry = GetGeoPointByte(streamReader); break; case GeoTypeEnum.LINE: geobytearry = GetGeoLineByte(streamReader); break; case GeoTypeEnum.POLYGON: geobytearry = GetGeoPolygonByte(streamReader, dictopoline); break; default: break; } if (geobytearry == null) { return null; } IGeometry geom = ConvertWKBToGeometry(factory, geobytearry); if (geom != null && !geom.IsEmpty && geom.GeometryType == esriGeometryType.esriGeometryPolygon && (geom as IArea).Area < 0) { IPolygon pPolygon = geom as IPolygon; pPolygon.ReverseOrientation(); } return geom; } public IElement GetAnnotation(FileStream streamReader, IGeometryFactory3 factory, List ColumnNameList, string[] ColumnValueArry) { Dictionary dicannoation = new Dictionary(); for (int i = 0; i < ColumnNameList.Count; i++) { if (string.IsNullOrEmpty(ColumnValueArry[i])) { continue; } ColumnValueArry[i] = GetReplaceDH(ColumnValueArry[i]); dicannoation.Add(ColumnNameList[i].ColumnName, ColumnValueArry[i]); } //string[] points = dicannoation["POINT"].ToString().Split(','); ArrayList result = new ArrayList(); result.Add((byte)OSGeo.OGR.wkbByteOrder.wkbNDR); result.AddRange(BitConverter.GetBytes((int)OSGeo.OGR.wkbGeometryType.wkbPoint)); result.AddRange(BitConverter.GetBytes(double.Parse(dicannoation["ZJDZXJXZB"]))); result.AddRange(BitConverter.GetBytes(double.Parse(dicannoation["ZJDZXJYZB"]))); ITextElement textElement = new TextElementClass(); //textElement.ScaleText = true; string zjfx = dicannoation.ContainsKey("ZJFX") ? dicannoation["ZJFX"] : "0"; textElement.Symbol = GetTextElement2(dicannoation, double.Parse(zjfx)); if (dicannoation.ContainsKey("ZJNR")) { textElement.Text = RegexReplace(dicannoation["ZJNR"]); } IElement element = textElement as IElement; element.Geometry = ConvertWKBToGeometry(factory, (byte[])result.ToArray(typeof(byte))); return element; } private string GetReplaceDH(string inputstr) { return inputstr.Replace("&", ","); } /// /// 外挂文件拷贝 /// /// /// /// private string VarBinFileCoby(string tablename, object valueobj) { string newpath = string.Empty; if (File.Exists(valueobj.ToTrim())) { newpath = System.IO.Path.Combine(RootPath, "外挂文件", tablename); if (!System.IO.Directory.Exists(newpath)) { System.IO.Directory.CreateDirectory(newpath); } newpath = System.IO.Path.Combine(newpath, System.IO.Path.GetFileName(valueobj.ToTrim())); File.Copy(valueobj.ToTrim(), newpath); } return newpath; } public string GetVarcharValue(FileStream fs, VctPositionEntity position) { long currentpos = fs.Position; fs.Position = position.BeginPosition; byte[] buffer = new byte[position.EndPostion - position.BeginPosition]; fs.Read(buffer, 0, buffer.Length); fs.Position = currentpos; string value = RegexReplace(System.Text.Encoding.GetEncoding("gb2312").GetString(buffer)).TrimEnd(); return value; } /// /// 设置列 /// /// /// public void SetField(ref IFields fields, VctTableStructureEntity vctTableStructureEntity) { try { IField pField = new FieldClass(); IFieldEdit pFieldEdit = (IFieldEdit)pField; IFieldsEdit pFieldsEdit = (IFieldsEdit)fields; foreach (var item in vctTableStructureEntity.Columns) { pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = item.ColumnName; switch (item.ColumnType) { case VctColumsTypeEnum.CHAR: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldEdit.Length_2 = item.Length; break; case VctColumsTypeEnum.VARCHAR: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; if (item.Length > 0) { pFieldEdit.Length_2 = item.Length; } else { pFieldEdit.Length_2 = 254; } break; case VctColumsTypeEnum.INT: case VctColumsTypeEnum.INT2: case VctColumsTypeEnum.INT4: case VctColumsTypeEnum.INT8: if (item.Length < 4) { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger; } else { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; } pFieldEdit.Length_2 = item.Length; break; case VctColumsTypeEnum.FLOAT: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; pFieldEdit.Length_2 = item.Length; pFieldEdit.Precision_2 = item.Precision; break; case VctColumsTypeEnum.DATE: case VctColumsTypeEnum.DATETIME: case VctColumsTypeEnum.TIME: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate; break; case VctColumsTypeEnum.VARBIN: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldEdit.Length_2 = 1024; break; default: break; } pFieldsEdit.AddField(pField); } } catch (Exception) { throw; } } public List GetField(VctTableStructureEntity vctTableStructureEntity) { try { List result = new List(); IField pField = new FieldClass(); IFieldEdit pFieldEdit = (IFieldEdit)pField; foreach (var item in vctTableStructureEntity.Columns) { pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = item.ColumnName; switch (item.ColumnType) { case VctColumsTypeEnum.CHAR: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldEdit.Length_2 = item.Length; break; case VctColumsTypeEnum.VARCHAR: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldEdit.Length_2 = 2147483647; break; case VctColumsTypeEnum.INT: case VctColumsTypeEnum.INT2: case VctColumsTypeEnum.INT4: case VctColumsTypeEnum.INT8: if (item.Length < 4) { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger; } else { pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; } pFieldEdit.Length_2 = item.Length; break; case VctColumsTypeEnum.FLOAT: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; pFieldEdit.Length_2 = item.Length; pFieldEdit.Precision_2 = item.Precision; break; case VctColumsTypeEnum.DATE: case VctColumsTypeEnum.DATETIME: case VctColumsTypeEnum.TIME: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate; break; case VctColumsTypeEnum.VARBIN: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; pFieldEdit.Length_2 = 1024; break; default: break; } result.Add(pField); } return result; } catch (Exception) { throw; } } public string GetStrByByteArry(byte[] buffer) { return System.Text.Encoding.GetEncoding("gb2312").GetString(buffer.ToArray()).Trim(); } /// /// 获取点 /// /// /// public byte[] GetGeoPointByte(FileStream streamReader) { #region 点 string[] linearry = new string[3]; int linecount = 0; string linestr = string.Empty; long tablebsmposition = streamReader.Position; linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); while (!linestr.Equals("POINTEND", StringComparison.CurrentCultureIgnoreCase)) { try { if (string.IsNullOrWhiteSpace(linestr)) { continue; } //当前段结束 if (linestr == "0") { string[] pointxy = linearry[2].Split(','); ArrayList result = new ArrayList(); result.Add((byte)OSGeo.OGR.wkbByteOrder.wkbNDR); result.AddRange(BitConverter.GetBytes((int)OSGeo.OGR.wkbGeometryType.wkbPoint)); result.AddRange(BitConverter.GetBytes(double.Parse(pointxy[0]))); result.AddRange(BitConverter.GetBytes(double.Parse(pointxy[1]))); return (byte[])result.ToArray(typeof(byte)); } if (linecount < 3)//开始读取 { linearry[linecount] = linestr; } linecount++; } finally { tablebsmposition = streamReader.Position; linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); } } #endregion return null; } public byte[] GetGeoLineByte(FileStream streamReader) { #region 线 List linelist = GetGeoLineList(streamReader); if (linelist != null && linelist.Count > 0) { ArrayList pointlist = new ArrayList(); foreach (var item in linelist) { string[] pointarry = item.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (pointarry.Length < 2) { continue; } pointlist.AddRange(BitConverter.GetBytes(double.Parse(pointarry[0]))); pointlist.AddRange(BitConverter.GetBytes(double.Parse(pointarry[1]))); } ArrayList result = new ArrayList(); result.Add((byte)OSGeo.OGR.wkbByteOrder.wkbNDR); result.AddRange(BitConverter.GetBytes((int)OSGeo.OGR.wkbGeometryType.wkbLineString)); result.AddRange(BitConverter.GetBytes(pointlist.Count / 16)); result.AddRange(pointlist); return (byte[])result.ToArray(typeof(byte)); } #endregion return null; } public byte[] GetGeoPolygonByte(FileStream streamReader, Dictionary dictopoline) { #region 面 int linecount = 0; string linestr = string.Empty; long tablebsmposition = streamReader.Position; linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); List> polygontolinebsmlist = new List>(); List polygontolineArrayList = new List(); while (!linestr.Equals("POLYGONEND", StringComparison.CurrentCultureIgnoreCase)) { try { if (string.IsNullOrWhiteSpace(linestr)) { continue; } //当前段结束 if (linestr == "0") { if (polygontolinebsmlist.Count == 0) { return null; } byte[] buffer = new byte[256]; foreach (var linebsmlist in polygontolinebsmlist) { double[] linebeginxy = new double[] { double.MinValue, double.MinValue }; ArrayList itemArrayList = new ArrayList(); foreach (var linebsm in linebsmlist) { int bsm = Math.Abs(linebsm); if (dictopoline.ContainsKey(bsm)) { streamReader.Position = dictopoline[bsm].ShapePosition; List linelist = ReadLine(streamReader, buffer, 2);//前两行,标识码和要素代码 if (linelist == null || linelist.Count != 2 || linelist[0] != bsm.ToString())//为空、没有两行、或者标识码不相等就不处理 { continue; } List linepointlist = GetGeoLineList(streamReader); if (linepointlist != null && linepointlist.Count > 0) { if (linebsm < 0) { linepointlist.Reverse(); } foreach (var linepointstr in linepointlist) { string[] xy = linepointstr.Split(','); double x = double.Parse(xy[0]); double y = double.Parse(xy[1]); if (linebeginxy[0] == x && linebeginxy[1] == y) { continue; } linebeginxy[0] = x; linebeginxy[1] = y; itemArrayList.AddRange(BitConverter.GetBytes(x)); itemArrayList.AddRange(BitConverter.GetBytes(y)); } } } } if (itemArrayList.Count >= 48)//一个面至少有三个点,所以此处判断必须大于等于48 { polygontolineArrayList.Add(itemArrayList); } } if (polygontolineArrayList.Count > 0) { ArrayList result = new ArrayList(); result.Add((byte)OSGeo.OGR.wkbByteOrder.wkbNDR); result.AddRange(BitConverter.GetBytes((int)OSGeo.OGR.wkbGeometryType.wkbPolygon)); result.AddRange(BitConverter.GetBytes(polygontolineArrayList.Count)); foreach (var item in polygontolineArrayList) { result.AddRange(BitConverter.GetBytes(item.Count / 16)); result.AddRange(item); } return (byte[])result.ToArray(typeof(byte)); } break; } if (linecount > 4)//开始读取坐标 { string[] pointarry = linestr.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var item in pointarry) { int bsm = int.Parse(item); if (bsm != 0) { if (polygontolinebsmlist.Count == 0) { polygontolinebsmlist.Add(new List()); } polygontolinebsmlist[polygontolinebsmlist.Count - 1].Add(bsm); } else { polygontolinebsmlist.Add(new List()); } } } linecount++; } finally { tablebsmposition = streamReader.Position; linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); } } #endregion return null; } public IGeometry ConvertWKBToGeometry(IGeometryFactory3 factory, byte[] wkb) { IGeometry geom; int countin = wkb.GetLength(0); factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin); return geom; } public ITextSymbol GetTextElement2(Dictionary dicannoation, double angle) { float[] dxfarry = new float[3];//字体大小:高度,宽度,间隔:TODO此处还不知道怎么设置字体的大小 dxfarry[0] = 2.5f; dxfarry[1] = 2.5f; dxfarry[2] = 0; if (dicannoation.ContainsKey("BS")) { float.TryParse(dicannoation["BS"], out dxfarry[0]); } if (dicannoation.ContainsKey("KD")) { float.TryParse(dicannoation["KD"], out dxfarry[1]); } if (dicannoation.ContainsKey("JG")) { float.TryParse(dicannoation["JG"], out dxfarry[2]); } string[] ysarry = null; string zt = string.Empty; if (dicannoation.ContainsKey("ZT")) { zt = dicannoation["ZT"]; } else { zt = "宋体"; } if (dicannoation.ContainsKey("YS")) { ysarry = dicannoation["YS"].Split(','); } if (ysarry == null || ysarry.Length < 3) { ysarry = new string[] { "0", "0", "0" }; } int bold = 0; if (dicannoation.ContainsKey("XZ")) { int.TryParse(dicannoation["XZ"], out bold); } int underline = 0; if (dicannoation.ContainsKey("XHX")) { int.TryParse(dicannoation["XHX"], out underline); } ITextSymbol textSymbol = new TextSymbolClass(); textSymbol.Color = ColorCustom(int.Parse(ysarry[0]), int.Parse(ysarry[1]), int.Parse(ysarry[2])); ////不可以直接修改textSymbol.Font.Bold等属性,无效 stdole.IFontDisp font = GetIFontDisp(underline > 0, zt); font.Bold = bold > 400; textSymbol.Font = font; textSymbol.Angle = 180 / Math.PI * angle; //弧度转为角度 ; textSymbol.Size = Convert.ToDouble(dxfarry[0]); //保证点在注记的左下角 textSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft; textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline; //add by tornado textSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter; textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter; return textSymbol; } public List GetGeoLineList(FileStream streamReader) { #region 线 int linecount = 0; string linestr = string.Empty; linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); List pointlist = new List(); while (!linestr.Equals("LINEEND", StringComparison.CurrentCultureIgnoreCase)) { try { if (string.IsNullOrWhiteSpace(linestr)) { continue; } //当前段结束 if (linestr == "0") { return pointlist; } if (linecount > 4)//开始读取坐标 { string[] pointarry = linestr.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (pointarry.Length < 2) { continue; } pointlist.Add(linestr); } linecount++; } finally { linestr = VCTIndexHelper.ReadLine(streamReader).Trim(); } } #endregion return null; } /// /// 自定义颜色 /// /// The r. /// The g. /// The b. /// IRgbColor /// private IRgbColor ColorCustom(int r, int g, int b) { IRgbColor myColor = new RgbColor(); myColor.Red = r; myColor.Blue = b; myColor.Green = g; return myColor; } /// /// 字体设置 /// /// The size. /// The fontname. /// /// IFontDisp /// public stdole.IFontDisp GetIFontDisp(bool underline, string fontname) { IFontDisp font = new StdFontClass() as IFontDisp; font.Name = fontname; font.Underline = underline; //string fontFamilyName = fontname; //FontStyle fontStyle = FontStyle.Regular; //Font font = new Font(fontname, float.Parse(size.ToString()) * 96 / 85, fontStyle); //return ESRI.ArcGIS.ADF.COMSupport.OLE.GetIFontDispFromFont(font) as stdole.IFontDisp; return font; } } public class VctPositionEntity { public long BeginPosition { get; set; } public long EndPostion { get; set; } } }