Разобрать файл KML с помощью PHP

Есть ли способ проанализировать файл *.kml карт Google с помощью simple_xml_load_file("*.kml") ?

Мне нужно сохранить в моей базе данных имя и координаты каждого полигона, зарегистрированного в моем файле KML. В моем PHP-скрипте simple_xml_load_file("*.kml") возвращает false, поэтому я не могу его прочитать.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
    <Document>
        <Schema>
        ...
        </Schema>
        <Style id="FEATURES">
        ...
        </Style>
        <Folder>
            <Placemark>
                <name>
                    name
                </name>
                <Polygon>
                    <LinearRing>
                        <coordinates>
                            coordinates
                        </coordinates>
                    </LinearRing>
                </Polygon>
            </Placemark>
            <Placemark>
                ...
            </Placemark>
        </Folder>
    </Document>
</kml>

Мне нужны значения «имя» и «координаты» для каждой «метки».


person jbrtrnd    schedule 01.12.2011    source источник
comment
Здравствуйте, новичок, вы должны включить несколько примеров узлов из вашего .kml. Ожидаемые результаты .. и т.д. и т.д.   -  person ajreal    schedule 01.12.2011


Ответы (3)


Первая строка:

<?xml version="1.0" encoding="UTF-8"?>

Сообщает PHP, что это документ, закодированный в UTF-8, но ваша ошибка говорит, что он не закодирован как UTF-8. Это документ, который вы создали в текстовом редакторе? Если это так, вы обычно можете использовать свой редактор, чтобы сохранить его в UTF-8. Или вы, вероятно, можете использовать PHP для определения кодировки и изменения этой первой строки.

person Mano Marks    schedule 06.12.2011
comment
Правильно спасибо. Файл, который я пытаюсь загрузить, не был сохранен в UTF-8. Я только что пересохранил его в текстовом редакторе, и он отлично работает! Есть ли способ принудительно использовать кодировку UTF-8 для загрузки файла? - person jbrtrnd; 07.12.2011
comment
Зависит от вашего текстового редактора, я бы посмотрел в настройках. Или вы можете написать сценарий, который будет читать входной файл и создавать выходной файл в кодировке UTF-8. PHP имеет следующую функцию: php.net/manual/en/function.utf8- encode.php Или вы узнаете, что такое кодировка, и используете ее в заголовке XML вместо UTF-8. - person Mano Marks; 08.12.2011
comment
Это то, что я сделал. Сначала я конвертирую свой файл в строку с помощью $str = file_gets_content($file) и загружаю его с помощью simplexml_laod_string(utf8_encode($str)); .. и это работает :) ! - person jbrtrnd; 09.12.2011

The xml structure is exactly that xml you sent:

For example:

<Document>
<Placemark>
      <name>356HH</name>
      <description>
</description>
      <Polygon><outerBoundaryIs><LinearRing><coordinates>some cordinates here</coordinates></LinearRing></innerBoundaryIs></Polygon>
  <Style><LineStyle><color>ff0000ff</color></LineStyle>  <PolyStyle><fill>0</fill></PolyStyle></Style>
  </Placemark>
  <Placemark>
</document>

И это мой php-код:

<?php

$completeurl = "2.xml";
$xml = simplexml_load_file($completeurl);

$placemarks = $xml->Document->Placemark;
$con=mysqli_connect("localhost","root","","j3");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

 $query = '';
 $run='';
for ($i = 0; $i < sizeof($placemarks); $i++) {
    $coordinates = $placemarks[$i]->name;
     $cor_d  =  explode(' ', $placemarks[$i]->Polygon->outerBoundaryIs->LinearRing->coordinates);
     $qtmp=array();
     foreach($cor_d as $value){
          $tmp = explode(',',$value);
          $ttmp=$tmp[1];
          $tmp[1]=$tmp[0];
          $tmp[0]=$ttmp; 
          $qtmp[]= '(' . $tmp[0] . ',' .$tmp[1].')';
     }

    $cor_d = json_encode($qtmp);
    $query .='\''.$coordinates.'\', \''.$cor_d.'\'';
    $run .="INSERT INTO jos_rpl_addon_zipinfo (name, boundary) VALUES (".$query." );";

    //echo $run;
    //break;
}
mysqli_query($con,$run);
//echo $run;

mysqli_close($con);
?>
person Sutechksh    schedule 09.04.2013
comment
Большое Вам спасибо. Это не совсем то же самое, но это похоже. Вы экономите мне много времени. - person MrMojoRisin; 13.05.2020

Если структура XML соответствует тому, что вы опубликовали, вы можете попробовать: -

$xml = simplexml_load_file(...);
$childs = $xml->Document->Folder->children();
foreach ($childs as $child)
{
    // child object is same as -> Placemark

}

Пример :-

SimpleXMLElement Object
(
    [name] => 
                    name

    [Polygon] => SimpleXMLElement Object
        (
            [LinearRing] => SimpleXMLElement Object
                (
                    [coordinates] => 
                            coordinates

                )

        )

)
person ajreal    schedule 01.12.2011
comment
Я пытался это сделать, но $xml = simplexml_load_file(...); возвращает false. Итак, я не могу получить $xml-›***. - person jbrtrnd; 01.12.2011
comment
Какую ошибку вы получили? ANd *.xml — недопустимый синтаксис (вы должны специально загрузить один XML и один раз) - person ajreal; 01.12.2011
comment
*.kml предназначен только для того, чтобы не указывать здесь имя моего файла. simple_xml_load_file(my_file) возвращает ложное логическое значение с ошибкой Ввод не является правильным UTF-8, укажите кодировку! Байты: 0xE8 0x72 0x65 0x73 - person jbrtrnd; 01.12.2011
comment
В моем файле KML есть ‹![CDATA[xxxx]]›. Это может быть это? - person jbrtrnd; 01.12.2011
comment
Маловероятно, у вас установлен аккуратный модуль? Если да, посмотрите здесь: - php.net/manual/en/book.tidy .php - person ajreal; 01.12.2011
comment
KML не распознается приборкой. Я думаю, что у моего файла KML есть проблема, потому что он работает с другим более простым. - person jbrtrnd; 01.12.2011
comment
Я имею в виду, что вы устанавливаете источник ввода как XML и устанавливаете источник вывода как XML, записываете в новый XML, а затем анализируете новый XML? - person ajreal; 01.12.2011
comment
У меня есть HTML-форма с <input type="file">, которые загружают мой файл KML, я просто хочу проанализировать его для вставки в мою базу данных координат и имени каждого многоугольника, сохраненного в этом файле. - person jbrtrnd; 01.12.2011
comment
Непростой ответ, пользователь может предоставить неправильный XML или включить некоторые символы UTF. Посмотрите, на что способна Tidy (функция ремонта) - person ajreal; 01.12.2011
comment
Пробовал это, но итерация, кажется, останавливается после чтения первого дочернего элемента структуры XML. :/ - person CookieMonster; 09.09.2015