How getting coordinates of geagraphical locations?

17 views (last 30 days)
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

Accepted Answer

Geoff Hayes
Geoff Hayes on 7 Oct 2014
Edited: Geoff Hayes on 8 Oct 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 Comments
Sébastien MAILFERT
Sébastien MAILFERT on 21 Jan 2019
See my post below: the query on the yahoo site does not work anymore...
Any idea ?

Sign in to comment.

More Answers (2)

Chad Greene
Chad Greene on 7 Oct 2014
Do you have the mapping toolbox? If so, the inputm function lets you click on a map to get geographic coordinates.
If it's just a few locations you need, there's always Wikipedia or this site.
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 Comments
Sébastien MAILFERT
Sébastien MAILFERT on 22 Jan 2019
Hi pietro,
it is clear that there is a huge problem if the website does not exist anymore.
Did you find a solution?
pietro
pietro on 22 Jan 2019
Hi Sebastien,
unfortunately, no solution yet. :(

Sign in to comment.


Sébastien MAILFERT
Sébastien MAILFERT on 21 Jan 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.
Capture.PNG
  2 Comments
KAE
KAE on 15 Nov 2019
It seems there is geo place name data that can be downloaded here, but not sure how to use with Matlab.
Serbring
Serbring on 18 Nov 2019
that is good resource. You can access to website to the API. I am not an expert on this.

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!