C#调用Geos的C函数接口进行空间拓扑操作

最近做实验需要用的Geos库做空间拓扑操作,但是前期的代码都是C#写的,而Geos库是使用C++实现的。在网上找了找,可能是本人搜索水平有限,没找到参考样例,所以自己做了些尝试,主要还是C#调用C++动态库的过程。在这里把实验代码贴出来方便自己以后看。水平有限,欢迎各路大神指点。

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Runtime.InteropServices;  
      
    namespace GeosUsingCSharp  
    {   
        class Program  
        {  
      
            //Geos的C接口要求先调用初始化函数initGEOS()  
            //initGEOS函数的参数是两个函数指针所以在后面定义了委托(没有测试不用委托行不行)  
            [DllImport("geos_c.dll", CallingConvention = CallingConvention.Cdecl)]  
            extern public static void initGEOS(GEOSMessageHandler noticefuction,  
                GEOSMessageHandler errorfunction);  
      
            //GEOSGeomFromWKT从WKT字符串返回指向几何对象的指针  
            [DllImport("geos_c.dll", CallingConvention = CallingConvention.Cdecl)]  
            extern public static IntPtr GEOSGeomFromWKT(string wkt);  
      
            //GEOSContains检查两个对象的包含关系  
            [DllImport("geos_c.dll", CallingConvention = CallingConvention.Cdecl)]  
            extern public static char GEOSContains(IntPtr g1,IntPtr g2);  
      
            //用于初始化函数的委托  
            public delegate void GEOSMessageHandler(string[] epsilon);  
            public static void notice1(string[] epsilon)  
            {  
                return ;  
            }  
            public static void notice2(string[] epsilon)  
            {  
                return ;  
            }  
      
            static void Main(string[] args)  
            {  
                 
                GEOSMessageHandler n1 = new GEOSMessageHandler(notice1);  
                GEOSMessageHandler n2 = new GEOSMessageHandler(notice2);  
                              
                initGEOS(n1, n2);               //初始化  
                string Geo1WkT="POINT(0 0)";    //点的WKT字符串  
                string Geo2WKT = "POLYGON((-1 -1,-1 1,1 1,1 -1,-1 -1))";//多边形的WKT字符串  
      
                IntPtr geo1 = GEOSGeomFromWKT(Geo1WkT); //建立点对象  
                IntPtr geo2 = GEOSGeomFromWKT(Geo2WKT); //建立多边形对象  
      
                int result = (int)GEOSContains(geo2, geo1);//返回结果2 on exception, 1 on true, 0 on false  
      
                Console.WriteLine(result.ToString());      //上面的多边形应该是包含点的,所以预期结果1              
                Console.ReadKey();  
            }  
        }  
    }  

最后结果:


转载:http://blog.csdn.net/xxdearbear/article/details/38734829

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值