vb + Mapx常见问题解答

 

开发环境:VB + MapX

代码:

1.如何实现测距
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


2. 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

3.关于UserDrawLayer.
UserDrawLayer允许用户画自定义格式的图形。如用户自定义的比例尺,图例,或标注。
改变时,使用Refresh刷新

4.使用MapX40 时如果遇到以下的问题:
1. 在GeoSet Manager 中加入表时,会产生错误如 “The .ind already rigistered”
2. 当把在 Pro中建立的表加入到GeoSet Manager中时,会出现异常退出。
3. 当用MapX40创建临时图层出现汉字问题。
4. 当文本旋转出现问题。
解决方法:升级到Mapx4.01.51(中文版)

5.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

6.连接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=mipro;PWD=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"

7.连接远程数据库时日期作为选择条件时:
对于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+"'"

8.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方法完成点位的刷新。

9.使用ADO,RDO,BDE数据源进行数据绑定时,会出现没有注册的错误提示。
在安装MapX选择component/data drivers/ADO data driver等数据源驱动程序。

10.使用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

11.提高圆,椭圆,弧,缓冲区的分辨率。
设置Map.DefaultConversionResolution值(最大为32763),这样画圆等,或者编辑从ProFessional中作好的图层中的圆等后,不会出现圆显示成为多边形的状况。
      另外,若使用CreateArc, CreateCircularRegion, CreateEllipticalRegion, BufferFeatures创建对象时,可以设置resolution参数。

12有关紧缩。
mapx4.5,mapx4.0不提供紧缩的功能,所以只能创建一相同结构的表,然后将数据从原表中读出,再加入到新表中,以消除黑条。(这只能在mapx4.5中完成)

13.有关Annotation.
文本类型的注释Annotation不能旋转。

14.执行程序:
features.item(1).keyvalue=’XXX’
       features.item(1).update
       feature没有得到改变。
   *** 将程序修改为:
       feature=features.item(1)
       feature.keyvalue=’XXX’
       feature.update
       执行无误。

MapX中紧缩表、使用自定义鼠标、地图打印参数设置、自定义工具画点

在mapx中如何紧缩表
在Mapx4.51下可以使用LayerInfo 的创建带结构的临时表和新表的功能来完成紧缩:
Set lyr = Formmain.Map1.Layers(ToolBars.combo1.Text)
Set ds = Formmain.Map1.Datasets.add(6, lyr)
'获取被紧缩表的路径及表名
filespec = Formmain.Map1.Layers.Item(ToolBars.combo1.Text).filespec
layername = lyr.Name '将表临时存放于内存

LayerInfo.Type = 6 'miLayerInfoTypeTemp
LayerInfo.AddParameter "TableStorageType", "MemTable" '临时文件保存在磁盘上还是内存。
LayerInfo.AddParameter "Name", "lyrpack"
LayerInfo.AddParameter "Fields", ds.Fields
LayerInfo.AddParameter "Features", lyr.AllFeatures
Formmain.Map1.Layers.add LayerInfo, LayerPos
Set LayerInfo = Nothing
'从地图窗口删除原表
Formmain.Map1.Datasets.Remove (ds.Name)
Formmain.Map1.Layers.Remove (lyr.Name)
Formmain.Map1.Refresh
Set lyr = Nothing
Set ds = Nothing
Set lyr = Formmain.Map1.Layers("lyrpack")
Set ds = Formmain.Map1.Datasets.add(6, lyr)
'从磁盘删除原表
Kill filespec 回页首

在mapx中如何使用自定义栅格符号
使用自定义符号首先需要设定style.SymbolType 为miSymbolTypeBitmap,然后指定SymbolBitmapName 为栅格图像名即可。

下面的代码演示了如何在delphi中使用自定义的栅格符号


首先调用自定义工具画点
procedure TForm1.new1Click(Sender: TObject);
begin
map1.ControlInterface.CurrentTool :=111;
end;

在tooluses事件中如下:
procedure TForm1.Map1ToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1,
X2, Y2, Distance: Double; Shift, Ctrl: WordBool;
var EnableDefault: WordBool);
var
ssymbol :cmapxstyle;
p: CMapXPoint;
f: cmapxfeature;
begin
ssymbol:=costyle.create;
ssymbol.SymbolType :=1;
ssymbol.SymbolBitmapSize:=25;
{请注意将test.bmp文件考到mapx “共有文件路径”+“/CUSTSYMB”路径下,例如C:/Program Files/Common Files/MapInfo Shared/MapX Common 是 MapX 共有文件的缺省安装路径}
ssymbol.SymbolBitmapName:='test.BMP';
p := CoPoint.Create;
f :=cofeature.Create ;
p.Set_(x1,y1);
if toolnum=111 then begin
f:=map1.ControlInterface.FeatureFactory.CreateSymbol(p,ssymbol);
map1.ControlInterface.Layers.Item(1).AddFeature(f,EmptyParam);

end;
回页首

在mapx中如何使用自定义鼠标

在mapx4.0,及以上版本中允许用户自定义鼠标。程序如下:
Map1.MousePointer = miCustomCursor
Map1.MouseIcon = "c:/windows/cursors/globe.ani"

mapx 中还对鼠标滚动轮提供支持,属性如下

Map.MouseWheelSupport=miMousewheelNoAutoScroll 回页首

mapx 打印地图时的参数如何设置
在mapx 的 printmap方法:PrintMap (hDC x, y, w, h)之中,w,h,x,y的单位为himetric,1 himetric=0.01毫米。所以,打印地图时需要将w,h 乘100换算为毫米。

在vb 中例子:


Private Sub Command4_Click()

On Error GoTo ErrorHandler ` Set up error handler.

' coords must be in himetric

' print same size as on screen, in upper left of page

ScaleMode = 6 `set mode to mm

' there is no Printer.StartDoc method, it seems it is done

' implicitly when you use one of the printer.print methods

' so we need to print something before we print our map

' to start the page

Printer.CurrentX = 0

Printer.CurrentY = 0

Printer.Print " "

Map1.PrintMap Printer.hDC, 0, 0, Map1.Width * 100, _


Map1.Height * 100

Printer.NewPage ` Send new page.


Printer.EndDoc ` Printing is finished.

Exit Sub


在vc中例子

// Map.PaperUnit Property

// Map.PrintMap Method

void CSampleProjectView::OnPrintMap(CDC* pDC,CPrintInfo* pInfo) {

try {

// get paper width in mm and convert to HIMETRIC (100th of a mm)

m_Map.SetPaperUnit(miUnitMillimeter);


double pw = m_Map.GetMapPaperWidth() * 100;

double ph = m_Map.GetMapPaperHeight()* 100;


m_Map.PrintMap((long)pDC->m_hDC,

pInfo->m_rectDraw.left,pInfo->m_rectDraw.

top,(long)pw,(long)ph);

} catch (COleDispatchException *e) {


e->ReportError();

e->Delete();

} catch (COleException *e) {

e->ReportError();

e->Delete();

}

}

你可能感兴趣的:(MapX,vb,session,printing,distance,数据库,integer)