1

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 case 1

Fall 2: P1 - Frankreich, P2 - Singapur case 2

Fall 3: P1 - USA, P2 - Bangalore case 3

Fall 4: P 1 - USA, P2 - Singapur case 4

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.

+0

@pskink Danke, ich werde es ausprobieren. –

+0

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. –

Antwort

2

Diese Antwort ist etwas spekulativ, aber ich schlage vor, dass nichts, was Sie sehen, tatsächlich falsch oder sogar unerwartet ist. Wie Sie wissen, ist die Erde rund, aber Google Maps (und Computerbildschirme) sind von Natur aus flach und zweidimensional. Die Art, wie wir eine flache 2D-Karte der Erde beginnen zu schaffen ist durch einen Globus wie diese Zerstückelung:

enter image description here

Die Dinge werden etwas verzogen und verzerrt in den Prozess der 2D-Karte der Welt zu schaffen, auf die wir sind alle daran gewöhnt zu sehen. Ich habe nicht die Mathematik, um es zu unterstützen, aber es scheint offensichtlich, dass 3D-Kurven, die zwei Städte über den größten Teil des Globus verbinden, auch verzerrt und verzerrt werden, nachdem sie auf eine 2D-Karte projiziert wurden. Und ich würde erwarten, dass die Verzerrungen umso ausgeprägter werden, je länger die Kurven sind.

Dies würde auch erklären, warum die Kurve von Mumbai nach Chennai für Sie normal aussieht. Es ist über eine relativ kurze Entfernung, wo Verzerrungen aufgrund der Krümmung der Erde minimal sind.

Verwandte Themen