Зберігання поверхні GML у PostGIS


9

Я використовую PostGIS 2.0.0 і хотів би зберігати поверхню GML таким чином, що дозволяє обчислити перетини між цією поверхнею та різними точками та лініями. У моєму випадку поверхня матиме один PolygonPatch без внутрішніх кілець та зовнішнє кільце, яке може бути LineStringSegment, геодезикою, дугою чи колом. Відстані можуть бути в порядку десятків до сотень миль. Я бачу, що у PostGIS є CIRCULARSTRINGі CURVEPOLYGON, що здається, хороший спосіб зберігання дуги, за винятком того, що вони не підтримуються лише geographyтипом geometry. Який найкращий спосіб зберігати це? (Я взагалі новачок у PostGIS та GIS взагалі, тому цілком можливо, я пропускаю щось очевидне.)


Ви можете зберігати GML у postgis, як є. postgis.refractions.net/documentation/manual-svn/…
Mapperz

Деякі пояснення тут щодо геометрії та географії PostGIS postgis.refractions.net/docs/…
canisrufus

Відповіді:


4

ST_GeomFromGML

Ви можете зберігати свої функції GML як тип даних PostGIS Geometry, використовуючи функцію ST_GeomFromGML, яка перетворить ваш GML у тип даних геометрії. FYI: Існують подібні функції для KML, WKT тощо.

просто зробити щось на кшталт:

INSERT into myTable (mygeomField) values (ST_GeomFromGML('
    <gml:LineString srsName="EPSG:4269">
        <gml:coordinates>
            -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932
        </gml:coordinates>
    </gml:LineString>'));

Після того, як ви знайдете його в полі геометрії, ви зможете робити всі цікаві перехрестя та речі, які ви хочете робити в PostGIS

Потім ви можете виплюнути результат у форматі GML за допомогою ST_AsGML

РЕДАКЦІЯ №1. Я вважаю, що ви шукаєте:

http://postgis.net/docs/ST_Distance_Sphere.html

http://postgis.net/docs/ST_Distance_Spheroid.html

ЗРІД №2

Я використовую "POSTGIS =" 1.5.2 "(старіша версія, ніж ви), і наступне твердження працює чудово:

select ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')

Вам потрібно використовувати комбінацію функцій, щоб отримати те, що вам потрібно.

distance_spheroid не підтримує CIRCULARSTRING, оскільки він займає геометричні типи даних.

Будь ласка, додайте EDIT до свого початкового запитання з фрагментом зразка GML, з яким у вас виникли проблеми, і я випишу для вас заяви.


Дякую, але імпорт із GML насправді не є основною проблемою. Основне питання полягає в тому, як зберігати дані таким чином, що дозволяє точні розрахунки. Як я розумію, тип геометрії не спрацював би для цього, оскільки він заснований на площині, а тип географії не підтримує кривих.
EM0

@EM: Перевір мою
редакцію

Дякую, спробував це, але, на жаль, вони не підтримують CIRCULARSTRING.
EM0

@EM: Перевір мою
редакцію

Так, оператор створення CIRCULARSTRING працює, але для обчислення відстані на цій рядку використовується площина, наскільки я розумію, тому що вона має тип "геометрія". У будь-якому разі, я спробую зберегти дані двома способами - точне значення як CIRCULARSTRING (геометрія) та приблизне значення (географія), створене за допомогою ST_CurveToLine.
EM0

2

Врешті-решт я відмовився від зберігання «точної» дуги чи кола. При імпорті дуги GML (яка визначається 3 дугою на дузі) я тимчасово створюю геометрію CIRCULARSTRING, а потім перетворюю її в географію, наприклад:

ST_RemoveRepeatedPoints(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(...)', 4326)))::geography

Під час імпорту GML ArcByCenterPoint (який визначається центральною точкою, радіусом та кутом початку та кінця) я наближаю його безпосередньо, проектуючи точки з інтервалом 1 градуса від кута початку до кінця кута. Це робиться на кулі, а не на сфероїді, тому це не зовсім точно, але є квитки PostGIS для реалізації азимуту та точкової проекції для типу географії. Те саме для кола.

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