Google Earth二次开发

项目中用到了Google earth二次开发,现在把搜集的资料进行了一下整理。供大家参考

1、安装google earth,我用的是4.2的版本

2、制作控件,封装google earth API,同时加入windows API,来将google earth的窗口嵌入在 控件中。

代码如下:

      

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using EARTHLib;


namespace GoogleEarthCOMWrapper
ExpandedBlockStart.gifContractedBlock.gif
{
    
public struct RECT
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{

        
public int X1;

        
public int Y1;

        
public int X2;

        
public int Y2;

    }
 

    
public partial class EarthControl : UserControl
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
private RECT windowRect = new RECT();
        IntPtr GEHWnd 
= IntPtr.Zero;
        IntPtr GEHrender 
= IntPtr.Zero;
        IntPtr GEParentHrender 
= IntPtr.Zero;
        
int IntGEHrender = 0;

        
private int WM_CLOSE = 0x10;

ContractedSubBlock.gifExpandedSubBlockStart.gif        
预定义#region 预定义

        
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
        
public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
        
public static readonly IntPtr HWND_TOP = new IntPtr(0);
        
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
        
public static readonly UInt32 SWP_NOSIZE = 1;
        
public static readonly UInt32 SWP_NOMOVE = 2;
        
public static readonly UInt32 SWP_NOZORDER = 4;
        
public static readonly UInt32 SWP_NOREDRAW = 8;
        
public static readonly UInt32 SWP_NOACTIVATE = 16;
        
public static readonly UInt32 SWP_FRAMECHANGED = 32;
        
public static readonly UInt32 SWP_SHOWWINDOW = 64;
        
public static readonly UInt32 SWP_HIDEWINDOW = 128;
        
public static readonly UInt32 SWP_NOCOPYBITS = 256;
        
public static readonly UInt32 SWP_NOOWNERZORDER = 512;
        
public static readonly UInt32 SWP_NOSENDCHANGING = 1024;
        
public static readonly int WM_MOUSEWHEEL = 0x020A;

        
public static int GW_CHILD = 5;
        
public static int GW_HWNDNEXT = 2;

        
#endregion


        
public delegate int EnumWindowsProc(IntPtr hwnd, int lParam);

ContractedSubBlock.gifExpandedSubBlockStart.gif        
API#region API
        [DllImport(
"user32", CharSet = CharSet.Auto)]
        
public extern static IntPtr GetParent(IntPtr hWnd);

        [DllImport(
"user32", CharSet = CharSet.Auto)]
        
public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        [DllImport(
"user32", CharSet = CharSet.Auto)]
        
public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        [DllImport(
"user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
        
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
      
        [DllImport(
"user32.dll")]
        
public static extern bool GetClientRect(IntPtr hWnd, ref RECT lpRect);

        [DllImport(
"user32.dll")]
        
public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

        [DllImport(
"user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags);

        [DllImport(
"user32.dll", CharSet = CharSet.Auto)]
        
public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
        
#endregion

                
        
public EarthControl()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            InitializeComponent();
        }


ContractedSubBlock.gifExpandedSubBlockStart.gif         
Private Members#region Private Members
        
private ApplicationGEClass _applicationGEClass;
        
#endregion
        

ContractedSubBlock.gifExpandedSubBlockStart.gif        
Public Member Functions#region Public Member Functions

        
public void Init()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
int i = 0;
            
            
this._applicationGEClass = new ApplicationGEClass();
            
while (i < 3 && (GEHWnd == IntPtr.Zero))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    GEHWnd 
= (IntPtr)_applicationGEClass.GetMainHwnd();
                    i
++;
                }

                
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    System.Threading.Thread.Sleep(
2000);
                }

            }

            
while (_applicationGEClass.IsInitialized() == 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// Give the app a couple seconds to Load
                Console.WriteLine("Waiting for Google Earth to initialize");
                Thread.Sleep(
500);
            }
            
        }

        
public CameraInfoGEClass GetCamera(bool considerTerrain)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetCamera(considerTerrain ? 1 : 0as CameraInfoGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }


            
return null;
        }


        
public void SetCamera(CameraInfoGEClass cameraInfo, double speed)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.SetCamera(cameraInfo, speed);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public void SetCameraParams(double lat, double lon, double alt, AltitudeModeGE altMode, double range,
            
double tilt, double azimuth, double speed)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.SetCameraParams(lat, lon, alt, altMode, range, tilt, azimuth, speed);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public void SaveScreenShot(string fileName, int quality)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.SaveScreenShot(fileName, quality);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }

        
        
public void OpenKmlFile(string fileName, bool suppressMessages)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.OpenKmlFile(fileName, suppressMessages 
? 1 : 0);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public void OpenKmlFileAndCloseOthers(string fileName, bool suppressMessages)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_applicationGEClass.GetTemporaryPlaces() != null && _applicationGEClass.GetTemporaryPlaces().Visibility > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _applicationGEClass.GetTemporaryPlaces().Visibility 
= 0;
                }

                _applicationGEClass.OpenKmlFile(fileName, suppressMessages 
? 1 : 0);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }

        
        
public void LoadKmlData(string data)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.LoadKmlData(
ref data);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public FeatureGEClass GetFeatureByName(string name)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetFeatureByName(name) as FeatureGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }


            
return null;
        }


        
public FeatureGEClass GetFeatureByHref(string href)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetFeatureByHref(href) as FeatureGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }


            
return null;
        }


        
public void SetFeatureView(FeatureGEClass feature, double speed)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.SetFeatureView(feature, speed);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public GeoPoint GetPointOnTerrainFromScreenCoords(double screen_x, double screen_y)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                PointOnTerrainGE ret 
= _applicationGEClass.GetPointOnTerrainFromScreenCoords(screen_x, screen_y);
                
//GeoPoint gp = new GeoPoint((double)ret.GetValue(0), (double)ret.GetValue(1), (double)ret.GetValue(2));
                GeoPoint gp = new GeoPoint((double)ret.Latitude, (double)ret.Longitude, (double)ret.Altitude);
                
return gp;
            }

            
catch(Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }


            
return new GeoPoint(000);
        }


        
public bool IsInitialized()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return (_applicationGEClass.IsInitialized() == 0? false : true;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return false;
        }


        
public bool IsOnline()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return (_applicationGEClass.IsOnline() == 0? false : true;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return false;
        }


        
public void Login()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.Login();
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public void Logout()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.Logout();
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public void ShowDescriptionBalloon(FeatureGEClass feature)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.ShowDescriptionBalloon(feature);
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public void HideDescriptionBalloons()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _applicationGEClass.HideDescriptionBalloons();
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

        }


        
public FeatureGEClass GetHighlightedFeature()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetHighlightedFeature() as FeatureGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return null;
        }


        
public FeatureGEClass GetMyPlaces()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
               
return _applicationGEClass.GetMyPlaces() as FeatureGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return null;
        }


        
public FeatureGEClass GetTemporaryPlaces()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetTemporaryPlaces() as FeatureGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return null;
        }


        
public FeatureCollectionGEClass GetLayersDatabases()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetLayersDatabases() as FeatureCollectionGEClass;
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return null;
        }


        
public int GetMainHwnd()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return _applicationGEClass.GetMainHwnd();
            }

            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ThrowException(e);
            }

            
return 0;
        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
Windows Control#region Windows Control

        
public void TakeIn()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
//GoogleEarthCOMWrapper.NativeMethods.SetParent(GEHrender, this.tabControl1.TabPages[0].Handle);
            
//GoogleEarthCOMWrapper.NativeMethods.MoveWindow(GEHrender, 0, 0, this.tabControl1.TabPages[0].Width, this.tabControl1.TabPages[0].Height, true);

            
//GoogleEarthCOMWrapper.NativeMethods.GetClientRect(GEParentHrender, ref windowRect);


            
//GoogleEarthCOMWrapper.NativeMethods.SetWindowPos(GEHWnd, GoogleEarthCOMWrapper.NativeMethods.HWND_BOTTOM, 0, 0, 0, 0,
            
//GoogleEarthCOMWrapper.NativeMethods.SWP_NOSIZE + GoogleEarthCOMWrapper.NativeMethods.SWP_HIDEWINDOW);
            
            
if (_applicationGEClass != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                IntGEHrender 
= _applicationGEClass.GetRenderHwnd();
                GEHWnd 
= (IntPtr)_applicationGEClass.GetMainHwnd();
                GEHrender 
= (IntPtr)IntGEHrender;
                GEParentHrender 
= (IntPtr)GetParent(GEHrender);
                SetParent(GEHrender, 
this.Handle);
                MoveWindow(GEHrender, 
00this.Width, this.Height, true);
                GetClientRect(GEParentHrender, 
ref windowRect);
                SetWindowPos(GEHWnd,HWND_BOTTOM, 
0000,SWP_NOSIZE +SWP_HIDEWINDOW);
            }

        }


        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
Public Properties#region Public Properties
        
public int StreamingProgressPercentage
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.StreamingProgressPercentage; }
        }


        
public double AutoPilotSpeed
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.AutoPilotSpeed; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _applicationGEClass.AutoPilotSpeed = value; }
        }


        
public ViewExtentsGEClass ViewExtents
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.ViewExtents as ViewExtentsGEClass; }
        }


        
public int VersionMajor
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.VersionMajor; }
        }


        
public int VersionMinor
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.VersionMinor; }
        }


        
public int VersionBuild
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.VersionBuild; }
        }


        
public AppTypeGE VersionAppType
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.VersionAppType; }
        }


        
public double ElevationExaggeration
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _applicationGEClass.ElevationExaggeration; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _applicationGEClass.ElevationExaggeration = value; }
        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
Private Helpers#region Private Helpers
        
private void ThrowException(Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
string message = "Unknown Exception";
            Exception ret 
= new Exception(message);

            
if (e is System.Runtime.InteropServices.COMException)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
uint errorCode = (uint)((System.Runtime.InteropServices.COMException)e).ErrorCode;
                
//switch (errorCode)
                
//{
                
//    case 0x80048002:
                
//        message = "GoogleEarth not initilaized";
                
//        ret = new ApplicationUninitializedException(message, e);
                
//        break;
                
//    case 0x80048004:
                
//        message = "Feature has no view";
                
//        ret = new FeatureHasNoViewException(message, e);
                
//        break;
                
//    case 0x80048001:
                
//        message = "Invalid or deleted feature";
                
//        ret = new InvalidOrDeletedFeatureException(message, e);
                
//        break;
                
//}
            }


            
throw ret;
        }

        
#endregion


        
public void SendMouseWheel(MouseEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{            
            
if (IntGEHrender != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
               PostMessage(IntGEHrender, WM_MOUSEWHEEL, e.Delta, e.Delta);
            }

        }


        
protected override void DestroyHandle()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (GEHWnd != IntPtr.Zero)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{

                
// Post a colse message
                PostMessage(GEHWnd.ToInt32(), WM_CLOSE, 00);
                
// Delay for it to get the message
                System.Threading.Thread.Sleep(1000);

                
// Clear internal handle
                GEHWnd = IntPtr.Zero;
                GEHrender 
= IntPtr.Zero;
            }

            
base.DestroyHandle();
        }


        
protected override void OnResize(EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
base.OnResize(e);
            
if (GEHrender != IntPtr.Zero)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                MoveWindow(GEHrender, 
00this.Width, this.Height, true);
            }

        }

        
    }

}

 

4、使用控件

 

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test
ExpandedBlockStart.gifContractedBlock.gif
{
    
public partial class Form1 : Form
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public Form1()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            InitializeComponent();
        }


        
//启动google earth
        private void button1_Click(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            earthControl1.Init();
        }


        
//将google earth嵌入到控件中
        private void button2_Click(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            earthControl1.TakeIn();
        }


        
//传递滚轮事件到google earth 中
        protected override void OnMouseWheel(MouseEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
base.OnMouseWheel(e);
            
if (earthControl1.Bounds.Contains(e.X, e.Y))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                earthControl1.SendMouseWheel(e);
            }

        }
        
    }

}

 

这个控件还是个雏形,还有很多方面没有考虑,比如说google earth的销毁等。

转载于:https://www.cnblogs.com/daidai/archive/2009/05/22/1486828.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
osgEarth 是一个开源的地理空间工具包,可以与 OpenSceneGraph(OSG)结合使用,用于实现高性能的地理可视化和地理信息系统(GIS)应用程序的开发。它提供了一组功能强大的工具和库,可帮助开发者快速构建出具有交互性和真实感的地理场景。 与传统的GIS开发工具相比,osgEarth 在可视化效果和性能方面有着明显的优势。它利用了OSG强大的三维渲染能力,可以实现高效的地形渲染、大规模数据集的可视化以及实时的地理信息展示。此外,osgEarth还提供了丰富的图层管理功能,支持多种地理数据格式,如矢量数据、栅格数据和影像数据等,可以轻松地加载和显示各类地理数据。 在 VS2010 开发环境下,osgEarth 提供了完整的开发包,方便开发者在 Windows 平台上进行 osgEarth 的开发和调试。VS2010与osgEarth的集成开发环境为开发者提供了友好的开发界面,可以轻松地进行代码编写、调试和发布。 使用osg Earth 组件进行开发还具有一定的灵活性和可扩展性。开发者可以根据自己的需求,选择和定制适合自己的功能模块,或者根据需要自行开发扩展模块。与其他商业GIS开发工具相比,osgEarth 的开发成本较低,同时也有着较高的自由度。 总之,osgEarth 在地理可视化和GIS应用开发方面具有很大的潜力与优势。VS2010开发包为开发者提供了便利的开发环境,使得使用osgEarth进行开发变得更加简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值