my name is barry
copy
Bookmark
http://blog.3snews.net/?barry
- 博客
- 相册
- 下载
- 书签
- 视频
- 圈子
- 好友
- 论坛
- 留言
- 更多
空间管理
您的位置: 3sNews博客 » my name is barry » 日志
发布新日志
- 我的日志 我的足迹 我的收藏
- ArcGIS application for iOS v1.8 发布
2011-03-04 15:06:39
http://www.giser.net/?p=266
ArcGIS application for iOS v1.8 已经正式发布,可以去appStore上下载:
http://itunes.com/apps/ArcGIS
v1.8最大的变化是对国际化语言的支持,简体中文版本也在其中。这次发布总共有5种国际语言版本,分别是:
法语
德语
西班牙语
日语
简体中文
其中在AppStore的中国商店种下载到的将是简体中文版本,感兴趣的同学们可以去下载体验,免费的。
http://www.giser.net/?p=266
查看(100) 评论(0) 收藏 分享 圈子 管理 - ArcGIS API for iOS 中的几何对象
2011-03-01 14:38:28
http://www.giser.net/?p=262
ArcGIS API for iOS 中的几何对象
ArcGIS API for iOS包含5种轻量级的几何对象类,这些类用来在地图上显示几何对象的形状,同时可以传送给ArcGIS Server用来进行空间分析。虽然ArcGIS Desktop支持3D几何坐标(x,y,z),但ArcGIS API for iOS只支持2D几何坐标(x,y),并且对M值和ID值也暂不支持。
1 ArcGIS API for iOS中的五种基本几何类型为:
point
Multipoint
polyline
polygon
Envelope
2 ArcGIS API for iOS 中的几何对象都具有空间参考属性,并可以 通过两种方式来定义:
well-known ID (WKID)
well-known text (WKT)
3 可变与不可变对象
Objective-C中的对象都有两种,即可变与不可变对象,可变对象可以用来编辑,不可变对象不能够编辑,因此ArcGIS API for iOS 中的几何对象也存在可变与不可变对象,对照表如下:
Geometry type Immutable object Mutable object
Point AGSPoint AGSMutablePoint
Multipoint AGSMultipoint AGSMutableMultipoint
Polyline AGSPolyline AGSMutablePolyline
Polygon AGSPolygon AGSMutablePolygon
Envelope AGSEnvelope AGSMutableEnvelope
在ArcGIS Server发布的web服务中返回的几何对象绝大多数为不可变对象,但是可以通过使用mutableCopy 方法方便的将不可变对象转换成为可变对象,示例代码如下:
AGSPoint* point = …;
AGSMutablePoint* mutable = [point mutableCopy];
[mutable updateWithX:20 y:20];
4 点对象(Point)
点对象的构造方法比较简单,只有x,y坐标和参考系信息,如下:
AGSPoint* point = [AGSPoint pointWithX:10 y:10 spatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];
5 多点对象(Multipoint)
多点是点对象的集合,同时具有空间参考信息,构造方法如下:
AGSMutableMultipoint multiPoint = [[AGSMutableMultipoint alloc] initWithSpatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];
[multiPoint addPoint: [AGSPoint pointWithX:10 y:10 spatialReference:nil]];
[multiPoint addPoint: [AGSPoint pointWithX:20 y:20 spatialReference:nil]];
[multiPoint addPoint: [AGSPoint pointWithX:30 y:30 spatialReference:nil]];
6 线(Polyline)
线是由path组成,path是连续的线段,同时具有空间参考信息,构造方法如下:
AGSMutablePolyline* poly = [[AGSMutablePolyline alloc] initWithSpatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];
[poly addPathToPolyline];
[poly addPointToPath:[AGSPoint pointWithX:10 y:10 spatialReference:nil]];
[poly addPointToPath:[AGSPoint pointWithX:30 y:10 spatialReference:nil]];
[poly addPointToPath:[AGSPoint pointWithX:30 y:30 spatialReference:nil]];
[poly addPathToPolyline];
[poly addPointToPath:[AGSPoint pointWithX:20 y:10 spatialReference:nil]];
[poly addPointToPath:[AGSPoint pointWithX:20 y:-10 spatialReference:nil]];
7 多边形(polygon)
多边形对象由环(ring)组成,ring是连续闭合的线段,同时具有空间参考信息,构造方法如下:
AGSMutablePolygon* poly = [[AGSMutablePolygon alloc] initWithSpatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];
[poly addRingToPolygon];
[poly addPointToRing:[AGSPoint pointWithX:10 y:10 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:30 y:10 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:30 y:30 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:10 y:30 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:10 y:10 spatialReference:nil]];
[poly addRingToPolygon];
[poly addPointToRing:[AGSPoint pointWithX:-10 y:-10 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:-30 y:-10 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:-30 y:-30 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:-10 y:-30 spatialReference:nil]];
[poly addPointToRing:[AGSPoint pointWithX:-10 y:-10 spatialReference:nil]];
8 矩形对象
矩形对象存储两对坐标,分别为(xmin,ymin)和(xmax,ymax),同时具有空间参考信息,存储范围信息,构造方法如下:
AGSEnvelope env = [AGSEnvelope envelopeWithXmin:10 ymin:10 xmax:30 ymax:30 spatialReference:[AGSSpatialReference spatialReferenceWithWKID:4326 WKT:nil]];
9 几何对象与JSON
ArcGIS API for iOS 中的几何对象提供了从JSON格式文本构造的方法initWithJSON,和将几何对象转换成JSON格式的方法encodeToJSON,使用方法如下:
// from json to object
NSString* jsonPoint = @”{ \”x\” : -118.4 , \”y\” : -45.2 , \”spatialReference\” : {\”wkid\” : 4326} }”;
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSDictionary *json = [parser objectWithString:jsonPoint];
AGSPoint* point = [[AGSPoint alloc] initWithJSON:json];
// from object to json
NSDictionary *json = [point encodeToJSON];
SBJsonWriter *writer = [[SBJsonWriter alloc] init];
NSString* jsonPoint = [writer stringWithObject:json];
参考资料:http://help.arcgis.com/en/arcgismobile/10.0/apis/iPhone/concepts/index.html#/Geometry_Objects/00pw0000004r000000/
http://www.giser.net/?p=262
查看(43) 评论(0) 收藏 分享 圈子 管理 - ArcGIS API for iOS v1.8 beta 发布
2011-02-28 20:04:16
提供的新功能包括下面特性:- a Sketch layer to easily create and edit geometries 编辑图层
- a magnifier for the map 放大镜
- a high-performance, native, Geometry Engine to perform. sophisticated geometric operations locally on the device 原生的高性能几个引擎,用于在设备本地进行几何操作
- support for web maps
- a new Route Task to generate point-to-point routes and driving directions using Network Analyst services. 网络分析支持
- support for map to wrap around the dateline
- enhanced callout customization including the ability to display custom views in the callout
- much more…
- 详细内容请参考:
http://blogs.esri.com/Dev/blogs/mobilecentral/archive/2011/02/25/ArcGIS-API-for-iOS-v1.8-Beta-is-live_2100_.aspx
查看(16) 评论(0) 收藏 分享 圈子 管理 - 大众信息分享系统 ipad应用演示视频
2011-02-23 09:14:44
http://www.giser.net/?p=254
大众信息分享系统 ipad应用是为Esri 2010年用户大会开发的一个应用。该应用基于ArcGIS API for iOS开发,提供了基于地理位置的大众信息分享的功能,包图片,文字,链接等。同时还提供了关注度分析的功能,对热点事件进行分析。
演示视频地址:
http://tm.esrichina-bj.cn/tm/video/?p=262
更多演示视频请关注ArcGIS群英萃网站.
ArcGIS群英萃新浪微博地址:
http://t.sina.com.cn/esritm
查看(39) 评论(0) 收藏 分享 圈子 管理 - ShapeFile格式的白皮书
2011-01-24 11:44:30
原文地址:
http://www.giser.net/?p=240
ESRI Shapefile(shp)是Esri公司开发的空间数据开放格式。该文件格式已经成为了地理信息软件界的一个开放标准,成为一个非常重要的交换数据格式,基本上所有的GIS软件都支持Shapefile的读写。
Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性。该种文件格式是由多个文件组成的:
* .shp – 用于保存元素的几何实体。
* .shx – 用于保存几何实体索引。
* .dbf – 数据库,用于保存关于元素的属性信息。
除了以上三个文件格式之外,还可以有其它文件的支持,这样能够优化访问数据库的性能:
* .sbn 和 .sbx – 保存实体的空间索引。
* .fbn 和 .fbx – 保存只读实体的空间索引。
* .ain 和 .aih – 保存列表中活动字段的属性索引。
* .prj – 保存坐标系统信息。
* .shp.xml – 保存shapefile的元数据。
附件为ShapeFile格式的白皮书和扩展的shapeFile说明,在扩展的shapeFile中增加了multiPatch的说明。
有个这两个白皮书,我们就可以对shp文件进行深入的了解,也可以根据白皮书来实现对shp的读写。
ESRI_shapefile_technical_description
extended shapefile format
http://www.giser.net/?p=240
查看(68) 评论(1) 收藏 分享 圈子 管理 - ArcGIS API for iOS开发教程六 使用GP服务
2010-12-17 09:39:13
文章地址:
http://www.giser.net/?p=82
在本章中我们将以危险品扩散分析举例,来介绍如何在ArcGIS API for iOS中调用GP服务。
1、按照前几章介绍的步骤来创建一个基本的地图应用程序,命名为GPDemo。
2、按照【ArcGIS API for iOS开发之旅】Graphic Layer中的步骤,定义一个GraphicsLayer并添加到地图视图中。
3、打开GPDemoViewController.h文件,在声明中添加AGSMapViewDelegate和AGSGeoprocessorDelegate,代码如下所示:
@interface GPDemoViewController : UIViewController{
AGSMapView *mapView;
AGSGraphicsLayer *graphicsLayer;
}
4、 打开GPDemoViewController.m文件,实现AGSMapViewDelegate的 -(void)mapview:(AGSMapView *)mapView didClickAtPoint:(CGPoint)screen mapPoint:(AGSPoint *)mappoint graphics:(NSDictionary *)graphics方法。代码如下:
- (void)mapView:(AGSMapView *)mapViewdidClickAtPoint:(CGPoint)screen mapPoint:(AGSPoint *)mappoint graphics:(NSDictionary *)graphics
{
[self.graphicsLaye rremoveAllGraphics];
AGSPictureMarkerSymbol *pt = [AGSPictureMarkerSymbol pictureMarkerSymbolWithImageNamed:@"pushpin.png"];
// this offset is to line the symbol up with the map was actually clicked
pt.xoffset = 8;
pt.yoffset = -18;
// init pushpin with the AGSPictureMarkerSymbol we just created
AGSGraphic *pushpin = [[AGSGraphicalloc] initWithGeometry:mappoint symbol:pt attributes:nil infoTemplate:nil];
// add pushpin to graphics layer
[self.graphicsLayer addGraphic:pushpin];
// let the graphics layer know it needs to redraw
[pushpin release];
[self.graphicsLayer dataChanged];
AGSGeoprocessor *agp = [[AGSGeoprocesso ralloc] initWithURL:[NSURL URLWithString:kGPLayerURL]];
// set the delegate so we will be notified of delegate methods
agp.delegate = self;
// set the interval to check status to 10 seconds
agp.interval = 10;
agp.outputSpatialReference=self.mapView.spatialReference;
NSMutableArray *features = [[NSMutableArray alloc] init];
AGSGraphic *gra = [[AGSGraphicalloc] initWithGeometry:mappoint
symbol:nil
attributes:nil
infoTemplate:nil];
[features addObject:gra];
// get the parameters from the UI to submit
AGSFeatureSet *fs= [[[AGSFeatureSet alloc] init]initWithDisplayFieldName:nil
features:features
fieldAliases:nil
spatialReference:nil
geometryType:AGSGeometryPoint];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
@"Hydrogen sulfide",@"Material_Type",
@"45",@"Wind_Bearing__direction_blowing_to__0_-_360_",
@"Large",@"Large_or_Small_spill",
@"Day",@"Day_or_Night_incident",
fs, @"Incident_Point",
nil];
// submit the job
[agps ubmitJobWithParameters:params];
[agp release];
}
在上面代码中粗体部分定义了一个AGSGeoprocessor对象和参数,并使用异步方式调用。
5、实现AGSGeoprocessorDelegate中的方法,用来响应GP调用中以及调用结束后的方法,如下面代码:
- (void)geoprocessor:(AGSGeoprocessor *)geoprocessorwillCheckJobStatus:(NSString *)jobId {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
- (void)geoprocessor:(AGSGeoprocessor *)geoprocessordidCheckJobStatus:(NSString *)jobStatusforJob:(NSString *)jobId {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
- (void)geoprocessor:(AGSGeoprocessor *)geoprocessorjobDidFail:(NSString *)jobId status:(NSString *)jobStatus messages:(NSArray *)messages {
// update status
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"分析失败!"
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[alert release];
}
- (void)geoprocessor:(AGSGeoprocessor *)geoprocessorjobDidSucceed:(NSString *)jobId status:(NSString *)jobStatus messages:(NSArray *)messages {
NSLog(@"Job succeeded");
// query the resulting html
[geoprocessor queryResultData:jobId paramName:@"outerg_shp"];
}
- (void)geoprocessor:(AGSGeoprocessor *)geoprocessordidQueryWithResult:(AGSGeoprocessorParameterValue *)result forJob:(NSString *)jobId {
inti = 0;
intguideNum = 0;
AGSFeatureSet * fs = result.value;
for (i=0;i<[fs.features count]; i++) {
AGSGraphic *gra = [fs.features objectAtIndex:i];
guideNum = [[gra.attributes objectForKey:@"ERGZone"] intValue];
switch (guideNum) {
case1:
{
AGSSimpleFillSymbol *sfsZone1 =[AGSSimpleFillSymbo lsimpleFillSymbol] ;
sfsZone1.color=[UIColor colorWithRed:255 green:208 blue:255 alpha:0.5];
sfsZone1.style. = AGSSimpleFillSymbolStyleSolid;
gra.symbol = sfsZone1;
}
break;
case2:
{
AGSSimpleFillSymbol *sfsZone2 =[AGSSimpleFillSymbol simpleFillSymbol] ;
sfsZone2.style. = AGSSimpleFillSymbolStyleSolid;
sfsZone2.color=[UIColor colorWithRed:255 green:0 blue:0 alpha:0.5];
gra.symbol = sfsZone2;
}
break;
case3:
{
AGSSimpleFillSymbol *sfsZone3 =[AGSSimpleFillSymbol simpleFillSymbol] ;
sfsZone3.style. = AGSSimpleFillSymbolStyleSolid;
sfsZone3.color=[UIColor colorWithRed:0 green:0 blue:0 alpha:0];
gra.symbol = sfsZone3;
}
break;
default:
break;
}
[self.graphicsLayer addGraphic:gra];
}
[self.graphicsLayer dataChanged];
}
在 上面代码中,- (void)geoprocessor:(AGSGeoprocessor *)geoprocessorjobDidSucceed:(NSString *)jobId status:(NSString *)jobStatus messages:(NSArray *)messages 函数在GP服务提交成功后响应,我们在该函数中去获取GP分析的结果,使用如下代码:
[geoprocessorqueryResultData:jobIdparamName:@"outerg_shp"];
当获取结果成功后,会调用
- (void)geoprocessor:(AGSGeoprocessor *)geoprocessordidQueryWithResult:(AGSGeoprocessorParameterValue *)result forJob:(NSString *)jobId
方法,在该方法中,我们将得到的结果符号化后添加到graphicsLayer中。
6、通过上面几步操作,我们就完成了GP服务的使用,编译,运行,结果如下图:
代码下载: - http://tm.esrichina-bj.cn/tm/tech/?p=705
查看(46) 评论(1) 收藏 分享 圈子 管理- 成功使用ArcGIS API for iOS加载Google地图
2010-12-16 16:02:32
http://www.giser.net/?p=63
终于能够使用ArcGIS API for iOS加载Google地图,同样的道理我们还可以加载百度地图,mapabc ,mapbar,天地图等等国内的地图,这对国内用户来说在使用国内地图方面又提供了更多选择,当然要在取得国内地图服务商的授权情况下才能使用。
使用ArcGIS API for iOS加载Google地图的原理和flex API 以及silverlight API 加载Google的地图原理一样,主要是继承TileMapLayer,实现对不同数据源的访问,在ArcGIS API for ios中如何扩展TileMapLayer后面会有详细教程,这里就不多说了,先看两张图:
http://www.giser.net/?p=63
查看(155) 评论(1) 收藏 分享 圈子 管理 - ArcGIS API for Flex and ArcGIS Viewer for Flex 2.2 发布
2010-12-15 12:35:35
http://www.giser.net/?p=61
主要改进如下:
1 支持ArcGIS.com Web Maps
2 新的图例组建和图例widget
3 编辑的时候支持Undo/Redo
4 Draw, Data Extract, Query, Search, Static Image, and Time Slider等6个widget用户体验增强。
详细的更新请查看:
http://help.arcgis.com/en/webapi/flex/help/index.html#whats_new.htm
http://help.arcgis.com/en/webapps/flexviewer/help/index.html#whats_new.htm
http://www.giser.net/?p=61
查看(84) 评论(0) 收藏 分享 圈子 管理 - 【ArcGIS API for iOS开发教程(五)数据查询
2010-12-06 16:56:58
http://www.giser.net/?p=23 - 本文示例代码下载地址:http://tm.esrichina-bj.cn/tm/tech/?p=644
- 原文地址:http://tm.esrichina-bj.cn/tm/tech/?p=644
- 在大量数据及信息面前,如何获得符合自己所需的数据及信息是非常必要且重要的。同其他WebAPIs 一样,ArcGIS API for iOS中同样可以使用queryTask来进行数据查询,并且使用方式也一致。下面我们以一实例来进行详细介绍。
- 1、按照前几章介绍的步骤来创建一个基本的地图应用程序,这里我们将其命名为QueryDemo。
- 2、按照【ArcGIS API for iOS开发之旅】Graphic Layer中的步骤,定义一个GraphicsLayer并添加到地图视图中。
- 3、打开QueryDemoViewController.h文件。在QueryDemoViewController类中定义 AGSQueryTask对象和AGSQuery对象,并声明为QueryDemoViewController类的属性。此外,在声明中添加 AGSQueryTaskDelegate。代码如下
- @interface QueryDemoViewController: UIViewController
{ AGSMapView *mapview; AGSQueryTask *queryTask;AGSQuery *query;AGSGraphicsLayer *graphicsLayer;}@property(nonatomic, retain) IBOutlet AGSMapView *mapView;@property(nonatomic, retain) IBOutlet AGSQueryTask *queryTask;@property(nonatomic, retain) IBOutlet AGSQuery *query;@property(nonatomic, retain) IBOutlet AGSGraphicsLayer *graphicsLayer;
- @interface QueryDemoViewController: UIViewController
复制代码
4、打开QueryDemoViewController.m文件,完成queryTask和query的属性定义。代码如下- @implementation QueryDemoViewController@synthesize mapView;@synthesize queryTask;@synthesize query;@synthesize graphicsLayer;
复制代码
5、在viewDidLoad函数中,初始化queryTask和query,并执行查询操作。代码如下- -(void)viewDidLoad{ [super viewDidLoad]; self.mapView.mapViewDelegate = self; AGSTitledMapServiceLayer *tiledLayer = [[AGSTiledMapServiceLayer alloc]initWithURL:[NSURL URLWithString:kTiledMapServiceURL]]; [self.mapView addMapLayer:tiledLayer withName"Tiled Layer"]; [tiledLayer release]; self.graphicsLayer = [AGSGraphicsLayer graphicsLayer]; [self.mapView addMapLayer: self.graphicsLayer withName"graphicsLayer"]; NSString *countiesLayerURL = kMapServiceLayerURL; //set up query task against layer, specify the delegate self.queryTask = [AGSQueryTask queryTaskWithURL:[NSURL URLWithString:countiesLayerURL]; self.queryTask.delegate = self; //return all fields in query self.query = [AGSQuery query]; self.query.outFields = [NSArray arrayWithObjects"*",nil]; self.query.returnGeometry = YES; self.query.text = @"California"; [self.queryTask executeWithQuery:self.query]; }
复制代码
6、添加AGSQueryTaskDelegate中的查询响应函数。代码如下- // 在Query成功后响应,将查询结果显示到graphicsLayer上
- -(void)queryTask: (AGSQueryTask*) queryTask operationNSOperation*) opdidExecuteWithFeatureSetResultAGSFeatureSet*) featureSet{ //get feature, and load in to table Int i = 0; for(i=0; i<[featureSet.featurescount]; i++) { AGSSimpleFillSymbol *fillSym = [AGSSimpleFillSymbol simpleFillSymbol]; fillSym.style. = AGSSimpleFillSymbolStyleSolid; fillSym.color = [UIColororangeColor]; AGSGraphic *gra = [featureSet.features objectAtIndex:i]; gra.symbol = fillSym; [self.graphicsLayer addGraphic:gra]; } [self.graphicsLayer dataChanged]; } //if there's an error with the query display it to the uesr 在Query失败后响应,弹出错误提示框 -(void)queryTask: (AGSQueryTask*)queryTask operationNSOperation*)opdidFailWithErrorNSError*)error{ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; UIAlertView *alertView = [UIAlertView alloc]initWithTitle"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle"OK" otherButtonTitles:nil]; [alertView show]; [alertView release]; }
复制代码
7、编译、执行。结果如下图所示:
http://www.giser.net/?p=23
查看(231) 评论(2) 收藏 分享 圈子 管理- 推荐一个网站:ArcGIS 群英萃
2010-11-25 10:39:16
搞GIS的必须收藏的网站,你懂的
ArcGIS 群英萃 - http://tm.esrichina-bj.cn/
查看(139) 评论(4) 收藏 分享 圈子 管理- ArcGIS API for iOS开发教程四 使用GraphicsLayer
2010-11-11 08:36:12
原文地址: - http://tm.esrichina-bj.cn/tm/tech/?p=604
- 在前面的章节中,我们已经知道,如何在Apple OS设备上显示地图,不论动态地图服务还是静态地图服务,同时认识了ArcGIS API for iOS中的地图组件——MapView。同其他ArcGIS APIs类似,ArcGIS API for iOS同样也具有自定义数据的Graphics Layer。下面便来介绍在【ArcGIS API for iOS开发之旅】Hello,Map的地图上自定义数据添加的实现。 1、首先按照【ArcGIS API for iOS开发之旅】Hello,Map的新建地图应用程序的步骤创建一个名为GraphicsDemo的程序,同时将地图显示的前期工作准备好。
2、打开GraphicsDemoViewController.h文件,在GraphicsDemoViewController类中定 义AGSGraphicsLayer对象,并把这个定义声明为该类的属性。此外,在声明中添加对AGSMapViewDelegate的支持。代码如下 (绿色代码表示)
@interface GraphicsDemoViewController : UIViewController{
AGSMapView *_mapView;
//定义AGSGraphicsLayer对象
AGSGraphicsLayer *graphicsLayer;
//定义isAddPoint,是否增加点
BOOL isAddPoint;
}
@property (nonatomic, retain) IBOutlet AGSMapView *mapView;
//使用IBOutlet定义graphicsLayer
@property (nonatomic, retain) IBOutlet AGSGraphicsLayer *graphicsLayer;
- (IBAction)swithAddPoint:(id)sender;
@end
3、打开GraphicsDemoViewController.m文件,进行graphicsLayer属性的声明。代码如下(绿色表示)
@implementation GraphicsDemoViewController
@synthesize mapView = _mapView;
@synthesize graphicsLayer;
4、在GraphicsDemoViewController.m文件中找到viewDidLoad函数,将graphicsLayer添加到mapView中,并且设置mapView的mapViewDelegate为self。如下代码所示
- (void)viewDidLoad {
[superviewDidLoad];
self.mapView.mapViewDelegate = self;
AGSTiledMapServiceLayer *tiledLayer = [[AGSTiledMapServiceLayer alloc]
initWithURL:[NSURL URLWithString:kTiledMapServiceURL ]];
[self.mapView addMapLayer:tiledLayerwithName:@"Tiled Layer"];
[tiledLayer release];
self.graphicsLayer = [AGSGraphicsLayer graphicsLayer];
[self.mapView addMapLayer:self.graphicsLayer withName:@"graphicsLayer"];
isAddPoint = YES;
}
5、在GraphicsDemoViewController.m文件中添加如下代码,实现点击地图时触发的事件,也即在地图上添加自定义数据时触发的事件
- (void)mapView:(AGSMapView *)mapViewdidClickAtPoint:(CGPoint)screen mapPoint:(AGSPoint *)mappoint graphics:(NSDictionary *)graphics{
if (isAddPoint)
{
//定义一个图片符号 本例选用图钉图片
AGSPictureMarkerSymbol *pt = [AGSPictureMarkerSymbol pictureMarkerSymbol WithImageNamed:@"pushpin.png"];
// 定义图片在地图上的偏移量。默认是图片的左下角,需要进行偏移调整,将图片的中心放在地图上
pt.xoffset = 8;
pt.yoffset = -18;
//定义一个弹出气泡的模板
pointInfoTemplate *pointTemplate = [[pointInfoTemplate alloc] init];
AGSGraphic *pushpin = [[AGSGraphic alloc] initWithGeometry:mappoint symbol:pt attributes:nil infoTemplate:pointTemplate];
// 将图钉添加到Graphics Layer中
[self.graphicsLayer addGraphic:pushpin];
[pushpin release];
[pointTemplate release];
//刷新
[self.graphicsLayer dataChanged];
}
}
6、进行编译,运行。效果如图所示
源代码下载地址: - http://tm.esrichina-bj.cn/tm/tech/?p=604
查看(85) 评论(0) 收藏 分享 圈子 管理- 大众信息共享iPad客户端应用程序发布EventShare
2010-11-02 09:45:49
EventShare是一个基于地图的SNS应用,能够在地图上分享我们生活的点滴。 - EventShare是基于ArcGIS API for iOS开发的演示程序,目前只能在已经越狱的iPad上安装(iOS3.2以上),暂不支持iPhone,iPod Touch上安装,该程序只用于ArcGIS API for iOS技术演示,请勿用于其他用途。
- EventShare的主要功能包括:
- 1 地图的切换功能,包括四种基础底图(emapzone,bingmaps,1:400万地图以及etm影像地图)
- 2 生活点滴分享功能,支持四种类型的生活点滴信息的分享(文本,链接,图片,视频)
- 3 提供了查询功能,可以方便的找到感兴趣的话题
- 4 提供了在线的关注度分析功能
- 5 提供了历史浏览功能,可以使用翻页的动作来浏览过去大家分享的话题。
- 6 定位功能,可以快速定位到你所在的位置
- 安装方法:
- 1 下载附件中的eventShare.ipa
- 2 使用itunes打开(双击ipa文件即可)
- 3 同步到你的ipad中
- 4 也可以使用91助手等第三方软件安装
- 下载地址:
- EventShare.ipa
查看(79) 评论(2) 收藏 分享 圈子 管理- ArcGIS API for iOS开发教程三 使用MapView
2010-11-01 13:41:02
[ArcGIS API for iOS]Hello,Map里, 我们进行了如何添加并显示一个已做好地图切片的地图服务的操作,认识了ArcGIS API for iOS的地图组件——MapView。同ArcGIS其他地图API类似,地图组件是ArcGIS API for iOS的核心组件。对MapView来说,不仅可显示切片地图服务,还可加载ArcGIS Server发布的动态图层; 此外,OGC标准的WMS服务及矢量数据同样可以进行显示。 在[地理信息共享]专题中,我们了解,很多基础的应用只需在公共空间信息服务基础之上叠加业务数据。本文将主要介绍MapView中基础地图数据(切片地图服务)叠加业务数据动态地图服务的步骤。
1、 同[ArcGIS API for iOS]Hello,Map中①②步骤一样,新建一个ArcGIS Mapping Application,在此,将该工程命名为FirstMap。
2、 打开FirstMapViewController.h文件,定义切片地图服务及动态地图服务。同[ArcGIS API for iOS]Hello,Map中一致,只需在切片地图服务定义后面添加动态地图服务的定义即可。
- //定义动态地图服务URL地址 美国人口普查的数据服务
- #define kDynamicMapServiceURL
- @http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI Census USA/MapServer
3、打开FirstMapViewController.m文件,在viewDidLoad函数中将动态服务添加到mapView中,在[ArcGIS API for iOS]Hello,Map添加切片服务代码后添加如下代码:
- //创建AGSDynamicMapServiceLayer dynamicLayer
- AGSDynamicMapServiceLayer *dynamicLayer = [[AGSDynamicMapServiceLayeralloc] initWithURL:[NSURLURLWithString:kDynamicMapServiceURL]];
- //将dynamicLayer加载至mapView中
- [self.mapView addMapLayer:dynamicLayerwithName:@”dynamic Layer”];
4、此外,需要对引用计数进行释放。
- [dynamicLayer release];
5、进行编译,运行。效果如图所示
代码下载:http://tm.esrichina-bj.cn/tm/tech/?p=575
查看(110) 评论(1) 收藏 分享 圈子 管理- ArcGIS 10 中文帮助正式上线
2010-10-15 09:56:46
中国用户期待已久的中文帮助已经正式上线,访问下面的地址即可体验 - http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html
查看(543) 评论(4) 收藏 分享 圈子 管理 - Web墨卡托坐标与WGS84坐标互转
2010-10-11 11:11:18
原文地址: - http://bbs.esrichina-bj.cn/ESRI/thread-78245-1-1.html
- 在WebGIS的开发中经常用到的地图投影为Web墨卡托和WGS84,故歌地图,bingmaps,百度地图,mapabc,mapbar,以及 ArcGIS online上的大部分地图为Web墨卡托地图,ArcGIS online上最开始发布的地图投影为WGS84。
- 在开发过程中很多时候会遇到不同坐标系之间互转的问题,特别是底图使用Web墨卡托,定位(GPS,wifi等)信号坐标为WGS84坐标的时候,那么通 用解决方案就是写一个坐标参考系的转换库,类似于proj4,但一般情况下很少用到那么多的参考系之间的互转,并且在客户端实现或者调用proj4都是一 件很困难或者麻烦的事情,大多数情况下我们实现Web墨卡托坐标与WGS84坐标互转就可以了。
- 下面是使用objective-c实现的Web墨卡托坐标与WGS84坐标互转程序,当然也可以使用其他语言来实现,使用起来比较简单和方便。
- //经纬度转墨卡托
- -(CGPoint )lonLat2Mercator:(CGPoint ) lonLat
- {
- CGPoint mercator;
- double x = lonLat.x *20037508.34/180;
- double y = log(tan((90+lonLat.y)*M_PI/360))/(M_PI/180);
- y = y *20037508.34/180;
- mercator.x = x;
- mercator.y = y;
- return mercator ;
- }
- //墨卡托转经纬度
- -(CGPoint )Mercator2lonLat:(CGPoint ) mercator
- {
- CGPoint lonLat;
- double x = mercator.x/20037508.34*180;
- double y = mercator.y/20037508.34*180;
- y= 180/M_PI*(2*atan(exp(y*M_PI/180))-M_PI/2);
- lonLat.x = x;
- lonLat.y = y;
- return lonLat;
- }
查看(435) 评论(5) 收藏 分享 圈子 管理- ArcGIS API for iOS 开发环境
2010-09-17 09:37:24
马达加斯加中的小企鹅,太可爱了!
查看(99) 评论(2) 收藏 分享 圈子 管理- 2010华北区用户大会精彩演示预报,敬请期待!
2010-09-13 13:13:37
2010华北区用户大会精彩演示预报,敬请期待!
时间:2010年9月14日14:30 - 17:00 地点:北京 亚运村 北京国际会议中心 二层 1号会议厅 演讲主题: GIS让人类认知世界 ArcGIS 10 新技术, 新体验 ,新价值 —— Esri中国(北京) 有限公司 产品技术研究中心 在这个讲座中我们将给大家带来14个精彩演示,敬请期待! 精彩内容如下: 1 Feature Layer & Feature Services ,客户端完美数据展示与编辑解决方案 2 轻松玩转ArcGIS for iOS,iPad应用程序现场展示。 3 全国公共地图服务制作经验谈,带您了解如何只做、发布一副精美地图。 4 计算式服务,给您的应用插上地理服务的翅膀 5 全新的3D新体验,在3D场景中漫游国际会议中心,并且不只是3D展示,还给给您带来精彩的3D分析演示 6 全新的网络分析,web 3D网络分析(纯html5制作,不需要插件哦),另外还有结合历史数据的网络分析,随时随地为您提供更有可参考性的路径规划。 时间:2010年9月14日14:30 - 17:00 地点:北京 亚运村 北京国际会议中心 二层 1号会议厅 演讲主题: GIS让人类认知世界 ArcGIS 10 新技术, 新体验 ,新价值 —— Esri中国(北京) 有限公司 产品技术研究中心 精彩不容错过! |
查看(82) 评论(2) 收藏 分享 圈子 管理 ArcGIS Explorer Online beta 上线
2010-05-26 09:27:33
随着 www.arcgis.com的正式上线,ArcGIS Explorer Online beta也同时上线。 ArcGIS Explorer Online使用silverlight制作,要求silverlight4,地址为: explorer.arcgis.com 一个很酷的应用,推荐给大家
查看(131) 评论(2) 收藏 分享 圈子 管理 ArcGIS10 GeoDatabase新特性之query layer
2010-05-14 11:01:51
一 什么是query layer query layer是一个通过SQL语句定义的layer(包含空间数据)或是单独表(不包含空间数据)。 在arcmap中通过使用query layer可以很方便的把存储在DBMS中的数据集成进来,因为query layer通过sql语句去直接和DBMS打交道,而不必通过SDE。 在arcmap中使用querylayer的时候,每当刷新地图或使用的时候都会通过SQL语句去重新读取数据,这就保证最新的数据会被加载进来,达到实时更新的效果(因为query里面只是存储的过滤条件,而没有存数据,当数据中数据被修改并满足过滤条件的时候,arcmap中即会显示该数据)。 query layer目前支持所有ArcGIS支持的数据库,包括oracle,sql server,informix,db2,postgresql等。 在arcmap中使用query layer可以快速方便的把空间数据和表格数据集成到GIS工程中,而不必关心这些数据存在哪以及时如何存储的。 下面是使用query layer的一些小的知识: 1 使用query layer可以代替DBMS中的视图 2 query layer和feature layer以及单独表(stand-alone table)有相同的行为和动作,因此可以用来显示数据,或者作为gp的输入以及使用API去访问。 3query layer可以被保存成图层文件(.lyr) 或者创建成图层包(.lpk),方便与其他的应用程序,地图文档或者其他用户分享。 二 开始使用query layer 1 如果想使用query 来加载空间数据,需要做一下的一些基本工作: 1)必须使用ArcGIS支持的DBMS版本,通过ESRI的support网站可以查询这些信息 2)query layer 的定义必须包含一个唯一的非空的列或者组合列做为主键(Objectid),如果没有的话必须手动加一个。 3)根据不同的DBMS,可能要配置一下DBMS使用的空间类型 4)同样根据不同的DBMS,有可能需要在每个创建query layer连接的的客户端电脑配置一些内容。 2 IBM DB2中需要做如下配置: 1)DB2 必须安装Spatial Extender 组件,不然无法使用ST_Geometry 类型。 2)在创建query layer连接的机器上必须安装DB2 Client并且配置需要连接的DB2数据库,下面的链接说明了如何安装Spatial Extender 组件和如何配置DB2 Client http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp? 3 IBM Informix 数据库中需要做如下配置: 1) 安装Spatial DataBlade组件,并且启用ST_Geometry类型 2) 在使用query layer的客户端机器上必须安装Informix client SDK 或者IConnect来配置一个ODBC连接。 4 MS sqlserver 1)如果使用空间数据类型,则必须使用sqlserver2008及以上版本,如果只是非空间数据则sqlserver2005同样支持。 2)在ArcGIS Desktop安装的时候会默认安装SQL Server Native Client 用来支持query layer,因此不必再单独安装SQL Server客户端。 5 Oracle 1)在oracle数据库中支持2种空间数据类型:ST_Geometry和SDO_Geometry. 2) ST_Geometry是ArcSDE使用的数据类型,如果要使用该类型,必须安装ArcSDE for oracle并且在Geodatebase中使用。 3)SDO_Geometry数据类型是oracle默认支持的空间数据类型,但如果想要能够访问这种数据类型需要安装oracle spatial组件。 6 PostgreSQL 1)PostgreSQL同样支持2中空间数据类型:ST_Geometry和 PostGIS geometry. 2) ST_Geometry是ArcSDE使用的数据类型,如果要使用该类型,必须安装ArcSDE for PostgreSQL并且 3)PostGIS geometry 必须单独安装,装好之后必须使用PostGIS template database,因为该类型数据库使用PostGIS geometry 来存储空间数据。在Geodatebase中使用。 三 使用query layer 1) 打开arcmap ,选择File->Add Data > Add Query Layer,如图3-1。 2)点击connections,进行数据库连接,如图3-2。 3)点击new,设置数据库连接,如图3-3为例,我们使用oracle10g数据库,使用ST_Geometry为空间数据类型。 4)点击ok,返回到创建query layer界面,如图3-4,选择SDE.BLOCKS表双击。输入名称QueryBlocks,并编辑Query栏中的sql语句,我们选择 OBJECTID_1 >11000的要素,sql语句为"select * from SDE.BLOCKS where OBJECTID_1 >11000" 5)点击validate,验证通过后点击finish。如果需要设置unique identifier field ,勾上show Advanced Options ,进入下一步。 6)经过上面的步骤,query layer就加载到Arcmap中了,如图3-5。这时候我们就可以像操作其他图层一样对query layer操作。 7)我们打开query layer的属性,如图3-6,在source面板中可以点击change query来修改query layer的选择条件,如图3-7 8)为了共享我们的query layer,可以把layer保存成lyr文件或者create layer package,如图3-8 9) query layer是只读的,不能被编辑。
查看(430) 评论(0) 收藏 分享 圈子 管理 ArcGIS API for Flex Tool机制扩展
2010-03-02 15:01:04
在ArcGIS API for Flex 1.0-1.3版本中,提供了两个内置的工具Navigation和Draw,每个工具都提供了active和deactive的方法,但这样会产生一个 问题,在地图上有可能同时存在两个工具同时处于active状态,这样将造成有两个工具同时都会响应鼠标消息,形成打架的情况。当然,可以通过两个工具的 同时控制避免这种情况出现,但当存在多个自己扩展tool的时候,控制将非常复杂,造成很多问题。因此,有必要彻底解决这个问题,保证当前有且只有一个 tool处于活动状态。 在下面的内容中,将介绍一种在ArcGIS API for Flex中tool的扩展机制来解决这个问题。 对于Map,基本思路如下: 1 继承Map,并使新的map维护一个tool列表,并且接管map的鼠标响应消息。 2 提供tool的注册函数,能够将工具注册到tool列表中 3 能够设置当前工作的tool,即currentTool属性
- package com.esriChina.tm.toolExtended
- {
- import com.esri.ags.Map;
- import flash.events.MouseEvent;
- import flash.utils.Dictionary;
- public class NewMap extends Map
- {
- private var _tools:Dictionary;
- private var _curToolName:String;
- private var _curTool:Object;
- override public function NewMap()
- {
- super();
- _tools = new Dictionary();
- }
- private function EnablePan(enable:Boolean):void
- {
- this.mapNavigationEnabled = enable;
- this.doubleClickZoomEnabled =enable;
- this.clickRecenterEnabled = enable;
- this.panEnabled = enable;
- this.rubberbandZoomEnabled = enable;
- this.keyboardNavigationEnabled = enable;
- this.scrollWheelZoomEnabled = enable;
- this.zoomSliderVisible = enable;
- }
- private function addToolListener():void
- {
- if(_curTool == null)
- return;
- // this.panArrowsVisible = false;
- EnablePan(false);
- this.addEventListener(MouseEvent.CLICK,OnMouseClick);
- this.addEventListener(MouseEvent.DOUBLE_CLICK,OnMouseDoubleClick);
- this.addEventListener(MouseEvent.MOUSE_DOWN,OnMouseDown);
- this.addEventListener(MouseEvent.MOUSE_MOVE,OnMouseMove);
- this.addEventListener(MouseEvent.MOUSE_UP,OnMouseUp);
- this.addEventListener(MouseEvent.MOUSE_WHEEL,OnMouseWheel);
- }
- private function removeToolListener():void
- {
- EnablePan(true);
- // this.panArrowsVisible = true;
- this.removeEventListener(MouseEvent.CLICK,OnMouseClick);
- this.removeEventListener(MouseEvent.DOUBLE_CLICK,OnMouseDoubleClick);
- this.removeEventListener(MouseEvent.MOUSE_DOWN,OnMouseDown);
- this.removeEventListener(MouseEvent.MOUSE_MOVE,OnMouseMove);
- this.removeEventListener(MouseEvent.MOUSE_UP,OnMouseUp);
- this.removeEventListener(MouseEvent.MOUSE_WHEEL,OnMouseWheel);
- }
- private function getToolByName(toolName:String):ITool
- {
- return _tools[toolName] as ITool;
- }
- public function set currentTool(toolName:String):void
- {
- _curToolName = toolName;
- if(_curTool != null)
- {
- _curTool.deactive();
- _curTool = null;
- }
- _curTool = _tools[toolName] as ITool;
- if(_curTool == null)
- {
- removeToolListener();
- _curToolName = null;
- }
- else
- {
- addToolListener();
- _curTool.active();
- }
- }
- public function get currentTool():String
- {
- return _curToolName;
- }
- //注册工具,将自定义工具注册到当前map视图中
- //返回-1 工具为空或不能转为ITool
- // -2 工具名称为空
- // -3 存在同名工具,不能注册
- // 1 注册成功
- private function registerTool(tool:Object,data:Object=null):int
- {
- var toolName:String;
- if(tool == null)
- return -1;
- toolName = tool.getName();
- if(toolName == null || toolName == "")
- return -2;
- if(_tools[toolName] == null)
- {
- _tools[toolName] = tool;
- tool.create(this as Map,data);
- return 1;
- }
- else
- {
- return -3;
- }
- }
- public function registerToolGroup(toolGroup:BaseToolGroup):void
- {
- var i:int = 0;
- var data:Object;
- if(toolGroup == null)
- return;
- data = toolGroup.getShareData();
- for(i=0;i
- {
- registerTool(toolGroup.getTool(i),data);
- }
- }
- private function OnMouseClick(event:MouseEvent):void
- {
- if(_curTool!= null)
- {
- _curTool.OnMouseClick(event);
- }
- }
- private function OnMouseDoubleClick(event:MouseEvent):void
- {
- if(_curTool!= null)
- {
- _curTool.OnMouseDoubleClick(event);
- }
- }
- private function OnMouseDown(event:MouseEvent):void
- {
- if(_curTool!= null)
- {
- _curTool.OnMouseDown(event);
- }
- }
- private function OnMouseMove(event:MouseEvent):void
- {
- if(_curTool!= null)
- {
- _curTool.OnMouseMove(event);
- }
- }
- private function OnMouseUp(event:MouseEvent):void
- {
- if(_curTool!= null)
- {
- _curTool.OnMouseUp(event);
- }
- }
- private function OnMouseWheel(event:MouseEvent):void
- {
- if(_curTool!= null)
- {
- _curTool.OnMouseWheel(event);
- }
- }
- }
- }
复制代码
对于tool,基本思路如下: 1 要能够维护tool的生命周期,包括create,active,deactive等,封装成ICommand接口 2 要能够响应鼠标和键盘消息,包括 OnMouseDown,OnMouseUp,OnMouseMove等,封装成ITool接口 3 要能够将多个tool协同工作,形成toolbar,在本程序中我们称之为toolGroup,为此,封装IToolGroup接口,提供 getTool(index:int),getToolCount(),getName()方法,同时提供BaseToolGroup,实现 IToolGroup接口 下面介绍一下如何创建自己的ToolGroup和tool。 1 实现tool要继承ITool和ICommand接口,并继承EventDispatcher,如果工具不分发消息,也可不继承 EventDispatcher,并实现需要用到的方法,必须实现的方法为create和getName,create方法将Map对象交给 tool,getName得到工具的名称,该名称为全局唯一,不能重复,用来唯一标识一个工具,命名方式可以参考COM组件的命名方 式,toolGroupName.toolName.1例如"NavTool.ZoomIn.1"。 2 可以将toolGroup内所有的工具名称定义到单独的类中,方便管理,例如下面代码:
- package com.esriChina.tm.tools.NavTool
- {
- public class NavToolDes
- {
- public static var NavTool_Pan:String = "NavTool.Pan.1";
- public static var NavTool_ZoomIn:String = "NavTool.ZoomIn.1";
- public static var NavTool_ZoomOut:String = "NavTool.ZoomOut.1";
- public function NavToolDes()
- {
- }
- }
- }
复制代码
3 实现toolGroup,直接继承BaseToolGroup即可。在NavToolGroup的构造函数中,将在该ToolGroup中的tool创建并加入到toolArray中。
- package com.esriChina.tm.tools.NavTool
- {
- import com.esriChina.tm.toolExtended.BaseToolGroup;
- public class NavToolGroup extends BaseToolGroup
- {
- public function NavToolGroup()
- {
- super();
- var panTool:PanTool = new PanTool();
- var zoomInTool:ZoomInTool = new ZoomInTool();
- var zoomOutTool:ZoomOutTool = new ZoomOutTool();
- this.toolArray.push(panTool);
- this.toolArray.push(zoomInTool);
- this.toolArray.push(zoomOutTool);
- }
- override public function getName():String
- {
- return "NavTool";
- }
- }
- }
复制代码
4 在map中注册toolGroup。创建toolGroup并使用map的registerToolGroup方法注册该toolGroup。
- var navToolGroup:NavToolGroup = new NavToolGroup();
- map.registerToolGroup(navToolGroup);
复制代码
5 使用tool。设置map的currentTool属性即可,例如
- map.currentTool = NavToolDes.NavTool_ZoomIn;
复制代码
详细的实现和示例代码请下载下面的工程。 ToolExtended.zip (339.88 KB)
查看(199) 评论(1) 收藏 分享 圈子 管理
67
3/4
<
1
2
3
4
>
barry
用户菜单
- 给我留言
- 加入好友
- 发短消息
- 我的介绍
- 论坛资料
- 空间管理
我的栏目
- OQL
- 面向对象数据库
- 时态数据库
- 时空数据模型&数据库
- python
- GE
- AO
- gps
- mushup
- kml
- alchemy
- video
- arcgis
- iphone
- other
标题搜索
我的存档
- 2011年09月
- 2011年08月
- 2011年07月
- 2011年06月
- 2011年05月
- 2011年04月
- 2011年03月
- 2011年02月
- 2011年01月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年09月
- 2010年08月
- 2010年07月
- 2010年06月
- 2010年05月
- 2010年04月
- 2010年03月
- 2010年02月
- 2010年01月
- 2009年12月
- 2009年11月
- 2009年10月
数据统计
- 访问量: 41904
- 日志数: 190
- 建立时间: 2007-04-01
- 更新时间: 2011-09-02
RSS订阅
清空Cookie - 联系我们 - 3sNews博客 - 交流论坛 - 空间列表 - 站点存档 - 升级自己的空间
Powered by X-Space 4.0.1 UC © 2001-2008 Comsenz Inc.
京ICP备05007579号
Open Toolbar