【问题标题】:import kml file and update a table in a mysql database using laravel使用 laravel 导入 kml 文件并更新 mysql 数据库中的表
【发布时间】:2021-02-02 07:18:29
【问题描述】:

我有一个看起来像 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 的名称字段中。例如,在 &lt;name&gt; WPT 0011 &lt;/name&gt; 字段中,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' ....];
}

【问题讨论】:

  • 根据文件的大小,您可能不想将实际内容保存在数据库中,而是要保存文件位置参考,例如file/location/file.kml。至于阅读它,可能有处理 KML 的库,或者您可以使用 XML 逻辑来加载/解析。你有没有尝试过?
  • 我可以使用哪些库?有什么推荐吗?
  • 我不知道有什么在我头上,对不起。
  • 到目前为止你都干了什么?你被困在哪里了?
  • 我已经保存了 KML 文件,它使用 public_path 公开保存,但我不知道如何打开它并更新已创建的表中的数据。我需要一种方法来读取文件并更新该数据,更具体地说是坐标

标签: php mysql xml laravel kml


【解决方案1】:

首先,将文件提供给 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. 您可以将文件保存在物理位置和 在db中有参考
    2. 您可以根据文件大小使用 blob 数据类型或文本或长文本

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2022-12-31
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        相关资源
        最近更新 更多