Skip to content

geo_polygon not handling polygons that cross the date line properly #5968

@pablocastro

Description

@pablocastro

Using Elasticsearch 1.1.1. I'm seeing geo_polygon behave oddly when the input polygon cross the date line. From a quick look at GeoPolygonFilter.GeoPolygonDocSet.pointInPolygon it doesn't seem that this is explicitly handled.

The reproduce this create an index/mapping as:

POST /geo

{ "mappings": { "docs": { "properties": { "p": { "type": "geo_point" } } } } }

Upload a document:

PUT /geo/docs/1

{ "p": { "lat": 40, "lon": 179 } }

Search with a polygon that's a box around the uploaded point and that crosses the date line:

POST /geo/docs/_search

{
  "filter": { "geo_polygon": { "p": { "points": [
      { "lat": 42, "lon": 178 },
      { "lat": 39, "lon": 178 },
      { "lat": 39, "lon": -179 },
      { "lat": 42, "lon": -179 },
      { "lat": 42, "lon": 178 }
  ] } } }
}

ES returns 0 results. If I use a polygon that stays to the west of the date line I do get results:

{
  "filter": { "geo_polygon": { "p": { "points": [
      { "lat": 42, "lon": 178 },
      { "lat": 39, "lon": 178 },
      { "lat": 39, "lon": 179.5 },
      { "lat": 42, "lon": 179.5 },
      { "lat": 42, "lon": 178 }
  ] } } }
}

Also, if I use a bounding box query with the same coordinates as the initial polygon, it does work:

{
  "filter": { "geo_bounding_box": { "p": 
    { "top_left": { "lat": 42, "lon": 178 },
       "bottom_right": { "lat": 39, "lon": -179 }
     }
  } }
}

It seems that this code needs to either split the check into east and west checks or normalize the input values. Am I missing something?

Metadata

Metadata

Assignees

No one assigned

    Labels

    :Analytics/GeoIndexing, search aggregations of geo points and shapes>bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions