문제

다음과 같은 기능을 수행하는 가장 좋은 방법은 무엇입니까?

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top