Преобразование между Esri Geometry и WKT с использованием ArcObjects?

17

Похоже, что в ArcGIS ArcObjects API нет средств для преобразования геометрии ArcObjects в представление «Хорошо известный текст» (и наоборот). Единственное, что мне удалось найти, - это преобразование в WKB (интерфейс IWkb).

Есть ли способ выполнить преобразование между геометрическими объектами и WKT, или я должен реализовать это сам? Я в первую очередь стремлюсь к реализации .NET без особых внешних зависимостей.

Петр Кребс
источник

Ответы:

7

В прошлом я использовал конвертер Sharpmap, но сначала мне нужно было попасть в WKB. Я не знаю, является ли это лучшим вариантом сейчас.

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

SharpMap на Github

Я также не знаю, где находится текущий репозиторий SharpMap, но я нашел ссылку на класс здесь:

В то время, я думаю, я использовал SharpMap от Codeplex.

Я забыл о ZigGIS. Вы могли бы быть в состоянии построить на этом коде - эта ссылка - более старый зиггис. Я думаю, что это методы aoPolygonToWkt, aoPointToWkt, aoPolylineToWkt, которые будут работать: https://code.google.com/archive/p/ziggis/downloads

Джей Камминс
источник
AFAIK codeplex по-прежнему имеет самый актуальный репозиторий sharpmap. sharpmap.codeplex.com
Кирк Кайкендалл
Спасибо. Я, скорее всего, в конечном итоге осуществлю преобразование самостоятельно, но код из существующих проектов ОС может дать некоторые ценные указатели.
Петр Кребс
@JayCummins Ссылка ZigGIS мертва
Барбаросса
@ Барбаросса, я знаю - я пытаюсь найти это. Хотя я подозреваю, что он на пенсии.
Джей Камминс
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();
SagebrushGIS
источник
1
Ваш подход, кажется, работает хорошо для меня, но я задаюсь вопросом о моем выборе sridздесь. Я использовал это: int srid = feature.Shape.SpatialReference.FactoryCode;вы согласны с этой реализацией?
elrobis
2
Пока вы используете одну из предопределенных систем координат Esri, это будет работать. В документации отмечается следующее: «Если вы создаете спроецированную систему координат, заводской код равен нулю».
SagebrushGIS
5

Вы можете попробовать сослаться на сборку Microsoft.SqlServer.Types (которая, как мне кажется, включена в бесплатную версию Sql Server Express), а затем использовать статический метод STGeomFromWKB для создания геометрии microsoft, которую затем можно преобразовать в WKT с помощью STAsText .

Также обратите внимание на то, что, хотя Microsoft понимает, что является частной компанией, они предлагают исходный код для множества полезных функций в своих пространственных инструментах SqlServer в codeplex. Поэтому, если для SqlServerTypes слишком много внешних зависимостей, вы можете найти исходный код, который это делает.

Кирк Куйкендалл
источник
Спасибо, я бы не хотел перетаскивать биты MsSql в мою реализацию, но некоторые источники могут быть интересны.
Петр Кребс
3

NTS может «говорить» на WKT и имеет читателей и писателей как для WKB, так и для WKT. Так что если у вас есть WKB, NTS может прочитать это и написать в WKT.

Однако вы также можете создавать объекты NTS, используя атрибуты геометрии ArcObjects, а затем выводить их как WKT.

Для одного из наших проектов ArcObjects мы создали служебные методы для NTS для перемещения геометрии (в основном, для использования альтернативных методов проекции, предлагаемых NTS).

mwalker
источник
Спасибо, NTS и GeoTools выглядят хорошо, я мог бы использовать некоторые биты в моей реализации.
Петр Кребс
3

Проект с открытым исходным кодом DNRGPS ( здесь лицензирование ) имеет методы расширения для преобразования между IGeometryWKT, но вам придется адаптировать их, чтобы они не использовались, IObjectFactoryесли вы хотите использовать их вне приложения ArcGIS.

Лицензия выглядит довольно разрешительной, поэтому я поместил ее автономную версию (не использует IObjectFactory) на GitHub, если кому-то было интересно:

Обновление: я внес несколько улучшений в мою версию, чтобы поддержать применение пространственных привязок для объектов выходной геометрии и использование целочисленной координатной привязки по умолчанию (Plate Carree), если она не указана.

blah238
источник
Спасибо, смотри полезно. Я фактически закончил тем, что написал свой собственный анализатор WKT. Не могу открыть его, хотя.
Петр Кребс
-2

Проверьте GeometryBridge, он может быть в состоянии помочь вам. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000039n000000

Патрик
источник
Он не предоставляет никаких методов, связанных с WKT ... Возможно, вы путаете его с WKS, который является безопасным представлением геометрии (полезно для безопасности потоков и тому подобное).
Петр Кребс
@Mapperz: тоже там смотрел, но работает только для WKT представлений систем координат и единиц, а не геометрий
Петр Кребс