【问题标题】:How to set a Google Maps Marker Icon based on current map filters and a combination of HashMap strings the marker has如何根据当前地图过滤器和标记具有的 HashMap 字符串组合设置 Google 地图标记图标
【发布时间】:2013-02-27 03:17:57
【问题描述】:

如果有人对实现代码以设置地图标记图标的最有效方法有任何建议,那将非常有帮助:

  • 由用户定义的过滤器指定要显示的标记 (boolean)
  • 包含在与标记关联的HashMap<String, Integer> 中的键 - 在class CrimePoint

用户定义的过滤器选项:

    boolean displayAntiSocialBehaviourMarkers;
    boolean displayBurglaryMarkers;
    boolean displayCriminalDamageArsonMarkers;
    boolean displayDrugsMarkers;
    boolean displayOtherTheftMarkers;
    boolean displayPubDisorderWeaponsMarkers;
    boolean displayRobberyMarkers;
    boolean displayShopliftingMarkers;
    boolean displayVehicleCrimeMarkers;
    boolean displayViolentCrimeMarkers;
    boolean displayOtherCrimeMarkers;

每个标记都使用CrimePoint 创建,这是一个包含绘制标记所需的所有信息的类

犯罪点类变量:

private final Double latitude;
private final Double longitude;
private final String title;

//SNIPPET
//The HashMap storing the categories associated with this CrimePoint.
//Category name is the key and the number of crimes in that category is the Value
//
private Map<String, Integer> crimeCategories;

//An integer to hold the references to the icon image to use
//Example: R.drawable.image002;
private int iconResource;

标记图标:

地图上有 12 个不同的标记图标可用。每个过滤器选项一个 [如上所示] 和一个特殊情况标记(多重犯罪),其中:
- CrimePoint 有多个犯罪类别 (crimeCategories.size() &gt; 1) AND
- 使用过滤器选项将CrimePoint 中包含的多个犯罪类别设置为可见

只有在显示一个(或多个)犯罪类别时才会绘制标记。

任何帮助或建议都会很棒,因为我花了很长时间来处理我需要的逻辑并且没有想出太多。

注意:每次用户更改过滤器选项时,都需要调用此函数来更改地图上的图标并隐藏/显示标记。

【问题讨论】:

  • 我们说的是原生 API 而不是 javascript?
  • 是在 Eclipse 中的 GoogleMap 对象上。不是 javascript :)

标签: java icons hashmap google-maps-markers android-maps-v2


【解决方案1】:

首先,您应该考虑更改您的表示。从列举犯罪类型开始:

enum CrimeType { AntiSocialBehaviour, ..., Count }

现在您的标志可以创建为枚举集:

EnumSet<CrimeType> showMarkers = new EnumSet<CrimeType>();

这就像普通的 Java Set 一样工作,但效率更高。如果不需要散列的力量,请在标记中使用它们而不是散列。

要打开和关闭标记,请注意 the visibility attribute in the documentation。更改过滤器标志时,遍历标记列表以适当地设置可见性。然后使地图片段或视图无效。绘制时间将支配可见性设置时间,因此这是尽可能高效的。

我推断您从关于效率的问题中有很多标记。如果您有太多标记以致地图因重叠而变得混乱,那么您必须实施一种合并算法来用一个表示多个标记。我早些时候就这个主题发布了this question,但没有收到任何回复。我的解决方案在那里解释得很好,虽然没有我想要的那么快(2-3 秒,Nexus 平板电脑上有大约 15,000 个标记)。

对于非标准标记外观,请研究the documentation here under "Change the Default Marker

很清楚。如果您有具体问题并显示代码,我们可以提供详细信息。

【讨论】:

  • 嗨,我考虑过对犯罪类型使用枚举,因为字符串总是相同的。但是,我对使用枚举不是很熟悉,并且犯罪点及其相关类别的列表是通过运行 JSONObjects 数组来创建或更新新的犯罪点而制定的。我打折了枚举,因为我需要为通过 JSON 运行时可能会改变的类别提供一个值。关于可见性,我知道您可以将设置传递给标记;目前这只是这背后的逻辑。我正在考虑一个额外的字段
  • ...(开或关)必须在选择图标的同时进行配置。
    CrimePoints 的数量范围可以从 04000 左右,但我的代码目前将其中一些分组,因为它们可能发生在同一位置。不管你是对的,我的地图看起来很混乱,并且有太多的“数据”供用户解释。我的意思是实施诸如“MarkerClusterer”之类的合并,所以我一定会阅读这篇文章:)。
  • 可能值得花时间学习枚举。他们很灵活。每个枚举值本质上是一个隐式父类的实例,可以定义数据实例值和成员函数。见docs.oracle.com/javase/tutorial/java/javaOO/enum.html
  • 有趣的是,我早些时候读过。刚刚实现了一个像下面这样的枚举,一旦实现它应该会更容易:
    public enum CrimeCategory { ASBO ("Anti Social Behaviour"), .... private String category; CrimeCategory (String category) { this.category = category; }
猜你喜欢
  • 2018-01-03
  • 2013-03-27
  • 2016-11-03
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2015-01-26
相关资源
最近更新 更多