forked from lino/radar-wp
96 lines
2.3 KiB
PHP
96 lines
2.3 KiB
PHP
<?php
|
|
/**
|
|
* EWKB (Extended Well Known Binary) Adapter
|
|
*/
|
|
class EWKB extends WKB
|
|
{
|
|
|
|
/**
|
|
* Read WKB binary string into geometry objects
|
|
*
|
|
* @param string $wkb An Extended-WKB binary string
|
|
*
|
|
* @return Geometry
|
|
*/
|
|
public function read($wkb, $is_hex_string = FALSE) {
|
|
if ($is_hex_string) {
|
|
$wkb = pack('H*',$wkb);
|
|
}
|
|
|
|
// Open the wkb up in memory so we can examine the SRID
|
|
$mem = fopen('php://memory', 'r+');
|
|
fwrite($mem, $wkb);
|
|
fseek($mem, 0);
|
|
$base_info = unpack("corder/ctype/cz/cm/cs", fread($mem, 5));
|
|
if ($base_info['s']) {
|
|
$srid = current(unpack("Lsrid", fread($mem, 4)));
|
|
}
|
|
else {
|
|
$srid = NULL;
|
|
}
|
|
fclose($mem);
|
|
|
|
// Run the wkb through the normal WKB reader to get the geometry
|
|
$wkb_reader = new WKB();
|
|
$geom = $wkb_reader->read($wkb);
|
|
|
|
// If there is an SRID, add it to the geometry
|
|
if ($srid) {
|
|
$geom->setSRID($srid);
|
|
}
|
|
|
|
return $geom;
|
|
}
|
|
|
|
/**
|
|
* Serialize geometries into an EWKB binary string.
|
|
*
|
|
* @param Geometry $geometry
|
|
*
|
|
* @return string The Extended-WKB binary string representation of the input geometries
|
|
*/
|
|
public function write(Geometry $geometry, $write_as_hex = FALSE) {
|
|
// We always write into NDR (little endian)
|
|
$wkb = pack('c',1);
|
|
|
|
switch ($geometry->getGeomType()) {
|
|
case 'Point';
|
|
$wkb .= pack('L',1);
|
|
$wkb .= $this->writePoint($geometry);
|
|
break;
|
|
case 'LineString';
|
|
$wkb .= pack('L',2);
|
|
$wkb .= $this->writeLineString($geometry);
|
|
break;
|
|
case 'Polygon';
|
|
$wkb .= pack('L',3);
|
|
$wkb .= $this->writePolygon($geometry);
|
|
break;
|
|
case 'MultiPoint';
|
|
$wkb .= pack('L',4);
|
|
$wkb .= $this->writeMulti($geometry);
|
|
break;
|
|
case 'MultiLineString';
|
|
$wkb .= pack('L',5);
|
|
$wkb .= $this->writeMulti($geometry);
|
|
break;
|
|
case 'MultiPolygon';
|
|
$wkb .= pack('L',6);
|
|
$wkb .= $this->writeMulti($geometry);
|
|
break;
|
|
case 'GeometryCollection';
|
|
$wkb .= pack('L',7);
|
|
$wkb .= $this->writeMulti($geometry);
|
|
break;
|
|
}
|
|
|
|
if ($write_as_hex) {
|
|
$unpacked = unpack('H*',$wkb);
|
|
return $unpacked[1];
|
|
}
|
|
else {
|
|
return $wkb;
|
|
}
|
|
}
|
|
|
|
}
|