1

我有一个应用程序,用户可以在地图上绘制一个形状来指示潜在的土地利用,他们还可以绘制一个形状来指示“无变化”区域,我们希望在该区域中指示没有开发计划。

基本上,他们可以创建一个形状来指示一个工业区,然后他们可以绘制一个重叠的形状来基本上切掉那个工业区,并将该区指定为非开发区。

这是我的代码:

function cutOutNoChangeZone () {
    var geometries = land_use_planning.graphics,
        geometries_to_be_cut,
        geoService = new esri.tasks.GeometryService("http://gis.website.com/ArcGIS/rest/services/Geometry/GeometryServer");

    for (var i = 0, len = geometries.length; i < len; i++) {
        var geometry = geometries[i];
        if (geometry.planning_type === 'no_change') {
            // cut ALL polygons that are under the no change zone
            geometries_to_be_cut = geometries.slice(0, i);
            // NEXT LINE THROWS ERROR
            geoService.cut(geometries_to_be_cut, geometry);
        }
    }
}

它在控制台中引发错误:

TypeError:无法读取未定义的属性“toJson”

它来自init.jsjs.arcgis.com 服务器上缩小的 ArcGIS 3.9 文件。我已经使用toJson方法调试了 for 循环以检查几何是否是有效的几何。我试图按照这个 esri 论坛上的示例进行操作,它显示了类似的功能:https ://geonet.esri.com/thread/63777 。

另请注意,我仅在两种形状上进行测试:一种是工业形状,另一种是重叠的“不变”。 geometries_to_be_cut是单个几何体的数组,并且geometry是“不变”几何体。

看起来这应该是一个简单的功能。我不确定我哪里出错了,并认为有人可能对此有所了解。

4

1 回答 1

3

进入代码,我们看到 cut 方法调用toJson()了几个不同的对象:

cut: function(a, c, f, g) {
    var e = a[0].spatialReference, p = l.map(a, function(a) {
        return a.toJson()
    });
    a = k.mixin({}, this._url.query, {f: "json",sr: n.toJson(e.toJson()),target: n.toJson({geometryType: u.getJsonType(a[0]),geometries: p}),cutter: n.toJson(c.toJson())});
    var m = this._cutHandler, s = this._errorHandler, B = new h(b._dfdCanceller);
    B._pendingDfd = d({url: this._url.path + "/cut",content: a,callbackParamName: "callback",
        load: function(a, b) {
            m(a, b, e, f, g, B)
        },error: function(a) {
            s(a, g, B)
        }});
    return B
}

此方法调用toJson()切割几何和列表中第一个几何的空间参考。我怀疑您以某种方式拥有具有未定义spatialReference属性的几何图形。你能检查一下吗?

另一个可能的问题是,根据文档,切割几何必须是折线,而不是多边形。您没有指定使用哪一个,但既然您说“绘制一个形状”,那么切割几何图形可能是一个多边形。我还不能确定,因为只有在服务被调用并返回错误后才会出现该问题,并且由于您的toJson()错误,您还没有调用该服务。

最后,我不确定该cut方法是否满足您的需求。如果你让它工作,cut将通过切割折线分割输入多边形,返回新的分割多边形。根据您的描述,这听起来像或者differenceintersect接近您的需要。但也许我误解了你想做什么。

对不起,洗衣单,但希望这里的东西是有用的。:-)

于 2014-09-12T13:28:04.437 回答