private function readGeometry()
    {
        $this->srid      = null;

        try {
            $this->byteOrder = $this->readByteOrder();
            $this->type      = $this->readType();

            if ($this->hasFlag($this->type, self::WKB_FLAG_SRID)) {
                $this->srid = $this->readSrid();
            }

            $this->dimensions = $this->getDimensions($this->type);
            $this->pointSize  = 2 + strlen($this->getDimensionType($this->dimensions));

            $typeName = $this->getTypeName($this->type);

            return array(
                'type'      => $typeName,
                'srid'      => $this->srid,
                'value'     => $this->$typeName(),
                'dimension' => $this->getDimensionType($this->dimensions)
            );
        } catch (ExceptionInterface $e) {
            throw new $e($e->getMessage() . ' at byte ' . $this->reader->getLastPosition(), $e->getCode(), $e->getPrevious());
        }
    }