170 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| 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;
 | |
| };
 |