mirror of https://github.com/apache/lucene.git
LUCENE-2359: fixed edge case around 180th meridian
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@929956 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3860c16a66
commit
eaca8cc2e8
|
@ -61,6 +61,9 @@ Bug fixes
|
||||||
* LUCENE-2184: Fixed bug with handling best fit value when the proper best fit value is
|
* LUCENE-2184: Fixed bug with handling best fit value when the proper best fit value is
|
||||||
not an indexed field. Note, this change affects the APIs. (Grant Ingersoll)
|
not an indexed field. Note, this change affects the APIs. (Grant Ingersoll)
|
||||||
|
|
||||||
|
* LUCENE-2359: Fix bug in CartesianPolyFilterBuilder related to handling of behavior around
|
||||||
|
the 180th meridian (Grant Ingersoll)
|
||||||
|
|
||||||
API Changes
|
API Changes
|
||||||
|
|
||||||
* LUCENE-2147: Spatial GeoHashUtils now always decode GeoHash strings
|
* LUCENE-2147: Spatial GeoHashUtils now always decode GeoHash strings
|
||||||
|
|
|
@ -103,24 +103,26 @@ public class CartesianPolyFilterBuilder {
|
||||||
// iterate from startX->endX
|
// iterate from startX->endX
|
||||||
// iterate from startY -> endY
|
// iterate from startY -> endY
|
||||||
// shape.add(currentLat.currentLong);
|
// shape.add(currentLat.currentLong);
|
||||||
|
//for the edge cases (prime meridian and the 180th meridian), this call handles all tiles East of the meridian
|
||||||
|
//for all other cases, it handles the whole set of tiles
|
||||||
shape = getShapeLoop(shape,ctp,latX,longX,latY,longY);
|
shape = getShapeLoop(shape,ctp,latX,longX,latY,longY);
|
||||||
|
|
||||||
if (longX2 != 0.0) {
|
if (longX2 != 0.0) {
|
||||||
//We are around the prime meridian
|
if (longX == 0.0) {
|
||||||
if (longX == 0.0) {
|
longX = longX2;
|
||||||
longX = longX2;
|
longY = 0.0;
|
||||||
longY = 0.0;
|
//handles the lower left longitude to the prime meridian
|
||||||
shape = getShapeLoop(shape,ctp,latX,longX,latY,longY);
|
//shape = getShapeLoop(shape, ctp, latX, longX, latY, longY);
|
||||||
} else {//we are around the 180th longitude
|
} else {
|
||||||
longX = longX2;
|
//this clause handles the lower left longitude up to the 180 meridian
|
||||||
longY = -180.0;
|
longX = longX2;
|
||||||
shape = getShapeLoop(shape,ctp,latY,longY,latX,longX);
|
longY = 180.0;
|
||||||
}
|
}
|
||||||
|
shape = getShapeLoop(shape, ctp, latX, longX, latY, longY);
|
||||||
|
|
||||||
|
//System.err.println("getBoxShape2:"+latY+"," + longY);
|
||||||
|
//System.err.println("getBoxShape2:"+latX+"," + longX);
|
||||||
|
}
|
||||||
|
|
||||||
//System.err.println("getBoxShape2:"+latY+"," + longY);
|
|
||||||
//System.err.println("getBoxShape2:"+latX+"," + longX);
|
|
||||||
}
|
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
@ -132,7 +134,11 @@ public class CartesianPolyFilterBuilder {
|
||||||
//System.err.println("getShapeLoop:"+latX+"," + longX);
|
//System.err.println("getShapeLoop:"+latX+"," + longX);
|
||||||
double beginAt = ctp.getTierBoxId(latX, longX);
|
double beginAt = ctp.getTierBoxId(latX, longX);
|
||||||
double endAt = ctp.getTierBoxId(latY, longY);
|
double endAt = ctp.getTierBoxId(latY, longY);
|
||||||
|
if (beginAt > endAt){
|
||||||
|
double tmp = beginAt;
|
||||||
|
beginAt = endAt;
|
||||||
|
endAt = tmp;
|
||||||
|
}
|
||||||
double tierVert = ctp.getTierVerticalPosDivider();
|
double tierVert = ctp.getTierVerticalPosDivider();
|
||||||
//System.err.println(" | "+ beginAt+" | "+ endAt);
|
//System.err.println(" | "+ beginAt+" | "+ endAt);
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,7 @@ public class TestCartesian extends LuceneTestCase {
|
||||||
addPoint(writer,"Hilton Washington Embassy Row",38.9103000,-77.0451000);
|
addPoint(writer,"Hilton Washington Embassy Row",38.9103000,-77.0451000);
|
||||||
addPoint(writer,"HorseFeathers, Bar & Grill", 39.01220000000001, -77.3942);
|
addPoint(writer,"HorseFeathers, Bar & Grill", 39.01220000000001, -77.3942);
|
||||||
addPoint(writer,"Marshall Island Airfield",7.06, 171.2);
|
addPoint(writer,"Marshall Island Airfield",7.06, 171.2);
|
||||||
|
addPoint(writer, "Wonga Wongue Reserve, Gabon", -0.546562,9.459229);
|
||||||
addPoint(writer,"Midway Island",25.7, -171.7);
|
addPoint(writer,"Midway Island",25.7, -171.7);
|
||||||
addPoint(writer,"North Pole Way",55.0, 4.0);
|
addPoint(writer,"North Pole Way",55.0, 4.0);
|
||||||
|
|
||||||
|
@ -163,6 +164,34 @@ public class TestCartesian extends LuceneTestCase {
|
||||||
assertEquals(3474.331719997617, miles);
|
assertEquals(3474.331719997617, miles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*public void testCartesianPolyFilterBuilder() throws Exception {
|
||||||
|
CartesianPolyFilterBuilder cpfb = new CartesianPolyFilterBuilder(CartesianTierPlotter.DEFALT_FIELD_PREFIX, 2, 15);
|
||||||
|
//try out some shapes
|
||||||
|
final double miles = 20.0;
|
||||||
|
// Hawaii
|
||||||
|
// 2300 miles to Marshall Island Airfield
|
||||||
|
//Hawaii to Midway is 911 miles
|
||||||
|
lat = 0;
|
||||||
|
lng = -179.9;
|
||||||
|
Shape shape;
|
||||||
|
shape = cpfb.getBoxShape(lat, lng, miles);
|
||||||
|
System.out.println("Tier: " + shape.getTierLevel());
|
||||||
|
System.out.println("area: " + shape.getArea().size());
|
||||||
|
lat = 30;
|
||||||
|
lng = -100;
|
||||||
|
shape = cpfb.getBoxShape(lat, lng, miles);
|
||||||
|
System.out.println("Tier: " + shape.getTierLevel());
|
||||||
|
System.out.println("area: " + shape.getArea().size());
|
||||||
|
|
||||||
|
lat = 30;
|
||||||
|
lng = 100;
|
||||||
|
shape = cpfb.getBoxShape(lat, lng, miles);
|
||||||
|
System.out.println("Tier: " + shape.getTierLevel());
|
||||||
|
System.out.println("area: " + shape.getArea().size());
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
public void testAntiM() throws IOException, InvalidGeoException {
|
public void testAntiM() throws IOException, InvalidGeoException {
|
||||||
searcher = new IndexSearcher(directory, true);
|
searcher = new IndexSearcher(directory, true);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue