使用ArcObjects在Esri Geometry和WKT之间转换?


17

在ArcGIS ArcObjects API中,似乎无法将ArcObjects几何图形转换为知名文本表示(反之亦然)。我唯一能找到的就是转换为WKB(IWkb接口)。

有没有办法在几何对象和WKT之间执行转换,还是我必须自己实现?我的主要目标是实现.NET且无太多外部依赖。

Answers:


7

过去,我使用过Sharpmap的转换器,但是我必须先进入WKB。我不知道现在是否是最好的选择。

SharpMap.Geometries.IGeometry sharpGeom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse(geombytes);
wkt = SharpMap.Converters.WellKnownText.GeometryToWKT.Write(sharpGeom);

Github上的SharpMap

我也不知道当前的SharpMap存储库在哪里,但是我确实在这里找到了该类的引用:

当时,我想我在使用Codeplex的SharpMap。

我忘了ZigGIS。您也许可以在该代码上进行构建-此链接是较旧的Ziggis。我认为这是可行的aoPolygonToWkt,aoPointToWkt,aoPolylineToWkt方法:https//code.google.com/archive/p/ziggis/downloads


AFAIK Codeplex仍然具有最新的Sharpmap存储库。sharpmap.codeplex.com
Kirk Kuykendall 2010年

谢谢。我很可能最终会自己实现转换,但是现有OS项目中的代码可能会提供一些有价值的指针。
彼得·克雷布斯

@JayCummins ZigGIS链接已失效
Barbarossa

@Barbarossa,我知道-我正在寻找它。尽管我怀疑它已经退休了。
杰·康明斯

12

使用IWkb接口可以很好地完成IGeometry和WKB之间的转换。从WKB,您可以使用Microsoft.SqlServer.Types库将WKB转换为SqlGeometry,然后再转换回WKT。

IWkb wkb = geometry as (IWkb); //(Where geometry is an instance of IGeometry)
byte[] wkb_bytes = new byte[wkb.WkbSize];
int byte_count = wkb.WkbSize;
wkb.ExportToWkb(ref byte_count, out wkb_bytes[0]);

此时,您已将WKB存储在wkb_bytes中。如果要转到SqlGeometry然后转到WKT,请执行以下步骤:

SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(wkb_bytes), srid);
string wkt = sqlGeom.ToString();

1
您的方法对我来说似乎很好,但是我想知道我在srid这里的选择。我用了这个:int srid = feature.Shape.SpatialReference.FactoryCode;您是否同意该实现?
elrobis 2012年

2
只要您使用的是Esri的预定义坐标系之一,它就会起作用。文档指出以下内容:“如果创建自定义投影坐标系,则工厂代码为零。”
SagebrushGIS

5

您可以尝试引用Microsoft.SqlServer.Types程序集(我相信它包含在免费的Sql Server Express版本中),然后使用STGeomFromWKB 静态方法创建一个Microsoft几何,然后可以使用STAsText将其转换为WKT 。

还应注意,尽管Microsoft在专有性方面有很多缺点,但他们确实在Codeplex 的SqlServer Spatial Tools中为许多有用的功能提供了源代码。因此,如果SqlServerTypes对您来说过多的外部依赖关系,您也许可以找到执行此操作的源代码。


谢谢,我不想将任何MsSql位拖到我的实现中,但是其中一些源可能很有趣。
彼得·克雷布斯

3

NTS可以“说” WKT,并且具有WKB和WKT的读者和作家。因此,如果您有WKB,NTS可以读取并写入WKT。

但是,您也可以通过使用ArcObjects几何的属性来创建NTS对象,然后将其输出为WKT。

对于我们的ArcObjects项目之一,我们为NTS创建了实用程序方法来移动几何图形(主要是利用NTS提供的替代投影方法)。


谢谢,NTS和GeoTools看起来不错,我可能会在实现中重用一些内容。
彼得·克雷布斯

3

DNRGPS开放源代码项目(牌这里)有扩展方法之间的转换IGeometry和高铁总站,但你必须去适应他们不要使用IObjectFactory,如果你想使用它们的ArcGIS应用程序之外。

该许可看起来很宽松,因此IObjectFactory如果有人感兴趣,我将其独立版本(不使用)放到GitHub上:

更新:我对我的版本进行了一些改进,以支持为输出几何对象应用空间参考,并且如果未指定,则使用整数坐标友好的默认空间参考(Plate Carree)。


谢谢,看起来很有用。我实际上最终编写了自己的WKT解析器。但是,无法将其开源。
Petr Krebs

-2

它不提供任何与WKT相关的方法...您可能将其与WKS混淆,后者是几何的安全表示形式(对于线程安全等有用)。
彼得·克雷布斯


@Mapperz:也在那里看,但仅适用于坐标系和单位的WKT表示,不适用于几何图形
Petr Krebs 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.