package org.mongodb.morphia.query; import org.junit.Before; import org.junit.Test; import org.mongodb.morphia.Datastore; import org.mongodb.morphia.TestBase; import org.mongodb.morphia.geo.City; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mongodb.morphia.geo.GeoJson.point; import static org.mongodb.morphia.geo.PointBuilder.pointBuilder; public class GeoQueriesTest extends TestBase { @Override @Before public void setUp() { // this whole test class is designed for "modern" geo queries checkMinServerVersion(2.4); super.setUp(); } @Test public void shouldFindCitiesCloseToAGivenPointWithinARadiusOfMeters() { // given double latitude = 51.5286416; double longitude = -0.1015987; Datastore datastore = getDs(); City london = new City("London", point(latitude, longitude)); datastore.save(london); City manchester = new City("Manchester", point(53.4722454, -2.2235922)); datastore.save(manchester); City sevilla = new City("Sevilla", point(37.3753708, -5.9550582)); datastore.save(sevilla); getDs().ensureIndexes(); // when List<City> citiesOrderedByDistanceFromLondon = datastore.find(City.class) .field("location") .near(pointBuilder().latitude(latitude) .longitude(longitude).build(), 200000) .asList(); // then assertThat(citiesOrderedByDistanceFromLondon.size(), is(1)); assertThat(citiesOrderedByDistanceFromLondon.get(0), is(london)); } @Test public void shouldFindCitiesOrderByDistanceFromAGivenPoint() { // given double latitudeLondon = 51.5286416; double longitudeLondon = -0.1015987; City manchester = new City("Manchester", point(53.4722454, -2.2235922)); getDs().save(manchester); City london = new City("London", point(latitudeLondon, longitudeLondon)); getDs().save(london); City sevilla = new City("Sevilla", point(37.3753708, -5.9550582)); getDs().save(sevilla); getDs().ensureIndexes(); // when List<City> citiesOrderedByDistanceFromLondon = getDs().find(City.class) .field("location") .near(pointBuilder().latitude(latitudeLondon) .longitude(latitudeLondon).build()) .asList(); // then assertThat(citiesOrderedByDistanceFromLondon.size(), is(3)); assertThat(citiesOrderedByDistanceFromLondon.get(0), is(london)); assertThat(citiesOrderedByDistanceFromLondon.get(1), is(manchester)); assertThat(citiesOrderedByDistanceFromLondon.get(2), is(sevilla)); } }