Global Mapper SDK 19 中文开发文档(一)

1.概述

Global Mapper SDK允许在您自己的应用程序中使用Global Mapper加载、渲染和导出技术。使用SDK,您可以执行大量功能,其中包括:

  • 从Global Mapper支持的几乎所有格式中加载任意数量的层。这包括几乎所有的图像、高程和矢量数据格式。
  • 将加载的层绘制到您自己的设备上下文中,允许在您自己的应用程序中进行Global Mapper样式的渲染。可以绘制加载数据的任何指定部分。
  • 从加载的光栅图层和立面图层中检索任意位置的颜色。
  • 从加载的立面图层中检索任意位置的立面。
  • 获取有关加载图层的信息,包括投影/基准、边界矩形、描述、地面控制点、像素大小等。
  • 检索矢量图层中每个特征的详细信息,包括坐标和属性数据。
  • 将加载的数据重新投影到用户指定的投影/基准。
  • 加载未通过提供地面控制点和投影进行地理参考的图像,DLL将执行校正。
  • 自动剪辑美国地质勘探局数字光栅图的图廓。
  • 将加载的图层导出为Global Mapper支持的许多导出格式,如GeoTIFF和JPG。
  • 将坐标从一个投影/基准重新投影到另一个投影或基准。
  • 从网格高程数据生成等高线。
  • 根据网格高程数据执行视域分析。

2.发布说明

2.1 Global Mapper v19.1的新增功能

2.1.1 SDK的特定变化

  • 允许将SDK许可证文件存储在主要版本的用户应用程序数据文件夹中(例如,SDK v19的“C:\ProgramData\GlobalMapper\GlobalMapperSDK19”)
  • 添加了.net framework 4.0版本的封装支持,并修复了64位指针出现的溢出问题。

2.1.2 重要的新功能

  • 添加了对导入和导出AutoCAD 2018 DWG文件的支持

2.1.3 激光雷达模块要突出强调的

  • 介绍了利用多核/线程对大型激光雷达点云进行滤波。这将加快所有进行过滤的激光雷达操作,包括激光雷达自动分类。
  • 添加了对自定义用于GENERATE_POINT_CLOUD脚本命令的外部.exe调用的命令行选项的支持。COMMAND_LINE_OPTS参数允许您为任何调用的.exe指定新的命令行选项。
  • 修复了在检查了“使用近红外光谱强度”加载设置的情况下加载激光雷达文件的显示问题。

2.1.4 激光雷达的变化

  • 介绍了利用多核/线程对大型激光雷达点云进行滤波。这将加快所有进行过滤的激光雷达操作,包括激光雷达自动分类。
  • 更新了LAS/LAZ 1.4导出,以在使用点类型6-10时完全符合LAS规范(即包括近红外光谱数据)。还使扫描角度转换准确,并使GPS时间转换基于报头中的全局编码值。
  • 修正了加载激光雷达LAS/LAZ文件时坐标可能是ECEF或正常投影坐标的问题。现在,您不再假设它们是ECEF,而是得到提示,以便可以使用恰好接近ECEF的常规坐标。
  • 增加了对自定义用于GENERATE_POINT_CLOUD脚本命令的外部.exe调用的命令行选项的支持。COMMAND_LINE_OPTS参数允许您为任何调用的.exe指定新的命令行选项。
  • 修复了在检查了“使用近红外光谱强度”加载设置的情况下加载激光雷达文件的显示问题。
  • 修正了碰撞移动激光雷达点云固定的距离和方位。

2.1.5 3D查看器的变化

  • 修复了飞行预览的渲染质量问题。
  • 修正了当高程不是以米为单位测量时,飞越凸轮高程的问题。
  • 修正了当光标移动到激光雷达数据上时,“多视图播放管理器”对话框将消失的问题。
  • 改进了SDK中3D查看器操作崩溃时的错误报告。

2.1.6 分析功能的变化

  • 修正了在选中“展平区域特征”选项的情况下从区域特征创建立面网格时的半像素偏移问题。
  • 修复了在具有4个以上内核(>8个线程)的机器上生成小网格的错误。

2.1.7 编写脚本的变化

  • 使CONNECT_LINES脚本命令在从SDK调用时工作。
  • 更新了脚本命令的位置参数,以支持除当前投影值之外的纬度/经度坐标。这包括GENERATE_VIEWSHED的XMIT_POS、GENERATE_PATH_PROFILE的START_POS和END_POS,以及IMPORT_ASCII的START_POS。
  • 修复了使用export_ELEVATION脚本命令导出GeoTIFF/BIL的默认ELEVE_UNITS。他们在4字节(浮点)输出中使用了分米或分英尺。还制作了分数高程单位(即分米),以便从GeoTIFF高程文件中正确存储和加载。
  • 增加了对EXPORT_RASTER命令上PALETTE_MAX_COLORS脚本参数的支持,用于指定生成调色板中的最大颜色数。
  • 如果不存在其他三维特征,则使用GENERATE_ELEV_grid命令和FLATTEN_AREAS=YES生成区域特征网格。
  • 修复了裁剪到多边形时的GENERATE_CONTOURS脚本命令。

2.1.8 联机源的变化

  • 将新的内置英国在线流媒体源添加到国家数据->英国组。
  • 修复了从流式在线层导出瓦片的锁定问题。
  • 修复了加载一些WFS在线数据源的问题。
  • 当指定了完整数据集像素尺寸和本机分辨率时,用于在线WCS下载的改进的自动像素尺寸。
  • 修复了尝试从投影SRS字符串中包含完整URL的WMS/WMTS源加载时出现的错误“无法从临时文件复制”。
  • 更新了美国国家地图在线来源以使用https(安全HTTP)。
  • 修复了如果使用“自动”标签放置设置,则在web导出的多个平铺中绘制某些点要素的标签的问题。
  • 修复了从某些WMS在线源下载HTTP 406错误。

2.1.9 投影/基准的变化

  • 更正了NAD83 NSRS 2011基准对应存储的EPSG代码。现在,1116存储为GCS代码,而6318存储为基准代码。

2.1.10 格式的特定变化

  • 增加了对HDF5/NetCDF格式的NASA格陵兰岛冰层厚度数据的支持。
  • 增加了对在不耗尽内存的情况下加载大量HF2/HFZ文件的支持。
  • 将详细的GeoTIFF标记信息添加到已加载的GeoTIFF图层的元数据中。
  • 增加了对加载HDF5格式的GMT5网格文件的支持。
  • 能够从大量输入文件中导出多波段GeoTIFF文件。
  • 为KML和其他XML导出添加了EUC-KR(朝鲜语)、SHIFT_JIS(日语)和BIG5(繁体中文)的字符编码选项。
  • 为Shapefiles和ESRI File Geodatabases添加了对三角形列表类型的多面片形状的支持。还将从单个多重面片创建的所有区域标记为位于同一区域组中。
  • 修复了导出到高位深度JPEG2000文件的问题。在修复之前,无论选择的比特深度如何,输出总是每个频带8比特。
  • 增加了对扩展名为.avg、.min、.max和.mmm的DTED文件的识别。
  • 更新了KML/KMZ导出时,加入<altitudeMode>以支持有高程的要素,加入<tessellate>以支持三维区域和线要素接边。
  • 从OSM(OpenStreetMap)XML文件加载其他功能属性,包括“user”、“uid”、“changeset”和“timestamp”。这些还将继续导出到新的OSM XML文件。
  • 更新了OSM(OpenStreetMap)XML导出,以包括“uid”等属性,其中包含从线条和区域特征自动生成的<node>元素。
  • 添加了对在图层的“选项”对话框上查看和编辑用于CADRG/CIB/RPF a.toc数据集的选项板的支持。
  • 修复了KML导出过程中使用相同文件名保存不同点样式的问题。
  • 修复了PointZ Shapefiles默认情况下使用除ELEVATION以外的属性作为Z坐标的问题。
  • 修复了加载一些JPEG2000文件时的错误。
  • 修复了某些.ers数据文件的加载问题。
  • 修正了将Oblique Mercator投影保存到GeoTIFF文件的问题。
  • 更新了Kingdom Polygon文件的导入和导出功能,可以保存和写入每个多边形的POLY_ID字段。同时修复了加载带有空标签或多边形ID字段的文件的问题。
  • 修复了在导出到Shapefiles或DBF文件时,将属性值超过255个字符的问题截断为某个任意长度而不是允许的最大长度254个字符的问题。
  • 修复了在加载高位深度的Erdas Imagine IMG文件时,出现完全透明显示的问题。
  • 修复了64位版本中显示超过4GB数据的某些文件的问题。
  • 修复了在重投影瓦片数据的边缘附近偶尔出现无效无数据像素的问题。
  • 修复了Lambert Conformal Conic 2SP投影下ECW文件的加载和保存问题。
  • 修复了使用以英尺为单位的投影导出时,PLS-CADD XYZ中存储的高程错误的问题。
  • 更新了SRTM HGT文件的无数据值,将其从-9999改为-32768。使用-9999作为无数据值的旧文件仍然可以正确显示。
  • 修复了将使用带有alpha通道的自定义PNG符号导出到PDF文件时的问题。
  • 更新了MBTiles导出文件,包括'minzoom'和'maxzoom'元数据值。
  • 优化了在导出时降低调色板图像的分辨率并使用默认/自动或框架采样器时的结果。
  • 修复了加载具有没有封闭区域的Shapefile时崩溃的问题。同时,通过在其附近点击,使空的封闭区域可以通过要素信息工具进行选择。
  • 确保"丢弃所有值为空的属性"选项被遵守。
  • 修复了PLS-CADD XYZ ASCII文件的加载问题。

2.1.11 渲染/样式的变化

  • 改进了彩色图像的盒式重采样器的行为,特别是在调色板的情况下。现在它们的行为如下:Box Maximum - 选择最亮的颜色。Box Minimum - 选择最暗的颜色。Box Average - 选择与以前相同的平均值,但对于调色板图像,将使用最接近该平均值的调色板颜色。Filter/Noise/Median - 对于灰度图像,使用中值;对于RGB彩色图像,使用平均值;对于基于调色板的图像,使用最常出现的颜色。
  • 修复了部分情况下屏幕外的大部分点符号无法显示或导出可见边缘的问题。
  • 修复了韩文、中文和日文文本的光晕字体绘制问题。
  • 修复了同时从多个线程调用GM_DrawLayerList时的随机崩溃问题。

2.1.12 其他杂项的变化

  • 确保标签的数字格式选项的更改得到应用。

3.激光雷达SDK

部分来自Global Mapper应用程序中的激光雷达模块的功能也可以在SDK中使用,包括对地面、建筑物和植被点进行自动分类,以及自动提取建筑物轮廓和树木点/多边形。有关激光雷达模块中的所有内容的更多信息,请访问http://www.bluemarblegeo.com/products/global-mapper-lidar.php,注意激光雷达模块的可视组件(如路径剖面和激光雷达工具栏)在SDK中不可用。使用任何支持的激光雷达模块功能需要更新的SDK许可证才能启用。如果您想要从SDK中使用这些功能,请联系sales@bluemarblegeo.com。

除了激光雷达查询功能外,要使用此功能,您需要使用Global Mapper脚本来运行GM_RunScript函数。

4.Global Mapper扩展

Global Mapper SDK允许您通过创建扩展DLL将自己的功能直接添加到Global Mapper。Global Mapper负责加载和显示数据。扩展只需要实现自定义功能。除了以下功能外,Global Mapper扩展还可以为应用程序执行上面列出的所有功能:

  • 将用于调用自定义功能的工具栏添加到Global Mapper用户界面。
  • 在数字化上下文菜单中添加菜单项。
  • 访问当前在Global Mapper中打开的图层和要素。
  • 访问当前在Global Mapper视图中选定的要素列表。
  • 请求Global Mapper刷新视图。

Global Mapper扩展开发人员指南

 创建Global Mapper扩展需要以下任务:

  • 创建扩展DLL。
  • 注册扩展DLL。

扩展DLL的要求

Global Mapper扩展DLL具有以下要求:

  • DLL的文件扩展名必须为“.gmx”,而不是“.dll”。
  • DLL必须实现代理类。代理类为扩展DLL提供“插件”接口,它是从GM_ExtensionProxy派生的。
  • DLL必须实现一个扩展类。扩展类执行自定义功能,并且必须从GM_extension派生。
  • 扩展DLL必须有一个导出的函数:
GM_ExtensionProxy* GetExtensionProxy(void)

安装SDK后,您将找到两个扩展示例。文件夹sample_tb_extension包含一个主要用于演示如何实现同时使用工具栏和菜单的扩展的基础知识的示例。文件夹sample_tb_extension_mfc中的示例演示了更多功能,如:

  1. 加载图层
  2. 访问已加载的图层
  3. 将菜单项添加到数字化菜单中
  4. 处理选定要素
  5. 处理预设的Global Mapper事件
  6. 其他

代理类

代理类GM_ExtensionProxy为扩展DLL提供了“插件”接口。代理类是一个抽象类,因此开发人员需要创建一个派生自GM_ExtensionProxy的代理类。扩展DLL将具有一个名为GetExtensionProxy的入口点,该入口点返回指向代理对象的指针。

struct GM_ExtensionProxy
{
    virtual const char* GetName(void) = 0;
    virtual const char* GetLicenseString(void) = 0;
    virtual GM_Extension* CreateExtension(void) = 0;
    virtual void Release() = 0;
};

GM_ExtensionProxy类包含以下纯虚拟方法,在实现Global Mapper扩展时必须重写这些方法:

  • GetName方法返回一个标识扩展的名称。在扩展因某些原因无法加载或获得许可时,该名称将用于标识扩展。
  • GetLicenseString函数返回扩展所需的SDK许可证字符串。这个许可证字符串用于验证DLL是否为有效的扩展。在尝试加载扩展时,Global Mapper将验证返回的许可证字符串。如果许可证字符串无效,则扩展将不会加载。如果扩展需要某种用户许可证,则开发人员需要实现验证该许可证存在的功能。
  • CreateExtension方法分配扩展类的实例并返回一个指向它的指针。当用户在扩展的工具栏上点击按钮时,Global Mapper将调用该类的方法来执行所请求的功能。Global Mapper将拥有这个指针,并在不再需要时删除它。
  • Release方法释放代理对象。

扩展类

扩展类GM_Extension执行扩展的工作。GM_Extension是一个抽象类,因此开发人员必须使用派生自GM_Extension的类来实现他们的扩展功能。GM_ExtensionProxy::CreateExtension()函数返回此类的一个实例。

struct GM_Extension
{
    virtual const char* GetDisplayName(void) const = 0;
    virtual const char* GetDescription(void) const = 0;
    virtual const char* GetButtonTooltipText(UINT aButtonIndex) const = 0;
    virtual void HandleCustomEvent(UINT aEventID, HWND aParentWindow) = 0;
    virtual void HandleGMEvent(GM_Event_t aEvent, void* aEventData,        HWND aParentWindow) = 0;
    virtual GM_ExtensionToolbarDef_t* GetToolbarDefinition() const = 0;
    virtual GM_ExtensionMenuDef_t* GetMenuDefinition(const GM_ExtensionMenuCriteria_t& aCriteria) const = 0;
    virtual void Release() = 0;
}

GM_Extension类包含以下纯虚拟方法,在实现Global Mapper扩展时必须进行重写:

  • GetDisplayName方法返回将包含在扩展管理器的注册扩展列表中的名称。
  • GetDescription方法返回将显示在“扩展属性”对话框上的文本。这是一个包含版本和版权信息的好地方。
  • GetToolbarDefinition方法返回一个派生自GM_ExtensionToolbarDef_t的对象,用于定义扩展工具栏。
  • GetMenuDefinition方法返回一个派生自GM_ExtensionMenuDef_t的对象,用于定义要添加到数字化器上下文菜单的菜单项。 aCriteria参数提供关于当前在Global Mapper用户界面中选择了什么类型的对象的信息。这允许扩展实现在特定上下文中操作选择的要素几何体(区域,线等)的菜单项。如果扩展程序不向数字化器菜单添加菜单项,则该方法应返回NULL。
  • HandleCustomEvent方法将在用户单击扩展工具栏上的按钮时调用。 aEventID参数包含用户单击的按钮的索引。 aParentWindow参数包含主Global Mapper窗口的句柄,可以用作对话框等的父窗口。
  • HandleGMEvent方法处理由Global Mapper生成的基本事件,例如通知加载了新图层或全局投影发生了变化。aEvent参数标识正在引发的事件。GM_Event_t枚举在GlobalMapperTypes.h中定义。aEventData参数包含与事件相关的数据。枚举成员的注释指示每个事件类型所包含的事件数据。开发人员需要注意的有几个特殊情况:
  1. 如果事件数据描述为Feature*,它将作为GM_FoundFeature_t*传递给扩展。
  2. 当事件数据被描述为GeographicOverlay*时,它将作为GM_LayerHandle_t32传递给扩展。
  3. 在没有提供数据的情况下,此值将为NULL。aParentWindow参数包含主Global Mapper窗口的句柄,该窗口可以用作对话框等的父窗口。
  • Release方法释放扩展对象。

扩展工具栏定义

GM_ExtensionToolbarDef_t结构定义了与Global Mapper扩展DLL相关联的工具栏。GM_ExtensionToolbarDef_t是一个抽象定义,因此开发者需要从GM_ExtensionToolbarDef_t派生一个类来提供他们的工具栏定义。

struct GM_ExtensionToolbarDef_t
{
    // Data Accessors
    virtual UINT GetBitmapID(void) const = 0;
    virtual int  GetNumButtons(void) const = 0;
    virtual UINT GetButtonCommandID(int aIndex) = 0;
    virtual BOOL UsesTooltips(void) const = 0;
    virtual const char* GetTitle(void) const = 0;
    virtual void Release() = 0;
};

GM_ExtensionToolbarDef_t结构包括以下必须在派生类中实现的纯虚拟方法:

  • GetBitmapID方法返回工具栏按钮位图的资源ID。Global Mapper将尝试使用此ID从扩展DLL资源中读取工具栏位图。如果在扩展DLL中找不到工具栏位图,则工具栏初始化将失败并显示错误消息。在Global Mapper v18.0.2和更早版本中,默认假设工具栏按钮的大小为19像素宽乘以19像素高。从Global Mapper v18.0.3开始,工具栏按钮的大小可以是任意大小,但会按照内置的Global Mapper工具栏的大小进行缩放,即24像素宽乘以24像素高。您可以继续使用19x19的按钮,并允许缩放将其更新为24x24,但为了更好的外观,您应该创建24x24的工具栏按钮。如果您希望您的扩展在所有版本上运行,请创建两个工具栏图像,一个高度为19像素用于旧版本,另一个高度为24像素用于较新的版本,然后在您的代码中使用(GM_GetSDKVersion()> = 1803)来决定提供哪个位图资源。
  • GetNumButtons方法返回工具栏中按钮的数量。
  • GetButtonCommandID方法返回指定按钮的扩展命令ID。aIndex参数指示要返回的按钮ID。当用户点击工具栏按钮时,此值将通过HandleCustomEvent方法传递回扩展。
  • UsesTooltips方法指示当用户将鼠标悬停在工具栏按钮上时是否应显示工具提示。
  • GetTitle方法返回未停靠时在工具栏上显示的标题文本。
  • Release方法释放工具栏定义对象。

扩展菜单定义

GM_ExtensionMenuDef_t结构定义了要显示在数字化器菜单中的菜单项。GM_ExtensionMenuDef_t是一个抽象定义,因此开发人员需要从GM_ExtensionMenuDef_t派生一个类,以提供菜单定义。

struct GM_ExtensionMenuDef_t
{
    // Data Accessors
    virtual GM_MenuType_t GetMenuType(void) const = 0;
    virtual UINT GetNumMenuItems(void) const = 0;
    virtual const char* GetMenuItemText(UINT aIndex) const = 0;
    virtual UINT GetCommandID(UINT aIndex) const = 0;
    virtual void Release() = 0;
};

GM_ExtensionMenuDef_t结构包括以下必须在您的派生类中实现的纯虚函数:

  • GetMenuType返回一个枚举,指定要添加菜单项的Global Mapper菜单。目前,菜单项只能添加到数字化器的上下文菜单中。
  • GetNumMenuItems返回定义中包含的菜单项的数量。
  • GetMenuItemText返回指定菜单项的文本。aIndex参数表示要检索的菜单项。
  • GetCommandID返回指定菜单项的扩展命令ID。aIndex参数表示要返回的菜单项ID。当用户点击菜单项时,此值将通过HandleCustomEvent方法传递给扩展。
  • Release方法释放菜单定义对象。

扩展工具栏按钮/菜单选项状态(禁用和选中)

默认情况下,所有的工具栏按钮和菜单项都是启用的且未选中的。如果您希望在某些时候禁用/选中命令项(按钮和菜单选项),您可以通过处理GM_Event_GetExtensionCommandState事件来实现,该事件将一个GM_ExtCommandState_t*传递给扩展。您可以根据当前设置的选项为请求的命令ID设置启用/禁用和选中/未选中的状态标志。请注意,将工具栏按钮标记为选中意味着它被按下。该事件只会由Global Mapper v16.2.4及更高版本发送。以前的版本不支持禁用或选中工具栏按钮或菜单选项。

扩展DLL入口点

一个Global Mapper扩展DLL必须有一个入口点:

GM_ExtensionProxy* GetExtensionProxy(void);

当尝试加载一个扩展时,Global Mapper将验证扩展DLL是否包含此入口点。如果没有,则加载操作将失败。以下代码片段展示了实现GetExtensionProxy函数的一种方式:

// TestProxy.h contains the extension proxy definition.
#include "TestProxy.h"

TestProxy theProxy;
extern "C" TestProxy* g_pProxy = &theProxy;

// This the exported function that returns the proxy instance
extern "C" __declspec(dllexport) GM_ExtensionProxy* GetExtensionProxy(void)
{
    return g_pProxy;
}

TestProxy是从GM_ExtensionProxy派生的类。请注意,在此示例中,TestProxy的实例(theProxy)是一个静态变量。因此,TestProxy::Release()的实现为空,因为无法删除静态对象。

注册扩展的 DLL

在使用扩展之前,必须将其注册到 Global Mapper 中。可以通过以下两种方式来实现:

  1. 使用 Global Mapper 用户界面中的扩展管理器。
  2. 通过脚本(例如,安装程序脚本)启动 Global Mapper,并将扩展 DLL 的名称与 -regex 参数一起传递给它。

类似地,在从计算机中移除扩展之前,必须取消注册它。这可以通过以下两种方式实现:

  1. 使用 Global Mapper 用户界面中的扩展管理器。
  2. 通过启动Global Mapper并使用-unregex参数,将扩展的DLL名称传递给它,在卸载脚本中实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值