ArcGis平台是一个价格相当高的商业平台,本来想通过ArcSDE进行开发,这样方便而且有保证。但是因为项目在初期阶段还未采购ArcGis平台,前期为了项目开发对于初学ArcEngine的偶,破解破的我头大,可以说费了九牛三虎之力。项目进行到数据处理阶段,前期的开发工作的数据源来自shp文件。现在需要用到数据库来提供数据源了,发现ArcSDE又要破解,又是狂乱的百度啊,问题是比ArcEngine还难破解,一怒之下果断放弃ArcSDE,寻找另外的解决方案。道路是艰难的,同样是面对大量的E文,在N个网页中被我找到了这篇文章:http://www.paolocorti.net/2008/06/06/spatial-database-for-postgres-and-arcgis-users-how-to-choose/ 写的相当不错(其实我也不能完全看明白)。
因为上面这个文章给了我很大的信心,于是开始研究zigGis, GDAL。传说中的zigGis相当牛,能直接将postgis中的GIS类型显示到ArcGis的控件中,但是呢最新的版本不支持我所开发项目的ArcGis版本,只能放弃重来了。终于在网络的海洋中找来找去被我看到了wkb/wkt这样一个概念,如果对GIS开发有经验的人可能早就知道应该这样做了。在postgis中提供很多函数将wkb转成它的geometry类型,同样也有将geometry转成binary的函数。当然更兴奋的是ArcGis中有针对标准wkb的转换,这样一来,可想而知,这个方案是行的通的。
第一步:从postgreSQL中通过postgis读取GIS数据显示在AxMapControl中
1. C# 连接数据库pg,这个不用多说,初学者在网上很容易找到。
要注意的是因为ArcEngine中对wkb的支持是byte[]之间的转换,所以在进行数据库取数据时用postgis的这个函数将GIS数据转成byte[],这样写 asbinary(the_geom)
2. 将得到的byte[](也就是wkb数据)通过ArcEngine的接口得到IGeometry,如下所示:
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin);
3. 将 IGeometry 显示在AxMapControl中。
我相信有了这个,就笑了,ArcEngine新建图层显示要素很简单的吧。
第二步:将上一步从pg中显示出来的GIS数据进行相应的修改后保存回pg中
1. 修改指定的要素后通过 geometry得到wkb
要对修改操作进行保存,就需要将指定的要素中的geometry再次转回wkb然后通过sql语句修改pg中的指定记录即可,思路很简单,问题在于拼接SQL字符串上面,因为arcengine通过geometry得到的仍然是一个byte[],这个东西是没办法拼到sql语句中的。
2. 用到的ArcEngine接口如下:
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
byte[] geoBytes = factory.CreateWkbVariantFromGeometry(geometry) as byte[];
3. 拼接SQL时要将上面的byte[]数组转码
其实postgis处理存到pg中的是一长串的16进制字符串,相信大家打开数据库能看到,要想拼接好SQL串就得这样来一下:geomfromwkb(decode('" + geoByteStr + "', 'hex'))其中的geoByteStr是byte[]转成16进制的字串
上面两步已走通,是完全可以实现的,这样做的话,数据表我们也能自行定义,操作GIS数据,属性等,更灵活。