Импорт XML INSPIRE ГИС Уровень данных - PullRequest
0 голосов
/ 20 декабря 2018

У меня очень специфическая проблема импорта данных, и я довольно плохо знаком с наборами данных XML, поэтому мои проблемы, вероятно, связаны с моим отсутствием понимания.Я хотел бы прочитать в немецкой сети треков от Deutsche Bahn, которая опубликована здесь: http://data.deutschebahn.com/dataset/data-streckennetz (ссылка в Германии, к сожалению)

Это будет прямая ссылка: http://download -data.deutschebahn.com / static / datasets / streckennetz / INSPIRE_0618.zip

Существует также ссылка на 200-страничный документ о наборе данных INSPIRE, но это не очень помогает мнепонять синтаксический анализ документа XML.https://inspire.ec.europa.eu/documents/Data_Specifications/INSPIRE_DataSpecification_TN_v3.0.pdf

В предыдущем вопросе я получил ответ о том, как читать по слоям, используя пакет sf

sf::st_layers("./DB-Netz_INSPIRE_20171116.xml")
nodes <- sf::st_read("./DB-Netz_INSPIRE_20171116.xml","RailwayNode")

, который работал для всех слоевно один "RailwayLinkSequence"

Link_Sequence<- sf::st_read("./DB-Netz_INSPIRE_20171116.xml","RailwayLinkSequence")

, который возвращает

Reading layer `RailwayLinkSequence' from data source `J:\Auswertungen Daten\R Beispiele\GIS\10 Data\DB_Inspire_XML_2015\DB-Netz_INSPIRE_20171116.xml' using driver `GML'
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 1, 6, 5, 28, 99, 2, 19, 41, 11, 3, 65, 7, 4, 22, 20, 17, 38, 9, 15, 8, 13, 24, 49, 14, 42, 36, 51, 31, 12, 25, 60, 10, 18, 48, 104, 53, 23, 16, 26, 32, 119, 40, 47, 37, 21, 44, 39, 43, 52, 46, 27, 30, 63, 81, 54, 61, 59, 34, 35, 45, 56, 108, 64, 62, 68, 67, 57, 80, 55, 29, 123, 88, 85, 33, 50, 96, 66, 79, 115
In addition: Warning message:
no simple feature geometries present: returning a data.frame or tbl_df 

У кого-нибудь есть подсказка, почему этот слой не может быть прочитан с st_read?

1 Ответ

0 голосов
/ 21 декабря 2018

Используйте пакет xml2:

> library(xml2)

Прочитайте файл:

> x=  read_xml("./DB-Netz_INSPIRE_20171116.xml")

Найдите все RLS в пространстве имен по умолчанию (d1):

> f = xml_find_all(x, ".//d1:RailwayLinkSequence")

Посмотрите на одного из них:

> f[123]
{xml_nodeset (1)}
[1] <RailwayLinkSequence gml:id="LSeq-1829209">\n  <gml:identifier codeSpace= ...

Сколько их?

> length(f)
[1] 7072

Какое значение localId для 123-го RLS?

> xml_find_all(f[123], ".//base:localId")
{xml_nodeset (1)}
[1] <base:localId>LSeq-1829209</base:localId>

Что представляют собой объекты DirectedLink, содержащиеся в этом RLS:

> xml_find_all(f[123], ".//net:DirectedLink")
{xml_nodeset (36)}
 [1] <net:DirectedLink>\n  <net:direction>+</net:direction>\n  <net:link xlin ...
 [2] <net:DirectedLink>\n  <net:direction>+</net:direction>\n  <net:link xlin ...
 [3] <net:DirectedLink>\n  <net:direction>+</net:direction>\n  <net:link xlin ...
 [4] <net:DirectedLink>\n  <net:direction>+</net:direction>\n  <net:link xlin ...
 [5] <net:DirectedLink>\n  <net:direction>+</net:direction>\n  <net:link xlin ...
 [...]

Узнайте больше о синтаксическом анализе XML с помощью xml2, и вам нужно будет решить, как извлечь части, необходимые для вашегособственные цели.Но я надеюсь, что это поможет.

...