1、mobile app应该考虑的事情
1、网速。Android移动设备通常使用3G等低速网络,比之WIFI或者有线速度都要慢,过多的网络请求会导致程序“不响应”,因此降低用户体验,因此需要谨慎的考虑总数据量记忆网络请求数。如,a single large request for data rather than multiple small requests更有效率。 2、本地存储。由于移动应用并不是随时访问网络,对于有些在特定时刻才需要网络(如同步)的app,需要先将数据缓存在本地,因此,本地的缓存设计需要好好考虑。
3、设备限制。移动设备的性能不像PC机,处理器和内存资源都更少,因此复杂的JSON请求会导致app变慢,所以移动应用的内存管理和资源占用方面需要好好设计;并且由于android支持多线程编程,故在县城的管理上也需要注意。
4、善于利用工具。Android开发工具有很多,如profiling memory, and viewing thread and network activity等,善用合适的工具可以让开发更加高效。
2、Map layer types
1、web maps
Web map并不是单独的图层,而是存储于arcgis online上的多个图层和服务的组合。每个Web map都有自己的uniform resource locator (URL)。Webmap不仅包含了各种图层,还包含了图层和地图的配置信息,如图层的透明度,图层名称,顺序,地图初始化范围等等, 它的优点在于:对于webmap的修改可以在应用程序和code之外进行。Arcgis for android中支持的Web map可以包含以下讨论的所有图层。
Webmap的id号在arcgis online 中打开该web map时就能看到:
http://yangtzue.maps.arcgis.com/home/item.html?id=186f9b54665242ecb37d92b5e9b7931a
加载“web map”:
// Load a webmap.
map = newMapView(this, web map url, \, \);
setContentView(map);
Displaying information using popups
PopupContainer是显示popups最主要的类,提供基本的UI和行为,它承载和管理多个PopupView对象来提供属性编辑、媒体显示、附件管理等等。 使用步骤:
1、实例化一个PopupContainer;
MapView map = ?;
PopupContainerpopupContainer = new PopupContainer(map.getContext());
2、将PopupViews添加到PopupContainer中;
3、显示PopupContainer
2、tiled map service layers
由类ArcGISTiledMapServiceLayer/BingMapsLayer来处理。
功能特点:切片都是事先做好,Tiled map service layers不能对图层中的数据进行更改,除非更新服务缓存,在arcgis for android中,也不允许对此类型的数据查询,通常用做底图使用。 性能特点:这个类型的图层是arcgis for android中相应请求最快的图层之一,它采用多个线程,通常是每个图片使用一个线程来处理请求和绘制图片,并且异步处理。
publicclass Test0731Activity extends Activity {
/** Called when the activity is first created. */ @Override
publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
map = (MapView)findViewById(R.id.mymap);
centerPt = newcom.esri.core.geometry.Point(116.454,40.122);
// centerPt = new com.esri.core.geometry.Point(12957870.0,4864380.0); txtv = (TextView)findViewById(R.id.textview1); }
map.centerAt(centerPt, true);
ArcGISLocalTiledLayer local = map.addLayer(local);
newArcGISLocalTiledLayer(\);
MapViewmap =null ; Point centerPt = null; TextViewtxtv = null;
3、dynamic map service layers
由类ArcGISDynamicMapServiceLayer/ArcGISImageServiceLayer处理,动态地图服务图层通常包含多个图层,这些图层由server根据请求来渲染并以raster image形式返回,并且返回的raster并不包含feature的额外信息。
它的功能特点:更新非常方便,并能及时呈现给用户,并且,图层的可视性可以改变,并且可以给图层添加单独的layer definition,并且图层的空间参考能改变,arcgis server为每个image动态投影。而map的空间参考是由第一个加载的图层决定。
性能特点:它的渲染时间取决于请求数据的数量和复杂度,因此一般都比tiled map server要慢,因此,它适合数据经常发生改变、或者需要针对不同的用户呈现不同的数据,且要素信息(如attributes,geometry,symbol等)不需要的情况。
4、Graphics layers
由类GraphicsLayer处理,GraphicsLayer是由应用程序来定义的图层,专门用来绘制要素。 功能特点:GraphicsLayer专门绘制有空间参考的要素,并不适合绘制non-geographical要素,如指北针或copyright text。可以用屏幕坐标来查询图层中的要素并且使用getGraphics()方法返回要素,并且支持设置图层比例尺。
性能特点:不推荐在graphics layer中存放太多的要素,但是,它有着不错的性能,并且是feature layer class的基类,如果必须要处理大量的要素,建议使用feature collection来存储在feature layer中。
5、feature layers
类包:com.esri.android.map.ags
由类ArcGISFeatureLayer来处理。该图层可以是空间图层,也可以是非空间的表,(The layer can be either a spatial layer or a non-spatial table.)该图层包含了很多要素的信息,每个要素都单独渲染,从ArcGIS Server feature service或者map service(此种feature layer不能编辑)中请求,并返回JSON格式的数据并绘制。
ArcGISFeatureLayer的使用示例如下:
// ArcGISFeatureLayer class is used to define the Layer that is added to the //MapView object.
MapView mv = new MapView(this);
mv.addLayer(new ArcGISFeatureLayer(url,MODE.SNAPSHOT));
setContentView(mv);
功能特点:该图层包含了要素最丰富的信息,因此与其它图层类型相比具有最丰富的功能,其中的每个要素都能被查询,和通过空间查询或者SQL语句过滤,它继承自GraphicsLayer,因此也具有该图层的所有操作。
性能特点:虽然需要一定的响应时间,如arcgis server处理请求的时间,请求返回的时间,渲染速度等,但仍然值得你使用它完成各种丰富的功能。
该图层有一些设定,这些设定能影响图层的性能,包括请求时间,返回大小、处理和响应时间等。(设置需要在图层initialized完成之后进行)
Out fields:可以通过outFields()方法来限制返回的属性字段的数量,可以减少网络传输和响应处理的时间;
Max Allowable offset:使用Max Allowable offset()方法可以限制要素返回的顶点数量,以地图单位设置的数值将用来在server返回要素之前简化要素的顶点,当你正在编辑要素时不应该使用此方法,可能会导致顶点丢失和topo关系的破坏。
Mode:ArcGISFeatureLayer class有3种mode,他们会显著影响其功能和性能:
Snapshot mode:快照模式能从server上快速取回要素,能减少响应时间,但如果图层包含大量、复杂的要素时,可能会导致设备停止响应,因为有大量的要素需要绘制,也会导致arcgis server达到它返回要素数量的上线。Arcgis server 9.3.1的默认限制是500,10.0是1000,当然,这个数据可以在server端进行配置。建议小数据量的dataset才使用snapshot mode。
On demand mode:On demand mode需要在客户端和服务器之间传递更多的请求,适合展示变化的数据,该mode适合包含复杂要素的大数据量的dataset,因为它只请求和返回需要的要素,不过,为图层设置比例尺限制仍然是有必要的。
Selection mode:该模式下,一开始并不向服务器请求任何要素,只有当选择集出现时,要素才被加载,这种mode适合于不需要将所有要素展示在客户端,而只是强调一些特殊的要素,如,有一个road图层,使用了feature layer不支持的自定义的符号,但是又需要对该图层进行web edit,此时,你可以使用一个dynamic map service layer和一个feature layer in selection mode,将需要编辑的road选择出来,以简单的符号绘制并存储在feature layer以实现编辑,当编辑完成后,清除选择并刷新dynamic map service来查看更新。
Feature collections:虽然算不上一种严格的类型,feature collections也称得上是另一种类型的feature layer:feature collection feature layer。它可以被认为是通过自定义的要素集创建的snapshot 类型的feature layer,它无需连接server,因为它只存在于客户端。ArcGISFeatureLayer class有一个重载的构造函数来创建这种类型的图层,它以featureset来存储要素,并且包含图层定义字符串,图层定义能被随意更改,但至少包括layer name、geometry type,coordinate system,fields和renderers。Featureset中的要素能通过代码创建,从其它类型的数据源转换,或者通过服务查询返回。该类型的图层能像feature layer一样进行空间查询,因为有local geometry engine,但不能使用applyEdit()方法。
Buffer factor:对于on demand mode的feature layer,可以设置buffer factor来获取某个范围内的要素,每次请求都会返回该范围内的要素。
3、feature service
Feature Service在互联网上提供要素,并且提供显示要素的符号.客户端可以执行查询以得到要素或者可以执行应用到服务器上的要素编辑. Feature service提供了能够增强客户端编辑体验的模板.关系表或者非空间表也可以使用Feature service进行查询和编辑. 图1
Feature services在ArcGIS for Server、ArcGIS Spatial Data Server和ArcGIS Online上均可使用,但是在ArcGIS for Server上的功能最强大,可以使用编辑追踪和使用geodatabase中的要素。Server的基础版也能发布feature service,但智能执行查询功能,不能进行web编辑。
Required steps for using a feature service
1、使用支持的平台如PostgreSQL, SQL Server, Oracle等建立企业级geodatabase数据库 2、准备mxd文档,编写feature server; 3、准备数据,完成数据注册,添加许可等操作;
4、将准备好的文档发布成map service并勾选“Feature Access”能力,发布feature service;