从字符串中读取 GeometryCollection

Read a GeometryCollection from a string

在 OpenLayers 3 中,我可以通过 ol.format.GeoJSON() 的实例从 GeoJSON 字符串中读取要素或单个几何图形。 示例:

var parser = new ol.format.GeoJSON();
var arrOfFeatures = parser.readFeatures(geoJsonString);
//or
var usrGeom = parser.readGeometry(geoJsonString);

现在我有一个表示 GeometryCollection 的字符串(不是 MultiPoint、MultiLine 或 MultyPolygon,也不是 FeatureCollection)。

我找不到 readGeometryCollection(GeoJSONstring) 或其他东西的方法,结果是 ol.geom.GeometryCollection 对象。

有人可以帮忙吗?

提前致谢。

好的,解决方案是像任何其他 Openlayers ol.geom.Geometry 一样读取 GeometryCollection,然后循环读取任何单个几何图形,因此:1) 将字符串读入 Geometry 对象,2) 如果 .getType ()是"GeometryCollection"然后循环集合,集合中的forEach(item)读取Geometry.

parseSingleGeometry : function(geometry, callback) {

        switch (geometry.getType()) {
            case 'MultiLineString':
                geometry.getLineStrings().forEach(function (p) {
                    var newFeat = new ol.Feature({ geometry: p });
                    _features.push(newFeat);
                });
                break;
            case 'MultiPolygon':
                geometry.getPolygons().forEach(function (p) {
                    var newFeat = new ol.Feature({ geometry: p });
                    _features.push(newFeat);
                });
                break;
            case 'Polygon':
            case 'LineString':
            case 'Point':
                var newFeat = new ol.Feature({ geometry: geometry });
                _features.push(newFeat);
                delete newFeat;
                break;
            default:
                break;
        }

        if (callback) { callback(); }

    },

    parseGeometryCollection: function(collection, callback) {

        var ciccio = new ol.geom.GeometryCollection();
        //ciccio.getType
        var itemCount = ciccio.getGeometries().length;
        var itemProg = 0;

        ciccio.getGeometries().forEach(function (item) {
            parseSingleGeometry(item, function () {

                itemProg++;
                if (itemProg == itemCount) {
                    if (callback) {
                        callback();
                    }
                }                
            })
        });
    }

[...]

importGeoJson: function (geoJsonString) {

        var parser = new ol.format.GeoJSON();

        var projection = parser.readProjection(geoJsonString);
        var usrProjCode = projection.getCode();

        var convert = false;

        if (usrProjCode != 'EPSG:3857') {
            var msg = "The file provided is in the " + usrProjCode + " projection. The system supports the EPSG:3857 projection only.\n\rWe are converting your geometries in EPSG:3857.\n\rPlease visually check that the added shapes are what your file defines.";
            alert(msg);
            convert = true;
        }

        //if it's a feature or feature collection than I can readFeatures()
        if (geoJsonString.indexOf("Feature") !== -1) {

            console.log("reading feature(s)");

            var arrOfFeatures = parser.readFeatures(geoJsonString);

            arrOfFeatures.forEach(function (item) {

                var usrGeom = item.getGeometry();

                var newGeom = (convert) ? usrGeom.clone().transform(usrProjCode, 'EPSG:3857') : usrGeom;

                if (newGeom.getType() == "GeometryCollection") {
                    _private.parseGeometryCollection(newGeom, function () { /*do something*/ })
                }
                else {
                    _private.parseSingleGeometry(newGeom, function () { /*do something*/ });
                }
            });
        }
        else { //otherwise work with geometries

            var usrGeom = parser.readGeometry(geoJsonString);

            var newGeom = (convert) ? usrGeom.clone().transform(usrProjCode, 'EPSG:3857') : newGeom;

            if (newGeom.getType() == "GeometryCollection") {
                _private.parseGeometryCollection(newGeom, function () { /*do something*/ })
            }
            else {
                _private.parseSingleGeometry(newGeom, function () { /*do something*/ });
            }
        }

    },

_features 是包含地图上显示的要素的 ol.Collection。