static function readRecordMultiPointZ(&$fp, $options = null) { $data = ShapeFile::readBoundingBox($fp); $data["numparts"] = ShapeFile::readAndUnpack("i", fread($fp, 4)); $data["numpoints"] = ShapeFile::readAndUnpack("i", fread($fp, 4)); // $fileX = 40 + (16*$data["numpoints"]); // $fileY = $fileX + 16 + (8*$data["numpoints"]); $fileX = 44 + 4 * $data["numparts"]; $fileY = $fileX + 16 * $data["numpoints"]; $fileZ = $fileY + 16 + 8 * $data["numpoints"]; /* Note: X = 44 + (4 * NumParts), Y = X + (16 * NumPoints), Z = Y + 16 + (8 * NumPoints) */ //_d("PolyLine numparts = ".$data["numparts"]." numpoints = ".$data["numpoints"]); if (isset($options['noparts']) && $options['noparts'] == true) { //Skip the parts $points_initial_index = ftell($fp) + 4 * $data["numparts"]; $points_read = $data["numpoints"]; } else { for ($i = 0; $i < $data["numparts"]; $i++) { $data["parts"][$i] = ShapeFile::readAndUnpack("i", fread($fp, 4)); //_d("PolyLine adding point index= ".$data["parts"][$i]); } $points_initial_index = ftell($fp); //_d("Reading points; initial index = $points_initial_index"); $points_read = 0; foreach ($data["parts"] as $part_index => $point_index) { //fseek($fp, $points_initial_index + $point_index); //_d("Seeking initial index point [".($points_initial_index + $point_index)."]"); if (!isset($data["parts"][$part_index]["points"]) || !is_array($data["parts"][$part_index]["points"])) { $data["parts"][$part_index] = array(); $data["parts"][$part_index]["points"] = array(); } while (!in_array($points_read, $data["parts"]) && $points_read < $data["numpoints"]) { $data["parts"][$part_index]["points"][] = self::readRecordPoint($fp, true); $points_read++; } } $data['Zmin'] = ShapeFile::readAndUnpack("d", fread($fp, 8)); $data['Zmax'] = ShapeFile::readAndUnpack("d", fread($fp, 8)); foreach ($data["parts"] as $part_index => $point_index) { foreach ($point_index["points"] as $n => $p) { $data["parts"][$part_index]['points'][$n] = self::readRecordPointZSP($p, $fp, true); } } $data['Mmin'] = ShapeFile::readAndUnpack("d", fread($fp, 8)); $data['Mmax'] = ShapeFile::readAndUnpack("d", fread($fp, 8)); foreach ($data["parts"] as $part_index => $point_index) { foreach ($point_index["points"] as $n => $p) { $data["parts"][$part_index]['points'][$n] = self::readRecordPointMSP($p, $fp, true); } } } fseek($fp, $points_initial_index + $points_read * XY_POINT_RECORD_LENGTH); //_d("Seeking end of points section [".($points_initial_index + ($points_read * XY_POINT_RECORD_LENGTH))."]"); return $data; }