UNPKG

jaydata-reso

Version:

Jaydata fork for RESO Web API

369 lines (322 loc) 14.9 kB
/* $data.GeographyBase */ $data.GeographyBase = function GeographyBase() { $data.Geospatial.apply(this, arguments); this.crs = $data.GeographyBase.defaultCrs; $data.GeographyBase.validateGeoJSON(this); }; $data.GeographyBase.defaultCrs = { properties: { name: 'EPSG:4326' }, type: 'name' }; $data.GeographyBase.parseFromString = function (strData) { var lparenIdx = strData.indexOf('('); if(lparenIdx >= 0){ var name = strData.substring(0, lparenIdx).toLowerCase(); var type = $data.GeographyBase.registered[name]; if (type && type.parseFromString && type != $data.GeographyBase) { return type.parseFromString(strData); } else { Guard.raise(new Exception('parseFromString', 'Not Implemented', strData)); } } }; $data.GeographyBase.stringifyToUrl = function (geoData) { if (geoData instanceof $data.GeographyBase && geoData.constructor && geoData.constructor.stringifyToUrl) { return geoData.constructor.stringifyToUrl(geoData); } else if (geoData instanceof $data.GeographyBase && geoData.constructor && Array.isArray(geoData.constructor.validMembers) && geoData.constructor.validMembers[0] === 'coordinates') { var data = "geography'" + geoData.type.toUpperCase() + '('; function buildArray(d, context) { if (Array.isArray(d[0])) { for (var i = 0; i < d.length; i++) { if (i > 0) data += ','; if (Array.isArray(d[i][0])) data += '('; buildArray(d[i]); if (Array.isArray(d[i][0])) data += ')'; } } else { data += d.join(' '); } } buildArray(geoData.coordinates, data); data += ")'"; return data; } else { Guard.raise(new Exception('stringifyToUrl on instance type', 'Not Implemented', geoData)); } }; $data.GeographyBase.registerType = function (name, type, base) { $data.SimpleBase.registerType(name, type, base || $data.GeographyBase); $data.GeographyBase.registered = $data.GeographyBase.registered || {}; $data.GeographyBase.registered[name.toLowerCase()] = type; }; $data.GeographyBase.validateGeoJSON = function (geoData) { var type = geoData.type; if (type) { var geoType = $data.GeographyBase.registered[type.toLowerCase()]; if (typeof geoType.validateGeoJSON === 'function') { var isValid = geoType.validateGeoJSON(geoData); if (isValid) { return isValid; } else { Guard.raise(new Exception("Invalid '" + type + "' format!", 'Format Exception', geoData)); } } } console.log('GeoJSON validation missing', geoData); return; }; $data.SimpleBase.registerType('GeographyBase', $data.GeographyBase, $data.Geospatial); $data.Container.registerType(['$data.GeographyBase'], $data.GeographyBase); /* $data.GeographyPoint */ $data.GeographyPoint = function GeographyPoint(lon, lat) { if (lon && typeof lon === 'object' && Array.isArray(lon)) { $data.GeographyBase.call(this, { coordinates: lon }); } else if (lon && typeof lon === 'object' && ('longitude' in lon || 'latitude' in lon)) { $data.GeographyBase.call(this, { coordinates: [lon.longitude, lon.latitude] }); } else if (lon && typeof lon === 'object' && ('lng' in lon || 'lat' in lon)) { $data.GeographyBase.call(this, { coordinates: [lon.lng, lon.lat] }); } else if (lon && typeof lon === 'object') { $data.GeographyBase.call(this, lon); } else { $data.GeographyBase.call(this, { coordinates: [lon || 0, lat || 0] }); } }; $data.GeographyPoint.validateGeoJSON = function (geoData) { return geoData && Array.isArray(geoData.coordinates) && geoData.coordinates.length == 2 && typeof geoData.coordinates[0] === 'number' && typeof geoData.coordinates[1] === 'number'; }; $data.GeographyPoint.parseFromString = function (strData) { var data = strData.substring(strData.indexOf('(') + 1, strData.lastIndexOf(')')); var values = data.split(' '); return new $data.GeographyPoint(parseFloat(values[0]), parseFloat(values[1])); }; $data.GeographyPoint.validMembers = ['coordinates']; $data.GeographyBase.registerType('Point', $data.GeographyPoint); Object.defineProperty($data.GeographyPoint.prototype, 'longitude', { get: function () { return this.coordinates[0]; }, set: function (v) { this.coordinates[0] = v; } }); Object.defineProperty($data.GeographyPoint.prototype, 'latitude', { get: function () { return this.coordinates[1]; }, set: function (v) { this.coordinates[1] = v; } }); $data.Container.registerType(['$data.GeographyPoint', 'GeographyPoint', '$data.Geography', 'Geography', 'geography', 'geo'], $data.GeographyPoint); $data.Geography = $data.GeographyPoint; /* $data.GeographyLineString */ $data.GeographyLineString = function GeographyLineString(data) { if (Array.isArray(data)) { $data.GeographyBase.call(this, { coordinates: data }); } else { $data.GeographyBase.call(this, data); } }; $data.GeographyLineString.validateGeoJSON = function (geoData) { var isValid = geoData && Array.isArray(geoData.coordinates); for (var i = 0; isValid && i < geoData.coordinates.length; i++) { var point = geoData.coordinates[i]; isValid = isValid && Array.isArray(point) && point.length == 2 && typeof point[0] === 'number' && typeof point[1] === 'number'; } return isValid; }; $data.GeographyLineString.validMembers = ['coordinates']; $data.GeographyBase.registerType('LineString', $data.GeographyLineString); $data.Container.registerType(['$data.GeographyLineString', 'GeographyLineString'], $data.GeographyLineString); /* $data.GeographyPolygon */ $data.GeographyPolygon = function GeographyPolygon(data) { if (typeof data === 'object' && (('topLeft' in data && 'bottomRight' in data) || ('topRight' in data && 'bottomLeft' in data))) { var tl, tr, bl, br; if ('topLeft' in data && 'bottomRight' in data) { tl = data.topLeft instanceof $data.GeographyPoint ? data.topLeft : new $data.GeographyPoint(data.topLeft); br = data.bottomRight instanceof $data.GeographyPoint ? data.bottomRight : new $data.GeographyPoint(data.bottomRight); tr = new $data.GeographyPoint([br.coordinates[0], tl.coordinates[1]]); bl = new $data.GeographyPoint([tl.coordinates[0], br.coordinates[1]]); } else { tr = data.topRight instanceof $data.GeographyPoint ? data.topRight : new $data.GeographyPoint(data.topRight); bl = data.bottomLeft instanceof $data.GeographyPoint ? data.bottomLeft : new $data.GeographyPoint(data.bottomLeft); tl = new $data.GeographyPoint([bl.coordinates[0], tr.coordinates[1]]); br = new $data.GeographyPoint([tr.coordinates[0], bl.coordinates[1]]); } var coordinates = []; coordinates.push([].concat(tl.coordinates)); coordinates.push([].concat(tr.coordinates)); coordinates.push([].concat(br.coordinates)); coordinates.push([].concat(bl.coordinates)); coordinates.push([].concat(tl.coordinates)); $data.GeographyBase.call(this, { coordinates: [coordinates] }); }else if (Array.isArray(data)) { $data.GeographyBase.call(this, { coordinates: data }); } else { $data.GeographyBase.call(this, data); } }; $data.GeographyPolygon.validateGeoJSON = function (geoData) { var isValid = geoData && Array.isArray(geoData.coordinates); for (var i = 0; isValid && i < geoData.coordinates.length; i++) { var polygon = geoData.coordinates[i]; var isValid = isValid && Array.isArray(polygon); for (var j = 0; isValid && j < polygon.length; j++) { var point = polygon[j]; isValid = isValid && Array.isArray(point) && point.length == 2 && typeof point[0] === 'number' && typeof point[1] === 'number'; } } return isValid; }; $data.GeographyPolygon.parseFromString = function (strData) { var data = strData.substring(strData.indexOf('(') + 1, strData.lastIndexOf(')')); var rings = data.substring(data.indexOf('(') + 1, data.lastIndexOf(')')).split('),('); var data = []; for (var i = 0; i < rings.length; i++) { var polyPoints = []; var pairs = rings[i].split(','); for (var j = 0; j < pairs.length; j++) { var values = pairs[j].split(' '); polyPoints.push([parseFloat(values[0]), parseFloat(values[1])]); } data.push(polyPoints); } return new $data.GeographyPolygon(data); }; $data.GeographyPolygon.validMembers = ['coordinates']; $data.GeographyBase.registerType('Polygon', $data.GeographyPolygon); $data.Container.registerType(['$data.GeographyPolygon', 'GeographyPolygon'], $data.GeographyPolygon); /* $data.GeographyMultiPoint */ $data.GeographyMultiPoint = function GeographyMultiPoint(data) { if (Array.isArray(data)) { $data.GeographyBase.call(this, { coordinates: data }); } else { $data.GeographyBase.call(this, data); } }; $data.GeographyMultiPoint.validateGeoJSON = function (geoData) { var isValid = geoData && Array.isArray(geoData.coordinates); for (var i = 0; isValid && i < geoData.coordinates.length; i++) { var point = geoData.coordinates[i]; isValid = isValid && Array.isArray(point) && point.length == 2 && typeof point[0] === 'number' && typeof point[1] === 'number'; } return isValid; }; $data.GeographyMultiPoint.validMembers = ['coordinates']; $data.GeographyBase.registerType('MultiPoint', $data.GeographyMultiPoint); $data.Container.registerType(['$data.GeographyMultiPoint', 'GeographyMultiPoint'], $data.GeographyMultiPoint); /* $data.GeographyMultiLineString */ $data.GeographyMultiLineString = function GeographyMultiLineString(data) { if (Array.isArray(data)) { $data.GeographyBase.call(this, { coordinates: data }); } else { $data.GeographyBase.call(this, data); } }; $data.GeographyMultiLineString.validateGeoJSON = function (geoData) { var isValid = geoData && Array.isArray(geoData.coordinates); for (var i = 0; isValid && i < geoData.coordinates.length; i++) { var polygon = geoData.coordinates[i]; var isValid = isValid && Array.isArray(polygon); for (var j = 0; isValid && j < polygon.length; j++) { var point = polygon[j]; isValid = isValid && Array.isArray(point) && point.length == 2 && typeof point[0] === 'number' && typeof point[1] === 'number'; } } return isValid; }; $data.GeographyMultiLineString.validMembers = ['coordinates']; $data.GeographyBase.registerType('MultiLineString', $data.GeographyMultiLineString); $data.Container.registerType(['$data.GeographyMultiLineString', 'GeographyMultiLineString'], $data.GeographyMultiLineString); /* $data.GeographyMultiPolygon */ $data.GeographyMultiPolygon = function GeographyMultiPolygon(data) { if (Array.isArray(data)) { $data.GeographyBase.call(this, { coordinates: data }); } else { $data.GeographyBase.call(this, data); } }; $data.GeographyMultiPolygon.validateGeoJSON = function (geoData) { var isValid = geoData && Array.isArray(geoData.coordinates); for (var k = 0; isValid && k < geoData.coordinates.length; k++) { var polygons = geoData.coordinates[k]; var isValid = isValid && Array.isArray(polygons); for (var i = 0; isValid && i < polygons.length; i++) { var polygon = polygons[i]; var isValid = isValid && Array.isArray(polygon); for (var j = 0; isValid && j < polygon.length; j++) { var point = polygon[j]; isValid = isValid && Array.isArray(point) && point.length == 2 && typeof point[0] === 'number' && typeof point[1] === 'number'; } } } return isValid; }; $data.GeographyMultiPolygon.validMembers = ['coordinates']; $data.GeographyBase.registerType('MultiPolygon', $data.GeographyMultiPolygon); $data.Container.registerType(['$data.GeographyMultiPolygon', 'GeographyMultiPolygon'], $data.GeographyMultiPolygon); /* $data.GeographyCollection */ $data.GeographyCollection = function GeographyCollection(data) { if (Array.isArray(data)) { $data.GeographyBase.call(this, { geometries: data }); } else { $data.GeographyBase.call(this, data); } }; $data.GeographyCollection.validateGeoJSON = function (geoData) { var isValid = geoData && Array.isArray(geoData.geometries); for (var i = 0; isValid && i < geoData.geometries.length; i++) { var geometry = geoData.geometries[i]; try { isValid = isValid && $data.GeographyBase.validateGeoJSON(geometry); } catch (e) { isValid = false; } } return isValid; }; $data.GeographyCollection.validMembers = ['geometries']; $data.GeographyBase.registerType('GeometryCollection', $data.GeographyCollection); $data.Container.registerType(['$data.GeographyCollection', 'GeographyCollection'], $data.GeographyCollection); /* converters */ $data.Container.registerConverter($data.GeographyPoint, $data.Object, function (value) { return value ? new $data.GeographyPoint(value) : value; }); $data.Container.registerConverter($data.GeographyLineString, $data.Object, function (value) { return value ? new $data.GeographyLineString(value) : value; }); $data.Container.registerConverter($data.GeographyPolygon, $data.Object, function (value) { return value ? new $data.GeographyPolygon(value) : value; }); $data.Container.registerConverter($data.GeographyMultiPoint, $data.Object, function (value) { return value ? new $data.GeographyMultiPoint(value) : value; }); $data.Container.registerConverter($data.GeographyMultiLineString, $data.Object, function (value) { return value ? new $data.GeographyMultiLineString(value) : value; }); $data.Container.registerConverter($data.GeographyMultiPolygon, $data.Object, function (value) { return value ? new $data.GeographyMultiPolygon(value) : value; }); $data.Container.registerConverter($data.GeographyCollection, $data.Object, function (value) { return value ? new $data.GeographyCollection(value) : value; });