blob: 33029519d006899306d80e71fa25cb212ce2d756 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.examples.datagrid;
import java.util.Collection;
import java.util.Random;
import javax.cache.Cache;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.query.SqlQuery;
import org.apache.ignite.cache.query.annotations.QuerySqlField;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.examples.ExampleNodeStartup;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.WKTReader;
/**
* This examples shows the usage of geospatial queries and indexes in Apache Ignite.
* For more information please refer to the following technical documentation:
* http://apacheignite.readme.io/docs/geospatial-queries
* <p>
* Remote nodes should be started using {@link ExampleNodeStartup} which will
* start node with {@code examples/config/example-ignite.xml} configuration.
*/
public class SpatialQueryExample {
/** Cache name. */
private static final String CACHE_NAME = SpatialQueryExample.class.getSimpleName();
/**
* @param args Command line arguments, none required.
*/
public static void main(String[] args) throws Exception {
// Starting Ignite node.
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
// Preparing the cache configuration.
CacheConfiguration<Integer, MapPoint> cc = new CacheConfiguration<>(CACHE_NAME);
// Setting the indexed types.
cc.setIndexedTypes(Integer.class, MapPoint.class);
// Starting the cache.
try (IgniteCache<Integer, MapPoint> cache = ignite.createCache(cc)) {
Random rnd = new Random();
WKTReader r = new WKTReader();
// Adding geometry points into the cache.
for (int i = 0; i < 1000; i++) {
int x = rnd.nextInt(10000);
int y = rnd.nextInt(10000);
Geometry geo = r.read("POINT(" + x + " " + y + ")");
cache.put(i, new MapPoint(geo));
}
// Query to fetch the points that fit into a specific polygon.
SqlQuery<Integer, MapPoint> query = new SqlQuery<>(MapPoint.class, "coords && ?");
// Selecting points that fit into a specific polygon.
for (int i = 0; i < 10; i++) {
// Defining the next polygon boundaries.
Geometry cond = r.read("POLYGON((0 0, 0 " + rnd.nextInt(10000) + ", " +
rnd.nextInt(10000) + " " + rnd.nextInt(10000) + ", " +
rnd.nextInt(10000) + " 0, 0 0))");
// Executing the query.
Collection<Cache.Entry<Integer, MapPoint>> entries = cache.query(query.setArgs(cond)).getAll();
// Printing number of points that fit into the area defined by the polygon.
System.out.println("Fetched points [cond=" + cond + ", cnt=" + entries.size() + ']');
}
}
}
}
/**
* MapPoint with indexed coordinates.
*/
private static class MapPoint {
/** Coordinates. */
@QuerySqlField(index = true)
private Geometry coords;
/**
* @param coords Coordinates.
*/
private MapPoint(Geometry coords) {
this.coords = coords;
}
}
}