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);
}
posted @ 2022-05-25 13:26  槑孒  阅读(400)  评论(0编辑  收藏  举报