170 lines
4.7 KiB
JavaScript
170 lines
4.7 KiB
JavaScript
module.exports = GeometryCollection;
|
|
|
|
var util = require('util');
|
|
|
|
var Types = require('./types');
|
|
var Geometry = require('./geometry');
|
|
var BinaryWriter = require('./binarywriter');
|
|
|
|
function GeometryCollection(geometries, srid) {
|
|
Geometry.call(this);
|
|
|
|
this.geometries = geometries || [];
|
|
this.srid = srid;
|
|
|
|
if (this.geometries.length > 0) {
|
|
this.hasZ = this.geometries[0].hasZ;
|
|
this.hasM = this.geometries[0].hasM;
|
|
}
|
|
}
|
|
|
|
util.inherits(GeometryCollection, Geometry);
|
|
|
|
GeometryCollection.Z = function (geometries, srid) {
|
|
var geometryCollection = new GeometryCollection(geometries, srid);
|
|
geometryCollection.hasZ = true;
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection.M = function (geometries, srid) {
|
|
var geometryCollection = new GeometryCollection(geometries, srid);
|
|
geometryCollection.hasM = true;
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection.ZM = function (geometries, srid) {
|
|
var geometryCollection = new GeometryCollection(geometries, srid);
|
|
geometryCollection.hasZ = true;
|
|
geometryCollection.hasM = true;
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection._parseWkt = function (value, options) {
|
|
var geometryCollection = new GeometryCollection();
|
|
geometryCollection.srid = options.srid;
|
|
geometryCollection.hasZ = options.hasZ;
|
|
geometryCollection.hasM = options.hasM;
|
|
|
|
if (value.isMatch(['EMPTY']))
|
|
return geometryCollection;
|
|
|
|
value.expectGroupStart();
|
|
|
|
do {
|
|
geometryCollection.geometries.push(Geometry.parse(value));
|
|
} while (value.isMatch([',']));
|
|
|
|
value.expectGroupEnd();
|
|
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection._parseWkb = function (value, options) {
|
|
var geometryCollection = new GeometryCollection();
|
|
geometryCollection.srid = options.srid;
|
|
geometryCollection.hasZ = options.hasZ;
|
|
geometryCollection.hasM = options.hasM;
|
|
|
|
var geometryCount = value.readUInt32();
|
|
|
|
for (var i = 0; i < geometryCount; i++)
|
|
geometryCollection.geometries.push(Geometry.parse(value, options));
|
|
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection._parseTwkb = function (value, options) {
|
|
var geometryCollection = new GeometryCollection();
|
|
geometryCollection.hasZ = options.hasZ;
|
|
geometryCollection.hasM = options.hasM;
|
|
|
|
if (options.isEmpty)
|
|
return geometryCollection;
|
|
|
|
var geometryCount = value.readVarInt();
|
|
|
|
for (var i = 0; i < geometryCount; i++)
|
|
geometryCollection.geometries.push(Geometry.parseTwkb(value));
|
|
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection._parseGeoJSON = function (value) {
|
|
var geometryCollection = new GeometryCollection();
|
|
|
|
for (var i = 0; i < value.geometries.length; i++)
|
|
geometryCollection.geometries.push(Geometry._parseGeoJSON(value.geometries[i], true));
|
|
|
|
if (geometryCollection.geometries.length > 0)
|
|
geometryCollection.hasZ = geometryCollection.geometries[0].hasZ;
|
|
|
|
return geometryCollection;
|
|
};
|
|
|
|
GeometryCollection.prototype.toWkt = function () {
|
|
if (this.geometries.length === 0)
|
|
return this._getWktType(Types.wkt.GeometryCollection, true);
|
|
|
|
var wkt = this._getWktType(Types.wkt.GeometryCollection, false) + '(';
|
|
|
|
for (var i = 0; i < this.geometries.length; i++)
|
|
wkt += this.geometries[i].toWkt() + ',';
|
|
|
|
wkt = wkt.slice(0, -1);
|
|
wkt += ')';
|
|
|
|
return wkt;
|
|
};
|
|
|
|
GeometryCollection.prototype.toWkb = function () {
|
|
var wkb = new BinaryWriter(this._getWkbSize());
|
|
|
|
wkb.writeInt8(1);
|
|
|
|
this._writeWkbType(wkb, Types.wkb.GeometryCollection);
|
|
wkb.writeUInt32LE(this.geometries.length);
|
|
|
|
for (var i = 0; i < this.geometries.length; i++)
|
|
wkb.writeBuffer(this.geometries[i].toWkb({ srid: this.srid }));
|
|
|
|
return wkb.buffer;
|
|
};
|
|
|
|
GeometryCollection.prototype.toTwkb = function () {
|
|
var twkb = new BinaryWriter(0, true);
|
|
|
|
var precision = Geometry.getTwkbPrecision(5, 0, 0);
|
|
var isEmpty = this.geometries.length === 0;
|
|
|
|
this._writeTwkbHeader(twkb, Types.wkb.GeometryCollection, precision, isEmpty);
|
|
|
|
if (this.geometries.length > 0) {
|
|
twkb.writeVarInt(this.geometries.length);
|
|
|
|
for (var i = 0; i < this.geometries.length; i++)
|
|
twkb.writeBuffer(this.geometries[i].toTwkb());
|
|
}
|
|
|
|
return twkb.buffer;
|
|
};
|
|
|
|
GeometryCollection.prototype._getWkbSize = function () {
|
|
var size = 1 + 4 + 4;
|
|
|
|
for (var i = 0; i < this.geometries.length; i++)
|
|
size += this.geometries[i]._getWkbSize();
|
|
|
|
return size;
|
|
};
|
|
|
|
GeometryCollection.prototype.toGeoJSON = function (options) {
|
|
var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
|
|
geoJSON.type = Types.geoJSON.GeometryCollection;
|
|
geoJSON.geometries = [];
|
|
|
|
for (var i = 0; i < this.geometries.length; i++)
|
|
geoJSON.geometries.push(this.geometries[i].toGeoJSON());
|
|
|
|
return geoJSON;
|
|
};
|