2016-07-04 35 views
7

Ho memorizzato un percorso in ElasticSearch come poligono. Ora ho un cerchio (un punto e un raggio), sono in grado di controllare che i punti del cerchio intersechi il poligono o meno (di seguito è riportato il codice che ho usato).Come ottenere i punti di intersezione dalla forma in ElasticSearch

Domanda: Come posso ottenere i punti nel percorso che interseca il cerchio?

Route and Circle

public Boolean isMatchingDoc(Long elasticDocId, Double latitude, Double longitude, Long radius) { 
    Coordinate origin = new Coordinate(latitude, longitude); 
    ShapeBuilder circleShapeBuilder = ShapeBuilder.newCircleBuilder().center(origin).radius(radius, 
      DistanceUnit.METERS); 
    GeoShapeQueryBuilder geoShapeQueryBuilder = QueryBuilders.geoShapeQuery("route", circleShapeBuilder); 
    SearchRequestBuilder finalQuery = client.prepareSearch(INDEX).setTypes(TYPE) 
      .setQuery(QueryBuilders.termQuery("_id", elasticDocId)).setPostFilter(geoShapeQueryBuilder); 
    SearchResponse searchResponse = finalQuery.execute().actionGet(); 
    SearchHits searchHits = searchResponse.getHits(); 
    if (searchHits.getTotalHits() > 0) { 
     return true; 
    } 
    return false; 
} 
+1

Poiché si dispone di un poligono, si dispone di un gruppo di linee che è possibile verificare per l'intersezione. Dovresti essere in grado di trovare molti metodi su come farlo in una ricerca web (cercherò sia "intersezione della linea circolare" o "intersezione poligonale del cerchio") – Thomas

+0

@Thomas ho provato quelli già. Non posso andare e applicare manualmente una formula su tutti questi punti. Ho molti dati Quindi non sto cercando una soluzione pronta per l'uso. Ho controllato l'API ES e non l'ho trovato .... –

+0

Non capisco perché non dovrebbe essere possibile. Basta passare i punti e scorrere su di essi, costruendo un segmento di linea da i e i + 1 e verificando che per l'intersezione. Le prestazioni potrebbero essere un problema se si hanno molti punti, ma ci sono alcune opzioni per accelerare le cose, anche se ciò sarebbe applicabile dipende dalle circostanze. – Thomas

risposta

0

immagino si è consapevoli del fatto che con elasticsearch, è possibile interrogare per i poligoni che si intersecano un dato cerchio? Vedi https://www.elastic.co/guide/en/elasticsearch/guide/current/querying-geo-shapes.html.

Ci sono due ragioni per cui questo non si può aiutare:

  1. I tuoi percorsi non sono poligoni, ma le linee.
  2. Vuoi conoscere i punti esatti dell'incrocio, se ho letto correttamente la tua domanda.

Elasticsearch probabilmente non è in grado di risolvere questo problema a proprio piacimento. Potrebbe essere possibile risolvere se si memorizzassero tutti i segmenti di linea separatamente anziché in un enorme poligono per rotta. Ogni segmento di linea dovrebbe quindi avere un attributo che faccia riferimento al percorso a cui appartiene. Questo approccio ti sembra fattibile?

In ogni caso, ti consiglio di esaminare l'argomento "database spaziali": I database spaziali sono ottimizzati per l'indicizzazione e la ricerca in uno spazio geometrico. Database ben noti come PostgreSQL e MongoDB dispongono di plug-in/estensioni per l'indicizzazione spaziale. Non sono sicuro di cosa consigliare, ma il MongoDB geospatial API sembra promettente, ad esempio, poiché consente di eseguire query per l'intersezione e supporta sia linee che poligoni.

+0

Anche se è un poligono/linea o altro, è semplicemente impostato di latlng giusto? Se ES è in grado di confrontare i punti, dovrebbero essere in grado di recuperarli. Posso vederlo come un problema di progettazione dell'API. Vero/falso restituito da un datastore è inutile. –