Хранение поверхности GML в PostGIS

9

Я использую PostGIS 2.0.0 и хотел бы сохранить поверхность GML таким образом, чтобы можно было рассчитывать пересечения между этой поверхностью и различными точками и линиями. В моем случае у Surface будет один PolygonPatch без внутренних колец и внешнего кольца, которое может быть LineStringSegment, Geodesic, Arc или Circle. Расстояния могут составлять от десятков до сотен миль. Я вижу, что PostGIS имеет CIRCULARSTRINGи CURVEPOLYGON, кажется, хороший способ хранения Arc, за исключением того, что они не поддерживаются только geographyтипом geometry. Как лучше всего хранить это? (Я совершенно новичок в PostGIS и GIS в целом, поэтому вполне возможно, что я упускаю что-то очевидное.)

EM0
источник
Вы можете хранить GML в postgis как есть. postgis.refractions.net/documentation/manual-svn/...
Mapperz
Некоторое объяснение здесь о типах геометрии и географии PostGIS postgis.refractions.net/docs/…
canisrufus

Ответы:

4

ST_GeomFromGML

Вы можете сохранить свои объекты GML как тип данных PostGIS Geometry, используя функцию ST_GeomFromGML, которая преобразует ваш GML в тип данных геометрии. К вашему сведению: есть аналогичные функции для 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, потому что он принимает в типах данных геометрии.

Пожалуйста, добавьте РЕДАКТИРОВАТЬ к вашему первоначальному вопросу с образцом образца GML, с которым у вас есть проблемы, и я напишу заявления для вас.

CaptDragon
источник
Спасибо, но импорт из GML не является основной проблемой. Основной вопрос заключается в том, как хранить данные таким образом, чтобы обеспечить точные вычисления. Как я понимаю, тип геометрии не подходит для этого, поскольку он основан на плоскости, а тип географии не поддерживает кривые.
EM0
@EM: Проверьте мой EDIT # 1
CaptDragon
Спасибо, попробовал их, но, к сожалению, они не поддерживают CIRCULARSTRING.
EM0
@EM: Проверьте мой РЕДАКТИРОВАТЬ # 2
CaptDragon
Да, оператор для создания CIRCULARSTRING работает, но вычисления расстояния для этой строки используют плоскость, как я понимаю, потому что она имеет тип "геометрия". В любом случае, я собираюсь попытаться сохранить данные двумя способами - точное значение в виде CIRCULARSTRING (геометрия) и приблизительное значение (география), сгенерированное с использованием ST_CurveToLine.
EM0
2

В конце концов я отказался от хранения «точной» дуги или круга. При импорте дуги GML (которая определяется 3 точками на дуге) я временно создаю геометрию CIRCULARSTRING, а затем преобразую ее в географию, например так:

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

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

EM0
источник