($this->MaxX)) {$this->MaxX=$array[1];} if ($array[1]<$this->MinX) $this->MinX=$array[1]; //p1y $Count=16; $data = pack("H16", substr($hexStr,$Index,$Count)); $array=unpack("d",$data); $ret['y'] = $array[1]; $Index+=$Count; if ($array[1]>$this->MaxY) $this->MaxY=$array[1]; if ($array[1]<$this->MinY) $this->MinY=$array[1]; return $ret; } function UnpackPointBin(&$Index, &$binStr){ $ret=array(); //p1x $Count=8; $data = substr($binStr,$Index,$Count); $array=unpack("d",$data); $ret['x'] = $array[1]; $Index+=$Count; if ($array[1]>($this->MaxX)) {$this->MaxX=$array[1];} if ($array[1]<$this->MinX) $this->MinX=$array[1]; //p1y $Count=8; $data = substr($binStr,$Index,$Count); $array=unpack("d",$data); $ret['y'] = $array[1]; $Index+=$Count; if ($array[1]>$this->MaxY) $this->MaxY=$array[1]; if ($array[1]<$this->MinY) $this->MinY=$array[1]; return $ret; } function UnpackLinearRing(&$Index, &$hexStr,$UnPackMethord){ $ret = array(); $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['numPoints']=$array[1]; $Index+=$Count; $ret['points']=array(); for ($index=0;$index<$array[1];$index++){ $ret['points'][]=$this->UnpackPoint($Index,$hexStr); } return $ret; } function UnpackLinearRingBin(&$Index, &$binStr,$UnPackMethord){ $ret = array(); $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['numPoints']=$array[1]; $Index+=$Count; $ret['points']=array(); for ($index=0;$index<$array[1];$index++){ $ret['points'][]=$this->UnpackPointBin($Index,$binStr); } return $ret; } function UnpackWKBPoint(&$Index, &$hexStr){ $ret=array(); //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $ret['point']=$this->UnpackPoint($Index,$hexStr,$UnPackMethord); return $ret; } function UnpackWKBPointBin(&$Index, &$binStr){ $ret=array(); //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $ret['point']=$this->UnpackPointBin($Index,$binStr,$UnPackMethord); return $ret; } function UnpackWKBLineString(&$Index, &$hexStr){ $ret=array(); //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['numPoints']=$array[1]; $Index+=$Count; $ret['points']=array(); for ($index=0;$index<$array[1];$index++){ $ret['points'][]=$this->UnpackPoint($Index,$hexStr); } return $ret; } function UnpackWKBLineStringBin(&$Index, &$binStr){ $ret=array(); //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['numPoints']=$array[1]; $Index+=$Count; $ret['points']=array(); for ($index=0;$index<$array[1];$index++){ $ret['points'][]=$this->UnpackPointBin($Index,$binStr); } return $ret; } function UnpackWKBPolygon(&$Index, &$hexStr){ $ret=array(); //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['numRings']=$array[1]; $Index+=$Count; $ret['rings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['rings'][]=$this->UnpackLinearRing($Index,$hexStr,$UnPackMethord); } return $ret; } function UnpackWKBPolygonBin(&$Index, &$binStr){ $ret=array(); //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['numRings']=$array[1]; $Index+=$Count; $ret['rings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['rings'][]=$this->UnpackLinearRingBin($Index,$binStr,$UnPackMethord); } return $ret; } function UnpackWKBMultiPoint(&$Index, &$hexStr){ $ret=array(); //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbPoints']=$array[1]; $Index+=$Count; $ret['WKBPoints']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBPoints'][]=$this->UnpackWKBPoint($Index,$hexStr); } return $ret; } function UnpackWKBMultiPointBin(&$Index, &$binStr){ $ret=array(); //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbPoints']=$array[1]; $Index+=$Count; $ret['WKBPoints']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBPoints'][]=$this->UnpackWKBPointBin($Index,$binStr); } return $ret; } function UnpackWKBMultiLineString(&$Index, &$hexStr){ $ret=array(); //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbLineStrings']=$array[1]; $Index+=$Count; $ret['WKBLineStrings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBLineStrings'][]=$this->UnpackWKBLineString($Index,$hexStr); } return $ret; } function UnpackWKBMultiLineStringBin(&$Index, &$binStr){ $ret=array(); //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbLineStrings']=$array[1]; $Index+=$Count; $ret['WKBLineStrings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBLineStrings'][]=$this->UnpackWKBLineStringBin($Index,$binStr); } return $ret; } function UnpackWKBMultiPolygon(&$Index, &$hexStr){ $ret=array(); //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbPolygons']=$array[1]; $Index+=$Count; $ret['WKBLineStrings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['wkbPolygons'][]=$this->UnpackWKBPolygon($Index,$hexStr); } return $ret; } function UnpackWKBMultiPolygonBin(&$Index, &$binStr){ $ret=array(); //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbPolygons']=$array[1]; $Index+=$Count; $ret['WKBLineStrings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['wkbPolygons'][]=$this->UnpackWKBPolygonBin($Index,$binStr); } return $ret; } public function UnpackWKBGeometry(&$Index, &$hexStr){ $ret=array(); $Index=0; $this->MaxX=0; $this->MaxY=0; $this->MinX=360; $this->MinY=360; //Big Little? $Count=2; $data = pack("H2", substr($hexStr,$Index,$Count)); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; switch ($array[1]){ case 1://WKBPoint $ret['point']=$this->UnpackPoint($Index,$hexStr); break; case 2://WKBLineString //Point Number? $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['numPoints']=$array[1]; $Index+=$Count; $ret['points']=array(); for ($index=0;$index<$array[1];$index++){ $ret['points'][]=$this->UnpackPoint($Index,$hexStr); } break; case 3://WKBPolygon $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['numRings']=$array[1]; $Index+=$Count; $ret['rings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['rings'][]=$this->UnpackLinearRing($Index,$hexStr); } break; case 4://wkbMultiPoint $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbPoints']=$array[1]; $Index+=$Count; $ret['WKBPoints']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBPoints'][]=$this->UnpackWKBPoint($Index,$hexStr); } break; case 5://WKBMultiLineString $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbLineStrings']=$array[1]; $Index+=$Count; $ret['WKBLineStrings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBLineStrings'][]=$this->UnpackWKBLineString($Index,$hexStr); } break; case 6://wkbMultiPolygon $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbPolygons']=$array[1]; $Index+=$Count; $ret['wkbPolygons']=array(); for ($index=0;$index<$array[1];$index++){ $ret['wkbPolygons'][]=$this->UnpackWKBPolygon($Index,$hexStr); } break; case 7://WKBGeometryCollection $Count=8; $data = pack("H8", substr($hexStr,$Index,$Count)); $array=unpack($UnPackMethord,$data); $ret['num_wkbGeometries']=$array[1]; $Index+=$Count; $ret['wkbGeometries']=array(); for ($index=0;$index<$array[1];$index++){ $ret['wkbGeometries'][]=$this->UnpackWKBGeometry($Index,$hexStr); } break; } return $ret; } public function UnpackWKBGeometryBin(&$Index, &$binStr){ $ret=array(); $this->MaxX=0; $this->MaxY=0; $this->MinX=360; $this->MinY=360; //Big Little? $Count=1; $data = substr($binStr,$Index,$Count); $array=unpack("C",$data); $ret['byteOrder']=$array[1]; $Index+=$Count; //Type? $Count=4; $data = substr($binStr,$Index,$Count); if ($array[1]==0){ $UnPackMethord="N"; } else{ $UnPackMethord="V"; } $array=unpack($UnPackMethord,$data); $ret['wkbType']=$array[1]; $Index+=$Count; switch ($array[1]){ case 1://WKBPoint $ret['point']=$this->UnpackPointBin($Index,$binStr); break; case 2://WKBLineString //Point Number? $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['numPoints']=$array[1]; $Index+=$Count; $ret['points']=array(); for ($index=0;$index<$array[1];$index++){ $ret['points'][]=$this->UnpackPointBin($Index,$binStr); } break; case 3://WKBPolygon $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['numRings']=$array[1]; $Index+=$Count; $ret['rings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['rings'][]=$this->UnpackLinearRingBin($Index,$binStr,$UnPackMethord); } break; case 4://wkbMultiPoint $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbPoints']=$array[1]; $Index+=$Count; $ret['WKBPoints']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBPoints'][]=$this->UnpackWKBPointBin($Index,$binStr); } break; case 5://WKBMultiLineString $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbLineStrings']=$array[1]; $Index+=$Count; $ret['WKBLineStrings']=array(); for ($index=0;$index<$array[1];$index++){ $ret['WKBLineStrings'][]=$this->UnpackWKBLineStringBin($Index,$binStr); } break; case 6://wkbMultiPolygon $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbPolygons']=$array[1]; $Index+=$Count; $ret['wkbPolygons']=array(); for ($index=0;$index<$array[1];$index++){ $ret['wkbPolygons'][]=$this->UnpackWKBPolygonBin($Index,$binStr); } break; case 7://WKBGeometryCollection $Count=4; $data = substr($binStr,$Index,$Count); $array=unpack($UnPackMethord,$data); $ret['num_wkbGeometries']=$array[1]; $Index+=$Count; $ret['wkbGeometries']=array(); for ($index=0;$index<$array[1];$index++){ $ret['wkbGeometries'][]=$this->UnpackWKBGeometryBin($Index,$binStr); } break; } return $ret; } } ?>