Skip to main content

plotting - How do I plot coordinates (latitude and longitude pairs) on a geographic map?


I'm attempting for the first time to create a map within Mathematica. In particular, I would like to take an output of points and plot them according to their lat/long values over a geographic map. I have a series of latitude/longitude values like so:


 {{32.6123, -117.041}, {40.6973, -111.9},   {34.0276, -118.046}, 
{40.8231, -111.986}, {34.0446, -117.94}, {33.7389, -118.024},

{34.122, -118.088}, {37.3881, -122.252}, {44.9325, -122.966},
{32.6029, -117.154}, {44.7165, -123.062}, {37.8475, -122.47},
{32.6833, -117.098}, {44.4881, -122.797}, {37.5687, -122.254},
{45.1645, -122.788}, {47.6077, -122.692}, {44.5727, -122.65},
{42.3155, -82.9408}, {42.6438, -73.6451}, {48.0426, -122.092},
{48.5371, -122.09}, {45.4599, -122.618}, {48.4816, -122.659},
{42.3398, -70.9843}}

I've tried finding documentation on how I would proceed but I cannot find anything that doesn't assume a certain level of introduction to geospatial data. Does anyone know of a good resource online or is there a simple explanation one can supply here?



Answer




data:


latlong = {{32.6123, -117.041}, {40.6973, -111.9}, {34.0276, -118.046}, 
{40.8231, -111.986}, {34.0446, -117.94}, {33.7389, -118.024},
{34.122, -118.088}, {37.3881, -122.252}, {44.9325, -122.966},
{32.6029, -117.154}, {44.7165, -123.062}, {37.8475, -122.47},
{32.6833, -117.098}, {44.4881, -122.797}, {37.5687, -122.254},
{45.1645, -122.788}, {47.6077, -122.692}, {44.5727, -122.65},
{42.3155, -82.9408}, {42.6438, -73.6451}, {48.0426, -122.092},
{48.5371, -122.09}, {45.4599, -122.618}, {48.4816, -122.659}, {42.3398, -70.9843}}


To put the data on latitude-longitude pairs on a map, yo will need to transform your data based on the projection method used by the map.


For example,


 coords = CountryData["UnitedStates", "Coordinates"];

gives the latitude-longitude data for US boundaries.


To use this data to put together a map with a specific projection method (say Mercator), you need to transform your data


 Map[ GeoGridPosition[ GeoPosition[#], "Mercator"][[1]] & , {latlong}, {2}]

which gives




  {{{1.09884, 0.602677}, {1.18857, 0.778879}, {1.0813, 
0.632239}, {1.18707, 0.781777}, {1.08315, 0.632597}, {1.08169,
0.62617}, {1.08057, 0.634228}, {1.00789, 0.704491}, {0.995431,
0.879708}, {1.09687, 0.602482}, {0.993756, 0.874393}, {1.00409,
0.714614}, {1.09785, 0.604149}, {0.998381, 0.868794}, {1.00786,
0.708463}, {0.998538, 0.88544}, {1.00021, 0.947273}, {1.00095,
0.870866}, {1.694, 0.816595}, {1.85624, 0.824365}, {1.01069,
0.958578}, {1.01072, 0.97155}, {1.0015, 0.892771}, {1.00079,
0.970088}, {1.90268, 0.817169}}}


Doing this transformation for both your data and the latitude-longitude data for world countries inside Graphics:


 Graphics[{Red, Point /@ Map[ 
GeoGridPosition[ GeoPosition[#],
"Mercator"][[1]] & , {latlong}, {2}], Gray,
Polygon[Map[ GeoGridPosition[ GeoPosition[#], "Mercator"][[1]] & ,
CountryData[#, "Coordinates"], {2}]] & /@
CountryData["Countries"]}]

you get:


world map and lat-long points



Now I know I can focus on US:


 Graphics[{ Gray, 
Polygon[Map[ GeoGridPosition[ GeoPosition[#], "Mercator"][[1]] & ,
CountryData["UnitedStates", "Coordinates"], {2}]], Red,
PointSize[.02], Point /@ Map[
GeoGridPosition[ GeoPosition[#],
"Mercator"][[1]] & , {latlong}, {2}]}]

to get


us and points



A simpler method avoiding GeoPosition, GeoGridPosition ... etc


Get the coordinates of US:


 coords = CountryData["UnitedStates", "Coordinates"];

and use


 Graphics[{EdgeForm[Black], Polygon[Reverse /@ First[coords]], Red, 
Point /@ Reverse /@ latlong}]

to get


simpler approach result



Comments

Popular posts from this blog

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

mathematical optimization - Minimizing using indices, error: Part::pkspec1: The expression cannot be used as a part specification

I want to use Minimize where the variables to minimize are indices pointing into an array. Here a MWE that hopefully shows what my problem is. vars = u@# & /@ Range[3]; cons = Flatten@ { Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; Minimize[{Total@((vec1[[#]] - vec2[[u[#]]])^2 & /@ Range[1, 3]), cons}, vars, Integers] The error I get: Part::pkspec1: The expression u[1] cannot be used as a part specification. >> Answer Ok, it seems that one can get around Mathematica trying to evaluate vec2[[u[1]]] too early by using the function Indexed[vec2,u[1]] . The working MWE would then look like the following: vars = u@# & /@ Range[3]; cons = Flatten@{ Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; NMinimize[ {Total@((vec1[[#]] - Indexed[vec2, u[#]])^2 & /@ R...