yermo / geophpwithfeatures
GeoPHPwithFeatures 是 GeoPHP 库的扩展版本,GeoPHP 是一个用于进行几何运算的开源原生 PHP 库。它完全用 PHP 编写,因此可以在共享主机上运行。它可以读取和写入各种格式:WKT(包括 EWKT)、WKB(包括 EWKB)等。它支持在共享主机上运行。
Requires (Dev)
- phpunit/phpunit: 4.1.*
This package is not auto-updated.
Last update: 2024-09-21 01:22:14 UTC
README
GeoPHP 项目已声明,其项目将仅限于纯几何数据。换句话说,不包括 GPX 文件中可能找到的特征数据。
GeoPHPwithFeatures 是 GeoPHP 流行项目的分支,它为几何添加了特征元数据。
这个分支的主要目的是添加对 GPX 文件特征数据的支持,并将其转换为 GeoJSON,这使得处理在 GPS 生成的 GPX 文件中可能找到的特征数据并在此 LeafLet 地图上渲染变得更加容易。我需要这个功能来构建我网站上地图的下一个版本: miles-by-motorcycle.com
其他适配器(KML 等)在撰写本文时简单地忽略了元数据。
具有扩展名的 GPX 文件可以读取和写入。它们还可以转换为 GeoJSON 格式,其中具有元数据的几何体被转换为具有包含 GPX 元数据扩展的 properties 属性的 GeoJSON Features 对象。GeoJSON 规范对 properties 属性的格式没有意见,因此我选择简单地模仿 GPX 文件中发现的元数据结构,保持所有扩展名相同(例如,Garmin 的 gpxx:RouteExtension,gpxx:WaypointExtension 等)。
请注意
- 在 FeaturesCollection 的顶级包含一个 properties 属性,违反了标准。
- 在 LineString 点类型中包含一个 metadata 对象,用于表示海拔、时间和其他元数据(来自 GPX 文件),也违反了标准。
- 给定 trk 中的 GPX trkseg 合并成一个 trkseg。
有关将 Garmin Zumo 550 生成的 GPX 文件转换为 GeoJSON 的示例,请参阅 tests/input/gpx 和 tests/input/json 目录。
包含了一个简单的命令行工具,bin/geo_convert.php,用于手动转换文件。您可能需要使用 xmllint 和 json_pp 来格式化输出,以便它是可读的。例如尝试
$ cd geoPHPwithFeatures/bin $ php geo_convert.php --input-path=../test/input/gpx/2_test.gpx --input-format=gpx --output-path=test.json --output-format=geojson
有关文档,请参阅 GeoPHP 项目。
唯一公开的变化是向所有几何构造函数添加了额外的 "metadata" 参数,以及 setMetaData() 和 getMetaData()。在所有情况下,它们只是接受一个任意的关联数组。其他所有内容都应该与 GeoPHP 主项目兼容。
软件包
libxerces-c-samples - 用于验证 GPX 文件。请参阅 http://www.topografix.com/gpx_validation.asp(SAXCount)
原始 GeoPHP README
GeoPHP 是一个用于进行几何运算的开源原生 PHP 库。它完全用 PHP 编写,因此可以在共享主机上运行。它可以读取和写入各种格式:WKT(包括 EWKT)、WKB(包括 EWKB)、GeoJSON、KML、GPX 和 GeoRSS。它与所有 Simple-Feature 几何体(点、线字符串、多边形、几何体集合等)一起工作,可用于获取质心、边界框、面积和其他大量有用信息。
geoPHP 还可以方便地包装 GEOS php 扩展,以便应用程序在服务器上安装 GEOS 时获得透明的性能提升。当安装 GEOS 时,geoPHP 也完全符合 OpenGIS® 地理信息实施标准。使用 GEOS,您可以在 PHP 中获得完整的 openGIS 函数,如并集、包含、接触等。这意味着应用程序获得了一组有用的“核心”几何操作,这些操作适用于所有环境,以及一个“扩展”操作集,适用于已安装 GEOS 的环境。
请参阅下方的“入门”部分,了解 geoPHP 可以执行的所有内容的参考和示例。
该项目目前正在寻找共同维护者。如果您认为可以帮助,请给我发消息。分支也欢迎,请提交拉取请求,我将将其合并到主分支。
入门
- 最新稳定版本始终可在以下位置下载: https://phayes.github.io/bin/current/geoPHP/geoPHP.tar.gz
- 阅读 API 参考文档: https://geophp.net/api.html
- 示例
- 将 geoPHP 用作 GIS 格式转换器: http://github.com/phayes/geoPHP/wiki/Example-format-converter
- 其他有趣链接
- 了解 GEOS 集成: https://geophp.net/geos.html
示例用法
<?php include_once('geoPHP.inc'); // Polygon WKT example $polygon = geoPHP::load('POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))','wkt'); $area = $polygon->getArea(); $centroid = $polygon->getCentroid(); $centX = $centroid->getX(); $centY = $centroid->getY(); print "This polygon has an area of ".$area." and a centroid with X=".$centX." and Y=".$centY; // MultiPoint json example print "<br/>"; $json = '{ "type": "MultiPoint", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }'; $multipoint = geoPHP::load($json, 'json'); $multipoint_points = $multipoint->getComponents(); $first_wkt = $multipoint_points[0]->out('wkt'); print "This multipoint has ".$multipoint->numGeometries()." points. The first point has a wkt representation of ".$first_wkt;
=======
更多示例
Well Known Text (WKT) 和 Well Known Binary (WKB) 支持非常适合与 MySQL 或 PostGIS 的空间功能集成。一旦使用 'AsText('geo_field')'
或 'AsBinary('geo_field')'
选择您的数据,您就可以直接将其放入 geoPHP(可以是 wkt 或 wkb,但必须与您从数据库中提取的方式相同)
$geom = geoPHP::load($dbRow,'wkt');
您可以将多个几何形状收集到一起(注意您必须使用 wkt 来做这件事)
$geom = geoPHP::load("GEOMETRYCOLLECTION(".$dbString1.",".$dbString2.")",'wkt');
调用 get components 返回几何形状内部的子几何形状数组。
$geom2 = geoPHP::load("GEOMETRYCOLLECTION(LINESTRING(1 1,5 1,5 5,1 5,1 1),LINESTRING(2 2,2 3,3 3,3 2,2 2))");
$geomComponents = $geom2->getComponents(); //an array of the two linestring geometries
$linestring1 = $geomComponents[0]->getComponents(); //an array of the first linestring's point geometries
$linestring2 = $geomComponents[1]->getComponents();
echo $linestring1[0]->x() . ", " . $linestring1[0]->y(); //outputs '1, 1'
另一种方法是使用 asArray()
方法。使用上面的包含两个线段的几何形状集合,
$geometryArray = $geom2->asArray();
echo $geometryArray[0][0][0] . ", " . $geometryArray[0][0][1]; //outputs '1, 1'
显然,可以进行更复杂的分析。
echo $geom2->envelope()->area();
与 PostGIS 一起工作
geoPHP 通过其 EWKB 适配器与 postGIS 有很好的集成。以下是一个读取和写入 postGIS 几何形状的示例
<?php include_once('geoPHP.inc'); $host = 'localhost'; $database = 'phayes'; $table = 'test'; $column = 'geom'; $user = 'phayes'; $pass = 'supersecret'; $connection = pg_connect("host=$host dbname=$database user=$user password=$pass"); // Working with PostGIS and Extended-WKB // ---------------------------- // Using asBinary and GeomFromWKB in PostGIS $result = pg_fetch_all(pg_query($connection, "SELECT asBinary($column) as geom FROM $table")); foreach ($result as $item) { $wkb = pg_unescape_bytea($item['geom']); // Make sure to unescape the hex blob $geom = geoPHP::load($wkb, 'ewkb'); // We now a full geoPHP Geometry object // Let's insert it back into the database $insert_string = pg_escape_bytea($geom->out('ewkb')); pg_query($connection, "INSERT INTO $table ($column) values (GeomFromWKB('$insert_string'))"); } // Using a direct SELECT and INSERTs in PostGIS without using wrapping functions $result = pg_fetch_all(pg_query($connection, "SELECT $column as geom FROM $table")); foreach ($result as $item) { $wkb = pack('H*',$item['geom']); // Unpacking the hex blob $geom = geoPHP::load($wkb, 'ewkb'); // We now have a geoPHP Geometry // To insert directly into postGIS we need to unpack the WKB $unpacked = unpack('H*', $geom->out('ewkb')); $insert_string = $unpacked[1]; pg_query($connection, "INSERT INTO $table ($column) values ('$insert_string')"); }
致谢
GeoPHPwithFeatures 维护者:Yermo Lamers https://github.com/yermo
GeoPHP 维护者:Patrick Hayes
其他贡献者
- GeoMemes 研究 (http://www.geomemes.com)
- HighWire 压力 (http://www.highwire.org) 和 GeoScienceWorld (http://www.geoscienceworld.org)
- Arnaud Renevier (gisconverter.php) https://github.com/arenevier/gisconverter.php
- Dave Tarc https://github.com/dtarc
- Elliott Hunston (文档) https://github.com/ejh
此库是开源的,并具有双重许可,包括修改后的 BSD 许可证和 GPLv2。您可以选择使用任一许可证。