Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CensusSectorGroup findClosestNEQuadrant(BigDecimal latitude, BigDecimal longitude) {
- String whereClause = 'WHERE SG.latitude >= :latitude AND SG.longitude >= :longitude'
- return runQuadrantQueryWith(whereClause, latitude, longitude)
- }
- private CensusSectorGroup runQuadrantQueryWith (String whereClause, BigDecimal latitude, BigDecimal longitude) {
- String jpql = MAIN_QUERY + whereClause + ORDER_BY
- Query query = em.createQuery(jpql)
- query.setParameter("latitude", latitude)
- query.setParameter("longitude", longitude)
- query.setMaxResults(MAX_RESULTS_QTT)
- List<Quadrant> quadrant= query.getResultList()
- return quadrant?.get(0)?.group
- }
- /* CONSTANTS */
- private static final int MAX_RESULTS_QTT = 1
- private static final String MAIN_QUERY = "SELECT SG," +
- "111.045 * " +
- "FUNC('DEGREES'," +
- "FUNC('ACOS'," +
- "FUNC('COS'," +
- "FUNC('RADIANS',:latitude)" +
- ") * FUNC('COS'," +
- "FUNC('RADIANS',SG.lat_centroid)" +
- ") * FUNC('COS'," +
- "FUNC('RADIANS',:longitude) - FUNC('RADIANS',SG.long_centroid)" +
- ") + FUNC('SIN'," +
- "FUNC('RADIANS',:latitude)" +
- ") * FUNC('SIN'," +
- "FUNC('RADIANS',SG.lat_centroid)))" +
- ") AS distance_in_km" +
- "FROM CensusSectorGroup SG"
- private static final String ORDER_BY = "ORDER BY distance_in_km ASC"
Add Comment
Please, Sign In to add comment