反向维基百科地理标记查找

13

维基百科正在地理标记很多 文章。(请看页面右上角。)

是否有API可以查询指定半径范围内的所有地理标记页面?

更新

好的,根据lost-theory的回答,我在DBpedia查询浏览器上尝试了这个:

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT ?subject ?label ?lat ?long WHERE {
    ?subject geo:lat ?lat.
    ?subject geo:long ?long.
    ?subject rdfs:label ?label.
    FILTER(xsd:float(?lat) - 57.03185 <= 0.05 && 57.03185 - xsd:float(?lat) <= 0.05
        && xsd:float(?long) - 9.94513 <= 0.05 && 9.94513 - xsd:float(?long) <= 0.05
        && lang(?label) = "en"
    ).
} LIMIT 20

这很接近我想要的,但它返回点周围(local)正方形内的结果而不是圆形。另外,如果可能的话,我希望结果根据距离从远到近排序。

更新2

我正在尝试确定欧几里得距离作为真实距离的近似值,但我在SPARQL中无法将一个数字平方。(此处打开问题)。当我得到有用的东西时,我会更新问题,但与此同时,我将感谢任何关于替代方法的建议。

更新3

最后一次更新。我放弃了通过DBpedia使用SPARQL。我编写了一个简单的解析器,每晚获取维基百科文章文本数据库转储,并解析所有地理编码的文章。它工作得相当好,它允许我按照自己的方式存储有关地理标记文章的信息。
这可能是我将继续使用的解决方案,如果我能够创建一个漂亮的界面来使用它,我可能会考虑允许公共API访问和/或发布解析器源代码。

顺便提一下,在Wikidata上:https://opendata.stackexchange.com/a/11673/16193 - Stanislav Kralin
6个回答

3

dbpedia终端使用的OpenLink Virtuoso服务器具有多个查询功能。我在http://docs.openlinksw.com/virtuoso/rdfsparqlgeospat.html上找到了类似问题的有用信息。

最终我得到了这样一个查询:

SELECT ?page ?lat ?long (bif:st_distance(?geo, bif:st_point(15.560278, 58.394167)))
WHERE{
    ?m foaf:page ?page.
    ?m geo:geometry ?geo.
    ?m geo:lat ?lat.
    ?m geo:long ?long.
    FILTER (bif:st_intersects (?geo, bif:st_point(15.560278, 58.394167), 30))
}
ORDER BY ASC 4 LIMIT 15

这个例子检索距离原始位置30公里内的地理标记位置。


3

您应该能够使用SPARQL和dbpedia查询经纬度。以下是一个例子(来自这里):

SELECT distinct ?s ?la ?lo ?name ?country WHERE {
?s dbpedia2:latitude ?la .
?s dbpedia2:longitude ?lo .
?s dbpedia2:officialName ?name .
?s dbpedia2:country ?country .
filter (
  regex(?country, 'England|Scotland|Wales|Ireland')
  and regex(?name, '^[Aa]')
)
}

You can run your own queries here.


非常有趣。我不确定这个SPARQL语法,以及如何查询特定区域(由纬度、经度和半径定义)内的所有文章? - Bjarke Freund-Hansen
1
我不确定SPARQL是否支持三角函数(似乎不支持);但是你可以将数据集筛选为一个正方形,以获得第一批结果,然后在“客户端”计算大圆距离,并应用第二轮筛选。 - Rowland Shaw

1

1

免费GeoNames.org FindNearbyWikipedia服务可以根据邮政编码或坐标(纬度、经度)获取地理标记文章。

每个应用程序(由参数“用户名”标识)每天提供30,000个信用额度,每小时限制为2000个信用额度。信用是大多数服务的Web服务请求命中。超过限制时会抛出异常。


1

0

我对SPARQL不够熟悉,但如果它可以在过滤器中使用power函数,那么使用勾股定理(a^2 + b^2 = c^2)计算给定文章与给定点之间的距离就很容易了,这将给出半径内的所有文章。

另一个选择是获取维基百科数据转储并自行处理 - 当我需要对维基百科文章进行一些语言分析时,这就是我所做的。


这是我现在正在尝试让其正常工作的内容。由于纬度和经度不是笛卡尔坐标,因此在极地或大半径处的结果可能会偏差较大,但在局部范围内可能会近似正确。然而,我根本不知道如何在SPARQL中计算某个东西的幂,甚至不知道在哪里查找如何计算幂的信息。我在这里提出了一个问题:https://dev59.com/-0nSa4cB1Zd3GeqPMkcs当我找到令人满意的解决方案时,我会更新这个问题,但在那之前,我将感激任何建议。 :) - Bjarke Freund-Hansen
在回答之前,我查看了W3上的SPARQL参考文献,发现那里的数学运算不太令人满意。话虽如此,有一些关于使用嵌入式Javascript添加运算符的讨论,这可能是一个解决方案,但由于缺乏时间,我没有深入研究。 - Guss
听起来我找到了解决方案。我猜测平方根运算符(math:sqrt)可行,但似乎在W3页面上并没有文档记录。而且这不是用于网页显示,所以我不确定任何JavaScript解决方案将如何帮助我(尽管我自己也注意到了这个讨论)。 - Bjarke Freund-Hansen
一个 SPARQL 处理器有一个 JavaScript 解析器来处理这个问题是非常可能的。如果你能让 math:sqrt 正常工作,那么 math:pow 也可能会正常工作。 - Guss
math:pow 对我没用,尝试将值相乘也不行(编译器报错说有语法错误在'('处,但我不理解)。 - Guss
我的问题也是这个。我真正需要的是一个良好的SPARQL语法规范和可用的“库”。 - Bjarke Freund-Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接