2012-12-16 16 views
10

मेरे पास शहर के नाम और देशों की एक लंबी सूची है और मैं उन्हें मानचित्र पर प्लॉट करना चाहता हूं। ऐसा करने के लिए मुझे प्रत्येक शहर की रेखांश और अक्षांश जानकारी की आवश्यकता है।आर में शहर के नाम और देश से देशांतर और अक्षांश निर्देशांक कैसे प्राप्त करें?

मेरे तालिका test कहा जाता है और निम्नलिखित संरचना है:

Cityname CountryCode 
New York US 
Hamburg DE 
Amsterdam NL 

उत्तर

14

निम्नलिखित कोड मैं सफलतापूर्वक समस्या हल हो गए हैं।

library(RJSONIO) 
nrow <- nrow(test) 
counter <- 1 
test$lon[counter] <- 0 
test$lat[counter] <- 0 
while (counter <= nrow){ 
    CityName <- gsub(' ','%20',test$CityLong[counter]) #remove space for URLs 
    CountryCode <- test$Country[counter] 
    url <- paste(
    "http://nominatim.openstreetmap.org/search?city=" 
    , CityName 
    , "&countrycodes=" 
    , CountryCode 
    , "&limit=9&format=json" 
    , sep="") 
    x <- fromJSON(url) 
    if(is.vector(x)){ 
    test$lon[counter] <- x[[1]]$lon 
    test$lat[counter] <- x[[1]]$lat  
    } 
    counter <- counter + 1 
} 

इस के रूप में एक बाहरी सेवा (openstreetmaps.org) यह बड़े डेटासेट के लिए कुछ समय लग सकता बुला रहा है। हालांकि, आप संभवतया केवल एक बार ऐसा करते हैं जब नए शहरों को सूची में जोड़ा गया है।

+0

आप अपने geonames पैकेज से जीएनएसएआरएआर के साथ भी ऐसा कर सकते हैं - यह geonames.org वेब सेवा को कॉल करता है जो OpenStreetMap की नोमिनैटिम सेवा के साथ अपने बहुत सारे डेटा साझा करता है। – Spacedman

+0

@ जोकहेम मैं इसके विपरीत कैसे करूं? मेरे पास अक्षांश और देशांतर है और मुझे ऊपर की तरह जेसन प्रारूप के माध्यम से खुली सड़क का उपयोग करके शहर और देश के नामों को खोजने की ज़रूरत है? –

11

आपके लिए कुछ अन्य विकल्प।

ggmaps

ggmaps एक समारोह geocode जो जियोकोड करने गूगल मैप्स का उपयोग करता है। यह आपको प्रति दिन 2,500 तक सीमित करता है।

taRifx.geo

taRifx.geo के नवीनतम संस्करण एक geocode समारोह या तो गूगल या बिंग मैप्स जियोकोड करने का उपयोग करता है जो है। बिंग संस्करण के लिए आपको एक (फ्री) बिंग खाता का उपयोग करने की आवश्यकता है, लेकिन बदले में आप अधिक प्रविष्टियों को जियोकोड कर सकते हैं। इस संस्करण में सुविधाएँ:

  • सेवा विकल्प (बिंग और गूगल मैप्स दोनों समर्थित)
  • लॉग-इन समर्थन (विशेष रूप से बिंग, जो एक खाता कुंजी की आवश्यकता है के लिए लेकिन बदले में परिमाण अधिक दैनिक अनुरोधों के एक आदेश के लिए अनुमति देता है)
  • जियोकोड एक समय में एक पूरी data.frame, किसी भी पंक्तियों जो पहले से ही जिओकोड दिया है
  • मजबूत बैच जियोकोडिंग (अनदेखी ताकि किसी भी त्रुटि जियोकोडिंग के पूरे data.frame की कीमत का कारण नहीं है की तरह कुछ समय-सेवर्स सहित खोने के लिए, बड़ी नौकरियों के लिए)
  • मार्ग खोज ing
6

(पर्यटन बिंदु बी करने के लिए बिंदु A से बार) इस प्रयास करें मुझे लगता है कि इस समस्या को

> library(ggmap) 
 
Loading required package: ggplot2 
 
Google Maps API Terms of Service: http://developers.google.com/maps/terms. 
 
Please cite ggmap if you use it: see citation('ggmap') for details. 
 

 
#Now you can give city name or country name individually 
 

 
> geocode("hamburg") 
 
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=hamburg&sensor=false 
 
     lon  lat 
 
1 9.993682 53.55108 
 

 
geocode("amsterdam") 
 
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=amsterdam&sensor=false 
 
     lon  lat 
 
1 4.895168 52.37022 
 

 
> geocode("new york") 
 
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=new+york&sensor=false 
 
     lon  lat 
 
1 -74.00594 40.71278

0

के लिए यह बेहतर होगा समाधान इस प्रयास करें ...

function geocodeAddress(geocoder, resultsMap) { 
    var address = document.getElementById('address').value; 
    geocoder.geocode({'address': address}, function(results, status) { 
     if (status === 'OK') { 
     resultsMap.setCenter(results[0].geometry.location); 
     var marker = new google.maps.Marker({ 
      map: resultsMap, 
      position: results[0].geometry.location, 
      draggable:true 
     }); 
     var infowindow = new google.maps.InfoWindow({ 
      content: "Please drag this marker to your position.." 
      }); 
      infowindow.open(resultsMap,marker); 
     document.getElementById('lat').value=marker.getPosition().lat(); 
     document.getElementById('lng').value=marker.getPosition().lng(); 
     marker.addListener('drag', handleEvent); 
marker.addListener('dragend', handleEvent); 
     } else { 
     alert('Geocode was not successful for the following reason: ' + status); 
     } 
    }); 
    } 

get full code from here..

संबंधित मुद्दे