|
|
|
|
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<int, VctPositionEntity> dicvarchar = new Dictionary<int, VctPositionEntity>();
|
|
|
|
|
Dictionary<string, long> dicConstant = new Dictionary<string, long>();
|
|
|
|
|
Dictionary<string, long> dicRelationtable = new Dictionary<string, long>();
|
|
|
|
|
Dictionary<string, long> dicRepresentation = new Dictionary<string, long>();
|
|
|
|
|
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<int, VCTIDXEntity> dictopoline = new Dictionary<int, VCTIDXEntity>();
|
|
|
|
|
string idxfilepath = System.IO.Path.Combine(idxdir, "TopoArcs.idx");
|
|
|
|
|
if (File.Exists(idxfilepath))//缓存topo线集合
|
|
|
|
|
{
|
|
|
|
|
ReadTopoArcsIDX(dictopoline, idxfilepath);
|
|
|
|
|
}
|
|
|
|
|
List<string> templist = new List<string>();
|
|
|
|
|
//插入空间图层
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取prj字符串
|
|
|
|
|
/// 修改时间:2019.1.7
|
|
|
|
|
/// 修改原因:数慧验证我们的VCT坐标参考不正确,借鉴数慧公司处理方法,将坐标参考中
|
|
|
|
|
/// GEOGCS参数GCS_China_Geodetic_Coordinate_System_2000和DATUM['D_China_2000']默认设置,修改后仅支持GGCS2000坐标参考
|
|
|
|
|
/// 修改人:高山
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="vctdata"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建MDB
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="mdbfolder"></param>
|
|
|
|
|
/// <param name="mdbName"></param>
|
|
|
|
|
/// <param name="vectordata"></param>
|
|
|
|
|
/// <param name="prj"></param>
|
|
|
|
|
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<string> tcmclist = new List<string>();
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 缓存varchar
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="vctfilepath"></param>
|
|
|
|
|
/// <param name="dicvarchar"></param>
|
|
|
|
|
/// <param name="Separator"></param>
|
|
|
|
|
public void SetVarcharValueToDic(FileStream stream, Dictionary<int, VctPositionEntity> 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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插入数据到无图形的属性表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="vctfilepath"></param>
|
|
|
|
|
/// <param name="pFeatBuff"></param>
|
|
|
|
|
/// <param name="vctdata"></param>
|
|
|
|
|
/// <param name="dicvarchar"></param>
|
|
|
|
|
/// <param name="pFeatureWorkSpace"></param>
|
|
|
|
|
/// <param name="nonegeotable"></param>
|
|
|
|
|
private void InsertDataToNoneGeoTable(FileStream streamReader, VctVectorData vctdata, Dictionary<int, VctPositionEntity> dicvarchar, IFeatureWorkspace pFeatureWorkSpace, List<VctTableStructureEntity> 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<VctColumnItem> 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<int, VCTIDXEntity> 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<int, VctPositionEntity> dicvarchar, IFeatureWorkspace pFeatureWorkSpace, string idxfilepath, Dictionary<int, VCTIDXEntity> dictopoline, Dictionary<string, long> dicConstant, Dictionary<string, long> dicRelationtable, Dictionary<string, long> 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<VctColumnItem> 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<string> 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");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建要素数据集
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="workspace"></param>
|
|
|
|
|
/// <param name="datasetName"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 属性赋值
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="streamReader"></param>
|
|
|
|
|
/// <param name="vctdata"></param>
|
|
|
|
|
/// <param name="dicvarchar"></param>
|
|
|
|
|
/// <param name="pFlds"></param>
|
|
|
|
|
/// <param name="pRowBuff"></param>
|
|
|
|
|
/// <param name="ColumnNameList"></param>
|
|
|
|
|
/// <param name="ColumnValueArry"></param>
|
|
|
|
|
private void SetAttributeValue(FileStream streamReader, VctVectorData vctdata, Dictionary<int, VctPositionEntity> dicvarchar, IFields pFlds, IRowBuffer pRowBuff, List<VctColumnItem> 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]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建图层到MDB
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pWorkspace"></param>
|
|
|
|
|
/// <param name="vctTableStructureEntity"></param>
|
|
|
|
|
/// <param name="featurecode"></param>
|
|
|
|
|
/// <param name="targetFeatureDataset"></param>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建属性表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pWorkspace"></param>
|
|
|
|
|
/// <param name="vctTableStructureEntity"></param>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建注记图层
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pWorkspace"></param>
|
|
|
|
|
/// <param name="vctTableStructureEntity"></param>
|
|
|
|
|
/// <param name="featurecode"></param>
|
|
|
|
|
/// <param name="prj"></param>
|
|
|
|
|
/// <param name="targetFeatureDataset"></param>
|
|
|
|
|
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<IField> 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<string> ReadLine(System.IO.FileStream fs, byte[] buffer, int lineCount = 1)
|
|
|
|
|
{
|
|
|
|
|
List<string> valuelist = new List<string>();
|
|
|
|
|
List<byte> linebytes = new List<byte>();
|
|
|
|
|
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<int, VCTIDXEntity> 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<VctColumnItem> ColumnNameList, string[] ColumnValueArry)
|
|
|
|
|
{
|
|
|
|
|
Dictionary<string, string> dicannoation = new Dictionary<string, string>();
|
|
|
|
|
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("&", ",");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 外挂文件拷贝
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="tablename"></param>
|
|
|
|
|
/// <param name="hsb"></param>
|
|
|
|
|
/// <param name="valueobj"></param>
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设置列
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="fields"></param>
|
|
|
|
|
/// <param name="lstEntity"></param>
|
|
|
|
|
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<IField> GetField(VctTableStructureEntity vctTableStructureEntity)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
List<IField> result = new List<IField>();
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取点
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="streamReader"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
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<string> 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<int, VCTIDXEntity> dictopoline)
|
|
|
|
|
{
|
|
|
|
|
#region 面
|
|
|
|
|
int linecount = 0;
|
|
|
|
|
string linestr = string.Empty;
|
|
|
|
|
long tablebsmposition = streamReader.Position;
|
|
|
|
|
linestr = VCTIndexHelper.ReadLine(streamReader).Trim();
|
|
|
|
|
List<List<int>> polygontolinebsmlist = new List<List<int>>();
|
|
|
|
|
List<ArrayList> polygontolineArrayList = new List<ArrayList>();
|
|
|
|
|
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<string> linelist = ReadLine(streamReader, buffer, 2);//前两行,标识码和要素代码
|
|
|
|
|
if (linelist == null || linelist.Count != 2 || linelist[0] != bsm.ToString())//为空、没有两行、或者标识码不相等就不处理
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
List<string> 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<int>());
|
|
|
|
|
}
|
|
|
|
|
polygontolinebsmlist[polygontolinebsmlist.Count - 1].Add(bsm);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
polygontolinebsmlist.Add(new List<int>());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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<string, string> 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<string> GetGeoLineList(FileStream streamReader)
|
|
|
|
|
{
|
|
|
|
|
#region 线
|
|
|
|
|
int linecount = 0;
|
|
|
|
|
string linestr = string.Empty;
|
|
|
|
|
linestr = VCTIndexHelper.ReadLine(streamReader).Trim();
|
|
|
|
|
List<string> pointlist = new List<string>();
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 自定义颜色
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="r">The r.</param>
|
|
|
|
|
/// <param name="g">The g.</param>
|
|
|
|
|
/// <param name="b">The b.</param>
|
|
|
|
|
/// <returns>IRgbColor</returns>
|
|
|
|
|
/// <remarks></remarks>
|
|
|
|
|
private IRgbColor ColorCustom(int r, int g, int b)
|
|
|
|
|
{
|
|
|
|
|
IRgbColor myColor = new RgbColor();
|
|
|
|
|
myColor.Red = r;
|
|
|
|
|
myColor.Blue = b;
|
|
|
|
|
myColor.Green = g;
|
|
|
|
|
return myColor;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 字体设置
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="size">The size.</param>
|
|
|
|
|
/// <param name="fontname">The fontname.</param>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// IFontDisp
|
|
|
|
|
/// </returns>
|
|
|
|
|
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; }
|
|
|
|
|
}
|
|
|
|
|
}
|