热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转一篇文章,以便在后续文章中讲解——开源gis项目Mitab在C#中的使用方法

Yush我一直是用MapX写的写MapInfo公司Tab格式的文件,但是由于涉及到大量的图元绘制,MapX的绘制速度是受到限制的,其绘制的速度并不快,于是探索是不是有比他更好的组件。前段

Yush

我一直是用MapX写的写MapInfo公司Tab格式的文件,但是由于涉及到大量的图元绘制,MapX的绘制速度是受到限制的,其绘制的速度并不快,于是探索是不是有比他更好的组件。前段时间曾经用过ShapeLib来绘制shp文件,其绘制的速度还是相当可以的,有兴趣的话可以搜搜,其提供的开源包中有实例程序,怎么来用。

而我今天要介绍的这个Mitab开源包中,并没有提供可以直接运行能看到效果的实例Demo,于是我开始了解如果在dot net程序中使用他。

Mitab开源项目是采用C++编写的库,其编译了mitab.dll文件,我们用他的功能也主要从这个dll中调用功能。但不是单纯的添加引用或者添加一个这个dll为控件能解决问题的,要用好这个dll,不得不继续分析他的开源包,在MiApi.cs文件中,有很多的[DllImport("mitab.dll")]语句,于是我明白了如何应用,下面来介绍他的应用步骤。

第一步:新建一个C#桌面应用程序;

第二步:添加开源库中的MiApi.csMiWrapper.cs两个类到程序中。

第三步:拷贝mitab.dll到程序的.exe的目录中,因为[DllImport("mitab.dll")]就是要查找系统运行的目录中是否存在这个dll文件,所以一定要拷贝。

第四步:写生成Tab文件的函数,调用MiApi.cs中函数。具体如何应用这些函数,请参考开源包中的mitab_vb_test.vb这个文件。

第五步:运行程序,生成Tab,搞定。

附我写的一个demo实例代码。

      public void testWritefile()
{
WriteFile("D://11//testtab.tab", "tab");
}

private void WriteFile(string pszDest, string pszMifOrTab)
{
long dataset;

long feature;
double[] x = new double[100];
double[] y = new double[100];
long field_index;
string sTmp;
long i1;
long i2;

dataset = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_create(pszDest, pszMifOrTab, "CoordSys Earth Projection 1, 0", 90, 0, 180, -180);

if (dataset == 0)
{
sTmp = "";
sTmp = EBop.MapObjects.MapInfo.MiApi.mitab_c_getlasterrormsg();
MessageBox.Show("Failed to create " + pszMifOrTab + " file: " + sTmp);
return;
}

/* -------------------------------------------------------------------- */
/* Add a text, float and integer field. */
/* -------------------------------------------------------------------- */
field_index = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_add_field((System.IntPtr)dataset, "TestInt", 2, 8, 0, 0, 0);
field_index = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_add_field((System.IntPtr)dataset, "TestFloat", 5, 12, 2, 0, 0);
field_index = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_add_field((System.IntPtr)dataset, "TestString", 1, 10, 0, 0, 0);



/* -------------------------------------------------------------------- */
/* Write a point. */
/* -------------------------------------------------------------------- */
feature = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_create_feature((System.IntPtr)dataset, 1);

x[0] = 98;
y[0] = 50;

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_points((System.IntPtr)feature, 0, 1, ref x[0], ref y[0]);
i1 = 256;
i2 = 255;
i1 = i1 * i2;
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_symbol((System.IntPtr)feature, 41, 15, (int)i1);
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_field((System.IntPtr)feature, 0, "100");
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_field((System.IntPtr)feature, 1, "100.5");
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_field((System.IntPtr)feature, 2, "12345678901234567890");
EBop.MapObjects.MapInfo.MiApi.mitab_c_write_feature((System.IntPtr)dataset, (System.IntPtr)feature);
EBop.MapObjects.MapInfo.MiApi.mitab_c_destroy_feature((System.IntPtr)feature);


/* -------------------------------------------------------------------- */
/* Write a MultiPoint. */
/* -------------------------------------------------------------------- */
feature = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_create_feature((System.IntPtr)dataset, 10);

x[0] = 90;
y[0] = 51;
x[1] = 90.5;
y[1] = 51.5;
x[2] = 91;
y[2] = 52;

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_points((System.IntPtr)feature, 0, 3, ref x[0], ref y[0]);
i1 = 256;
i2 = 255;
i1 = i1 * i2;
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_symbol((System.IntPtr)feature, 41, 15, (int)i1);
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_field((System.IntPtr)feature, 0, "100");
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_field((System.IntPtr)feature, 1, "100.5");
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_field((System.IntPtr)feature, 2, "12345678901234567890");
EBop.MapObjects.MapInfo.MiApi.mitab_c_write_feature((System.IntPtr)dataset, (System.IntPtr)feature);
EBop.MapObjects.MapInfo.MiApi.mitab_c_destroy_feature((System.IntPtr)feature);

/* -------------------------------------------------------------------- */
/* Write a line. */
/* -------------------------------------------------------------------- */
feature = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_create_feature((System.IntPtr)dataset, 5);

x[0] = 100;
y[0] = 49;
x[1] = 101;
y[1] = 48;

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_points((System.IntPtr)feature, 0, 2, ref x[0], ref y[0]);
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_pen((System.IntPtr)feature, 1, 2, 255);
EBop.MapObjects.MapInfo.MiApi.mitab_c_write_feature((System.IntPtr)dataset, (System.IntPtr)feature);
EBop.MapObjects.MapInfo.MiApi.mitab_c_destroy_feature((System.IntPtr)feature);


/* -------------------------------------------------------------------- */
/* Write text. */
/* -------------------------------------------------------------------- */
feature = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_create_feature((System.IntPtr)dataset, 4);

x[0] = 101;
y[0] = 51;

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_points((System.IntPtr)feature, 0, 1, ref x[0], ref y[0]);
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_text((System.IntPtr)feature, "My text");
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_font((System.IntPtr)feature, "Arial");
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_text_display((System.IntPtr)feature, 45, 1, 7, 255 * 65536, 0, -1, -1, -1);
EBop.MapObjects.MapInfo.MiApi.mitab_c_write_feature((System.IntPtr)dataset, (System.IntPtr)feature);
EBop.MapObjects.MapInfo.MiApi.mitab_c_destroy_feature((System.IntPtr)feature);


/* -------------------------------------------------------------------- */
/* Write region (polygon). */
/* -------------------------------------------------------------------- */
feature = (long)EBop.MapObjects.MapInfo.MiApi.mitab_c_create_feature((System.IntPtr)dataset, 7);

x[0] = 101;
y[0] = 51;
x[1] = 100;
y[1] = 51;
x[2] = 100;
y[2] = 50;
x[3] = 101;
y[3] = 50;
x[4] = 101;
y[4] = 51;

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_points((System.IntPtr)feature, 0, 5, ref x[0], ref y[0]);

x[0] = 100.5;
y[0] = 50.5;
x[1] = 100.5;
y[1] = 50.7;
x[2] = 100.7;
y[2] = 50.7;
x[3] = 100.7;
y[3] = 50.5;
x[4] = 100.5;
y[4] = 50.5;

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_points((System.IntPtr)feature, 1, 5, ref x[0], ref y[0]);

EBop.MapObjects.MapInfo.MiApi.mitab_c_set_brush((System.IntPtr)feature, 255, 0, 2, 0);
EBop.MapObjects.MapInfo.MiApi.mitab_c_set_pen((System.IntPtr)feature, 1, 2, 65535);
EBop.MapObjects.MapInfo.MiApi.mitab_c_write_feature((System.IntPtr)dataset, (System.IntPtr)feature);
EBop.MapObjects.MapInfo.MiApi.mitab_c_destroy_feature((System.IntPtr)feature);
/* -------------------------------------------------------------------- */
/* Cleanup */
/* -------------------------------------------------------------------- */
EBop.MapObjects.MapInfo.MiApi.mitab_c_close((System.IntPtr)dataset);

if (EBop.MapObjects.MapInfo.MiApi.mitab_c_getlasterrorno() != 0)
{
sTmp = EBop.MapObjects.MapInfo.MiApi.mitab_c_getlasterrormsg();
//i1 = mitab_c_getlasterrormsg_vb(sTmp, 255);
MessageBox.Show("Last Error: " + sTmp);
}
}



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
勿泊心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有