我有一组折线(数字为100,每条折线有大约200-300个顶点).这些代表地图上的路线(如果有帮助,则全部来自Google Maps API).顶点是纬度/经度坐标.
我现在得到一个查询折线,我必须找到查询折线与任何现有折线的"重叠".因此,结果本身将是折线,按最大到最小重叠的顺序排序.我只需要前100个结果左右.另一个问题是重叠不一定是精确的,但可以是近似的(即,被认为是重叠的线段的部分不需要位于另一个上,而是仅需要彼此"接近").
为了给出具体的表示,在下图的左侧部分,蓝色折线(折线A)是数据库中的折线,红色折线(折线B)是查询折线.该算法应确定以粗黑标记的折线,如右图所示.

我目前倾向于使用空间数据库(正在考虑的选项是PostgreSQL + PostGIS),但我不确定延迟是否可以接受 - 查询需要立即返回结果.我的计算几何 - fu确实很弱,但我想知道:是否有任何现有的算法或方法可能对解决这个特定问题有用?
提前谢谢了!
algorithm google-maps postgis polyline computational-geometry
我正在寻找stackoverflow上的这个问题的解决方案,但由于我找不到准确的解决方案,我最终自己解决它并在此发布,希望它有所帮助.
Google地图为您提供折线功能,该功能基于坐标列表可以绘制一系列连接所有线条的线条.
您可以使用以下代码使用单个箭头绘制折线:
var allCoordinates = [
new google.maps.LatLng(26.291, 148.027),
new google.maps.LatLng(26.291, 150.027),
new google.maps.LatLng(22.291, 153.027),
new google.maps.LatLng(18.291, 153.027)
];
var polyline = new google.maps.Polyline({
path: allCoordinates,
strokeColor: color,
strokeOpacity: 1.0,
strokeWeight: 2,
geodesic: true,
icons: [{
icon: {path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW},
offset: '100%'
}]
});
Run Code Online (Sandbox Code Playgroud)
这里的问题是箭头将仅在最后一段中绘制,如下图所示,但有时路线可能不那么简单,我们需要在每个段上添加一个箭头.
图标定义中的"重复"属性可能是另一种选择,但只允许以像素为单位定义度量,并且definelty与折线上的每个方向变化都不匹配.

因此,我发现实现这一目的的一种方法是制作多条折线,每个线段允许一条线,在这种情况下允许在每条线上绘制箭头.这是代码:
var allCoordinates = [
new google.maps.LatLng(26.291, 148.027),
new google.maps.LatLng(26.291, 150.027),
new google.maps.LatLng(22.291, 153.027),
new google.maps.LatLng(18.291, 153.027)
];
for (var i = 0, n = allCoordinates.length; i < n; i++) {
var coordinates = …Run Code Online (Sandbox Code Playgroud) 如果googlemap上有折线并且在地图上执行了点击,那么如何检查该点击是否在折线上或其他位置?
Polyline line = googleMap.addPolyline(new PolylineOptions()
.add(new LatLng(51.2, 0.1), new LatLng(51.7, 0.3))
.width(5)
.color(Color.RED));
googleMap.setOnMapLongClickListener(new OnMapLongClickListener() {
}
});
Run Code Online (Sandbox Code Playgroud) 我的项目中有Google Maps Polylines的路线(例如http://rutasgdl.com/rutas/626-2),我想在路线上添加方向箭头.我想要这样的东西(遗憾的是,它适用于谷歌地图V2)http://wtp2.appspot.com/ArrowLine.htm
为了达到这个目的,你能指出我正确的方向吗?问候.
我正在尝试使用Google Directions API在我的mapview上显示路线,但我很难从JSON响应中获取数据.我可以获得"级别"和"点"字符串,但无法解决如何将它们解码到地图上的点.
任何帮助将非常感激.
使用谷歌地图javascript API我想在多边形线上绘制箭头,所以当用户查看地图时,他会理解有人从这里到这里旅行.
现有功能

我想要这样的东西

请帮忙.
帮助将不胜感激.
大家好我需要能够将折线中心放在地图的中心
只有代码的必要部分......
success: function(data) {//callback to be executed when the response has been received
data = JSON.parse(data);
for (var i=0;i<data.length;i++) {
flightPlanCoordinates[i] = new google.maps.LatLng(data[i].x,data[i].y);
}
map = new google.maps.Map(document.getElementById("map_find"),
mapOptions);
flightPath = new google.maps.Polyline({
path: flightPlanCoordinates,
strokeColor: "#8a2be2",
strokeOpacity: 1.0,
strokeWeight: 3
});
flightPath.setMap(map);
map.setZoom(5);
map.setCenter(flightPlanCoordinates);
}
Run Code Online (Sandbox Code Playgroud)
这不是我需要的.我的地图不是居中而不是缩放,如何实现这一目标?
我正在努力检测在我的谷歌地图上绘制的GMSPolyline上的水龙头,它与GMSpolygones一起工作得很好,但同样的方法似乎不适用于折线.我目前使用多边形的方法是:
if (GMSGeometryContainsLocation(coordinate, polygon.path!, false)) {
...
}
Run Code Online (Sandbox Code Playgroud)
有关如何检测折线上的水龙头的任何建议吗?或者只是靠近它?
如何在Google Map中绘制弧形折线?
我已经使用此代码创建了弯曲的折线.
以下是绘制弯曲折线的方法:
private void showCurvedPolyline (LatLng p1, LatLng p2, double k) {
//Calculate distance and heading between two points
double d = SphericalUtil.computeDistanceBetween(p1,p2);
double h = SphericalUtil.computeHeading(p1, p2);
//Midpoint position
LatLng p = SphericalUtil.computeOffset(p1, d*0.5, h);
//Apply some mathematics to calculate position of the circle center
double x = (1-k*k)*d*0.5/(2*k);
double r = (1+k*k)*d*0.5/(2*k);
LatLng c = SphericalUtil.computeOffset(p, x, h + 90.0);
//Polyline options
PolylineOptions options = new PolylineOptions();
List<PatternItem> pattern = …Run Code Online (Sandbox Code Playgroud) android google-maps polyline android-custom-view google-maps-android-api-2
我有一个网络应用程序,将为每个用户绘制折线(跟踪运动),我想结合一些功能,允许网络应用程序用户通过更改折线的颜色"聚焦"某个用户.首先必须将所有折线更改为红色,然后将所选折线更改为蓝色.我认为最好避免专注于一行,然后尝试专注于另一行并让它们都是蓝色的.我真的不确定如何实现它,但我有功能,在按下名称时返回用户ID.我只需要迭代每个对象(每个用户的折线)首先将它们更改为红色,然后将特定的一个更改为蓝色.以下是一些代码.如果你能指出我正确的方向,我会很感激.谢谢.这是我的代码的精简版本,所以我希望它提供足够的信息.
function User(id) {
this.id = id;
this.locations = [];
this.mark = 0;
this.getId = function() {
return this.id;
};
this.addLocation = function(latitude, longitude) {
this.locations[this.locations.length] = new google.maps.LatLng(latitude, longitude);
};
var polyline;
this.drawPolyline = function(loc) {
polyline = new google.maps.Polyline({
map: map,
path: loc,
strokeColor: "#FF0000",
strokeOpacity: 1.0,
strokeWeight: 2
});
polyline.setMap(map);
};
this.removePolyline = function() {
if (polyline != undefined) {
polyline.setMap(null);
}
}
this.get_user_info = function(user_id) {
var datastr = 'id=' + user_id;
$.ajax({
type: "POST",
url: …Run Code Online (Sandbox Code Playgroud)