我有一个应用程序,用户可以在地图上绘制一个形状以指示潜在的土地使用,他们还可以绘制一个形状来指示“无变化”区域,我们想要指出没有开发计划。
基本上,他们可以创建一个表示工业区的形状,然后他们可以绘制一个重叠的形状,基本上切除工业区,并将该区域指定为无开发区。
这是我的代码:
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
是“无变化”几何体。
看起来这应该是一个简单的功能。我不确定我哪里出错了,并且认为有人可能会对此有所了解。
答案 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
将按切割折线分割输入多边形,返回新的分割多边形。根据您的描述,听起来difference
或intersect
会更接近您的需求。但也许我误解了你想做什么。
很抱歉洗衣清单,但希望这里的东西很有用。 : - )