/** * Extracts a {@see \Beluga\GIS\Longitude} instance from defined value and returns it by reference with the * $output parameter. The Method returns TRUE on success, FALSE otherwise. * * @param string|double|float|\SimpleXMLElement|\Beluga\GIS\Longitude|\Beluga\GIS\Coordinate $value * @param \Beluga\GIS\Longitude|null &$output Returns the resulting Longitude reference, if the method returns TRUE * @return boolean */ public static function TryParse($value, &$output) : bool { if (\is_null($value)) { return false; } if ($value instanceof Longitude) { $output = $value; return true; } if ($value instanceof Coordinate) { $output = $value->Longitude; return true; } if (\is_double($value) || \is_float($value)) { $data = AbstractElement::_DecToDDMS($value, true); try { $output = new Longitude($data['DIR'], $data['DEG'], $data['MIN'], $data['SEC']); } catch (\Throwable $ex) { return false; } return true; } $type = new Type($value); if (!$type->hasAssociatedString()) { return false; } return self::TryParseString($type->getStringValue(), $output); }
/** * Writes all data of the defined Value to the XmlWriter. * * You can write it in 3 different ways: * * - <$name type="..." value="..." /> * Is created if $short is boolean TRUE. * * If $short is FALSE you can write in the following 2 ways: * * - <$name type="...">$value</$name> * Is created if $separateElements is boolean FALSE. * - <$name><Type>...</Type><Value>$value</Value></$name> * Is created if $separateElements is boolean TRUE. * * @param \XMLWriter $w The XmlWriter to use. * @param mixed $value The value to write. * @param string $name The name of the element to write * @param boolean $short Use the short notation? (type and value as attributes) * @param boolean $separateElements Write type and value in separate elements, if $short is FALSE */ public static function WriteTypedXmlValue(\XMLWriter $w, $value, string $name, bool $short = true, bool $separateElements = false) { if (!$value instanceof Type) { $value = new Type($value); } $v = null; $t = null; switch ($value->getType()) { case Type::PHP_ARRAY: $v = \serialize($value->getValue()); $t = Type::PHP_ARRAY; break; case Type::PHP_BOOLEAN: $v = $value->getValue() ? 'true' : 'false'; $t = Type::PHP_BOOLEAN; break; case Type::PHP_DOUBLE: case Type::PHP_FLOAT: case Type::PHP_INTEGER: $v = $value->getValue(); $t = $value->getType(); break; case Type::PHP_NULL: $v = ''; $t = Type::PHP_NULL; break; case Type::PHP_RESOURCE: # Ignore some resources break; case Type::PHP_STRING: $v = $value->getValue(); $t = Type::PHP_STRING; break; case Type::PHP_UNKNOWN: $v = $value->getStringValue(); $t = Type::PHP_STRING; break; default: $v = \serialize($value->getValue()); $t = $value->getType(); break; } if (!\is_null($t) && !\is_null($v)) { $w->startElement($name); if ($short) { $w->writeAttribute('type', $t); $w->writeAttribute('value', $v); } else { if ($separateElements) { $w->writeElement('type', $t); $w->writeElement('value', $v); } else { $w->writeAttribute('type', $t); $w->text($v); } } $w->endElement(); } }
/** * Extracts a {@see \Beluga\GIS\Coordinate} instance from defined value and returns it by reference with the * $output parameter. The Method returns TRUE on success, FALSE otherwise. * * @param string|double|float|\Beluga\GIS\Coordinate $value The value to parse. * @param \Beluga\GIS\Coordinate|null &$output Returns the resulting Coordinate reference, if the method returns TRUE * @return boolean */ public static function TryParse($value, &$output) : bool { if (empty($value)) { return false; } if ($value instanceof Coordinate) { $output = $value; return true; } $type = new Type($value); if (!$type->hasAssociatedString()) { return false; } return self::TryParseString($type->getStringValue(), $output); }