|
Mapx常见问题解答(2)
9.如何实现测距
a.//创建测距工具
global const calculatedistance=1
Private Sub Form_Load()
map1.CreateCustomTool(calcilatedistance,miToolTypepoly ,microsscursor)
End Sub
Private Sub Distances_Click()
map1.currenttool=calculatetool
End Sub
b.//在mapx的PolyToolUsed事件中,
用Distance( x1,y1,x2,y2 )计算距离,由状态条中或label显示。
Private Sub Map1_PolyToolUsed(ByVal ToolNum As Integer, ByVal Flags As Long, ByVal points As Object, ByVal bShift As Boolean, ByVal bCtrl As Boolean, EnableDefault As Boolean)
Dim DisSum As Double
Dim Dis As Double
Dim n As Integer
Dim pts As New MapXLib.points
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
Set pts = points
DisSum = 0
MDIForm1.StatusBar1.Panels.Item(3).Text= Format(Str(DisSum), "#,##0.000000")
Select Case Flags
Case miPolyToolBegin
Case miPolyToolInProgress
If ToolNum = CalculateDistance Then
For i = 1 To pts.Count - 1
x1 = pts.Item(i).X
y1 = pts.Item(i).Y
x2 = pts.Item(i + 1).X
y3 = pts.Item(i + 1).Y
Dis = Map1.Distance(x1, y1, x2, y2)
DisSum = DisSum + Dis
MDIForm1.StatusBar1.Panels.Item(3).Text = Format(Str(DisSum), "#,##0.000000")
Next i
End If
Case miPolyToolEnd
End Select
10. printmap方法中w,h,x,y的单位:himetric unit代表什么意思
在mapx 的 printmap方法:PrintMap (hDC x, y, w, h)之中,w,h,x,y的单位为himetric,1 himetric=0.01毫米。所以,
Private Sub Command4_Click()
ScaleMode = 6 `设成毫米坐标系。
Printer.CurrentX = 0
Printer.CurrentY = 0
Printer.Print " "
Map1.PrintMap Printer.hDC, 0, 0, Map1.Width * 100, Map1.Height * 100 ‘ 1毫米=100 himetric
Printer.NewPage ` Send new page.
Printer.EndDoc ` Printing is finished.
Exit Sub
11.关于UserDrawLayer.
UserDrawLayer允许用户画自定义格式的图形。如用户自定义的比例尺,图例,或标注。
改变时,使用Refresh刷新
12.使用MapX40 时如果遇到以下的问题:
1. 在GeoSet Manager 中加入表时,会产生错误如 “The .ind already rigistered”
2. 当把在 Pro中建立的表加入到GeoSet Manager中时,会出现异常退出。
3. 当用MapX40创建临时图层出现汉字问题。
4. 当文本旋转出现问题。
解决方法:升级到Mapx4.01.51(中文版)
13.mapx3.5下,非地球坐标系出现的问题。
1。定义图层的视野范围时,因为系统默认单位为英里。
所以如果拥护定义单位为米,视野范围定为0-500。因为1英里=1609米 ,那么,
layer.ZoomMin=0
layer.ZoomMax=500*1609
layer.Zoom值的设置仍在0-500之间。
MapX4.0已经解决该问题。
2. 在投影为非地球坐标系的图层上编辑时,如增加图元,要首先设置一下坐标系的范围即CoordSys.Bounds。
程序如下:坐标系的单位为毫米:
Dim csys As New MapXLib.CoordSys
csys.Set 0, , 5, , , , , , , , , , Formmain.Map1.Layers.Bounds
Set Formmain.Map1.NumericCoordSys = csys
14.连接Oracle8I ,若数据分存在两个表中,可用以下语句来实现连接:
注意:在Select选择语句中要写上需要的字段。
Dim LayerInfoObject As New LayerInfo
Dim i, j As Integer
LayerInfoObject.Type = miLayerInfoTypeServer
LayerInfoObject.AddParameter "name", "cancaps"
LayerInfoObject.AddParameter "ConnectString", "SRVR=SUPERIOR;UID=miproWD=mipro"
LayerInfoObject.AddParameter "Query", "select ""CITY_125"".""TOT_POP"",""STATES"".* 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.Add LayerInfoObject
j = Map1.Datasets.Item(1).Fields.Count
MsgBox Str(j)
For i = 1 To j
MsgBox Map1.Datasets.Item(1).Fields.Item(i).Name
Next
Map1.Datasets.Item(1).Themes.Add miThemeRanged, "TOT_POP"
15.连接远程数据库时日期作为选择条件时:
对于Acess数据库,日期要用# 作为边界,例如:#2/2/2000#
s1 = "02/04/2000 01:00:40"
s = "select * from db1 where dt=#" + s1 + "#"
Set ds = db.OpenRecordset(s)
对于Sybase数据库,如下:
dim d_begin,d_end as string
d_begin=20000101
d_end =20000212
select STCD,YMDHM,DYRN From ST_RNFL_R Where YMDHM >='"+d_begin+"'"
16.ACESS数据库存在点位数据,在PRO中地图化后,生成TAB表,加入MAPX,能否当数据库数据增加后反映到地图点位的刷新。
1。不要使用在PRO中下载的表文件,而使用Layerinfo对象的miLayerInfoTypeServer为数据创建点位。 程序如下:
Private Sub LinkODBC_Click()
Dim LayerInfo As New MapXLib.LayerInfo
LayerInfo.Type = miLayerInfoTypeServer
LayerInfo.AddParameter "name", “ODBCLayer”
’ Mapstats为Mapstats.mdb的ODBC数据源
LayerInfo.AddParameter”connectstring",“Mapstats”
LayerInfo.AddParameter "query",”Select * from Us_cust”
LayerInfo.AddParameter "cache", “on”
LayerInfo.AddParameter "MBRSearch", “on”
LayerInfo.AddParameter "toolkit", "ODBC"
layerinfo.AddParameter "AutoCreateDataset", 1
layerinfo.AddParameter "datasetname", “us_cust”
Set lyr = Formmain.Map1.Layers.Add(LayerInfo, 1)
End Sub
要求:mapstats的数据已经地图化,并加入DATASETS。
2。当数据库数据改变(增加,删除),使用Dataset的refresh方法完成点位的刷新。
17.使用ADO,RDO,BDE数据源进行数据绑定时,会出现没有注册的错误提示。
在安装MapX选择component/data drivers/ADO data driver等数据源驱动程序。
18.使用MAPXTREME开发,查找的结果如何高亮显示。
程序如下:
sub locateobj()
dim k,lay
dim layer,findds,foundobj,bResult
k=trim(session("key")) ‘session("key")为要查的ID
lay=session("layer") 'session("layer")为当前层
set layer=Session(SESN_MAPPER).Layers(lay)
set findds=Session(SESN_MAPPER).DataSets.Add(6,layer)
set layer.find.finddataset=findds
set layer.find.findfield=findds.fields("ID")
set foundobj=layer.find.search(k)
if (foundobj.findRC mod 10=1) then
bResult = SetMapAutoRedraw(False)
if Session(SESN_MAPNAME)="hb" then
Session(SESN_MAPPER).zoom=20
else
Session(SESN_MAPPER).zoom=1
end if
Session(SESN_MAPPER).centerX=foundobj.centerX
Session(SESN_MAPPER).centerY=foundobj.centerY ‘可将foundobj 定位在中心
layer.Selection.add foundobj '着亮显示
Session(SESN_MAPPER). ExportSelection=True ‘输出选择的高亮显示
bResult = SetMapAutoRedraw(true)
else
Response.Write "地图上未找到该目标。"
end if
end sub
19.提高圆,椭圆,弧,缓冲区的分辨率。
设置Map.DefaultConversionResolution值(最大为32763),这样画圆等,或者编辑从ProFessional中作好的图层中的圆等后,不会出现圆显示成为多边形的状况。
另外,若使用CreateArc, CreateCircularRegion, CreateEllipticalRegion, BufferFeatures创建对象时,可以设置resolution参数。
20.有关紧缩。
mapx4.5,mapx4.0不提供紧缩的功能,所以只能创建一相同结构的表,然后将数据从原表中读出,再加入到新表中,以消除黑条。(这只能在mapx4.5中完成)
21.有关Annotation.
文本类型的注释Annotation不能旋转。
22.执行程序:
features.item(1).keyvalue=’XXX’
features.item(1).update
feature没有得到改变。
*** 将程序修改为:
feature=features.item(1)
feature.keyvalue=’XXX’
feature.update
执行无误。
23.c++下variant类型的参数若不添则该参数位置用COptionalVariant()来替代,其定义如下
class COptionalVariant;
class COptionalVariant: public COleVariant
COptionalVariant() { vt = VT_ERROR; scode = DISP_E_PARAMNOTFOUND; }
24.用户自定义工具创建点时,若为非地球坐标系,Toolused事件中获取的值不对
使用用户自定义工具创建图元(点线面)时,若坐标系为非地球坐标系,则要满足:
1。在调入geoset 或 layer后,将map1.numericcoordsys=map1.displaycoordsys
2.设置
Dim csys As New mapxlib.CoordSys
csys.Set 0, , 7, , , , , , , , , , Formmain.Map1.Layers.Bounds
Set Formmain.Map1.NumericCoordSys = csys
Set Formmain.Map1.DisplayCoordSys = csys
25.SymbolFont.Name与SymbolCharacter
二者皆用来定义Trutype字符集,但最好使用SymbolFont.Name。
Private Sub Command1_Click()
Dim pt As New Point ' Point object passed to the CreateSymbol method of the FFeatureFactory
Dim sty As New Style ' Style object passed to the CreateSymbol method, determines what symboltype/style...etc.
x1 = Map1.CenterX
y1 = Map1.CenterY
pt.Set x1, y1 ' Set the point for where the user clicked...
sty.SymbolFont.Name = "MapInfo Arrows"
sty.SymbolFont.Size = 48 ' set the size of the symbol to be 48...
sty.SymbolFontColor = 255 ' set color of the symbol to be red...
sty.SymbolFontHalo = True ' turn Halo effect on...
sty.SymbolFontBackColor = miColorBlue ' change the Halo color to blue
Set ftr = lyr.AddFeature(FF.CreateSymbol(pt, sty))
End Sub
另一种用来选择字符集的方法:sty.PickSymbol
26.MapX40与Pro 的兼容性问题
mapx40生成的表在Pro 调用时,需要在pro中重新为此表创建索引
27.什么时候需要为表中字段创建索引。
1.若该字段参与自动绑定时。
2.若该字段的值用Find对象的Search方法来查找时。
28.关于自定义鼠标。
在mapx4.0中允许用户自定义鼠标。程序如下:
Map1.MousePointer = miCustomCursor
Map1.MouseIcon = "c:\windows\cursors\globe.ani"
MapInfo MapX4.0 License Key 申请流程
一、 如何获得硬件ID号(HardwareID)?
1. 安装MapX4.0。
2. 打开Vb,Vc,Delphi,PowerBuild等开发环境,添加MapX OCX控件。
3. 在控件底部可以看到使用期限以及ID号码。
二、 如何申请License Key?
1. 代理商及开发商在购买了若干License后,请将产品包装盒内的’黄页’始终保存在您的手中(请勿丢失),当直接用户需要申请License时,应直接与代理商或开发商联系,告知所产生的ID号。
2. 代理商及开发商应认真填好黄页内的相关信息及ID号码,将黄页传真至方正数码电子有限公司MapInfo事业部。
3. 在没有任何问题的情况下,我们将在2个工作日内给您回复。
三、 申请License Key以后……
请将申请到的*MapX40.LIC文件改名为MapX40.LIC,并放在C:\Program Files\Common Files\MapInfo Shared\MapX Common\目录下,覆盖原来的License文件。
几点重要提示:
1. 请不要轻易更改硬盘及格式化
2. 黄页上的信息应为代理或开发商的信息
3. 请妥善保存好黄页(请将产品内不干胶上的SN#贴在黄页上)
::mad::cool:;):)
------------------------------------------------------------------------------------------
希望能对大家有点帮助!!! |
|