Exemplo n.º 1
0
  /**
   * Extracts special fields and returns their values as an array of strings.
   *
   * @param entity the entity
   * @param preferredLanguage the preferred language
   * @return a string array, [0] = name, [1] = ref, [2} = housenumber, [3] layer, [4] elevation, [5]
   *     relationType
   */
  public static SpecialTagExtractionResult extractSpecialFields(
      Entity entity, String preferredLanguage) {
    boolean foundPreferredLanguageName = false;
    String name = null;
    String ref = null;
    String housenumber = null;
    byte layer = 5;
    short elevation = 0;
    String relationType = null;

    if (entity.getTags() != null) {
      for (Tag tag : entity.getTags()) {
        String key = tag.getKey().toLowerCase(Locale.ENGLISH);
        if ("name".equals(key) && !foundPreferredLanguageName) {
          name = tag.getValue();
        } else if ("piste:name".equals(key) && name == null) {
          name = tag.getValue();
        } else if ("addr:housenumber".equals(key)) {
          housenumber = tag.getValue();
        } else if ("ref".equals(key)) {
          ref = tag.getValue();
        } else if ("layer".equals(key)) {
          String l = tag.getValue();
          try {
            byte testLayer = Byte.parseByte(l);
            if (testLayer >= -5 && testLayer <= 5) {
              testLayer += 5;
            }
            layer = testLayer;
          } catch (NumberFormatException e) {
            LOGGER.finest(
                "could not parse layer information to byte type: "
                    + tag.getValue()
                    + "\t entity-id: "
                    + entity.getId()
                    + "\tentity-type: "
                    + entity.getType().name());
          }
        } else if ("ele".equals(key)) {
          String strElevation = tag.getValue();
          strElevation = strElevation.replaceAll("m", "");
          strElevation = strElevation.replaceAll(",", ".");
          try {
            double testElevation = Double.parseDouble(strElevation);
            if (testElevation < MAX_ELEVATION) {
              elevation = (short) testElevation;
            }
          } catch (NumberFormatException e) {
            LOGGER.finest(
                "could not parse elevation information to double type: "
                    + tag.getValue()
                    + "\t entity-id: "
                    + entity.getId()
                    + "\tentity-type: "
                    + entity.getType().name());
          }
        } else if ("type".equals(key)) {
          relationType = tag.getValue();
        } else if (preferredLanguage != null && !foundPreferredLanguageName) {
          Matcher matcher = NAME_LANGUAGE_PATTERN.matcher(key);
          if (matcher.matches()) {
            String language = matcher.group(3);
            if (language.equalsIgnoreCase(preferredLanguage)) {
              name = tag.getValue();
              foundPreferredLanguageName = true;
            }
          }
        }
      }
    }

    return new SpecialTagExtractionResult(name, ref, housenumber, layer, elevation, relationType);
  }