123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- <?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;
- }
- }
- }
|