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

import kml file and update a table in a mysql database using laravel

我有一个看起来像 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 并使用与 table 相同的 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' ....];
}

有两种方法

  1. 您可以将文件保存在物理位置并且 在 db
  2. 中有引用
  3. 您可以根据文件大小使用 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。解析文件然后更新结构化数据

使用 SimpleXML or xml_parse 函数解析 xml 数据,然后处理解析后的数据。

首先,将文件提供给 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 是 well-formed XML.