Shape文件上传至sde中

写这个程序的目的是在不重启MapService的前提下更新数据,并让所有使用这个MapService

的用户能够看到数据更新,但是这个程序有不完善的地方,没有实现注记的上传,这个哪个高手实现了,请告诉我!

数据准备:在Sde中建立类型为”Point Features”的featureclass(这个我是在ArcCatalog中实现的)当然也可以建立其他类型的,如polyline、polygon、annotation的featureclass,本文为方便讲解,只进行point类型的shape文件上传,如果对坐标系统有要求的话,可以选择坐标系,其他默认下一步,到最后一步时,如下图所示

可以点击Imort按钮导入字段参照的模板,这个可以选择对应的shape文件导入,ok,这里就创建完成了,命名为myTestPointFeatureclass

这里完成了第一步,其次创建一个空的MXD文档,将建好的myTestPointFeatureclass作为mxd的一个图层,保存。

最后一个,发布Mapservice,需要注意的是要把timetous中时间调长一些,不要使用默认,因为在使用IServerContant时可能长时间使用不释放,会出现timeout的错误,这只是我自己的理解。

前期的准备工作做完了,简单介绍下参数

假设SDE数据库的连接参数为:

Server:192.168.1.43

Service:5151

UserName:gis_map_sh

Password:gisgis

Verstion:sde.DEFAULT

其他参数:hostName=”localhost”

mapServiceName=”myTestMapService”

下面开始上代码:

获取上下文,在Arcserver开发中IServerContext是非常重要的,很像一个很重要的中转站,缺少它就跑不起来了。

IServerContext servercontext = GetServerContext(configObj.hostname, configObj.mapserviceName);

//创建server的上下文

private IServerContext GetServerContext(string _hostName,string _mapServiceName)

{

try

{

ESRI.ArcGIS.Server.IServerObjectManager pServerObjectManager;

//使用ADF 连接类库

ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsServerConnection =

new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection();

agsServerConnection.Host = _hostName;

agsServerConnection.Connect();

pServerObjectManager = agsServerConnection.ServerObjectManager;

//创建特定Mapservice的mapserver上下文

ESRI.ArcGIS.Server.IServerContext serverContext =

pServerObjectManager.CreateServerContext(_mapServiceName, "MapServer");

return serverContext;

}

catch

{

return null;

}

}

接下来打开shape文件所在的Directory

IWorkspaceFactory wf =servercontext.CreateObject("esriDataSourcesFile.ShapefileWorkspaceFactory")  as IWorkspaceFactory;

IFeatureWorkspace fws=wf.OpenFromFile(ShapeFileDirectory,0) as IFeatureWorkspace;

打开shape文件,其中feaname为shape文件名

IFeatureClass pFeatureaClass = fws.OpenFeatureClass(featname);

IQueryFilter queryFilter = new ESRI.ArcGIS.Geodatabase.QueryFilter();

AddFeatureClassToSde(pFeatureaClass, myTestPointFeatureclass, hostname, mapserviceName, this.sdeserver, this.sdeinstance, this.sdeusername, this.sdepassword, this.sdeversion);

下面为AddFeatureClassToSde

public bool AddFeatureClassToSde(IFeatureClass insertFeatureClass, string sdefeaName, string hostname, string mapservicename, string sdeServer, string sdeInstance, string sdeUser, string sdePassWord, string sdeVersion)

{

m_AoInitializa.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);

IServerContext soc = GetServerContext(hostname, mapservicename);

IPropertySet propSet = new PropertySetClass();

propSet.SetProperty("SERVER", sdeserver);

propSet.SetProperty("INSTANCE", sdeinstance);

propSet.SetProperty("USER", sdeUser);

propSet.SetProperty("PASSWORD", sdepassword);

propSet.SetProperty("VERSION", sdeversion);

try

{

IWorkspaceFactory pwf = (IWorkspaceFactory)soc.CreateObject("esriDataSourcesGDB.SDEWorkspaceFactory");

IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)(pwf.Open(propSet, 0));

IFeatureClass feaClass = pFeatureWorkspace.OpenFeatureClass(sdefeaName);

IFeatureCursor feaCursor = feaClass.Insert(true);

IQueryFilter queryFilter = new QueryFilterClass();

int count = insertFeatureClass.FeatureCount(queryFilter);

InsertFeatureToSde(count, 0, insertFeatureClass, feaClass, feaCursor);

pFeatureWorkspace = null;

return true;

}

catch

{

return false;

}

finally

{

soc.ReleaseContext();

}

}

其中加入了InsertFeatureToSde方法,是因为在上传过程中出现了“The number of points is less than required for feature”的错误,查了很久也没有很好的解决方法,有人说是ESRI的bug,呵呵,但是我们不能让程序因为一条记录出错就停下来,如果需要能够查看出错记录,可以插入日志功能~~

/// <summary>

/// 将Feature插入到SDE中 递归插入,某条数据出错后直接跳入下一条记录

/// </summary>

private void InsertFeatureToSde(int _featurecount, int _startindex, IFeatureClass _insertFeatureClass, IFeatureClass _sdeFeatureClass, IFeatureCursor _featureCursor)

{

int m = _startindex;

try

{

for (; m < _featurecount; m++)

{

IFeature feature = _insertFeatureClass.GetFeature(m);

IFeatureBuffer feaBuffer = _sdeFeatureClass.CreateFeatureBuffer();

IField fld = new FieldClass();

IFields flds = feature.Fields;

for (int i = 0; i < flds.FieldCount; i++)

{

fld = flds.get_Field(i);

int index = feaBuffer.Fields.FindField(fld.Name);

if (index != -1)

{

feaBuffer.set_Value(index, feature.get_Value(i));

}

}

_featureCursor.InsertFeature(feaBuffer);

}

}

catch

{

m = m + 1;

if (m < _featurecount)

{

InsertFeatureToSde(_featurecount, m, _insertFeatureClass, _sdeFeatureClass, _featureCursor);

}

}

}

这里只能是实现shape文件,我一直在找上传annotation featureclass 的方法,但一直无果,希望达人指点

补充说明一下,在ESRI的resources(http://resources.esri.com/help/9.3/arcgisserver/adf/dotnet/samples_start.htm)有关于“ArcGIS Add Dynamic Data "的DEMO,但我试过了,好像只能在本机上显示更新,不能在其他使用Mapservice的用户机子上显示更新,最主要的是在mapservice对应的mxd中没有添加新数据

转载于:https://www.cnblogs.com/MyLucifer/archive/2010/10/29/1864588.html

Shape数据上传至SDE数据库中,动态更新Mapservice的解决方案之一相关推荐

  1. 用纯ASP代码实现图片上传并存入数据库中

      用纯ASP代码实现图片上传并存入数据库中    热     ★ 用纯ASP代码实现图片上传并存入数据库中 用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中关于如何上传文件到服务器恐 ...

  2. Excel数据上传并且导入数据库

    Excel数据上传并导入数据库 Excel表中的数据示例样板 相关依赖(本博客编写环境springboot) <!--poi实现excel导入导出--><dependency> ...

  3. [工具]EMAGNET:从Pastebin上传的泄漏数据库中捕获电子邮件地址和密码

    title: "[工具]EMAGNET:从Pastebin上传的泄漏数据库中捕获电子邮件地址和密码" date: 2019-09-20T10:54:24+08:00 lastmod ...

  4. asp如何将图片文件上传到mysql数据库中_怎样才能利用ASP把图片上传到数据库

    欢迎来到小编的文章进行学习阅读,想必大家又有很多问题吧,在这里会有你想要收获的答案,请大家慢慢学习吧! ASP(Active Server Pages)是Microsoft很早就推出的一种WEB应用程 ...

  5. SSM框架实现图片上传并查询数据库中的图片(多图片上传请看下篇博客)

    第一步:首先要在我们的springMVC.xml文件中添加上传文件解析器 <!-- 定义文件上传解析器 --> <bean id="multipartResolver&qu ...

  6. esp8266数据上传到mysql数据库_03-STM32+ESP8266+AIR202/302终端管理篇-把设备温湿度数据存储到MySQL数据库(Windows)...

    前言 这一节把设备通过MQTT上报的数据写入MySQL数据库. 注:关于MySQL数据库的安装和基本使用请用户参考基础开源教程学习! 说明 此节代码使用的 IntelliJ IDEA 软件编写. 整个 ...

  7. asp如何将图片文件上传到mysql数据库中_ASP图片上传[图片直接存储在数据库里面]...

    一.设计数据库testimg.mdb 为方便调试,设计表imgurl,其中两个字段:id(自动编号.关键字).img(OLE 对象) 二.连接数据库文件conn.asp db_path="t ...

  8. struts2解决动态多文件上传的问题(上传文件与数据库字段一一对应)(转)

    struts2多文件上传我想只要会用struts2的朋友都不会陌生,但是怎么在action中根据用户上传的文 件把文件路径写到数据库中对应的字段上呢?ps:我的意思是这样,页面上有固定的5个上传文件的 ...

  9. 树莓派数据上传数据库_树莓派内部数据向domoticz的上传

    树莓派的数据上传->Domoticz 树莓派的温度检测到的数据可以通过API发送到domoticz 示例代码:#!/usr/bin/env python # -*- coding:utf-8 - ...

  10. 监测现场实时数据上传到中移物联网OneNet云平台

    OneNet,中移物联网云平台,是由中国移动打造的PaaS物联网开放平台.平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件.智能家居产品提供完善的物联网解决方案(摘自36 ...

最新文章

  1. 计算机改变了我们的生活英语作文带翻译,一件事改变了我的生活的英语作文,带翻译,求帮忙,最好是符合初中三年级的英语作文...
  2. 【深度学习入门到精通系列】Deep Q Network
  3. CentOS的改变系统启动级别
  4. [POJ2420 A Star not a Tree?]
  5. linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载
  6. python select
  7. sql server 并发_并发问题– SQL Server中的理论和实验
  8. ENVI实验教程(2)遥感图像预处理—辐射校正
  9. 2018服务器cpu性能天梯图,哪里看CPU性能排行榜?2018年CPU天梯图最新版(高清)...
  10. Ubuntu修改Mac地址
  11. 中国(2009-2017)全国各省结婚率和离婚率数据可视化
  12. Node.js中exports和moudle.exports
  13. 汉诺塔(Hanoi Tower)
  14. 统计元音字母(JAVA)
  15. du -sh 和ls -lh的区别
  16. 2017跨境电商把脉:未来会员经济将成新引擎?
  17. 为什么超算/先进计算会成为各国竞争的战略高地?
  18. 你是真的“C”——详解C语言实现文件版通讯录
  19. Go项目的目录结构基本布局
  20. InDesign 教程如何自定义工作区?

热门文章

  1. 光干涉波谷,有可能低于绝对零度
  2. 盲人画家:人真的有第三只眼
  3. php声明变量开头,php声明一个变量需要注意些什么
  4. java apns ssl错误_无法使用Javapns/Javaapns SSL握手失败发送推送通知
  5. pycharm添加python注释头_pycharm使用教程——py文件自动添加文件头注释
  6. 算法:从上往下打印二叉树
  7. Python学习笔记【第十二篇】:Python异常处理
  8. C#中的多线程 - 基础知识 z
  9. Sipdroid项目的编译运行
  10. Oracle-第一篇一些调优技巧