ArcGIS JS不执行GeometryService切割方法

时间:2014-09-11 20:12:55

标签: arcgis arcgis-js-api

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

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

这是我的代码:

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'

它来自js.arcgis.com服务器上的缩小的ArcGIS 3.9 init.js文件。我已经调试了for循环,用toJson方法检查几何是有效的几何。我试图在这个esri论坛上关注这个例子,该论坛显示了类似的功能:https://geonet.esri.com/thread/63777

另请注意,我只对两种形状进行测试:一种是工业形状,另一种是“不变”。 geometries_to_be_cut是单个几何体的数组,geometry是“无变化”几何体。

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

1 个答案:

答案 0 :(得分:3)

Stepping into the code,我们看到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属性。你可以检查一下吗?

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

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

很抱歉洗衣清单,但希望这里的东西很有用。 : - )