У меня есть код (из 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) и в порядке (долгота, широта), но строгое соблюдение правил WGS 84 (которым, как я ожидаю, следует gml) означает, что координаты находятся в порядке (широта, долгота) - поэтому список нужно переупорядочить. (Я думаю - это меня все еще очень смущает)
Проблема 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>
(Я думаю, что есть еще целая куча червей, чтобы выяснить, является ли многоугольник правым или левым, я думаю)