Point class
class Point extends Geometry { //TODO: z and m mostly unused. More efficient layout? //Using a List<num>, similar to jts? Using decicated subclasses? // /// the x-coordinate. null, if this point [isEmpty] final num x; /// the y-coordinate. null, if this point [isEmpty] final num y; /// the z coordinate. null, if missing final num z; /// the measurement value. null, if missing final num m; /** * Creates an empty point. * * [x], [y], [z], and [m] of an empty point are null. */ Point.empty(): x=null, y=null, z = null, m = null; /** * Creates a point with coordinates [x], [y], and * (optionally) [z]. The point can be a assigned an * optional measurement value [m]. */ Point(this.x, this.y, {this.z, this.m}){ _require(x != null); _require(y != null); } /** * Creates a new point from the WKT string [wkt]. * * Throws a [WKTError] if [wkt] isn't a valid representation of * a [Point]. */ factory Point.wkt(String wkt) { var p = parseWKT(wkt); if (p is! Point) { throw new WKTError("WKT string doesn't represent a Point"); } return p; } /** * Creates a new point from a list of point values. * * [values] is a list with either 2 or 4 elements, otherwise an * [ArgumentError] is thrown. * * * [x,y] - an xy-point. * * [x,y,z,m] - an xy-point with an z- and/or m-coordinate, if * the 3d and/or the 4th element isn't null. * * x and y must be a [num], otherwise an [ArgumentError] is thrown. * z and m must be a [num] or null, otherwise an [ArgumentError] is thrown. */ factory Point.from(List<num> values) { _require(values is List); _require(values.length == 2 && values.length == 4); _require(values.take(2).every((v) => v is num)); _require(values.skip(2).every((v) => v is num || v == null)); var x = values[0]; var y = values[1]; var z = values[2]; var m = values[3]; return new Point(x,y, m:m, z:z); } @override bool get isEmpty => x == null || y == null; @override bool get is3D => z != null; @override bool get isMeasured => m != null; _writeCoordinates(writer, {bool withZ:false, bool withM: false}) { writer ..position(x) ..blank() ..position(y); if (withZ) { writer ..blank() ..position(z); } if (withM) { writer ..blank() ..position(m); } } @override _writeTaggedWKT(writer, {bool withZ: false, bool withM: false}){ writer.write("POINT"); writer.blank(); if (!isEmpty) { writer.ordinateSpecification(withZ: withZ, withM: withM); } if (this.isEmpty) { writer.empty(); } else { writer.lparen(); _writeCoordinates(writer, withZ: is3D, withM: isMeasured); writer.rparen(); } } /** * The boundary of a point is the empty [GeometryCollection]. * * Note: According to the SFS the boundary of a [Point] is the * empty set. Like the Java Topology Suite we reply an empty * [GeometryCollection], not an empty [Point]. */ @override Geometry get boundary => new GeometryCollection.empty(); @override bool get isSimple => true; @override String get geometryType => "Point"; @override int get dimension => 0; @override _Envelope _computeEnvelope() { if (isEmpty) return new _Envelope.empty(); return new _Envelope.collapsed(x, y); } /** * Replies true if the (x,y)-coordinates of this point are * equal to the (x,y)-coordinates of [other]. * * Replies false if [other] is null. */ bool equals2D(Point other) { if (other == null) return false; return x == other.x && y == other.y; } }
Extends
Geometry > Point
Constructors
new Point(num x, num y, {num z, num m}) #
Creates a point with coordinates x, y, and (optionally) z. The point can be a assigned an optional measurement value m.
Point(this.x, this.y, {this.z, this.m}){ _require(x != null); _require(y != null); }
new Point.empty() #
factory Point.from(List<num> values) #
Creates a new point from a list of point values.
values is a list with either 2 or 4 elements, otherwise an
ArgumentError
is thrown.
x,y
- an xy-point.-
x,y,z,m
- an xy-point with an z- and/or m-coordinate, if the 3d and/or the 4th element isn't null.
x and y must be a num
, otherwise an ArgumentError
is thrown.
z and m must be a num
or null, otherwise an ArgumentError
is thrown.
factory Point.from(List<num> values) { _require(values is List); _require(values.length == 2 && values.length == 4); _require(values.take(2).every((v) => v is num)); _require(values.skip(2).every((v) => v is num || v == null)); var x = values[0]; var y = values[1]; var z = values[2]; var m = values[3]; return new Point(x,y, m:m, z:z); }
Properties
final String asText #
A WKT representation of the geometry
@specification(name:"asText()") String get asText { var buffer = new StringBuffer(); var writer = new _WKTWriter(buffer); _writeTaggedWKT(writer, withZ: is3D, withM: isMeasured); return buffer.toString(); }
final Geometry boundary #
The boundary of a point is the empty GeometryCollection.
Note: According to the SFS the boundary of a Point is the empty set. Like the Java Topology Suite we reply an empty GeometryCollection, not an empty Point.
@override Geometry get boundary => new GeometryCollection.empty();
final int dimension #
The inherent dimension of this geometric object, which must be less than or equal to the coordinate dimension. In non-homogeneous collections, this will return the largest topological dimension of the contained objects.
@override int get dimension => 0;
final String geometryType #
Returns the name of the instantiable subtype of Geometry of which this geometric object is an instantiable member. The name of the subtype of Geometry is returned as a string.
@override String get geometryType => "Point";
final bool is3D #
Returns true if this geometric object has z coordinate values.
@override bool get is3D => z != null;
final bool isEmpty #
Returns 1 true if this geometric object is the empty Geometry.
@override bool get isEmpty => x == null || y == null;
final bool isMeasured #
Returns true if this geometric object has m coordinate values.
@override bool get isMeasured => m != null;
final bool isSimple #
Returns true if this geometric object has no anomalous geometric points, such as self intersection or self tangency.
@override bool get isSimple => true;
int get SRID #
Returns the Spatial Reference System ID for this geometric object.
@specification(name:"srid()") int get SRID => _srid;