ArcObjectsを使用してEsri GeometryとWKTを変換しますか?


17

ArcGIS ArcObjects APIには、ArcObjectsジオメトリをWell-Known Text表現に変換する(およびその逆)手段がないようです。私が見つけた唯一のことは、WKBへの変換(IWkbインターフェイス)です。

ジオメトリオブジェクトとWKT間の変換を実行する方法はありますか、それとも自分で実装する必要がありますか?私は主に、多くの外部依存関係のない.NET実装を目指しています。

回答:


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
カーク

ありがとうございました。私はおそらく自分で変換を実装することになりますが、既存のOSプロジェクトからのコードはいくつかの貴重な指針を提供するかもしれません。
ペトルクレブス

@JayCummins ZigGISリンクが無効になっています
バルバロッサ

@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_bytesにWKBが保存されています。次のステップに進み、SqlGeometryに移動してからWKTに移動する場合:

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

1
あなたのアプローチは私にとってはうまくいくように思えますが、sridここでの選択について疑問に思っています。私はこれを使用しました:int srid = feature.Shape.SpatialReference.FactoryCode;その実装に同意しますか?
-elrobis

2
Esriの事前定義された座標系のいずれかを使用している限り、これは機能します。ドキュメントには、「カスタム投影座標系を作成する場合、ファクトリコードはゼロです。」と記載されています。
SagebrushGIS

5

あなたは、参照してみてくださいMicrosoft.SqlServer.Types使用し、その後、(私は自由SQL ServerのExpressエディションに含まれて信じている)アセンブリをSTGeomFromWKBの 後、使用してWKTに変換することができ、マイクロソフトジオメトリ、作成するために、静的メソッドをSTAsTextを

また、Microsoftはプロプライエタリであることについて多くの欠点をキャッチしていますが、codeplexのSqlServer Spatial Toolsの多くの便利な機能にソースコードを提供しています。そのため、SqlServerTypesの外部依存性が大きすぎる場合、これを行うソースコードを見つけることができる場合があります。


おかげで、MsSqlビットを実装にドラッグしたくないのですが、ソースの一部は興味深いかもしれません。
ペトルクレブス

3

NTSはWKTを「話す」ことができ、WKBとWKTの両方のリーダーとライターがいます。したがって、WKBがある場合、NTSはそれを読み取り、WKTに書き込むことができます。

ただし、ArcObjectsジオメトリの属性を使用してNTSオブジェクトを作成し、WKTとして出力することもできます。

ArcObjectsプロジェクトの1つに対して、NTSがジオメトリを移動するためのユーティリティメソッドを作成しました(主にNTSが提供する代替投影方法を利用するため)。


ありがとう、NTSとGeoToolsは良さそうだ、実装でいくつかのビットを再利用するかもしれない。
ペトルクレブス

3

DNRGPS(ライセンスのオープンソースプロジェクトここでは)との間で変換するための拡張メソッドがあるIGeometryあなたが使用しないようにそれらを適応させる必要があるだろうが、とWKTをIObjectFactoryあなたがのArcGISアプリケーションの外にそれらを使用したい場合。

ライセンスはかなり寛容に見えるためIObjectFactory、誰かが興味を持っている場合は、GitHubにスタンドアロンバージョンを使用します(使用しません)。

更新:出力ジオメトリオブジェクトに空間参照を適用し、何も指定されていない場合は整数座標に適したデフォルトの空間参照(Plate Carree)を使用できるように、バージョンにいくつかの改善を加えました。


ありがとう、便利に見える。私は実際に自分のWKTパーサーを書くことになりました。ただし、ソースを開くことはできません。
ペトルクレブス

-2

GeometryBridgeをチェックしてください。役立つかもしれません。 http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000


WKT関連のメソッドは提供しません... WKSと混同している可能性があります。WKSはジオメトリの安全な表現です(スレッドセーフなどに役立ちます)。
ペトルクレブス


@Mapperz:そこも見ましたが、ジオメトリではなく、座標系と単位のWKT表現でのみ機能します
Petr Krebs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.