рисование линии на картах Google перпендикулярно двум точкам - PullRequest
6 голосов
/ 30 апреля 2011

У меня есть две координаты, для которых я хотел бы нарисовать перпендикулярную линию равной длины. Есть ли простое смещение карт Google для этого или чистый подход JavaScript, с помощью которого я мог бы достичь этого? Что бы это было?

Вот что я имею до сих пор. Как вы можете видеть, я строю две точки как маркеры, а затем пытаюсь нарисовать линию между ними, за исключением того, что мне нужно получить эту линию перпендикулярно линии между двумя координатами.

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);

Ответы [ 2 ]

5 голосов
/ 30 апреля 2011

Итак, у вас есть две точки с координатами (x1,y1) и (x2, y2), и вы хотите нарисовать отрезок, длина которого - это расстояние между ними, которое является перпендикулярным биссектрисом отрезка, соединяющего их, и который разделен пополамсегмент?

Вероятно, самый простой способ - установить cx = (x1 + x2)/2, cy = (y1+y2)/2), dx = (x2-x1)/2, dy = (y2-y1)/2 и затем нарисовать линию от (cx-dy, cy+dx) до (cx+dy, cy-dx).

Это работает, потому что (cx, cy) - это средняя точка нужного вам сегмента, а затем вы просто берете вектор из этой средней точки в (x2,y2) и поворачиваете его на плюс и минус 90 градусов, чтобы найти конечные точки нужного вам сегмента.рисовать.

4 голосов
/ 05 марта 2015

Я попробовал это решение, середина сегмента в порядке, НО на картах Google он не выглядит перпендикулярно, я подозреваю из-за сферической проекции (не ортонормированной)

Вот решение, которое работает:

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
  });    

Вот соответствующая скрипка: http://jsfiddle.net/8m7vm650/15/

Обратите внимание, что вам нужно использовать дополнительную библиотеку карт Google под названием geometry, которая выполняется путем добавления библиотеки = geometry в строку запроса при загрузке карт: http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false

...