1. 程式人生 > 其它 >ArcGIS RunTime問題解決>引數無效:幾何圖形必須具有等價的空間引用

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);
        grometries.Add(k);
    }
    Geometry resultGeometry = GeometryEngine.Union(grometries);
    await MyMapView.SetViewpointGeometryAsync(resultGeometry);
}