How do I plot coordinates (latitude and longitude pairs) on a geographic map?
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:
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
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
There is nice way to to put your data on rotatable 3D globe. Your data:
centers = {{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}};
Function that defines mapping of coordinates onto sphere:
SC[{lat_, lon_}] := r {Cos[lon \[Degree]] Cos[lat \[Degree]],
Sin[lon \[Degree]] Cos[lat \[Degree]], Sin[lat \[Degree]]};
Average Earth radius, countries names, 3D visualization where you can Drag globe to rotate, Hold CTRL and drag to zoom:
r = 6367.5; places = CountryData["Countries"];
Graphics3D[{Opacity[.9], Sphere[{0, 0, 0}, r],
Map[Line[Map[SC, CountryData[#, "SchematicCoordinates"], {-2}]] &,
places], {Red, PointSize[Medium], Point[SC[#]] & /@ centers}},
Boxed -> False, SphericalRegion -> True, ViewAngle -> .3]
Here's a start.
latLngs={{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}};
Show[CountryData["UnitedStates",{"Shape", "Equirectangular"}],
Axes -> True, Epilog ->{PointSize[0.01], Red,
Point[Reverse /@ latLngs]}]
You can show the points on a natural Mercator projection like so:
toMercator[{lat_, lng_}] := {lng,
Log[Abs[Sec[lat*Degree]+Tan[lat*Degree]]]/Degree};
mercPoints = toMercator /@ latLngs;
Show[CountryData["UnitedStates",{"Shape", "Mercator"}],
Frame-> True, Epilog ->{PointSize[0.01], Red,
Point[mercPoints]}]
Presumably, there's a built in way to extract the values of from Mercator's (and other) projections, but I don't see how offhand.