• 编程实现Google Earth和ArcGIS的联动[demo]


      
        这个DEMO实现的功能就是在google earth中用鼠标获取地理坐标,然后自动定位到ARCGIS对应的区域影像中。前段时间因项目引导,在师兄的启发下,做了一个这样的Demo,后来因为各种原因一直没有进行下去。现在感觉还是有些用处的,现在抽空整理一下。
        Google Earth是一款优秀的Map Explorer,它的优秀在于使用普及和方便,虽然DigitalGlobe影像数据更新速度慢,但分辨率是还是很高的,最高可达到0.5m。如果忽略其误差,可以利用Google Earth的影像资源进行定位参考、解译参考、数字化等。
        Google Earth继Google Map API之后推出的Google Earth COM API ,提供的功能相对比较弱,一些功能据说似乎还存在着Bug。网址:http://earth.google.com/comapi/index.html。google earth的二次开发有两种方法:
    (1)使用windows API控制两个进程的调用,利用google earth api实现核心功能。
    (2)使用做好的务功能重点放在GE API开发上。
        这个demo使用的是GEVContorl(GEVC),它是一个完全COM的控件,对截止目前所有版本的GoogleEarth都支持,具有很高的兼容性和可用性,能够将GE视图(地球视图)集成到开发人员的应用系统中,并且支持滚轮功能。下载地址:http://www.gis9.com/download.jsp 
    一、安装完GE后,系统会自动拷贝一个EARTHLib.dll,添加Google Earth 1.0 Type Library到库应用.
    二、.NET中新建Arcgis command类。将生成一个dll,可以被ARCGIS自动添加到组件库中。
    三、部分代码,主窗口中:
     

      1Imports EARTHLib
      2Imports ESRI.ArcGIS.Controls
      3Imports ESRI.ArcGIS.Geometry
      4Imports ESRI.ArcGIS.Carto
      5Imports ESRI.ArcGIS.SystemUI
      6Imports ESRI.ArcGIS.ArcMapUI
      7Imports ESRI.ArcGIS.esriSystem
      8Imports ESRI.ArcGIS.Framework
      9Imports ESRI.ArcGIS.Geodatabase
     10Imports ESRI.ArcGIS.Display
     11Imports System.Windows.Forms.Cursor
     12Imports System.Drawing
     13Imports System.Drawing.Drawing2D
     14
     15
     16Public Class Form2
     17    Public g_GeHelper As EARTHLib.ApplicationGE 'GE的主应用API
     18    Public hookhelper As IHookHelper 'hookhelper
     19    Public longitude As Double '经度
     20    Public latitude As Double '维度
     21    Dim pApp As IApplication
     22    Dim pEnable As Boolean
     23    Dim pDoc As IMxDocument
     24    Dim pWorkspace As IWorkspace
     25    Dim pMap As IMap
     26    Dim pLayer As ILayer
     27    Dim pWorkE As IWorkspaceEdit
     28    Dim pFeaLayer As IFeatureLayer
     29    Private Structure POINTAPI
     30        Dim x As Double
     31        Dim y As Double
     32    End Structure
     33
     34    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     35        '初始化应用GE
     36        g_GeHelper = New EARTHLib.ApplicationGE
     37        AxGEViewer1.HookGE(g_GeHelper.GetMainHwnd, g_GeHelper.GetRenderHwnd)
     38    End Sub
     39
     40
     41    Private Sub AxGEViewer1_MouseDownEvent(ByVal sender As System.Object, ByVal e As AxGEVControl.__GEViewer_MouseDownEvent) Handles AxGEViewer1.MouseDownEvent
     42        If CheckBox1.Checked = True Then
     43            Dim GePt As PointOnTerrainGE
     44            Dim pt As POINTAPI
     45            '屏幕坐标到GE屏幕坐标的转换
     46            pt.x = e.evtArgs.X * 2 / Me.Width - 1
     47            pt.y = -e.evtArgs.Y * 2 / Me.Height + 1
     48            'GE屏幕坐标到地理坐标的转换
     49            GePt = g_GeHelper.GetPointOnTerrainFromScreenCoords(CDbl(pt.X), CDbl(pt.Y))
     50
     51            MsgBox("点击屏幕坐标:" & pt.x & "  ,  " & pt.y & "获得ge坐标:" & GePt.Longitude & " , " & GePt.Latitude)
     52            longitude = GePt.Longitude
     53            latitude = GePt.Latitude
     54            pMap = hookhelper.ActiveView
     55
     56            'arcmap中绘制点
     57            Dim point As IPoint
     58            point = New ESRI.ArcGIS.Geometry.Point
     59            point.PutCoords(longitude, latitude)
     60
     61            Dim pMarkerElement As IMarkerElement
     62            pMarkerElement = New MarkerElement
     63
     64            Dim pMarkerSymbol As ESRI.ArcGIS.Display.ISimpleMarkerSymbol
     65            pMarkerSymbol = New ESRI.ArcGIS.Display.SimpleMarkerSymbol
     66            pMarkerSymbol.Size = 3
     67            pMarkerSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSDiamond
     68
     69            Dim pElement As IElement
     70            pElement = pMarkerElement
     71            pElement.Geometry = point
     72            pMarkerElement.Symbol = pMarkerSymbol
     73
     74            Dim pGraphicsContainer As IGraphicsContainer
     75            Dim pActiveView As IActiveView
     76            pActiveView = pMap
     77            'pActiveView.Extent.CenterAt(point)
     78
     79            'arcmap中点的定位
     80            Dim pEnvelop As IEnvelope
     81            pEnvelop = pActiveView.Extent
     82            pEnvelop.CenterAt(point)
     83            pActiveView.Extent = pEnvelop
     84            pActiveView.Refresh()
     85            pGraphicsContainer = pMap
     86            pGraphicsContainer.AddElement(pMarkerElement, 0)
     87            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, Nothing, Nothing)
     88        End If
     89
     90    End Sub
     91    Public WriteOnly Property hook() As IHookHelper
     92        Set(ByVal value As IHookHelper)
     93            hookhelper = value
     94        End Set
     95    End Property
     96
     97    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     98
     99    End Sub
    100End Class

       

    command.cs中实现组件注册:

     


     63    Private m_hookHelper As IHookHelper
     64
     65
     66    ' A creatable COM class must have a Public Sub New() 
     67    ' with no parameters, otherwise, the class will not be 
     68    ' registered in the COM registry and cannot be created 
     69    ' via CreateObject.
     70    Public Sub New()
     71        MyBase.New()
     72
     73        ' TODO: Define values for the public properties
     74        MyBase.m_category = "test"  'localizable text 
     75        MyBase.m_caption = "tool1"   'localizable text 
     76        MyBase.m_message = "This should work in ArcMap/MapControl/PageLayoutControl"   'localizable text 
     77        MyBase.m_toolTip = "" 'localizable text 
     78        MyBase.m_name = ""  'unique id, non-localizable (e.g. "MyCategory_MyCommand")
     79        Try
     80            'TODO: change bitmap name if necessary
     81            Dim bitmapResourceName As String = Me.GetType().Name + ".bmp"
     82            MyBase.m_bitmap = New Bitmap(Me.GetType(), bitmapResourceName)
     83        Catch ex As Exception
     84            System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap")
     85        End Try
     86
     87
     88    End Sub
     89
     90
     91    Public Overrides Sub OnCreate(ByVal hook As Object)
     92        If m_hookHelper Is Nothing Then m_hookHelper = New HookHelperClass
     93
     94        If Not hook Is Nothing Then
     95            Try
     96                m_hookHelper.Hook = hook
     97                If m_hookHelper.ActiveView Is Nothing Then m_hookHelper = Nothing
     98            Catch
     99                m_hookHelper = Nothing
    100            End Try
    101
    102            'Disable if hook fails
    103            If m_hookHelper Is Nothing Then
    104                MyBase.m_enabled = False
    105            Else
    106                MyBase.m_enabled = True
    107            End If
    108
    109            'TODO: Add other initialization code
    110        End If
    111    End Sub
    112
    113    Public Overrides Sub OnClick()
    114        'TODO: Add Command1.OnClick implementation
    115        Dim ce As IEnvelope = m_hookHelper.ActiveView.Extent
    116        ce.Expand(0.50.5, True)
    117        m_hookHelper.ActiveView.Extent = ce
    118        m_hookHelper.ActiveView.Refresh()
    119        MsgBox("asdasd")
    120        Dim frm As Form2
    121        frm = New Form2
    122        frm.hookhelper = m_hookHelper
    123        frm.Show()
    124    End Sub
    125
    126End Class
    127

    生成dll后,即可直接在arcmap中添加自定义的comand按钮进行调用了。
      

  • 相关阅读:
    芯片测试
    【转】悬浮的对话框
    imagebutton 设置点击和按压效果
    imagebutton 设置了src属性的图片更换
    侧滑实现
    使用自定义的AlertDialog。
    [转]Dialog
    【转】webview的几个问题
    webview 播放H5视频问题 黑屏 只有声音没有画面
    【转】Android HTML5 Video视频标签自动播放与自动全屏问题解决
  • 原文地址:https://www.cnblogs.com/HomeGIS/p/1023416.html
Copyright © 2020-2023  润新知