Как найти ближайшие города в данном радиусе?

Чтобы иметь возможность инициализировать адаптер, вам необходимо иметь действительный запрос. И чтобы создать запрос, вам нужно иметь searchData. Это означает, что инициализация firebaseRecyclerAdapter должна происходить внутри onClick.

imgB.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View view)
    {
       query = mProfileDatabase.orderByChild("djprofile")
                .startAt(searchData)
                .endAt(searchData + "\uf8ff");

        FirebaseRecyclerOptions<DjProfile> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<DjProfile>()
                .setQuery(query, DjProfile.class)
                .build();
        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DjProfile, ResultsViewHolder>(firebaseRecyclerOptions)
        {

            @NonNull
            @Override
            public ResultsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.searchitem_list, viewGroup, false);

                return new ResultsViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull ResultsViewHolder holder, int position, @NonNull DjProfile model) {
                holder.setDjProfile(model);
            }
        };
        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }
});
9
задан Pyrolistical 12 March 2009 в 20:39
поделиться

5 ответов

Вот то, как я делаю это.

Можно получить список города, Св., почтовых индексов и их широт и долгот. (Я не могу вспомнить первое, что пришло на ум, где мы получили наш),

править: http://geonames.usgs.gov/domestic/download_data.htm как кто-то упомянутый выше, вероятно, работал бы.

Затем можно записать метод для вычисления минуты и макс. широты и долгот на основе радиуса и запроса для всех городов между теми минутами и максимум. Затем цикл через и вычисляет расстояние и удаляет любого, которые не находятся в радиусе

double latitude1 = Double.parseDouble(zipCodes.getLatitude().toString());
double longitude1 = Double.parseDouble(zipCodes.getLongitude().toString());

//Upper reaches of possible boundaries
double upperLatBound = latitude1 + Double.parseDouble(distance)/40.0;
double lowerLatBound = latitude1 - Double.parseDouble(distance)/40.0;

double upperLongBound = longitude1 + Double.parseDouble(distance)/40.0;
double lowerLongBound = longitude1 - Double.parseDouble(distance)/40.0;

//pull back possible matches
SimpleCriteria zipCriteria = new SimpleCriteria();
zipCriteria.isBetween(ZipCodesPeer.LONGITUDE, lowerLongBound, upperLongBound);
zipCriteria.isBetween(ZipCodesPeer.LATITUDE, lowerLatBound, upperLatBound);
List zipList = ZipCodesPeer.doSelect(zipCriteria);
ArrayList acceptList = new ArrayList();

if(zipList != null)
{
    for(int i = 0; i < zipList.size(); i++)
    {
        ZipCodes tempZip = (ZipCodes)zipList.get(i);
        double tempLat = new Double(tempZip.getLatitude().toString()).doubleValue();
        double tempLon = new Double(tempZip.getLongitude().toString()).doubleValue();
        double d = 3963.0 * Math.acos(Math.sin(latitude1 * Math.PI/180) * Math.sin(tempLat * Math.PI/180) + Math.cos(latitude1 * Math.PI/180) * Math.cos(tempLat * Math.PI/180) *  Math.cos(tempLon*Math.PI/180 -longitude1 * Math.PI/180));

        if(d < Double.parseDouble(distance))
        {
            acceptList.add(((ZipCodes)zipList.get(i)).getZipCd());  
        }
    }
}

Существует выборка моего кода, надо надеяться, Вы видите то, что происходит. Я начинаю с одним ZipCodes (таблица в моем DB), затем я задерживаю возможные соответствия, и наконец я избавляюсь от тех, кто не находится в радиусе.

5
ответ дан 4 December 2019 в 15:26
поделиться

Oracle, PostGIS, mysql с расширениями GIS, sqlite с расширениями GIS вся поддержка этот вид запросов.

Если у Вас нет взгляда набора данных на:

http://www.geonames.org/

4
ответ дан 4 December 2019 в 15:26
поделиться

У меня нет веб-сайта, но мы реализовали это и в Oracle как функция базы данных и в SAS как макрос статистики. Это только требует базы данных со всеми городами и их lat и долго.

0
ответ дан 4 December 2019 в 15:26
поделиться

Смотрите на этот веб-сервис, рекламируемый на xmethods.net. Это требует, чтобы подписка на самом деле использовала, но утверждает, что сделало то, в чем Вы нуждаетесь.

Рекламируемый метод в описании вопроса:

Возвраты GetPlacesWithin список гео-мест на указанном расстоянии от данного места. Параметры: место - название места (65 символов макс.), состояние - 2 кода состояния буквы (не требуемый для почтовых индексов), расстояние - расстояние в милях, placeTypeToFind - тип места для поиска: ZipCode или Город (включая любые деревни, города, и т.д.).

http://xmethods.net/ve2/ViewListing.po?key=uuid:5428B3DD-C7C6-E1A8-87D6-461729AF02C0

2
ответ дан 4 December 2019 в 15:26
поделиться

Можно получить довольно хорошую базу данных определенных геолокацию городов/топонимов из http://geonames.usgs.gov - находят соответствующий дамп базы данных, импортируют его в DB и выполнение вида запроса потребность довольно проста, особенно если DBMS поддерживает некоторые пространственные запросы (например, как Пространственная Oracle, MySQL Spatial Extensions, PostGIS или 2008 SQLServer)

См. также: как сделать основанный на местоположении поиск

2
ответ дан 4 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: