【问题标题】:How to spawn markers on android map inside a circular range如何在圆形范围内的android地图上生成标记
【发布时间】:2019-04-25 21:46:02
【问题描述】:

我正在尝试制作一个 pokemonGo 风格的应用程序。 我尝试使用纬度和经度公式来计算标记(口袋妖怪)应该产生的坐标范围,但我只设法得到一个矩形区域。我想在玩家周围的圆形区域生成它们,我该怎么做?

这是我计算矩形区域的代码。

        Random r = new Random();
        int randomDistanceLatitude = r.nextInt(range*2) - range;
        r = new Random();
        int randomDistanceLongitude = r.nextInt(range*2) - range;


        double latitudeDegreeToAdd = 1.7 * randomDistanceLatitude * 0.000009043717329571146924;
        double longitudeDegreeToAdd = randomDistanceLongitude * (1 / (111320 * Math.cos(infoLocal.getLastKnownLocation().getLatitude())));

        LatLng enemy1Location = new LatLng(infoLocal.getLastKnownLocation().getLatitude() + latitudeDegreeToAdd, infoLocal.getLastKnownLocation().getLongitude() + longitudeDegreeToAdd);

        enemies[i] = mMap.addMarker(new MarkerOptions().position(enemy1Location).title("Monster").snippet("Click to Attack!").icon(BitmapDescriptorFactory.fromResource(R.drawable.enemy3)).anchor(0.5f, 0.5f));

【问题讨论】:

  • 您有实际问题吗?
  • @Stultuske 正如我所说,我希望它们生成在圆形区域而不是玩家周围的矩形区域中
  • ... 仍然不是问题。你到底有什么问题?
  • @Stultuske 抱歉,应该写这个,我不知道如何在圆形区域生成它们,我发布的公式可能对此无用

标签: java android dictionary area


【解决方案1】:

这似乎是一道数学题。

圆的公式是 (x, y) = (cos(angle) * rX, sin(angle) * rY) + (centerX, centerY)

所以,代码将如下所示。

Random r = new Random();
double radius = r.nextFloat() * range; // or r.nextDouble()...
double angle = r.nextFloat() * 2.0f * Math.PI;
double randomDistanceLatitude = Math.cos(angle) * radius;
double randomDistanceLongitude = Math.sin(angle) * radius;
...

由于 lat lng 不在笛卡尔坐标系中,它不是一个纯圆,但我认为range 在这个用例中足够小,可以忽略这种失真。


补充说明。

如果mMap 表示 Google Maps 地图,您可能对 Google Maps - Shape - Circle 感兴趣

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2018-11-06
    • 1970-01-01
    • 2018-08-09
    • 2020-10-12
    • 2013-05-14
    • 2012-02-04
    • 2016-01-16
    • 2019-11-08
    相关资源
    最近更新 更多