在PostGIS中存储GML表面


9

我正在使用PostGIS 2.0.0,并希望以一种允许计算该曲面与各种点和线之间的交点的方式存储GML曲面。在我的情况下,Surface将具有一个没有内环的PolygonPatch和一个外环,外环可以是LineStringSegment,Geodesic,Arc或Circle。距离可以在几十到数百英里的数量级。我看到PostGIS具有CIRCULARSTRINGCURVEPOLYGON,这似乎是存储Arc的一种好方法,只是geography类型不支持它们geometry。最好的存储方式是什么?(我一般对PostGIS和GIS还是陌生的,所以很可能我遗漏了一些明显的东西。)


您可以按原样在Postgis中存储GML。postgis.refractions.net/documentation/manual-svn/…–
Mapperz

这里关于PostGIS的几何和地理类型的一些解释postgis.refractions.net/docs/...
canisrufus

Answers:


4

ST_GeomFromGML

您可以使用ST_GeomFromGML函数将GML功能存储为PostGIS Geometry数据类型,该功能会将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中进行所有有趣的相交和操作

然后,您可以使用ST_AsGML以GML格式回吐出结果

编辑#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 将EDIT添加到您的原始问题中,我将为您写出声明。


谢谢,但是从GML导入并不是真正的核心问题。主要问题是如何以允许精确计算的方式存储数据。据我了解,几何类型不适用于此,因为它基于平面,并且地理类型不支持曲线。
EM0

@EM:检查我的EDIT#1
CaptDragon 2011年

谢谢,尝试过这些,但是很遗憾,它们不支持CICCULARSTRING。
EM0

@EM:检查我的编辑#2
CaptDragon 2011年

是的,创建CIRCULARSTRING的语句是可行的,但是据我所知,对该字符串的距离计算使用的是平面,因为它的类型为“几何”。无论如何,我将尝试以两种方式存储数据-精确值CIRCULARSTRING(几何)和使用ST_CurveToLine生成的近似值(地理)。
EM0

2

最后,我放弃了存储“精确的”弧或圆。导入GML弧(由弧上的3个点定义)时,我会临时创建一个几何CIRCULARSTRING,然后将其转换为地理,如下所示:

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

导入GML ArcByCenterPoint(由中心点,半径以及起点和终点角度定义)时,我通过从起点角度到终点角度以1度间隔投影点来直接近似它。这是在一个球体上完成的,而不是球体上的,因此它并不完全准确,但是有PostGIS票证可以为该地理类型实现方位角点投影。一圈也一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.