|
|
|
1个月前 groundhog :
麻烦帮我看看,这是代码
1.类
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using System.Windows.Forms;
using ESRI.ArcGIS.Geoprocessor;
using ESRI.ArcGIS.Geoprocessing;
public class engDatamanager
{
/// <summary>
/// 设置SDE连接串
/// </summary>
public string connString = "SERVER=192.168.20.81;INSTANCE=5151;USER=rsig;PASSWORD=rsinge;VERSION=sde.DEFAULT";
/// <summary>
/// 数据类型枚举
/// </summary>
public enum convDataType{convDataTypeGDB=0,
convDataTypePersonalGDB=1,
convDataTypeShapefile=2,
convDataTypeCoverage=3,
convDataTypeInfo=4,
convDataTypeDbase=5,
convDataTypeOLEDB=6};
public engDatamanager()
{
}
#region 把栅格数据拷贝到sde
public IGeoProcessorResult uploadRaster(string inPathName, string outPathName)
{
try
{
IVariantArray parameters = new VarArrayClass();
//设置输入栅格
parameters.Add(@inPathName);
//设置输出栅格
parameters.Add(@outPathName);
//默认配置关键字
parameters.Add("#");
//背景值忽视为0
parameters.Add(0);
//NoData设为空
parameters.Add("#");
//设置onebitto8bit为NONE.
parameters.Add("NONE");
//设置colormaptoRGB为NONE.
parameters.Add("NONE");
//默认输出像素类型.
parameters.Add("#");
//执行拷贝操作.
Geoprocessor geoprocessor = new Geoprocessor();
IGeoProcessorResult gpResult = new GeoProcessorResultClass();
gpResult = (IGeoProcessorResult)geoprocessor.Execute("CopyRaster", parameters, null);
return gpResult;
}
catch (System.Exception ex)
{
throw new Exception(ex.Message);
}
}
#endregion
#region 转换和上传shp数据
public string ConvertData(IPropertySet pInProPertySet,
string sInName,
convDataType eInDataType,
IPropertySet pOutPropertySet,
string sOutName,
string sOutFDName,
convDataType eOutDataType,
bool bOutFC )
{
try
{
//设置输入工作空间
IWorkspaceName pInWorkspaceName = new WorkspaceNameClass();
pInWorkspaceName.ConnectionProperties = pInProPertySet;
pInWorkspaceName.WorkspaceFactoryProgID = GetProgID(eInDataType);
//设置输出工作空间
IWorkspaceName pOutWorkspaceName = new WorkspaceNameClass();
pOutWorkspaceName.ConnectionProperties = pOutPropertySet;
pOutWorkspaceName.WorkspaceFactoryProgID = GetProgID(eOutDataType);
//设置输入数据集名称和数据集工作空间名称
IDatasetName pInDatasetName;
if (bOutFC)
pInDatasetName = new FeatureClassNameClass();
else
pInDatasetName = new TableNameClass();
pInDatasetName.Name = sInName;
pInDatasetName.WorkspaceName = pInWorkspaceName;
//设置输出图元数据集的名称和数据集工作空间名称
IDatasetName pOutFDName;
if (sOutFDName == "")
pOutFDName = null;
else
{
pOutFDName = new FeatureDatasetNameClass();
pOutFDName.WorkspaceName = pOutWorkspaceName;
pOutFDName.Name = sOutFDName;
}
//设置输出数据集的名称
IDatasetName pOutDatasetName;
IFeatureClassName pFCName=new FeatureClassNameClass ();
if (bOutFC)
{
pFCName = new FeatureClassNameClass();
pOutDatasetName = (IDatasetName )pFCName;
if (pOutFDName != null)
pFCName.FeatureDatasetName = pOutFDName;
}
else
pOutDatasetName = new TableNameClass();
pOutDatasetName.WorkspaceName = pOutWorkspaceName;
pOutDatasetName.Name = sOutName;
//打开输入表,得到表定义
IName pName;
ITable pInTable;
pName =(IName)pInDatasetName ;
pInTable = (ITable)pName.Open();//?
//核对域名称,输出错误
IFields pInFields;
pInFields = pInTable.Fields;
IFieldChecker pFieldCheck;
pFieldCheck = new FieldCheckerClass();
IFields pOutFields=new FieldsClass ();
IEnumFieldError pEnumFieldError;
pFieldCheck.Validate(pInFields ,out pEnumFieldError ,out pOutFields);
if (pEnumFieldError != null)
{
string strFldErr;
strFldErr = "一列或者多列的命名应该作如下形式的更名:";
IFieldError pFieldError;
pFieldError = pEnumFieldError.Next();
while (pFieldError != null)
{
IField pInField;
IField pOutField;
pInField = pInFields.get_Field(pFieldError .FieldIndex);
pOutField = pOutFields.get_Field(pFieldError .FieldIndex );
strFldErr = strFldErr + "\n" + pOutField.Name + "\t" + "原因是: " + GetFieldError(pFieldError.FieldError);
pFieldError = pEnumFieldError.Next();
}
strFldErr = strFldErr + "\n" + "\n" + "继续吗?";
DialogResult myDialogResult = MessageBox.Show(strFldErr ,"提示信息",MessageBoxButtons .YesNo );
if (myDialogResult == DialogResult.No)
{
return "数据上传已经取消!";
}
}
//若要转化为图元类,设置输出几何体的定义
int i;
IField pGeoField=new FieldClass ();
IGeometryDef pOutFCGeoDef=new GeometryDefClass ();
IGeometryDefEdit pOutFCGeoDefEdit;
if(bOutFC )
{
for (i=0;i<=pOutFields .FieldCount ;i++)
{
if(pOutFields .get_Field (i).Type ==esriFieldType .esriFieldTypeGeometry )
{
pGeoField =pOutFields.get_Field (i);
break;
}
//得到几何数据域的定义
pOutFCGeoDef =pGeoField.GeometryDef;
//给该域定义空间索引网格数和网格尺寸
pOutFCGeoDefEdit =(IGeometryDefEdit)pOutFCGeoDef;
if (pOutFCGeoDefEdit!=null)
{
pOutFCGeoDefEdit.GridCount_2 =1;
pOutFCGeoDefEdit.set_GridSize(0,DefaultIndexGrid((IFeatureClass)pInTable));
pOutFCGeoDefEdit.SpatialReference_2 = pGeoField.GeometryDef.SpatialReference;}
}
}
IFeatureDataConverter pConverter=new FeatureDataConverterClass ();
IEnumInvalidObject pEnumErrors;
if (bOutFC)
//Convert to feature class =======''pOutDatasetName
pEnumErrors = pConverter.ConvertFeatureClass((IFeatureClassName)pInDatasetName, null,
(IFeatureDatasetName)pOutFDName, pFCName, pOutFCGeoDef,
pOutFields, "", 1000, 0);
else
// Convert to table
pEnumErrors = pConverter.ConvertTable(pInDatasetName, null,
pOutDatasetName, pOutFields,
"", 1000, 0);
//If some of the records do not load, report to report info.
IInvalidObjectInfo pErrInfo;
pErrInfo = pEnumErrors.Next ();
if (pErrInfo == null)
return "0";//成功
else
{
return pErrInfo .ToString ();//上传完成但有错误
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message.ToString(), "数据上传失败!");
return "1";
}
}
#endregion
#region 转换和上传shp数据时的部分子函数
public string GetProgID(convDataType eDataType)
{
string strResult=null;
switch (eDataType)
{
case convDataType.convDataTypeGDB:
strResult ="esriDataSourcesGDB.SDEWorkspaceFactory";
break ;
case convDataType.convDataTypeShapefile:
strResult ="esriDataSourcesFile.ShapefileWorkspaceFactory";
break;
case convDataType.convDataTypePersonalGDB:
strResult ="esriDataSourcesGDB.AccessWorkspaceFactory";
break;
case convDataType.convDataTypeOLEDB :
strResult ="esriDataSourcesOleDB.OLEDBWorkspaceFactory";
break;
case convDataType .convDataTypeCoverage :
strResult = "esriDataSourcesFile.ArcInfoWorkspaceFactory";
break;
case convDataType.convDataTypeDbase :
strResult = "esriDataSourcesFile.ShapefileWorkspaceFactory";
break;
case convDataType.convDataTypeInfo :
strResult = "esriDataSourcesFile.ArcInfoWorkspaceFactory";
break;
}
return strResult ;
}
public string GetFieldError(esriFieldNameErrorType eError)
{
string strResult="";
switch (eError)
{
case esriFieldNameErrorType.esriSQLReservedWord:
strResult = "是SQL语言保留字";
break;
case esriFieldNameErrorType.esriDuplicatedFieldName:
strResult = "有重复的列名";
break;
case esriFieldNameErrorType.esriInvalidCharacter:
strResult = "包含无效字符";
break;
case esriFieldNameErrorType.esriInvalidFieldNameLength:
strResult = "字符串太长";
break;
case esriFieldNameErrorType.esriNoFieldError:
strResult = "缺少列";
break;
default:
strResult = "其他意外错误";
break;
}
return strResult;
}
private double DefaultIndexGrid(IFeatureClass InFC)
{
//近似计算第一个网格
long lngNumFeat,lngSampleSize,lngKMax;
IFields pFields;
IField pField;
string strFIDName,strWhereClause;
IFeature pFeat;
IFeatureCursor pFeatCusor;
IEnvelope pFeatEnv;
IQueryFilter pQueryFilter;
System.Collections .ArrayList pNewCol=new System.Collections.ArrayList ();
double dblMaxDelta,dblMinDelta,dblSquareness;
dblMaxDelta =0;
dblMinDelta =1000000000000.0; //???
dblSquareness =1;
long i,j,k;
const int SampleSize =1;
const int Factor =1;
//创建recordset
System.Collections.ArrayList c0=new System.Collections.ArrayList ();
c0.Add("minext");
c0.Add(5);
c0.Add(-1);
c0.Add(false);
System.Collections.ArrayList ColInfo = c0;
lngNumFeat =InFC .FeatureCount(null)-1;
if(lngNumFeat<=0)
{
return 1000;
}
//如果图元类型是点集,运用密度函数
if(InFC .ShapeType ==esriGeometryType .esriGeometryMultipoint ||InFC.ShapeType ==esriGeometryType.esriGeometryPoint )
return DefaultIndexGridPoint(InFC);//
//得到抽样尺寸
lngSampleSize =lngNumFeat*SampleSize;
//不允许太大的抽样尺寸
if(lngSampleSize >1000)
lngSampleSize =1000;
//获得图元类对象id的域名
pFields =InFC .Fields;
pField =pFields .get_Field (0);
strFIDName =pField .Name;
//添加后续图元
for(i=0;i<=lngNumFeat;)
{
i=i+(long)(lngNumFeat /lngSampleSize );
pNewCol .Add (i);
}
for(j=0;j<=pNewCol .Count -1;j=j+250)
{ // Will we top out the features before the next 250 chunk?
lngKMax =Math.Min (pNewCol .Count -j,250);
strWhereClause=strFIDName +" IN(";
for (k=1;k<=lngKMax;k++)
{
strWhereClause =strWhereClause +pNewCol.ToArray ().GetValue (i+j).ToString ()+",";
}
// Remove last comma and add close parenthesis
strWhereClause =strWhereClause .Substring (1,strWhereClause.Length -1)+")";
pQueryFilter =new QueryFilterClass ();
pQueryFilter .WhereClause =strWhereClause ;
pFeatCusor =InFC .Search (pQueryFilter ,true);
pFeat=pFeatCusor .NextFeature() ;
while (pFeat !=null)
{
// Get the extent of the current feature
pFeatEnv =pFeat.Extent ;
//Find the min, max side of all extents. The "Squareness", a measure
//of how close the extent is to a square, is accumulated for later
//average calculation.
dblMaxDelta = Math.Max(dblMaxDelta, Math.Max(pFeatEnv.Width, pFeatEnv.Height));
dblMinDelta = Math.Min(dblMinDelta, Math.Min(pFeatEnv.Width, pFeatEnv.Height));
if(dblMinDelta !=0)
dblSquareness = dblSquareness + ((Math.Min(pFeatEnv.Width, pFeatEnv.Height) / (Math.Max(pFeatEnv.Width, pFeatEnv.Height))));
else
dblSquareness = dblSquareness + 0.0001;
pFeat=pFeatCusor .NextFeature ();
}
}
//If the average envelope approximates a square set the grid size half
//way between the min and max sides. If the envelope is more rectangular,
//then set the grid size to half of the max.
if ((dblSquareness / lngSampleSize) > 0.5)
return (dblMinDelta + ((dblMaxDelta - dblMinDelta) / 2)) * Factor;
else
return (dblMaxDelta / 2) * Factor;
}
private double DefaultIndexGridPoint(IFeatureClass InFC)
{
//基于输入的图元类计算索引网格,得到数据集
IGeoDataset pGeoDaTaSet=(IGeoDataset)InFC ;
IEnvelope pEnvelope= pGeoDaTaSet .Extent ;
//近似计算第一个网格
long lngNumFeat;
double dblArea;
lngNumFeat =InFC.FeatureCount (null);
if(lngNumFeat ==0||pEnvelope .IsEmpty )
return 1000;
else
{
dblArea =pEnvelope .Height *pEnvelope .Width ;
//approximate grid size is the square root of area over the number of features
return Math.Sqrt(dblArea /lngNumFeat );
}
}
}
#endregion
2.按纽触发的代码
private void upload_button2_Click(object sender, EventArgs e)
{
IPropertySet pInPropertySet=new PropertySetClass();
IPropertySet pOutPropertySet=new PropertySetClass();
string sInName;
string sOutName;
string sOutFDName;//目标图元数据集的名称
engDatamanager eDm;
sOutFDName = "";
eDm=new engDatamanager ();
sInName = "";
sOutName = "";
if (fileSourloc_textBox1 .Text ==""||
fileSourname_textBox2.Text ==""||
//fileDestloc_textBox3 .Text ==""||
fileDestname_textBox4 .Text =="")
{
MessageBox .Show ("输入信息不全,您检查数据源和目标源是否填写完整!");
return ;
}
switch (m_InDataType)
{
case engDatamanager.convDataType.convDataTypeGDB: //信息中心数据库;
pInPropertySet.SetProperty("SERVER", "192.168.20.81");
pInPropertySet.SetProperty("INSTANCE", "5151");
pInPropertySet.SetProperty("DATABASE", "");
pInPropertySet.SetProperty("USER", "rsin");
pInPropertySet.SetProperty("PASSWORD", "rsinge");
pInPropertySet.SetProperty("VERSION", "sde.DEFAULT");
sInName = fileSourname_textBox2.Text;
break;
case engDatamanager.convDataType.convDataTypeShapefile: //Shape文件
pInPropertySet.SetProperty("DATABASE", fileSourloc_textBox1 .Text);
sInName = fileSourname_textBox2 .Text;
break;
case engDatamanager.convDataType.convDataTypePersonalGDB://本地个人数据库
pInPropertySet.SetProperty("DATABASE", fileSourloc_textBox1 .Text);
sInName = fileSourname_textBox2 .Text;
break;
}
switch (m_OutDataType )
{
case engDatamanager.convDataType.convDataTypeGDB: //信息中心数据库;
pInPropertySet.SetProperty("SERVER", "192.168.20.81");
pInPropertySet.SetProperty("INSTANCE", "5151");
pInPropertySet.SetProperty("DATABASE", "");
pInPropertySet.SetProperty("USER", "rsin");
pInPropertySet.SetProperty("PASSWORD", "rsinge");
pInPropertySet.SetProperty("VERSION", "sde.DEFAULT");
sOutName = fileDestname_textBox4 .Text;
break;
case engDatamanager.convDataType.convDataTypeShapefile: //Shape文件
pInPropertySet.SetProperty("DATABASE", fileDestloc_textBox3 .Text);
sOutName = fileDestname_textBox4.Text;
sOutFDName = "";
break;
case engDatamanager.convDataType.convDataTypePersonalGDB://本地个人数据库
pInPropertySet.SetProperty("DATABASE", fileDestloc_textBox3.Text);
sOutName = fileDestname_textBox4.Text;
sOutFDName = "";
break;
}
DialogResult myDialogResult = MessageBox.Show("您确定要上传该文件吗?", "提示信息", MessageBoxButtons.OKCancel);
if(myDialogResult ==DialogResult .OK )
{
string strResult;
label5 .Visible =true;
label5.Text = "数据上传进度: 正在上传......";
strResult = eDm.ConvertData(pInPropertySet,
sInName,
m_InDataType,
pOutPropertySet,
sOutName,
sOutFDName,
m_OutDataType,
true);
if (strResult == "0")
{
MessageBox.Show("数据上传成功!");
label5.Text = "数据上传进度: 完成";
}
else if (strResult == "1")
{
MessageBox.Show("数据上传失败,请检查数据后重新上传!");
label5.Text = "数据上传进度: 失败";
}
else
{
MessageBox.Show("数据上传完成,但有错误,请检查数据后重新上传!");
label5.Text = "数据上传进度: 完成";
UploadReport ulr;
ulr = new UploadReport();
ulr.ShowDialog();
ulr.Text = "数据上传错误报告";
ulr.Visible = true;
ulr.lstReport.Items.Add(strResult);
}
}
label5.Text = "";
label5.Visible = false;
}
3楼
|