2008年8月28日星期四

.Net Compact Framework获得当前目录

一直以为在智能设备上是不支持的,事实上还是有其它办法。查阅了微软的网站,由于某些设备操作系统不支持当前目录操作,因此简单的使用Directory.GetCurrentDirectory()在Windows Mobile等平台上会抛出错误。

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);

2008年8月26日星期二

使用 Google Earth + GPSBabel 生成 GPS NMEA 文件

对于GPS程序开发者来说,有些环境下使用NMEA文件进行测试是很有用的。生成GPS NMEA最笨的办法就是按照NMEA协议手动编辑一个文本文件——当然,想像一下一个开发人员在Google Earth上点来点去查看坐标然后用文本编辑器写NMEA文件似乎是一件很搞笑的事情。这里使用的方法是使用Google Earth生成自己定义的GPS路径,导出kml文件,再通过GPSBabel将kml文件转成NMEA。

首先,打开Google Earth,按照自己的要求绘制一条路径,保存。
右键这条路径的菜单项,选择保存,以kml文件保存。
http://www.gpsbabel.org/ 下载GPSBabel(注意,不要使用1.3.5 stable release版本,这个版本的NMEA输出功能有bug——stable,汗……)。解压缩以后有两个可执行文件,一个是控制台程序,一个是GUI程序,根据你的喜好运行其中一个。

GUI:控制台:gpsbabel.exe -i kml -o nmea


这是我生成的NMEA文件的一部分:
$GPRMC,000000.000,V,3959.485,N,11623.249,E,0.00,0.00,010070,,*15
$GPGGA,000000.000,3959.485,N,11623.249,E,0,00,0.0,0.000,M,0.0,M,,*6A
$GPRMC,000000.000,V,3959.456,N,11623.237,E,0.00,0.00,010070,,*12
$GPGGA,000000.000,3959.456,N,11623.237,E,0,00,0.0,0.000,M,0.0,M,,*6D

GPS NEMA-0183 数据格式

数据示例:

$GPGGA,175056.000,3402.1525,N,11710.8684,W,1,08,0.9,461.2,M,-32.5,M,,0000*65
$GPRMC,175056.000,A,3402.1525,N,11710.8684,W,0.00,306.36,221006,,,A*79
$GPVTG,306.36,T,,M,0.00,N,0.0,K,A*0D
$GPGSA,A,3,13,27,08,19,28,10,23,03,,,,,1.7,0.9,1.5*37
$GPGSV,3,1,11,27,65,025,43,08,53,326,40,13,50,153,30,28,49,247,39*7F


说明:NMEA0183格式以“$”开始,主要语句有GPGGA,GPVTG,GPRMC等

详细说明:

1、 GPS DOP and Active Satellites(GSA)当前卫星信息
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7>
<1>模式 :M = 手动, A = 自动。
<2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。
<4> PDOP位置精度因子(0.5~99.9)
<5> HDOP水平精度因子(0.5~99.9)
<6> VDOP垂直精度因子(0.5~99.9)
<7> Checksum.(检查位).


2、 GPS Satellites in View(GSV)可见卫星信息
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8>
<1> GSV语句的总数
<2> 本句GSV的编号
<3> 可见卫星的总数,00 至 12。
<4> 卫星编号, 01 至 32。
<5>卫星仰角, 00 至 90 度。
<6>卫星方位角, 000 至 359 度。实际值。
<7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。
<8>Checksum.(检查位)。

第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。

3、Global Positioning System Fix Data(GGA)GPS定位信息
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<3> 纬度半球N(北半球)或S(南半球)
<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<5> 经度半球E(东经)或W(西经)
<6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
<7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
<8> HDOP水平精度因子(0.5~99.9)
<9> 海拔高度(-9999.9~99999.9)
<10> 地球椭球面相对大地水准面的高度
<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
<12> 差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空)


4、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

5、 Track Made Good and Ground Speed(VTG)地面速度信息
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
<1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
<2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
<3> 地面速率(000.0~999.9节,前面的0也将被传输)
<4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
<5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

2008年8月23日星期六

ArcGIS Mobile 9.3 + ArcSDE for PostgreSQL 向服务器上传更新Feature的bug

当使用 ArcGIS Mobile 9.3 SDK 开发的程序向 ArcSDE for PostgreSQL 提交本地新建或更改的Feature时,目标服务会崩溃并报“gsrvr.exe error”错误。开发人员已证实这是一个bug,将在SP1中被修复。

2008年8月19日星期二

ArcGIS Mobile 9.3 开发的Missing ArcGIS registry key错误

以前没有注意到这个问题,今天换了一个模拟器调试原先的程序,抛出“Missing ArcGIS registry key”错误。

这与ArcGIS Mobile的开发环境配置不人性化有关。我们知道ArcEngine开发桌面程序需要目标机器安装Runtime,但是开发机器的环境已经包含了 Runtime。ArcGIS Mobile与此类似,部署的时候需要在目标设备上安装ArcGIS Mobile Runtime,但是开发调试时并不会自动部署,因此需要你首先手动安装。

安装包是“%ARCGIS_HOME%\DotNet\WindowsCE\Install\AGMRuntime.CAB”,对于定制的WinCE平台,可能需要安装AGMRTWinCE.CAB

2008年8月18日星期一

ArcGIS API for Flex概览

【环境】ArcGIS Server 9.3, ArcGIS API for Flex 1.0 beta

ArcGIS API for Flex可以说是ArcGIS Server的扩展开发组件,它可以使你在使用ArcGIS Server构建GIS服务的基础上,开发富因特网应用(RIA, Rich Internet Applications)。它的优点在于可以使ArcGIS提供的各种资源(如Map、GP模型)和Flex提供的组件(如Grid、Chart)相结 合,构建表现出色、交互体验良好的Web应用。

在你学习使用如何使用ArcGIS API for Flex开发Web应用,你甚至不需要安装ArcGIS Server,因为ESRI已经准备了很多在线Sample资源,而ArcGIS API for Flex可以通过URL形式去访问它们。

通过ArcGIS API for Flex能做什么?

ArcGIS API for Flex可以使你在Web应用中,使用ArcGIS Server的Map和Task,比如:

  • 表现一个可交互的地图
  • 在服务器执行一个GIS模型,在客户端表现结果
  • 在ArcGIS Online底图上表现你自己的数据
  • 在你的GIS数据中搜索要素和属性,并表现结果
  • 地址定位,并表现结果
  • 创建mashups(多信息源的组合)
ArcGIS API for Flex包括什么?
  • Maps – ArcGIS Server发布的动态或缓存地图服务
  • Graphics – 通过画图、弹出窗口增强你的Web应用
  • Tasks – 一些常用的Task
  1. Querying
  2. Locating addresses
  3. Finding attributes
  4. Identifying features
  5. Geoprocessing
  • 使用Flex组件的接口 – ArcGIS API for Flex通过Adobe Flex Framework构建,因此可以使用Flex的各种组件

ArcGIS API for Flex关系图

开发者必需

使用ArcGIS API for Flex要求开发者对Flex和ArcGIS Server有一定了解。

关于Adobe Flex和Adobe Flex Builder,开发者可以通过 Adobe公司网站的Flex开发者中心( Flex Developer Center)了解详细内容。

开发入门

使用ArcGIS API for Flex开发应用入门可以参考我的另外一篇介绍:《ArcGIS API for Flex 配置使用》。ESRI也提供了使用入门的一段录像《Creating an application using the ArcGIS API for Flex》,演示了如何开始使用API并进行开发。

2008年8月16日星期六

ArcGIS API for Flex 配置使用

【概述】概述如何在Adobe Flex Builder中配置使用ArcGIS API for Flex进行RIA开发。

【环境】Windows XP SP3,ArcGIS Server 9.3,Adobe Flex Builder 3,ArcGIS API for Flex(beta1)

下载安装Adobe Flex Builer 3

Flex 3 SDK是开放源代码的,但是其IDE工具Adobe Flex Builder是收费软件,免费提供60天试用,可以从http://www.adobe.com/products/flex/features/flex_builder/下载。

下载ArcGIS API for Flex开发包

从ESRI网站下载ArcGIS API for Flex开发包:
http://resources.esri.com/arcgisserver/apis/flex/index.cfm?fa=downloadDisclaimer,解压。

在项目中配置API

ArcGIS API for Flex以swc文件分发,swc是Flex组件和其它资源的存档文件。我们需要在需要使用Flex API的项目中导入swc文件后,即可使用这些组件与其相应的功能。

首先,新建Flex工程:

在项目的Library path中,链接ArcGIS API for Flex开发包中的swc文件。

测试环境是否配置成功

ArcGIS API for Flex开发包中包含有若干个例子,在sample目录下。我们选择一个例子“Tutorial_Map.mxml”,用文本编辑器将其打开,将所有内容复制到当前工程的默认mxml文件中覆盖。

编译运行,出现如下图的网页表示环境配置成功。

2008年8月15日星期五

使用ArcGIS Mobile SDK 9.3 开发移动设备应用-高级篇

【概述】概述如何通过ArcGIS Server 9.3提供的Mobile SDK开发移动设备应用。

【环境】Windows XP SP3,ArcGIS Server 9.3,Visual Studio 2008,Windows Mobile 6 Professional SDK


预生成地图缓存

我们已经知道,ArcGIS Mobile支持离线和在线两种应用。我们可以选择让ArcGIS Mobile应用在首次请求的时候保存地图缓存,也可以在此之前(部署应用之前),预先生成缓存,跟应用一起发布。是不是有点像原来的单机设备应用?

好,让我们把ArcCatalog打开,启动ArcToolbox工具箱:


在工具箱中,找到“Mobile Tools”。ArcToolbox专门为Mobile应用提供了两个工具。其中“Generate Mobile Service Cache”就是用以生成Mobile地图服务的缓存。


点 击确认,经过处理,在指定目录生成了缓存。我们可以比较一下,这些缓存和在移动设备上通过MobileService对象生成的缓存是一样的。换句话说, 在部署的时候将这些缓存部署到缓存目录以后,MobileService可以直接打开它,无需与服务器进行任何交互。


Mobile Basemap

这 是Mobile的特殊数据,目的在于通过对地图数据进行高度压缩,使之在移动设备上的性能更加优化。Basemap与我们前面使用的Mobile地图服务 数据不同,Basemap是不提供用户进行操作的,它将在程序运行时首先被渲染,其他所有的Mobile地图都将在它之上绘制——简单地说,它应该被称为 底图。

创建Mobile Basemap很简单,我们从ArcToolbox中点击“Create Mobile Basemap”,根据提示操作即可。一个mxd文档对应一个navmap文件,每个图层也都有相应的对应文件。

在ArcGIS Mobile中,有个专门的命名空间“ESRI.ArcGIS.Mobile.SdcData”,这个命名空间包括了所有对Basemap进行操作的类。事实上,Mobile Basemap对应的数据叫做SDC base map data。

Basemap的使用非常简单:

try
{
ESRI.ArcGIS.Mobile.SdcData.SdcMapLayer sdcMapLayer = new ESRI.ArcGIS.Mobile.SdcData.SdcMapLayer(@"\Storage Card\bj_basemap\bj.navmap");
map.MapLayers.Add(sdcMapLayer);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

看一下效果。我们把整个北京地图生成了Basemap预先部署到移动设备上,而仅仅将建筑物图层发布成地图服务,如图,Basemap自动衬在底部,想一下,对于某些应用,你会不会有一种把所有不经常变化的内容全部生成Basemap的冲动?

哦,还需要说明一下,Basemap和其他Mobile 地图服务的空间参考需要是一致的。

开发移动桌面程序

说是移动桌面程序,跟不移动的桌面程序有区别么?所以,这一部分需要说的内容实在太少了,在移动设备上开发调试都可以过来了,桌面程序还有困难么?

当然,还是有一点点小地方需要注意。比如新建工程,一定不要采用默认设置.Net Framework为3.5版本。

常见问题

以下是Develop Help中提到的一些常见问题:

1. ArcGIS 9.3的Mobile SDK是否使用ArcGIS 9.2发布的Mobile Service
很遗憾,不能……

2. 我能用Visual Studio 2003开发ArcGIS Mobile应用吗?
不能,ArcGIS 9.3 Mobile SDK需要.Net Compact Framework 2.0支持。

3. 我生成了Mobile应用,但是为什么我看不到地图?
出现这个问题,如果你使用了地图缓存,检查你的缓存路径是否正确。如果是从服务器获取数据,那么检查你的Mobile 地图服务是否正常工作。同时,确认你的Map控件的Datasource属性中的MobileService对象设置正确。

4. 为什么ArcGIS Mobile toolbox没被添加到Visual Studio 2008工程中来?
ArcGIS 9.3 Mobile SDK不能和.Net (Compact) Framework 3.5兼容,这是Visual Studio 2008的默认设置,注意在新建工程的时候选择正确的.Net Framework。

5. 如何获得开发ArcGIS Mobile应用的最新信息?
http://edn.esri.com/index.cfm?fa=mobile.gateway

【结 语】好了,到这里,ArcGIS Mobile SDK 9.3的整体内容已经基本介绍完成。ArcGIS Mobile作为ArcGIS Server的一部分发布,其与ArcGIS Server也的确是紧密相连。当然,事实上在某些条件下,ArcGIS Mobile还是可以脱离ArcGIS Server跑起来的。希望本文能给你开发移动GIS应用带来一点帮助!

2008年8月14日星期四

使用ArcGIS Mobile SDK 9.3 开发移动设备应用-中级篇


【概述】概述如何通过ArcGIS Server 9.3提供的Mobile SDK开发移动设备应用。

【环境】Windows XP SP3,ArcGIS Server 9.3,Visual Studio 2008,Windows Mobile 6 Professional SDK

ScaleBar控件

ScaleBar 兼有比例尺和进度条的功能。ScaleBar对象同时和Map和MobileService对象关联,与Map的关联可以显示当前地图的比例大小,与 MobileService的关联可以显示当前设备从服务器同步数据的进程。当然,你也可以把ScaleBar与MobileService对象的关联去 除掉,好让ScaleBar显得更加纯粹一点。


空间参考

空 间参考(Spatial Reference)是GIS的一个非常重要的组成部分,空间参考包括地理坐标系和投影坐标系。我们通过MobileService获得地图是有空间参考 的,但是,在移动设备上,有时候还需要将一些坐标点(比如GPS信息)标注到地图上,这时就还需要进行空间参考的处理。

以下代码表现的是如何将一个GPS经纬度坐标(WGS84)转化为一个当前空间参考下的坐标值。是不是很简单?

double lat = 40.123456;
double lon = 116.123456;
ESRI.ArcGIS.Mobile.SpatialReferences.SpatialReference spatialReference = mobileService.SpatialReference;
ESRI.ArcGIS.Mobile.Geometries.Coordinate coordinate = spatialReference.FromWgs84(lon, lat);

GPS支持

ArcGIS Mobile提供了3个GPS相关的控件对GPS进行支持:

  • FileGpsConnection
  • SerialPortGpsConnection
  • GpsDisplay

对 名称的第一印象我们就可以大概知道,FileGpsConnection可以提供文件GPS连接,在调试中可能使用比较 多;SerialPortGpsConnection则提供串口GPS连接,实际应用一般都会用到;GpsDisplay和上述两种 GpsConnection联动,实现GPS信息在地图上的表现。

在没有GPS设备的时候,我们先使用 FileGpsConnection进行调试。FileGpsConnection的原理就是从一个包含GPS数据的文本文件,模拟一个GPS连接。当 然,首先需要准备一个GPS文件,这个文件手写是写不出来的,获得的最便捷的方法是安装Windows Mobile 6 Professional SDK的FakeGPS工具(“%WINDOWS_MOBILE_6_SDK_HOME%\Tools\GPS”),其中包含有GPS数据文件。我把 “fakegpsdata.txt”文件复制到“\Storage Card”目录下,再给FileGpsConnection对象指定FileName属性为“\Storage Card\fakegpsdata.txt”。

我们在菜单上新建两个菜单项,用以打开关闭GPS连接:

private void menuItemOpenGpsConn_Click(object sender, EventArgs e)
{
this.fileGpsConnection.Open();
}

private void menuItemCloseGpsConn_Click(object sender, EventArgs e)
{
this.fileGpsConnection.Close();
}

GpsDisplay有一个AutoPan属性默认设为了true,现在让我们打开GPS连接,看看我们的地图,是不是自动移动了?

其实,这个时候我们完全可以不用GpsDisplay,而直接通过GpsConnection做任何事情。我们给FileGpsConnnection添加一个消息响应函数,每次GPS位置点改变了就触发一次:

private ESRI.ArcGIS.Mobile.Geometries.Point gpsLocation;

private void fileGpsConnection_GpsChanged(object sender, EventArgs e)
{
double lat = this.fileGpsConnection.Latitude;
double lon = this.fileGpsConnection.Longitude;
if (!(lat >= -90 && lat <= 90)) return;
if (!(lon >= -180 && lon <= 180)) return;

ESRI.ArcGIS.Mobile.SpatialReferences.SpatialReference spatialReference = mobileService.SpatialReference;
ESRI.ArcGIS.Mobile.Geometries.Coordinate coordinate = spatialReference.FromWgs84(lon, lat);

gpsLocation = new ESRI.ArcGIS.Mobile.Geometries.Point(coordinate);
this.map.CenterAt(coordinate);
}

private void map_Paint(object sender, ESRI.ArcGIS.Mobile.MapPaintEventArgs e)
{
if (gpsLocation == null || gpsLocation.IsEmpty) return;
e.Display.DrawPoint(new Pen(Color.Blue), new SolidBrush(Color.Red), 5, gpsLocation);
}

看一下实际效果:


离线编辑功能

ArcGIS Mobile的编辑功能可以在离线状态下使用,当然,前提要有空间数据缓存。要使用ArcGIS Mobile的编辑功能,首先需要在Map对象中添加一个或者几个sketchGraphicLayer对象,我们的编辑将会在这些图层上进行。

如果有必要,我们还可以针对Map的其它设置作一些改变,比如捕捉:

和地图浏览的Action类似,我们还需要给Map添加一些编辑的Action:

好,下面我们试着在sketchGraphicLayer上添加一个多边形:

private void menuItemAdd_Click(object sender, EventArgs e)
{
this.map.CurrentMapAction = this.map.MapActions[3];
ESRI.ArcGIS.Mobile.Sketch.SketchGraphicLayer sketchGraphicLayer = (this.map.MapGraphicLayers[0]) as ESRI.ArcGIS.Mobile.Sketch.SketchGraphicLayer;
sketchGraphicLayer.Geometry = new ESRI.ArcGIS.Mobile.Geometries.Polygon();
}

现 在,当我们点击了菜单中的“Add”菜单项以后,再在地图上点击就可以绘制一个多边形了。再尝试一下DeleteVetexSketchTool、 InsertVetexSketchTool、MoveVetexSketchTool(前提是先获得需要操作的Geometry对象),是不是发现对已 经画的对象进行修改也是很容易呢?

当然,接着马上要做的事情就是保存刚才所作的编辑,写程序的大多都有Ctrl+S的好习惯。保存刚才的编辑到缓存图层是一件很容易的事情,看一下这段代码:

private void menuItemSave_Click(object sender, EventArgs e)
{
ESRI.ArcGIS.Mobile.MobileServices.FeatureLayer featureLayer = this.mobileService.Layers[0] as ESRI.ArcGIS.Mobile.MobileServices.FeatureLayer;
if (featureLayer.AllowNew)
{
ESRI.ArcGIS.Mobile.Sketch.SketchGraphicLayer sketchGraphicLayer = (this.map.MapGraphicLayers[0]) as ESRI.ArcGIS.Mobile.Sketch.SketchGraphicLayer;
ESRI.ArcGIS.Mobile.MobileServices.FeatureDataTable featureDataTable = featureLayer.GetDataTable();
ESRI.ArcGIS.Mobile.MobileServices.FeatureDataRow featureDataRow = featureDataTable.NewRow();
featureDataRow[featureLayer.GeometryColumnIndex] = sketchGraphicLayer.Geometry;
featureDataTable.Rows.Add(featureDataRow);
featureDataTable.SaveInFeatureLayer();
sketchGraphicLayer.Geometry = null;
}
}

在 这里还要废话几句,上面做的保存是将编辑保存在本地的缓存中,而不是保存到服务器。在保存之前,先使用了FeatureLayer对象的AllowNew 属性,这是一个GET访问器,可以获得图层是否允许保存编辑(添加要素)。如果你在调试程序的时候AllowNew是false,可能有几种原因:

l 图层不是SDE图层
l 图层没有Global ID(这是Mobile应用一个特殊的地方)

这个时候,你或许可以尝试这个方法:

在线上传编辑

在线上传编辑可以把在本地缓存上进行的编辑操作提交到服务器,使用方法很简单:

mobileService.PostFeaturesAsync("Update");

不过,由于SDE分别有针对不同数据库的版本,而各种不同的数据库也各自有很多不同版本,在这种对应关系下,出现各种诡异的问题都是有可能的。建议:暂时慎用这个功能。

异步请求和响应

在ArcGIS Mobile中,我们可以看到很多以Async结尾的方法,比如常用的GetFeatureDataAsync ()方法等等。从名称就可以看出来,这些方法会向服务器发送一个异步的请求,但是,请求何时完成,请求的结果如何,并不是由这个方法及其后续来处理。

对 异步请求结果的处理,可以通过MobileService对象的几个消息响应函数实现,主要包括RequestCompleted、 RequestProgressChanged等。当MobileService接收到了服务器发来的消息,表示请求有了反馈了,这些消息响应函数则被调 用,来实现后续的处理。

有个很自然的问题,我可能向服务器发送了很多种的请求,MobileService对象怎么来分辨接收到的反馈 属于谁呢?我们回头看一下Async方法的参数会发现,Async方法的参数中都有一个名叫 userState的object对象,这个对象用来表示Async请求发生时候的用户状态,也就是对请求进行了标识。

CatalogService控件

CatalogService 控件用以发现某个服务器上的Mobile服务。在ArcGIS Server服务器上,一个服务器下可以有若干个文件夹,一个文件夹下可以有若干个地图服务对象,每个地图服务对象提供1种以上地图服务(Mobile Access、WFS……)。CatalogService对象就可以把这个层次结构挖掘出来,并获得详细的信息。

获得文件夹:

catalogService.Url = http://wuyf-winxp/arcgis/services;
string[] folders = catalogService.GetFolders();

获得服务信息:

catalogService.Url = http://wuyf-winxp/arcgis/services/folder;
ESRI.ArcGIS.Mobile.CatalogServices.ServiceDescription[] serviceDescriptions = catalogService.GetServiceDescriptions();

好了,今天就到这里吧,欢迎关注本文的后续。

2008年8月13日星期三

使用ArcGIS Mobile SDK 9.3 开发移动设备应用-初级篇

【概述】概述如何通过ArcGIS Server 9.3提供的Mobile SDK开发移动设备应用。

【环境】Windows XP SP3,ArcGIS Server 9.3,Visual Studio 2008,Windows Mobile 6 Professional SDK

ArcGIS Mobile简介

随 着3G移动通讯时代的到来,移动设备开始扮演越来越重要的角色。包括各种智能手机、PDA、导航设备、平板电脑在内的各种移动终端,在人们生活和业务中发 挥越来越重要的作用。对于移动设备来说,构建其上的GIS应用天生与目前基本属于移动设备标准配置的GPS关系密切;同时,有了3G高速带宽的支 持,GIS在移动设备上的各种应用,也能够凭借互联网的东风,扶摇直上。这个时候,ArcPad以及其它很多嵌入式GIS开发工具已经不能满足这样的需求 了,ArcGIS Mobile应运而生。

ArcGIS Mobile开发的应用,不仅支持在线应用,它同时也支持离线应用。在应用程序有可用的网络使用时,ArcGIS Mobile应用可以在线同步更新数据,并下载到本地设备上作为缓存;当网络暂时不可用时,ArcGIS Mobile应用同样可以通过操作缓存数据来使用;甚至在应用部署的时候,我们可以预先生成缓存直接部署到目标设备上。这种灵活的模式使ArcGIS Mobile应用在移动环境下有着非常好的伸缩性。

通过SDK我可以做什么?

通过ArcGIS Mobile SDK,我们可以实现以下一些主要功能:

1. 浏览空间数据
2. 捕捉、标注GPS位置
3. 创建或更新点、线、面等要素
4. 通过ADO.Net编辑表格数据
5. 自动从GIS服务器同步更新数据

我们看到,以上的这些功能,基本上已经可以满足移动GIS应用的需求了。那么我们再来看一看从整体流程上如何创建一个移动应用。

从上图我们可以看到,通过ArcGIS Mobile创建一个移动应用大体可以通过这几个步骤完成:

1. 在ArcGIS Desktop中设计创建地图
2. 将地图通过ArcGIS Server发布
3. 使用ArcGIS Mobile SDK创建移动应用程序
4. 将程序部署到目标设备上

是不是很简单?对于了解并熟悉ArcGIS Server和.Net程序开发的人来说,开发移动应用无非是换了一个开发环境——在ArcGIS Server强大的支持下,万变不离其宗。

好,让我们开始开发我们的第一个ArcGIS Mobile应用吧!

准备数据并发布服务

对 于熟悉ArcGIS Desktop和ArcGIS Server的人来说,这和桌面应用的数据准备没有任何区别。我们首先使用ArcMap进行地图的组织,然后通过ArcCatalog或者ArcGIS Server Manager将这个地图发布成服务,只需注意,为了支持我们的移动应用,在发布服务时,选中“Mobile Data Access”。

我们在移动设备上使用的地图服务一般应该是如下的这种URL形式:
http:///arcgis/services//MapServer/MobileServer

支持的设备平台

ArcGIS Mobile 9.3支持以下这些智能设备平台:

  • Windows Mobile 6 Professional
  • Windows Mobile 6 Standard
  • Windows Mobile 5 Pocket PC
  • Windows Mobile 5 Smartphone
  • Windows Mobile 2003
  • Windows CE .NET 5.0

以 上这些移动设备平台SDK都可以在微软的网站上免费下载。另外需要说明的是,除了这些智能设备,ArcGIS Mobile支持完整的.Net框架,因此ArcGIS Mobile也支持开发能够在Ultra-Mobile PC(超便携移动个人电脑,操作系统可能包括Windows XP、Windows XP Tablet PC edition和Windows Vista)上运行的桌面程序。当然,在进行开发之前,你首先需要确定你的应用最终是要部署到哪里的,为智能设备开发的应用和为PC开发的应用是不能通用 的。

使设备联网

如今我们的移动应用大部分都要整合到Internet中去,形成 MID(Mobile Internet Device)应用。ArcGIS Mobile也需要Internet与ArcGIS Server进行同步和交互,所以,我们需要首先想办法让我们的设备能够联网。

关于使模拟器上网,你可以在Google搜索“模拟器 上网”,有很多可供参考的材料。这里选择的是适合只有一个IP地址的上网方法:通过ActiveSync连接PC上网。

1. 打开ActiveSync ,点击“文件”—>“连接设置”,在“允许连接到以下其中一个端口”下选择“DMA”。

2. 打开Visual Studio,点击菜单“工具”—>“设备仿真管理器”,选择模拟器,在右键菜单中点击“连接”。等模拟器启动后,再点击“插入底座”(Cradle),此时,通过ActiveSync来连接到模拟器,并进行数据同步。

3. 在模拟器中,点击“开始”—>“设置”,点击“连接”选项卡。
(1)选择“网卡”-“我的网卡连接到”选“默认单位设置”。在 “点击适配器以修改设置:”下面选“AsyncMac NDISWAN Miniport”,选中“使用服务器分配的IP地址”,点击右上角的“ok”,连续确认后结束设置。
(2)在“连接”选项卡中选择“连接”。在“高级”选项卡中,点击“选择网络”,在“在程序自动连接到Internet时,使用:”下面选“单位设置”(默认是“Internet设置”),然后,连续点击右上角的“ok”确认设置。

4. 在“设备仿真器管理器”中选中该模拟器,先点击右键菜单中的“移除底座”,再点击“插入底座”,重新与ActiveSync连接一次后就可以上网了。打开浏览器,输入Google的网址,它还很智能唉,自动跳转到布局比较小的Mobile页面上去了。

测试Mobile服务和设备连接情况

在 正式动手开发我们的移动应用之前,先不要着急,我们还没有检查我们的Mobile服务是否正常,我们也没有检查设备能否通过网络连接到GIS服务器,获得 Mobile地图数据。所以,最好还是先测试一下看看效果再说。但是,我们还没有开发任何一个哪怕“Hello World”程序,怎么测试呢?

ArcGIS Mobile想得很周到,你从浏览器打开ArcGIS Server Manager可以看到,首页很醒目的一个选项是“Create a mobile project”。跟Web程序很类似,通过这个向导我们可以快速地生成一个Mobile应用。

哦,这里插播一句,如果你对智能设备调试比较熟悉的话,你也可以使用Sample程序(比如:
“%ARCGIS_HOME%\DeveloperKit\SamplesNET\Server\Mobile_Applications\MapViewer_PPC05CSharp.zip”)来测试,效果也很不错的。

这 个向导很简单,无非根据一些提示选择一些数据源,一路next而已。套用一句书面语:“此处不再赘述”——听说有一部明朝历史剧,愣是能把一个太监泡茶拍 了小半集,我想如果是我看一定会睡着的。OK,新建完成以后我们再点击“View Mobile Project via the web”,在跳转的页面中点击“ArcGIS Mobile Application”,下载“ArcGISMobile.cab”到本地。这个cab文件可以在设备中进行安装,跟PC上经常出场的 “Setup.exe”类似。这这里,我这个应用的名称叫“WuMobileMap”。



我 们的阵地要转移到模拟器上了,当然,目前为止这个可爱的“ArcGISMobile.cab”文件还在PC硬盘上,先想办法给挪到设备上去。这个很简单, 在模拟器菜单“File”->“Configure…”中设置“Share folder”到你PC上的一个目录,这个目录就好像一张存储卡一样插到设备中去了。



好 了,一切完成以后,我们可以从模拟器的资源管理器中找到“Storage Card”,运行上面的那个cab文件,把ArcGIS Mobile Application安装到设备上。OK,运行它!它会提示你需要你指定一下下载应用的位置,我输入了我的机器名和arcgis服务名称,在这个位置, 程序可以找到我们刚刚生成的Mobile应用“WuMobileMap”。



再继续,不出意外的话,我们很快就看到了服务器上发布地图。嗯,证明了服务和连接都没有问题。

新建项目

从这里开始,我们从零开始构建我们自己的移动设备应用,这才是我们的目的所在。

新建一个Smart Device项目,选择目标平台,这里选择的是Windows Mobile 5 Pocket PC。同时,选择.Net框架版本为2.0 。



点击确定按钮以后,经过短暂的等待(多短暂视你的机器强劲程度),和桌面应用开发一样,我们看到项目解决方案里面有一些自动生成的文件和目录,仔细一看,竟然还有一个Form1,看名字就是那么的熟悉!看,这和桌面开发有什么区别?

有个地方值得我们稍微注意一下,看下图的下拉框:


这 个下拉框包括了所有你可用的目标设备(视你安装了多少个智能设备SDK),最后以Emulator结尾的表明是模拟器,如果你手边没有一个真实的智能设 备,那当然要选择模拟器进行开发;显然,还有一个选项是为真实设备准备的,如果你手头有一个真实的智能设备,并且这个设备已经成功地和电脑连接,那么你可 以选择这个直接在机器上开发。

上面的Square表示模拟器的屏幕是方形的,当然,对应的还有长方形的,一般来说是4:3,比如 320×240像素大小。这个通常在模拟器名称上可以看出来。对于计算机屏幕大小还有一些术语,比如VGA、QVGA等等,等你看到的时候,适时 Google一下就知道了。

最后再唠叨一句,如果你开发的是中文程序(废话…),最好还是要下载一个中文版的模拟镜像装上,要不然在调试的时候中文内容只能看到方块字(是真的方块字,每个字都是一个方块…)是一件很郁闷的事情。

Windows Mobile 6 Professional SDK
http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Professional%20SDK%20Refresh.msi

Windows Mobile 6 Professional中文镜像:
http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Professional%20Images%20(CHS).msi

好了,调试一下,在模拟器中我们可以看到一个空白的窗体,表明我们的工程创建成功了。好了,这个模拟器你可以放在那里不要关掉,好节省它每次启动花费的时间。

顺便打开Toolbox(工具箱)看看,在ArcGIS Mobile Controls选项卡下可以看到ArcGIS Mobile SDK提供的若干开发控件。让我们还是从听名字就最熟悉的Map控件开始吧……

Map控件

和 桌面程序类似,Map控件提供了对地图内容进行管理和控制的功能。当我们给窗体添加了一个Map对象时,我们可以发现Map自动绑定了一个 MobileService对象,在ArcGIS Mobile中,地图内容通过MobileService控件获得和发送,Map则主要负责表现。MobileService对象同时还能够管理缓存。

我们指定MobileService对象的Url属性为上面发布的Mobile地图服务地址:http://wuyf-winxp/arcgis/services/California/MapServer/MobileServer

接 下来,我们需要给Map控件指定若干操作,比如平移、缩放等等。这可以在Map控件的MapActions集合中进行设置,这里首先先添加 PanMapAction、ZoomInMapAction等几个基本操作。在我们预先设定的工具条按钮上(当然,如果你喜欢使用菜单也是一样的),将每 个按钮的点击事件设定到对应的地图操作上去。我是这样做的(每个按钮设置一个Tag):

private void toolBar_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
{
this.map.CurrentMapAction = this.map.MapActions[Convert.ToInt32(e.Button.Tag)];
}

好 了,Map控件的基本雏形完成,万事俱备、只欠东风,只要有数据过来,我们就可以渲染出来,并且进行操作了。让我们想一想现在我们有什么,还需要什么。我 们有的就是这个Map对象和在服务器上发布的Mobile地图服务,显然,要想显示地图,我们还需要把Mobile服务的数据下载到本地设备上来,好,这 就是我们剩下的目标。

对于第一个应用,本地设备上没有缓存,需要首先初始化缓存的目录(btw:智能设备上的目录结构和PC不同,它有一个根目录,所有文件在这个根目录下组织,比如“\Storage Card\cache”),在此基础上打开缓存,用以接受数据。

这一切都完成以后,程序就要告诉服务器,嗨,把数据发过来了。好的,我现在需要获得所有的Feature,那么就用MobileService的GetFeatureDataAsync方法通知服务器,服务器很聪明的把结果全部给你返回过来。

以上这一切,我都让它在窗体的Load事件中完成。

private void FormMain_Load(object sender, EventArgs e)
{
this.mobileService.CacheStoragePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\WuMobileMap_Cache";

if (!this.mobileService.IsValid)
return;

if (this.mobileService != null && this.mobileService.IsOpen)
this.mobileService.Close();

try
{
this.mobileService.Open
(ESRI.ArcGIS.Mobile.MobileServices.CacheOpenMode.Create);
this.mobileService.GetFeatureDataAsync(map, false, "GetFeatures");
}
Catch{}
}

好了,我们现在已经可以浏览地图了,运行一下,看看我们的成果:

到这里,可以算完成了一个简单似“Hello World”的移动GIS应用了。在本文的后续,将对ArcGIS Mobile的其他功能开始展开叙述,本篇先暂告一段落:)

在Google blogger的日志备份2

08/13/2008 06:28 PM 使用ArcGIS Mobile SDK 9.3 开发移动设备应用-初级篇 【概述】概述如何通过ArcGIS Server 9.3提供的Mobile SDK开发移动设备应用。 【环境】Windows XP SP3,ArcGIS Server 9.3,Visual Studio 2008,Windows Mobile 6 Professional SDK ArcGIS Mobile简介 随着3G移动通讯时代的到来,移动设备开始扮演越来越重要的角色。包括各种智能手机、PDA、导航设备、平板电脑在内的各种移动终端,在人们生活和业务中发挥越来越重要的作用。对于移动设备来说,构建其上的GIS应用天生与目前基本属于移动设备标准配置的GPS关系密切;同时,有了3G高速带宽的支持,GIS在移动设备上的各种应用,也能够凭借互联网的东风,扶摇直上。这个时候,ArcPad以及其它很多嵌入式GIS 开发工具已经不能满足这样的需求了,ArcGIS Mobile应运而生。 ArcGIS Mobile开发的应用,不仅支持在线应用,它同时也支持离线应用。在应用

2008年8月12日星期二

本地化ArcGIS Server 9.3 Java ADF应用


【概述】叙述如何本地化ArcGIS Server 9.3的Java ADF应用,以NetBeans为例。
【环境】Windows XP SP2,ArcGIS Server 9.3,NetBeans 6.1

新建本地资源文件

1. 在应用的web目录下找到资源文件目录“./WEB_INF/classes/res/*.properties”,右键选择“Add Locale…”

2. 以添加简体中文为例,选择zh-CN,点击完成,我们可以看到,在res目录下生成了一个与默认资源文件命名类似的新文件 “*_zh_CN.properties”

3. 新资源文件的内容与默认语言的内容相同,编辑它的内容,使之本地化

2008年8月2日星期六

ArcGIS Server 9.3性能初步测试

【概述】对ArcGIS Server 9.3的性能在不同配置和环境下进行初步的测试。
【环境】Windows XP SP2,ArcGIS Server 9.3,ApacheBench 2.0.40
【硬件】CPU:Duo T8100(双核2.1GHz,3MB二级缓存),内存:3G
【测 试数据】%ARCGISHOME%\DeveloperKit\SamplesNET\Server\data\California\ California.mxd 发布的Map Service,以ArcGIS Server Java WebADF模板程序浏览。

测试方法概述

测 试使用ApacheBench,统一设置超时为100ms(这个设置可能导致很多请求失败而不在统计范围,但是节约测试时间),假设测试模拟并发数为c, 总共测试请求数为n=20c,此数值在机器资源允许的情况下可能有所调整,以期获得更加准确、平均的数据。测试使用的是ADF程序,因此主要是 ArcGIS Server 9.3在ADF访问下的性能。

由于测试本机并非服务器,同时运行若干应用程序,因此硬件性能有所折损,测试前的CPU大概是90%空闲,可用内存大概为1.3G。

测试主要是探求各种配置对性能的影响趋势,数值结果其实需要具体情况具体分析。测试环境非常特殊,测试时间有限,因此结果只能供粗略的参考。

性能粗测

1. 完全默认设置

2. 使用缓存(Tiles Cache)

池最大实例数的影响

前提:最小实例数=1

1. 动态地图请求平均处理时间(ms)

2. 缓存地图请求平均处理时间(ms)

初步分析

本测试机器上:

1. 使用缓存与否对并发数的容量有了很大的提高。

2. 动态地图在20并发以下,缓存地图在50并发以下,性能比较平稳。

3. 增加池最大实例数对大并发应用性能提升明显。

4. 在平稳工作的状态下(本机动态地图20并发以下,缓存地图50并发以下),增加池最大实例数对性能没有很大影响。

2008年8月1日星期五

配置ArcGIS Server 9.3 Java开发环境(NetBeans)

【概述】叙述如何在Window下配置ArcGIS Server 9.3的Java开发环境(NetBeans)

【环境】Windows XP SP2,ArcGIS Server 9.3,NetBeans 6.1

先决条件

ArcGIS Server的Java开发首先需要安装Java Web服务器, ArcGIS Server 9.3支持的服务器种类有:
Apache Tomcat
IBM WebSphere
JBoss

这里采用的是Tomcat 6.0.16。

下载并安装NetBeans

ArcGIS Server 9.3支持的NetBeans版本为6.x,可以从NetBeans网站免费下载:http://download.netbeans.org/netbeans/6.1/final, NetBeans下载包的类型建议选择Web&J2EE(第一列)。

在 开始安装NetBeans时,首先会让你选择是否安装随NetBeans附带的应用服务器——GlashFish或Tomcat,我使用的是 Tomcat,但是我在安装的时候还是都没有选择,因为我已经手动安装了Tomcat——如果你还没有安装,我也建议你先手动安装Tomcat,因为虽然 NetBeans打包的Tomcat有可以在NetBeans中进行启动的优点,但是,手动安装的也有它的好处——你可以对服务器有更好的控制。

安装ArcGIS插件

在 NetBeans主菜单中选择 工具->插件,选择“设置”选项卡,点击 “添加”按钮,添加插件升级路径:“http://downloads.esri.com/edn/java/plugins/netbeans/v93 /updates.xml”,ok,接下来按照提示操作就可以了。

安装成功的话,在“插件”选项卡可以看到ESRI ArcGIS Java ADF web controls NetBeans Module的内容。



新建项目进行环境测试

1. 在NetBeans主工具条点击“新建项目”,选择“Web应用程序”。

2. 按照NetBeans提示进行操作,在选择框架这一步注意选中“ESRI Web Java ADF 9.3”,并设置数据源。

3. 注意运行项目前先启动Java Web服务器。

4. 运行项目,出现如下界面,表示项目部署运行成功。