Mam zapisaną trasę w ElasticSearch
jako wielokąta. Teraz mam okrąg (punkt i promień), jestem w stanie sprawdzić, czy punkty koła przecinają wielokąt, czy nie (poniżej jest kod, którego użyłem).Jak uzyskać punkty przecięcia z kształtu w ElasticSearch
Pytanie: Jak mogę zdobyć punkty na trasie przecinającej okrąg?
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;
}
Ponieważ masz wielokąt, masz kilka linii, które możesz sprawdzić na przecięciu. Powinieneś być w stanie znaleźć całkiem sporo metod, jak to zrobić w wyszukiwaniu w Internecie (szukałem albo "przecięcia linii okręgu", albo "skrzyżowania wielokąta"). – Thomas
@Thomas Próbowałem już. Nie mogę iść i ręcznie zastosować żadnej formuły we wszystkich tych punktach. Mam dużo danych. Więc nie szukam rozwiązania out of box. Sprawdziłem ES API i nie znalazłem żadnego .... –
Nie rozumiem dlaczego nie powinno to być możliwe. Wystarczy przekazać punkty i powtórzyć je, budując odcinek linii od i oraz i + 1 i sprawdzając, czy na skrzyżowaniu. Wydajność może być problemem, jeśli masz dużo punktów, ale jest kilka opcji, które przyspieszają, ale które będą miały zastosowanie, zależy od okoliczności. – Thomas