Mathematica北美地图

时间:2012-01-21 21:56:42

标签: wolfram-mathematica mapping visualization gis

你如何在Mathematica中渲染这样的地图? (例如美国各州和加拿大各省可单独着色?)http://upload.wikimedia.org/wikipedia/commons/archive/1/18/20071029031002%21North_America_map_coloured.svg

我尝试导入SVG路径并构建多边形(使用基于http://mathgis.blogspot.com/2009/11/make-us-county-thematic-map-using.html的方法),但它们看起来不如链接SVG中的曲线好。内置数据库似乎没有美国各州和加拿大各省的形状:只有国家。

谢谢!

PS:这样做的目的是能够制作州/省数据的等值区域图(即根据与该州/省有关的一些数据对州/省进行着色)

3 个答案:

答案 0 :(得分:11)

您可以使用.kml或.kmz文件获取状态/省份和多边形的列表。例如,对于美国,您可以使用this file。要提取多边形,您可以执行类似这样的操作

usa = Import["http://code.google.com/apis/kml/documentation/us_states.kml", 
  "Data"];

transform[s_] := StringTrim[s, Whitespace ~~ "(" ~~ ___ ~~ ")"]

polygons = Thread[transform["PlacemarkNames" /. usa[[1]]] -> 
  ("Geometry" /. usa[[1]])];
stateNames = polygons[[All, 1]];

然后多边形将是一个包含元素"state name" -> Polygon[points]的列表。函数transform只是一个辅助函数,用于从.kml文件中获取所需格式的PlacemarkNames(在这种情况下,从名称末尾剥离“(year)”)。

使用这些多边形,您可以使用FaceForm[]为单个多边形着色。假设我们有一个"state" -> value形式的数据列表,例如

data = Thread[regionNames -> RandomReal[{0, 1}, Length[regionNames]]];

然后我们可以根据

创建地图
colourf = ColorData["Temperature"];
element[value_, poly_] := GraphicsGroup[{EdgeForm[Black], FaceForm[colourf[value]], poly}]

Graphics[{element @@@ Transpose[regionNames /. {data, polygons}]}]

看起来像

Mathematica graphics

答案 1 :(得分:6)

在现有地图图像上使用某些图像处理怎么样?这只是一个原型工作流程。从Wolfram] Alpha和Mathematica中的图像处理集成的数据有很多东西需要探讨。你可以更详细地玩这些。我没有真正尝试使用人口数据并相应地为地图着色,但我认为这是可能的。函数MorphologicalComponents [...]检测边界之间的状态区域并对其进行索引。

map = WolframAlpha["Illinois", {{"Location:USStateData", 1}, "Image"}]

enter image description here

bmap = Binarize[map, .7]

enter image description here

dmap = ColorNegate@Dilation[ColorNegate@bmap, .75]

enter image description here

MorphologicalComponents[dmap] // Colorize

enter image description here

答案 2 :(得分:0)

概述状态的另一个选项从使用GeoGraphics功能开始:

GeoGraphics[
{
EdgeForm[Black],
Polygon[CountryData["UnitedStates", "AdministrativeDivisions"]]
}
GeoBackground -> None,
GeoProjection -> "Mercator"
]

enter image description here