Android计算android谷歌地图中的网格角位置

Posted

技术标签:

【中文标题】Android计算android谷歌地图中的网格角位置【英文标题】:Android calculate the grid corner positions in android Google map 【发布时间】:2015-09-11 14:10:27 【问题描述】:

我想在 Googmap 上创建一个 4 行 3 列的网格。我想在网格制作的每个矩形的左上角和右下角显示标记。

这是我正在使用的代码

public void getVisibleRegionGrids(final VisibleRegion region)

    int columns = 3;
    int rows    = 4;

    double mainTopLat  = region.latLngBounds.southwest.latitude;  // (c, d)
    double mainTopLng  = region.latLngBounds.northeast.longitude;

    double mainBottomLat = region.latLngBounds.northeast.latitude;
    double mainBottomLng = region.latLngBounds.southwest.longitude;

    double horizontalDiff = Math.abs (( mainBottomLat - mainTopLat ) / columns);  // 1
    double verticalDiff   = Math.abs (( mainBottomLng - mainTopLng ) / rows);  // 1

    double topLat  = mainTopLat;  // (c, d)
    double topLng  = mainTopLng;

    //double bottomLat = mainTopLat + horizontalDiff;
    //double bottomLng = mainTopLng + verticalDiff;

    for (int i = 0; i < rows; i++)
    
        for (int x = 0; x < columns ; x++)
        
            double currentTopLat = (topLat + (i * verticalDiff)) + (x * horizontalDiff);
            double currentTopLng = (topLng + (i * verticalDiff)) + (x * horizontalDiff);

            double currentBottomLat = currentTopLat + horizontalDiff;
            double currentBottomLng = currentTopLng + verticalDiff;
            try
            
                MarkerOptions markerOptions = new MarkerOptions()
                        .draggable(false)
                        .position(new LatLng(Double.valueOf(currentTopLat), Double.valueOf(currentTopLng))
                        );
                mMap.addMarker(markerOptions);

                markerOptions = new MarkerOptions()
                        .draggable(false)
                        .position(new LatLng(Double.valueOf(currentBottomLat), Double.valueOf(currentBottomLng))
                );
                mMap.addMarker(markerOptions);

            catch (Exception e)
            
        
    

我无法使其逻辑正常工作。我计算了左上角和右下角。从左上角开始,我想继续。我能做什么

更新

多亏了帮助,我已经成功了

public void getVisibleRegionGrids(final VisibleRegion region)

    int columns = 3;
    int rows    = 4;

    double mainTopLat  = region.latLngBounds.northeast.latitude;  // (c, d)
    double mainMaxLng  = region.latLngBounds.northeast.longitude;

    double mainBottomLat = region.latLngBounds.southwest.latitude;
    double mainMinLng = region.latLngBounds.southwest.longitude;

    double horizontalDiff = Math.abs ((mainMaxLng - mainMinLng ) / columns);  // 1
    double verticalDiff   = Math.abs ((mainTopLat - mainBottomLat) / rows);  // 1

    double topLat = mainTopLat;  // (c, d)
    double topLng = mainMinLng;
    int position = 0;

    for (int i = 0; i < rows; i++)
    
        for (int x = 0; x < columns ; x++)
        
            double currentTopLat  = (topLat - (i * verticalDiff));
            double currentLeftLng = (topLng + (x * horizontalDiff));

            if(position == i)
            
                currentTopLat  = (topLat - (i * verticalDiff));
                currentLeftLng = (topLng + (x * horizontalDiff));
            

            position = -1;

            if(x == columns)
                position = i + 1;

            try
            
                MarkerOptions markerOptions = new MarkerOptions()
                        .draggable(false)
                        .position(new LatLng(Double.valueOf(currentTopLat), Double.valueOf(currentLeftLng)));
                mMap.addMarker(markerOptions);

                double currentBottomLat = currentTopLat - verticalDiff;
                double currentRightLng = currentLeftLng + horizontalDiff;
                markerOptions = new MarkerOptions()
                        .draggable(false)
                        .position(new LatLng(Double.valueOf(currentBottomLat), Double.valueOf(currentRightLng)));
                mMap.addMarker(markerOptions);

            catch (Exception e)
            
        
    

【问题讨论】:

【参考方案1】:

您的代码似乎有一些关于坐标的错误。 西南是左下角,东北是右上角。 所以

mainTopLat 是东北纬度 mainTopLng 是东北经度 -> 应该叫 mainMaxLng mainBottomLat 是西南纬度 mainBottomLng 是西南经度 -> 应该叫 mainMinLng

我正在修改内联代码,因此它可能包含错误,但它应该适用于您的情况。除了最后一行和最后一列,不要绘制右下标记,因为它会绘制重复标记!

public void getVisibleRegionGrids(final VisibleRegion region)

    int columns = 3;
    int rows    = 4;

    double mainTopLat  = region.latLngBounds.northeast.latitude;  // (c, d)
    double mainMaxLng  = region.latLngBounds.northeast.longitude;

    double mainBottomLat = region.latLngBounds.southwest.latitude;
    double mainMinLng = region.latLngBounds.southwest.longitude;

    double horizontalDiff = Math.abs ((mainMaxLng - mainMinLng ) / columns);  // 1
    double verticalDiff   = Math.abs (( mainTopLat - mainBottomLat) / rows);  // 1

    double topLat  = mainTopLat;  // (c, d)
    double rightLng  = mainMaxLng;

    for (int i = 0; i < rows; i++)
    
        for (int x = 0; x < columns ; x++)
        
            double currentTopLat = (topLat - (i * verticalDiff));
            double currentLeftLng = (topLng + (x * horizontalDiff));

            try
            
                MarkerOptions markerOptions = new MarkerOptions()
                        .draggable(false)
                        .position(new LatLng(Double.valueOf(currentTopLat), Double.valueOf(currentLeftLng)));
                mMap.addMarker(markerOptions);

                if ((i==(rows-1))|| (x==columns-1)//add the lowerright marker only on the last line or column, avoid duplicated markers
                double currentBottomLat = currentTopLat - verticalDiff;
                double currentRightLng = currentLeftLng + horizontalDiff;
                markerOptions = new MarkerOptions()
                                .draggable(false)
                                .position(new LatLng(Double.valueOf(currentBottomLat), Double.valueOf(currentBottomLng)));
                    mMap.addMarker(markerOptions);
    
            catch (Exception e)
            
        
    

【讨论】:

@N 纬度是水平的吧?所以应该考虑 minLat 和 max lat 以及 topLng 和 bottomLng 否?所以水平和垂直差异应该改变 不,纬度是垂直的,从-90到90,经度是水平的,从-180到180。你的想法是从左上角(topLat,minLng)开始移动在网格中(双循环扫描向右移动(列),当到达右侧时,转到下一行。行用于降低纬度(从顶部开始),列用于增加经度(从 minLng 开始)。我由于 double currentLeftLng = (topLng + (x * Horizo​​ntalDiff)); @N 好的,感谢您的帮助。我已经设法让它发挥作用。我对你的代码做了一些修改。现在我有 12 个不同的边界框。再次感谢。 @MuhammadUmar 您进行了修改,但老实说没有意义:如果 (position == i ) 与上述行完全相同,因此可以将其删除, (x==columns) 永远不会为真,因为循环中的条件是 (x 是的,但这不是关于添加标记,而是关于获得积分。我需要获得与其顶点相关的点而不是标记

以上是关于Android计算android谷歌地图中的网格角位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中的谷歌地图上绘制路线并计算多个标记之间的距离

谷歌地图只显示空白瓷砖android

如何制作与谷歌地图 api 连接的按钮网格?

片段中的 Android 谷歌地图

Android - 谷歌地图卡住了

在android中的谷歌地图上绘制点