سؤال

ما هي أفضل طريقة للحصول على وظيفة كما يلي للعمل:

def getNearest(zipCode, miles):

وهذا هو، إعطاء الرمز البريدي (07024) ونصف قطرها، وعودة جميع zipcodes التي تقع ضمن دائرة نصف قطرها أن؟

هل كانت مفيدة؟

المحلول

وهناك مشروع على سورس التي يمكن أن تساعد مع هذا:

http://sourceforge.net/projects/zips/

فهو يوفر لك قاعدة بيانات مع رموز البريدي وعلى خط العرض / خط الطول، وكذلك أمثلة الترميز كيفية حساب المسافة بين مجموعتين من الإحداثيات. هناك ربما طريقة أفضل للقيام بذلك، ولكن هل يمكن أن يكون الدالة استرداد والرمز البريدي وإحداثياتها، ثم خطوة من خلال كل الرمز البريدي في القائمة وإضافة الرمز البريدي إلى قائمة اذا ما وقعت ضمن عدد الأميال المحدد.

نصائح أخرى

إذا كنت تريد أن تكون دقيقة، ويجب عليك أن تبدأ مع البيانات المضلع الذي يتضمن موقع وشكل كل الرمز البريدي. لدي قاعدة بيانات مثل هذا (كانت تصدر من قبل تعداد الولايات المتحدة، لكنها لم تعد تفعل ذلك) وبنينا أشياء مماثلة فوق ذلك، ولكن ليس هذا الطلب المحدد.

إذا كنت لا تهتم أن تكون <م> بالضبط (الذي انا التخمين كنت لا)، يمكنك الحصول على جدول نقطة وسط zipcodes ونقاط الاستعلام التي أمر بها <لأ href = "http://mathforum.org/library/drmath/view/66987.html" يختلط = "نوفولو noreferrer"> كبيرة المسافة دائرة . PostGIS يوفر أدوات كبيرة للقيام بذلك، على الرغم من أنك قد بناء استعلام ضد قواعد البيانات الأخرى التي من شأنها أن تؤدي مهام مماثلة.

وثمة نهج بديل لقد استعملت هو بناء مربع يشمل الدائرة التي تريدها، الاستعلام مع بين الشرط على خط الطول / خطوط الطول وثم القيام الدائرة العظمى في التعليمات البرمجية التطبيق.

وربما هذا يمكن أن تساعد. تم تكوين المشروع بالكيلومترات بالرغم من ذلك. يمكنك تعديل هذه في 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 \ الرئيسية الموارد \ \ سلمان \ cities.json" ملف يحتوي على كافة المدن من بلجيكا. يمكنك حذف أو إنشاء إدخالات إذا كنت تريد أيضا. طالما لم تقم بتغيير أسماء و / أو بنية، ليس هناك حاجة لتغييرات التعليمات البرمجية.

تأكد من قراءة README https://github.com/GlennVanSchil/LocationFinder

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top