使用laravel导入kml文件并更新mysql数据库中的表

问题描述

我有一个看起来像XML的KML文件,我需要上传文件并更新MysqL数据库。数据就是这样。

<Document>
    <name>GPSWaypoints-2020-10-16.kml</name>
    <Style id="inline">
        <Linestyle>
            <color>ff0000ff</color>
            <width>2</width>
        </Linestyle>
    </Style>
    <Style id="waypoint">
        <IconStyle>
            <Icon><href>http://maps.google.com/mapfiles/kml/pal4/icon61.png</href></Icon>
        </IconStyle>
    </Style>
    <Folder>
        <name>Waypoints</name>
        <open>1</open>
        <Placemark>
            <name>WPT 0011</name>
            <TimeStamp><when>2020-09-26T08:21:14Z</when></TimeStamp>
            <styleUrl>#waypoint</styleUrl>
            <Point><coordinates>-74.91270224,10.8081995</coordinates></Point>
            <ExtendedData>
                <Data name="accuracy">
                    <displayName>Accuracy</displayName>
                    <value>3.216</value>
                </Data>
                <Data name="provider">
                    <displayName>Provider</displayName>
                    <value>gps</value>
                </Data>
            </ExtendedData>
        </Placemark>
    </Folder>
</Document>
</kml>

我有这种方法可以导入KML文件

public function uploadKML(Request $request)
    {
            $file      = $request->file('kml');
            $filename  = $file->getClientOriginalName();
            $filename  = time() . "." . $request->kml->extension();
            $file->move(public_path('kml'),$filename);
            $path = $request->image->store('public');
            return response()->json(["message" => "Upload Success"]);      
    }

现在上传后有了文件,我需要阅读KML并使用表的相同ID更新坐标。该ID在KML的名称字段中。例如,在字段<name> WPT 0011 </name>中,ID为0011,而没有WPT。

我当前拥有的更新方法

public function update(Request $request,$id)
    {
        $data= Data::findOrFail($id);
        return $data->update($request->all());
    }

这是我的数据模型

<?PHP


class Data extends Model
{
    protected $fillable = ['id','coordinates' ....];
}

解决方法

首先,将文件提供给XML解析器(如SimpleXML)。

然后,将所需的信息从XML文件解析为一个变量(XML元素数组)。

然后,使用数组元素的内容使用SQL更新数据库。

像这样的事情,对于每个KML文件一个ID和几个坐标(未经测试,只要输入一下就可以给你一个主意,因为我这样做很久了):

<?php
// Connect to database here
$KMLFile = "foo.kml";
$xml = simplexml_load_file($KMLFile);
$id = $xml->Document->Folder->Placemark->Name->__toString();
$coordinates = $xml->Document->Folder->Placemark->Point->Coordinates;
for ($i = 0; $i < sizeof($coordinates); $i++) {
  $coordinate = $coordinates[$i]->__toString();
  // You should now have an ID and a coordinate as a string;
  // Do what you need to do with the coordinate string
  // and add the result to your database with SQL
}
?>

这很可能无法按书面要求进行,但我希望它能为您提供足够的信息来构建所需的内容。

您还可以使用正则表达式或其他方法从KML文件中解析坐标或所需的任何其他信息,但是“ XML方式”是更明显,更优雅且更可靠的方式。它确实要求您的KML是格式正确的XML。

,

有2种方法

  1. 您可以将文件保存在物理位置,然后 在数据库中有参考
  2. 您可以根据文件大小使用blob数据类型或文本或长文本
,

1。将文件保存到永久存储中。

您可以使用move_uploaded_file功能将文件保存在磁盘中,然后将文件名作为字符串保存在数据库中。

$file = $_FILES["field_name"];
$uploads_dir = "/var/www/public_html/uploads";
$tmp_name = $file["tmp_name"];

// basename() may prevent filesystem traversal attacks;
// further validation/sanitation of the filename may be appropriate
$name = basename($file["name"]);
$upload_name = "$uploads_dir/$name";

move_uploaded_file($tmp_name,$upload_name);

// save file name ($upload_name) in database

2。使用TEXT字段类型将文件内容存储在数据库中。

如果文件较大,我不建议使用此方法。

3。解析文件然后更新结构化数据

使用SimpleXMLxml_parse函数解析xml数据,然后处理解析的数据。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...