MAPX+DELPHI集成二次开发(45分)

  • 主题发起人 主题发起人 yzp
  • 开始时间 开始时间
Y

yzp

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在MapX里建立带Fields的图层???,又如何进行数据绑定?能举例说明一下吗?
 
1.产生Fields图层的方法:(代码不全,一个大概的意思,你自己组合一下)举例:
var
flds : Fields;
li : LayerInfo;
//定义表结构
flds:=coFields.Create;
flds.AddStringField('名称:', 50);
flds.AddIntegerField('类型:');
flds.AddIntegerField('编号:');
flds.AddIntegerField('工作状态:');
flds.AddFloatField('经度:');
flds.AddFloatField('纬度:');
等等...

//define the LayerInfo object
Li:=CoLayerInfo.Create;
li.Type_ := miLayerInfoTypeNewTable;
li.AddParameter('FileSpec',lyrFileName);
li.AddParameter('Name', lyrName);
li.AddParameter('Fields', flds);

lyrLayer:=MapX.Layers.Add(li, 1);//产生层

2.例:
var
i : Integer;
flds : Variant;
ds : Variant;
begin

ds := MapX1.OleObject.Datasets.Add(miDatasetLayer, lyrLayer);//lyrLayer层名,miDatasetLayer是数据绑定的数据库方式,可选(查Help)
flds := ds.fields;


对不起,不知道说清楚没有
 
1.我在SQL SERVER 2000新建立了数据库yuan,登录名为SA,密码为空。新建了一个表way,其中有字段id(街道编号),name(街道名称),top(街道起点纵值),left(街道起点横值),height(街道长度),width(街道宽度),color(街道颜色)。如何在MapX里建立带Fields的图层???,又如何进行数据绑定?
2.上面的两段代码应该在哪个控件的什么事件里写呢?
 
上面两段代码
1.是让你在MapX中自动产生一个带有Fields的图层
2.进行数据绑定
至于放在什么地方,那就你自己设计了。
可以放在FormCreate、FormShow或其它的地方。
 
我在SQL SERVER 2000新建立了数据库yuan,登录名为SA,密码为空。新建了一个表way,其中有字段id(街道编号),name(街道名称),top(街道起点纵值),left(街道起点横值),height(街道长度),width(街道宽度),color(街道颜色)。如何在MapX里建立带Fields的图层???,又如何进行数据绑定?
 
如何与SQL SERVER 2000的数据进行邦定呢?
 
例子已经举了,我不可能把所有的代码帮你完成,实在没法说的更清楚了。抱歉
你自己好好考虑考虑吧。就到这里了。
 
我在SQL SERVER 2000新建立了数据库yuan,登录名为SA,密码为空。新建了一个表way,其中有字段id(街道编号),name(街道名称),top(街道起点纵值),left(街道起点横值),height(街道长度),width(街道宽度),color(街道颜色)。如何在MapX里建立带Fields的图层???,又如何进行数据绑定?
 
系统提示说lyrFileName,lyrName,lyrLayer没有定义,是怎么回事?
 
我的目的就是想让SQL SERVER 2000中的数据用MAPX+DELPHI,在电子地图中显示出来,比如街道数据表装了所有街道的信息,如何在MAPX建立图层,按数据表中的信息显示出地图?
 
帮帮我,好吗?举例也行呀?
 
有QQ或电话吗?我想与你联系
 
以前下载的,看看对你有没有用(例子好像用VB的)
MapX 常见问题解答
 
>>>printmap方法中w,h,x,y的单位:himetricunit代表什么意思.
 
***在mapx的printmap方法:PrintMap(hDCx,y,w,h)
之中,w,h,x,y的单位为himetric,1himetric=0.01毫米。所以,
 
PrivateSubCommand4_Click()
 
ScaleMode=6`设成毫米坐标系。
Printer.CurrentX=0
Printer.CurrentY=0
Printer.Print""
Map1.PrintMapPrinter.hDC,0,0,Map1.Width*100,Map1.Height*100‘1毫米
=100himetric
Printer.NewPage`Sendnewpage.
Printer.EndDoc`Printingisfinished.
 
ExitSub
2.>>>SymbolFont.Name与SymbolCharacter
 
***二者皆用来定义Trutype字符集,但最好使用SymbolFont.Name。
PrivateSubCommand1_Click()
 
DimptAsNewPoint'PointobjectpassedtotheCreateSymbolmethodofthe
FFeatureFactory
DimstyAsNewStyle'StyleobjectpassedtotheCreateSymbolmethod,deter
mineswhatsymboltype/style...etc.
 
x1=Map1.CenterX
y1=Map1.CenterY
pt.Setx1,y1'Setthepointforwheretheuserclicked...
 
sty.SymbolFont.Name="MapInfoArrows"
sty.SymbolFont.Size=48'setthesizeofthesymboltobe48...
sty.SymbolFontColor=255'setcolorofthesymboltobered...
sty.SymbolFontHalo=True'turnHaloeffecton...
sty.SymbolFontBackColor=miColorBlue'changetheHalocolortoblue
Setftr=lyr.AddFeature(FF.CreateSymbol(pt,sty))
 
EndSub
 
另一种用来选择字符集的方法:sty.PickSymbol
 
3.>>>MapX40与Pro的兼容性问题。
***mapx40生成的表在Pro调用时,需要在pro中重新为此表创建索引。
 
4.>>>什么时候需要为表中字段创建索引。
***1.若该字段参与自动绑定时。
2.若该字段的值用Find对象的Search方法来查找时。
 
5.>>>关于自定义鼠标。
***在mapx4.0中允许用户自定义鼠标。程序如下:
Map1.MousePointer=miCustomCursor
Map1.MouseIcon="c:/windows/cursors/globe.ani"
 
6.>>>对栅格图象的支持。
***在mapx3.0中对对栅格图象的支持很弱。
在mapx4.0中对对栅格图象的支持得到增强。支持BMP,GIF,TIF,JPG,PSD,PNG,MrSIDfi
leformat(*.sid),网格文件(*.mig)等。但是需要将这些格式的文件现存成*.TAB
才可以调用。
 
7.>>>关于标注。
***标注的方式有以下几种:
自动标注。Map1.Layers("label").AutoLabel=True
删除时:Map1.Layers("label").AutoLabel=False
2.用户自定义标注。鼠标点击方式:Map1.CurrentTool=miLabelTool
输入坐标方式:LabelAtPoint(x,y)
删除时:Map1.Layers("label").ClearCustomLabels
但是,鼠标点击位置以及(x,y)坐标值需要在点上,线上,面上。
3.在drawuserlayer上自己画。
注意:
1.通过LabelProperties可以定义作标注的字段以及标注样式。
但是要注意首先要将图层加入到Datasets中。使用程序如下:
 
DimDSAsDataset
DimTempAsMapXLib.Field
DimlbpAsMapXLib.LabelProperties
DimlyrAsMapXLib.Layer
Setlyr=map1.layers.item(1)
SetDS=Map1.Datasets.Add(6,lyr)
Setlbp=DS.Layer.LabelProperties
Setlbp.Dataset=DS
SetTemp=DS.Fields("GEOname")'设置标注字段
Setlbp.DataField=Temp
lbp.Visible=True
lbp.Position=miPositionBC
lbp.Overlap=True
lbp.Offset=5
lbp.LineType=2
Map1.Layers("label").AutoLabel=True
2.用Dataset对象的AddField方法来创建用于标注的表达式。
3.注意Layer.DrawLayerAfter的使用。
 
8.>>>关于Infotip–信息提示。
***1.由Map1.InfotipSupport=True设置使能Infotip.
2.由Map1.InfotipPopupDelay=500(millisecond)设置延迟时间。
3.由LabelProperties.DataField来设置用做InfoTip的字段
 
9.>>>如何在MapX下读取属性值。
***有三种方法:
由Layer对象的KeyField属性来设立要读取属性值的字段名。
接着,由Feature对象的keyValue读取此行的属性值。
将图层加入到Datasets,由Dataset对象的Value(x,y)属性,通过设置行号,列号来获
得属性值。
将图层加入到Datasets,之后由RowValues(ftr)获取整行的值。
DimdsAsMapXLib.Dataset,lyrAsMapXLib.layer
DimftrsAsFeatures
DimftrAsFeature
DimrvAsRowValue
DimrvsAsRowValues
DimDsNameAsString‘数据集名
DimDsRowsAsLong,DsColsAsLong
DimiAsLong,jAsLong
 
Setds=Formmain.Map1.Datasets.Item(DsName)
Setlyr=ds.layer
Setftrs=lyr.AllFeatures
DsCols=ds.Fields.Count
DsCols=DsCols+1
DsRows=ftrs.Count
 
Grid1.Rows=DsRows+1
Grid1.Cols=DsCols
Grid1.Row=0
Fori=0ToDsCols-1
Grid1.Col=i
Grid1.Text=ds.Fields.Item(i+1).Name
Nexti
Grid1.Col=DsCols-1
Grid1.Text="Fkey"
 
lyr.begin
AccessmiAccessRead
i=1
ForEachftrInftrs
Setrvs=ds.RowValues(ftr)
j=0
ForEachrvInrvs
IfNotIsNull(rv.Value)then
Grid1.TextArray(i*DsCols+j)=Trim(rv.Value
)
j=j+1
Next
Grid1.TextArray(i*DsCols+j)=ftr.FeatureKey
i=i+1
Next
lyr.EndAccessmiAccessEnd
Setftr=Nothing
Setftrs=Nothing
Setds=Nothing
Setrv=Nothing
Setrvs=Nothing
Setlyr=Nothing
 
注意:begin
Access,以及EndAccess可以明显的提高属性读取的速度。
 
10.>>>关于查找。
***两种方式:
使用Find对象的Search方法。在mapx3.5中只能作到完全匹配查找,在MapX4.0中Search
Ex方法则可以找到多个匹配的记录,其结果由FindResult.Matches获取。详细请参看有
关Find.SearchEx方法的文档以及示例。
使用Layer对象的OBJECT.Search(strWhere)方法。其参数为SQL查询的WHERE子句。例
如:
Setftrs=lyr.Search("Character_Namelike""%市""");模糊查询
Setftrs=lyr.Search("Character_Name=""北京市""");
Setftrs=lyrUSA.Search("TOTPOP>1000000")
注意:1。字符串外加两个双引号。2。首先将图层加入数据集Datasets才能使用查询。

 
11.>>>关于UserDrawLayer.
 
***UserDrawLayer允许用户画自定义格式的图形。如用户自定义的比例尺,图例,或标
注。
改变时,使用Refresh刷新。
 
12.>>>使用MapX40时如果遇到以下的问题:
在GeoSetManager中加入表时,会产生错误如“The.indalreadyrigistered”
当把在Pro中建立的表加入到GeoSetManager中时,会出现异常退出。
当用MapX40创建临时图层出现汉字问题。
当文本旋转出现问题。
 
***解决方法:升级到Mapx4.01.51(中文版)
 
13.>>>mapx3.5下,非地球坐标系出现的问题。
***1。定义图层的视野范围时,因为系统默认单位为英里。
所以如果拥护定义单位为米,视野范围定为0-500。因为1英里=1609米,那么,
layer.ZoomMin=0
layer.ZoomMax=500*1609
layer.Zoom值的设置仍在0-500之间。
MapX4.0已经解决该问题。
在投影为非地球坐标系的图层上编辑时,如增加图元,要首先设置一下坐标系的范围即
CoordSys.Bounds。
 
程序如下:坐标系的单位为毫米:
 
DimcsysAsNewMapXLib.CoordSys
 
csys.Set0,,5,,,,,,,,,,Formmain.Map1.Layers.Bounds
SetFormmain.Map1.NumericCoordSys=csys
 
14.***连接Oracle8I,若数据分存在两个表中,可用以下语句来实现连接:
注意:在Select选择语句中要写上需要的字段。.
 
DimLayerInfoObjectAsNewLayerInfo
Dimi,jAsInteger
LayerInfoObject.Type=miLayerInfoTypeServer
 
LayerInfoObject.AddParameter"name","cancaps"
LayerInfoObject.AddParameter"ConnectString","SRVR=SUPERIOR;UID=mipro;PWD=m
ipro"
LayerInfoObject.AddParameter"Query","select""CITY_125"".""TOT_POP"",""STA
TES"".*from""MIPRO"".""STATES"",""MIPRO"".""CITY_125""where
""CITY_125"".""STATE""=""STATES"".""STATE"""
LayerInfoObject.AddParameter"toolkit","ORAINET"
LayerInfoObject.AddParameter"AutoCreateDataset",1
LayerInfoObject.AddParameter"DatasetName","Uscty"
 
Map1.Layers.AddLayerInfoObject
j=Map1.Datasets.Item(1).Fields.Count
MsgBoxStr(j)
Fori=1Toj
MsgBoxMap1.Datasets.Item(1).Fields.Item(i).Name
 
Next
Map1.Datasets.Item(1).Themes.AddmiThemeRanged,"TOT_POP"
 
 
 
15.>>>连接远程数据库时日期作为选择条件时:
***对于Acess数据库,日期要用#作为边界,例如:#2/2/2000#
s1="02/04/200001:00:40"
s="select*fromdb1wheredt=#"+s1+"#"
Setds=db.OpenRecordset(s)
 
对于Sybase数据库,如下:
dimd_begin
,d_endasstring
d_begin
=20000101
d_end=20000212
selectSTCD,YMDHM,DYRNFromST_RNFL_RWhereYMDHM>='"+d_begin
+"'"
 
16.>>>ACESS数据库存在点位数据,在PRO中地图化后,生成TAB表,加入MAPX,能否当
数据库数据增加后反映到地图点位的刷新。
 
***1。不要使用在PRO中下载的表文件,而使用Layerinfo对象的miLayerInfoTypeServ
er为数据创建点位。程序如下:
PrivateSubLinkODBC_Click()
DimLayerInfoAsNewMapXLib.LayerInfo
LayerInfo.Type=miLayerInfoTypeServer
LayerInfo.AddParameter"name",“ODBCLayer”
’Mapstats为Mapstats.mdb的ODBC数据源
LayerInfo.AddParameter”connectstring",“Mapstats”
LayerInfo.AddParameter"query",”Select*fromUs_cust”
LayerInfo.AddParameter"cache",“on”
LayerInfo.AddParameter"MBRSearch",“on”
LayerInfo.AddParameter"toolkit","ODBC"
layerinfo.AddParameter"AutoCreateDataset",1
layerinfo.AddParameter"datasetname",“us_cust”
Setlyr=Formmain.Map1.Layers.Add(LayerInfo,1)
EndSub
要求:mapstats的数据已经地图化,并加入DATASETS。
 
2。当数据库数据改变(增加,删除),使用Dataset的refresh方法完成点位的刷新。
 
后退
顶部