⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contou.bas

📁 用VB6.0MapINfo绘等值线及表面图
💻 BAS
📖 第 1 页 / 共 5 页
字号:
Attribute VB_Name = "Module5"
Option Explicit
Private Type LOGFONT_TYPE
    lfHeight As Long            '字符高度(点数)
    lfWidth As Long             '字符宽度
    lfEscapement As Long        '转转角度(精度0.1)
    lfOrientation As Long       '字符基线相对于窗体底边角度(精度0.1)
    lfWeight As Long            '笔画粗细(0~1000)
    lfItalic As Byte            '1为斜体
    lfUnderline As Byte         '1为带下划线
    lfStrikeOut As Byte         '1为在字符中间划一条线
    lfCharSet As Byte           '字符集
    lfOutPrecision As Byte      '输出字体要求与字体的吻合度
    lfClipPrecision As Byte     '描述如何裁减位于裁减区以外的字符
    lfQuality As Byte           '逻辑字体与物理字体的匹配程度
    lfPitchAndFamily As Byte    '描述字库所属簇号
    lfFaceName As String * 32   '字体字样
End Type
Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT_TYPE) As Long

Public Type POINTAPI
    X As Long
    Y As Long
End Type

Public Type ParFillType
    value           As Single
    bFillColor      As Integer
    FillColor       As Long
    
    FillColorInit   As Long
    
    bMarkColor      As Integer
    MarkColor       As Long
    iMark           As Integer
    
    MarkColorInit   As Long
End Type
Public Type ParFillTypeT
    FillColor   As Long
    BackColor   As Long
End Type
Public Type ParMoveType
    TheContouFile           As String * 50
    Compute                 As Boolean
    ColorMin                As Long     '底色
    ValueMin                As Single

    Make                    As Byte     '是否已建立参数
    DataType                As Byte     '数据类型,0-网格数据,1-散乱数据
    iOptionContou           As Byte     '图形类型,0-平面等值线,1-立体等值线,2-立体表面图
    
    Xmin                    As Single   'X最小值
    Xmax                    As Single   'X最大值
    Ymin                    As Single   'Y最小值
    Ymax                    As Single   'Y最大值
    
    Vmin                    As Single   '最小值
    Vmax                    As Single   '最大值
    Vd                      As Single   '步长
    Vn                      As Integer  '等值线数
    nDec                    As Byte     '小数位数
    
    iCheckFillColor         As Integer  '是否填色
    lStartColorFill         As Long     '最小值填充颜色
    lEndColorFill           As Long     '最大值填充颜色
    iOptionFill             As Byte     '填充图例
    bFill                   As Boolean
    bPlotLine               As Byte     '是否画线

    iCheckContouMarkColor   As Integer  '是否绘等值线线
    lStartColorCurve        As Long     '最小值线条颜色
    lEndColorCurve          As Long     '最大值线条颜色
    DeltaN                  As Byte     '间隔几条线标注
    S0                      As Single   '等值线上的标注间距
    Hslz                    As Single   '标注字符高度(点)
    
    AngXY                   As Integer  '视线方位角(度)
    AngZ                    As Integer  '视线俯视角(度)
    KZ                      As Integer  'Z坐标放大系数
End Type

Public WcsX0 As Single, WcsY0 As Single, XYFact As Single
Public WcsX As Single, WcsY As Single
Public Xold As Single, Yold As Single
Public Xleng As Single, Yleng As Single
Public Xminp As Single, Yminp As Single, Xmaxp As Single, Ymaxp As Single
Public Xmin As Single, Xmax As Single, Ymin As Single, Ymax As Single
Public Xmin0p As Single, Ymin0p As Single
Public PaperHeight As Single, PaperWidth As Single

Public S0 As Single
Public DX As Single, DY As Single, NX As Integer, NY As Integer
Public HStep As Single, NH As Integer
Public AngXY As Single, AngZ As Single
Public N As Single
Public KZ As Single, KZZ As Single

Public StartRed As Integer, StartGreen As Integer, StartBlue As Integer, dRed As Integer, dGreen As Integer, dBlue As Integer
Public ParFill() As ParFillType, bMarkColor As Integer, bFillColor As Integer, iMark As Integer
Public ParFillT() As ParFillTypeT
Public ParMove() As ParMoveType, nMove As Integer, IndexMove As Integer
Public ColorMin As Long, ValueMin As Single, FillScaleWidth As Single
Public ColorMinCur As Long, ValueMinCur As Single, iOptionContou As Integer

Public iContou As Integer, Init As Integer
Public Xcontou() As Single, Ycontou() As Single, Zcontou() As Single, NContou As Long
Public Vmin As Single, Vmax As Single, Vd As Single, Vn As Integer
Public Zgrid() As Single, bZgrid() As Boolean
Public TheContouPath As String
Public DataType As Byte
Public ContouIndex As Integer
Public bFill As Boolean, StrFill As String, bPlotLine As Byte
Public StartColor As Long, EndColor As Long
Public TheMapInfoPath As String, TheOutFile As String
Public ThePublicInPath As String, TheInPath As String, TheInFile As String, TheInIndex As String
Public ThePublicOutPath As String, TheInstallPath As String, TheDataBasePath As String
Public ThePublicPicturePath  As String

Public Cd As Single, Pi As Single
Public A1 As Single, A2 As Single, A3 As Single, B1 As Single, B2 As Single, B3 As Single
Public J1 As Integer, I1 As Integer, J2 As Integer, I2 As Integer, J3 As Integer, i3 As Integer
Public AL1 As Single, AL2 As Single, AL3 As Single, AM1 As Single, AM2 As Single, AM3 As Single, AN1 As Single, AN2 As Single, AN3 As Single
Public Ys1 As Single, R0 As Single
Public Flag_Old As Integer, Flag_New As Integer, iPen_Old As Integer
Public xrl As Single, yrl As Single
Public IXL As Integer, IYL As Integer
Public value As Single
Public X0 As Single, Y0 As Single

Public TotalSquare As Integer
Public bOKCancel As Boolean
Public FMT As String, bFillScale As Boolean
Public BorderX() As Single, BorderY() As Single, nBorder As Integer
Public nSJX As Integer, ID1() As Integer, ID2() As Integer, ID3() As Integer
Public iColor As Integer, iFillStyle As Integer
Public iCheckLatLon As Integer
Public bClick As Boolean
Public StrError As Variant, StrWait As String, StrCommand As String
Public iOptionFill As Integer
Public iCheckFillColor As Integer, iCheckContouMarkColor As Integer
Public lStartColorCurve As Long, lEndColorCurve As Long
Public lStartColorFill As Long, lEndColorFill As Long
Public DeltaN As Integer, nDec As Integer
Public CurCellBackColor As Long, CurCellForeColor As Long, CurTXT As String, Row As Integer, CurValue As String

Dim CurFillColor As Long, CurForeColor As Long
Dim InNumber As Integer, InOutNumber As Integer, OutNo As Integer, InNo As Integer

Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Public Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long

Public Const RGN_AND = 1
Public Const RGN_COPY = 5
Public Const RGN_DIFF = 4
Public Const RGN_OR = 2
Public Const RGN_XOR = 3
Public Const COMPLEXREGION = 3
Public Const NULLREGION = 1
Public Const SIMPLEREGION = 2
Private Const FLOODFILLBORDER = 0
Private Const FLOODFILLSURFACE = 1
Public Const WINDING = 2
Public TableNameT As String, TheGRDFile As String
Public XFact As Single, Yfact As Single, Iinit As Integer
Public StrDDWY As String
Public FileMT0 As String, nSelected As Integer
Public The3DMapFile As String
'判断是否为经纬网
Public bLatLon As Boolean
Public nTheLowFile As Integer

Public PenWidthT As Integer
Public GTSLVIndex As String
Public bMovePicture As Boolean
'绘β分布图
Dim ScaleBeta As Double
Dim MinYear As Integer, MinMonth As Integer, MinDate As Integer
Dim MaxYear As Integer, MaxMonth As Integer, MaxDate As Integer
Dim mmPaperHeight As Long, mmPaperWidth As Long, FileType As String
Dim BetaYmax As Double

Dim iBorderLeft As Integer, iBorderRight As Integer, iBorderTop As Integer, iBorderBottom As Integer
Dim PicSubHeight As Single, PicSubWidth As Single
Public DataBaseLink As Integer
Public bPictureMesh As Boolean
Public Nfslz As Integer, Hslz As Double, SymFont As Integer
Public SymWidth(32 To 128) As Integer, SymHeight(32 To 128) As Integer, SymNPoint(32 To 128) As Integer, SymAddr(32 To 128) As Integer
Public PictureMesh As PictureBox
Public TheEarthQuakeFile As String
Public MinTime As Long, MaxTime As Long, MMin As Double, MMax As Double
Public LonMin As Double, LonMax As Double, LonStep As Double, Lon As Double, LonN As Integer
Public LatMin As Double, LatMax As Double, LatStep As Double, Lat As Double, LatN As Integer
'绘三维震中分布图
Public iMapType As Integer
Public Sub ClipRegionDLL(TheEarthQuakeName As String, Index As Integer)
    Dim MapperInfoCoordSys As String, TableInfoCoordSys As String
    Dim TheOutFile As String
    Dim N As Integer, M As Integer, nPolyGons As Integer
    Dim X1 As Single, Y1 As Single, X2 As Single, Y2 As Single
    Dim MinX As Single, MinY As Single, MaxX As Single, MaxY As Single
    Dim StrLonLat As String
    Dim I As Integer, J As Integer, K As Integer, nLayerName As Integer, Temp As Single
    Dim Str As String, DoStr As String, RowID As Integer, ABLR As String * 1, StrLatLon As String
    Dim LayerName As String, TableName As String
    Dim TempTableName() As String, Col1 As String, ColN As String
    Dim bKill As Boolean
    Dim TheLabelInfo As String, StrTemp As String
 
    Screen.MousePointer = 11
    On Error Resume Next

    '获取当前显示投影参数
    mapWinID = CLng(MapInfo.Eval("FrontWindow()"))

    MapperInfoCoordSys = MapInfo.Eval("MapperInfo(" & mapWinID & ",17)")

    nLayerName = CInt(MapInfo.Eval("MapperInfo(" & mapWinID & ",9)"))
    'Begin判断经纬网是否存在
    TableName = ""
    For I = 1 To nLayerName
        LayerName = MapInfo.Eval("LayerInfo(" & mapWinID & "," & I & ",1)")
        J = InStr(LayerName, Chr(0))
        If (J > 0) Then LayerName = Left(LayerName, J - 1)
        Col1 = UCase(MapInfo.Eval("ColumnInfo(""" & LayerName & """,""col1"",1)"))
        If (InStr(Col1, "经纬度刻度") > 0) Then
            MapInfo.do "Select * From " & LayerName & " Where 经纬度刻度=""边框"""

            N = Val(MapInfo.Eval("SelectionInfo(3)"))
            If (N = 1) Then
                MapInfo.do "OBJ_Temp=Selection.OBJ"
                MapInfo.do "OBJ_Temp=ConvertToRegion(OBJ_Temp)"
                MapInfo.do "OBJ_Temp1=OBJ_Temp"
        
                '删除装饰图层上的全部对象
                MapInfo.do "Set Map Layer 0 Editable ON"
                MapInfo.do "Delete from Cosmetic1"
                    
                MapInfo.do "Insert Into Cosmetic1(Object) values (OBJ_Temp)"
                    
                MapInfo.do "Commit Table Cosmetic1 As ""C:\Temp0.TAB"" TYPE NATIVE Charset ""WindowsSimpChinese"" " & MapperInfoCoordSys
                MapInfo.do "Open Table ""C:\Temp0.TAB"" as Temp0"
                MapInfo.do "Add Map Layer Temp0"
                    
                '删除装饰图层上的全部对象
                MapInfo.do "Delete from Cosmetic1"

                TableName = LayerName
            End If
            Exit For
        End If
    Next I
    'End判断经纬网是否存在
    Screen.MousePointer = 0
    If (TableName = "") Then Exit Sub
    Screen.MousePointer = 11
    nLayerName = 1
    ReDim TempTableName(0 To 2, 1 To nLayerName)
    
    Kill "c:\临时文件*.*"
    MapInfo.do "Rename Table " & TheEarthQuakeName & " As """ & "C:\临时文件" & """"

    I = 1
    LayerName = "临时文件"
    TheOutFile = TheEarthQuakeName
    TempTableName(0, I) = LayerName
    TempTableName(1, I) = TheMapInfoPath + TheOutFile + ".TAB"
    TempTableName(2, I) = TheOutFile
    
    'Begin确保数据投影与显示投影相同
    bKill = False
    LayerName = TempTableName(0, I)
    
    '当显示投影与数据投影不一致时,改变数据投影方式
    TableInfoCoordSys = MapInfo.Eval("TableInfo(" & LayerName & ",29)")
    If (TableInfoCoordSys <> MapperInfoCoordSys) Then
        '按当前显示投影参数存放临时文件
        TempTableName(0, I) = "TempLSL" + Format(I, "##0")
        TheOutFile = "C:\" + TempTableName(0, I) + ".TAB"
        MapInfo.do "Commit Table " & LayerName & " As """ & TheOutFile & """ TYPE NATIVE Charset ""WindowsSimpChinese"" " & MapperInfoCoordSys
          
        '打开改变投影后的新表
        MapInfo.do "Open Table """ & TheOutFile & """ as " & TempTableName(0, I)
        MapInfo.do "Add Map Layer " & TempTableName(0, I)
        
        '关闭原表
        MapInfo.do "Close Table """ & LayerName & """"
        bKill = True
    End If
    'End确保数据投影与显示投影相同

    'Begin把完全在剪裁区域内或部分在剪裁区域内的对象留下
    MapInfo.do "Select * From " & TempTableName(0, I) & " Where Obj Contains Part OBJ_Temp"
    If (Val(MapInfo.Eval("SelectionInfo(3)")) > 0) Then
        MapInfo.do "Commit Table Selection As """ & TempTableName(1, I) & """"
    Else
        TempTableName(1, I) = ""
    End If
    'End把完全在剪裁区域内或部分在剪裁区域内的对象留下

    If (TempTableName(1, I) <> "") Then
        MapInfo.do "Open Table """ & TempTableName(1, I) & """ as " & TempTableName(2, I)

        '把裁减区域全部对象设置为目标
        MapInfo.do "Select * From """ & TempTableName(2, I) & """"
        MapInfo.do "Set Target On"

        '设置裁减区域
        MapInfo.do "Select * From  Temp0"

        N = Val(MapInfo.Eval("TableInfo(" & TempTableName(2, I) & ",4)"))
        ColN = ""
        For J = 1 To N
            Col1 = MapInfo.Eval("ColumnInfo(""" & TempTableName(2, I) & """,""col" & J & """,1)")
            K = InStr(Col1, Chr(0))
            If (K > 0) Then Col1 = Left(Col1, K - 1)
            ColN = ColN + " " + Col1 + "=" + Col1 + ","
        Next J
        ColN = Left(ColN, Len(ColN) - 1)
        '删除裁减区域外部对象
        MapInfo.do "Objects Intersect Into Target Data " & ColN

    
        '存储表
        MapInfo.do "Commit Table " & TempTableName(2, I)
        '压缩表
        MapInfo.do "Pack Table " & TempTableName(2, I) & " Graphic Data"
        '关闭表
        MapInfo.do "Close Table """ & TempTableName(2, I) & """"
    End If

    '删出旧图层
    MapInfo.do "Close Table """ & TempTableName(0, I) & """"

    '添加新图层
    MapInfo.do "Open Table """ & TempTableName(1, I) & """ as " & TempTableName(2, I)
    MapInfo.do "Add Map Layer " & TempTableName(2, I)

    '删出备份装饰图层
    MapInfo.do "Close Table ""Temp0"""

    '删除装饰图层上的矩形
    MapInfo.do "Delete from Cosmetic1"

    If (bKill = True) Then
        '删除临时文件
        Kill "C:\TempLSL*.*"
    End If
        
    '新图层放位置
    If (Index > 1) Then
        MapInfo.do "Set Map redraw off"
        nLayerName = CInt(MapInfo.Eval("MapperInfo(" & mapWinID & ",9)"))
        StrTemp = "Set Map Order "
        For I = 2 To nLayerName
            StrTemp = StrTemp + Format(I, "##0") + ","
        Next I
        StrTemp = StrTemp + "1"
        MapInfo.do StrTemp
        MapInfo.do "Set Map redraw on"
    End If

    mmPaperHeight = Screen.Height / 56.7
    mmPaperWidth = Screen.Width / 56.7
    FileType = "BMP"

    TheOutFile = ThePublicPicturePath + TheEarthQuakeName
    J = InStr(TheOutFile, ".")
    If (J > 0) Then
        TheOutFile = Left(TheOutFile, J) + "BMP"
    Else
        TheOutFile = TheOutFile + ".BMP"
    End If
    MapInfo.do "Save Window  " & mapWinID & " As  """ & TheOutFile & """ Type """ & FileType & """ Width " & mmPaperWidth & " units ""mm"" Height " & mmPaperHeight & " units ""mm"""
        
    If (nSelected > 1) Then
        MapInfo.do "Close Table """ & TheEarthQuakeName & """"
        MapInfo.do "Close Table """ & TheEarthQuakeName & "图例"""
    End If

    Screen.MousePointer = 0
End Sub


Public Sub MaxnDec(Ymin As Single, Ymax As Single, nDec As Integer, StrMax As String, FormatTMP As String)
Dim ValueMax As Single, Delta As Single, StrYmin As String, StrYmax As String

If (Abs(Ymax) > Abs(Ymin)) Then
    ValueMax = Abs(Ymax)
Else
    ValueMax = Abs(Ymin)
End If
Delta = Abs(Ymax - Ymin)
If (Delta < 0.001 Or ValueMax < 0.001) Then
    nDec = 5
    FormatTMP = "######0.00000"
    StrYmin = Format(Ymin, "######0.00000")
    StrYmax = Format(Ymax, "######0.00000")
ElseIf (Delta < 0.01 Or ValueMax < 0.01) Then
    nDec = 4
    FormatTMP = "######0.0000"
    StrYmin = Format(Ymin, "######0.0000")
    StrYmax = Format(Ymax, "######0.0000")
ElseIf (Delta < 0.1 Or ValueMax < 0.1) Then
    nDec = 3
    FormatTMP = "######0.000"
    StrYmin = Format(Ymin, "######0.000")
    StrYmax = Format(Ymax, "######0.000")
ElseIf (Delta < 1# Or ValueMax < 1#) Then
    nDec = 2
    FormatTMP = "######0.00"
    StrYmin = Format(Ymin, "######0.00")
    StrYmax = Format(Ymax, "######0.00")
ElseIf (Delta < 10# Or ValueMax < 10#) Then
    nDec = 1
    FormatTMP = "######0.0"
    StrYmin = Format(Ymin, "######0.0")
    StrYmax = Format(Ymax, "######0.0")
Else
    FormatTMP = "######0"
    StrYmin = Format(Ymin, "######0")
    StrYmax = Format(Ymax, "######0")
    nDec = 0
End If
StrMax = StrYmax
If (Len(StrYmin) > Len(StrMax)) Then StrMax = StrYmin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -