导入 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' ....];
}
有两种方法
- 您可以将文件保存在物理位置并且
在 db
中有引用
- 您可以根据文件大小使用 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。解析文件然后更新结构化数据
首先,将文件提供给 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.
我有一个看起来像 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' ....];
}
有两种方法
- 您可以将文件保存在物理位置并且 在 db 中有引用
- 您可以根据文件大小使用 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。解析文件然后更新结构化数据
首先,将文件提供给 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.