地理信息系统&神奇宝贝:以编程方式搜索带有R的稀有神奇宝贝

通过R以编程方式搜索Pokemon

嗨,老兄们!

尽管神奇宝贝的炒作正在逐渐消失,但我想向您展示如何用R编程地搜索稀有的神奇宝贝。最终脚本将能够获取坐标或地址,并在给定的半径内查找神奇宝贝。让’s start.

步骤1:通过curl发送查询

要以编程方式进行神奇宝贝搜索,我们首先需要一个允许我们执行此操作的API。在网上研究期间,我找到了该网页 fastpokemap.se 您可以点击地图,并在几秒钟内显示所有半径约40m的神奇宝贝。整洁的是,它们还有一个API,使您可以通过使用curl来以编程方式执行此操作。您可以在下面阅读有关此主题的更多信息 reddit 。这也是我从以下位置获取curl查询的地方:

curl '//api.fastpokemap.se/?key=allow-all&ts=0&lat=51.5301638&lng=-0.08174179999999999' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Origin: //fastpokemap.se' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' --compressed

因此,此查询执行的操作是获取一个坐标(纬度,经度),并返回大约40m半径内的所有神奇宝贝。最终结果是一个类似JSON的JSON(当您将其插入控制台时,根据时间可能会得到不同的结果):

{"result":[{"spawn_point_id":"48761cbc80b","encounter_id":"8774076881359073581"," 宠物小精灵 _id":"RATTATA","latitude":51.531039698408804,"longitude":-0.07933453745476703,"expiration_timestamp_ms":"1474705165772"},{"spawn_point_id":"48761cbb0db","encounter_id":"5024433270417738285"," 宠物小精灵 _id":"PIDGEY","latitude":51.52923201185921,"longitude":-0.07988043570107511,"expiration_timestamp_ms":"1474704786572"}

您可以看到检测到的神奇宝贝的坐标,它们的名称(RATTATA和PIDGEY)以及其他几个参数。

步骤2:在R中包装

查询坐标

R允许您从脚本内执行这些查询。您可以通过多种方式执行此操作,我更喜欢使用以下实现 系统()。 使用此功能,您可以像这样调用OS命令:

#Define Coordinates
x = 51.53054691352413
y = -0.08174179999999999

#Send query and store result in variable res
res = system(paste0("curl '//api.fastpokemap.se/?key=allow-all&ts=0&lat=",x,"&lng=",y,"' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Origin: //fastpokemap.se' -H 'User-Agent: Mozilla/5.0' --compressed"), 
               实习生= T )

在上面的代码中,我已经定义了两个变量,在这些变量中存储了坐标,然后将其插入到由您调用的查询语句中 系统()。 通过设置参数 实习生= T 查询的结果存储在用户定义的R变量中。这是结果在R中的样子:

[1] "{\"result\":[{\"spawn_point_id\":\"48761cbc919\",\"encounter_id\":\"17122260820454702845\",\" 宠物小精灵 _id\":\"RATTATA\",\"latitude\":51.53169635521043,\"longitude\":-0.0801630351728887,\"expiration_timestamp_ms\":\"1474705518404\"},{\"spawn_point_id\":\"48761cbc9bb\",\"encounter_id\":\"13826549414915815469\",\" 宠物小精灵 _id\":\"RATTATA\",\"latitude\":51.53120337908847,\"longitude\":-0.08025346621673418,\"expiration_timestamp_ms\":\"1474705359884\"}]}"

按地名查询(地理编码)

在大多数情况下,您不’不知道一个地方的确切坐标。这就是为什么我将向您展示如何将上面的查询与地名一起使用。为此,我们将使用软件包{dismo}:

该软件包使用地理编码从给定地址获取坐标。例如:

#load library
library(dismo)
#get coordintes of the street 'Lincoln Ave in Ames Iowa'
coords = geocode("Lincoln Ave, Ames Iowa)

结果是这样的:

> coords
           originalPlace           interpretedPlace longitude latitude      xmin     xmax     ymin     ymax uncertainty
1 Lincoln Ave, Ames Iowa Lincoln Way, Ames, IA, USA -93.65478 42.02272 -93.70192 -93.6084 42.01998 42.02479        3849

通过使用coords $ longitude和coords $ latitude,您可以从该位置提取相应的坐标,然后从上方将其插入我们的查询中:

x = coords$longitude
y = coords$latitude

res = system(paste0("curl '//api.fastpokemap.se/?key=allow-all&ts=0&lat=",x,"&lng=",y,"' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Origin: //fastpokemap.se' -H 'User-Agent: Mozilla/5.0' --compressed"),  实习生= T )

但是,在这种情况下,我得到的结果是空的。查询时显然在此位置没有神奇宝贝:

"{\"result\":[]}"

将其带入新的高度

那么还有什么可能呢?我们可以将单个查询循环成一个循环,以在整个城市或附近自动搜索。其他可能性包括通知脚本,该脚本可以在检测到神奇宝贝时向您发送电子邮件。或者,如果您真的想推动它,请一遍又一遍地扫描您的城市,以检测产卵模式和巢穴。可能性是无止境!
如果您喜欢这个简短的教程,我将很高兴为您展示更多。请在下面给我留言。

干杯马丁(勇气队)

 

关于作者

马丁出生于捷克共和国,就读于维也纳自然资源与生命科学大学。他目前在GeoVille(一家位于奥地利的地球观测公司)工作,专门从事土地监测。他的主要兴趣是:开源应用程序,例如R,(地理空间)统计和数据管理,Web映射和可视化。他喜欢旅行,寻宝,摄影和运动。

发表回复

*