rvkulikov/geophp

GeoPHP 是一个开源的本地 PHP 库,用于进行几何运算。它完全用 PHP 编写,因此可以在共享主机上运行。它可以读取和写入各种格式:WKT(包括 EWKT)、WKB(包括 EWKB)、GeoJSON、KML、GPX、GeoRSS)。它与所有 Simple-Feature 地理

1.2 2014-12-02 06:11 UTC

This package is auto-updated.

Last update: 2024-09-07 05:32:06 UTC


README

geophp.net

GeoPHP 项目表示,他们打算将项目限制在纯几何数据上。换句话说,没有像 GPX 文件中可能找到的特征数据。

GeoPHPwithFeatures 是一个流行的 GeoPHP 项目的分支,它向几何体添加特征元数据。

这个分支的主要目的是添加对 GPX 文件特征数据的支持,并将其转换为 GeoJSON,使处理您在 GPS 生成的 GPX 文件中可能找到的特征数据并在此 LeafLet 地图上渲染变得更容易。我需要这个功能来更新我网站上地图的下一版本:miles-by-motorcycle.com

其他适配器(KML 等)在写作时简单地忽略了元数据。

带有扩展名的 GPX 文件可以读取和写入。它们还可以转换为 GeoJSON 格式,其中带有元数据的几何体转换为具有属性属性的 GeoJSON Features 对象,该属性属性包含 GPX 元数据扩展的逐字复制。GeoJSON 规范对属性属性的格式没有意见,因此我选择简单地模仿 GPX 文件中找到的元数据结构,保留所有扩展名相同(例如,Garmin 的 gpxx:RouteExtension、gpxx:WaypointExtension 等。)

请注意

  • 在顶级 FeaturesCollection 中包含了一个属性属性,违反了标准。
  • 在 LineString 点类型中包含了一个元数据对象,用于表示海拔、时间和其他元数据(来自 GPX 文件),也违反了标准。
  • 给定 trk 中的 GPX trkseg 被合并为单个 trkseg。

例如,请参阅 tests/input/gpx 和 tests/input/json 目录中由 Garmin Zumo 550 生成的 GPX 文件转换为 GeoJSON 的示例。

包含了一个简单的命令行工具 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 项目。

唯一的公共更改是在所有几何构造函数中添加了一个额外的“元数据”参数,以及 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函数集,如并集、IsWithin、Touch等。这意味着应用程序获得了一组在所有环境中工作的有用“核心”几何运算,以及具有GEOS安装环境的“扩展”操作集。

请参阅下面的“入门”部分,以了解geoPHP能做什么的所有参考资料和示例。

该项目目前正在寻找共同维护者。如果您认为您可以帮助,请给我发消息。也欢迎Fork,请发起拉取请求,我将将其合并到主分支。

入门

示例用法

<?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

其他贡献者

此库是开源的,并且根据修改后的BSD许可证和GPLv2双许可。您可以选择使用任一许可证。