ArcGIS RunTime问题解决>参数无效:几何图形必须具有等价的空间引用
如下面代码所示,就是需要实现缩放至全图的功能。
思路:先获取地图上所有图层的图层集合,然后遍历图层集合取并集,最后缩放至这个并集就行了。
private async void ZoomAll(object sender, RoutedEventArgs e)
{
int count = MyMapView.Map.OperationalLayers.Count();
List<Layer> pListFeatures = MyMapView.Map.OperationalLayers.ToList();
List<Geometry> grometries= new List<Geometry>();
foreach (Layer p in pListFeatures) grometries.Add(p.FullExtent);
Geometry resultGeometry = GeometryEngine.Union(grometries);
await MyMapView.SetViewpointGeometryAsync(pListFeatures[0].FullExtent);
}
当点击界面按钮调用此函数时,报错了
Invalid argument: geometries must have equivalent spatial references.
参数无效:几何图形必须具有等价的空间引用。

开始以为难道是有图层的空间参考不一致?就循环遍历了每个图层的参考坐标,发现全部都是一样的,所以就懵了
经过多次尝试,最终大概猜测是参考坐标系与底图不一致,就是一个底图界面不可有多个空间参考,即使是一致。
所以就得经过投影,把每个图层的几何范围矩形投影到与底图一致,就解决了。
大多数几何引擎操作要求所有几何都在同一空间参考中。正如错误所指出的,事实并非如此。在执行任何几何引擎操作之前,可以使用以下代码将geometry2移到与几何1的空间参考匹配的位置(反之亦然)。
关键代码:
if (!geometry1.SpatialReference.IsEqual(geometry2.SpatialReference))
geometry2 = GeometryEngine.Project(geometry2, geometry1.SpatialReference);
//全图
private async void ZoomAll(object sender, RoutedEventArgs e)
{
Console.WriteLine(MyMapView.Map.OperationalLayers.Count());
int count = MyMapView.Map.OperationalLayers.Count();
List<Layer> pListFeatures = MyMapView.Map.OperationalLayers.ToList();
List<Geometry> grometries= new List<Geometry>();
Geometry k = null;
for (int i = 0; i < count; i++)
{
if (!pListFeatures[i].SpatialReference.IsEqual(MyMapView.SpatialReference))
{
k = GeometryEngine.Project(pListFeatures[i].FullExtent, MyMapView.SpatialReference);
}
else
{
k = pListFeatures[i].FullExtent;
}
grometries.Add(k);
}
Geometry resultGeometry = GeometryEngine.Union(grometries);
await MyMapView.SetViewpointGeometryAsync(resultGeometry);
}

浙公网安备 33010602011771号