Pregunta

Tengo dos coordenadas para las que me gustaría dibujar una línea perpendicular de igual longitud.¿Existe una compensación simple de mapas de Google para esto o un enfoque de JavaScript limpio mediante el cual podría lograr esto?¿Qué sería eso?

Esto es lo que tengo hasta ahora.Como puede ver, trazo los dos puntos como marcadores y luego intento dibujar una línea entre ellos, excepto que necesito obtener esa línea perpendicular a la línea entre las dos coordenadas.

var locations = [
    ['', position.coords.latitude, position.coords.longitude, 1],
    ['', llat, llng, 2]
];

  var marker, i;

  for ( var i = 0; i < locations.length; i++ )
  {
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });
  }

    var borderPlanCoordinates = [
        new google.maps.LatLng(llat, position.coords.longitude),
        new google.maps.LatLng(position.coords.latitude,llng)
    ];

    var borderPath = new google.maps.Polyline({
      path: borderPlanCoordinates,
      strokeColor: "#FF0000",
      strokeOpacity: 1.0,
      strokeWeight: 10,
      map: map
    });

   borderPath.setMap(map);
¿Fue útil?

Solución

Entonces, tiene dos puntos con coordenadas (x1,y1) y (x2, y2) y desea dibujar un segmento de línea cuya longitud es la distancia entre ellos, cuál es la bisectriz perpendicular del segmento que los conecta, y cuál está bisecado por dicho segmento?

Probablemente la forma más sencilla es establecer cx = (x1 + x2)/2, cy = (y1+y2)/2), dx = (x2-x1)/2, dy = (y2-y1)/2 y luego trazar una línea desde (cx-dy, cy+dx) a (cx+dy, cy-dx).

Esto funciona porque (cx, cy) es el punto medio del segmento que desea, y luego simplemente toma el vector desde ese punto medio a (x2,y2) y lo gira en más y menos 90 grados para encontrar los puntos finales del segmento que desea dibujar.

Otros consejos

Probé esta solución, el medio del segmento está bien PERO no se ve perpendicular en los mapas de Google, sospecho que debido a la proyección esférica (no ortonormal).

Aquí hay una solución que funciona:

spherical = google.maps.geometry.spherical;
var F = new google.maps.LatLng(latF, longF); 
var T = new google.maps.LatLng(latT, longT); 
// M is the middle of [FT]
var latM = (latF + latT)/2;
var longM = (longF + longT)/2;
var M =  new google.maps.LatLng(latM, longM);
// Get direction of the segment
var heading = spherical.computeHeading(F, T);
var dist = 200; // distance in meters
// Place point A that is oriented at 90° in a distance of dist from M
var A = spherical.computeOffset(M, dist, heading+90);
var perpendicularCoordinates = [M, A ];
var perpendicular = new google.maps.Polyline({
    path: perpendicularCoordinates,
    geodesic: true,
    strokeColor: '#FF0000',
    strokeOpacity: 1.0,
    strokeWeight: 2,
    map: map
  });    

Aquí está el violín relacionado: http://jsfiddle.net/8m7vm650/15/

Tenga en cuenta que debe utilizar una biblioteca de mapas de Google opcional llamada geometría que se hace agregando bibliotecas= geometría a la cadena de consulta al cargar mapas: http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top