Пример #1
0
  @Override
  public String[] getFieldValues(BoboIndexReader reader, int id) {
    GeoFacetData dataCache = getFacetData(reader);
    BigFloatArray xvals = dataCache.get_xValArray();
    BigFloatArray yvals = dataCache.get_yValArray();
    BigFloatArray zvals = dataCache.get_zValArray();

    float xvalue = xvals.get(id);
    float yvalue = yvals.get(id);
    float zvalue = zvals.get(id);
    float lat = GeoMatchUtil.getMatchLatDegreesFromXYZCoords(xvalue, yvalue, zvalue);
    float lon = GeoMatchUtil.getMatchLonDegreesFromXYZCoords(xvalue, yvalue, zvalue);

    String[] fieldValues = new String[2];
    fieldValues[0] = String.valueOf(lat);
    fieldValues[1] = String.valueOf(lon);
    return fieldValues;
  }
Пример #2
0
    public void load(String latFieldName, String lonFieldName, BoboIndexReader reader)
        throws IOException {
      if (reader == null) throw new NullPointerException("reader object is null");
      if (latFieldName == null) throw new NullPointerException("latitude Field Name is null");
      if (lonFieldName == null) throw new NullPointerException("longitude Field Name is null");

      String latField = latFieldName.intern();
      String lonField = lonFieldName.intern();
      int maxDoc = reader.maxDoc();

      BigFloatArray xVals = this._xValArray;
      BigFloatArray yVals = this._yValArray;
      BigFloatArray zVals = this._zValArray;

      if (xVals == null) xVals = newInstance(maxDoc);
      else xVals.ensureCapacity(maxDoc);
      if (yVals == null) yVals = newInstance(maxDoc);
      else yVals.ensureCapacity(maxDoc);
      if (zVals == null) zVals = newInstance(maxDoc);
      else zVals.ensureCapacity(maxDoc);

      this._xValArray = xVals;
      this._yValArray = yVals;
      this._zValArray = zVals;

      Term latTerm = new Term(latFieldName, "");
      TermDocs termDocs = reader.termDocs(latTerm);
      TermEnum termEnum = reader.terms(latTerm);

      float docLat, docLon;
      int termCount = 1;
      String lonValue = null;
      int length = maxDoc + 1;
      int doc;
      termDocs.next();
      try {
        do {
          Term term = termEnum.term();
          if (term == null || term.field() != latFieldName) continue;

          if (termCount > xVals.capacity())
            throw new IOException("Maximum number of values cannot exceed: " + xVals.capacity());
          if (termCount >= length)
            throw new RuntimeException(
                "There are more terms than documents in field "
                    + latFieldName
                    + " or "
                    + lonFieldName
                    + ", but its impossible to sort on tokenized fields");

          // pull the termDocs to point to the document for the current term in the termEnum
          termDocs.seek(termEnum);
          while (termDocs.next()) {
            doc = termDocs.doc();

            // read the latitude value in the current document
            docLat = Float.parseFloat(term.text().trim());
            // read the longitude value in the current document
            Document docVal = reader.document(doc, null);
            lonValue = docVal.get(lonFieldName);
            if (lonValue == null) continue;
            else docLon = Float.parseFloat(lonValue);

            // convert the lat, lon values to x,y,z coordinates
            float[] coords = GeoMatchUtil.geoMatchCoordsFromDegrees(docLat, docLon);
            _xValArray.add(doc, coords[0]);
            _yValArray.add(doc, coords[1]);
            _zValArray.add(doc, coords[2]);
          }
        } while (termEnum.next());
      } catch (Exception e) {
        // TODO: get rid of this catch phrase
        e.printStackTrace();
      } finally {
        if (termDocs != null) termDocs.close();
        if (termEnum != null) termEnum.close();
      }
    }