0

R の地図にプロットする目的で住所を蓄積しようとしています。住所を手動で取得し、.csv に入力して R にインポートしています。.csv の形式は次のとおりです。

番地 | 通り | 都市 | 州

1150 | FM 1960 ウェストロード | ヒューストン | TX

701 | ケラー パークウェイ | ケラー | TX

各見出し (番地、番地、都市、州) は一意の列であり、その下のデータはそれぞれの列に分かれています。

R に .csv から情報を読み取らせ、Google Maps API で使用するための適切な形式に変換します。入力したアドレスに対応する情報を含む .xml ファイルを API で生成します。最小限の作業例は次のとおりです。

streetnumber1<-paste(data$streetnumber,sep="")
street1<-gsub(" ","+",data$street)
street2<-paste(street1,sep="")
city1<-paste(data$city,sep="")
state1<-paste(data$state,sep="")

url<-paste("http://maps.googleapis.com/maps/api/geocode/xml?address="
,streetnumber1,"+",street2,",+",city1,",+",state1,"&sensor=false",sep="")

を呼び出すurlと、2 つの Web アドレスが生成されます。このアドレスを Web ブラウザーに入力すると、Google Maps API によって提供される .xml データに移動できます。

URL を生成する回数を宣言せずに、.csv ファイル内のすべてのアドレスに対してこれが発生するようにしたいと考えています。これは関数の仕事だと思いますが、applyどうすればいいのかわかりません。R と API の間の対話を自動化したら、取得した .xml を解析して、探している情報を抽出できるようにしたいと考えています。

4

3 に答える 3

6

ggmapパッケージには、ここで車輪を再発明するのではなく、使用することを強くお勧めする機能geocodeがあります。

編集:「複数の住所」と言うので、バッチジオコーディング用にメソッドといくつかの堅牢性チェックが組み込まれており、Bing Maps APIの使用を許可する私のバージョンを好むかもしれませんdata.frame(1日あたり2.5Kではなく、1日あたり25Kの制限があります)グーグルマップ)。

于 2013-01-30T14:19:58.867 に答える
4

この質問からは、あなたが Google から何を得ようとしているのか正確にはわかりません。緯度と経度と思います。そうである場合は、スクリーンショットに続くコードのようなものを試してください。編集: Ari B. Friedman のコメントに従って、パッケージのgeocode関数を使用した代替 (およびより単純な) アプローチを含めるように改訂されました。ggmap

スクリーンショット

# Read in the text from your example
mydf <- read.csv(con <- textConnection(
    "streetnumber|street|city|state
    1150|FM 1960 West Road|Houston|TX
    701|Keller Parkway|Keller|TX"), header = TRUE, sep = "|", check.names = FALSE)

# APPROACH 1 - works but Approach 2 probably better (see below)
# Create a new column for the URL to pass to Google API
mydf$url <- with(mydf, paste("http://maps.googleapis.com/maps/api/geocode/xml?address=",
                             streetnumber,
                             gsub(" ", "+", street),
                             city, "+",
                             state, "+",
                             "&sensor=false",
                             sep = ""))

# Check to see what we have in the data frame
str(mydf)

library(XML)
latlon <- lapply(mydf$url, function(x) { # process each element in the column 'url'
       myxml <- xmlTreeParse(x, useInternal = TRUE) # pass the element (an URL) to the XML function
       # parse the result
       lat = xpathApply(myxml, '/GeocodeResponse/result/geometry/location/lat', xmlValue)[[1]]
       lon = xpathApply(myxml, '/GeocodeResponse/result/geometry/location/lng', xmlValue)[[1]]
       data.frame(lat = lat, lon = lon) # return the latitude and longitude as a data frame
   })

# We end up with a list of data frames, so merge the data frames into one:
library(reshape)
latlon <- merge_all(latlon)

# Then bolt the columns on to your existing data frame
mydf <- cbind(mydf, latlon, stringsAsFactors = FALSE)

# We want the latitude and longitude to numbers, not characters
mydf$lat <- as.numeric(mydf$lat)
mydf$lon <- as.numeric(mydf$lon)

require(ggmap)

# APPROACH 2 - let ggmap do the heavy lifting (and 
# comment out Approach 1 if you use this)

mydf$location <- with(mydf, paste(streetnumber,street, city, state,sep = ", "))

latlon <- geocode(mydf$location)
mydf <- cbind(mydf, latlon, stringsAsFactors = FALSE)

# Now plot.
# Be careful when specifying the zoom argument, because larger values can cause
# points to be dropped by geom_point()
ggmap(get_googlemap(maptype = 'roadmap', zoom = 6, scale = 2), extent = 'panel') +
       geom_point(data = mydf, aes(x = lon, y = lat), fill = "red", colour = "black",
                  size = 3, shape = 21)
于 2013-01-30T13:44:49.923 に答える
1

google Mpas API を使用する場合は、彼の JSON API を使用することをお勧めします。XML は JSON ほど軽量ではありません。

継続性のために、元のコードを少し変更し、RJSONIOパッケージを使用します。

## I read your data
dat <- read.table(text = '
streetnumber | street | city | state
1150 | FM 1960 West Road | Houston | TX
701 | Keller Parkway | Keller | TX',header= T, sep = '|')

library(RJSONIO)
## here the use of json in placee of xml
## the static part of the url request
url.base <- "http://maps.googleapis.com/maps/api/geocode/json?address="

## I create a data.frame with your formatted data
dat2 <- data.frame(
  streetnumber1 = paste(dat$streetnumber,sep=""),
  street2 = paste(gsub(" ","+",dat$street),sep=""),
  city1 = paste(dat$city,sep=""),
  state1 = paste(dat$state,sep=""))

## I use apply here to call it for each row
apply(dat2,1, function(x){
  url<-paste(url.base,x[1],"+",x[2],
             ",+",x[3],",+",x[4],"&sensor=false",sep="")
  res <- fromJSON(url)    ## single statement 
  ## e. to get lat/long
  lat.long <- res$results[[1]]$geometry$bounds$northeast
})

resここにリストがあります。簡単にサブストして解析できます。

于 2013-01-30T14:01:14.597 に答える