ArcGIS10时态GIS使用体验

来源:互联网 发布:java swing 界面模板 编辑:程序博客网 时间:2024/06/05 10:05

什么是时态数据:
时态数据是代表了某一个时间某种状态的简单数据,如2009年上海的土地利用现状,或者是2010-04-02这天在云南省的降雨总量等。收集时态数据用来分析气候变化或其他环境变量,监管交通条件,研究人口成长趋势等。时态数据具有很多数据源,通过使用观测传感器得到的数据,或从业务模型产生的数据。
存储时态数据
在ArcGIS你可以存储或管理很多格式的时态数据如:feature classes, mosaic datasets, raster catalogs, table,etc,如何选择使用哪种格式取决于时态数据的属性和你想要表现的方式。
时态数据格式选择:
动态要素:观测海洋生物漂流位置
用颜色渲染要素:研究一种疾病致死率的升高原因
用大小渲染要素:一个城市的人口数量变化情况
使用raster catalogs or netCDF data观测变化:观测海洋水温变化或气候变化
绘图的变换:在不同区域检测臭氧水平或水压
存储时间序列值
<!–[if !supportLists]–>1.       <!–[endif]–>时态数据存储的时间序列内的值可以用相关或不相关时间间隔内某一个取样时间点来代表。这些数据将存储在单个属性字段中,并且可以在时间序列上某一个特别时间点来观测时态数据。如河流的流量和水位值记录在相关的时间间隔内,地震数据收集取决于地震的发生,记录与非相关时间间隔内。
<!–[if !supportLists]–>2.       <!–[endif]–>时态数据存储的时间序列内的值也可以用一个时间段来代表。在这种情况下,一个事件发生于一段时间内,时间序列值将存储在两个字段内。一个代表起始时间值,一个代表终止时间值。例如,用面要素来代表一个消防队任务的起始和终止时间取决于一场大火的起始和终止时间。
这些时间序列值将以data,string或numeric字段保存。详细看如下help上的说明:
Supported string field formats
 
YYYY
YYYYMM
YYYY/MM
YYYYMMDD
YYYY/MM/DD
YYYY-MM-DD
YYYYMMDDhhmmss
YYYY/MM/DD hh:mm:ss
YYYY-MM-DDhhmmss
YYYYMMDDhhmmss.s
YYYY/MM/DDhh:mm:ss.s
Supported numeric field formats
 
YYYY
YYYYMM
YYYYMMDD
YYYYMMDDhhmmss
where
 
YYYY = four-digit year
MM = two-digit month (01=January)
DD = two-digit day of month (01 through 31)
hh = two digits of hour (00 through 23) (a.m./p.m. not allowed)
mm = two digits of minute (00 through 59)
ss = two digits of second (00 through 59)
s = one digit of millisecond (0 through 9)

在ArcGIS10.0中使用时态数据
在ArcMap中通过设置图层属性的时间选项卡,可以将该图层作为时态数据来使用,一旦启用了时态数据图层,你就可以通过时间滑动工具(Time Slider)来观看,或者你也可以其通过ArcGIS Server发布出来,通过各种客户端API来进行基于时间序列的查询和动态展示。

图层属性的时间选项卡

时间滑动工具(Time Slider)


Server端:Time-Aware map service layers

ArcGIS Services Directory中的Time Info:

<!--[if !supportLists]-->
ArcGIS10.0支持的时态空间数据存储方式:
时间信息可以保存在一个属性字段里面如feature classes, mosaic datasets, raster catalogs等数据,也可以保存在数据内部如netCDF data, Tracking layers等。
<!–[if !supportLists]–>Ø <!–[endif]–>Feature class Layers:
<!–[if !supportLists]–>1.       <!–[endif]–>属性值随时间序列变化(相同的shape,不同的时间序列值)

<!–[if !supportLists]–>2.       <!–[endif]–>空间位置大小随时间序列变化(不同shape,不同时间序列值)

不管事哪种Feature class时间变化类型,在ArcMap中该图层属性Time属性卡中,layer Time有两中选择1.Each feature has a single time field;2.Each feature has a start and end time field。前者指的是由单个字段确定的时间序列,比如2010年;后者代表的是该事件是在严格的一个时间区间内,比如2010/2/3到2010/4/27。
除此外还有时间格式的设置、时间间隔和时间范围的设置,更高级的还有时区和偏移量的设置。还可以按时序以累计的方式来观看地图。
在ArcMap中的表现:

在server端:WebAPI
将带有时态数据图层的地图发布为服务(跟普通的一样),尽量不要用layer group的方式,我在Prerelease版本下试好像是不行,不知道正式版如何。下面的示例是用flash API的,别的Web API也一样。
1.采用ArcGISDynamicMapServiceLayer的方式:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

    xmlns:fx="http://ns.adobe.com/mxml/2009"

    xmlns:mx="library://ns.adobe.com/flex/mx"

    xmlns:esri="http://www.esri.com/2008/ags"

    xmlns:s="library://ns.adobe.com/flex/spark"

    pageTitle="1985-2008之间的火灾"

    styleName="plain"

    horizontalAlign="center" xmlns:layers="com.esri.ags.layers.*">

    <fx:Style>

       @namespace mx "library://ns.adobe.com/flex/mx";

       @namespace esri "http://www.esri.com/2008/ags";

       @namespace s "library://ns.adobe.com/flex/spark";

      

       /* for the slider tooltip that shows the date as you move the slider */

       mx|ToolTip {

           font-size: 14;

       }

    </fx:Style>

   

    <fx:Script>

       <![CDATA[

           import com.esri.ags.events.LayerEvent;

           import com.esri.ags.layers.supportClasses.TimeInfo;

          

           protectedfunction fLayer_loadHandler(event:LayerEvent):void

           {

              var timeInfo:TimeInfo = myTimeLayer.timeInfo;

              myTimeSlider.createTimeStopsByCount(myTimeLayer.timeInfo.timeExtent);// defaults to 10 intervals

              //myTimeSlider.createTimeStopsByTimeInterval(timeInfo.timeExtent, timeInfo.timeInterval, timeInfo.timeIntervalUnits);

              //myTimeSlider.play(); // start playing automatically

           }

       ]]>

    </fx:Script>

   

    <fx:Declarations>

       <mx:DateFormatter id="myDateFormatter" formatString="YYYY"/>

    </fx:Declarations>

   

    <mx:Label text="1985-2008之间的火灾" fontSize="20"/>

   

   

    <esri:Map timeSlider="{myTimeSlider}">

     <esri:ArcGISDynamicMapServiceLayer id="myTimeLayer" url="http://china-2065ed03d/ArcGIS/rest/services/test/MapServer" load="fLayer_loadHandler(event)" >

   

     </esri:ArcGISDynamicMapServiceLayer>

      

    </esri:Map>

   

    <esri:TimeSlider id="myTimeSlider" />

    <mx:Label text="{myDateFormatter.format(myTimeSlider.timeExtent.endTime)}" fontSize="14" fontWeight="bold"/>

    <mx:Text width="100%" text="使用Polygon来按时间序列绘制火灾,使用ArcGISDynamicMapServiceLayer。"/>
</mx:Application>
效果:
 
2.采用FeatureLayer的方式:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

    xmlns:fx="http://ns.adobe.com/mxml/2009"

    xmlns:mx="library://ns.adobe.com/flex/mx"

    xmlns:esri="http://www.esri.com/2008/ags"

    xmlns:s="library://ns.adobe.com/flex/spark"

    pageTitle="1985-2008之间的火灾_FeatureLayer"

    styleName="plain"

    horizontalAlign="center">

      

    <fx:Style>

       @namespace mx "library://ns.adobe.com/flex/mx";

       @namespace esri "http://www.esri.com/2008/ags";

       @namespace s "library://ns.adobe.com/flex/spark";

      

       /* for the slider tooltip that shows the date as you move the slider */

       mx|ToolTip {

           font-size: 14;

       }

    </fx:Style>

   

    <fx:Script>

       <![CDATA[

           import com.esri.ags.events.LayerEvent;

           import com.esri.ags.layers.supportClasses.TimeInfo;

          

           protectedfunction fLayer_loadHandler(event:LayerEvent):void

           {

              var timeInfo:TimeInfo = fLayer.layerDetails.timeInfo;

             

              myTimeSlider.createTimeStopsByCount(timeInfo.timeExtent,20);

              //myTimeSlider.play(); // start playing automatically

           }

       ]]>

    </fx:Script>

   

    <fx:Declarations>

       <mx:DateFormatter id="myDateFormatter" formatString="MMMM YYYY"/>

    </fx:Declarations>

   

    <mx:Label text="1985-2008之间的火灾" fontSize="20"/>

    <mx:Label text="总共火灾次数{fLayer.numGraphics} ." fontSize="13" visible="{fLayer.numGraphics > 0}"/>

   

    <esri:Map timeSlider="{myTimeSlider}">

   

       <esri:ArcGISDynamicMapServiceLayer url="http://china-2065ed03d/ArcGIS/rest/services/test/MapServer">

           <esri:visibleLayers>

              <mx:ArrayCollection>

                  <fx:Number>0</fx:Number>

                  <fx:Number>2</fx:Number>

                  <fx:Number>3</fx:Number>

                  <fx:Number>4</fx:Number>

                  <fx:Number>5</fx:Number>

                  <fx:Number>6</fx:Number>

                  <fx:Number>7</fx:Number>

              </mx:ArrayCollection>

           </esri:visibleLayers>

       </esri:ArcGISDynamicMapServiceLayer>

       <esri:FeatureLayer id="fLayer"

                        load="fLayer_loadHandler(event)"

                        mode="snapshot"

                        outFields="[FIRE_TYPE]"
                        url="http://china-2065ed03d/ArcGIS/rest/services/test/MapServer/0">

<esri:renderer>

              <esri:ClassBreaksRenderer attribute="FIRE_TYPE">

                  <esri:ClassBreakInfo maxValue="5">

                     <esri:symbol>

                         <esri:SimpleMarkerSymbol alpha="0.8" color="0xFF0000" size="8" style="triangle">

                            <esri:SimpleLineSymbol color="0xAA0000"/>

                         </esri:SimpleMarkerSymbol>

                     </esri:symbol>

                  </esri:ClassBreakInfo>

                  <esri:ClassBreakInfo minValue="10" maxValue="14">

                     <esri:symbol>

                         <esri:SimpleMarkerSymbol alpha="0.8" color="0xFF0000" size="12" style="triangle">

                            <esri:SimpleLineSymbol color="0xAA0000"/>

                         </esri:SimpleMarkerSymbol>

                     </esri:symbol>

                  </esri:ClassBreakInfo>

                  <esri:ClassBreakInfo minValue="15">

                     <esri:symbol>

                         <esri:SimpleMarkerSymbol alpha="0.8" color="0xFF0000" size="25" style="triangle">

                            <esri:SimpleLineSymbol color="0xAA0000"/>

                         </esri:SimpleMarkerSymbol>

                     </esri:symbol>

                  </esri:ClassBreakInfo>

              </esri:ClassBreaksRenderer>

           </esri:renderer>

       </esri:FeatureLayer>

    </esri:Map>

    <esri:TimeSlider id="myTimeSlider" enabled="{fLayer.loaded}"/>

    <mx:Label text="{myDateFormatter.format(myTimeSlider.timeExtent.endTime)}" fontSize="14" fontWeight="bold"/>

    <mx:Text width="100%" text="使用Point按时间序列来渲染绘制火灾,使用FeatureLayer。"/>
</mx:Application>
 
使用FeatureLayer的方式其实是在客户端新建了一个FeatureLayer,跟之前的GraphicLayer类似,默认绘画要素的方式是累积的,这个不像前面的ArcGISDynamicMapServiceLayer的方式,这个需要注意一下,不过也有更多的可操作性,比如统计绘画个数、MapTip 等Graphic的操作。
<!–[endif]–>Mosaic datasets
ArcGIS10.0新增加了Mosaic datasets数据类型来存储和管理栅格数据,这种数据模型很适合用来分发数据。详细可参见ArcGIS10的帮助和示例。
就像Feature Layer一样,在Mosaic datasets layer里面你也需要在其属性表中的时间字段。Mosaic datasets可以存储一定时间内的栅格数据,然后加上时间维度来显示。比如我们可以将不同年限的土地利用影像加上时间维度,然后可以通过渲染和在一定时段内的动态展示来表现一个城市的土地利用变化情况。
演示:
新建一个Mosaic dataset,由于手头没有机遇时间的影像数据,故采用一个点图层的业务数据进行多种差值方式来产生的数据,加入到新建的Mosaic dataset中,然后在该Mosaic dataset layer中启用Time.

Server:WebAPI

<!–[endif]–>Raster catalog layers
在Raster Catalog layer中,同样的,也需要在其属性表总的一个时间字段。当一个Raster Catalog layer在显示的时候,如果有超过9幅的raster在视野内,那么图层就会渲染成每个raster的图幅线框,一旦使用Time Slider,你就可以看到真实的数据。
实际上跟Mosaic dataset一样,使用时态动态展示的原理就是按照Raster catalog(Mosaic dataset)中的raster为单位,进行切换。
演示:
使用上例中Mosaic dataset的两个插值raster,然后split为4X4,16张图片,两个raster就一共32个子raster,然后加入到Raster catalog。如图:
么有使用Time:

使用Time后:


Server:WebAPI

跟FeatureLayer一样,默认好像也是累积的。
Tracking layers
Tracking Analyst提供从featurecalss生成tracking layer的工具,通过在其Layer Properties里面使用时态数据,即可使用Time Slider。在统一的时间序列下,可以将Tracking Layer的动态追踪的数据和地图中别的时间序列的数据结合起来动态显示,比如可以追踪飞机飞行中的路线跟气象数据结合,来观测飞机飞行中各个时刻的气候变化情况和路线变化情况。
示例:

在Tracking Analyst工具条中点击Add Temporal Data Wizard中定义添加Tracking Layers,注意Storage policy的选择Copy all data to memory.

根据你的Time字段的格式选择相应的format,如果没有预先定义的可以自定义一个你自己的格式。点击“下一步”即可生成Tracking Layers。

在刚生成的Tracking Layer的图层属性中的Time选项卡中,必须勾上“Keep this layer synchronized with the map time”,为启用地图的Time,将此Tracking Layer的时间统一到地图时态的时间序列中,然后可以设置累积历史显示和时间间隔。然后就可以启动Time Slider,统一一起来查看时间序列的数据了。

 
Server端:WebAPI,下面用的代码是采用ArcGISDynamicMapServiceLayerTracking layer的符号可以使用默认的设置,如果用featurelayer,那需要自己定义。

Network datasets layer with traffic data
ArcGIS Network 10.0新增了历史交通信息,用来模拟不同网络要素之间穿行的因子(成本),用这种方法使得分析结果得到行驶时间更加可靠。要使用历史交通数据,可在network dataset laye里面配置,并且可以用Time Slider来观测其时态变化数据。
<!–[if !supportLists]–>Ø <!–[endif]–>NetCDF layers
对于NetCDF layer,我们可以选择其中一维的数据值来显示数据,时态值可以储存为其中一维,通过在其layer属性中配置,可利用Time Slider来观测时态数据。

在时间1000的时候NetCDF数据的展现。

在时间1200的时候NetCDF数据的展现


先将NetCDF的rc数据转换为RasterLayer,运行Toolbox的Make NetCDF RasterLayer。
在NetCDF的layer Properties的Time选项卡里面可以设置该数据层为时态数据(Layer has time as a dimension),进而使用Time Slider,这个功能在我使用的Prerelease的版本上试验,不见效果,原因是数据时间从10到7200,我选的时间格式为yyyy,但不知为何,系统默认从2001开始到7200结束,而且一旦启动Time,那么NetCDF选项卡中的时间维度就定在7200,也就是最后一个时刻了,无论Time Slider怎么动,地图都不会变化了(难道是Prerelease的bug?)。
Server端:WebAPI
代码跟featurelass采用ArcGISDynamicMapServiceLayer的方式一样,地图可以出来,跟桌面端一样,主要是时间维度一开始就是最后一个时刻,如果桌面端可以运行的,相信WebAPI这也一样。

 
<!–[if !supportLists]–>Ø <!–[endif]–>Tables
Table可以通过graph的方式来展示时态数据,最少需要两个字段,Time字段和随时间变化的业务值,也可以通过多标绘graph ID来实现展示多个属性值。同样通过设置层属性来启动,唯一的区别在于你必须要创建一个graph来展示数据。

 
示例:

使用带时间序列的Table,在Table Layer里面指定Time Slider的时间字段等属性。

创建了几个Graph,在Graph中指定Feature ID字段,这样Graphic也可以按时态来动态显示某个业务值所代表的信息,图上显示的是在不同时间段中火灾面积的变换,和火灾发生地X、Y坐标的密度图。
原创粉丝点击