php 导入KML文件并使用Laravel更新MySQL数据库中的表

q3qa4bjr  于 2022-12-28  发布在  PHP
关注(0)|答案(3)|浏览(128)

我有一个KML文件,看起来像XML。我需要上传这个文件并更新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>中,如果不带WPT,ID将为0011。
我目前使用的更新方法是:

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

这是我的数据模型:

<?php

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

dtcbnfnu1#

首先,将文件交给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。

e5nszbig

e5nszbig2#

有两种方法
1.您可以将文件保存在物理位置并在数据库中引用
1.您可以根据文件大小使用blob数据类型、文本或长文本

zed5wv10

zed5wv103#

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数据,然后处理解析后的数据。

相关问题