Android 如何在Google Maps中使用多段线的setTag保存自定义数据
单击多段线时,我希望时间(自定义对象)显示在该特定的横向位置Android 如何在Google Maps中使用多段线的setTag保存自定义数据,android,google-maps,google-maps-markers,google-polyline,Android,Google Maps,Google Maps Markers,Google Polyline,单击多段线时,我希望时间(自定义对象)显示在该特定的横向位置 if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) { 代码实现多段线 if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist &l
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
代码实现多段线
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
感谢您的贡献:)
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
编辑
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
boolean isOnRoute = PolyUtil.isLocationOnPath(latLng, lineOptions.getPoints(), false, 25);
if (isOnRoute) {
for (LocationVo mCoordinates : points) {
double distanceInMeters = SphericalUtil.computeDistanceBetween(latLng, mCoordinates.getmLatLong());
boolean isWithin50m = distanceInMeters < 50;
if (isWithin50m) {
Toast.makeText(mContext, mCoordinates.getTime(), Toast.LENGTH_SHORT).show();
break;
}
}
}
}
});
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
mMap.setOnMapClickListener(新的GoogleMap.OnMapClickListener(){
@凌驾
公共无效的点击(LatLng LatLng){
布尔值isOnRoute=PolyUtil.isLocationOnPath(latLng,lineOptions.getPoints(),false,25);
如果(isOnRoute){
对于(位置VO mCoordinates:点){
double distanceInMeters=球体粘性计算距离(latLng,mCoordinates.getmLatLong());
布尔值为小于50米=距离小于50米;
如果(在50米以内){
Toast.makeText(mContext,mCoordinates.getTime(),Toast.LENGTH_SHORT.show();
打破
}
}
}
}
});
并非所有的“我的多段线”都与条件匹配,并且在公差为25米的情况下,单击时不显示土司。您正在沿每侧25米的每条路径段定义道路。因此,在实现时,所有这些都告诉您,单击点位于道路中以路径为中心的某个位置,或者实际上,他们单击多段线时存在一定的错误空间
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
你的问题在于你的假设,你总是在一个点的50米范围内-这是不正确的,也不是你想要的最好的,因为我可以告诉你。根据定义,一旦isOnRoute
为真,您总是希望找到一个点,因为根据定义,他们已经单击了多段线;通过简单地计算从单击点到所有多段线点的所有距离并确定最短距离(一个简单的循环),可以实现这一点(效率低下)
具有min
逻辑);然后用这一点来祝酒
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
现在,如果您真的想限制被认为是“成功”的单击,其中成功的单击同时是“在多段线上”和“在某个点附近”,那么您的距离检查将使用一些可接受的值进行添加-这实际上是在尺寸为50米(25 x 2)的每个点周围定义一个“框”——无论您的距离检查是什么。注意,这与仅检查每个点周围的半径圆不同,除非所需圆的半径等于多段线公差
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
(还有一个小问题——当使用false
进行测地线测量,然后计算球面距离时,您的混合测量系统——但这不应该是您的实现中的问题。)(如果有帮助,我将在稍后添加图片。)
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
修改摘要:“检查用户是否沿多段线单击”、“确定沿多段线最近的点”和“显示该点的土司”
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
因此,在isOnRoute
为真后进行此修改:
LocationVo closestPoint = null;
double minDist = -1;
for (LocationVo mCoordinates : points) {
double distanceInMeters = SphericalUtil.computeDistanceBetween(latLng, mCoordinates.getmLatLong());
if (minDist < 0 || distanceInMeters < minDist) {
minDist = distanceInMeters;
closestPoint = mCoordinates;
}
}
if (closestPoint != null) {
Toast.makeText(mContext, closestPoint.getTime(), Toast.LENGTH_SHORT).show();
}
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
LocationVo closestPoint=null;
双重正念=-1;
对于(位置VO mCoordinates:点){
double distanceInMeters=球体粘性计算距离(latLng,mCoordinates.getmLatLong());
如果(minDist<0 | |距离米
要围绕每个点实现上述“框”,请修改一个条件:
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {
if((距离米<距离点的最大距离)和&(心灵主义者<0 | |距离米<心灵主义者)){
注意,这意味着在某些情况下,即使他们沿着多段线单击,你也不会得到祝酒词。你不能使用标记到达那里-最好使用
onmaclicklistener
计算最近点,如果在公差范围内,则从点计算显示时间。
。请参阅android maps utils了解多段线。isLocationOnPath
和SphereCalutil.computeDistanceBetween
。不幸的是,polyLineListener没有给出单击点,否则您可以在那里进行计算。@Andy回到这个问题上已经有18天了,我可以根据您的评论显示多段线单击的时间,谢谢!!但是我有一个问题,我比较了distance我从SphericalTil.ComputedDistanceBetween获得的距离小于50米,并且不是所有的多段线点击显示时间请检查我是否编辑了我的问题如此漂亮的答案
if ((distanceInMeters < MAX_DISTANCE_FROM_POINT) && (minDist < 0 || distanceInMeters < minDist)) {