ArcGIS Server 开发系列(三)--漫游 Graphics data sources

    作者:Flyingis

    本文严禁擅自转载或用于商业目的,如有需要请事先联系作者:dev.vip#gmail.com 

    和ArcGIS Server Local、ArcGIS Server Internet一样,GraphicsLayer是ArcGIS Server MapResource的一种,提供functionality给web controls使用。本文将在《ArcGIS Server 开发系列(二)--Web ADF 编程》示例基础上,增加查询结果高亮显示的功能,因为高亮显示的结果并不是图层本身所具备的,因此只需将高亮显示的图片存为graphics即可。

    目标:
    查询结果的高亮显示

    准备工作:
    1.以《ArcGIS Server 开发系列(二)--Web ADF 编程》示例配置和代码为基础。
    2.MapResourceManager属性中增加一个名为Selection的MapResource,并将它移动到编号为0的位置,即显示在所有MapResource最上面。


    可以看到GraphicsLayer的datasource是在内存中的,也就是说是为了临时显示或存储使用的,这样速度比较快。Selection一定要放在World上面,否则就被World图层覆盖掉了。

    代码实现:

    在UI界面上,增加一个command,用来清除graphics。


    双击“Select”生成事件响应方法:

protected void cmdSelect_Click(object sender, EventArgs e)
{
    SelectFeatures();
}


    代码的核心就在SelectFeature()里,它分为两个步骤,第一步对图层进行属性查询,第二步对查询结果进行高亮显示。首先是图层的属性查询:

int resource_index = 1;
string targetlayername = "countries";
System.Data.DataTable datatable 
= null;
//直接获取MapResourceName为world的MapFunctionality,它的编号为1
ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(resource_index);
//先得到functionality,再获取resource
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource;
bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
if (supported)
{
    ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;
    qfunc 
= (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);

    
string[] lids;
    
string[] lnames;
    qfunc.GetQueryableLayers(
nullout lids, out lnames);

    ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter 
= new ESRI.ArcGIS.ADF.Web.SpatialFilter();
    spatialfilter.ReturnADFGeometries 
= false;
    spatialfilter.MaxRecords 
= 1000;
    spatialfilter.WhereClause 
= txtQuery.Text;
           
    datatable 
= qfunc.Query(null, lids[0], spatialfilter);
}

    这段代码和《ArcGIS Server 开发系列(二)--Web ADF 编程》示例中的代码相比,没有太多改动的地方,用到了ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality,它继承于ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality 接口。每一个web control可能拥有多个functionality,而funtionality是各种resource展现出来的,因此可以通过web controls--funcionalities--resources这条路线来获得当前的资源,那么如何让查询结果高亮显示呢?

//重新获得Map1控件所有的functionality
IEnumerable gfc = Map1.GetFunctionalities();
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource 
= null;
foreach (IGISFunctionality gfunc in gfc)
{
    
//找到名为"Selection"的MapResource
    if (gfunc.Resource.Name == "Selection")
    
{
        
//down cast到ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource
        gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;
    }

}


if (gResource == null)
    
return;

ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer 
= null;

foreach (System.Data.DataTable dt in gResource.Graphics.Tables)
{
    
if (dt is ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)
    
{
        glayer 
= (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dt;
        
break;
    }

}


if (glayer == null)
{
    glayer 
= new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();

    gResource.Graphics.Tables.Add(glayer);
}


//清除已有数据
glayer.Clear();

DataRowCollection drs 
= datatable.Rows;

int shpind = -1;
for (int i = 0; i < datatable.Columns.Count; i++)
{
    
if (datatable.Columns[i].DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))
    
{
        
//找到Geometry字段的序号
        shpind = i;
        
break;
    }

}


try
{
    
foreach (DataRow dr in drs)
    
{
        ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom 
= (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)dr[shpind];
       
        
//创建一个GraphicElement
        ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge = null;
        ge 
= new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom, System.Drawing.Color.Yellow);
        ge.Symbol.Transparency 
= 50.0;
       
        
//将GraphicElement添加到ElementGraphicsLayer中
        glayer.Add(ge);
    }

}

catch (InvalidCastException ice)
{
    
throw new Exception("No geometry available in datatable");
}


if (Map1.ImageBlendingMode == ImageBlendingMode.WebTier)
{ Map1.Refresh(); }
else if (Map1.ImageBlendingMode == ImageBlendingMode.Browser)
{
    
//只刷新Graphics Resource
    Map1.RefreshResource(gResource.Name);
}

    这次我们没有将搜索到的结果绑定到控件上,只要得到高亮显示的结果,测试一下程序,看看能得到什么样的效果。


    搜索出国家名称以"C"开头的国家,最典型的“中国”、“加拿大”已经找到了,这样我们就实现了高亮显示的功能。同样,我们进行开发后的小结,能想到些什么呢?还是按照CH风格来进行总结:

    第一,GraphicsLayer有两个子类,ElementGraphicLayer和FeatureGraphicLayer,因为程序中只需要暂时显示查询的结果,因此将查询要素存为ElementGraphicLayer就可以,想想在什么情况下使用FeatureGraphicLayer。

    第二,ElementGraphicLayer继承于System.Data.DataTable,gResource.graphics属于 System.Data.DataSet类型,这样使得我们在开发过程中,可以将GraphicElement添加到 ElementGraphicLayer,然后将ElementGraphicLayer添加到gResource.graphics,通过这种途径来向 GraphicsLayer的mapresource中添加数据,这种机制方便了我们能够像操纵datatable和dataset一样来控制 mapresource中的数据,既和.Net无缝整合,也在一定程度上降低了Server开发难度,例如代码中glayer.Clear()调用了datatable的clear()方法,还有后面GraphicElement的创建。

    第三,Map1.ImageBlendingMode决定了地图的刷新是刷新整个页面,还是仅刷新当前mapresource,这样的设计在web开发中尽可能的较少了网络数据传输量。

    Graphics data sources是学习ArcGIS Server data sources的基础,下面一篇,将介绍ArcGIS Server data sources的开发,之前网上已经有朋友要求加快写作进度了,不过日常工作中的琐事实在比较多,写代码、文章经常会被打断,写的太差又对不住大家花的时间,所以只能尽量以最快的速度写好每一篇博客,大家的支持就是我的动力:)这篇到此为止,写完收工,回家过周末~~

Flyingis @ China
email: dev.vip#gmail.com
blog: http://flyingis.cnblogs.com/

posted @ 2007-08-17 17:57 Flyingis 阅读(5779) 评论(79)  编辑 收藏 网摘 所属分类: ArcGIS Server

  回复  引用    
#1楼2007-08-19 19:42 | 空明流转的马甲[未注册用户]
我使用了你的例子写了篇框架分析的文章,在我的Blog中。如果有错误和不足,以及写的不清楚的地方,请帮忙指正,谢谢!
如果我使用你的例程侵犯了你的利益的话,请及时M我,我会在当天撤下来,并表示歉意,呵呵。

  回复  引用    
#2楼2007-08-19 19:50 | GoodBoy[未注册用户]
写的很好,辛苦了,非常感谢!
如果用TaskResults估计效果好些,像Identify一样,不过我还没有试。
还请教一个模糊查询问题:
string sWhereClauses = "XQDW" + "LIKE'" + txtQuery.Text + "%'";

没有结果。我不知道语法错在哪里。

非常感谢!
ppp_2000@sina.con

  回复  引用  查看    
#3楼[楼主]2007-08-20 00:00 | Flyingis      
@空明流转的马甲
例子是和大家共享的,你能在此基础上加入自己的思考就更好了,可以帮助更多的人理解arcgis server。你的文章明天再看:)

  回复  引用  查看    
#4楼[楼主]2007-08-20 00:03 | Flyingis      
@GoodBoy
这样试试:
string sWhereClauses="XQDW like \"" + txtQuery.Text + "%\"";
如果是oracle数据库,需要指定XQDW所属表空间及表名

  回复  引用    
#5楼2007-08-21 11:07 | GoodBoy[未注册用户]
非常感谢!
你所写的
string sWhereClauses="XQDW like \"" + txtQuery.Text + "%\"";
不能运行。我改了下
string sWhereClauses = "XQDW LIKE \'" + txtQuery.Text + "%\'";
运行成功。还是非常感谢。
我最近在研究Web Service ,没有太多例子,ESRI自带的例子也运行不通,望赐教,谢谢。
ppp_2000@sina.con

  回复  引用    
#6楼2007-08-21 18:17 | 空明流转的马甲[未注册用户]
我以前一直是C++和图形学,只是暑期实习的时候要做Server,所以花了3周从 .net 到 web 到 server 通吃了。。。但是根底还不是很扎实,ESRI的文档也太简略了,做起来东西还是有点痛苦。
  回复  引用  查看    
#7楼[楼主]2007-08-22 08:27 | Flyingis      
@空明流转的马甲
做图形学的无弱旅,三周时间已经很快了,有机会要好好向你学习。

  回复  引用    
#8楼2007-08-22 16:17 | wggStartGis[未注册用户]
看了你的代码,感觉确实不错.想引用一下,"gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;" 这句老是出现错误,出错为

"异常详细信息: System.InvalidCastException: 无法将类型为“ESRI.ArcGIS.ADF.Web.DataSources.IMS.MapResource”的对象强制转换为类型“ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource”。"
我是新手,请赐教!

  回复  引用  查看    
#9楼[楼主]2007-08-22 16:55 | Flyingis      
@wggStartGis
你是不是在设置MapResourceManager MapResourceItem0时候,选择了Type为ArcIMS?

  回复  引用    
#10楼2007-08-22 17:54 | jsfvbx[未注册用户]
打开arcgis server manager,新建service时,有一项是指定地图文件,发现如果不设为共享就取不到地图文件,请问一定需要事先将地图所在文件夹设为共享吗?

  回复  引用  查看    
#11楼[楼主]2007-08-22 18:11 | Flyingis      
@jsfvbx
通过网络的方法来发布需要共享,它可以利用到网络中的所有共享资源,如果是catalog发布本地的mxd就不用。

  回复  引用    
#12楼2007-08-23 09:31 | wggStartGis[未注册用户]
@Flyingis
是的,我用的是arcims发布的地图.配置连接时,选择了Type为ArcIMS,请问这样连接我怎样可以修改上述代码?

  回复  引用    
#13楼2007-08-23 12:51 | jsfvbx[未注册用户]
@Flyingis
呵呵,明白了,谢谢!

  回复  引用  查看    
#14楼[楼主]2007-08-23 15:53 | Flyingis      
@wggStartGis
使用arcims相应的mapresource
gResource = (ESRI.ArcGIS.ADF.Web.DataSources.ArcIMS.MapResource)gfunc.Resource;
gResource类型也要相应更改。

  回复  引用    
#15楼2007-08-24 09:18 | wggStartGis[未注册用户]
@Flyingis
你好,将代码改为上述后.系统出现
"命名空间“ESRI.ArcGIS.ADF.Web.DataSources”中不存在类型或命名空间名称“ArcIMS”(是缺少程序集引用吗?)"
错误,在程序引用里,我用了"using ESRI.ArcGIS.ADF.Web.DataSources;",但不存在命名空间名称“ArcIMS",请问怎么引用?

  回复  引用  查看    
#16楼[楼主]2007-08-24 18:12 | Flyingis      
选择“Add ArcGIS Reference”,将ESRI.ArcGIS.ADF.Web.DataSources.IMS添加进来。
  回复  引用    
#17楼2007-08-27 11:24 | wggStartGis[未注册用户]
@Flyingis
将ESRI.ArcGIS.ADF.Web.DataSources.IMS添加进来,还是没有命名空间名称“ArcIMS”,类型转换出现错误.

  回复  引用    
#18楼2007-08-27 15:39 | ren54[未注册用户]
请博主解惑。
我看系统自己带的例子里面的高亮是如下方法实现的。

LayerDescription featureLayer = layerdescs[layer_index];
FIDSet ifid = msdp.QueryFeatureIDs(mapdescription.Name, featureLayer.LayerID, sf);
featureLayer.SelectionFeatures = ifid.FIDArray;
mapctrl.Refresh();

不太了解这种方式与楼主的方式有何利弊。
我自己的理解是博主是相当于添加了一个临时图层。这个例子里面好像是改变了图层的某一属性。是不是所以的图层都支持SelectionFeatures这一属性。

AE不熟悉地说.ARCGIS SERVER初步接触。

  回复  引用  查看    
#19楼[楼主]2007-08-30 08:59 | Flyingis      
@ren54
你说的没错,例子中是通过添加一个graphic层实现高亮的,例子主要是用来解释graphic data sources的用法。你写的也是常用的高亮显示方法,通常用于选取要素查询编辑。
ESRI.ArcGIS.Carto.ILayerDescription.SelectionFeatures可以用来选择所有图层要素。

  回复  引用  查看    
#20楼[楼主]2007-08-30 09:10 | Flyingis      
@wggStartGis
gResource = (ESRI.ArcGIS.ADF.Web.DataSources.IMS.MapResource)gfunc.Resource;
上面我写错了,不是***ArcIMS.MapResource,这样写应该没问题。

  回复  引用    
#21楼2007-10-08 14:36 | wggStartGis[未注册用户]
楼主你好,我这里有实现了地图对象的选择函数,怎么可以实现选择的高亮显示?代码如下:
public void select(ESRI.ArcGIS.ADF.Web.Geometry.Envelope env)
{
//获取选择对象
IEnumerable func_enum = Map1.GetFunctionalities();
foreach (ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfunctionality in func_enum)
{
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = gisfunctionality.Resource;
bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
if (supported)
{
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc;
qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
string[] lids;
string[] lnames;
qfunc.GetQueryableLayers(null, out lids, out lnames);
ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
spatialfilter.ReturnADFGeometries = true;
spatialfilter.MaxRecords = 1000;
spatialfilter.Geometry = env;
System.Data.DataTable datatable1 = qfunc.Query(gisfunctionality.Name, "14", spatialfilter);
}
}
}

  回复  引用  查看    
#22楼[楼主]2007-10-09 09:14 | Flyingis      
只需按照文章的后半部分进行就可以了,有什么具体的问题吗?
  回复  引用    
#23楼2007-10-09 10:11 | wggStartGis[未注册用户]
没看明白.能否讲一下具体的实现步奏?怎样将高亮显示引用到上述函数中去?
  回复  引用  查看    
#24楼[楼主]2007-10-10 09:09 | Flyingis      
@wggStartGis
回答你邮件中的问题,ChangeDropDownListServer是在RaiseCallbackEvent服务器端处理中调用的,processCallbackResult.js接受服务器端处理的结果(实际上这里返回值为空),实现异步刷新。

  回复  引用  查看    
#25楼2007-10-10 11:56 | SueJ      
请教各位大侠:
利用arcgis server adf for .net开发时,要实现这样的功能:为地图的某图层添加几个新的数字型字段,然后往这些字段里填充数据,请看如下代码:
//这之前添加了字段"cod1"
ILayer pLayer = pMapServerObj.get_Layer(mapName, pLayerID);
IFeatureLayer pFeatLayer = pLayer as IFeatureLayer;
IFeatureClass pFeatClass = pFeatLayer.FeatureClass;
IFeatureCursor pFeatCursor = pFeatClass.Search(null, true) as IFeatureCursor;
IFeature pFeature = pFeatCursor.NextFeature();

string pFieldName = "cod1";
int pFieldValue = 2222;
int pFldIndex = pFeatClass.FindField(pFieldName);
while (pFeature != null)
{
pFeature.set_Value(pFldIndex, pFieldValue);
pFeature = pFeatCursor.NextFeature();
}

可是在"pFeature.set_Value(pFldIndex, pFieldValue);"却返回了异常信息:com组件调用返回了异常了result

请各位大侠帮忙,十分感谢! ^_^

  回复  引用    
#26楼2007-10-22 09:40 | wggStartGis[未注册用户]
楼主你好,上面的你说的好象不是我的程序里的内容,请问具体在程序里怎么实现?
  回复  引用    
#27楼2007-10-26 15:55 | wmGISt[未注册用户]
我想问一下楼主有没考虑过异步刷新问题.就这一篇文章来说吧,当点击Select时,能查到结果,但引起整个地图窗口的刷新,这会带来不爽的操作体验.EARI自带的查询控件是不刷新整个地图窗口的。我现在在解决这个问题,有时间和楼主多请教.
  回复  引用  查看    
#28楼[楼主]2007-10-29 11:11 | Flyingis      
@SueJ
断点到int pFldIndex = pFeatClass.FindField(pFieldName);看看字段序号、类型、长度是否正确,插入属性值的方法没有问题。

@wggStartGis
"ChangeDropDownListServer 这个是哪里调用的呢?"
这个就是在ajax服务器端调用的,具体就是RaiseCallbackEvent方法中。

@wmGISt
这是一个测试的例子,关键在于graphics data source使用,刷新可以通过ajax来刷,可以用ICallbackEventHandler,也可以通过其他ajax库实现。

  回复  引用    
#29楼2007-11-09 15:03 | wggStartGis [未注册用户]
楼主你好.我用的是arcgis server 9.2 连接地图,用的是arcims 9.2发布的地图,结果我漫游的时候,当前窗体外的内容不能刷新,成白底显示到当前窗体内,怎么刷新也显示不了空白处的地图,我重新发布了几次还是不行,这是什么原因造成的?
  回复  引用  查看    
#30楼[楼主]2007-11-16 09:19 | Flyingis      
@wggStartGis
“arcgis server 9.2 连接地图,arcims 9.2发布地图”,是在server开发中用arcims发布的服务吧。检查你arcims output目录中是否已经生成了该空白区域的图片?

  回复  引用    
#31楼2007-11-24 11:54 | 凯凯[未注册用户]
楼主我想请问下.我已经实现了,把图放大缩小,高亮,查询某一个标示的层,我现在想把高亮的部分另存为一张图片应该怎么做?或者另存为一个mxd文件.能告诉我吗?我很急.我的QQ是344696163 MSN是 cwk_1106@hotmail.com
邮箱是cwk_1106@163.com
望以后多多指导.

  回复  引用  查看    
#32楼[楼主]2007-12-06 14:11 | Flyingis      
@凯凯
我没有找到直接读出graphic layer的接口,不好直接实现了。

  回复  引用    
#33楼2007-12-06 22:53 | 哈哈哈[未注册用户]
if (datatable.Columns[i].DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))
{
//找到Geometry字段的序号
shpind = i;
break;
}
请教博主我按照例子来做为何总是找不到Geometry字段的序号的序号呢?

  回复  引用  查看    
#34楼[楼主]2007-12-07 08:59 | Flyingis      
@哈哈哈
不会吧,就是你数据的Shape*字段,检查一下发布服务的数据源。

  回复  引用    
#35楼2007-12-10 21:23 | 哈哈哈[未注册用户]
spatialfilter.ReturnADFGeometries = false;
改成spatialfilter.ReturnADFGeometries = true;就好了,还有个问题,我每次操作的时候为何第一遍查询结果总是空,第二遍才可以查询出结果呢?

  回复  引用  查看    
#36楼[楼主]2007-12-11 00:33 | Flyingis      
@哈哈哈
先重新看看你的数据组织,再检查第一次查询的时候mapfunctionality、mapresource、queryfunctionality是否有正确的属性。

  回复  引用    
#37楼2007-12-29 22:15 | wq[未注册用户]
楼主你好,我是用ims发布的地图,下面这个创建 GraphicElement在ims下是没有的 请楼主指教
//创建一个GraphicElement
ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge = null;
ge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom, System.Drawing.Color.Yellow);

  回复  引用    
#38楼2007-12-30 12:54 | wq[未注册用户]
呵呵 弄了半天不知道是我数据问题还是不支持multipoint 郁闷
  回复  引用    
#39楼2008-01-29 10:29 | 哈哈哈[未注册用户]
//只刷新Graphics Resource
Map1.RefreshResource(gResource.Name);
为何我的程序执行这一步以后查询已经有结果却没有看到地图变化呢?页面重新刷新就可以看到查询的结果高亮显示了

  回复  引用    
#40楼2008-07-04 10:07 | 小麋鹿[未注册用户]
flyingis老师您好:
我正在学习arcgis server,能把你的源代码给我发一份吗?
信箱:xhaosheng@163.com
多谢!

  回复  引用    
#41楼2008-08-06 11:35 | Mon[未注册用户]
非常感谢 支持flyingis大哥!
  回复  引用    
#42楼2008-08-07 14:24 | feifei123 [未注册用户]
,"gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;" 这句老是出现错误,出错为

无法将类型为“ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal”的对象强制转换为类型“ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource”。
Type 为:arcgis serverlocal

  回复  引用    
#43楼2008-08-12 10:12 | 啊贵[未注册用户]
您好!
公司最近要用到ArcGis Server,本人初学Gis方面编程,开发过程中碰到几个问题想请教您一下:

开发过程中我是这样操作的:
1)服务器上通ArcGis Manager的WebApp,在Service的"Capabilities"属性中加入"Mobile Data Access"能力
2)在Mobile Client Application中,MapCache.Url设置成上面的"Mobile Data Access"所对应的URl,未设置MapCache.StoragePath

当调用MapCache.Open时出现异常"Invalid Data"提示.
不知该如何解决?
望指教,谢谢!

  回复  引用  查看    
#44楼[楼主]2008-08-13 14:35 | Flyingis      
@啊贵
你好!我还没研究过mobile sdk开发呢:)

  回复  引用    
#45楼2008-09-15 14:57 | gll[未注册用户]
能给份源码吗?我已经调试了n遍了,都是显示datatable=null.
我用的图是usa,不是world,有关系吗?如果可以的话,发到我信箱吧,多谢,急用啊.
qingdqpi2002@163.com
还请问斑竹,是否编写过地图中鼠标右键显示定点属性信息的功能呢,如果有,请介绍一下如何实现可以吗,最好有示例和源码

  回复  引用  查看    
#46楼[楼主]2008-09-16 15:03 | Flyingis      
@gll
ESRI官方网站上有这个例子的

  回复  引用    
#47楼2008-09-22 08:46 | gll[未注册用户]
斑竹,终于代码调试通过,不过新的问题又来了。您举的这个例子是一个图层,如果是多个图层,如何设置查询语句,它们查询的关键字是一样的,只是不同的层。希望能给个例子说明,多谢了。
  回复  引用    
#48楼2008-09-22 15:46 | diligentpig[未注册用户]
@gll
这样就可以了:
string[] lids;
string[] lnames;
queryfunc.GetQueryableLayers(null,out lids,out lnames);
ESRI.ArcGIS.ADF.Web.SpatialFilter spf = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
int j = -1;
for (int i = 0; i < lnames.Length;i++ )
{
if (lnames[i]==targetlayername)
{
j = i;
}
}

System.Data.DataTable dt = new DataTable();
dt = queryfunc.Query(null, lids[j], spf);

其中spf是spatialfilter,targetlayername是你通过其他途径获得的需要进行查询的图层名称。

  回复  引用    
#49楼2008-09-22 18:39 | gll[未注册用户]
@diligentpig
多谢,我也是用循环解决的这个问题。
还有个问题想请教一下。对于地图动态加载,也就是不同的用户进入时展示的mxd文件不同,或者是同一个mxd文件显示不同的图层,我用网上的例子试过,可是没有什么效果(是在高亮显示的例子基础上实验的,是不是selection有影响呢?),我看了运行之后,只是把我动态要加载的图层添加进去,原来的图层也在Map Contents里面,而且Map1里什么也不显示,不知道问题出在什么地方。有做过这方面的吗?可否给个示例学习一下,急切盼望中!

  回复  引用    
#50楼2008-11-20 14:06 | 壬戌之狼[未注册用户]
我想请问一下楼主,我不想把查询出来的区域高亮显示,而是把它放大并在控件中心显示,该怎么做啊
  回复  引用  查看    
#51楼2008-12-27 13:42 | 調皮√又搗蛋      
请教博主:

我用的是中文的数据 那个模糊查询总是不起效果
用的句子如下:
spatialfilter.WhereClause = "NAME LIKE '%" + name + "%'" ;
不论去是用全名还是部分名都查询到空值

但是如果把那两个%去掉用全名查是查的到的。。
不解。。。

  回复  引用  查看    
#52楼[楼主]2008-12-28 13:08 | Flyingis      
跟踪一下看参数传递中有没有乱码
  回复  引用  查看    
#53楼2008-12-28 13:33 | 調皮√又搗蛋      
@Flyingis
whereclause语句是正确的
然后就是查询得到的结果是dt是查询到的datatable
dt.Rows.Count=0

  回复  引用  查看    
#54楼[楼主]2008-12-28 13:51 | Flyingis      
其他查询条件结果正确吗?例如"<"。
datatable结果正确,后面就是显示问题,好像没什么需要更改的,再分析一下得到的datatable吧。

  回复  引用  查看    
#55楼2008-12-29 11:43 | DreamSpark      
支持Flyingis老师多写点as的开发文章,我刚接触as,不过在Flyingis老师的博客里面学到了好多知识。真心的谢谢Flyingis老师。
  回复  引用  查看    
#56楼2008-12-29 16:08 | 調皮√又搗蛋      
请看这两个查询语句:
spatialfilter.WhereClause = "NAME LIKE '" + keyWordsOfAttribute + "%' ;

spatialfilter.WhereClause = "OBJECTID > 1000";

使用第一个就不论怎么查都是0个结果
使用第二个就可以返回多个查询结果
datatable里边一切都正常,属性列都得到了。
请相信,其他设置都是正确的。就是对string类型的模糊查询得不到目标,rows.count总是0.。闷。。不知道还有什么地方要设置

我qq 343137714 博主有空指导一下

  回复  引用  查看    
#57楼[楼主]2008-12-29 17:36 | Flyingis      
@調皮√又搗蛋
文章的例子代码有吗,怎么发给你?
例子就是like查询。

  回复  引用  查看    
#58楼2008-12-29 18:27 | 調皮√又搗蛋      
邮箱huhui1007@126.com
谢博主 赞博主耐心

  回复  引用  查看    
#59楼2008-12-29 19:33 | 調皮√又搗蛋      
@Flyingis

我知道问题是哪了
因为我是在做一个网络分析的程序 然后用的是personal Geodatabase
但是在personal Geodatabase中 SQL语句的通配符是 * 和 ?
难怪用%找不到 %适用于shape文件的sql中

通过arcmap才知道 的 可能也是因为我基础比较薄弱 这么弱智的东西都不知道
谢谢Flyingis


问一个跟这个不相关的 我做了个网络分析的数据集 然后加入了route图层之后 地图的范围就不对了 这个要怎么改正过来啊? 谢谢Flyingis的耐心

  回复  引用  查看    
#60楼[楼主]2008-12-30 09:45 | Flyingis      
@調皮√又搗蛋
后面的问题在ArcMap中加载时有吗,能否描述详细一点?

  回复  引用  查看    
#61楼2008-12-30 12:02 | 調皮√又搗蛋      
你可以做一个试一下
随便做一个网络数据集
系统自带的也可以
然后试下fullextent功能
完了再加上一个路径分析的Route图层 再试一下
新加的Route图层虽然没有数据 但是地图范围很大。似乎是-180--+180

  回复  引用    
#62楼2009-01-09 09:53 | 兰君[未注册用户]
我通过arcmap的tools->add xy data,把ACCESS的地址信息导到layers里,为什么通过这种方式导入的图层数据,用上面的 whereclause方法查不了呢?请指教,谢谢~
  回复  引用  查看    
#63楼[楼主]2009-01-09 17:09 | Flyingis      
非物理图层不能IQueryFunctionality.Query()查询。
  回复  引用    
#64楼2009-02-07 10:49 | harmonygis[未注册用户]
我用的中文数据,在做属性查询时,输入中文关键字,但是在服务器端RaiseCallbackEvent函数中接收到的参数却是乱码,没有查询结果,请问该怎么解决呢?
  回复  引用    
#65楼2009-03-16 16:26 | lfw1230[未注册用户]
辛苦了,支持你!
  回复  引用  查看    
#66楼2009-03-19 17:38 | Ailen      
Flyingis老师你好:最近都在看你的文章,我是刚接触Arcgis server。在界面上添加层一个层之后很难控制,还有那个command控件工具箱里面没有。请问这个怎么解决?谢谢~
  回复  引用    
#67楼2009-03-23 20:20 | 大慧[未注册用户]
高手您好! 问个问题,
我想通过GIS Server 将输入的经纬度坐标定位到自己发布的地图服务上,并标记显示,这具体应该怎么做呢? 或者有些什么函数可以实现的
期待您的回复。。。

  回复  引用    
#68楼2009-03-24 09:10 | 大慧[未注册用户]
还有一个问题, GIS Server里面将屏幕坐标转换为地理坐标是这样的:
//矩形参数
RectangleEventArgs rectargs = (RectangleEventArgs)args;
//矩形
System.Drawing.Rectangle myrect = rectargs.ScreenExtent;
//矩形左下定点坐标转换成地理坐标
ESRI.ArcGIS.ADF.Web.Geometry.Point minpnt =
ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(myrect.Left, myrect.Bottom, mapctrl.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));
//矩形右上定点坐标转换成地理坐标
ESRI.ArcGIS.ADF.Web.Geometry.Point maxpnt = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(myrect.Right, myrect.Top, mapctrl.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap));
//
ESRI.ArcGIS.ADF.Web.Geometry.Envelope mappoly = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(minpnt, maxpnt);
它怎么仅仅就能根据屏幕坐标而算出地理坐标呢???是不是mapctrl.GetTransformationParams的功劳?
我反过来,想将地理坐标转换为屏幕坐标类似的该怎么写??


  回复  引用  查看    
#69楼2009-04-10 18:05 | pearl      
您好,想请教您一个问题,这个问题我和几个网友都遇见了,能否请您在空余时间解答一下吗?按照您教的这个教程,高亮显示调试成功,但是发布网站后这个功能不能用,不是地图不显示就是说超出查询范围,请问这是为什么呢?麻烦了
  回复  引用  查看    
#70楼2009-04-16 10:54 | 道可道非常道      
@空明流转的马甲
你写的框架在??怎么搜不到?

  回复  引用    
#71楼2009-05-01 10:21 | 罐头汤[未注册用户]
你好,请教一些问题:
我想用esri提供的Web Mapping Application模板,在上面添加一些我的功能,添加一个VS普通的按钮,在点击事件下写代码,运行时,按这个普通的按钮没有反应的,为什么呢?
另外怎么用arcgis 的toolbar的command按钮当做普通按钮使用呢?

  回复  引用    
#72楼2009-05-11 23:23 | shouxin
请问博主怎么看不到文章贴图啊?
  回复  引用  查看    
#73楼[楼主]2009-05-15 13:42 | Flyingis      
@罐头汤
如果该按钮点击后需要和地图进行交互,需要添加toolbar中的一个command。

  回复  引用  查看    
#74楼[楼主]2009-05-15 13:42 | Flyingis      
@shouxin
是网络问题吧,贴图没有问题。

  回复  引用  查看    
#75楼[楼主]2009-05-15 13:44 | Flyingis      
@pearl
有这种事情吗?现在暂时没时间调试,我准备贴一份最全的adf代码上来供大伙参考了。

  回复  引用    
#76楼2009-06-16 17:07 | 孤独无助[未注册用户]
初学ArcGis Server遇到问题如下:

无法将类型为“ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal”的对象强制转换为类型“ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource”。
Type 为:arcgis serverlocal
--------------------------------------------------------
请教这个问题如何解决啊,困扰很久了

  回复  引用    
#77楼2009-07-01 19:46 | Amywhuyg[未注册用户]
为什么我的运行到下面这句就会出现异常
ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)dr[shpind];




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 860128




相关文章:

相关链接: