ArcGIS RunTime問題解決>引數無效:幾何圖形必須具有等價的空間引用
阿新 • • 發佈:2022-05-25
如下面程式碼所示,就是需要實現縮放至全圖
的功能。
思路:先獲取地圖上所有圖層的圖層集合,然後遍歷圖層集合取並集,最後縮放至這個並集就行了。
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); }