创建字段IFields

从ACCESS读取数据到ArcGIS个人数据库并创建Feature Class(point)

以下VS2005控制台应用程序代码不能直接运行,需要添加License,方法见下一篇BLOG

--------------------

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.OleDb;

using ESRI.ArcGIS.Geodatabase;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.DataSourcesGDB;

using ESRI.ArcGIS.Geometry;

namespace ReadingAccessData

{

class Program

{

static void Main(string[] args)

{

List myList = new List();

//数据库连接

OleDbConnection thisConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = D:\\wsl\\TestDB.mdb ");

thisConnection.Open();

OleDbCommand thisCommond = thisConnection.CreateCommand();

thisCommond.CommandText = "select ID,X,Y,M from GeoXY";

OleDbDataReader thisReader = thisCommond.ExecuteReader();

while (thisReader.Read())

{

//Console.WriteLine("\t{0}\t{1}\t{2}\t{3}",

// thisReader["ID"], thisReader["X"],

//thisReader["Y"], thisReader["M"]);

myList.Add(Convert.ToDouble(thisReader["ID"]));

myList.Add(Convert.ToDouble(thisReader["X"]));

myList.Add(Convert.ToDouble(thisReader["Y"]));

myList.Add(Convert.ToDouble(thisReader["M"]));

}

thisReader.Close();

thisConnection.Close();

Console.WriteLine("read table GeoXY from TestDB.mdb successfully");

//把读取的数据存放与双精度二维数组 propertyValue

int mCount = (int)myList.Count / 4;

double[,] propertyValue = new double[mCount, 4];

for (int i = 0; i < mCount;i++ )

{

for (int j = 0; j < 4; j++)

{

propertyValue[i, j] = (double)myList[i * 4 + j];

}

}

//

string[] strFields;

ESRI.ArcGIS.Geodatabase.esriFieldType[] typeFields;

strFields = new string[] { "New ID", "X", "Y", "New M" };

typeFields = new esriFieldType[4];

typeFields[0] = esriFieldType.esriFieldTypeInteger;

typeFields[1] = esriFieldType.esriFieldTypeDouble;

typeFields[2] = esriFieldType.esriFieldTypeDouble;

typeFields[3] = esriFieldType.esriFieldTypeInteger;

try

{

////个人GDB路径

string database = "D:\\wsl\\NewDB.mdb";

//new Feature Classes文件名

string shpName = "GeoXY";

//打开数据库,创建工作空间

IPropertySet propertySet = new PropertySetClass();

propertySet.SetProperty("DATABASE", database);

IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass();

IFeatureWorkspace pWorkspace =

workspaceFactory.Open(propertySet, 0) as IFeatureWorkspace;

IFields pFields = new FieldsClass();

IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;

IField pField = new FieldClass();

IFieldEdit pFieldEdit = pField as IFieldEdit;

pFieldEdit.Name_2 = "OBJECTID";

pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;

pFieldsEdit.AddField(pField);

pField = new FieldClass();

pFieldEdit = pField as IFieldEdit;

pFieldEdit.Name_2 = "Shape";

pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

IGeometryDef pGeometryDef = new GeometryDefClass();

IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;

pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;

//SpatialReference;

ISpatialReferenceFactory pSpaRefFac = new SpatialReferenceEnvironmentClass();

IGeographicCoordinateSystem pGeoCoor =

pSpaRefFac.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

//IGeographicCoordinateSystem pGeoCoor = pSpaRefFac.CreateGeographicCoordinateSystem(4326);

ISpatialReference pSpatialReference = pGeoCoor ;

pSpatialReference.SetDomain(-180, 180, -90, 90);

pGeometryDefEdit.SpatialReference_2 = pSpatialReference;

pFieldEdit.GeometryDef_2 = pGeometryDef;

pFieldsEdit.AddField(pField);

//添加其他的属性字段

if (strFields != null)

{

for (int i = 0; i < strFields.Length; i++)

{

pField = new FieldClass();

pFieldEdit = pField as IFieldEdit;

pFieldEdit.Name_2 = strFields[i];

pFieldEdit.Type_2 = typeFields[i];

pFieldsEdit.AddField(pField);

}

}

IFeatureClass pFeatureClass =

(pWorkspace as IFeatureWorkspace).CreateFeatureClass(shpName,

pFields, null, null,

esriFeatureType.esriFTSimple,

"Shape", "");

IFeatureCursor ipFC = pFeatureClass.Insert(true);

IFeatureBuffer ipFeatureBuffer = pFeatureClass.CreateFeatureBuffer();

//将数组中数据逐行加入到新生成的点层中。

for (int i = 0; i < mCount; i++)

{

IFeature ipFeature = ipFeatureBuffer as IFeature;

IPoint ipPoint = new PointClass();

ipPoint.PutCoords(Convert.ToDouble(propertyValue[i, 1]),

Convert.ToDouble(propertyValue[i, 2]));//指定每个点的经度,纬度

ipFeatureBuffer.Shape = ipPoint;

for (int j = 0; j < 4; j++)

{

ipFeature.set_Value(j + 2, propertyValue[i, j]);

}

ipFC.InsertFeature(ipFeatureBuffer);

}

ipFC.Flush();

}

catch (Exception ex)

{

string s = ex.Message + "\r\n" + ex.StackTrace;

}

Console.Write("Program finished,press enter ,"+

"then, run ArcMap and add data from your personal database ");

Console.ReadLine();

}

}

}

时间: 2024-11-08 09:57:36

创建字段IFields的相关文章

odoo 动态创建字段的方法

动态创建字段并非一个常见的的需求,但某些情况下,我们确实又需要动态地创建字段. Odoo 中创建字段的方法有两种,一种是通过python文件class中进行定义,另一种是在界面上手工创建,odoo通过state字段对这两种类型的字段进行区分. 通过界面创建的字段必须以x_开头. 笔者曾经试图通过python文件来动态创建base类型的字段,结果没有找到合适的方法.但是苦思冥想好久之后发现可以通过动态创建manual字段来达到这个目的. 应用: 国内人力资源应用中经常需要统计每个人的工资总表,而工

如何判断字段是否存在,如何删除及创建字段

如何判断字段是否存在 if col_length('表名','字段1') is null  ALTER TABLE 表名 ADD 字段1 Nvarchar(50)  if col_length('表名','字段2') is null  ALTER TABLE 表名 ADD 字段2 Nvarchar(50) "); 删除字段 if col_length('表名','字段1,') is not null  ALTER TABLE 表名 drop  column 字段1, column 字段2,col

MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据

[0]README 0.1)本文部分文字描述转自"MySQL 必知必会",旨在review"MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据" 的基础知识: [1]创建计算字段 1)problem+solution 1.1)problem:存储在表中的数据都不是应用程序所需要的.我们需要直接从数据库中检索出转换,计算或格式化过的数据: 1.2)solution:这就是计算字段发挥作用所在了, 计算字段是运行时在 select语句内创建的: 2)字段定

在lua中创建字段安全的对象

lua萌新,刚刚学习和使用不到一个月.有不对的地方,还望各路大神不吝赐教. lua中可以用table来模拟对象,但table是可以任意增加键值的.在对象模拟中,暂且也叫它为字段(field)吧.如果在面向对象中,你定义了一个对象,可以在对象以外的地方随意改动这个对象的字段,访问不存在的字段,你想象一下这有多恐怖?比如你定义了一个Vector3{float x = 0; float y = 0; float z = 0;}  我在外面某处加一个float t = 1; 当你在创建并引用这对象的时候

oracle 创建字段自增长——两种实现方式汇总

mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能. 因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式. CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; 解析: 1)INCREMENT BY用

SQL创建字段信息(表值函数)

1 ALTER FUNCTION [dbo].[fnt_SplitString] 2 ( 3 @p1 varchar(Max), 4 @p3 varchar(255) 5 ) 6 RETURNS 7 @Table_Var TABLE 8 ( 9 c1 varchar(max) 10 ) 11 AS 12 BEGIN 13 declare @p2 varchar(max) 14 set @p2=rtrim(ltrim(@p1)) 15 declare @pos1 int 16 declare @p

C#可以自动在后台为属性创建字段

public int userid { get; set; } 和下面的写法是一样的 private int _userid; public int userid { get { return _userid; } set { _userid = value; } }

mysql创建字段非空NOT NULL的好处

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt338 很多表都包含可为 NULL (空值) 的列,即使应用程序井不需要保存 NULL 也是如此 ,这是因为可为 NULL 是列的默认属性.通常情况下最好指定列为 NOT NULL,除非真 的需要存储 NULL 值. 如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化 ,因为可为 NULL 的列使 得索引.索引统计和值比较都更复杂 .可为NULL 的列会使用更多

统计&quot;面&quot;要素中&quot;点&quot;要素的个数.

步骤 1,创建字段 IFields 1 /// <summary> 2 /// 创建:"面"-"点数"的字段. 3 /// </summary> 4 /// <returns></returns> 5 public static ESRI.ArcGIS.Geodatabase.IFields CreateFields() { 6 ESRI.ArcGIS.Geodatabase.IField fieldId = new