Переработка КМЗ в Mathematica - PullRequest
4 голосов
/ 02 июня 2011

Я застрял на конверсии.

У меня есть файл 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 ]

5 голосов
/ 02 июня 2011

Хотя ответ Леонида верен, вы, вероятно, обнаружите, что он не работает с вашим кодом.Причина в том, что выходные данные вашей команды 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 на молнии.

4 голосов
/ 02 июня 2011

Упрощение ответов Леонида и Марка, которое, я считаю, можно сделать безопасно, - это удаление причудливой конструкции 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]

Я позволю голосам по этому ответу сказать мне, если я прав.

3 голосов
/ 02 июня 2011

Учитывая ваше выражение

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}}
0 голосов
/ 04 июня 2011

Как насчет Transpose[{"PlacemarkNames", "Geometry"} /. m[[1]]]?

...