を使用して8GBのRAMと120ギガバイトのSSDとコアのi5 3230Mです。あなたが照会しているサービスは、あなたがすでに違反している「毎秒1つの要求の絶対最大値」を許可します。 1.2百万件のクエリに達する前にリクエストを抑制する可能性があります。彼らのウェブサイトでは、より大規模な使用のための同様のAPIに約15kの無料の毎日のリクエストしかありません。
オフラインオプションを使用する方がはるかに良いでしょう。クイック検索では、人口の多い場所の自由に利用できるデータセットが、経度と緯度と共に多く表示されています。ここでは、使用します1です:http://simplemaps.com/resources/world-cities-data
> library(dplyr)
> cities.data <- read.csv("world_cities.csv") %>% tbl_df
> print(cities.data)
Source: local data frame [7,322 x 9]
city city_ascii lat lng pop country iso2 iso3 province
(fctr) (fctr) (dbl) (dbl) (dbl) (fctr) (fctr) (fctr) (fctr)
1 Qal eh-ye Now Qal eh-ye 34.9830 63.1333 2997 Afghanistan AF AFG Badghis
2 Chaghcharan Chaghcharan 34.5167 65.2500 15000 Afghanistan AF AFG Ghor
3 Lashkar Gah Lashkar Gah 31.5830 64.3600 201546 Afghanistan AF AFG Hilmand
4 Zaranj Zaranj 31.1120 61.8870 49851 Afghanistan AF AFG Nimroz
5 Tarin Kowt Tarin Kowt 32.6333 65.8667 10000 Afghanistan AF AFG Uruzgan
6 Zareh Sharan Zareh Sharan 32.8500 68.4167 13737 Afghanistan AF AFG Paktika
7 Asadabad Asadabad 34.8660 71.1500 48400 Afghanistan AF AFG Kunar
8 Taloqan Taloqan 36.7300 69.5400 64256 Afghanistan AF AFG Takhar
9 Mahmud-E Eraqi Mahmud-E Eraqi 35.0167 69.3333 7407 Afghanistan AF AFG Kapisa
10 Mehtar Lam Mehtar Lam 34.6500 70.1667 17345 Afghanistan AF AFG Laghman
.. ... ... ... ... ... ... ... ... ...
それは実際のデータ例なしで証明するのは難しいが、我々はいくつかのおもちゃのデータを作ることができます(提供するために便利!)。 geosphere
でdistm
機能を使用して
# make up toy data
> candidate.longlat <- data.frame(vid = 1:3,
lat = c(12.53, -16.31, 42.87),
long = c(-70.03, -48.95, 74.59))
、我々は一度にすべてのデータおよびすべての都市の位置の間の距離を計算することができます。あなたのために、これは〜8,400,000,000の数字を含むmatrix
になるので、しばらく時間がかかるかもしれません(パラレル化を探ることができます)。
> install.packages("geosphere")
> library(geosphere)
# compute distance matrix using geosphere
> distance.matrix <- distm(x = candidate.longlat[,c("long", "lat")],
y = cities.data[,c("lng", "lat")])
それはあなたのデータポイントのそれぞれに最も近い都市を見つけるために、その後は簡単だし、あなたのdata.frame
からcbind
それが。
# work out which index in the matrix is closest to the data
> closest.index <- apply(distance.matrix, 1, which.min)
# rbind city and country of match with original query
> candidate.longlat <- cbind(candidate.longlat, cities.data[closest.index, c("city", "country")])
> print(candidate.longlat)
vid lat long city country
1 1 12.53 -70.03 Oranjestad Aruba
2 2 -16.31 -48.95 Anapolis Brazil
3 3 42.87 74.59 Bishkek Kyrgyzstan
Rでそれを行う方法がわかりませんが、あなたのコードは同期していると思います。つまり、一度に1つのHTTPリクエストしか送信されません。あなたが一度に10のように送ることができるなら、あなたは〜5倍高速を得るかもしれません。 – Dodekeract