123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * This class extends ShapeRecord class to cater the following phpMyAdmin
- * specific requirements.
- *
- * @package PhpMyAdmin-Import
- * @subpackage ESRI_Shape
- */
- if (! defined('PHPMYADMIN')) {
- exit;
- }
- /**
- * 1) To load data from .dbf file only when the dBase extension is available.
- * 2) To use PMA_importGetNextChunk() functionality to read data, rather than
- * reading directly from a file. Using ImportShp::readFromBuffer() in place
- * of fread(). This makes it possible to use compressions.
- *
- * @package PhpMyAdmin-Import
- * @subpackage ESRI_Shape
- */
- class PMA_ShapeRecord extends ShapeRecord
- {
- /**
- * Loads a geometry data record from the file
- *
- * @param object &$SHPFile .shp file
- * @param object &$DBFFile .dbf file
- *
- * @return void
- * @see ShapeRecord::loadFromFile()
- */
- function loadFromFile(&$SHPFile, &$DBFFile)
- {
- $this->DBFFile = $DBFFile;
- $this->_loadHeaders();
- switch ($this->shapeType) {
- case 0:
- $this->_loadNullRecord();
- break;
- case 1:
- $this->_loadPointRecord();
- break;
- case 3:
- $this->_loadPolyLineRecord();
- break;
- case 5:
- $this->_loadPolygonRecord();
- break;
- case 8:
- $this->_loadMultiPointRecord();
- break;
- default:
- $this->setError(
- sprintf(
- __("Geometry type '%s' is not supported by MySQL."),
- $this->shapeType
- )
- );
- break;
- }
- if (extension_loaded('dbase') && isset($this->DBFFile)) {
- $this->_loadDBFData();
- }
- }
- /**
- * Loads metadata from the ESRI shape record header
- *
- * @return void
- * @see ShapeRecord::_loadHeaders()
- */
- function _loadHeaders()
- {
- $this->recordNumber = loadData("N", ImportShp::readFromBuffer(4));
- ImportShp::readFromBuffer(4);
- $this->shapeType = loadData("V", ImportShp::readFromBuffer(4));
- }
- /**
- * Loads data from a point record
- *
- * @return void
- * @see ShapeRecord::_loadPoint()
- */
- function _loadPoint()
- {
- $data = array();
- $data["x"] = loadData("d", ImportShp::readFromBuffer(8));
- $data["y"] = loadData("d", ImportShp::readFromBuffer(8));
- return $data;
- }
- /**
- * Loads data from a multipoint record
- *
- * @return void
- * @see ShapeRecord::_loadMultiPointRecord()
- */
- function _loadMultiPointRecord()
- {
- $this->SHPData = array();
- $this->SHPData["xmin"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["ymin"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["xmax"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["ymax"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["numpoints"] = loadData("V", ImportShp::readFromBuffer(4));
- for ($i = 0; $i <= $this->SHPData["numpoints"]; $i++) {
- $this->SHPData["points"][] = $this->_loadPoint();
- }
- }
- /**
- * Loads data from a polyline record
- *
- * @return void
- * @see ShapeRecord::_loadPolyLineRecord()
- */
- function _loadPolyLineRecord()
- {
- $this->SHPData = array();
- $this->SHPData["xmin"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["ymin"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["xmax"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["ymax"] = loadData("d", ImportShp::readFromBuffer(8));
- $this->SHPData["numparts"] = loadData("V", ImportShp::readFromBuffer(4));
- $this->SHPData["numpoints"] = loadData("V", ImportShp::readFromBuffer(4));
- for ($i = 0; $i < $this->SHPData["numparts"]; $i++) {
- $this->SHPData["parts"][$i] = loadData(
- "V", ImportShp::readFromBuffer(4)
- );
- }
- $readPoints = 0;
- reset($this->SHPData["parts"]);
- while (list($partIndex, $partData) = each($this->SHPData["parts"])) {
- if (! isset($this->SHPData["parts"][$partIndex]["points"])
- || !is_array($this->SHPData["parts"][$partIndex]["points"])
- ) {
- $this->SHPData["parts"][$partIndex] = array();
- $this->SHPData["parts"][$partIndex]["points"] = array();
- }
- while (! in_array($readPoints, $this->SHPData["parts"])
- && ($readPoints < ($this->SHPData["numpoints"]))
- ) {
- $this->SHPData["parts"][$partIndex]["points"][]
- = $this->_loadPoint();
- $readPoints++;
- }
- }
- }
- }
- ?>
|