我有一些代码(来自 GeoNetwork)需要将地理标记语言(在 XML 中)转换为 GeoJSON。我目前正在尝试添加功能以读取从 posList 形成的多边形,但我很难概念化/起草我需要做的事情。
“输入”基本上是一个由一堆坐标组成的字符串。所以它可能看起来像这样
<gml:LinearRing gml:id="p21" srsName="http://www.opengis.net/def/crs/EPSG/0/4326">
<gml:posList srsDimension="2">45.67 88.56 55.56 88.56 55.56 89.44 45.67 89.44</gml:posList>
</gml:LinearRing >
(借自维基百科的样本)。我可以使用类似的东西在 XSLT 中将其分块
<xsl:variable name="temp" as="xs:string*" select="tokenize(gml:LinearRing/gml:posList))" '\s'/>
这应该给我Temp =
('45.67', '88.56', '55.56', '88.56', '55.56', '89.44', '45.67', '89.44')
问题 1:GeoJSON 想要 WGS 84 (EPSG 4326) 和 (long, lat) 顺序中的所有内容 - 但严格遵守 WGS 84 规则(我希望 gml 遵循)意味着坐标是 (lat, long) 顺序 - 所以该列表需要重新排序。(我认为 - 这仍然让我很困惑)
问题 2:GeoJSON 想要坐标对,但我只有一个坐标列表。
我目前的想法是做这样的事情:
<geom>
<xsl:text>{"type": "Polygon",</xsl:text>
<xsl:text>"coordinates": [
[</xsl:text>
<xsl:variable name="temp" as="xs:string*" select="tokenize(gml:LinearRing/gml:posList))" '\s'/>
<xsl:for-each select="$temp">
<xsl:if test="position() mod 2 = 0">
<xsl:value-of select="concat('[', $saved, ', ', ., ']')" separator=","/>
</xsl:if>
<xsl:variable name="saved" value="."/>
</xsl:for-each>
<xsl:text>]
]
}</xsl:text>
</geom>
但我不确定 XSL 是否会让我不断地编写这样的变量,以及是否有更好/更有效的解决方案来解决这个问题。(我在 MATLAB 方面有很多经验,我会使用 for 循环快速解决这个问题,如果不是有效的话)
理想情况下,我会得到类似于
<geom>
{"type": "Polygon",
"coordinates": [
[
[88.56, 45.67],
[88.56, 55.56],
[89.44, 55.56],
[89.44, 45.67]
]
]
}
</geom>
(我认为,要弄清楚多边形是右手还是左手,还有一整套其他的蠕虫罐头)