Карта Северной Америки Mathematica - PullRequest
8 голосов
/ 22 января 2012

Как бы вы отобразили такую ​​карту в 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 ]

11 голосов
/ 23 января 2012

Вы можете использовать файлы .kml или .kmz, чтобы получить список штатов / провинций и полигонов для их контуров.Например, для США вы можете использовать этот файл .Чтобы извлечь полигоны, вы можете сделать что-то вроде этого

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 - это просто вспомогательная функция для получения PlacemarkNames из файла .kml в нужном формате (в данном случае «(год)» удаляется из конца имен).

Используя эти полигоны, вы можете затем использовать 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

6 голосов
/ 22 января 2012

Как насчет использования некоторой обработки изображений на существующих изображениях карты? Это всего лишь прототип рабочего процесса. Есть много вещей, которые нужно изучить с помощью интегрированных данных 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

0 голосов
/ 18 июня 2015

Еще один вариант выделения состояний начинается с использования функции GeoGraphics:

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

enter image description here

...