Ich möchte eine Kurve (Beizer-Kurve) zwischen zwei Lat-Long-Punkte zeichnen. Derzeit beziehe ich mich auf this post (Code ist in Javascript).Zeichnen Sie eine Kurve (Bezier-Kurve) zwischen zwei Lat lange Punkte auf Google Maps Android
-Code Kurvenpunkte mit kubischen Bezier-Gleichung
private void drawElementsOnMap(LatLng init, LatLng end) {
mMap.addMarker(new MarkerOptions().position(init));
mMap.addMarker(new MarkerOptions().position(end));
LatLngBounds.Builder bc = new LatLngBounds.Builder();
bc.include(init);
bc.include(end);
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), 100));
PolylineOptions line = new PolylineOptions();
line.add(init);
line.add(end);
mMap.addPolyline(line);
double distanceBetween = SphericalUtil.computeDistanceBetween(init, end);
double lineHeadingInit = SphericalUtil.computeHeading(init, end);
double lineHeadingEnd = bearing(end, init);*/
double lineHeading1, lineHeading2;
if (lineHeadingInit < 0) {
lineHeading1 = lineHeadingInit + 45;
lineHeading2 = lineHeadingInit + 135;
} else {
lineHeading1 = lineHeadingInit + -45;
lineHeading2 = lineHeadingInit + -135;
}
LatLng pA = SphericalUtil.computeOffset(init, distanceBetween/2.5, lineHeading1);
LatLng pB = SphericalUtil.computeOffset(end, distanceBetween/2.5, lineHeading2);
// Beizer curves with 4 points
gmapsCubicBezier(init, end, pA, pB);
}
private void gmapsCubicBezier(LatLng p1, LatLng p2, LatLng pA, LatLng pB) {
//Polyline options
PolylineOptions options = new PolylineOptions();
LatLng curveLatLng = null;
for (double t = 0.0; t < 1.01; t += 0.01) {
// P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4; for 4 points
double arcX = (1 - t) * (1 - t) * (1 - t) * p1.latitude
+ 3 * (1 - t) * (1 - t) * t * pA.latitude
+ 3 * (1 - t) * t * t * pB.latitude
+ t * t * t * p2.latitude;
double arcY = (1 - t) * (1 - t) * (1 - t) * p1.longitude
+ 3 * (1 - t) * (1 - t) * t * pA.longitude
+ 3 * (1 - t) * t * t * pB.longitude
+ t * t * t * p2.longitude;
curveLatLng = new LatLng(arcX, arcY);
options.add(curveLatLng);
//Draw polyline
mMap.addPolyline(options.width(5).color(Color.DKGRAY).geodesic(false));
}
mMap.addMarker(new MarkerOptions().position(curveLatLng));
}
Im Folgenden sind die Bilder zeigen verschiedene Testfälle zu bekommen habe ich versucht.
Fall 1: P1 - Mumbai, P2 - Chennai
Fall 2: P1 - Frankreich, P2 - Singapur
Fall 3: P1 - USA, P2 - Bangalore
Fall 4: P 1 - USA, P2 - Singapur
Fragen:
1) Warum ist Algorithmus in der Lage 1 in Fall nur recht ordentlich Kurve zu zeichnen?
2) Warum Bezier-Kurve auf einer Seite in Fall 2?
3) Warum die Bezierkurve in Fall 3 und 4 anders aussieht (seltsamer Höcker bei P1 (Fall 3) und bei P2 (Fall 4)). Gibt es das überhaupt, um es zu vermeiden?
4) Warum wird die Polylinie im Fall 4 anders gezeichnet (die Richtung?)?
Ich kann das Muster nicht verstehen, in dem Kurve gezeichnet wird. Bitte lassen Sie mich wissen, wenn ich etwas falsch mache.
@pskink Danke, ich werde es ausprobieren. –
etwas zu beachten: warum würden diese gebogenen Kurven falsch sein?Schritt 1 wäre, eine * Kugel * mit der Erde darauf zu bekommen, und zu sehen, ob Ihre Kurven tatsächlich falsch sind, oder ob Sie einfach die Wirkung von Weltkartenprojektionen betrachten, die nicht in Großkreisen auf einem Globus invariant sind. Ergreifen Sie Google Earth (die Anwendung), lassen Sie die großen Kreise zwischen Ihren Testpunkten zeichnen und sehen Sie, ob diese durch die gleichen Punkte gehen, die Ihre eigenen Kurven durchlaufen. –