Шаблоны синтаксического анализа GPX и «стандарты» - PullRequest
3 голосов
/ 30 ноября 2011

Я бы хотел продолжить обсуждение с этого поста: Проблемы проверки схемы GPX . Чтобы перейти непосредственно к делу, я хочу спросить, как люди анализируют и работают с файлами GPX в своем программном обеспечении, или дать мне советы о том, как это следует делать.

Хотя можно сказать, что просто проанализируйте элементы trkpt и используйте их в своем программном обеспечении, для меня все не так просто. Во-первых, как обсуждалось в приведенном выше посте, многие устройства-производители gpx (программное обеспечение, gps-handheld-devices и т. Д.) Создают файлы gpx, которые НЕ соответствуют официальной схеме GPX (элементы выложены в неправильный порядок, типы значений изменены, имена элементов изменены и т. д.). Мой первоначальный урок при запуске синтаксического анализа файлов gpx - это сначала проверить, проверяют ли они соответствие схеме GPX. Многие из них содержат фактические данные GPS (последовательность значений широты / долготы / высоты), но формат, в котором они представлены (хотя они и скрыты под суффиксом GPX), может быть спроектирован в любом случае. Таким образом, файл будет содержать необходимые данные, но не будет соответствовать схеме GPX. Как эта проблема преодолена? Есть ли способ заставить программное обеспечение принимать файлы GPX общего назначения в качестве входных данных?

Во-вторых, я хотел бы отметить, что меня не интересуют различные предложения, которые могут у вас возникнуть (например, сначала предварительно обработать файл GPX, а затем проанализировать его, изменить схему и т. Д.), Как решить проблему. Мне больше интересно, если кто-то знает, как все делается на практике. Поэтому, если кто-либо имеет или имел опыт работы с файлами GPX в (возможно) коммерческой среде, пожалуйста, поделитесь своими мыслями.

Надеюсь, я ясно изложил свои мысли.

Спасибо

Петар

Ответы [ 2 ]

3 голосов
/ 26 января 2012

В своих приложениях я использую обычный синтаксический анализатор XML (например, pythons xml.dom.minidom ). Я просто использую имена тегов для доступа к необходимой мне информации.Как было упомянуто в другом потоке , вещь, которая делает проверку неудачной, - это <xsd:sequence> в стандартном определении GPX.Хотя правда, что устройства, производящие GPX, должны соответствовать стандарту, на самом деле это не так уж важно для анализа (по крайней мере, для файлов / устройств GPX, над которыми я работал).

Если файл GPX содержит дополнительныезатем информация будет отброшена (если только вы не решили извлечь неизвестные вам тэги).

Если этот метод не удался, потому что файл не является пустым XML или GPX использует другие имена тегов, например, для получения дополнительной информациинет другого способа прочитать файл, кроме как написать специальный импортер для этого конкретного случая использования (я не видел таких файлов, кроме поврежденных, в дикой природе)

2 голосов
/ 27 января 2012

Я только что разработал простой парсер gpx, который я использую для очистки треков и путевых точек из файла gpx и сохранения в базе данных.Я удалил весь код БД и оставил скелет.

<?php
include('simple_html_dom.php');

if (file_exists('5alqs3.gpx')) {
    $xml = simplexml_load_file('5alqs3.gpx');
    foreach( $xml->children() AS $child ) {
        $name = $child->getName();
        if ($name == 'wpt') {
            print_r($name.'    ');
            echo $child['lat'].' '.$child['lon'].'  ';
            $name = $child->children()->getName();
            if ($name = 'ele') {
                echo $child->children().'<br/>';
            }
        }
        if ($name == 'trk') {
            foreach( $child->children() AS $grandchild ) {
                $grandname = $grandchild->getName();
                if ($grandname == 'name') {
                    echo $grandchild.'<br/>';
                }
                if ($grandname == 'trkseg') {
                    foreach( $grandchild->children() AS $greatgrandchild ) {
                        $greatgrandname = $greatgrandchild->getName();
                        print_r($greatgrandname.'  ');
                        //echo '<br/>';
                        if ($greatgrandname == 'trkpt') {
                            echo $greatgrandchild['lat'].' '.$greatgrandchild['lon'];
                            foreach( $greatgrandchild->children() AS $elegreatgrandchild ) {
                                echo $elegreatgrandchild.'<br/>';
                            }
                        }
                        if ($greatgrandname == 'ele') {
                            print_r($greatgrandchild);
                        }   
                    }
                }
            }
        } 
    }
} else {
    exit('Failed to open 5alqs2.gpx.');
}                
?>

Вы можете сделать еще один шаг вперед и разобрать kml из этого.проверьте эту ссылку для получения дополнительной информации по этому вопросу. Создание файла kml из базы данных mysql с php

Этот код работает с несколькими треками.

...