1

Google マップを使って検索するビジネス ディレクトリ サイトを開発しています。ユーザーはさまざまな基準に基づいて自分の地域のビジネスを検索できますが、主な目的は、たとえば「ニュージャージーの配管工」を検索すると、ニュージャージーのすべての配管工の結果が得られるということです。ただし、「ジャージー ショアの配管工」を検索すると、ジャージー ショアで操業している配管工のみを取得する必要があります。この例では、ニュージャージー州の郊外またはその他のタイプの区画になります。余談ですが、「plumbers in」を削除して、実際の地理的検索用語のみを渡すので、実際の G​​oogle マップ検索は「New Jersey」または「Jersey Shore」のみになります。したがって、実際の検索テキスト自体に注目しないでください。

これは私の検索スニペットです:

var latlng = results[0].geometry.location;//results is google maps search result for address
console.log(results[0]);
map.setCenter(latlng.lat(), latlng.lng());
map.addMarker({
    lat: latlng.lat(),
    lng: latlng.lng(),
    icon: 'https://maps.google.com/mapfiles/kml/shapes/schools_maps.png'
});

var closestmarkers = [];
var MAXDISTANCE = 5;//radius of our search area in km
closestmarkers = find_n_closest_markers(latlng, n, MAXDISTANCE);//see below snippet for function definition

これは、検索された に最も近いマーカーを特定する JavaScript です。

function find_n_closest_markers(latlng, n, MAXDISTANCE){
    var lat = latlng.lat();
    var lng = latlng.lng();
    var R = 6371; // radius of earth in km
    var distances = [];
    var closest = -1;
    for (i = 0; i < map.markers.length; i++) {
        var mlat = map.markers[i].position.lat();
        var mlng = map.markers[i].position.lng();
        var dLat = rad(mlat - lat);
        var dLong = rad(mlng - lng);
        var a = Math.sin(dLat / 2)
              * Math.sin(dLat / 2)
              + Math.cos(rad(lat))
              * Math.cos(rad(lat))
              * Math.sin(dLong / 2)
              * Math.sin(dLong / 2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        var d = R * c;

        distances[i] = { distance: d, index: i };
    }
    distances.sort(comparedistances);

    //remove all distances greater than MAXDISTANCE
    toofarindex = -1;
    for (j = 0; j < distances.length; j++)
    {
        if(distances[j].distance >= MAXDISTANCE)
        {
            toofarindex = j;
            break;
        }
    }

    if (toofarindex != -1)
    {
        distances = distances.splice(0, toofarindex - 1);
    }

    //return first n + 1 items(the closest marker is the one indicating the user's current/preferred location. which doesn't count)
    if (distances.length > n + 1)
    {
        distances = distances.splice(0, n + 1);
    }
    return distances;
}

私は実際の機能について心配していません。それは100%機能します。私が探しているのは、検索語に基づいて、MAXDISTANCE の値がどうあるべきかを把握する方法です。現時点では 5 が適切な妥協点ですが、たとえば、ニュージャージーは直径 20 マイルであるのに対し、ジャージー ショアはわずか 5 マイルであることを知っておく必要があります (これらの数値は、実際の地図ではなく、私の耳から直接出てきます)。

4

1 に答える 1