Hier ist, wie ich es tun.
Sie können eine Liste von Städten, Städten, Postleitzahlen und deren Breiten und Längen erhalten. (Ich kann die Spitze von meinem Kopf erinnern, wo wir uns vor)
edit: http://geonames.usgs.gov/domestic/download_data.htm wie jemand oben erwähnt würde wahrscheinlich funktionieren.
Dann können Sie eine Methode schreiben, um den minimalen und maximalen Breiten- und Längengrad basierend auf einem Radius zu berechnen, und alle Städte zwischen diesen Min- und Max-Werten abfragen. Dann durch die Schleife und den Abstand berechnen und entfernen Sie alle, die nicht im Radius sind
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());
}
}
}
Es ist ein Auszug aus meinem Code, hoffentlich können Sie sehen, was passiert. Ich beginne mit einem ZipCodes (eine Tabelle in meiner DB), dann ziehe ich mögliche Streichhölzer zurück und schließlich wähle ich diejenigen aus, die nicht im Radius sind.
Vielleicht bearbeiten Sie könnten lesen und eine bessere Definition von „Städten“ geben? Meinst du nur Ortsnamen oder meinst du Ballungszentren? –
Probieren Sie es aus: http://www.cityradius.com/ Die Radien sind begrenzt, aber es ist trotzdem ziemlich cool. Ich habe das auch schon gesehen: http://www.zip-codes.com/free-zip-code-tools.asp#radius –