2 votos

Buscar en el shapefile una zona que contenga coordenadas en formato lat/lon mediante GeoTools

Soy nuevo en GeoTools y en los SIG en general. Tengo un shapefile que contiene polígonos de características que representan las zonas de taxis de la ciudad de Nueva York. También tengo las coordenadas en latitud y longitud de los lugares de recogida y entrega de un (gran) número de viajes en taxi.

He leído el Shapefile en un DataStore y puedo iterar sobre las características, pero no tengo idea de cómo consultarlo realmente. Supongo que se trata de una función que proporciona Geotools, pero tal vez me equivoque.

Mi código hasta ahora es el siguiente:

File file = new File("taxi_zones.shp");
FileDataStore myData = FileDataStoreFinder.getDataStore(file);
SimpleFeatureSource source = myData.getFeatureSource();
SimpleFeatureType schema = source.getSchema();

Query query = new Query(schema.getTypeName());

FeatureCollection<SimpleFeatureType, SimpleFeature> collection = source.getFeatures(query);
try (FeatureIterator<SimpleFeature> features = collection.features()) {
    while (features.hasNext()) {
        SimpleFeature feature = features.next();
        System.out.println(feature.getID() + ": ");
        for (Property attribute : feature.getProperties()) {
            if (attribute.getName().toString().equals("the_geom")) {
                System.out.println("\t" + attribute.getName() + ":" + attribute.getValue());
            }
        }
    }
}

EDIT: Desde entonces he encontrado el subproyecto CQL y me doy cuenta de que necesito algo así: Filter filter = ECQL.toFilter("") pero no sé cómo formular el texto de la consulta

1voto

Adam Ernst Puntos 6939

En este respuesta a una pregunta similar probé las 2 formas principales de hacer esto - ya sea haciendo un bucle sobre los puntos y probándolos contra los polígonos, o haciendo un bucle sobre los polígonos y encontrando los puntos coincidentes. La "mejor" solución depende de los tamaños relativos de los conjuntos de datos. En su caso, yo optaría por la opción de polígonos indexados que contienen puntos.

  public static HashMap<String, Integer> polygonLoopIndex(SimpleFeatureCollection points, SimpleFeatureCollection polys,
      Expression propertyName) throws IOException {
    long start = System.currentTimeMillis();
    HashMap<String, Integer> results = new HashMap<>();
    SpatialIndexFeatureCollection index = new SpatialIndexFeatureCollection(points);
    try (SimpleFeatureIterator itr = polys.features()) {
      while (itr.hasNext()) {
        SimpleFeature poly = itr.next();
        Filter filter = filterFactory.within(propertyName, filterFactory.literal(poly.getDefaultGeometry()));
        SimpleFeatureCollection sub = index.subCollection(filter);
        results.put((String) poly.getAttribute("NAME"), sub.size());

      }
    }
    long end = System.currentTimeMillis();
    System.out.println("Indexed Polygon Loop Time = " + (end - start) + "ms");
    return results;
  }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X