Переработка КМЗ в Mathematica
Я застрял на конверсии.
У меня есть файл KMZ с некоторыми координатами. Я читаю файл так:
m=Import["~/Desktop/locations.kmz","Data"]
Я получаю что-то вроде этого:
{{LayerName->Point Features,
Geometry->{
Point[{-120.934,49.3321,372}],
Point[{-120.935,49.3275,375}],
Point[{-120.935,49.323,371}]},
Labels->{},LabeledData->{},ExtendedData->{},
PlacemarkNames->{1,2,3},
Overlays->{},NetworkLinks->{}
}}
Я хочу извлечь {x,y,z} из каждой точки, а также имена меток {1,2,3}, связанные с точками. Даже если бы я мог просто получить точки из геометрии ->{}, это было бы хорошо, потому что я мог бы извлечь их в список с помощью List@@@, но я потерял основную часть, где я не могу извлечь геометрию "Правило".
Спасибо за любую помощь,
Рон
4 ответа
Хотя ответ Леонида верен, вы, вероятно, обнаружите, что он не работает с вашим кодом. Причина в том, что выход вашего Import
команда содержит строки, такие как "LayerNames"
, а не символы, такие как LayerNames
, Я загрузил файл KML в свое веб-пространство, чтобы мы могли попробовать это, используя Import
команда. Попробуйте что-то вроде следующего:
in = Import["http://facstaff.unca.edu/mcmcclur/my.kml", "Data"];
pointList = "Geometry" /.
Cases[in, Verbatim[Rule]["Geometry", _], Infinity];
pointList /. Point[stuff_] -> stuff
Опять же, обратите внимание, что "Geometry"
это строка На самом деле, содержание in
выглядеть так (в InputForm
):
{{"LayerName" -> "Waypoints",
"Geometry" -> {Point[{-82.5, 32.5, 0}]},
"Labels" -> {}, "LabeledData" -> {},
"ExtendedData" -> {}, "PlacemarkNames" -> {"asheville"},
"Overlays" -> {}, "NetworkLinks" -> {}}}
Контекст: KML относится к языку разметки замочной скважины. Keyhole была компания, которая разработала инструменты, которые в конечном итоге стали Google Earth, после того как они были приобретены Google. KMZ - это версия KML на молнии.
Упрощение ответов Леонида и Марка, которые, как я полагаю, можно сделать безопасно, состоит в том, чтобы убрать фантазию. Verbatim
построить. То есть:
Первая операция Леонида может быть написана:
Join @@ Cases[expr, (Geometry -> x_) :> (x /. Point -> Sequence), Infinity]
Вторая операция Леонида:
Join @@ Cases[expr, (PlacemarkNames -> x_) :> x, Infinity]
У меня были проблемы с импортом данных Марка, но из того, что я могу догадаться, можно было написать:
pointList = Cases[in, ("Geometry" -> x_) :> x, Infinity, 1]
Я позволю голосам по этому ответу сказать мне, если я прав.
Учитывая ваше выражение
expr = {{LayerName -> Point Features,
Geometry -> {
Point[{-120.934, 49.3321, 372}],
Point[{-120.935, 49.3275, 375}],
Point[{-120.935, 49.323, 371}]},
Labels -> {}, LabeledData -> {}, ExtendedData -> {},
PlacemarkNames -> {1, 2, 3}, Overlays -> {}, NetworkLinks -> {}}}
Это позволит извлечь очки:
In[121]:=
Flatten[Cases[expr, Verbatim[Rule][Geometry, x_] :> (x /. Point -> Sequence),
Infinity], 1]
Out[121]= {{-120.934, 49.3321, 372}, {-120.935, 49.3275,375}, {-120.935, 49.323, 371}}
И это позволит извлечь метки:
In[124]:= Flatten[Cases[expr, Verbatim[Rule][PlacemarkNames, x_] :> x, Infinity], 1]
Out[124]= {1, 2, 3}
Вот более элегантный метод, который использует правила, которые извлекают оба:
In[127]:=
{Geometry, PlacemarkNames} /.Cases[expr, _Rule, Infinity] /. Point -> Sequence
Out[127]=
{{{-120.934, 49.3321, 372}, {-120.935, 49.3275,375}, {-120.935, 49.323, 371}}, {1, 2, 3}}
Как насчет Transpose[{"PlacemarkNames", "Geometry"} /. m[[1]]]
?