Введите почтовый индекс и отобразите пользователей в определенном радиусе

У меня есть приложение Meteor, где поставщики продуктов вводят свой почтовый индекс при регистрации. Эти данные хранятся в файле users.profile.zipcode.

Последовательность действий: 1. Любой посетитель сайта может ввести почтовый индекс в поле поиска. 2. Отображается список поставщиков продуктов с почтовыми индексами в пределах 10 километров от этого почтового индекса.

Сначала приложение будет предназначено для норвежских пользователей, но, возможно, в будущем оно будет распространено на другие страны.

Может ли кто-нибудь предоставить мне пример кода того, как это можно сделать, я думаю, с помощью Google API или чего-то подобного? Я новичок в JavaScript, поэтому полный пример был бы очень признателен. Надеюсь, используя Meteor.Publish и Meteor.Subscribe, включая отображение данных.

Заранее спасибо!


person user3323307    schedule 22.06.2017    source источник
comment
Я рекомендую начать с геопространственных индексов MongoDB.   -  person dr.dimitru    schedule 22.06.2017
comment
Спасибо. Пример кода того, как это можно легко реализовать, был бы очень признателен. Спасибо!   -  person user3323307    schedule 22.06.2017


Ответы (1)


Сначала вам нужно будет преобразовать почтовый индекс в координаты, есть библиотека почтовых индексов - для США и Только для Канады, если вы нацелены на другие регионы/страны, библиотеки можно легко найти на NPM.

Например, у нас есть метод Meteor, который принимает форму с полем zipcode:

import zipcodes from 'zipcodes';

// Create `2dsphere` index
const collection = new Mongo.Collection('someCollectionName');
collection._ensureIndex({zipLoc: '2dsphere'});

Meteor.Methods({
  formSubmit(data) {
    const zipData = zipcodes.lookup(data.zipcode);
    // Save location as geospatial data:
    collection.insert({
      zipLoc: {
        type: "Point",
        coordinates: [zipData.longitude, zipData.latitude]
      }
    });
  }
});

Для поиска в радиусе используйте следующий код:

const searchRadius = 10000; // 10km in meters
const zip = 90210;
const zipData = zipcodes.lookup(zip);

collection.find({
  zipLoc: {
    $near: {
      $geometry: [zipData.longitude, zipData.latitude],
      $maxDistance: searchRadius
    }
  }
});

Дальнейшее чтение:

person dr.dimitru    schedule 22.06.2017
comment
Это выглядит очень хорошо! Я проверю это, как только у меня будет время. Спасибо! - person user3323307; 22.06.2017