OSMDroid绘制网格折线时遇mOptimIntersection异常及线条缺失问题
问题概述
我在OSMDroid的MapView上绘制类似方格纸的等距网格,通过在指定区域绘制横向和纵向等距折线实现,横竖方向各约200条折线。功能可运行但存在以下两个问题:
- 滚动MapView时频繁抛出异常:
error dispatchDraw, probably in edit mode
java.lang.RuntimeException: Impossible mOptimIntersection count (3)
at org.osmdroid.util.SegmentClipper.clip(SegmentClipper.java:173)
at org.osmdroid.util.SegmentClipper.add(SegmentClipper.java:71)
at org.osmdroid.views.overlay.LinearRing.clipAndStore(LinearRing.java:389)
at org.osmdroid.views.overlay.LinearRing.buildLinePortion(LinearRing.java:279)
at org.osmdroid.views.overlay.PolyOverlayWithIW.drawWithLines(PolyOverlayWithIW.java:326)
at org.osmdroid.views.overlay.PolyOverlayWithIW.draw(PolyOverlayWithIW.java:242)
at org.osmdroid.views.overlay.Overlay.draw(Overlay.java:144)
at org.osmdroid.views.overlay.DefaultOverlayManager.onDrawHelper(DefaultOverlayManager.java:179)
at org.osmdroid.views.overlay.DefaultOverlayManager.onDraw(DefaultOverlayManager.java:139)
at org.osmdroid.views.MapView.dispatchDraw(MapView.java:1253)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at androidx.fragment.app.FragmentContainerView.drawChild(FragmentContainerView.kt:235)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at androidx.fragment.app.FragmentContainerView.dispatchDraw(FragmentContainerView.kt:225)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at android.view.View.updateDisplayListIfDirty(View.java:23242)
at android.view.View.draw(View.java:24125)
at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
at com.android.internal.policy.DecorView.dispatchDraw(DecorView.java:1531)
at android.view.View.draw(View.java:24398)
at com.android.internal.policy.DecorView.draw(DecorView.java:1504)
at android.view.View.updateDisplayListIfDirty(View.java:23256)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:753)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:759)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:857)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:5501)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5194)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4356)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2991)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10665)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
at android.view.Choreographer.doCallbacks(Choreographer.java:923)
at android.view.Choreographer.doFrame(Choreographer.java:852)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8741)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
- 滚动结束后,偶尔会出现所有横向或纵向线条消失的情况。
绘制横向线条的代码示例
// 绘制网格的横向线条 var lat = raster.southwest.latitude for (counter in 0 .. raster.n2) { val latPolyline = Polyline(mapView) latPolyline.getOutlinePaint().setARGB(255, 128, 128, 128) latPolyline.outlinePaint.strokeWidth = 1f latPolyline.addPoint(GeoPoint(lat, raster.southwest.longitude)) latPolyline.addPoint(GeoPoint(lat, raster.northeast.longitude)) mapView.overlays.add(latPolyline) latPolylineList.add(latPolyline) lat += raster.dy }
内容的提问来源于stack exchange,提问作者C A

