Tag Archives: ArcGIS Server

ArcGIS中的线性参考/动态分段技术(三)几个Linear Referencing应用场景在AGS中的实现

        现在来实现上面提到的3个功能。1、对于某条公路上的一点进行Identify操作,要求返回该点在公路上的桩号值:        以Silverlight API为例。为了在服务器端使用ArcObjects,在Asp.net工程中添加一个名为LinearRef的Silverlight-Enabled WCF Service,在LinearRef.svc.cs文件中添加以下代码:namespace RoadDycSeg.Web.WCF{ [ServiceContract(Namespace = “”)] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class LinearRef { public IRouteLocator2 pRtLocator = null; ESRI.ArcGIS.Server.IServerObjectManager pSOM = null; public ESRI.ArcGIS.Server.IServerContext pServerContext = null; public LinearRef() { ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity(“ArcGISWebServices”, “yourpassword”, “”); ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsconn = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection(“localhost”, identity); agsconn.Connect(); pSOM = agsconn.ServerObjectManager; pServerContext = pSOM.CreateServerContext(“shaanxi”, “MapServer”); ESRI.ArcGIS.Carto.IMapServer2 pMapServer = pServerContext.ServerObject as ESRI.ArcGIS.Carto.IMapServer2; ESRI.ArcGIS.Carto.IMapServerObjects2 pMapServerObjects = pMapServer as ESRI.ArcGIS.Carto.IMapServerObjects2; … Continue reading ArcGIS中的线性参考/动态分段技术(三)几个Linear Referencing应用场景在AGS中的实现 »

利用免费的地图来解决实际问题

        Google Map的API虽然免费,好用,但终究需要那么一些Javascript基础;ESRI最近推出的Mapping for Everyone使用起来就更简便,内容也更丰富,能够让大家轻松地在自己网页里嵌入一张可互动的地图,比如这样就可以查看美国09年的失业率统计:        它能够帮助我们做什么呢?这就有个例子,这位老兄正利用一张地图,劝说他的好友卖掉房子,准备搬家呢:)

ArcGIS中的线性参考/动态分段技术(二):Linear Referencing在ArcGIS Server中的实现原理

        首先来思考几个Linear Referencing的应用场景(后面会对这些场景一一实现):        1、对于某条公路上的一点进行Identify操作,要求返回该点处在公路上的里程值;        2、输入起始和终止桩号,要求将其间的路段显示在地图上;        3、类似GoogleMap的交通流量地图。        要将这些功能在ArcGIS Server中“落地”,首先决定采用哪种开发方式:客户端API还是Web ADF?两者皆可。但是稍加思考,两种方式的API中都没有提供有关Linear Referencing的解决办法。所以,Linear Referencing在ArcGIS Server中的实现原理还是得依靠ArcObjects了。        ArcObjects中,Linear Referencing的功能在ESRI.ArcGIS.Location库中,请见:http://resources.esri.com/help/9.3/ArcGISEngine/dotnet/10745641-b5e3-4600-979f-cdf9d2bbc7ce.htm#About%20linear%20referencing。        为了实现上述功能,其中比较关键的有两个类:RouteLocator和RouteEventSource。RouteLocator的IRouteLocator2接口有Identify和Locate两个方法,前者可根据地理坐标识别出Route上的位置(M值);后者可根据M值来定位出Route上相应的Geometry。如果已有EventTable,需要对上面的每个Event进行定位,除了重复使用IRouteLocator2.Locate方法(或者LocateRow方法)外,也可通过构建RouteEventSource来实现。它是一种特殊的FeatureClass(继承自FeatureClass),其中的每个Feature代表了EventTable中的一个Event,而这个Feature的Shape字段内容则是根据EventTable和Route FeatureClass,利用Dynamic Segmentation技术实时计算出来的。        关于如何获得可用的IRouteLocator2接口和RouteEventSource,文档中已经讲的很清楚;另外ESRI.ArcGIS.Location中还提供了实现ArcMap中Linear Referencing里所有功能的接口,有兴趣的朋友可以仔细阅读。

ArcGIS中的线性参考/动态分段技术(一):Linear Referencing背景

Linear Referencing背景        定位:介绍Linear Referencing背景;在ArcMap中关于Linear Referencing的结构和功能;以及ArcGIS Server中几个应用场景的实现。        注:有关更详细的操作可查看在线帮助,或搜索论坛。什么是Linear Referencing        Linear Referencing(下文引用为LR)翻译过来是线性参考,在公路,管网等行业的GIS应用中时常提到。LR是一种利用沿着可测量的线要素的相对方位来存储地理位置的方法。比如下图中:        下面线的长度一次标为0,10,20,30,40……,而沿着这条线,我们看到上面有: 一个位于坐标12处的点; 一个位于坐标10东侧4个坐标的点; 一段起始坐标分别为18和26的线段; 一段起始坐标为28,长度为12的线段。         为什么要用到LR技术?主要有两个原因:1、很多事件,像上边的例子一样,是通过沿着(曲)线的相对位置来记录的;2、要显示一条线上的多个属性集合时,由于各个属性在(曲)线上所对应的位置不同,同一数据源如果不做处理,很难达到要求。使用LR技术可解决此问题。        以公路方面的一个应用场景为例说明。我们要显示一条公路的4种不同属性:道路管辖情况、路面材料、路段限速情况和路况,假设该公路长100公里:1、前40公里为交警2大队管辖,后60公里为交警4大队管辖;2、30至70公里为水泥路面,其余为沥青路面;3、0-20公里的路段限速45km/h,20-40公里的路段限速35km/h,40-70公里路段限速45km/h,70-100公里路段限速55km/h;4、0-20公里路况一般,20-40公里路况很好,40-60公里路况很差,60-100公里路况很好。        属于同一数据源对应多个属性(且属沿线分布)的情况。如果不使用LR技术,那么需要4个公路图层,每个图层的公路根据属性分成长短不同的段落(Feature),才能够将这些属性展示出来;而是用了LR技术后,只需要一个公路数据(Feature数量不限),和四个事件表即可在不改变实际公路数据的情况下,按要求显示上述四种属性。        Dynamic Segmentation:动态分段,属于LR采用的一种技术(一般应称之为线性参考问题中的动态分段技术)。是根据属性表中存储的相对位置信息,以及相应的线性数据,动态计算出线性数据上相对位置所对应的实际地理坐标的过程。动态分段正是因为表达不同属性时,不用去分割实际的地理数据,而是动态计算出该属性对应的地理位置而得名。ArcGIS中Linear Referencing的实现原理        ArcGIS中实现Linear Referencing主要通过以下两种数据结构:1、Route FeatureClass2、Event Table        通过Dynamic Segmentation技术,Event Table中不同位置的Event就定位到了Route FeatureClass下对应的Line Feature上。Route FeatureClass        实际上是拥有两个特殊字段的Polyline FeatureClass:1、必须包含有M(Measure)值的Shape字段。拥有M值的Shape字段,不但能存储x,y(,z)坐标,还能够多存储一个M数值;2、必须包含有一个标识线段ID的字段,可以是Number或者Text类型。        除了上述两个字段要求,还可以有其他字段。        Route FeatureClass不同于普通的Polyline FeatureClass,是因为它具有一个测量系统,而这个测量系统的原理就是,通过存储在Feature的Vertice中的M值以及该Feature实际的ShapeLength,来动态插值出线上每一点的相对位置。比如一条公路数字化时,有两个节点(Vertice),分别表示该公路的起始桩号0公里和结束桩号100公里,该Feature存储在WGS1984坐标系中,ShapeLength为2.00,那么该公路上40公里处的位置,就应该位于图上该Feature的40%的位置,也就是ShapeLength为0.80的位置。        而ArcGIS中,不要求每个节点都必须有M值。对于没有M值的节点其M值会标记为NaN(not a number):        此外在不违反逻辑错误的情况下,M值可以随意设置。比如上图左边的图形,0-10段的实际ShapeLength看起来比10-20段的ShapeLength明显要长,也可以将上述四个节点的M值随意地设置为0,3,7,30。但是如果设置为0,10,5,30的话就产生了逻辑错误(route measure anomalies),ArcMap中会将其突出显示,提醒用户使用工具修改。Event Table        实际上是拥有2-3个特殊字段的表(ArcGIS支持的表均可,甚至可以是有特定格式的text文件):1、类似Route FeatureClass中RouteID的一个字段。用来存储与Route FeatureClass中哪个线Feature对应。可以是Number或Text类型;2、根据Event类型不同而必须的1-2个字段: Point Event:比如108国道1900公里处发生了交通事故这个Event,需要一个Number类型的字段来记录1900这个相对位置; Line Event:比如108国道1850到1950公里段的路况很差这个 Event,需要两个Number类型的字段来分别记录1850、1950这两个起止位置。         除了上述两个字段要求,还可以有其他字段。        Event Table中一条记录就对应了需要在线上定位的一个点或一段距离,可以用来标识事件或属性等。下图描述了Dynamic Segmentation技术利用Route FeatureClass和Event Table产生的结果:ArcGIS桌面中对Linear Referencing的实现        ArcGIS桌面中不仅提供了专门的Linear Referencing Toolbox,对于产生的结果图层,也能像普通图层一样进行各种操作,而针对Linear Referencing的方方面面也提供了非常细粒度的操作供用户调整。 对Route FeatureClass的创建与修改。包括:通过Catalog或Tool或向导创建RouteFeatureClass;利用Tool从已有的Polyline FeatureClass创建Route FeatureClass;通过Tool或向导利用已有的Point FeatureClass来校准Route FeatureClass的M值(注:通过对RouteID字段建立索引,可提高Dynamic Segmentation的效率); 利用Route Editing Toolbar对其进行修改; 将Route FeatureClass作为图层显示,并对其进行查询。包括:对Route进行Identify。查询出线上任意点的M值(Identify Route Locations工具需从Customize中调出);查找某条线上指定M值的位置(包括Point和Line两种),通过Find工具实现;自定义符号显示M值的异常。包括逻辑错误等,可通过Route图层的属性对话框实现;在地图上像刻度尺一样任意显示Route的M值(Hatch)。通过将定义Hatch Definition(可多个),将其组织在Hatch Class(可多个)下,并附加SQL Query和Range Scale操作,基本实现任意复杂的“道路标尺”,而“标尺”的Label也可进行Script的高级控制,最终还能将“标尺”转换为Graphics,或将“标尺”风格另存为Style。在Route图层的属性对话框中实现; 通过Tool和Attribute … Continue reading ArcGIS中的线性参考/动态分段技术(一):Linear Referencing背景 »

Local方式连接成功,Internet方式连接失败的原因之一

        以前也看到论坛中有朋友说这个问题,前两天刚好碰到,记录一下,方便其他朋友查阅。        症状:1、在ArcCatalog中,通过Local方式连接gis server没有问题,通过Internet方式连接(首先保证输入的字符串格式正确)提示:the request method (get.post,ect) was not allowed。。。。2、ADF开发时(比如新建一个web mappling application模板),在MapResourceManager中,通过Local方式连接数据源没有问题,通过Internet连接时出错如下图:        解决办法:很有可能是安装时未进行Web Application Post Install引起的,(重)做一遍Web Application Post Install即可。

ArcGIS API for Silverlight 1.0兼容Silverlight 3

        silverlight api 1.0正式版(build 269)可以使用silverlight 3,在silverlight 2的开发环境下直接下载silverlight 3 tools安装即可。        silverlight 3 RTW版是7月10号发布的,关于新特性,网上有很多文章,相比以前的版本,怀疑的声音已经听不到了,只有褒奖和期待,而其中更有被誉为神作的.NET RIA Service,使得在.NET框架下的前后台通信变得更加方便。拭目以待吧:)        截个图,体验一下sl3中非真正3d引擎的3d效果:

ArcGIS API for Silverlight/WPF RC版本发布

        ArcGIS API for Silverlight/WPF RC(release candidate)版本发布,正式版也倒计时了。        bug:修正的一个最大bug就是在vs2008中使用design mode时十开九死的状况。        几个比较大的变化:1、所有的assembly和namespace都添加“Client”后缀,比如ESRI.ArcGIS.*变为ESRI.ArcGIS.Client.*,就是为了区别Silverlight API和其他ESRI API,比如ArcObjects。由此可以看出,在SL程序中调用AO也是名正言顺的事情;2、ESRI.ArcGIS.Widgets.*变成了ESRI.ArcGIS.Client.Toolkit.*;3、ESRI.ArcGIS.VirtualEarth.*变成了ESRI.ArcGIS.Client.Bing.*;4、Clustering属性从FeatureLayer挪到了GraphicsLayer,允许对其进行更大程度的自定义;        另外,对于209版本中,用QueryTask无法完成带中文字符的属性查询问题,也得到了修正。        具体参见:What’s New

ArcGIS API for Silverlight开发入门外传:在程序中调用AO

        Silverlight API的开发入门系列的文章上回已经结束,但其实能讲的东西还有很多,实在不能面面俱到。这次再补充一个比较重要的功能,就是在Silverlight API程序中调用ArcObjects,来完成一些复杂的geoprocess功能。        ADF之所以强大,除了其本身的类库外,它还能在服务器端调用AO,来完成比如在线编辑或者Geoemtry的处理工作;而ESRI官方的说法,建立在REST服务基础上的程序目前都不具备在线编辑的功能(因为要与服务器端的数据库打交道),但他们把这项功能作为日程,提到了研发计划内。目前而言,要在Silverlight API中完成数据编辑工作,他们的劝告是,“如果你不怕把你的双手弄脏,那就去做吧”。        言归。AO本身是COM组件,.NET是利用COM Interop技术与其打交道的,这显然是Silverlight的客户端环境办不到的。这就需要与服务器端进行通信。Silverlight与服务器端通信,最常用的是WebClient类,稍复杂的还有HttpWebRequest类,而传统的ASP.NET Web Service与更强大的WCF则为远程调用AO提供了可能。下面还是来看一个实例,功能是在程序中向数据库中添加一个点,以Web Service为例(关于如何使用Web Service可以查资料,这里不做讲解)。        在Silverlight所在的ASP.NET工程中新建一个ASP.NET Web Service,添加一个WebMethod,如下:public class WS_AOAddPoint : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return “Hello World”; } [WebMethod] public bool AddPointToFileGDB(double x, double y) { IAoInitialize aoInit = new AoInitializeClass(); aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine); IWorkspaceFactory pWSF = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass() as IWorkspaceFactory; ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass(); pPropertySet.SetProperty(“DATABASE”, @”E:arcgisserveragsedit_simpleaddpointchina_airlines.gdb”); IFeatureWorkspace pFW = pWSF.Open(pPropertySet, 0) as IFeatureWorkspace; IPoint pPoint = new PointClass(); … Continue reading ArcGIS API for Silverlight开发入门外传:在程序中调用AO »

ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务

        Silverlight API中还包括了一个ESRI.ArcGIS.VirtualEarth.dll类库,让我们可以方便的访问到老东家的VirtualEarth服务。目前Silverlight API中提供的VirtualEarth服务有三种:Map,Geocode和Routing,不过一看就知道后两种服务对于国内的数据来说又无缘了。        直接看如何使用它的Map服务获取地图数据吧。同前,新建一个Silverlight工程,添加ESRI.ArcGIS.dll和ESRI.ArcGIS.VirtualEarth.dll的引用,引入xml命名空间,在xaml里面这样写:         可以看出,和添加其他图层基本是一样的。SIlverlight API中针对VE地图的图层类型是TileLayer,LayerStyle有三种:Road,Aerial和AerialWithLabels,分别对应矢量图,影像图和带街道标注的影像图。ServerType就比较特殊了,有两种:Staging和Production,分别对应访问VE服务的账户类别,前者是免费的,后者是收费的。如果你此时运行程序的话,那是看不到地图的,因为TileLayer还有个关键的token属性没有设置。        VE的服务那是相当安全,每次访问VE的服务,都要提供一个token(一个加密字符串)来进行身份验证,而这个token又是根据TokenService自动生成的,要通过TokenService生成一个token,又需要一个合法的Microsoft Virtual Earth Platform developer account……明白了这个过程,就来做我们的工作吧。        首先,去申请一个Microsoft Virtual Earth Platform developer account,当然之前你还得有一个Windows Live账号。申请的这个账号是Evaluation版的,所以决定了以后我们只能使用Staging的服务,如果要把它变成Production版本,可以通过邮件联系微软,然后缴费;        之后到注册时所填的邮箱去激活申请的Microsoft Virtual Earth Platform developer account账号,然后为其设置密码(必须是8-14为之间,包括大、小写字母,数字,且还要有非字母数字的字符,和windows server 2008是一样的),我们平常肯定不会这样设置密码,为了以防万一,建议赶紧把设置好的密码记录下来,没准哪天就忘了。现在就可以用这个账户和密码来访问TokenService,通过它生成token,交给TileLayer的token属性。        为了安全目的考虑,token是不建议也不能直接在Silverlight程序中进行设置的。那么怎么办呢?这样办:1、通过装载Silverlight的aspx页面的Page_Load方法,来申请我们的token,并把它添加到Silverlight的初始参数中,2、然后当Silverlight插件载入的时候,把token读出来,3、在Map_Loaded事件中,赋给TileLayer。1、通过TokenService申请token:在web app中add web reference,url用https://staging.common.virtualearth.net/find-30/common.asmx?wsdl,起个名字叫VirtualEarthService.TokenService。其中Xaml1是Silverlight插件的ID:2、Silverlight插件载入时读出这个token。在App.xaml.cs中:private void Application_Startup(object sender, StartupEventArgs e) { VEtoken = e.InitParams[“token”]; this.RootVisual = new Page(); }3、最后在加载地图控件后,交付token:private void Map1_Loaded(object sender, RoutedEventArgs e) { foreach (Layer layer in Map1.Layers) if (layer is TileLayer) (layer as TileLayer).Token = (Application.Current as App).VEtoken; }        终于能看见VE的图了。当然,我们的开发账户是免费的,所以地图上有很多“Staging”麻点(每个tile一个):         至此,ArcGIS API … Continue reading ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务 »