Шаблоны и стандарты парсинга GPX

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

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

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

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

Спасибо,

Петар


person Petar    schedule 30.11.2011    source источник
comment
возможный дубликат проблем с проверкой схемы GPX   -  person Daniel Haley    schedule 30.11.2011
comment
Я не думаю, что это дубликат. В ветке проблем с проверкой я обсуждал, ПОЧЕМУ файлы gpx не соответствуют схеме gpx. Здесь я обсуждаю, КАК с ними работать. Спасибо   -  person Petar    schedule 30.11.2011


Ответы (2)


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

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

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

person Moe    schedule 26.01.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

ЭТОТ КОД РАБОТАЕТ С НЕСКОЛЬКИМИ ТРЕКАМИ.

person tony gil    schedule 26.01.2012
comment
Спасибо, это очень полезно. - person Petar; 24.10.2013