Aquí podría ser tu PUBLICIDAD


¿Cómo encontrar las ciudades más cercanas en un radio determinado?

votos
9

¿Conoces alguna utilidad o un sitio web en el que pueda proporcionar la distancia de la ciudad, el estado y el radio de los EE. UU. En millas como entrada y me devolverá todas las ciudades dentro de ese radio?

¡Gracias!

Publicado el 12/03/2009 a las 21:28
fuente por usuario Jeremy Thomson
En otros idiomas...        العربية       

6 respuestas

votos
5

Así es como lo hago.

Puede obtener una lista de ciudades, st, códigos postales y sus latitudes y longitudes. (No recuerdo la parte superior de mi cabeza donde obtuvimos la nuestra)

editar: http://geonames.usgs.gov/domestic/download_data.htm como alguien mencionado anteriormente probablemente funcione.

Luego puede escribir un método para calcular la latitud y la longitud mínimas y máximas en función de un radio, y consultar para todas las ciudades entre esas mínimas y máximas. Luego recorra y calcule la distancia y elimine cualquiera que no esté en el radio

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

Hay un fragmento de mi código, con suerte puedes ver lo que está sucediendo. Empiezo con un ZipCodes (una tabla en mi base de datos), luego retiro posibles coincidencias y finalmente elimino a los que no están en el radio.

Respondida el 12/03/2009 a las 09:52
fuente por usuario Sheldon Ross


Aquí podría ser tu PUBLICIDAD


votos
4

Oracle, PostGIS, mysql con extensiones GIS, sqlite con extensiones GIS admiten este tipo de consultas.

Si no tiene el conjunto de datos a:

http://www.geonames.org/

Respondida el 12/03/2009 a las 09:40
fuente por usuario Vasil

votos
2

Puede obtener una base de datos bastante buena de ciudades geolocalizadas / nombres de lugares de http://geonames.usgs.gov - encuentre un volcado de base de datos apropiado, impórtelo en su base de datos y realice el tipo de consulta que su necesidad es bastante sencilla, especialmente si su DBMS admite algún tipo de consultas espaciales (por ejemplo, como Oracle Spatial , MySQL Spatial Extensions , PostGIS o SQLServer 2008 )

Vea también: cómo hacer una búsqueda basada en la ubicación

Respondida el 12/03/2009 a las 09:37
fuente por usuario Paul Dixon

votos
2

Echa un vistazo a este servicio web anunciado en xmethods.net. Requiere una suscripción para usar realmente, pero afirma hacer lo que necesita.

El método anunciado en la descripción de la pregunta:

GetPlacesWithin Devuelve una lista de geo lugares dentro de una distancia especificada desde un lugar determinado. Parámetros: lugar - nombre de lugar (65 caracteres máximo), estado - código de estado de 2 letras (no requerido para códigos postales), distancia - distancia en millas, placeTypeToFind - tipo de lugar a buscar: código postal o ciudad (incluidos pueblos, ciudades , etc.)

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

Respondida el 12/03/2009 a las 09:37
fuente por usuario sgriffinusa

votos
0

Tal vez esto puede ayudar. El proyecto se configura en kilómetros sin embargo. Puede modificar estos en 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;
}

Los "LocationFinder \ src \ principales recursos \ \ JSON \ cities.json" archivo contiene todas las ciudades de Bélgica. Puede eliminar o crear entradas si quieres también. Mientras no cambie los nombres y / o estructura, no se requieren cambios en el código.

Asegúrese de leer el README https://github.com/GlennVanSchil/LocationFinder

Respondida el 01/06/2016 a las 04:50
fuente por usuario Glenn Van Schil

votos
0

No tengo un sitio web, pero lo hemos implementado tanto en Oracle como una función de base de datos y en SAS como macro de estadísticas. Solo requiere una base de datos con todas las ciudades y su latitud y longitud.

Respondida el 12/03/2009 a las 09:31
fuente por usuario AFHood