Shape数据上传至SDE数据库中,动态更新Mapservice的解决方案之一
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的解决方案之一相关推荐
- 用纯ASP代码实现图片上传并存入数据库中
用纯ASP代码实现图片上传并存入数据库中 热 ★ 用纯ASP代码实现图片上传并存入数据库中 用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中关于如何上传文件到服务器恐 ...
- Excel数据上传并且导入数据库
Excel数据上传并导入数据库 Excel表中的数据示例样板 相关依赖(本博客编写环境springboot) <!--poi实现excel导入导出--><dependency> ...
- [工具]EMAGNET:从Pastebin上传的泄漏数据库中捕获电子邮件地址和密码
title: "[工具]EMAGNET:从Pastebin上传的泄漏数据库中捕获电子邮件地址和密码" date: 2019-09-20T10:54:24+08:00 lastmod ...
- asp如何将图片文件上传到mysql数据库中_怎样才能利用ASP把图片上传到数据库
欢迎来到小编的文章进行学习阅读,想必大家又有很多问题吧,在这里会有你想要收获的答案,请大家慢慢学习吧! ASP(Active Server Pages)是Microsoft很早就推出的一种WEB应用程 ...
- SSM框架实现图片上传并查询数据库中的图片(多图片上传请看下篇博客)
第一步:首先要在我们的springMVC.xml文件中添加上传文件解析器 <!-- 定义文件上传解析器 --> <bean id="multipartResolver&qu ...
- esp8266数据上传到mysql数据库_03-STM32+ESP8266+AIR202/302终端管理篇-把设备温湿度数据存储到MySQL数据库(Windows)...
前言 这一节把设备通过MQTT上报的数据写入MySQL数据库. 注:关于MySQL数据库的安装和基本使用请用户参考基础开源教程学习! 说明 此节代码使用的 IntelliJ IDEA 软件编写. 整个 ...
- asp如何将图片文件上传到mysql数据库中_ASP图片上传[图片直接存储在数据库里面]...
一.设计数据库testimg.mdb 为方便调试,设计表imgurl,其中两个字段:id(自动编号.关键字).img(OLE 对象) 二.连接数据库文件conn.asp db_path="t ...
- struts2解决动态多文件上传的问题(上传文件与数据库字段一一对应)(转)
struts2多文件上传我想只要会用struts2的朋友都不会陌生,但是怎么在action中根据用户上传的文 件把文件路径写到数据库中对应的字段上呢?ps:我的意思是这样,页面上有固定的5个上传文件的 ...
- 树莓派数据上传数据库_树莓派内部数据向domoticz的上传
树莓派的数据上传->Domoticz 树莓派的温度检测到的数据可以通过API发送到domoticz 示例代码:#!/usr/bin/env python # -*- coding:utf-8 - ...
- 监测现场实时数据上传到中移物联网OneNet云平台
OneNet,中移物联网云平台,是由中国移动打造的PaaS物联网开放平台.平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件.智能家居产品提供完善的物联网解决方案(摘自36 ...
最新文章
- 计算机改变了我们的生活英语作文带翻译,一件事改变了我的生活的英语作文,带翻译,求帮忙,最好是符合初中三年级的英语作文...
- 【深度学习入门到精通系列】Deep Q Network
- CentOS的改变系统启动级别
- [POJ2420 A Star not a Tree?]
- linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载
- python select
- sql server 并发_并发问题– SQL Server中的理论和实验
- ENVI实验教程(2)遥感图像预处理—辐射校正
- 2018服务器cpu性能天梯图,哪里看CPU性能排行榜?2018年CPU天梯图最新版(高清)...
- Ubuntu修改Mac地址
- 中国(2009-2017)全国各省结婚率和离婚率数据可视化
- Node.js中exports和moudle.exports
- 汉诺塔(Hanoi Tower)
- 统计元音字母(JAVA)
- du -sh 和ls -lh的区别
- 2017跨境电商把脉:未来会员经济将成新引擎?
- 为什么超算/先进计算会成为各国竞争的战略高地?
- 你是真的“C”——详解C语言实现文件版通讯录
- Go项目的目录结构基本布局
- InDesign 教程如何自定义工作区?