N 마일 반경 내에서 모든 우편 번호를 얻습니다
문제
다음과 같은 기능을 수행하는 가장 좋은 방법은 무엇입니까?
def getNearest(zipCode, miles):
즉, 우편 코드 (07024)와 반경이 주어지면 그 반경 내에있는 모든 우편 번호를 반환합니까?
해결책
Sourceforge에이를 지원할 수있는 프로젝트가 있습니다.
http://sourceforge.net/projects/zips/
우편 번호와 위도 / 경도가 포함 된 데이터베이스와 두 좌표 세트 사이의 거리를 계산하는 방법에 대한 코딩 예제를 제공합니다. 더 좋은 방법이있을 수 있지만 기능이 우편 번호와 좌표를 검색 한 다음 목록의 각 우편 번호를 통해 지정된 마일 수에 해당하는 경우 목록에 우편 번호를 추가 할 수 있습니다.
다른 팁
이것이 정확하기를 원한다면 모든 우편 번호의 위치와 모양을 포함하는 다각형 데이터로 시작해야합니다. 나는 이와 같은 데이터베이스를 가지고 있으며 (미국 인구 조사에서 게시했지만 더 이상 그렇게하지는 않습니다), 그 위에 비슷한 것들을 구축했지만 정확한 요청은 아닙니다.
당신이 존재에 관심이 없다면 정확한 (내가 당신이 생각하지 않는다고 생각하는 것은), 당신은 주문한 zipcodes 및 쿼리 포인트의 중심점 테이블을 얻을 수 있습니다. 큰 원 거리. Postgis 유사한 작업을 수행 할 다른 데이터베이스에 대한 쿼리를 구성 할 수는 있지만이를 수행하기위한 훌륭한 도구를 제공합니다.
내가 사용한 대체 접근법은 원하는 원을 포괄하는 상자를 구성하고 Lon/Lat의 조항 사이에 쿼리 한 다음 앱 코드에서 큰 원을 수행하는 것입니다.
어쩌면 이것은 도움이 될 수 있습니다. 이 프로젝트는 킬로미터로 구성됩니다. CityDao.java에서이를 수정할 수 있습니다
public List<City> findCityInRange(GeoPoint geoPoint, double distance) {
List<City> cities = new ArrayList<City>();
QueryBuilder queryBuilder = geoDistanceQuery("geoPoint")
.point(geoPoint.getLat(), geoPoint.getLon())
//.distance(distance, DistanceUnit.KILOMETERS) original
.distance(distance, DistanceUnit.MILES)
.optimizeBbox("memory")
.geoDistance(GeoDistance.ARC);
SearchRequestBuilder builder = esClient.getClient()
.prepareSearch(INDEX)
.setTypes("city")
.setSearchType(SearchType.QUERY_THEN_FETCH)
.setScroll(new TimeValue(60000))
.setSize(100).setExplain(true)
.setPostFilter(queryBuilder)
.addSort(SortBuilders.geoDistanceSort("geoPoint")
.order(SortOrder.ASC)
.point(geoPoint.getLat(), geoPoint.getLon())
//.unit(DistanceUnit.KILOMETERS)); Original
.unit(DistanceUnit.MILES));
SearchResponse response = builder
.execute()
.actionGet();
SearchHit[] hits = response.getHits().getHits();
scroll:
while (true) {
for (SearchHit hit : hits) {
Map<String, Object> result = hit.getSource();
cities.add(mapper.convertValue(result, City.class));
}
response = esClient.getClient().prepareSearchScroll(response.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
if (response.getHits().getHits().length == 0) {
break scroll;
}
}
return cities;
}
"LocationFinder SRC Main Resources JSON CITIE.JSON"파일에는 벨기에의 모든 도시가 포함되어 있습니다. 원하는 경우 삭제하거나 항목을 만들 수 있습니다. 이름 및/또는 구조를 변경하지 않는 한 코드 변경이 필요하지 않습니다.
readme를 읽으십시오 https://github.com/glennvanschil/locationfinder