162 lines
4.8 KiB
PHP
162 lines
4.8 KiB
PHP
<?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 array
|
|
* @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++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
?>
|