Я немного новичок в этом предмете, поэтому несите меня;Обследование боевых действий Parse SPARQL GET в R
Я обращаюсь к Ordnance Survey SPARQL Endpoint за их данные RDF из R. У меня возникла проблема с анализом возвращаемого атрибута геометрии GML.
Мой запрос SPARQL (для этого, например,) возвращает геометрию Южного избирательного округа Эдинбурга с несколькими атрибутами (имя, код и URI);
require(SPARQL)
require(XML)
endpoint <- "http://data.ordnancesurvey.co.uk/datasets/os-linked-data/apis/sparql"
query <- paste0(
"PREFIX geom: <http://data.ordnancesurvey.co.uk/ontology/geometry/>
PREFIX geog: <http://data.ordnancesurvey.co.uk/ontology/admingeo/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?WestminsterConstituencyName ?gssCode ?uri ?g
WHERE
{
?uri a geog:WestminsterConstituency;
skos:prefLabel ?WestminsterConstituencyName;
geog:gssCode ?gssCode;
geom:extent ?geom .
?geom geom:asGML ?g.
}
HAVING(?WestminsterConstituencyName=\"Edinburgh South\")")
В R, я хочу извлечь и отобразить эти результаты в листовке. В настоящее время у меня есть два способа получения результатов из вышеприведенного запроса;
Использование запроса GET через пакет httr и создание данных XML;
packs <- c("sp","stringr","rgdal","leaflet","gsubfn","XML","SPARQL","plyr","RColorBrewer","utils","httr") lapply(packs, require, character.only = TRUE) #format the request properly to return XML request <- paste0("http://data.ordnancesurvey.co.uk/datasets/os-linked-data/apis/sparql?query=",URLencode(query, reserved = TRUE),"&output=xml") #GET request from the endpoint and parse to XML data <- GET(request) data.xml <- xmlParse(content(data,"text"))
Использование пакета SPARQL для возврата dataframe;
# set endpoint URL and pass query to it, just keeping the results qd <- SPARQL(endpoint,query)$results
При использовании любого метода, геометрия возвращается (либо в качестве переменной XML или столбца dataframe) имеют все тэги GML:
"<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>LONG LIST OF COORDINATE PAIRS</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>
При использовании метода № 2, я могу выполнять следующее обходное решение для создания многоугольника, но оно кажется очень уродливым;
# BNG proj4 string
BNG <- "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs"
# extract data to attach to SpatialPolygonDataFrame later
data <- qd[,!(colnames(qd) == "g")]
# extract geometry part of results
geom <- qd[,"g"]
# use various gsub and split functions to create a dataframe of X and Y
geom.sub <- sub(".*<gml:coordinates> *(.*?) *</gml:coordinates>.*", "\\1", geom)
s <- strsplit(as.character(geom.sub), ' ')
coords <- data.frame(coords=unlist(s))
coords[] <- lapply(coords, as.character)
l <- strsplit(coords$coords, ",")
df <- ldply(l)
colnames(df) <- c("x", "y")
df[] <- lapply(df, as.numeric)
# create Polygon(s)
geom.list <- Polygons(list(Polygon(df)),1)
final <- SpatialPolygons(list(geom.list),proj4string=CRS(BNG))
final.df <- SpatialPolygonsDataFrame(final,data)
Метод 1 возвращает XML-файл, подобный этому;
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="WestminsterConstituencyName"/>
<variable name="gssCode"/>
<variable name="uri"/>
<variable name="g"/>
</head>
<results>
<result>
<binding name="WestminsterConstituencyName">
<literal>Edinburgh South</literal>
</binding>
<binding name="gssCode">
<literal>S14000024</literal>
</binding>
<binding name="uri">
<uri>http://data.ordnancesurvey.co.uk/id/7000000000033932</uri>
</binding>
<binding name="g">
<literal datatype="http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral"><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>LOTS OF COORDINATE PAIRS HERE</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></literal>
</binding>
</result>
</results>
</sparql>
Но я понятия не имею, как сделать либо многоугольники (записываемые в шейпфайлы) или даже JSON из результата Xml. Я бы предпочел работать с XML, так как хотел бы получить доступ к другим ресурсам XML.
Кроме того, действительно ли работает обработка по методу 2 (stringsplitting и т. Д.)? что данные не всегда соответствуют? Будет ли потеряна информация о многочастных полигонах? (думаю, будет). Есть ли более «правильный» метод?
Спасибо за любую помощь.
ОК, я изучаю немного больше, это формат SPARQL XML. Требуется конкретная работа. – Sam
это возвращает пустой список; getNodeSet (data.xml, "// ns: head", c (ns = "http://www.w3.org/2005/sparql-results")). Зачем? – Sam
Если 'data <- GET (test)' in ** Получение результатов 1. ** be 'data <- GET (request)'? –