給定一個柵格,求出柵格里面的所有geoHash。至于什么是geoHash這邊不多解釋;做法肯定也不止一種,這里利用第三方工具包,引入包。
<dependency>
<groupId>ch.hsr</groupId>
<artifactId>geohash</artifactId>
<version>1.4.0</version>
</dependency>
/**
* @param maxLat 矩形內緯度的最大值
* @param minLng 矩形內經度的最小值
* ???????????????????????????? 左上角的經緯度
* @param minLat 矩形內緯度的最小值
* @param maxLng 矩形內經度的最大值
* ???????????????????????????? 右下角的經緯度
* @param precision geoHash的精度
* @Description: 獲取指定經緯度范圍內的geoHash編碼
*/
public static HashSet<String> getGeoHashByFence(double maxLat, double minLng, double minLat, double maxLng, int precision) {
//通過矩形的左下角 (西南角) 構建一個精度為precision的geoHash值
GeoHash southWestCorner = GeoHash.withCharacterPrecision(minLat, minLng, precision);
//通過矩形的右上角 (東北角) 構建一個精度為precision的geoHash值
GeoHash northEastCorner = GeoHash.withCharacterPrecision(maxLat, maxLng, precision);
//使用兩個geoHash構建一個外接盒型 TwoGeoHashBoundingBox twoGeoHashBoundingBox = new TwoGeoHashBoundingBox(southWestCorner, northEastCorner);
//盒型geoHash迭代器,獲取矩形內的全部geoHash
BoundingBoxGeoHashIterator iterator = new BoundingBoxGeoHashIterator(twoGeoHashBoundingBox);
List<Rectangle> list = Lists.newArrayList();
HashSet<String> set = Sets.newHashSet();
GeoHash geoHash;
//循環(huán)遍歷
while (iterator.hasNext())
{
geoHash = iterator.next();
list.add(getFence(geoHash));
//獲取geoHash編碼 set.add(geoHash.toBase32());
}
return set;
}
/**
* @param geoHash 指定的geoHash
* @Description: 獲取指定geoHash的矩形
*/
public static Rectangle getFence(GeoHash geoHash) {
//獲取geoHash的矩形
BoundingBox boundingBox = geoHash.getBoundingBox();
//獲取矩形的左下角(西南角)經緯度
WGS84Point northWestCorner = boundingBox.getSouthWestCorner();
//獲取矩形的右上角(東北角)經緯度
WGS84Point southEastCorner = boundingBox.getNorthEastCorner();
//包裝成矩形
return new Rectangle(northWestCorner.getLongitude(), northWestCorner.getLatitude(), southEastCorner.getLongitude(), southEastCorner.getLatitude());
}
geohash范圍介紹
geohash根據字符串的長度代表著生成矩形覆蓋的范圍,比如當wx4g29代表著寬為1.2km,高為609m的一個矩形,具體的一些范圍如下圖:
