How getting coordinates of geagraphical locations?
    21 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
Hi,
I have the following struct array.
data=struct('Position',[],'Value',[])
data(1).Position='London';
data(1).Value=20;
data(2).Position='Rome';
data(2).Value=100;
What I need is a bubble plot of values field with a map in the background and the bubble must be located where is the geographical location. I know this function http://www.mathworks.com/matlabcentral/fileexchange/27627-plot-google-map but I don't know how to get the coordinates of the locations. Does anyone have an idea?
Thanks
Cheers
Pietro
0 Commenti
Risposta accettata
  Geoff Hayes
      
      
 il 7 Ott 2014
        
      Modificato: Geoff Hayes
      
      
 il 8 Ott 2014
  
      Pietro - if you know the country code for the city, then you could try the following function which makes use of the Yahoo GeoPlanet Web Service, GeoPlanet YQL Tables.
 % Uses YQL to query the geo.places database for the latitude and longitude
 % of a city, given the city name and country code.
 function [latDegs, lonDegs] = getLatLonViaYql(city,countryCode)
    % build the YQL query
    yqlQuery = sprintf(['select centroid.latitude,centroid.longitude ' ...
                        'from geo.places '                             ...
                        'where text="%s" and country.code="%s" and '   ...
                        'placeTypeName.code="7"'],                     ...
                        city, countryCode);
    % build the URL
    yqlUrl = ['http://query.yahooapis.com/v1/public/yql?q=' yqlQuery];
    % replace blank spaces with %20
    yqlUrl = strrep(yqlUrl,' ','%20');
    % retrieve the data
    xmlData = urlread(yqlUrl);
    % get the latitude and longitude (here we assume that the latitude is
    % within <latitude>XYZ</latitude> and the longitude within
    % <longitude>UVW</longitude> tags)
    posData = regexp(xmlData,'>[0-9.-]+<','match');
    % if exactly two tags match the above regexp then parse the latitude
    % and longitude data
    if length(posData)==2
        latDegs = str2double(char(posData{1}(2:end-1)));
        lonDegs = str2double(char(posData{2}(2:end-1)));
    else
        latDegs = 0;
        lonDegs = 0;
    end
 end
The latitude and longitude positions can then be obtained as
 [latLondon,lonLondon] = getLatLonViaYql('London','GB')
 latLondon =
                 51.507702
 lonLondon =
                  -0.12797
 [latRome,lonRome] = getLatLonViaYql('Rome','IT')
 latRome =
                 41.898399
 lonRome =
                   12.4956
In the YQL query, we grab the "centroid latitude and longitude of a "bounding box" that surrounds the city. (This box is defined by south-west and north-east positions.) Whether this is accurate enough for your application remains to be seen. But constructing two vectors as
 lat = [latLondon ; latRome];
 lon = [lonLondon ; lonRome];
and executing
 plot(lon,lat,'.r','MarkerSize',20)
 plot_google_map
puts the red markers at the positions of London and Rome on the map.
EDIT
Updated the above code to include an additional where condition/clause to ensure that the record returned corresponds to a "Town". Pietro observed that at least two records were being returned for cities like Oslo, Berlin, and Sofia.
6 Commenti
  Sébastien MAILFERT
 il 21 Gen 2019
				See my post below: the query on the yahoo site does not work anymore...
Any idea ?
Più risposte (2)
  Chad Greene
      
      
 il 7 Ott 2014
        Do you have the mapping toolbox? If so, the inputm function lets you click on a map to get geographic coordinates.
As a matter of style, I strongly recommend against ever using bubble plots. Circles are two dimensional, but your variable, let's call it population, is one dimensional. As Edward Tufte points out, you should never let the dimensions of the display exceed the dimensions of the data. This is particularly important in the case of circles, because our eyes do not scale the size of circles linearly.
A question I always have when I see bubble plots: is the radius of the circle scaling with the data, or is the area of the circle scaling with the data? That is rarely clear. Even if you are explicit about which scaling you use, the way we perceive the size of a circle is not linear with radius or area.
Inevitably, if you place a giant circle over London to show its big population, some of that circle will overlap outlying towns that are not represented by that circle, and that just does not make any sense at all. It would be more insightful to plot population density with a color map or even contours. That way you'd preserve the nuance of the original data instead of distilling everything down and saying to your viewer, "look, this circle is bigger than this other circle". Just a personal preference, but I say leave bubble plots to the click bait sites.
7 Commenti
  Sébastien MAILFERT
 il 22 Gen 2019
				Hi pietro, 
it is clear that there is a huge problem if the website does not exist anymore.
Did you find a solution?
  Sébastien MAILFERT
 il 21 Gen 2019
        Hi all,
the query.yahooapis.com site does not work anymore since few days.
Do you have an idea to bypass this yahoo queries?
Best regards.

2 Commenti
  Serbring
 il 18 Nov 2019
				that is good resource. You can access to website to the API. I am not an expert on this. 
Vedere anche
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!