Fix plan route lags with big gpx files
This commit is contained in:
parent
ffde5da67a
commit
c95dbff43e
1 changed files with 113 additions and 75 deletions
|
@ -12,6 +12,7 @@ import net.osmand.GPXUtilities.WptPt;
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.PointDescription;
|
import net.osmand.data.PointDescription;
|
||||||
|
import net.osmand.data.QuadRect;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
|
@ -178,6 +179,7 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
|
||||||
new Renderable.StandardTrack(new ArrayList<>(after.points), 17.2).
|
new Renderable.StandardTrack(new ArrayList<>(after.points), 17.2).
|
||||||
drawSegment(view.getZoom(), lineAttrs.paint, canvas, tb);
|
drawSegment(view.getZoom(), lineAttrs.paint, canvas, tb);
|
||||||
|
|
||||||
|
drawPoints(canvas, tb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,6 +187,7 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
|
||||||
public void onDraw(Canvas canvas, RotatedTileBox tb, DrawSettings settings) {
|
public void onDraw(Canvas canvas, RotatedTileBox tb, DrawSettings settings) {
|
||||||
if (inMeasurementMode) {
|
if (inMeasurementMode) {
|
||||||
lineAttrs.updatePaints(view.getApplication(), settings, tb);
|
lineAttrs.updatePaints(view.getApplication(), settings, tb);
|
||||||
|
drawBeforeAfterPath(canvas, tb);
|
||||||
|
|
||||||
if (editingCtx.getSelectedPointPosition() == -1) {
|
if (editingCtx.getSelectedPointPosition() == -1) {
|
||||||
drawCenterIcon(canvas, tb, settings.isNightMode());
|
drawCenterIcon(canvas, tb, settings.isNightMode());
|
||||||
|
@ -203,90 +206,115 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TrkSegment before = editingCtx.getBeforeTrkSegmentLine();
|
List<WptPt> beforePoints = editingCtx.getBeforePoints();
|
||||||
TrkSegment after = editingCtx.getAfterTrkSegmentLine();
|
List<WptPt> afterPoints = editingCtx.getAfterPoints();
|
||||||
|
if (beforePoints.size() > 0) {
|
||||||
canvas.rotate(-tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
drawPointIcon(canvas, tb, beforePoints.get(beforePoints.size() - 1));
|
||||||
|
|
||||||
if (before.points.size() > 0 || after.points.size() > 0) {
|
|
||||||
path.reset();
|
|
||||||
tx.clear();
|
|
||||||
ty.clear();
|
|
||||||
|
|
||||||
if (before.points.size() > 0) {
|
|
||||||
WptPt pt = before.points.get(before.points.size() - 1);
|
|
||||||
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
|
||||||
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
|
||||||
tx.add(locX);
|
|
||||||
ty.add(locY);
|
|
||||||
tx.add((float) tb.getCenterPixelX());
|
|
||||||
ty.add((float) tb.getCenterPixelY());
|
|
||||||
}
|
|
||||||
if (after.points.size() > 0) {
|
|
||||||
if (before.points.size() == 0) {
|
|
||||||
tx.add((float) tb.getCenterPixelX());
|
|
||||||
ty.add((float) tb.getCenterPixelY());
|
|
||||||
}
|
|
||||||
WptPt pt = after.points.get(0);
|
|
||||||
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
|
||||||
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
|
||||||
tx.add(locX);
|
|
||||||
ty.add(locY);
|
|
||||||
}
|
|
||||||
|
|
||||||
GeometryWay.calculatePath(tb, tx, ty, path);
|
|
||||||
canvas.drawPath(path, lineAttrs.paint);
|
|
||||||
}
|
}
|
||||||
|
if (afterPoints.size() > 0) {
|
||||||
List<WptPt> points = new ArrayList<>();
|
drawPointIcon(canvas, tb, afterPoints.get(0));
|
||||||
points.addAll(editingCtx.getBeforePoints());
|
|
||||||
points.addAll(editingCtx.getAfterPoints());
|
|
||||||
overlapped = false;
|
|
||||||
int drawn = 0;
|
|
||||||
for (int i = 0; i < points.size(); i++) {
|
|
||||||
WptPt pt = points.get(i);
|
|
||||||
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
|
||||||
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
|
||||||
if (locX >= 0 && locX <= tb.getPixWidth() && locY >= 0 && locY <= tb.getPixHeight()) {
|
|
||||||
drawn++;
|
|
||||||
if (drawn > POINTS_TO_DRAW) {
|
|
||||||
overlapped = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (overlapped) {
|
|
||||||
WptPt pt = points.get(0);
|
|
||||||
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
|
||||||
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
|
||||||
if (locX >= 0 && locX <= tb.getPixWidth() && locY >= 0 && locY <= tb.getPixHeight()) {
|
|
||||||
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
|
||||||
}
|
|
||||||
pt = points.get(points.size() - 1);
|
|
||||||
locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
|
||||||
locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
|
||||||
if (locX >= 0 && locX <= tb.getPixWidth() && locY >= 0 && locY <= tb.getPixHeight()) {
|
|
||||||
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
|
||||||
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < points.size(); i++) {
|
|
||||||
WptPt pt = points.get(i);
|
|
||||||
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
|
||||||
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
|
||||||
if (locX >= 0 && locX <= tb.getPixWidth() && locY >= 0 && locY <= tb.getPixHeight()) {
|
|
||||||
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (editingCtx.getSelectedPointPosition() != -1) {
|
if (editingCtx.getSelectedPointPosition() != -1) {
|
||||||
|
canvas.rotate(-tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
int locX = tb.getCenterPixelX();
|
int locX = tb.getCenterPixelX();
|
||||||
int locY = tb.getCenterPixelY();
|
int locY = tb.getCenterPixelY();
|
||||||
canvas.drawBitmap(applyingPointIcon, locX - marginApplyingPointIconX, locY - marginApplyingPointIconY, bitmapPaint);
|
canvas.drawBitmap(applyingPointIcon, locX - marginApplyingPointIconX, locY - marginApplyingPointIconY, bitmapPaint);
|
||||||
|
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isInTileBox(RotatedTileBox tb, WptPt point) {
|
||||||
|
QuadRect latLonBounds = tb.getLatLonBounds();
|
||||||
|
return point.getLatitude() >= latLonBounds.bottom && point.getLatitude() <= latLonBounds.top
|
||||||
|
&& point.getLongitude() >= latLonBounds.left && point.getLongitude() <= latLonBounds.right;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawPoints(Canvas canvas, RotatedTileBox tb) {
|
||||||
|
canvas.rotate(-tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
|
|
||||||
|
WptPt lastBeforePoint = null;
|
||||||
|
List<WptPt> points = new ArrayList<>(editingCtx.getBeforePoints());
|
||||||
|
if (points.size() > 0) {
|
||||||
|
lastBeforePoint = points.get(points.size() - 1);
|
||||||
|
}
|
||||||
|
WptPt firstAfterPoint = null;
|
||||||
|
List<WptPt> afterPoints = editingCtx.getAfterPoints();
|
||||||
|
if (afterPoints.size() > 0) {
|
||||||
|
firstAfterPoint = afterPoints.get(0);
|
||||||
|
}
|
||||||
|
points.addAll(afterPoints);
|
||||||
|
overlapped = false;
|
||||||
|
int drawn = 0;
|
||||||
|
for (int i = 0; i < points.size(); i++) {
|
||||||
|
WptPt pt = points.get(i);
|
||||||
|
if (tb.containsLatLon(pt.lat, pt.lon)) {
|
||||||
|
drawn++;
|
||||||
|
if (drawn > POINTS_TO_DRAW) {
|
||||||
|
overlapped = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (overlapped) {
|
||||||
|
WptPt pt = points.get(0);
|
||||||
|
if (pt != lastBeforePoint && pt != firstAfterPoint && isInTileBox(tb, pt)) {
|
||||||
|
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
||||||
|
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
||||||
|
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
||||||
|
}
|
||||||
|
pt = points.get(points.size() - 1);
|
||||||
|
if (pt != lastBeforePoint && pt != firstAfterPoint && isInTileBox(tb, pt)) {
|
||||||
|
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
||||||
|
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
||||||
|
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < points.size(); i++) {
|
||||||
|
WptPt pt = points.get(i);
|
||||||
|
if (pt != lastBeforePoint && pt != firstAfterPoint && isInTileBox(tb, pt)) {
|
||||||
|
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
||||||
|
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
||||||
|
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawBeforeAfterPath(Canvas canvas, RotatedTileBox tb) {
|
||||||
|
TrkSegment before = editingCtx.getBeforeTrkSegmentLine();
|
||||||
|
TrkSegment after = editingCtx.getAfterTrkSegmentLine();
|
||||||
|
if (before.points.size() > 0 || after.points.size() > 0) {
|
||||||
|
path.reset();
|
||||||
|
tx.clear();
|
||||||
|
ty.clear();
|
||||||
|
|
||||||
|
if (before.points.size() > 0) {
|
||||||
|
WptPt pt = before.points.get(before.points.size() - 1);
|
||||||
|
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
||||||
|
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
||||||
|
tx.add(locX);
|
||||||
|
ty.add(locY);
|
||||||
|
tx.add((float) tb.getCenterPixelX());
|
||||||
|
ty.add((float) tb.getCenterPixelY());
|
||||||
|
}
|
||||||
|
if (after.points.size() > 0) {
|
||||||
|
if (before.points.size() == 0) {
|
||||||
|
tx.add((float) tb.getCenterPixelX());
|
||||||
|
ty.add((float) tb.getCenterPixelY());
|
||||||
|
}
|
||||||
|
WptPt pt = after.points.get(0);
|
||||||
|
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
||||||
|
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
||||||
|
tx.add(locX);
|
||||||
|
ty.add(locY);
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
GeometryWay.calculatePath(tb, tx, ty, path);
|
||||||
|
canvas.drawPath(path, lineAttrs.paint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,6 +326,16 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
|
||||||
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void drawPointIcon(Canvas canvas, RotatedTileBox tb, WptPt pt) {
|
||||||
|
canvas.rotate(-tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
|
float locX = tb.getPixXFromLatLon(pt.lat, pt.lon);
|
||||||
|
float locY = tb.getPixYFromLatLon(pt.lat, pt.lon);
|
||||||
|
if (tb.containsPoint(locX, locY, 0)) {
|
||||||
|
canvas.drawBitmap(pointIcon, locX - marginPointIconX, locY - marginPointIconY, bitmapPaint);
|
||||||
|
}
|
||||||
|
canvas.rotate(tb.getRotate(), tb.getCenterPixelX(), tb.getCenterPixelY());
|
||||||
|
}
|
||||||
|
|
||||||
public WptPt addCenterPoint() {
|
public WptPt addCenterPoint() {
|
||||||
RotatedTileBox tb = view.getCurrentRotatedTileBox();
|
RotatedTileBox tb = view.getCurrentRotatedTileBox();
|
||||||
LatLon l = tb.getCenterLatLon();
|
LatLon l = tb.getCenterLatLon();
|
||||||
|
|
Loading…
Reference in a new issue