https://github.com/tomaytotomato/location4j
A Java library for efficient geographical lookups without external APIs. π Provides country, state, and city identification from free text with a built-in dataset.
https://github.com/tomaytotomato/location4j
city country country-codes country-data country-list geolocation geolocation-api geolocator java latitude-longitude location location-lookup location-search location-services lookup search state
Last synced: 6 months ago
JSON representation
A Java library for efficient geographical lookups without external APIs. π Provides country, state, and city identification from free text with a built-in dataset.
- Host: GitHub
- URL: https://github.com/tomaytotomato/location4j
- Owner: tomaytotomato
- License: mit
- Created: 2024-07-17T11:02:50.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-03-21T18:30:31.000Z (7 months ago)
- Last Synced: 2025-03-26T13:53:53.792Z (6 months ago)
- Topics: city, country, country-codes, country-data, country-list, geolocation, geolocation-api, geolocator, java, latitude-longitude, location, location-lookup, location-search, location-services, lookup, search, state
- Language: Java
- Homepage: https://javadoc.io/doc/com.tomaytotomato/location4j
- Size: 10.7 MB
- Stars: 52
- Watchers: 2
- Forks: 2
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# location4j π4οΈβ£β¨οΈ

[](https://sonarcloud.io/summary/new_code?id=tomaytotomato_location4j)
[](https://sonarcloud.io/summary/new_code?id=tomaytotomato_location4j)
[](https://javadoc.io/doc/com.tomaytotomato/location4j/1.0.6)


[](https://libs.tech/project/829971910/location4j)location4j is a simple Java library designed for efficient and accurate geographical data lookups
for countries, states, and cities. πΊοΈUnlike other libraries, it operates without relying on third-party APIs, making it both
cost-effective and fast. ποΈIts built-in dataset provides quick lookups and no need for external HTTP calls. π
## Requirements π
- Java 21 or higher (uses JPMS and Java 21 features)
- Maven 3.8+ (for building from source)## Setup π
Get the latest version of the location4j library by adding it to your Maven pom.xml
```xml
com.tomaytotomato
location4j
1.0.6```
**Gradle**
```gradle
implementation group: 'com.tomaytotomato', name: 'location4j', version: '1.0.6'
```## Quick Example π
```java
import com.tomaytotomato.location4j.SearchLocationService;public class Main {
public static void main(String[] args) {
SearchLocationService searchLocationService = SearchLocationService.builder().build();// Find all locations named San Francisco
List results = searchLocationService.search("san francisco");
printResults(results);// Narrow search to the US
results = searchLocationService.search("san francisco, us");
printResults(results);// Narrow search further to California
results = searchLocationService.search("san francisco, us california");
printResults(results);
}private static void printResults(List results) {
System.out.println("Locations found: " + results.size());
results.forEach(location -> {
System.out.println("Country: " + location.getCountryName());
System.out.println("State: " + location.getStateName());
System.out.println("City: " + location.getCityName());
});
}
}```
## Features π¬
| Feature | Supported | Object | Example |
|--------------------------------------------|-----------|----------|---------------------------------------------------------------------------------|
| Search (free text) | β | Location | `search("kyiv")` -> `"Kyiv, Ukraine, Europe, UA"` |
| Find All Countries | β | Country | `findAllCountries()` -> `["Belgium", "Canada", ...]` |
| Find Country by Id | β | Country | `findCountryById(1)` -> `["Afghanistan"]` |
| Find Country by ISO2 code | β | Country | `findCountryByISO2Code("CA")` -> `["Canada"]` |
| Find Country by ISO3 code | β | Country | `findCountryByISO3Code("CAN")` -> `["Canada"]` |
| Find Country by Name | β | Country | `findCountryByName("Canada")` -> `["Canada"]` |
| Find Country by Localised name | β | Country | `findCountryByLocalisedName("Belgique")` -> `["Belgium"]` |
| Find Countries by State name | β | Country | `findAllCountriesByStateName("Texas")` -> `["USA"]` |
| Find States by State name | β | State | `findAllStatesByStateName("Texas")` -> `["Texas", "USA"]` |
| Find State by State Id | β | State | `findStateById(5)` -> `["California", "USA"]` |
| Find States by State code | β | State | `findAllStatesByStateCode("CA")` -> `["California", "USA"]` |
| Find City by City Id | β | City | `findCityById(10)` -> `["Los Angeles", "California"]` |
| Find All Cities | β | City | `findAllCities()` -> `[All cities in database]` |
| Find Cities by City name | β | City | `findAllCitiesByCityName("San Francisco")` -> `["San Francisco", "California"]` |
| Find Closest City by latitude/longitude | β | City | `findClosestCityByLatLong(30.438, -84.280)` -> `["Tallahassee", "Florida"]` |
| Find Closest City by BigDecimal lat/long | β | City | `findClosestCityByLatLong(new BigDecimal("30.438"), new BigDecimal("-84.280"))` |
| Find Closest City by String lat/long | β | City | `findClosestCityByLatLong("30.438", "-84.280")` -> `["Tallahassee", "Florida"]` |
| Find Street or Address | β | N/A | Not supported - location4j does not provide street-level details |
| Find Zipcode/Postcode | β | N/A | Not supported - location4j does not include postal code data |
| Find Small Towns/Villages | β | N/A | Not supported - location4j focuses on major cities and administrative divisions |βΉοΈ location4j can parse free text strings with or without punctuation or capitalisation e.g.
> San Francisco, CA, USA
>
> ca united states san francisco
>
> US, San Francisco, california## More Examples π§ͺ
**Lookup countries**
For simple lookups the `LocationService` can act like a repository, allow the retrieval of
countries, states and city information.```java
import com.tomaytotomato.location4j.LocationService;
public class LocationServiceExample {
public static void main(String[] args) {
LocationService locationService = LocationService.builder().build();// Get all countries
List countries = locationService.findAllCountries();// Filter European countries
List europeanCountries = countries.stream()
.filter(country -> "Europe".equals(country.getRegion()))
.toList();// Find Afghanistan by ID
Country afghanistan = locationService.findCountryById(1);// Find all cities named San Francisco
List cities = locationService.findAllCities("San Francisco");}
}```
**Search locations**
Search any text for a location, the `SearchLocationService` can handle formatted or unformatted
text. It will try and find matches against a variety of keywords it has in its dataset.```java
import com.tomaytotomato.location4j.SearchLocationService;
public class SearchLocationServiceExample {
public static void main(String[] args) {
SearchLocationService searchLocationService = SearchLocationService.builder()
.withTextNormaliser(new DefaultTextNormaliser())
.build();// Search for Santa Clara
List results = searchLocationService.search("Santa Clara");// Search for Santa Clara in the USA
List resultsUnitedStates = searchLocationService.search("Santa Clara USA");// Search for Santa Clara in California (it works with ISO2 or ISO3) codes
List resultsCalifornia = searchLocationService.search("Santa Clara US CA");
}
}```
## Motivation π±
Parsing location data efficiently is crucial for many applications, yet it can be complex and
time-consuming.Third-party services like Google Location API can be costly, and using large language models can
introduce significant latency.location4j offers a practical solution with its own dataset, enabling fast and cost-effective
geographical lookups to a city/town level (which is sufficient in most cases).This allows applications to be built without another external dependency and the overheads that come
with it.I may add other functionality in the future if needed e.g. geolocation to nearest place, geofencing
etc.## More Info
[Testing](TESTING.md)
## Credits π
Country data sourced
from [dr5shn/countries-states-cities-database](https://github.com/dr5hn/countries-states-cities-database) [](https://opendatacommons.org/licenses/odbl/)## License π
[MIT License](https://choosealicense.com/licenses/mit/)