gis二次开发.docx

上传人:b****8 文档编号:9818223 上传时间:2023-02-06 格式:DOCX 页数:21 大小:24.04KB
下载 相关 举报
gis二次开发.docx_第1页
第1页 / 共21页
gis二次开发.docx_第2页
第2页 / 共21页
gis二次开发.docx_第3页
第3页 / 共21页
gis二次开发.docx_第4页
第4页 / 共21页
gis二次开发.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

gis二次开发.docx

《gis二次开发.docx》由会员分享,可在线阅读,更多相关《gis二次开发.docx(21页珍藏版)》请在冰豆网上搜索。

gis二次开发.docx

gis二次开发

GIS的二次开发——使用pb调用mapx控件(原创)

///新建图层的函数

//wf_add_layer

oleobjectaLayer,lb_dataset,LayerInfo,Flds

ole_1.object.Geoset='H:

\water_pt_map.gst'

alayer=CreateOleObject

alayer.ConnectToNewObject("MapX.Layer.5")

LayerInfo=CreateOleObject

LayerInfo.ConnectToNewObject("MapX.LayerInfo.5")

Flds=CreateOleObject

Flds.ConnectToNewObject("MapX.fields.5")

Flds.AddStringField("ID",12)

Flds.AddStringField("Name",50)

//新建图层

LayerInfo.Type=6

LayerInfo.AddParameter("NAME",'meteruse')

LayerInfo.AddParameter("Fields",Flds)

LayerInfo.AddParameter("AUTOCREATEDATASET",1)

LayerInfo.AddParameter("DATASETNAME","PT_WATER")

alayer=ole_1.object.Layers.Add(LayerInfo,1)

//设置活动图层

ole_1.object.layers.animationlayer=alayer

//

//========================

//name:

wf_add_dot

//dec{3}ldc_x,ldc_y

//

//增加点的函数,分级别显示

//

//time:

20040924

//

//=======================

longll_f

//按照级别设置颜色

ifil_jb=1then

ole_1.object.DefaultStyle.SymbolCharacter=35

ole_1.object.DefaultStyle.SymbolFontColor=RGB(255,0,0)

ole_1.object.DefaultStyle.SymbolFont.Size=12

//ole_1.object.DefaultStyle.SymbolFont="MapSymbols"

ole_1.object.DefaultStyle.textFontColor=RGB(255,0,0)

ole_1.object.DefaultStyle.textFont.Size=12

ole_1.object.DefaultStyle.textFont="宋体"

elseifil_jb=2then

ole_1.object.DefaultStyle.SymbolCharacter=36

ole_1.object.DefaultStyle.SymbolFontColor=RGB(255,255,0)

ole_1.object.DefaultStyle.SymbolFont.Size=11

ole_1.object.DefaultStyle.textFontColor=RGB(255,255,0)

ole_1.object.DefaultStyle.textFont.Size=11

elseifil_jb=3then

ole_1.object.DefaultStyle.SymbolCharacter=37

ole_1.object.DefaultStyle.SymbolFontColor=RGB(255,127,0)

ole_1.object.DefaultStyle.SymbolFont.Size=10

ole_1.object.DefaultStyle.textFontColor=RGB(255,127,0)

ole_1.object.DefaultStyle.textFont.Size=10

endif

inti,n=1

oleobjectf,f2,lb_dataset,flds,rv

oleobjectaLayer

oleobjectm_point

lb_dataset=CreateOleObject

lb_dataset.ConnectToNewObject("MapX.dataset.5")

flds=CreateOleObject

flds.ConnectToNewObject("MapX.fields.5")

rv=CreateOleObject

rv.ConnectToNewObject("MapX.rowvalue.5")

alayer=CreateOleObject//("mapx.layer.5")

f=CreateOleObject

f2=CreateOleObject

m_point=CreateOleObject

alayer.ConnectToNewObject("MapX.Layer.5")

ll_f=f.ConnectToNewObject("MapX.Feature.5")

ll_f=f2.ConnectToNewObject("MapX.Feature.5")

ll_f=m_point.ConnectToNewObject("MapX.point.5")

aLayer=ole_1.object.layers.item("meteruse")

lb_dataset=aLayer.Datasets.Item("PT_WATER")

flds=lb_dataset.Fields

aLayer.LabelProperties.Dataset=lb_dataset

aLayer.LabelProperties.DataField=lb_dataset.Fields.Item("id")

aLayer.autolabel=true

aLayer.Editable=True

ifis_name<>""andnotisnull(is_name)then

ifil_same_f=1then//已经在地图上存在的移动坐标

f=aLayer.GetFeatureByKey(is_FeatureKey)

f.point.Set(adc_x,adc_y)

f.update()

else//没有存在的增加之

ole_1.object.AutoRedraw=False

m_point.Set(adc_x,adc_y)

f=ole_1.object.featurefactory.createsymbol(m_point,ole_1.object.defaultstyle)

 

aLayer.KeyField=Flds.Item

(1).Name

f.KeyValue=is_name

f2=aLayer.addfeature(f)

is_FeatureKey=f2.FeatureKey

il_same_f=1

endif

aLayer.Refresh

ole_1.object.AutoRedraw=true

endif

//=====================================

//name:

wf_delete_feature

//

//stringas_featruekey

//删除地图上的一个符号

//

//

//20040913

//===================================

 

oleobjectaLayer

alayer=CreateOleObject//("mapx.layer.5")

alayer.ConnectToNewObject("MapX.Layer.5")

aLayer=ole_1.object.layers('meteruse')

aLayer.DeleteFeature(as_featruekey)

aLayer.refresh

 

  摘要本文介绍了VB中如何利用MapX创建用户定制地图工具,详细地说明了整个创建过程,以及在创建定制工具的过程中所使用的关键方法。

  1.前言

  随着地理信息系统的发展,国内外已出现了不少GIS(地理信息系统)软件,其中MapX是MapInfo公司的ActiveX控件产品。

由于它是一种基于Windows操作系统的标准控件,因而MapX4.0支持绝大多数标准的可视化开发环境,如:

VisualBasic,Delphi,PowerBuilder,VisualC++等面向对象语言,而且可以使用LotusScript将MapX4.0嵌入到LotusNotes中。

  虽然MapX4.0提供了许多标准工具,可以直接使用,但是很多情况下,这些标准工具不能满足实际的需要,这就要求通过定制地图工具来规定工具能完成何种功能,例如画椭圆工具,标尺工具(测线段长度)等等。

下面,笔者就通过一具体实例来介绍一下VB中采用MapX4.0控件制作地图的定制工具。

  2.VB环境下MapX编程

  利用MapX4.0创建用户定制工具分为以下三步:

  2.1创建定制工具

  本例创建的是画椭圆工具。

首先,宣称全局常量miAddEllipseTool=1,1就代表了画椭圆这个工具。

然后,在主窗体中创建画椭圆工具。

关键方法(创建定制工具):

OBJECT.CreateCustomTool(ToolNumber,Type,Cursor,[ShiftCursor],[CtrlCursor],[InfoTips])

  OBJECT(对象):

Map对象;

  ToolNumber(工具号)是创建出代表画椭圆工具的miAddEllipseTool;

  Type(类型):

描述了工具的行为,这个参数取的ToolTypeConstants(工具类型常量)值。

本例,工具是按下鼠标左键到弹上鼠标左键的过程中画椭圆。

本例中取的是miToolTypePoint;

  Cursor(指针形状):

使用该工具时,该工具在地图上显示的形状,该参数从CursorConstants(指针常量)中取值。

本例选用的是miCrossCursor,那么当选择该工具时,该工具将在地图上显示成十字叉形状;

  ShiftCursor,CtrlCursor:

这两个参数是可选的,缺省情况时,SHIFT键和CTRL键不起作用;

  InfoTips(工具提示):

Boolean型。

如果要显示工具提示,需要将此参数设为true;缺省值为false。

  实际编码:

PublicConstmiAddEllipseTool=1'定制的加椭圆工具

PublicRectX1AsDouble'新加椭圆(所需的矩形)的点1的X(经纬度)坐标

PublicRectY1AsDouble'新加椭圆(所需的矩形)的点1的Y(经纬度)坐标

PublicRectX2AsDouble'新加椭圆(所需的矩形)的点2的X(经纬度)坐标

PublicRectY2AsDouble'新加椭圆(所需的矩形)的点2的Y(经纬度)坐标

PrivateSubForm_Load()'创建定制工具

Map1.CreateCustomToolmiAddEllipseTool,_

miToolTypePoint,miCrossCursor

EndSub

  此时所创建的工具没有任何功能,要工具具备相应的功能由第二步实现。

 

2.2编写工具句柄(工具具备什么功能)。

  当按下鼠标左键时,需要记下椭圆的起始位置;当鼠标右键弹上时,需要记下椭圆的结束位置,这时,画出椭圆。

椭圆将以这两点为矩形的对角线在矩形框中绘制椭圆。

需要特别注意的是,MapX4.0中使用的坐标系统是经/纬度系统,而MouseDOwn,MouseUp事件中的坐标是屏幕坐标,因此,需要将屏幕坐标转化为经/纬度坐标,所画椭圆才能显示在正确的位置上。

  关键方法(绘制椭圆):

OBJECT.CreateEllipticalRegion(Rectangle,[Angle],[Resolution],[Style])

OBJECT:

FeatureFactory对象;

Rectangle(矩形):

Rectangle对象,确定了椭圆的大小;

Angle(角度):

变量,决定椭圆绕中心点旋转的角度;

Resolution(精度):

变量,椭圆的精度,由多少点构成;

Style(样式):

变量,定义了所画椭圆的样式,如颜色,线型等。

实际编码:

PrivateSubMap1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

IfButton=vbLeftButtonAnd(Map1.CurrentTool=miAddEllipseTool)Then

 Map1.NumericCoordSys.SetmiLongLat,0

 '将屏幕坐标转变为经纬度坐标

 Map1.ConvertCoordX,Y,RectX1,RectY1,miScreenToMap

 Endif

EndSub

PrivateSubMap1_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

 IfButton=vbLeftButtonAnd(Map1.CurrentTool=miAddEllipseTool)Then

  '将地图的坐标系统设为经/纬度坐标

  Map1.NumericCoordSys.SetmiLongLat,0

  '将屏幕坐标转变为经纬度坐标

  Map1.ConvertCoordX,Y,RectX2,RectY2,miScreenToMap

  '鼠标弹起时,画椭圆

  CallAddEllipse(form1,RectX1,RectY1,RectX2,RectY2)

 Endif

Endsub

'画椭圆过程

PublicSubAddEllipse(frmAsForm,x1AsDouble,_

y1AsDouble,x2AsDouble,y2AsDouble,EditLayerAsVariant)

 DimRECTAsNewMapXLib.Rectangle'画椭圆的矩形框

 DimCreatedEllipseAsFeature'所画的椭圆

 DimIasinteger,EditLayerasinteger

 '设置画椭圆的矩形框

 RECT.Setx1,y1,x2,y2

 Withfrm.Map1

  '创建椭圆

  SetCreatedEllipse=.FeatureFactory._

  CreateEllipticalRegion(RECT,,500,.DefaultStyle)

  '确定哪一层是可编辑层,椭圆只能画在可编辑层上

  ForI=1to.map1.layers.count

   If.map1.layers(I).editable=truethen

    Editlayer=I

    Exitfor

   Endif

  NextI

  '将椭圆添加到所画的图层上

  .Layers.Item(EditLayer).AddFeatureCreatedEllipse

 EndWith

EndSub

  此时,画椭圆工具具备了画椭圆的功能,运用定制的这个工具由第三步实现。

  2.3调用定制工具

  '设置当前工具为定制的画椭圆工具

  Map1.CurrentTool=miAddEllipse

  或Map1.currenttool=1

  3.结束语

  本例画椭圆时,从鼠标按下,一直到鼠标最后弹起时才可以看到椭圆出现在地图上,这就是说在鼠标移动(MouseMove事件)时,从鼠标按下,到鼠标弹起的中间过程是看不到中间过程的椭圆出现的。

为了实现在鼠标移动时,也可以看到椭圆,那么需要在MouseMove事件中画椭圆,并且,每次画椭圆时删除掉前一次画的椭圆。

这样的运行结果就是看到,从鼠标按下,到鼠标弹起的过程中,随鼠标的移动而有了绘椭圆的变化过程。

  另外,本文是以VB5为例,进行的编程,但对于其它语言,如VC++,Delphi等,编程思路和关键方法都是相同的。

上个月去天津做这个项目,加班加点忙乎过了十一,现在项目终于完成了第一阶段,可以闲下来总结一下了。

  在做这个项目之前我只是自学了一个月的supermap,不过感觉gis这些东西都是大同小异,没什莫可怕;关键比较郁闷的是本来根本就是做.net,现在却要用vb实在太。

算了,赶鸭子上架,不会也得会呀!

   其实本人对这个实在只能称得上一知半解,学的和用的一样多,不过还是给自己和别人留下点东西吧,也许会有帮助呢:

   1,设置地图标题(Map1.Title)样式

   在打开一个GeoSet时,会自动显示它的标题,如果你的GeoSet没有标题,它会自动添加一个标题。

   你可以设置标题的样式,显示出最完美的地图

    Map1.Title.Visible=False’是否可见

    Map1.Title.Editable=False'是否可编辑

    标题位置

   Map1.Title.x=Map1.MapScreenWidth-50

   Map1.Title.y=2

  是否有边界

   Map1.Title.Border=False

   是否粗体

  Map1.Title.TextStyle.TextFont.Bold=True

   字体大小

   Map1.Title.TextStyle.TextFont.Size=15

  是否在文本周围绘制光晕

    Map1.Title.TextStyle.TextFontHalo=True

  控制文本是否显示背景色

    Map1.Title.TextStyle.TextFontOpaque=False

  是否在文本下绘制阴影

   Map1.Title.TextStyle.TextFontShadow=True

2打开地图的两种方法

  a,打开地图集

   Map1.GeoSet=”C:

\aa.gst” 

   在地图集里,你可以给地图加颜色,加标注,限制标注的字体,颜色等。

这些只能保存到地图集,而不能保存到单一的图层里。

所以建议你把图层做成地图集,这样无论是打开还是显示都很方便。

  b,打开图层

   Fori=1ToUBound(Navigation_DefaultMap_Path)

     Map2.Layers.AddNavigation_DefaultMap_Path(i),i

   Next

3添加数据集

 mapx的地图和数据是分开的,你要想制作专题图,查看表的内容,取图元的数据,都要先添加数据集。

 a,添加图层数据集

 Setlyr=curMap.Layers(layerList.Text)

   curMap.DataSets.AddmiDataSetLayer,lyr,lyr.Name

 b,添加自定义数据集

 以下函数是添加一个数据集,sqlstr 是sql语句,DsName是数据集的名称。

注意:

"orderno", 是我在数据库中取的数据集与地图图元的关联。

 PrivateFunctionAddJDDs(sqlstrAsString,DsNameAsString)AsBoolean

DimIsRightAsBoolean

IsRight=False

'----------------------添加数据集

OnErrorGoToThemedCreate

'------------是否存在该数据集

 DimdsAsMapXLib.Dataset

 

ForEachdsInMap1.DataSets

 Ifds.Name=DsNameThen

 Map1.DataSets.Remove(DsName)'删除数据集

 ExitFor

 EndIf

 Next

 Setds=Nothing

 '------------------加载数据集----------------------------

 

 DimCnAsNewADODB.Connection

 DimCmdAsNewADODB.Command

 DimrsAsNewADODB.Recordset

DimBindLyrAsNewBindLayer

Cn.CursorLocation=adUseClient

Cn.OpenConStr

SetCmd.ActiveConnection=Cn

 Cmd.CommandText=sqlstr

 rs.OpenCmd,,adOpenKeyset,adLockOptimistic

   

BindLyr.LayerType=miBindLayerTypeNormal

Ifrs.RecordCount<>0Then

Map1.DataSets.AddmiDataSetADO,rs,DsName,"orderno",,BindLyr

IsRight=True

Else

 MsgBox"无法显示数据,请检查数据是否为空?

"

 IsRight=False

EndIf

rs.Close

Setrs=Nothing

 Cn.Close

 SetCn=Nothing

 SetCmd=Nothing

 SetBindLyr=Nothing

AddJDDs=IsRight

 ExitFunction

 '-------------------------------------------------------------------

ThemedCreate:

   MsgBox"加载数据集出错!

请检查数据是否正确?

"&Err.Description

  

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1