MapWindow简单入门

1.前言 
前一段公司出于成本和效率的原因,要求在我们的产品中用开源的GIS组件来代替以前使用的MapX,经过一段时间的查找,我发现了MapWinGIS这个东西基本可以满足我们的要求。经过几天的摸索,我写了这篇文章,希望能对其他使用MapWinGIS的人有所帮助。我平常接触GIS很少,也最多就是在开发系统中偶尔用到MapX,很多基本概念也不了解,所以可能有很多错误的地方,忘见谅。 
2.MapWinGIS简单介绍 
  MapWinGIS是一个开源的ActiveX组件,功能上类似MapX,开发人员可以利用这个ActiveX组件在自己的系统中完成GIS的相关功能,例如地图,IMAGE,GRID的显示;在图层上标绘点,线,图形;计算长度,存取GIS数据等相关工作. 
  它的主要功能包括: 
  直接打开,编辑,保存Image,Grid,Shapfile,TIN,DBF格式的文件 
  在地图中对图形进行浏览,标注,设置颜色等信息。 
  在地图中进行空间数据查询 
  动态的在图层上标绘空间数据。 
  存取地图中的相关数据。 
  对不同的格式进行转换,例如从TIN到GIRD等。 
  MapWinGIS团队的开发人员似乎主要来自爱荷华大学,MapWinGIS按Mozilla Public License 1.1.发布。在MapWinGIS 的基础上,他们又开发了MapWindow GIS,这是一套GIS系统,用户可以直接通过它浏览数据,并通过一系列插件来完成其他功能。还有一套MapWinX,是DOTNET平台下的一个辅助工具。 
  MapWinGIS 是在VS2003下由VC开发而成,MapWindow GIS 是VB.NET开发的。其中MapWinGIS 代码大约有15万行,大约50%的注释率。在MapWindow的网站提供了一个VB6的简单例子代码,也可以通过观看MapWindow GIS来学习它的一些更高级的功能。 
  它的官方网站是 [www.mapwindow.org] ,在网站上提供了二进制程序下载,源代码下载,并且有相关的论坛和文档,资料算是比较丰富的,似乎好像有一个开发人员是华人,所以还有个中文论坛,就是帖子太少。 
3.文件格式的转换 
  由于用户提供的是MapInfo的TAB格式的底图,而MapWinGIS不能处理该格式的文件,所以必须要进行相关的转换工作,具体做法为:首先将MapInfo的TAB格式的底图转换为MapInfo的MIF格式(MIF格式是MapInfo的文本交换格式文件).然后再将MIF文件格式转换为MapWinGIS可以直接读取的SHP格式(SHP格式是ESRI公司定义的空间数据文件格式). 
  我们可以用MITAB将TAB格式转换为MIF格式,MITAB是一套开源的C++库(具体请参见[mitab.maptools.org]),用户可以根据这个库在自己的应用程序中实现转换,MITAB也提供了一个命令行工具tab2tab.exe 直接将TAB格式转换为MIF格式,具体命令为: 
tab2tab source.tab dist.mif 
在得到MIF文件后,可以用OGR将MIF格式转换为SHP格式,OGR也是一套开源的C++库(具体请参见[ogr.maptools.org]),用户可以根据这个库在自己的应用程序中实现转换,ORG也提供了一个命令行工具ogr2ogr.ext来实现转换,转换的命令为: 
ogr2ogr -f "ESRI Shapefile" dist.shp source.mif 
在根据TAB文件得到SHP文件后,我们就可以使用MapWinGIS了。  
4.对象介绍 
在MapWinGIS中,最常用的对象有如下几个: 
Map:MapWinGIS最主要的对象,用于显示Grid,Image和Shapefile,它管理所有的图层,并响应鼠标操作,类似于MapX中的Map对象。 
   Shapefile:一个图层对象,可以由用户创建,也可以从图层文件中生成(SHP文件),类似于MapX中的Layer对象,可以在该对象上标点,标线,标图形等。 
   Shape:一个图形对象,可以是点,先,面等。 
   Point:代表了一个坐标点 
   Field:存储相关地理信息的一个字段,类似于DBF 表中的字段。 
   Table:存储相关地理信息的一个表。 
5.MapWinGIS的使用 
  MapWinGIS在VB下使用的比较简单,网站上也提供了VB的例子,已经很详细了,我这里主要讲一下在VC中的调用和一些我使用上的碰到的一些问题 
5.1 调用方式 
在VC6中,似乎由于一些特殊原因(原因将在后面谈及),无法象使用其他ActiveX一样,直接从Project->Add To Project ->Components and Controls 中选择MapWinGIS.ocx,生成相关的封装类,它将报一个错,错误是"The ActiveX Control is not registered properly ,or its type library version number is incorrect…"。因而只能从Gallery/ Registered ActiveX Controls中选择已经注册的Map Control加入到这个项目中,但用这种方式只能生成Map对象的CMap封装类,其他对象无法生成封装类。如果从Type Library 中生成"COleDispatchDriver"的子类封装的化,则在调用相关的封装类的方法或属性时,例如CShapefile的Open方法,则会产生一个异常,异常的消息代码为"8002801D"。关于这个异常,MS有一个相关的解释,大致就是ATL的版本似乎不对,前面无法正常插入这个OCX 对象大概也是这个原因,这篇文章的地址为:"http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B221792"。在MapWindow的论坛上我也看到了有人提出过这个问题,大概也有人碰到过。所以,我试出来正确的调用方式是使用"#import "MapWinGIS.ocx"rename_namespace("mapWindow") rename("GetObject", "MapWinGISGetObject")",为了省事,仍然可用前面插入OCX的方法创建一个CMap的封装类,使用Map对象时直接调用这个Map的封装类,而其他对象使用IXXXXPtr的smart pointer,下面是调用过程: 
1.在Project->Add To Project ->Components and Controls插入OCX对象,生成CMap1封装类 
2.在Stdafx头文件中增加#import "MapWinGIS.ocx" rename_namespace("mapWindow") rename("GetObject", "MapWinGISGetObject")" 
3.创建一个资源ID,选择View菜单中的Resource Symbols,创建一个新的资源ID,命名为IDC_MAP 
4.在View的头文件中,Include产生的封装类头文件,然后加入封装类的对象,如下代码: 
#include "Map.h" 
Class CTestMapWindowView :public CView 
{ 
Protected: 
CMap1 m_Map; 
} 
5.在视图(假设为文档-视图结构)的应用中对View类创建WM_CREATE的消息映射函数,加入如下代码: 
if(m_Map.Create(NULL, WS_VISIBLE, CRect(0,0,400,400), this, IDC_MAP) == false){ 
return -1; 
} 
6.在View类中创建WM_SIZE的消息映射函数,加入如下代码 
void CTestMapWindowView::OnSize(UINT nType, int cx, int cy) 
{ 
CView::OnSize(nType, cx, cy); 
// TODO: Add your message handler code here 
m_Map.Resize(cx,cy); 
} 
这样,应用程序的框架基本完成,可以编译,运行了。 
5.2 加入图层 
由于在图层Shapefile对象中使用了smart pointer进行封装,因而加入图层的代码为 
mapWindow::IShapefilePtr sf; 
HRESULT hr=sf.CreateInstance("MapWinGIS.Shapefile"); 
if (!SUCCEEDED(hr)){ 
return ; 
} 
USES_CONVERSION; 
//打开图层文件 
if(!sf->Open(A2BSTR("C:\\temp\\testgis\\shp\\11.shp"),NULL)){ 
return ; 
} 
//将设置颜色,标签等信息,将图层加入到Map中 
long hanlde=m_Map.AddLayer(sf,true); m_Map.SetShapeLayerFillColor(handle,RGB((255-1)*rand(),(255-1)*rand(),(255-1)*rand())); 
m_Map.SetShapeLayerLineColor(handle,RGB((255-1)*rand(),(255-1)*rand(),(255-1)*rand())); 
m_Map.SetLayerLabelsVisible(handle,TRUE); 
5.3 处理事件 
要处理MapWinGIS的事件,需要创建一个事件槽(eventsink).具体方法如下,在View类的头文件中,在DECLARE_MESSAGE_MAP()行下加入"DECLARE_EVENTSINK_MAP()" ,在CPP文件中加入如下代码: 
BEGIN_EVENTSINK_MAP(CTestMapWindowView,CView) 
END_EVENTSINK_MAP() 
为了响应MouseMove事件,在上述两行代码中加入如下代码 
   ON_EVENT(CTestMapWindowView,IDC_MAP,0x03,OnMouseMove,VTS_I2 VTS_I2 VTS_I4 VTS_I4) 
  然后对CTestMapWindowView 类增加一个方法,函数声明为: 
afx_msg void OnMouseMove(short _button,short _shift,long _x,long _y); 
  需要说明的是,在MapWinGIS中,为了能够响应事件,必须在调用SetSendMouseMove(true)后才能响应鼠标移动事件,其他响应事件也是如此类推。 
5.4改变显示位置 
在用户希望地图能够自动漫游时,先调用Map对象的GetExtents对象得到Map的Extents 对象,然后调用Extents的对象的SetBounds来设置相关边界,最后调用Map对象的SetExtents将这个Extents对象设置到Map对象中. 
5.5 动态标绘 
当用户希望比较频繁的动态标绘数据时,可以使用NewDrawing来创建一个绘画层,然后调用DrawPoint ,DrawLine 或DrawPolygon 来在刚才的创建的层上标出点,线和多边形。用ClearDrawing可以清除在这个层上所绘制的所有图形,对于动态轨迹的显示,就是在调用Draw后,用ClearDrawing清除,然后再重画相应的轨迹。 
用户可以多次调用NewDrawing来创建新的绘画层,对新的绘画层上的相关操作并不影响到其他已经创建的绘画层。用户可以调用ClearDrawing来清除指定的绘画层上所有的图形。但是,在创建了新的绘画层后,无法对其他的绘画层再进行任何绘画操作;同时在调用了Draw后,也无法对所绘制的对象进行操作。唯一可用的是可以可以对刚才创建的对象进行设置一个Key,对刚才绘制的对象设置一个字符串,并可以读取这个字符串。但是无法得到以前设置的其他对象的字符串。 
5.6 动态绘制图层 
除了用NewDrawing来创建一个绘画图层外,还可以动态的创建一个Shapefile,在这个Shapefile上进行点,线,多边形的绘制操作,在创建这个图层过程中可以增加其他附加数据。即增加一个或若干个Field,在插入一个Shape后,可以指定在Field上插入该行的数据。在该图层上,所有的图形对象均可进行操作。 
5.7 ShapefileColorBreak对象和ShapefileColorScheme对象 
在创建ShapefileColorBreak对象和ShapefileColorScheme对象时,他们的ProgID分别为"MapWinGIS.ShapefileLegendBreak"和"MapWinGIS.ShapefileLegend",而不是"MapWinGIS.ShapefileColorBreak"和"MapWinGIS.ShapefileColorSchema"。在一开始我想当然的人为对象的名字就是ProgId的名字,后来发现不对,这里提醒一下。 
6.其他说明 
MapWinGIS的显示速度同MapX相比快几倍个数量级左右,我曾经做过试验,如果在图上标绘100万个点,如果使用MapX,大约要5-10分钟,如果使用MapWinGIS,在Shapefile上绘制要1分钟左右,使用NewDraw则更快。 
可能是由于SHP本身格式的一些原因,一些MapInfo地图中特有的信息,例如铁路线,特殊标记的点(例如医疗机构的红十字),还有线的宽度,在转换到SHP后就没有了。因而显示出来的地图没有在MapX中显示的好看,当然可以通过其他方法来显示这些信息,不过就比较麻烦了,如果用户对GIS系统的要求比较高的化,用MapWinGIS可能就会有一些麻烦。 
在下了MapWinGIS的源码后我用VS2005编译了一下,发现无法通过编译;用VS2003,在Debug版本下连接出现错误,Release版本则编译通过了,具体什么原因,有时间还要好好琢磨一下

转载于:https://www.cnblogs.com/yangxx-1990/p/4882199.html

MapWindow5:MW5是一个桌面GIS,可以使用插件体系结构进行扩展。 它使用MapWinGIS映射控件,并于2015年使用MEF和Dependency Injection等新技术从零开始创建,从而使其体积小,功能强大且速度快 MapWindow5 MW5是一个桌面GIS,可以使用插件体系结构进行扩展。 它使用MapWinGIS映射控件,并于2015年使用MEF和Dependency Injection等新技术从零开始创建,从而使其体积更小,更坚固,更快速。 我们一直在寻找C#,C ++和OpenCL / OpenGL开发人员。 如果您具有设计技能,我们也需要您;) 要保持最新状态,请点击以下链接: MapWindow项目通讯,。 赞助商 我们有多家公司支持此项目: 向我们提供了ReSharper的免费许可证:Microsoft Visual Studio的开发人员生产力工具; ,向我们免费提供了其Enterprise类工具包的许可证,其中包括Windows窗体的独特控件; 向开发人员提供从事此项目的工作,并为MapWindow GIS提供(收费)支持。 立即下载

相关推荐

MapWinGIS:MapWinGIS.ocx是基于C ++的免费和开放源代码的地理信息系统编程ActiveX控件和应用程序程序员界面(API),可以将它们添加到Windows Form中,使用Visual Basic,C#,Delphi或其他支持ActiveX的语言来提供应用程序与地图。 转到我们的论坛以获取问题和帮助

什么是MapWinGIS? MapWinGIS.ocx用于为任何基于Windows窗体的应用程序提供GIS和映射功能。 MapWinGIS.ocx是基于C ++的免费和开放源代码的地理信息系统编程ActiveX控件和应用程序程序员界面(API),可以将它们添加到Windows Form中,使用Visual Basic,C#,Delphi或其他支持ActiveX的语言来提供应用程序与地图。 (带有矢量叠加层和标签的ECW图像显示在Demo .NET / C#应用程序中) 通讯 如果您想保持最新状态,可以在订阅我们的新闻通讯 谁在使用MapWinGIS? MapWinGIS Activex控件是MapWindow GIS开源项目的主要产品。 该控件完全用C ++构建,是一个强大而强大的GIS组件,它是的主要元素,并为许多其他软件应用程序提供了GIS功能。 我可以使用MapWinGIS

MapWindow GIS二次开发

1、mapwindow是基于MapWinGIS组件开发的插件式开源GIS软件,其中数据处理又基于开源的gdal。 2、 MapWinGIS简单介绍   MapWinGIS是一个开源的ActiveX组件,功能上类似MapX,开发人员可以利用这个ActiveX组件在自己的系统中完成GIS的相关功能,例如地图,IMAGE,GRID的显示;在图层上标绘点,线,图形;计算长度,存取GIS数据等相关工作.  ...

ipqchase博客 9038

MapWinGIS 教程 中文资料

MapWinGIS 矢量地图 中文资料 开发基于MapWinGIS地图资料

Mapwingis的安装与使用

如果没有代码基础,又想借助mapwingis工具,可以看本篇通俗的介绍: 首先,你的电脑要安装一个Visual Studio, 下载mapwingis 安装最新版的32位的MapWinGIS,下载路径为: https://github.com/MapWindow/MapWinGIS/releases ...

weixin_43839958的博客 3687

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6962

UFS 功能描述:UFS boot

UFS 启动过程介绍:启动配置,启动代码下载过程和安全性

m0_51720747的博客 1605

MapWindow简单入门(转)

1.前言  前一段公司出于成本和效率的原因,要求在我们的产品中用开源的GIS组件来代替以前使用的MapX,经过一段时间的查找,我发现了MapWinGIS这个东西基本可以满足我们的要求。经过几天的摸索,我写了这篇文章,希望能对其他使用MapWinGIS的人有所帮助。我平常接触GIS很少,也最多就是在开发系统中偶尔用到MapX,很多基本概念也不了解,所以可能有很多错误的地方,忘见谅。  2.Map

_Witch__的专栏 1万+

信息安全与技术——(十一)恶意代码检测与防范技术

恶意代码(Malicious Code )或恶意软件(Malware )主要是指以危害信息的安全等不良意图为目的的程序,它们一般潜伏在受害计算机系统中实施破坏或窃取信息。

m0_63853448的博客 5992

geoserver+mapwindow

用mapwindow访问geoserver发布的数据

cristing_hu的专栏 2297

从官方例程到实战:AXI Memory Mapped To PCIe 核在FPGA-RC模式下的配置与调试全解析

本文详细解析了AXI Memory Mapped To PCIe核在FPGA-RC模式下的配置与调试方法。从IP核基础结构到实战参数设置,再到例程代码剖析和调试技巧,全面覆盖了AXI与PCIe协议转换的关键技术点,帮助开发者高效实现FPGA与PCIe设备的高速数据交互。

weixin_42550597的博客 270

DDR内存设计必看:DFI接口协议详解与实战避坑指南(附时序图解析)

本文深入解析了DDR内存设计中连接内存控制器与物理层的DFI接口协议,聚焦于DDR4/DDR5设计的实际痛点。文章详细阐述了协议版本兼容性、时钟架构(匹配频率与频率比系统)、PCB信号完整性设计以及上电初始化与调试等关键环节,为硬件工程师提供了一套从理论到实战的完整避坑指南,并附有时序图解析以助理解。

weixin_29256771的博客 331

仅几十兆的轻量级开源GIS软件MAPWINDOW

MAPWINDOW是一款功能全面的地图设计软件,凭借着轻巧的身姿和强大的功能,它能够在普通配置的电脑上迅速加载,帮助高效地设计出所需的地图。无论是地形图、专题地图还是其他类型的地图,都能轻松应对。软件基于GIS技术,能够精准地读取各类地理空间信息。只需简单操作,便可以将丰富的地理空间数据加载到自己的地图作品中,实现数据与地图的完美融合,让地图设计变得轻松而富有创造力。MAPWINDOW在新版MAPWINDOW中,针对大数据属性表的打开进行了贴心的优化。

1359

一文详解脉搏血氧测量原理与方法

本文摘要:血氧饱和度(SpO2)是评估人体氧合功能的重要指标,反映血红蛋白携氧能力。其测量基于光电容积描记法(PPG),利用红光(660nm)和红外光(940nm)通过组织时的吸收差异计算。脉搏波特征与心血管状态相关,动脉硬化会影响波形特征。Masimo公司的信号提取技术(SET)通过并行算法有效解决了传统血氧仪在运动、弱灌注情况下的测量误差问题,显著提升了临床监测的准确性和可靠性。该技术已成为血氧监测的金标准,在降低误报率、缩短响应时间方面具有显著优势。

m0_50146396的博客 2016

MapWindow5中的标签设置

MapWindow5中的标签设置最终实现效果,标签要在线段上部显示 最终实现效果,标签要在线段上部显示 先上预览图: 进入MapWindow官网查询后,发现不生效 查看类图如下: 最后打各种断点调试后发现,应该如下设置: ILayer lineLayer = LayerHelper.getLayerByName(_context, MW...

leetone123的博客 482

ENSP实验一:防火墙基础配置

配置client(内网)、FTP Server(外网)的IP地址。进入防火墙,输入密码:默认为admin@123。

Carohuan的博客 1万+

从 ABAP 后端到 AEX,Local Integration Engine 下的 Business System 配置全景

本文围绕SAP PI AEX配置中ABAP后端系统与AEX的连接问题,梳理了关键概念和技术脉络。重点指出基于ABAP 6.20及更高版本的业务系统内置了本地集成引擎(Local Integration Engine),负责与AEX的消息交互。配置要点包括:1)在SM59中创建HTTP类型RFC目标连接AEX;2)配置SAP_PROXY_ESR供设计时代理生成;3)通过SXMB_ADM设置业务系统角色为应用系统;4)确保SLD注册和SICF服务激活。文章特别强调运行时代理消息传递与设计时代理生成的区分,以及H

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 99

MapWindow异常问题解决

COM组件失败 初次编译MapWindow5,总是碰到COM组件失败的问题,如下图所示: 异常内容为: System.TypeInitializationException HResult=0x80131534 Message=“MW5.Api.Static.MapConfig”的类型初始值设定项引发异常。 Source=MW5.Api ...

zymndsc_2012的专栏 1766

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mapwindow版本介绍

mapwindow是基于组件的开发模式。 mapwindow4.x(MapWindow GIS Application)是基于activeX(MapWinGIS ActiveX Control)开发的,而且mapwindow4.8是使用.net(C# vs2008+sp1)开发的,比较创意的是直接支持.net语言(c#)作用动态脚本。mapwindow有个.net的组件,叫dotSpatial,全...

weixin_34200628的博客 886

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MapWindow介绍

MapWindow介绍 官方网站:http://www.mapwindow.org/ 网站里包含了几个开源项目 目前最新版本是Mapwindow5,之前的mapwindow4版本已经停止更新,同时Mapwindow5底层是调用的c++编写的ActiveX组件MapwinGIS,都是开源的 Mapwindow4.X    h...

weixin_30316097的博客 1148

MapWindow6 随写

本来mapwindow4 已经能够实现基本的功能了。 可是加载中国地图,一个300多M的shp文件,绘制效率很低,很慢。 最大的一个shp文件800多M。 MapWindow4 很不给力。 于是便看了最新的MapWindow6,效率很高,也更容易。打开800多M的shp文件也显示也比较快MW6对比4的优缺点 Advantages over MapWindow 4.x ...

weixin_30520015的博客 576

如何用Mapwindow5运行MapWingis?

想使用mapwingis工具,没有代码基础 ,如何.如何用Mapwindow5运行MapWingis?

2301_80552649的博客 341

Mapwindow5代码BUG记录1

随手记录下发现的mapwindow5的bug,以前发现未记录,后期会偶尔记录一下,好记性不如烂笔头

ipqchase博客 425

MapWindow记录

MapWindow记录 增加MapWinGIS的新功能,编译完MapWinGIS,可以生成Debug和Release版本的x64和Win32四种版本, 自己基于c#的Mapwindow如果要用到新添加的功能,此时就得重新注册MapWinGIS, x64的MapWindow可以注册x64版本的Debug或者Release版本, 但是此时编译...

weixin_30919919的博客 281

mapwindow5 v5.4到v5.6更新内容

MapWindow5 v5.4到v5.6更新内容

ipqchase博客 808
上一篇: [转]Android应用中返回键的监听及处理
下一篇: 逆序对&归并排序:新斯诺克
weixin_30954607
博客等级 码龄11年 75粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值