How getting coordinates of geagraphical locations?

18 ビュー (過去 30 日間)
pietro
pietro 2014 年 10 月 7 日
コメント済み: Serbring 2019 年 11 月 18 日
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

採用された回答

Geoff Hayes
Geoff Hayes 2014 年 10 月 7 日
編集済み: Geoff Hayes 2014 年 10 月 8 日
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 件のコメント
Geoff Hayes
Geoff Hayes 2014 年 10 月 8 日
Glad it worked out!
Sébastien MAILFERT
Sébastien MAILFERT 2019 年 1 月 21 日
See my post below: the query on the yahoo site does not work anymore...
Any idea ?

サインインしてコメントする。

その他の回答 (2 件)

Chad Greene
Chad Greene 2014 年 10 月 7 日
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 件のコメント
Sébastien MAILFERT
Sébastien MAILFERT 2019 年 1 月 22 日
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 2019 年 1 月 22 日
Hi Sebastien,
unfortunately, no solution yet. :(

サインインしてコメントする。


Sébastien MAILFERT
Sébastien MAILFERT 2019 年 1 月 21 日
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 件のコメント
KAE
KAE 2019 年 11 月 15 日
It seems there is geo place name data that can be downloaded here, but not sure how to use with Matlab.
Serbring
Serbring 2019 年 11 月 18 日
that is good resource. You can access to website to the API. I am not an expert on this.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeAxis Labels についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by