Matlab数理统计工具箱应用简介(转)

Matlab数理统计工具箱应用简介(转)

本文是直接转换自网上的PDF格式,

Matlab数理统计工具箱应用简介
1. 概述
Matlab的数理统计工具箱是Matlab工具箱中较为简单的一个,其牵扯的数学知识是大家都很熟悉的数理统计,因此在本文中,我们将不再对数理统计的知识进行重复,仅仅列出数理统计工具箱的一些函数,这些函数的意义都很明确,使用也很简单,为了进一步简明,本文也仅仅给出了函数的名称,没有列出函数的参数以及使用方法,大家只需简单的在Matlab工作空间中输入“help 函数名”,便可以得到这些函数详细的使用方法。
2. 参数估计
betafit β分布数据的参数估计和置信区间
betalike β对数似然函数
binofit 二项数据参数估计和置信区间
expfit 指数数据参数估计和置信区间
gamfit γ分布数据的参数估计和置信区间
gamlike γ对数似然函数
mle 最大似然估计
normlike 正态对数似然函数
normfit 正态数据参数估计和置信区间
poissfit 泊松数据参数估计和置信区间
unifit 均匀分布数据参数估计
weibfit Weibull数据参数估计和置信区间
3. 累积分布函数
betacdf β累积分布函数
binocdf 二项累积分布函数
cdf 计算选定的累积分布函数
chi2cdf 累积分布函数
expcdf 指数累积分布函数
fcdf F累积分布函数
gamcdf γ累积分布函数
geocdf 几何累积分布函数
hygecdf 超几何累积分布函数
logncdf 对数正态累积分布函数
nbincdf 负二项累积分布函数
ncfcdf 偏F累积分布函数
nctcdf 偏t累积分布函数
ncx2cdf 偏累积分布函数
normcdf 正态累积分布函数
poisscdf 泊松累积分布函数
raylcdf Reyleigh累积分布函数
tcdf t累积分布函数
unidcdf 离散均匀分布累积分布函数
unifcdf 连续均匀分布累积分布函数
weibcdf Weibull累积分布函数
4. 概率密度函数
betapdf β概率密度函数
binopdf 二项概率密度函数
chi2pdf 概率密度函数
exppdf 指数概率密度函数
fpdf F概率密度函数
gampdf γ概率密度函数
geopdf 几何概率密度函数
hygepdf 超几何概率密度函数
lognpdf 对数正态概率密度函数
nbinpdf 负二项概率密度函数
ncfpdf 偏F概率密度函数
nctpdf 偏t概率密度函数
ncx2pdf 偏概率密度函数
normpdf 正态分布概率密度函数
pdf 指定分布的概率密度函数
poisspdf 泊松分布的概率密度函数
raylpdf Rayleigh概率密度函数
tpdf t概率密度函数
unidpdf 离散均匀分布概率密度函数
unifpdf 连续均匀分布概率密度函数
weibpdf Weibull概率密度函数
5. 逆累积分布函数
betainv 逆β累积分布函数
binoinv 逆二项累积分布函数
chi2inv 逆累积分布函数
expinv 逆指数累积分布函数
finv 逆F累积分布函数
gaminv 逆γ累积分布函数
geoinv 逆几何累积分布函数
hygeinv 逆超几何累积分布函数
logninv 逆对数正态累积分布函数
nbininv 逆负二项累积分布函数
ncfinv 逆偏F累积分布函数
nctinv 逆偏t累积分布函数
ncx2inv 逆偏累积分布函数
norminv 逆正态累积分布函数
possinv 逆正态累积分布函数
raylinv 逆Rayleigh累积分布函数
tinv 逆t累积分布函数
unidinv 逆离散均匀累积分布函数
unifinv 逆连续均匀累积分布函数
weibinv 逆Weibull累积分布函数
6. 分布矩函数
betastat 计算β分布的均值和方差
binostat 二项分布的均值和方差
chi2stat 计算分布的均值和方差
expstat 计算指数分布的均值和方差
fstat 计算F分布的均值和方差
gemstat 计算γ分布的均值和方差
geostat 计算几何分布的均值和方差
hygestat 计算超几何分布的均值和方差
lognstat 计算对数正态分布的均值和方差
nbinstat 计算负二项分布的均值和方差
ncfstat 计算偏F分布的均值和方差
nctstat 计算偏t分布的均值和方差
ncx2stat 计算偏分布的均值和方差
normstat 计算正态分布的均值和方差
poissstat 计算泊松分布的均值和方差
raylstat 计算Rayleigh分布的均值和方差
tstat 计算t分布的均值和方差
unidstat 计算离散均匀分布的均值和方差
unifstat 计算连续均匀分布的均值和方差
weibstat 计算Weibull分布的均值和方差
7. 统计特征函数
corrcoef 计算互相关系数
cov 计算协方差矩阵
geomean 计算样本的几何平均值
harmmean 计算样本数据的调和平均值
iqr 计算样本的四分位差
kurtosis 计算样本的峭度
mad 计算样本数据平均绝对偏差
mean 计算样本的均值
median 计算样本的中位数
moment 计算任意阶的中心矩
prctile 计算样本的百份位数
range 样本的范围
skewness 计算样本的歪度
std 计算样本的标准差
trimmean 计算包含极限值的样本数据的均值
var 计算样本的方差
8. 统计绘图函数
boxplot 在矩形框内画样本数据
errorbar 在曲线上画误差条
fsurfht 画函数的交互轮廓线
gline 在图中交互式画线
gname 用指定的标志画点
lsline 画最小二乘拟合线
normplot 画正态检验的正态概率图
pareto 画统计过程控制的Pareto图
qqplot 画两样本的分位数-分位数图
refcurve 在当前图中加一多项式曲线
refline 在当前坐标中画参考线
surfht 画交互轮廓线
weibplot 画Weibull概率图
9. 统计处理控制
capable 处理能力索引
capaplot 画处理能力图
ewmaplot 画指数加权移动平均图
histfit 叠加正态密度直方图
normspec 在规定的极限内画正态密度图
schart 画标准偏差图
xbarplot 画水平条图
10. 假设检验
ranksum 计算母体产生的两独立样本的显著性概率和假设检验的结果
signrank 计算两匹配样本中位数相等的显著性概率和假设检验的结果
signtest 计算两匹配样本的显著性概率和假设检验的结果
ttest 对单个样本均值进行t检验
ttest2 对两样本均值差进行t检验
ztest 对已知方差的单个样本均值进行z检验
11. 试验设计
cordexch 配位交叉算法D-优化试验设计
daugment D-优化增强试验设计
dcovary 使用指定协变数的D-优化试验设计
ff2n 两水平全因素试验设计
fullfact 全因素试验设计
hadamard Hadamard正交试验
rowexch 行交换算法D-优化试验设计

posted @ 2008-10-17 20:50 风过 无痕 阅读(458) | 评论 (0)编辑

景观生态学——景观指数计算软件(转)

link:http://hi.baidu.com/kuanjin8309/blog/item/547cd4cb5b30db43f31fe7f5.html
生物多样性
Biology diversity Pro 独立运行软件,可计算很多钟指数,还能完成一些其它的运算如聚类等,推荐..(5.09M)

Biotools:计算多样性指数的软件,是一个EXCEL宏,解压运行后将在EXCEL生成一个工具栏,只有4个按钮,使用非常方便,不过只能计算7个指数.本地下载(66K)
Bio-Dap:计算多样性指数的软件,解压后可直接运行,有独立的运行界面,不过需要以逗号分开的纯文本数据文件,可以计算包括Shannon-Weiner,Mackintosh指数在内的11个指数,还可以进行种-多度分布的拟合,但一次能运算的样地数有限.本地下载(273k).  
Species Diversity & Richness:计算的多样性指数很全,但是一个试用版,只能计算10个样地,每个样地十个种。(A program to aid in biodiversity studies, offering a wide range of alpha and beta diversity related methods, graphical data representation, abundance distributions, and generation of simulated data.) 主页http://www.pisces-conservation.com/ 

Estimate:Estimate computes survival estimates from banding (ringing) recovery data

景观软件Fragstats3.3:一个很流行的计算景观格局指数的软件
Apack:计算景观格局指数可以与Fragstats3.3交互使用,DOS界面,使用起来不是太方便
SimMap:一个用于理论研究的景观中性模型
Seles:景观模拟语言 本地下载
景观管理系统

posted @ 2008-09-22 19:33 风过 无痕 阅读(363) | 评论 (0)编辑

MapGIS 恶心到这种地步(MapGIS 公告)

【编者按】为让大家更好地了解MapGIS新一代搭建式开发平台、数据中心系统、三维GIS平台,结合吴信才教授近期的有关报告和MapGIS最新技术发展情况特编辑整理此文。

  近十年来,数字地球、数字城市、数字行业风起云涌,推波助澜,作为数字化发展的重要支撑技术GIS技术迎来了新的发展机遇,但是GIS技术发展走向何方,这是大家都非常关注的问题。中地数码集团凭借多年的实践经验和科学创新精神开创了“在新的一代GIS架构技术支持下的新一代的搭建式开发平台、数据中心系统和三维GIS平台”。

MapGIS7搭建式开发平台:不懂软件开发,也可搭建GIS系统

  GIS行业欣欣向荣,但是GIS软件企业前赴后继,问题在哪里?很多学者都知道,GIS技术是跨学科,跨行业的,涉及面广。随着应用越来越广,系统越做越庞大,加之开发手段不方便,使得开发难度加大。目前多数企业普遍使用的是面向对象、组件化的开发技术,虽说是新技术,但它的开发手段复杂,对程序员的能力要求过高。同时,GIS软件企业发展面临着“热带高压”的现象。所谓“热带”就是用户要求过热,用户想很快看到原型系统,但是现在的系统太庞大,目前的开发模式不可能很快开发出原型系统;并且影响因素过多,拖时间长了,产生新的需求,项目永远结不了。所谓“高压”就是开发商承压过高。时间急迫,开发人员加班,周围人员帮不上忙,老总干着急;技术支持人员面对用户提出的新要求,要靠程序员去解决,程序员对代码重复编写产生厌烦情绪;因而程序员非常珍贵,对项目影响大。

  面对这种情况,GIS软件企业路在何方?这是值得我们考虑的问题。在十年前,中地数码集团就预计了这个行业今后会遇着什么困难,考虑走哪条路:第一、融资加大投入,融资通常有两个途经:一是引入风险投资,二是融资上市。要上市谈何易。风险投资在我们身边很多,但GIS企业几乎没有一个成功的;第二、就是改行做数据生产,确实是一条比较好的道路,有很多GIS软件企业,经历了大风大浪后,最后改行做数据生产、改行做数据运营商,发展得比较好。另外一条路就是进行技术变革,首要就是开发技术的变革,解决开发难的问题,开发技术变革首先的责任就在平台商,中地公司作为一个软件平台开发商,要担负起技术变革的重任。

  纵观二次开发技术体系的发展史,可分为三个阶段:第一是面向结构化程序开发技术阶段,也称为SOD开发技术阶段;第二是面向对象组件化程序开发技术阶段,也称为OOD开发技术阶段;第三是面向搭建式的程序开发技术阶段,也称为FOD开发技术阶段。前两者称为传统的开发模式,后者称为新一代的开发模式。目前绝大多数的系统和绝大多数的软件商都处于面向对象组件化程序开发技术阶段,这种开发技术很不方便。虽然面向对象组件化技术是先进的,但是开发手段并不方便。

  与新一代的开发技术相比,传统的面向对象组件化的开发技术难度大,对计算机程序员要求过高,靠程序员来手工编程调试,不能流程化生产。新一代的软件开发技术--- 搭建式开发,实现零编程,可以减少软件开发量,提升软件开发质量,降低开发难度,使很多人都可以参与,学习更容易,维护更方便。传统的模式下,如果是软件需求变化了,需要修改程序,只有程序员在忙,其他的人帮不上忙。在新一代开发模式下如果是软件需求变化了需要修改程序,大家都可以一起分担、一起改进,所以这两种模式的效率相比起来相差是非常大的。(如图1)

图1:传统与新一代开发模式工作效率比较

  新一代开发模式是由插件式开发、配置式开发和搭建式开发三种方式组成。搭建式开发,是基于工作流、电子表单、基于SOA的构件仓库(功能仓库)、搭建平台和运行平台组成。插件式二次开发,是基于SOA技术系统框架、SOA技术的基础插件、基础视图、少量编程(即需要插件时进行少量编程)。配置式二次开发是配置资源、目录、工具箱、视图、菜单、程序模板、实例模板、引导式加载程序实例。

  新一代开发模式的效率,从开发周期来看,同样的任务,同样的人,开发周期是原来的五分之一,即原来需要一年的开发任务,在新的开发模式下,大概用两个多月就可以完成了,非常高的开发效率。从开发质量来看,以初次上线测试的BUG量来比较,传统的开发模式下,初次测试的BUG一般在三百多个以上,在新一代的开发模式下,初次测试BUG在三十个以下,相当于质量提高了十倍。

  例如搭建一个简单的放大缩小、移动、显示的WebGIS系统,在传统开发模式下的手工编程,很优秀的程序员也要干几个小时。现在用搭建式的开发很方便,首先开一个窗口用于显示输出图形,然后把放大按钮、缩小按钮、移动按钮、显示按钮和返回按钮拖放到相应的地方,这样就把一个简单的WebGIS系统搭建起来了,可以进行显示、放大等功能,非常方便。(如图2)

图2:WebGIS搭建过程

  搭建式系统开发技术可以是业务系统搭建,也可以是GIS系统搭建。业务系统搭建包括电子政务,以及一般的业务系统。GIS系统搭建包括应用GIS系统、WebGIS、信息发布等等。搭建开发技术有四个关键部件:一个是面向服务的体系架构,如果软件不是面向服务的体系架构,就不能说可以完成“全部搭建”,最多称得上“部分搭建”;第二个是功能完备的构件仓库(有时也称功能仓库)。构件仓库是松耦合的,不是构件库,也不是动态库,更不是组件库。动态库、组件库是紧耦合的,是通过程序员手工编程来连接调用的。构件仓库是可以搭建的,构件仓库的概念应该说是我们最先提出来的。第三个是方便灵活的可视化搭建平台。第四个是安全可靠的运行管理平台。(如图3)

图3:搭建开发技术的四个关键部件

下面介绍面向服务的架构技术。

  新一代的开发模式必须有面向服务的体系架构技术才能实现,所以在新一代开发模式出现之前,中地公司的底层平台MapGIS7就是采用面向服务的体系架构技术。纵观GIS架构技术发展的三个阶段,第一个阶段是面向过程的架构技术 (POA),我们称为个体经济阶段;第二阶段是面向系统的架构体系 (EOA),我们称之为计划经济阶段,面向系统,面面俱到,所有东西都管起来。例如我们高校就是个小系统,在计划经济时期就是什么都有,食堂、幼儿园 、医院、车队等等,怎样办得好呢?一个国家也是,在计划经济时期管理机构非常庞大,支撑不了,所以中国必须走有中国特色的社会主义道路,建立社会主义市场经济体制。目前大多数系统是面向系统这种架构技术,所以到了难以支撑的地步,唯一的出路是使用面向服务的架构技术 (SOA),我们称为市场经济,根据需求为用户量身定做解决方案,提供服务。

  体系结构的发展使搭建式开发成为可能,最早的面向过程的体系架构 (POA)只能用于面向结构化的程序开发 (SOD)技术,面向系统的架构 (EOA)可以用于面向对象和组件化的程序开发技术(OOD),只有面向服务的体系架构 (SOA)才能支持搭建式的程序开发技术 (FOD)。

  MapGIS7系统 (SOA) 是多层体系架构,特点是:横向网络,纵向多层。MapGIS7的软件模块是多层的,最底层是数据管理层,上面是基础平台层,专业平台层,Web服务层,搭建平台层,最后是应用系统层。(如图4)

图4:MapGIS7的软件模块层次图


MapGIS7数据中心:彻底解决海量数据管理和共享问题

  实现搭建开发这样的零编程平台需要一个全新的数据和功能的管理模式,因此提出了“数据中心”的新思想。什么是数据中心?它与搭建平台有什么关系?数据中心由数据仓库、构件仓库和搭建平台三部分组成,分别类似于物流中心的货物仓库、运输工具仓库(包括机械手、传送带、汽车、火车,集装箱等等)和配送平台。下面我们介绍数据仓库和构件仓库的概念。

  要了解数据库和数据仓库、构件库与构件仓库的区别,首先从库(库房)和仓库入手。库房和仓库的相同点是都有货物、货架,但是仓库相比库房多了三部分:可重配置的目录、自动运输工具和维护保障系统。库房虽然也有目录,但目录是固定的,用本子来记录,是不可变的;仓库是用计算机来重配置目录的,所以仓库的目录是活的。库房把很多相同的货物堆在一个货架上,要提取货物时,用手工去分检、提取货物;仓库需要提取货物时,把卡一刷,机械手、分检器就自动地将货物提取出来。所以仓库的运输工具是自动的,并有一整套货物维护和安全保障系统。

  同样,数据仓库比数据库多了三部分:可重配置的目录、服务方法和数据维护插件。数据库的目录是固定不变的;数据仓库的目录是活动的,它可以按地区、类型、年度分类来安排目录。数据库只是把很多同类的数据放在一个表上,要提取数据时手工编程提取,手工编程检索等;而数据仓库的数据提取、数据上载、数据挖掘等是有工具、有服务方法的,是自动进行的,同时还有一整套数据维护、数据更新和安全保障插件。(如图5)

图5:数据库和数据仓库的目录对比
  

依次类推,构件库和构件仓库的区别也一样,只有构件仓库才能用来搭建。动态库、组件库、构件库在应用时,与库房提货需要手工操作一样,需要手工编程来调用,因此它们是不能用于搭建系统的,不能支持数据中心。构件仓库则不同,可管理面向服务的功能构件,按照标准建立接口管理、配置可视化,再配上搭建平台就可以搭建了,构件仓库与数据仓库从某种意义来说是类似的。

   假如有一大批库房在一起,是否可以称为一个物流中心?不行!这只是可以称为一个货物堆场。物流中心是由许多货物仓库、运输工具和配送平台组成的。我们提出数据中心这个概念的时候,有很多厂商包括国外厂商的推销员也说他们有数据中心,但是他们所指的数据中心是可以管理很多数据,把数据放在一起,这不是数据中心,而是个数据的堆场,不能有效地进行系统搭建。所以我们如果不清楚什么才是真正的数据中心,我们就拿物流中心来相比。物流中心和货物堆场,数据中心和数据堆场概念的区别是相似的。(如图6、7)



图6:数据中心和数据堆场概念的比较



图7:数据中心的分层体系结构图

搭建式开发改变了软件整个生产流程,改变了它的效率和模式。同样的任务、同样的人员,搭建式开发方式大大缩短了开发时间,节约80%以上的开发成本,提高80%以上的工作效率,对开发人员的要求大大降低。凡属本科毕业的相关专业,有一定的计算机应用基础的人,只要通过一周左右的时间,就能掌握搭建系统的使用方法,让用户从关心技术、实现细节功能,转向关心业务。着眼于专业流程分析,而不要花更多的时间投入于业务系统的编程。系统底层功能仓库能提供足够强大的功能构件,二次开发用户基于这些功能构件,就可搭建出面向专业的应用系统。这是GIS二次开发模式的重大变革,是一场革命。



图8:MapGIS7搭建系统的界面

MapGIS7三维开发平台:辅助世界特大城市管理和决策

  随着我国城市规模不断扩大,城市建设由平面开发转向立体开发,打破了地质环境原有的平衡,城市地质灾害等问题日渐突出。城市的地下空间利用、地下安全、地下紧急事故处理都需要地质部门提供详细的数据资料。目前我国的城市地质灾害,主要是不了解城市地质情况造成的。有的城市进行城市规划和市政建设,不充分考虑城市地质状况,埋下了许多隐患。城市地质调查,是在城市及其周围地区或潜在城市化地区的特定空间范围内,综合考虑各种地质要素,研究其对城市发展提供的资源、施加的约束条件以及城市发展对各种地质要素产生的影响,为城市规划、大规模城市建设和城市管理提供基础数据。

   世界的本原是三维的。传统的GIS将现实世界简化为平面上二维投影的概念模型,注定了它在描述三维空间现象上的局限。随着GIS应用的深入,人们越来越多地要求以真三维空间来处理问题。但三维空间是复杂的,基于三维的应用也存在着巨大的差异,以目前的研究现状和技术条件,研发通用三维GIS是不太现实的。基于以上认识, MapGIS7提供具有开放体系结构的三维处理平台 --- MapGIS7-TDE,在提供一般三维空间数据模型及管理功能的基础上,平台允许针对特定应用领域动态扩展建模及其分析功能插件,以适应特定的三维应用。

   MapGIS7-TDE三维处理平台是中地数码在MapGIS7中推出的一套真三维空间数据处理开发平台。该平台本着“面向专业领域,开发主题型三维应用系统”的设计原则,同时为适应地学三维应用正在朝地表、地下信息集成,强调表达的真实感及实时性以及多维、网络化等方向发展,在MapGIS7内核模块基础上,全面整合GIS、DEM、三维景观建模、三维地质构模、可视化、三维模型显示、虚拟现实、数据库、网络通信等多方面的技术,采用先进的三维空间数据模型、构模算法、三维可视化技术及框架加插件的软件体系结构,是一个研制开发的技术起点高、算法新颖、易于扩展、可满足不同层次用户需求的三维空间信息存储、管理应用、开发的平台。目前,在平台所提供的基本框架、三维空间数据管理和渲染引擎基础上,中地公司开发了景观建模及可视化、地质建模及可视化、体数据建模及可视化、虚拟仿真显示驱动等面向具体应用领域的三维建模和可视化支撑工具,用户可根据需要自行选择配置或自己开发插件扩展平台功能。

   国家863项目“上海城市地质信息系统”应用了MapGIS7对海量数据的处理能力,把上海地上地下2000米,6000平方公里的地质资料全部录入到系统,并通过三维显示、查询、分析、检索等方式,为城市规划、建设、管理、防灾减帧⒒肪持卫矸竦裙ぷ魈峁┓瘢ㄖ棵抛龊镁霾摺?刮鞘泄婊⒔ㄉ韬凸芾矸竦某鞘械刂实鞑楣ぷ鳎诠谑鞘状危诠庖参蕹墒炀椤U馐怯芍泄耸状瓮瓿傻氖澜缣卮蟪鞘械牡叵氯低辰ㄉ琛?br />
   众所周知,上海地处入海河口,是由河海冲击、泥沙堆积形成的“新大陆”,建筑专家将现代上海比作“建在豆腐上的城市”。上海城市建设的加快、地面沉降和海岸冲淤等地质灾害的发生,以及2010年上海世博会选址以及大规模的地下空间开发、上海市东南部的临港新城规划实施等项目都对城市地质调查工作提出了迫切的需求。“上海市三维城市地质调查”工作于2004年4月24日率先启动,是全国第一个由国土资源部和地方政府合作开展的全国城市地质调查试点项目。通过近三年的努力,中国地质调查局于2007年2月1日在上海城市地质调查成果报告会上总结了上海城市地质调查阶段成果和三维可视化信息系统的建设。基于中地公司MapGIS7三维平台开发的“三维可视化城市地质基础信息与咨询服务系统”贯穿于整个地质调查工作中。此次总结的阶段成果和三维可视化信息系统的贡献主要包括以下五个方面:

   (一)开展世博、临港新城地质调查,探索城市地质调查方法和服务社会经济建设的机制

   上海世博会会址区、临港新城规划区地质调查专题于2005年4月、2006年7月通过了中国地调局与上海市房地资源局的野外验收及成果评审,成果被评定为优秀级。两个项目均利用数字化技术,建立了三维可视化地质结构模型,具有创新性。

   世博会会址区地质环境调查查明了工程地质结构特征及与工程建设相关的水文地质条件,针对会址区地下空间开发特点,进行了适宜性评价;研究了会址区地面沉降对规划建设的影响,并针对防汛墙工程,布设监测点,分析会址区防汛墙沉降现状及原因,为防汛墙的改造、维护提供了可靠资料;开展了会址区环境地球化学调查,查明会址区重金属、有机污染物含量分布特征、存在形态及原因,为会址区土壤的修复提供基础数据。

   临港新城规划区地质结构调查总结了规划区冲填土的物理、力学特性及在动荷载作用下的变形特征;研究了规划区内地面沉降、岸带稳定性及土壤盐渍化等地质环境问题;分析了规划区地质结构及地质灾害特征,并结合新城规划特点,进行了工程建设适宜性评价;研究成果为新城规划提供了基础依据。

   (二)建立三维城市地质结构,为城市规划、土地规划与地下空间开发提供基础信息数据

   在充分收集已有资料的基础上,建立了上海三维城市地质结构数据库,包括了上海市四十余年地质调查的所有钻孔和测试数据,同时补充新的数据入库,建立了地质信息的标准更新机制。数据库中包括了基岩钻孔823个,第四纪地质结构钻孔数量720个,及全市水文地质普查、各水源地水文地质详查及地面沉降调查等工作中取得的495个水文地质钻孔和相关的测试数据。系统建立了1962年以来的全市地下水位、水质及地下水开采量、回灌量与地下水动态监测信息。收集工程地质钻孔近10万个,其中40000个钻孔已建立数据库,其中控制性钻孔为3400个,全市达到1:5万调查精度,中心城区达到1:1万(即城市详细规划)精度,在规划的新城区也已按照城市总体规划阶段要求建立了相应的工程地质结构数据库。系统还建立了自1921年以来的地面沉降监测数据库,包括全市、市区地面沉降动态和分层标沉降监测信息。同时,将1995年以来的地铁、隧道、城市高架、西气东输管网、防汛墙等生命线工程沉降信息纳入数据库。


图9:上海城市地质信息管理与服务系统--实现了海量地质信息的科学管理,提供了钻孔、空间地质图信息的查询和检索等功能
 

(三)开展地质灾害调查与评价,提高城市安全的保障能力

   对影响上海城市安全的地面沉降、海岸带冲淤等主要地质灾害进行调查评价,提出对策措施,确保城市安全。随着大规模城市建设、地下空间开发强度的增大和地下水开采的需要,地面沉降对轨道交通、防汛防涝、城市高架、重要桥梁等基础设施安全运营的影响日益显著,越来越引起政府管理部门的重视。2005年10月31日《上海市“十一五”地面沉降防治规划》要求至2007年全市平均地面沉降量控制在7毫米以内,至2010年,地面沉降量逐年递减。上海地面沉降防治取得了阶段成效。2000年全市平均地面沉降为12.3毫米,至2006年下降为7.5毫米。本次的城市地质调查工作对地面沉降防治工作推进起到了重要的技术支撑作用。例如,针对上海地区高层建筑群典型的布置方式以及不同的地层结构,进行模型试验,分析高层建筑群诱发地面沉降的规律和机理。在上海地区的区域地面沉降模型中首次实现了变系数三维地下水流模型与地面沉降模型的真正耦合。

图10:上海城市地质信息管理与服务系统--- 包括了自1962年以来的上海市地质环境监测数据,开发了地面沉降、地下水动态图形自动生成、分析评价功能
  

(四)系统调查了上海市地球化学环境状况

  查明了上海地区土壤、地下水环境中地球化学元素的总体分布特征。对上海市6700平方公里陆域和滩涂土壤地球化学环境进行了全覆盖调查,共取样12310个,进行了54个指标化学分析测试,依据国家标准对土壤环境质量进行了初步评价,为土地规划和管理提供了重要的基础数据及科学依据。随着城市产业结构调整,市区内大量历史工业厂址被用于住宅建设开发,而大部分住宅建设用地未进行必要的调查评估工作。本次城市地质调查工作,在充分利用环境地球化学调查获得的海量数据信息基础上,结合上海市开展的创建节能省地生态型住宅建设,提出将土壤环境质量也纳入到上海市生态住宅的评价体系中,并结合部分住宅开发区建设进行了试点研究,提出生态住宅建设地球化学环境标准。


图11:上海城市地质信息管理与服务系统——根据工程规划线路,信息系统可以自动生成工程线路地质剖面图和地质数据统计,为城市规划、工程设计人员提供高效率、直观的地质工作平台


图12:上海城市地质信息管理与服务系统--根据工程规划线路(如地铁或过江隧道等),信息系统可以自动生成工程线路的三维隧道,模拟地下空间开发中的工程地质结构变化和水文地质条件,为地下空间开发规划、设计、建设及管理提供科学依据,为城市地质灾害应急反应提供技术保障

  (五)建立三维可视化的城市地质信息管理平台,提高了社会服务水平

  加强地质工作信息化是促进城市地质现代化工作模式形成、快速反应能力提升的重要手段,与中国地质大学合作,共同开发了三维可视化的“上海市城市地质信息管理与服务平台”。该系统在科学管理海量地质数据基础上具有地质钻孔,地质剖面的自动编辑功能,根据设定的技术参数统计查明地质环境监测信息,并初步实现了地下空间的三维可视化显示和地质过程模拟。城市地质调查项目为地质工作创造了良好的发展环境和广阔的空间,但也面临着地质调查成果展现、信息共享等方面的实际问题。因此,信息化工作对于提高地质服务社会经济发展的能力,推进城市信息共享是十分重要的平台。

  初步建立了城市地质数据的综合管理平台,面向专业应用的综合分析评价,面向社会公众的信息服务,用直观的三维图形显示来代替枯燥的数据输出,借助人类强大的视觉及形象思维能力,使人们在三维图形世界中对地质数据进行本质上的分析和理解,从而获取深层次地质信息,实现地质成果表达的数字化、立体化、可视化、智能化。

  上海城市地质信息管理与服务系统分为三个子系统进行开发,地质数据录导入与管理子系统、地质数据分析评价子系统、以及基于Internet的城市地质信息发布系统组成。其中地质数据录导入与管理子系统用于城市地质基础数据的录导入与管理;地质数据分析评价子系统用于数据查询统计、专业分析评价、三维地质模拟;地质数据共享与社会化服务子系统用于城市地质信息的网络发布。


图13:上海城市地质信息管理与服务系统--通过建立规划区域三维地质结构模型,按工程规划和设计需要,自动生成工程沿线的三维地质结构图,直观地分析评价工程线路地质结构、不良地质条件等情况

  依托上海城市地质调查项目,对上海地质工作积累的丰富地质成果进行全面信息化。实现了上海地区地质、物探、化探、遥感及钻探等资料的一体化管理;同步整理地质钻孔、地面沉降监测数据,编制各专业地质图形空间数据库;基本建立了覆盖全市的地质信息数据库、同时,按原始资料数据、基础数据、模型数据、成果资料数据等分类原则,初步建立了分层次的数据库结构与管理系统,用户可以采用多种方式选择相关数据点进行属性查询、统计和分析。“上海城市地质数据中心”对多元的城市地质信息进行统一管理,通过城市地质网络信息平台及城市地质数据展示平台,实现地质数据共享、数据交换、数据服务。



图14:社会服务的窗口(上海城市地质信息网www.sigs.com.cn )

中地数码与上海市地质调查研究院合作开展的上海市三维可视化城市地质基础信息与咨询服务系统研发项目为中国地质调查局确定的六个试点城市(北京、上海、杭州、天津、广州、南京等)项目之一,成为试点城市项目中进展最为顺利,成效最显著的项目,项目研发情况及成果一直受到中国地质调查局、上海市房地局领导以及各试点城市有关部门的高度关注,形成了城市地质项目“全国看试点、试点看上海”的局面。


全球最全GIS解决方案的平台供应商

  中地数码集团专业从事GIS的研究、开发、应用和服务,建立了以MapGIS7为品牌的系列GIS平台软件和应用软件产品超过100种,广泛应用于地矿、土地、房产、供水、排水、燃气、电信、石化、电力、林业、农业、公安、安全、交通、国防、军事、大众化等各领域。中地数码集团先后承担了几十个国家级、省部级科研项目,包括国家863项目、国家“十五”重点科技攻关项目、国家火炬计划项目、科技部中小企业创新基金项目等,完成了1000多种地理空间信息项目,积累了丰富的GIS软件研发开发和工程应用经验,可以为用户度身定做解决方案。MapGIS7在国家GIS软件测评中连续10年名列第一,囊括了中国GIS项目中30%以上的优秀工程,取得国家涉密集成和甲级资质证书,被评为国家高科技产业化基地和载人航天有功单位。

  在面向服务第四代的地理系统MapGIS7的强有力的支持下,随着MapGIS7的数据中心和搭建平台的推出和应用推广,必将引起地理信息系统二次开发的革命式变革,把我们从传统的软件的开发模式解放出来,彻底地改变目前只有程序员才能进行软件开发的现状,使我们的增值开发商、合作伙伴和广大用户如虎添翼,受益匪浅,共同创造美好的GIS明天。

posted @ 2008-09-03 14:51 风过 无痕 阅读(507) | 评论 (0)编辑

EXCEL模板读写说明(转)

link: http://www.cnblogs.com/heone/archive/2008/08/29/1279189.html

author: 天下鹰

content:

 

简述

1.1       使用范围

该操作适用于VS2005及以上版本。

 

函数调用说明

1.1.1          引用的添加

右键添加引用Excel LibraryVS200511.0版本,VS200812.0版本

 

添加引用后会在程序的bin目录下有一个Interop.Excel.dll文件,在应用程序页面添加引用的命名空间 using Excel;

 

 

1.1.2          模板的读写方法

 读模板的话,首先模板存放在某个路径下,根据模板把从数据库里取出的数据写回EXCEL然后生成一个新的EXCEL存放都另一个路径以供下载,模板不变。

//建立一个Excel.Application的新进程

                            Excel.Application app = new Excel.Application();

                            if (app == null)

                            {

                                return;

                            }

                            app.Visible = false;

                            app.UserControl = true;

                            Workbooks workbooks = app.Workbooks;

                            _Workbook workbook = workbooks.Add(template_path + """测试.xls");//这里的Add方法里的参数就是模板的路径                            Sheets sheets = workbook.Worksheets;

                            _Worksheet worksheet = (_Worksheet)sheets.get_Item(1); //这里表示模板只有一个sheet

                            if (worksheet == null)

                            {

                               return;

                         }

 

如果没有实际的物理模板,可以继承一个空的模板进行读写

_Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);//这里的Add方法里的参数就相当于继承了一个空模板

单元格的赋值如下

worksheet.Cells[i, i] = "达达集团";//表示EXCEL表的第i行第i列,对其它行列的赋值也一样

1.1.3          方法的调用

关于单元格处理的操作类在ExcelOperate.cs类文件里

设置连续单元格边框颜色

worksheet.get_Range(worksheet.Cells[i,1],worksheet.Cells[i, 14]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//表示第i行的第1列到14列的边框颜色为黑色,只需给定开始单元格和结束单元格

设置行高

excelOperate.SetRowHeight(worksheet, worksheet.Cells[i,1],worksheet.Cells[i, 14], 24.75);//行高设定为24.75

设置连续单元格的背景颜色

excelOperate.SetBgColor(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14], System.Drawing.Color.Silver);//设置背景颜色为银白色

设置连续单元格的字体大小

excelOperate.SetFontSize(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14],16);//字体设为16号大小

单元格字体的设置

excelOperate.SetBold(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14]);//黑体字

单元格字体颜色设置

excelOperate.SetColor(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14], System.Drawing.Color.Red); //体字颜色设为红色

单元格内容剧中显示设置

excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[i,1],worksheet.Cells[i,14]);

合并单元格

worksheet.get_Range(worksheet.Cells[i,1],worksheet.Cells[i,14]).Merge(Missing.Value);//合并第i行1至14列的单元格                          worksheet.get_Range (worksheet.Cells[i,1],worksheet.Cells[i,1]).Value2 = "无赖集团";//给合并后的单元格赋值,合并后的单元格为第i行的第一个单元格

(注:如果在程序中动态合并单元格,合并前必须保证各单元格的内容为空,所以一般在合并相同内容的单元格之前,先保存原有的值,清空要合并的单元格的值,然后进行合并操作再赋值即可,之所以要清空是因为我们在操作实际的EXCEL合并单元格的时候,如果各单元格有值,鼠标操作合并的时候会提示“选定区域包含多重数值。合并到一个单元格后只能保留最左上角的数据” ,点确定后单元格会保留最左上单元格的值,而程序执行过程中遇到这种情况会直接导致程序执行中断,无法正常导出)

 

保存生成的EXCEL文件

workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//save_path为要保存到的文件路径

excelOperate.Dispose(worksheet, workbook, app);//生成好EXCEL文件后关闭Excel进程

 

EXCEL模板中含多个sheet的操作

1.    如果模板中只包含固定的多各sheet(以2各为例),可以这样进行读写访问

_Worksheet worksheet1 = (_Worksheet)sheets.get_Item(1);//读第一个sheet

_Worksheet worksheet2 = (_Worksheet)sheets.get_Item(2);//读第二个sheet

赋值操作和上面说的类似,如下:

Worksheet1.Cells[i, i] = "赖达犯罪集团";

Worksheet2.Cells[i, i] = "赖达破坏集团";

 

2.    如果要在应用程序中动态生成多个sheet(以其中一个sheet为样本生成),如要按月份生成每月一个sheet,那么模板中只需包含一个sheet模板,可根据选择的月份个数在应用程序中复制相同的几个sheet即可。

for (int i = 1; i < monthCount; i++)

 worksheet.Copy(Missing.Value, workbook.Worksheets[1]);//月统计工作薄,如果选择了三个月,即monthCount=3,那么就会再复制两个相同的sheet,然后进行读写操作,如下面的代码片段:

 

int item_id = 1;

_Worksheet ws = null;

for (int i = 0; i < tableMM.Rows.Count; i++)

{

 ……

if (tableMM.Rows[i]["DATE_MONTH"].ToString() == Month)

{

 ws = (_Worksheet)sheets.get_Item(item_id);

ws.Cells[3 + i, 1] = rowNum;

ws.Cells[3 + i, 2] = tableMM.Rows[i]["PROJNO"];

   continue;

}

……

ws.Name = "XX月份";//sheet的名称

item_id++;

}

posted @ 2008-08-29 21:52 风过 无痕 阅读(342) | 评论 (0)编辑

arcengine 要素渲染和专题图制作

一.Feature的基本渲染方法
    Feature的常用的绘制方法包括:1.简单绘制;2.唯一值绘制/多字段唯一值绘制;3.点密度/多字段点密度绘制;4.数据分级绘制;5.质量图(饼图/直方图); 6.按比例尺渲染;7.比例符号渲染。
  1.简单渲染
    简单渲染是ArcEngine的默认渲染,我们打开一个FeatureClass,建立一个FeatureLayer的时候,如果没有给FeatureLayer设置Renderer那么使用的就是简单渲染。简单渲染对整个图层中的所有Feature使用同一种方式显示。简单渲染在ArcEngine中用ISimpleRenderer来表示,ISimpleRenderer的使用方式如下:
//假设layer是一个IFeatureLayer,获取IGeoFeatureLayer
  IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;
  //构造SimpleRenderer
  ISimpleRenderer renderer=new SimpleRendererClass();
  renderer.description="简单的渲染一下";
  renderer.Label="符号的标签";
  //假设sym是一个和该图层中Geometry类型对应的符号;
  renderer.Symbol=sym;
  //为图层设置渲染,注意需要刷新该图层。
  geoLayer.Renderer=renderer;
  2.独立值/多字段独立值渲染
    独立值/多字段独立值渲染,根据Feature的某一个字段的数据或某几个字段的组合结果来确定符号。具有相同值或相同组合值的Feature,使用一样的符号。在使用多个字段的使用,每个字段的取值之间使用分割符来连接。字段的取值顺序和在Renderer中设置的一样。基本使用方式如下:
  //假设layer是一个IFeatureLayer,获取IGeoFeatureLayer
  IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;
  //构造一个UniqueValueRenderer
  IUniqueValueRenderer renderer=new UniqueValueRendererClass();
  //假设使用两个字段来渲染
  renderer.FieldCount=2;
  //假设YSLX字段表示要素类型
  //假设YSYT字段表示要数用途
  renderer.set_Field(0,"YSLX");
  renderer.set_Field(1,"YSYT");
  //字段之间使用 | 来连接(默认取值)
  renderer.FieldDelimiter="|";
  //设置默认符号
  renderer.DefaultSymbol=defaultSymbol;
  renderer.DefaultLabel="默认Label";
  //添加值
  renderer.addValue("房屋|民居","民居房屋",MJSymbol);
  renderer.addValue("房屋|商业用地","商业用地",SYSymbol);
  ...
  //还可以通过set_Symbol,set_Heading、set_Value来修改上述设置。
  geoLayer.Renderer=renderer.
  3.点密度/多字段点密度
    点密度图通过在Feature的图形上打点来表示数据的数多,点越密集表示数据量越大。还可以使用多字段的点密度图。这个使用同一个Feature上就可以显示几种不同的点。注意点密度图有一个特殊的地方,点密度图使用的符号是面状符号。而其中有需要包括点状符号,接口使用如下:
  IDotDensityRenderer renderer=new DotDensityRendererClass ();
   IRendererFields flds=(IRendererFields)renderer;
   flds.AddField("MJ ","面积");
   flds.AddField("RK","人口");
   IDotDensityFillSymbol ddSym=new DotDensityFillSymbolClass();
   ISymbolArray symArray=(ISymbolArray)ddSym;
   symArray.AddSymbol(mjSymbol);
   symArray.AddSymbol(rkSymbol);
   ddSym.Outline =(ILineSymbol)outlineSymbol ;  
   ddSym.DotSize =10 ;
   ddSym.FixedPlacement=true;  
  
   renderer.DotDensitySymbol =ddSym;
   renderer.DotValue=20 ;
   renderer.MaintainSize=this.m_dotdensityParam .MaintainSize ;
   IGeoFeatureLayer geoLayer=(IGeoFeatureLayer)layer ;
   geoLayer.Renderer =(IFeatureRenderer)renderer;
4.数据分级绘制(使用IClassBreaksRenderer)
5.饼图/直方图(使用IChartRenderer)
6.按比例尺渲染(使IScaleDependentRenderer)
7.比例符号渲染(使用 IProportionalSymbolRenderer )
二.图例的使用
    图例的使用通过ILegendInfo接口。每个Renderer都实现了该接口,但是有时候该实现不好用,所以也可以自己实现该接口。实现过程是比较简单的。
三.渲染层次
    使用ILevelRender 接口。该接口可以指定一 当前的Level(-1)表示绘制全部。然后提供一个符号数组,注意每个符号要指定Level,如果不指定就默认为0。
四.透明度控制
    透明度控制使用 ITransparencyRenderer 接口。该接口允许指定一个字段,字段取值用来表示透明度 注意 透明度的取值在0--100之间。
五.数据正规化
    数据正规化用 IDataNormalization 接口来表示。该接口提供了几种正规化表示方法。
六.部分渲染
    部分渲染通过使用IDataExclusion  来实现。该接口允许提供过滤语句来过滤掉不需要渲染的Feature。同时也可以给他们制定特殊的符号。同时控制是否显示
七.旋转控制
    旋转控制通过使用IRotationRenderer 接口来表示。该接口要求提供旋转角度的字段。同时要求提供旋转的方法。
八.数据样本
    IDataSampling  没有使用过。
九.外表关联
ITable dispTable=((IDisplayTable)feaLayer).DisplayTable ;//图层
ITable attTable;//外表
IMemoryRelationshipClassFactory fac=new MemoryRelationshipClassFactoryClass ();
IRelationshipClass relClass=fac.Open("JZMJ",(IObjectClass)dispTable,"ZDDJH",
   IObjectClass)attTable,"G03",
   "Forward","Backward",
   esriRelCardinality.esriRelCardinalityOneToOne);
IDisplayRelationshipClass dispRelClass=feaLayer as IDisplayRelationshipClass ;
dispRelClass.DisplayRelationshipClass(relClass,esriJoinType.esriLeftInnerJoin);
十.统计分析
   ITableHistogram  tableHistogram=new BasicTableHistogramClass ();
  tableHistogram.Table =((IDisplayTable)layer).DisplayTable  ;
  tableHistogram.Field =fieldName ;
  object valueArray=null, freq=null;
  IBasicHistogram basicHistogram=(IBasicHistogram)tableHistogram;
  basicHistogram.GetHistogram(out valueArray,out freq);
  IClassify classify=null;
   int breakNum=6;
   //分类方法
   switch(ClassifyMethod )
   {
    case ClassifyMethodName.lsClassifyMethodEqualInterval:
    {
      EqualIntervalClass  eq=new EqualIntervalClass ();
      eq.Classify (valueArray,freq,ref breakNum);
      classify=(IClassify)eq;    
      break;
    }
    case ClassifyMethodName.lsClassifyMethodStandardDeviation:
    {
      StandardDeviationClass sd=new StandardDeviationClass ();
      IStatisticsResults stat= histogram as IStatisticsResults ;
      classify=sd as IClassify;
      classify.SetHistogramData (valueArray,freq);
      IDeviationInterval di=sd as IDeviationInterval ;
      di.DeviationInterval=1;
      di.Mean=stat.Mean;
      di.StandardDev=stat.StandardDeviation;
      classify.Classify (ref breakNum);    
      break;
    }
    case ClassifyMethodName.lsClassifyMethodQuantile:
    {
      Quantile qc=new QuantileClass ();
      qc.Classify (valueArray,freq,ref breakNum);
      classify=qc as IClassify ;    
      break;
    }
    case ClassifyMethodName.lsClassifyMethodNaturalBreaks:
    {
      NaturalBreaksClass nb=new NaturalBreaksClass ();
      nb.Classify (valueArray,freq,ref breakNum);
      classify=nb as IClassify ;    
      break;
    }
    case ClassifyMethodName.lsClassifyMethodDefinedInterval:
    {
     DefinedIntervalClass di=new DefinedIntervalClass ();
     di.IntervalRange =this.m_classBreaksParam .Interval ;
     di.Classify (valueArray,freq,ref breakNum);
     classify=di as IClassify ;
     break;
    }
    default:
    {
     EqualIntervalClass  eq=new EqualIntervalClass ();
     eq.Classify (valueArray,freq,ref breakNum);
     classify=(IClassify)eq;
     break;
    }
   }  
   object o=classify.ClassBreaks ;
   System.Array breakArray= o as System.Array;
   现在breakArray中就是统计后的数据了。

posted @ 2008-08-18 10:24 风过 无痕 阅读(421) | 评论 (0)编辑

用程序实现从带高程的点数据到等高线的转换

link: http://www.gisempire.com/blog/more.asp?name=gis&id=86

 

内容摘要 从高程点到等高线不是一步实现的,而是先把高程点先插值生成TIN,然后再从TIN生成等高线。在从TIN到等高线的生成过程中8.3和9.0上还有点区别,请看代码注释。下面的是整个过程的代码实例。 过程描述 '打开高程点数据
Dim pFeatureLayer As IFeatureLayer
Set pFeatureLayer = MapControl1.Map.Layer(0)
If pFeatureLayer Is Nothing Then Exit Sub
Dim pFeatureClass As IFeatureClass
Set pFeatureClass = pFeatureLayer.FeatureClass

'生成TIN
Dim pTinEdit As ITinEdit
Dim pTinSurface As ISurface
Dim pTable As ITable
Set pTinEdit = New Tin
Set pTable = New FeatureLayer
pTinEdit.InitNew MapControl1.ActiveView.Extent
Dim pField As IField
Set pField = pFeatureClass.Fields.Field(pFeatureClass.Fields.FindField("Well_Dpth"))
pTinEdit.AddFromFeatureClass pFeatureClass, Nothing, pField, Nothing, 18

Set pTinSurface = pTinEdit

'打开已经创建好的空的等高线数据(也可以在此时创建一个要素类9,如果是9.0版本的话,在空等高线数据中预先需要建一个字段来存储高
'程值,如果是8.3版本的话就不可以预先创建这样的一个高程字段,而是在生成等高线过程中根据你指定的
'字段名称实时创建
Dim pPropset As IPropertySet
Set pPropset = New PropertySet

Dim pFact As IWorkspaceFactory
Dim pWorkspace As IWorkspace

pPropset.SetProperty "DATABASE", App.Path + "\data\"

Set pFact = New ShapefileWorkspaceFactory
Set pWorkspace = pFact.Open(pPropset, Me.hWnd)

Dim pFeatureWorkspace As IFeatureWorkspace
Set pFeatureWorkspace = pWorkspace

Dim pFeatureClass1 As IFeatureClass
Set pFeatureClass1 = pFeatureWorkspace.OpenFeatureClass("MyShape33")

'生成等高线
pTinSurface.Contour 0, 50, pFeatureClass1, "Well_Dpth", 1

Dim pFLayer As IFeatureLayer
Set pFLayer = New FeatureLayer
Set pFLayer.FeatureClass = pFeatureClass1

MapControl1.AddLayer pFLayer
MapControl1.ActiveView.Refresh

posted @ 2008-08-18 09:52 风过 无痕 阅读(281) | 评论 (0)编辑

arcEngine经典代码-添加气泡提示框(标注,文本,)

    private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
       
            if (i >= 3)//测试目的
                return;
            i++;

            ITextElement te = createTextElement(e.mapX,e.mapY,"魁x");
            axMapControl1.ActiveView.GraphicsContainer.AddElement(te as IElement, 1);
            axMapControl1.Refresh(esriViewDrawPhase.esriViewGraphics, null, null);

    
        }
        int i;

        public IBalloonCallout createBalloonCallout(double x, double y)
        {
            IRgbColor rgb = new RgbColorClass();
            {
                rgb.Red = 255;
                rgb.Green = 255;
                rgb.Blue = 200;

            }
            ISimpleFillSymbol sfs = new SimpleFillSymbolClass();
            {
                sfs.Color = rgb;
                sfs.Style = esriSimpleFillStyle.esriSFSSolid;
            }

            IPoint p = new PointClass();
            {
                p.PutCoords(x, y);
            }

            IBalloonCallout bc = new BalloonCalloutClass();
            {
                bc.Style = esriBalloonCalloutStyle.esriBCSRoundedRectangle;
                //
                bc.Symbol = sfs;
                //
                bc.LeaderTolerance = 10;
                //1

                bc.AnchorPoint = p;
            }

            return bc;
        }

        public ITextElement createTextElement(double x, double y, string text)
        {
            IBalloonCallout bc = createBalloonCallout(x, y);
           
            IRgbColor rgb = new RgbColorClass();
            {
                //rgb.Red = 255;
                rgb.Green = 255;
            }
            ITextSymbol ts = new TextSymbolClass();
            {
                ts.Color = rgb;
            }

            IFormattedTextSymbol fts = ts as IFormattedTextSymbol;
            {
                fts.Background = bc as ITextBackground;
            }
            //fts.Size = 8;
            ts.Size = 8;

            IPoint point = new PointClass();
            {
                double width = axMapControl1.Extent.Width / 13;
                double height = axMapControl1.Extent.Height / 20;
                point.PutCoords(x + width, y + height);
            }

            ITextElement te = new TextElementClass();
            //IMarkerElement me = new MarkerElementClass();
            {
                te.Symbol = ts;
                //ts.Text = text;
                te.Text = text;
            }

            IElement e = te as IElement;
            {
                e.Geometry = point;
            }
            return te;

        }
    }

posted @ 2008-08-11 18:56 风过 无痕 阅读(504) | 评论 (1)编辑

arcEngine 经典代码(转)

画点
[C#]
public void OnMouseDown(int Button, int Shift, int X, int Y)
{
  IMxDocument mxDoc = m_App.Document as IMxDocument;
  IActiveView activeView = mxDoc.FocusMap as IActiveView;
  IScreenDisplay screenDisplay = activeView.ScreenDisplay;
  screenDisplay.StartDrawing(screenDisplay.hDC, (short)  esriScreenCache.esriNoScreenCache);
  screenDisplay.SetSymbol(new SimpleMarkerSymbolClass());
  screenDisplay.DrawPoint(mxDoc.CurrentLocation);
  screenDisplay.FinishDrawing();
}
画线
public void OnMouseDown(int Button, int Shift, int X, int Y)
{
  IMxDocument mxDoc = m_App.Document as IMxDocument;
  IActiveView activeView = mxDoc.FocusMap as IActiveView;
  IScreenDisplay screenDisplay = activeView.ScreenDisplay;
  ISimpleLineSymbol lineSymbol = new SimpleLineSymbolClass();
  IRgbColor rgbColor = new RgbColorClass();
  rgbColor.Red = 255;
  lineSymbol.Color = rgbColor;
  IRubberBand rubberLine = new RubberLineClass();
  IPolyline newPolyline = (IPolyline)rubberLine.TrackNew(screenDisplay, (ISymbol)lineSymbol);
  screenDisplay.StartDrawing(screenDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
  screenDisplay.SetSymbol((ISymbol)lineSymbol);
  screenDisplay.DrawPolyline(newPolyline);
  screenDisplay.FinishDrawing();
}
画线2
{
        ICartographicLineSymbol pCartoLineSyl;
                                pCartoLineSyl = new CartographicLineSymbolClass();
                                pCartoLineSyl.Color = getRGB(255, 110, 210);
                                pCartoLineSyl.Cap = esriLineCapStyle.esriLCSButt;
                                pCartoLineSyl.Join = esriLineJoinStyle.esriLJSBevel;
                                pCartoLineSyl.Width=4;
                                pCartoLineSyl.MiterLimit=4;
                        ILineProperties pLinePro ;
                                pLinePro = pCartoLineSyl as ILineProperties;//取地址
                        ISimpleLineDecorationElement pSimpleLineDecoEle;
                                pSimpleLineDecoEle = new SimpleLineDecorationElementClass();
                                pSimpleLineDecoEle.FlipAll = true;
                                pSimpleLineDecoEle.FlipFirst = true;
                        ILineDecoration pLineDeco;
                                pLineDeco = new LineDecorationClass();
                                pLineDeco.AddElement(pSimpleLineDecoEle);
                                        pLinePro.LineDecoration = pLineDeco;
                                        pLinePro.DecorationOnTop=true;
                        IGeometry pGeo;
                                pGeo = axMapControl2.TrackLine();
                        object oLineSymbol = pCartoLineSyl;
                        axMapControl2.DrawShape(pGeo, ref oLineSymbol);
}
画线3
private void axMapControl2_OnMouseDown(object sender, AxESRI.ArcGIS.MapControl.IMapControlEvents2_OnMouseDownEvent e)
                {       
//                        ISimpleLineSymbol pLineSyl;
//                                pLineSyl = new SimpleLineSymbolClass();
//                                pLineSyl.Color = getRGB(30, 60, 90);
//                                pLineSyl.Width = 4;
//                                pLineSyl.Style = esriSimpleLineStyle.esriSLSDashDot;
                        ICartographicLineSymbol pCartoLineSyl;
                                pCartoLineSyl = new CartographicLineSymbolClass();
                                //pCartoLineSyl.Color = getRGB(255, 110, 210);
                                pCartoLineSyl.Cap = esriLineCapStyle.esriLCSButt;
                                pCartoLineSyl.Join = esriLineJoinStyle.esriLJSBevel;
                                pCartoLineSyl.Width=10;
                                pCartoLineSyl.MiterLimit=4;
                        ILineProperties pLinePro ;
                                pLinePro = pCartoLineSyl as ILineProperties;//取地址
                        ISimpleLineDecorationElement pSimpleLineDecoEle;
                                pSimpleLineDecoEle = new SimpleLineDecorationElementClass();
                                pSimpleLineDecoEle.FlipAll = true;
                                pSimpleLineDecoEle.FlipFirst = true;
                        ILineDecoration pLineDeco;
                                pLineDeco = new LineDecorationClass();
                                pLineDeco.AddElement(pSimpleLineDecoEle);
                                        pLinePro.LineDecoration = pLineDeco;
                                        pLinePro.DecorationOnTop=true;
                        ILineFillSymbol pLineFillSymbol =new LineFillSymbolClass();
                                pLineFillSymbol.Offset=3;
                                pLineFillSymbol.Angle=45;
                                pLineFillSymbol.Offset=10;
                        IFillSymbol pFillSymbol =pLineFillSymbol as IFillSymbol;
                                pFillSymbol.Color=getRGB(0,0,200);
                                pFillSymbol.Outline=pCartoLineSyl;
                        ICharacterMarkerSymbol pCharacterMarkerSymbol;
                                pCharacterMarkerSymbol = new CharacterMarkerSymbolClass();
                                //设置它的字符,114为‘r’
                                pCharacterMarkerSymbol.CharacterIndex = 114;
                        IMarkerFillSymbol pMarkerFillSymbol =new MarkerFillSymbolClass();
                                pMarkerFillSymbol.Outline=pCartoLineSyl;
                                pMarkerFillSymbol.Style=esriMarkerFillStyle.esriMFSRandom;
                                pMarkerFillSymbol.MarkerSymbol=pCharacterMarkerSymbol;
                                pMarkerFillSymbol.GridAngle=45;
                                pMarkerFillSymbol.Color=getRGB(0,255,255);
                        IGeometry pGeo;
                        pGeo = axMapControl2.TrackLine();
                        object oLineSymbol = pCartoLineSyl;
                       
                        axMapControl2.DrawShape(pGeo, ref oLineSymbol);


                       
       

                }
画面
public void OnMouseDown(int Button, int Shift, int X, int Y)
{
  IMxDocument mxDoc = m_App.Document as IMxDocument;
  IActiveView activeView = mxDoc.FocusMap as IActiveView;
  IScreenDisplay screenDisplay = activeView.ScreenDisplay;
  ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass();
  IRgbColor rgbColor = new RgbColorClass();
  rgbColor.Red = 255;
  fillSymbol.Color = rgbColor;
  IRubberBand rubberPolygon = new RubberPolygonClass();
  IPolygon newPolygon = (IPolygon)rubberPolygon.TrackNew(screenDisplay, (ISymbol)fillSymbol);
  screenDisplay.StartDrawing(screenDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
  screenDisplay.SetSymbol((ISymbol)fillSymbol);
  screenDisplay.DrawPolygon(newPolygon);
  screenDisplay.FinishDrawing();
}
画矩形
public void OnMouseDown(int Button, int Shift, int X, int Y)
{
  IMxDocument mxDoc = m_App.Document as IMxDocument;
  IActiveView activeView = mxDoc.FocusMap as IActiveView;
  IScreenDisplay screenDisplay = activeView.ScreenDisplay;
  ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass();
  IRgbColor rgbColor = new RgbColorClass();
  rgbColor.Red = 255;
  fillSymbol.Color = rgbColor;
  IRubberBand rubberEnv = new RubberEnvelopeClass();
  IEnvelope newEnvelope = (IEnvelope)rubberEnv.TrackNew(screenDisplay, (ISymbol)fillSymbol);
  screenDisplay.StartDrawing(screenDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
  screenDisplay.SetSymbol((ISymbol)fillSymbol);
  screenDisplay.DrawRectangle(newEnvelope);
  screenDisplay.FinishDrawing();
}

posted @ 2008-07-26 11:06 风过 无痕 阅读(747) | 评论 (0)编辑

arcEngine 经典代码-编辑

1 [vc]geo包装1

link: http://blog.csdn.net/gm316/archive/2007/10/07/1813634.aspx

void CagGeometrys::AddTrack(CMapControlDefault &mc, hdcGeometryType gt,long button, long shift, long x, long y, double mapX, double mapY)
{
 //演示rubber的操作,mc中才提供包装结果track,在vba中应该用rubber
 if(e_bUnique)
  e_geos.clear();

 switch(gt)
 {
 case gt_Point:
  {
   IPointPtr pt(__uuidof(Point));
   pt->PutCoords(mapX,mapY);
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=pt;
   e_geos.insert(e_geos.end(),g);
  }
  break;
 case gt_Rectangle:
  {
   IEnvelopePtr env=mc.TrackRectangle();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=env;
   e_geos.insert(e_geos.end(),g);
  }
  break;

 case gt_Polyline:
  { /*
   IPolylinePtr pl=mc.TrackLine();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=pl;
   e_geos.insert(e_geos.end(),g);
   */
   
   IActiveViewPtr av;
   IScreenDisplayPtr sd;
   av=mc.GetActiveView();
   av->get_ScreenDisplay(&sd);

   ISymbolPtr sym;
   IGeometryPtr *geo=new IGeometryPtr;
   IRubberBandPtr rp(__uuidof(RubberLine));
   rp->TrackNew(sd,sym,&(*geo)); //应该可以在track就有symbol效果
   e_geos.insert(e_geos.end(),geo);

   //转换用QI,应该ok
   //IPolylinePtr line;
   //line=*geo;
  }
  break;

 case gt_Circle:
  {
   IPolygonPtr c=mc.TrackCircle();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=c;
   e_geos.insert(e_geos.end(),g);
  }
  break;

 case gt_Polygon:
  {
   IPolygonPtr pg=mc.TrackPolygon();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=pg;
   e_geos.insert(e_geos.end(),g);
  }
  break;

 case gt_Text_Point:
  {

   textInfo *ti=new textInfo;
   IPointPtr pt(CLSID_Point);
   pt->PutCoords(mapX,mapY);
   ti->geo=pt;

   IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
   short res;
   gsd->DoModal(L"title",L"label",L"",NULL,&res);
   CComBSTR bstr;
   CString str;
   gsd->get_Value(&bstr);
   str=bstr;
   strcpy(ti->text,str);
   
   e_texts.insert(e_texts.end(),ti);

  }
  break;

 case gt_Text_Polyline:
  {
   textInfo *ti=new textInfo;
   ti->geo=mc.TrackLine();

   IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
   short res;
   gsd->DoModal(L"title",L"label",L"",NULL,&res);
   CComBSTR bstr;
   CString str;
   gsd->get_Value(&bstr);
   str=bstr;
   strcpy(ti->text,str);
   
   e_texts.insert(e_texts.end(),ti);

  }
  break;

 case gt_Text_Polygon:
  {

   textInfo *ti=new textInfo;
   ti->geo=mc.TrackPolygon(); //可以模拟圆形,矩形等

   IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
   short res;
   gsd->DoModal(L"title",L"label",L"",NULL,&res);
   CComBSTR bstr;
   CString str;
   gsd->get_Value(&bstr);
   str=bstr;
   strcpy(ti->text,str);
   
   e_texts.insert(e_texts.end(),ti);

  }
  break;

 }

 IActiveViewPtr av=mc.GetActiveView();
 av->Refresh();
}

void CagGeometrys::Draw(CMapControlDefault &mc)
{
 //draw geometry
 long i,count;
 count=e_geos.size();
 for(i=0;i<count;i++)
 {
  mc.DrawShape((*e_geos[i]),NULL);
 }

 {
  ISelectionTrackerPtr sk;
  sk.CreateInstance(__uuidof(EnvelopeTracker));

  IActiveViewPtr av=mc.GetActiveView();
  IScreenDisplayPtr sd;
  av->get_ScreenDisplay(&sd);

  IEnvelopePtr env;
  count=e_sels.size();
  for(i=0;i<count;i++)
  {
   (*e_sels[i])->get_Envelope(&env);
   sk->put_Geometry(env);
   sk->Draw(sd,NULL,esriTrackerDominant);
  }
 }

 //文本
 count=e_texts.size();
 for(i=0;i<count;i++)
 {
  IMapPtr map=mc.GetMap();
  IActiveViewPtr av=mc.GetActiveView();
  IScreenDisplayPtr sd;
  av->get_ScreenDisplay(&sd);
/* 屏幕中间
  ITextSymbolPtr t(__uuidof(TextSymbol));
  IFontDispPtr f; //无用途
  t->get_Font(&f);
  t->put_Size(18.0);
  OLE_HANDLE hdc;
  sd->get_hDC(&hdc);
  sd->StartDrawing(hdc,esriNoScreenCache);
  ISymbolPtr s=t;
  sd->SetSymbol(s);
  IAreaPtr a;
  IDisplayTransformationPtr dt;
  sd->get_DisplayTransformation(&dt);
  IEnvelopePtr e;
  dt->get_VisibleBounds(&e);
  a=e;
  IPointPtr pt;
  a->get_Centroid(&pt);
  sd->DrawText(pt,L"test");
*/
  ITextSymbolPtr t(__uuidof(TextSymbol));
  IColorPtr c(__uuidof(RgbColor));
  c->put_RGB(RGB(0,0,255));
  t->put_Color(c);
  IFontDispPtr f; //无用途
  t->get_Font(&f);
  t->put_Size(18.0);
  OLE_HANDLE hdc;
  sd->get_hDC(&hdc);
  sd->StartDrawing(hdc,esriNoScreenCache);
  ISymbolPtr s=t;
  sd->SetSymbol(s);
  USES_CONVERSION;
  //点位置是字符底部中间
  sd->DrawText(e_texts[i]->geo,A2W(e_texts[i]->text));
  sd->FinishDrawing();
 }
}

void CagGeometrys::HitTest(double x, double y)
{
 /*
esriGeometryNull          = 0
esriGeometryPoint         = 1
esriGeometryMultipoint    = 2
esriGeometryPolyline      = 3
esriGeometryPolygon       = 4
esriGeometryEnvelope      = 5
esriGeometryPath          = 6
esriGeometryAny           = 7
esriGeometryMultiPatch    = 9
esriGeometryRing          = 11
esriGeometryLine          = 13
esriGeometryCircularArc   = 14
esriGeometryBezier3Curve  = 15
esriGeometryEllipticArc   = 16
esriGeometryBag           = 17
esriGeometryTriangleStrip = 18
esriGeometryTriangleFan   = 19
esriGeometryRay           = 20
esriGeometrySphere        = 21
*/
/*
HRESULT HitTest(
  IPoint* QueryPoint,
  double searchRadius,
  esriGeometryHitPartType geometryPart,
  IPoint* hitPoint,
  double* hitDistance,
  long* hitPartIndex,
  long* hitSegmentIndex,
  VARIANT_BOOL* bRightSide,
  VARIANT_BOOL* bHit
);
*/
 e_sels.clear();
 
 esriGeometryType gt;
 long i,count=e_geos.size();
 for(i=0;i<count;i++)
 {
  (*e_geos[i])->get_GeometryType(&gt);
  switch(gt)
  {
  case esriGeometryPoint:
   { //OK,但是被选择的显示方式有问题
    IHitTestPtr ht;
    IPointPtr pt;
    pt=e_geos[i];
    ht=pt;

    IPointPtr qp(__uuidof(Point));
    qp->PutCoords(x,y);

    IPointPtr hp(__uuidof(Point));
    double hd;
    long hpi,hs;
    short rs,h;
    ht->HitTest(qp,5.0,esriGeometryPartBoundary,hp,&hd,&hpi,&hs,&rs,&h);

    if(h==-1)
    {
     e_sels.insert(e_sels.end(),e_geos[i]);
    }
   }
   break;
  case esriGeometryPolyline:
   {
    IHitTestPtr ht;
    IPolylinePtr pl;
    pl=e_geos[i];
    ht=pl;

    IPointPtr qp(__uuidof(Point));
    qp->PutCoords(x,y);

    IPointPtr hp(__uuidof(Point));
    double hd;
    long hpi,hs;
    short rs,h;
    ht->HitTest(qp,5.0,esriGeometryPartBoundary,hp,&hd,&hpi,&hs,&rs,&h);

    if(h==-1)
    {
     e_sels.insert(e_sels.end(),e_geos[i]);
    }
   }
   break;

  case esriGeometryEnvelope:
  case esriGeometryPolygon:
   {
    IPointPtr qp(__uuidof(Point));
    qp->PutCoords(x,y);

    IRelationalOperatorPtr ro;
    ro=e_geos[i];
    short yes;
    ro->Contains(qp,&yes);
    if(yes==-1)
    {
     e_sels.insert(e_sels.end(),e_geos[i]);
    }
   }
   break;
  }
 }

}

long CagGeometrys::GetSelectCount()
{
 return (e_sels.size());
}

void CagGeometrys::ClearSelect()
{
 e_sels.clear();
}

BOOL CagGeometrys::DeleteSelect()
{
 long i,j,count1,count=e_sels.size();
 
 //sel中不一定是用了geos中顺序,并且选择后可能添加了新的geo
 for(i=0;i<count;i++)
 {
  count1=e_geos.size();
  for(j=0;j<count1;j++)
  {
   if(e_geos[j]==e_sels[i])
   {
    e_geos.erase(e_geos.begin()+j);
    break;
   }
  }
 }

 return TRUE;
}

void CagGeometrys::Move(CMapControlDefault &mc)
{
 IActiveViewPtr av;
 av=mc.GetActiveView();

 IScreenDisplayPtr sd;
 av->get_ScreenDisplay(&sd);
 
 ISymbolPtr sym;
 IGeometryPtr geo=(*e_sels[0]);
 IRubberBandPtr rb;
 short c;

 esriGeometryType gt;
// long i,count=e_sels.size();
// for(i=0;i<count;i++) 每次只可以移动一个shape
 {
  (*e_sels[0])->get_GeometryType(&gt);
  switch(gt)
  {
  case esriGeometryPoint:
   rb.CreateInstance(CLSID_RubberPoint);
   break;
  case esriGeometryPolyline:
   rb.CreateInstance(CLSID_RubberLine);
   break;

  case esriGeometryEnvelope:
   rb.CreateInstance(CLSID_RubberEnvelope); //移动后图形消失
//   rb.CreateInstance(CLSID_RubberPolygon);//无效果
   break;

  case esriGeometryPolygon: //包括了circle
   rb.CreateInstance(CLSID_RubberPolygon);
   break;
  }
 }

 if(rb!=NULL)
  rb->TrackExisting(sd,sym,geo,&c); 
 av->Refresh();

}

BOOL CagGeometrys::AddImportPoint(CString sPathFile)
{
 FILE *f;
 f=fopen(sPathFile,"rt");
 if(f==NULL)
 {
  AfxMessageBox("无法打开指定文件.");
  return FALSE;
 }

 IPointCollectionPtr pc(__uuidof(Multipoint));
 IPointPtr pt;
 double x,y;
 while(1)
 {
  if(fscanf(f,"%lf %lf",&x,&y)!=2)
   break;
  
  pt.CreateInstance(CLSID_Point);
  pt->put_X(x);
  pt->put_Y(y);
  pc->AddPoint(pt);
 }
 fclose(f);

 if(e_bUnique)
  e_geos.clear();

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pc;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}


BOOL CagGeometrys::AddImportPolyline(CString sPathFile)
{
 FILE *f;
 f=fopen(sPathFile,"rt");
 if(f==NULL)
 {
  AfxMessageBox("无法打开指定文件.");
  return FALSE;
 }

 double x,y;
 IPointPtr pt;
 IPointCollectionPtr pts(CLSID_Polyline);
 while(1)
 {
  if(fscanf(f,"%lf %lf",&x,&y)!=2)
   break;
  
  pt.CreateInstance(CLSID_Point);
  pt->put_X(x);
  pt->put_Y(y);
  pts->AddPoint(pt);
 }
 fclose(f);

 if(e_bUnique)
  e_geos.clear();

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pts;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

BOOL CagGeometrys::AddImportPolygon(CString sPathFile)
{
 FILE *f;
 f=fopen(sPathFile,"rt");
 if(f==NULL)
 {
  AfxMessageBox("无法打开指定文件.");
  return FALSE;
 }

 IPolygonPtr pg(CLSID_Polygon);

 double x,y;
 IPointPtr pt;
 IPointCollectionPtr pts(__uuidof(Ring));
 while(1)
 {
  if(fscanf(f,"%lf %lf",&x,&y)!=2)
   break;
  
  pt.CreateInstance(CLSID_Point);
  pt->put_X(x);
  pt->put_Y(y);
  pts->AddPoint(pt);
 }
 fclose(f);

 IRingPtr r=pts;
 r->Close();
 IGeometryCollectionPtr gc=pg;
 gc->AddGeometry(r);

 if(e_bUnique)
  e_geos.clear();

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pg;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

BOOL CagGeometrys::AddPoint(double x, double y)
{
 if(e_bUnique)
  e_geos.clear();

 IPointPtr pt(__uuidof(Point));
 pt->PutCoords(x,y);
 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pt;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

BOOL CagGeometrys::AddCircle(double x, double y, double r)
{
 if(e_bUnique)
  e_geos.clear();

 IPointPtr pt(__uuidof(Point));
 IConstructCircularArcPtr cca(__uuidof(CircularArc));
 pt->PutCoords(x,y);
 cca->ConstructCircle(pt,r,-1);

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=cca;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

 

2 绘制一条polyline

可以使用AE里面的  IRubberBand 接口画在MapControl上:

  IRubberBand rubberLine = new RubberLineClass();
  IPolyline polyLine = (IPolyline)rubberLine.TrackNew(pActiveView.ScreenDisplay, null);

//设置图形的样式
  m_Symbol = SetDisplaySymbol(polyLine);
      
   //画出图形
  pActiveView.ScreenDisplay.StartDrawing(m_QueryMap.ActiveView.ScreenDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
  pActiveView.ScreenDisplay.DrawPolyline(pGeometry);
  pActiveView.Refresh();
  pActiveView.ScreenDisplay.FinishDrawing();

 

通过point构造Segment,再构造path,再构造polyline

用到ISegmentCollection,IPointCollection等接口,帮助里有个例子

The following subs are demonstrating how to create valid polylines efficiently.

A. Geometry type: Polyline

1. createMultipartPolylinePathSegmentCollection: Create a multipart polyline using path via ISegmentCollection.

2. createMultipartPolylinePathPointCollection: Create a multipart polyline using path via IPointCollection.

private IGeometry CreateShape(int x1,int y1,int x2,int y2)
                {
                        IPoint p1 = this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x1,y1);
                        IPoint p2 = this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x2,y2);
                        IPolyline line = new PolylineClass();
                        line.FromPoint=p1;
                        line.ToPoint=p2;
                        IGeometry lineGeometry = line as IGeometry;
                          retrun lineGeometry ;

                }
 
利用上面创建好的Line,在grahic上画线,嗯。。里面的代码要改动一下。因为是直接贴的以前写的东西
private void DrawShape(IGeometry line)
                {
                        pgc.DeleteAllElements();
                        //定义颜色
                        //定义线符号
                        IRgbColor lcolor = Utility.GetRGBColor(btnLColor.BackColor);
                        ISimpleLineSymbol outline = new SimpleLineSymbolClass();
                        if(this.txtWidth.Text.Trim()=="")
                                outline.Width=0;
                        else
                                outline.Width=Double.Parse(this.txtWidth.Text);

                        outline.Color = lcolor;
                        outline.Style = (esriSimpleLineStyle)(((StringIntObject)this.cbLineStyle.SelectedItem).i);

                        //定义使用填充符号的面
                        ILineElement LineE = new LineElementClass();
                        LineE.Symbol=outline;
                        IElement pElement = LineE as IElement;
                        pElement.Geometry=line ;
                        pgc.AddElement(pElement,0);
                        axMapControl1.Refresh( esriViewDrawPhase.esriViewGraphics, null,null );

                }

posted on 2009-06-27 15:54  jdmei520  阅读(3424)  评论(0编辑  收藏  举报

导航