Nicholas Knize created LUCENE-8669:
--------------------------------------

             Summary: LatLonShape WITHIN queries fail with Multiple search 
Polygons that share the dateline
                 Key: LUCENE-8669
                 URL: https://issues.apache.org/jira/browse/LUCENE-8669
             Project: Lucene - Core
          Issue Type: Improvement
            Reporter: Nicholas Knize


{{LatLonShape.newPolygonQuery}} does not support dateline crossing polygons. It 
is therefore up to the calling application / user to split dateline crossing 
polygons into a {{MultiPolygon}} query with two search polygons that share the 
dateline. This, however, does not produce expected results because 
{{EdgeTree.internalComponentRelateTriangle}} does not differentiate between a 
triangle that {{CROSSES}} or is {{WITHIN}} the target polygon. Therefore 
{{MultiPolygon}} {{WITHIN}} queries that share the dateline behave as an 
{{INTERSECT}} and will therefore produce incorrect results.

Consider the following test, for example:
{code:java}
    // index
    // western poly
    Polygon indexPoly1 = new Polygon(
        new double[] {-7.5d, 15d, 15d, 0d, -7.5d},
        new double[] {-180d, -180d, -176d, -176d, -180d}
    );

    // eastern poly
    Polygon indexPoly2 = new Polygon(
        new double[] {15d, -7.5d, -15d, -10d, 15d, 15d},
        new double[] {180d, 180d, 176d, 174d, 176d, 180d}
    );

    //// index ////
    Field[] fields = LatLonShape.createIndexableFields("test", indexPoly1);
    for (Field f : fields) {
      doc.add(f);
    }
    fields = LatLonShape.createIndexableFields("test", indexPoly2);
    for (Field f : fields) {
      doc.add(f);
    }
    writer.addDocument(doc);

    ///// search //////
    Polygon[] searchPoly = new Polygon[] {
        new Polygon(new double[] {-20d, 20d, 20d, -20d, -20d},
            new double[] {-180d, -180d, -170d, -170d, -180d}),
        new Polygon(new double[] {20d, -20d, -20d, 20d, 20d},
            new double[] {180d, 180d, 170d, 170d, 180d})
    };

    Query q = LatLonShape.newPolygonQuery("test", QueryRelation.WITHIN, 
searchPoly);
    assertEquals(1, searcher.count(q));
{code}
 

In the example above, a dateline spanning polygon is indexed as a 
{{MultiPolygon}} with two polygons that share the dateline. Similarly, a 
polygon that spans the dateline is provided as  two polygons that share the 
dateline in a {{WITHIN}} query. The indexed polygon should be returned as a 
match; but it does not.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to