Переработка КМЗ в 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]]]?

Другие вопросы по тегам