跳转到内容

SPARQL/SERVICE - 附近和框

来自维基教科书,开放书籍,构建开放的世界

该服务允许搜索坐标位于中心一定半径内或一定边界框内的项目。

以下大多数示例使用地图视图,在查询顶部使用 #defaultView:Map。您可以切换到表格显示以查看底层数据。

最常用于位置的属性是 坐标位置 (P625)

围绕点搜索

[编辑 | 编辑源代码]

柏林 100 公里范围内的机场示例

# Airports within 100km from Berlin
#defaultView:Map
SELECT ?place ?placeLabel ?location ?dist 
WHERE {
  # Berlin coordinates
  wd:Q64 wdt:P625 ?berlinLoc . 
  SERVICE wikibase:around { 
      ?place wdt:P625 ?location . 
      bd:serviceParam wikibase:center ?berlinLoc . 
      bd:serviceParam wikibase:radius "100" . 
      bd:serviceParam wikibase:distance ?dist.
  } 
  FILTER EXISTS {
    # Is an airport
    ?place wdt:P31/wdt:P279* wd:Q1248784 .
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
} 
ORDER BY ASC(?dist)

试试吧!

around 服务调用的第一行必须具有格式 ?item predicate ?location,其中搜索结果将绑定 ?item 到指定位置内的项目,并将 ?location 绑定到它们的坐标。支持的参数是

谓词 含义
wikibase:center 执行搜索的点。必须绑定才能搜索生效。
wikibase:radius 距中心的距离。目前距离始终以公里为单位,其他单位尚未支持。
wikibase:globe 正在搜索的地球。可选,默认为 地球 (wd:Q2)
wikibase:distance 接收距离信息的变量

在框内搜索

[编辑 | 编辑源代码]

加利福尼亚州圣何塞和加利福尼亚州萨克拉门托之间的学校框搜索示例

# Schools between San Jose, CA and Sacramento, CA
#defaultView:Map
SELECT ?place ?placeLabel ?location 
WHERE {
  wd:Q16553 wdt:P625 ?SJloc.
  wd:Q18013 wdt:P625 ?SCloc.
  SERVICE wikibase:box {
      ?place wdt:P625 ?location.
      bd:serviceParam wikibase:cornerSouthWest ?SJloc.
      bd:serviceParam wikibase:cornerNorthEast ?SCloc.
  }
  ?place wdt:P31/wdt:P279* wd:Q3914.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
}

试试吧!

可以直接指定坐标

# Schools between San Jose, CA and Sacramento, CA
#same as previous
#defaultView:Map
SELECT ?place ?placeLabel ?location 
WHERE {
  SERVICE wikibase:box {
    ?place wdt:P625 ?location.
    bd:serviceParam wikibase:cornerWest "Point(-121.872777777 37.304166666)"^^geo:wktLiteral.
    bd:serviceParam wikibase:cornerEast "Point(-121.486111111 38.575277777)"^^geo:wktLiteral.
  }
  ?place wdt:P31/wdt:P279* wd:Q3914.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
}

试试吧!

box 服务调用的第一行必须具有格式 ?item predicate ?location,其中搜索结果将绑定 ?item 到指定位置内的项目,并将 ?location 绑定到它们的坐标。支持的参数是

谓词 含义
wikibase:cornerSouthWest 框的西南角。
wikibase:cornerNorthEast 框的东北角。
wikibase:cornerWest 框的西角。
wikibase:cornerEast 框的东角。
wikibase:globe 正在搜索的地球。可选,默认为 地球 (wd:Q2)

wikibase:cornerSouthWestwikibase:cornerNorthEast 应该一起使用,wikibase:cornerWestwikibase:cornerEast 也应该一起使用,并且不能混合使用。如果使用 wikibase:cornerWestwikibase:cornerEast 谓词,则假定这些点是框对角线的坐标,并且相应的角将被推导出来。

距离函数

[编辑 | 编辑源代码]

函数 geof:distance 返回两点之间的距离,以公里为单位。示例用法

# Airports within 100km from Berlin
SELECT ?place ?placeLabel ?location ?dist 
WHERE {
  # Berlin coordinates
  wd:Q64 wdt:P625 ?berlinLoc. 
  SERVICE wikibase:around { 
      ?place wdt:P625 ?location. 
      bd:serviceParam wikibase:center ?berlinLoc. 
      bd:serviceParam wikibase:radius "100". 
  } 
  # Is an airport
  ?place wdt:P31/wdt:P279* wd:Q1248784.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
  BIND(geof:distance(?berlinLoc, ?location) as ?dist) 
} 
ORDER BY ?dist

试试吧!

# Places around 0°,0° 
SELECT ?place ?placeLabel ?location ?dist
WHERE {
  SERVICE wikibase:around { 
      ?place wdt:P625 ?location. 
      bd:serviceParam wikibase:center "Point(0 0)"^^geo:wktLiteral.
      bd:serviceParam wikibase:radius "250". 
  } 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  BIND(geof:distance("Point(0 0)"^^geo:wktLiteral, ?location) as ?dist) 
} 
ORDER BY ?dist

试试吧!

参考文献

[编辑 | 编辑源代码]


华夏公益教科书