Перетворення між Esri Geometry та WKT за допомогою ArcObjects?


17

Схоже, у API ArcGIS ArcObjects немає засобів перетворення геометрії 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 все ще має найсучасніший сховище різких мап. sharmap.codeplex.com
Кірк Куйкендалл

Дякую. Я, швидше за все, в кінцевому підсумку здійснюватимуть конверсію самостійно, але код із існуючих проектів ОС може дати деякі цінні вказівки.
Петро Кребс

@JayCummins Посилання ZigGIS мертве
Barbarossa

@Barbarossa, я знаю - я намагаюся його знайти. Хоча я підозрюю, що це пенсія.
Jay Cummins

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

2
Поки ви використовуєте одну з попередньо визначених систем координат Esri, це буде працювати. Документація відзначає наступне "Якщо ви створюєте власну проектовану систему координат, заводський код дорівнює нулю."
SagebrushGIS

5

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

Також зауважте, що в той час, як Microsoft ловить багато проблем щодо власності, вони пропонують вихідний код для багатьох корисних функцій у своїх просторових інструментах SqlServer у кодеплексі . Отже, якщо SqlServerTypes занадто велика зовнішня залежність для вас, ви можете знайти вихідний код, який це робить.


Дякую, я б не перетягував жодних бітів MsSql у свою реалізацію, але деякі джерела можуть бути цікавими.
Петро Кребс

3

НТС може "говорити" WKT і має читачів і авторів як для WKB, так і для WKT. Отже, якщо у вас є WKB, NTS може це прочитати і написати в WKT.

Однак ви також можете створити об'єкти NTS, використовуючи атрибути геометрії ArcObjects, а потім вивести їх як WKT.

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


Дякую, NTS та GeoTools виглядає добре, я можу використати кілька бітів у своїй реалізації.
Петро Кребс

3

Проект з відкритим кодом DNRGPS (ліцензування тут ) має методи розширення для перетворення між IGeometryWKT і, хоча вам доведеться адаптувати їх до використання, 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, що є безпечним поданням геометрії (корисно для безпеки потоку тощо).
Петро Кребс


@Mapperz: там теж заглянув, але працює лише для представлення WKT систем координат і одиниць, а не для геометрій
Петро Кребс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.