2017-06-22 3 views
1

J'ai une application Meteor où les fournisseurs de produits entrent leur code postal lors de l'inscription. Ces données sont stockées dans users.profile.zipcode.Saisir le code postal et afficher les utilisateurs dans un certain rayon

Débit: 1. Toute personne visitant le site peut entrer un code postal dans un champ de recherche. 2. Une liste des fournisseurs de produits avec codes postaux dans un rayon de 10 kilomètres de ce code postal est affichée.

L'application sera pour les utilisateurs norvégiens pour commencer, mais sera peut-être étendu à différents pays à l'avenir.

Quelqu'un peut-il me fournir un exemple de code de la façon dont cela peut être fait, je suppose que l'utilisation de l'API Google ou quelque chose de similaire? Je suis assez nouveau pour JavaScript, donc un exemple complet serait très apprécié. Espérons utiliser Meteor.Publish et Meteor.Subscribe, y compris l'affichage des données.

Merci d'avance!

+0

Je recommande de commencer par MongoDB [index géospatial] (https://docs.mongodb.com/manual/applications/geospatial-indexes/) –

+0

Remerciez toi. Un exemple de code sur la façon dont cela peut être facilement mis en œuvre serait très apprécié. Je vous remercie! – user3323307

Répondre

0

Vous devez d'abord convertir le code postal en coordonnées, il y a un zipcodes lib - pour les États-Unis et le Canada uniquement, si vous êtes ciblé, d'autres bibliothèques de régions/pays peuvent être facilement trouvées sur NPM.

Par exemple, nous avons une méthode Meteor qui accepte de former avec zipcode champ:

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] 
     } 
    }); 
    } 
}); 

Pour effectuer une recherche dans l'utilisation du rayon code suivant:

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 
    } 
    } 
}); 

Pour en savoir plus:

+1

Cela semble plutôt bien! Je vais vérifier dès que j'ai le temps. Je vous remercie! – user3323307