In many applications, you don’t start with an address — you start with coordinates.
A user clicks on a map, shares their GPS location, or your system receives latitude and longitude from a device. But raw coordinates like 40.748817, -73.985428 aren’t very useful on their own. Most applications need human-readable data: a city name, a postal code, or a full address.
This is where reverse geocoding comes in.
In this article, we’ll look at how to convert latitude and longitude into structured address data — including city, postal code, and formatted address — and, more importantly, what developers should be aware of when working with real-world location data.
To make things more practical, we’ll also use a simple interactive demo where you can click on a map and instantly get the corresponding address details:
Coordinates vs Address: Two Ways to Describe a Location
Latitude and longitude coordinates describe an exact point on Earth using a global grid system.
- latitude defines how far north or south a location is
- longitude defines how far east or west it is
Together, they pinpoint a precise location anywhere on the planet:
For example, the coordinates 40.748817, -73.985428 represent a specific point in New York.
However, while coordinates are extremely precise, they are not very intuitive for humans. People naturally think of locations in terms of:
- cities
- streets
- postal codes
- full addresses
This creates a gap between how machines represent locations and how humans understand them.
So how do you convert coordinates into a readable address?
To do that, you need a process that maps latitude and longitude to real-world location data — such as city names and postal codes. This process is called reverse geocoding.
Reverse Geocoding: Convert Coordinates to City, Postal Code, and Address
Reverse geocoding is the process of converting geographic coordinates (latitude and longitude) into a human-readable address.
In practice, reverse geocoding is not something you implement locally. It requires access to large, constantly updated geographic datasets that map coordinates to real-world address data — including administrative boundaries, streets, buildings, and postal codes.
Because of this, reverse geocoding is typically provided as a service via APIs.
One example is the Geoapify Reverse Geocoding API, which allows you to send coordinates and receive structured address data in response.
Here is an example API Request:
https://api.geoapify.com/v1/geocode/reverse?lat=40.748817&lon=-73.985428&format=json&apiKey=YOUR_API_KEY
The response contains structured fields such as:
-
city,town,village -
postcode -
street,housenumber -
formatted(full address)
You can also control the level of detail using the type parameter, which helps filter results by address level (for example: city, postcode, street, etc.).
Getting city from coordinates
To get the city from coordinates, you can use reverse geocoding with the type=city parameter. This tells the API to return results at the city level.
For example:
https://api.geoapify.com/v1/geocode/reverse?lat=40.719726903683636&lon=-74.04103305850015&format=json&type=city&apiKey=YOUR_API_KEY
A typical response looks like this:
{
"results": [
{
"country": "United States",
"state": "New Jersey",
"city": "Jersey City",
"lon": -74.047455,
"lat": 40.7215682,
"result_type": "city",
"formatted": "Jersey City, NJ, United States of America",
"address_line1": "Jersey City, NJ",
"address_line2": "United States of America",
...
}
]
}
Using type=city ensures that the response focuses on the city-level administrative area, rather than returning street-level or building-level details.
Getting postcode (ZIP code) from coordinates
To get the postal code from coordinates, you can use reverse geocoding with the type=postcode parameter. This ensures the API returns results at the postcode level.
For example:
https://api.geoapify.com/v1/geocode/reverse?lat=40.739501996228256&lon=-74.18542863164123&type=postcode&format=json&apiKey=YOUR_API_KEY
A typical response looks like this:
{
"results": [
{
"country": "United States",
"state": "New Jersey",
"city": "Newark",
"postcode": "07103",
"result_type": "postcode",
"formatted": "Newark, NJ 07103, United States of America",
"address_line1": "Newark, NJ 07103",
"address_line2": "United States of America"
}
]
}
The key field here is:
-
postcode— contains the postal (ZIP) code for the given coordinates
Additional useful fields include:
-
city— the associated city -
formatted— full human-readable address
Using type=postcode ensures that the response focuses specifically on postcode-level data.
Keep in mind that:
- not all locations have postal codes
- postal codes may represent areas rather than exact points
- formats vary depending on the country
Getting address from coordinates
To get a full address from coordinates, you can use reverse geocoding without specifying a type, which returns the most relevant place for the given location (for example, a building, POI, or street address).
For example:
https://api.geoapify.com/v1/geocode/reverse?lat=40.68818115914695&lon=-73.99558678565592&format=json&apiKey=YOUR_API_KEY
A typical response looks like this:
{
"results": [
{
"name": "Citi Bike - Congress St & Clinton St",
"housenumber": "183",
"street": "Congress Street",
"city": "New York",
"postcode": "11201",
"state": "New York",
"country": "United States",
"result_type": "amenity",
"formatted": "Citi Bike - Congress St & Clinton St, 183 Congress Street, New York, NY 11201, United States of America",
"address_line1": "Citi Bike - Congress St & Clinton St",
"address_line2": "183 Congress Street, New York, NY 11201, United States of America"
}
]
}
The most useful field for display is:
-
formatted— a ready-to-use human-readable address
You can also access individual components such as:
-
name— place or POI name (if available) -
housenumberandstreet -
city,postcode,state,country
By default, reverse geocoding returns the most relevant result for the given coordinates, which may be a specific place (like a business or landmark), not just a street or city.
Common Pitfalls When Converting Coordinates to Address
Reverse geocoding is powerful, but working with real-world location data comes with a few important caveats.
Understanding these will help you avoid common mistakes and build more reliable applications.
City is not always available
Not every location has a city field. Depending on where the coordinates point, the response may include:
-
city -
town -
village - or no settlement at all
To handle this correctly, always implement a fallback strategy instead of relying on a single field.
The result depends on the exact point
Small changes in coordinates can lead to different results.
For example, clicking on:
- a building → returns a specific address
- a road → returns street-level data
- a park → may return only city or district
This is expected behavior, not an error.
The closest result may not match expectations
Reverse geocoding returns the nearest known object.
This could be:
- a building
- a business (POI)
- a street
- an administrative area
If you need a specific level (e.g., city or postcode), use the type parameter to control the result.
Coordinates may need normalization
Coordinates should always be valid:
- latitude must be between -90 and 90
- longitude must be between -180 and 180
Try It Yourself: Interactive Reverse Geocoding Demo
To better understand how reverse geocoding works in practice, try this interactive demo:
The demo also shows how different clicks can return different types of results depending on the location — for example, a building, a street, or an administrative area.
Summary
Converting latitude and longitude into a city, postal code, or full address is a common requirement in many applications — from delivery services to map-based interfaces.
In this article, we explored how reverse geocoding works and how to use it to extract meaningful location data from coordinates.
Key takeaways:
- coordinates describe precise locations, but are not human-friendly
- reverse geocoding bridges the gap between coordinates and real-world addresses
- you can extract specific data like city and postcode using the
typeparameter - not all locations have complete address data, so fallback logic is important
- results may vary depending on the exact coordinates and context
By understanding these concepts and handling edge cases properly, you can build reliable features that convert coordinates into usable address information.
Additional Resources
FAQ
Is reverse geocoding free?
Most reverse geocoding services offer a free tier with usage limits.
For example, Geoapify provides a free plan with 3000 requests per day and 5RPS. This is usually enough for testing and small applications. For production use or higher volumes, paid plans are available.
How do I get an API key?
To use a reverse geocoding service like Geoapify, you need an API key.
You can get one by registering at the website.
After creating a project, you’ll receive an API key that you can use in your requests.
How do I get the timezone from coordinates?
Reverse geocoding responses often include timezone information.
For example, Geoapify returns a timezone object with:
{
"name": "America/New_York",
"offset_STD": "-05:00",
"offset_STD_seconds": -18000,
"offset_DST": "-04:00",
"offset_DST_seconds": -14400,
"abbreviation_STD": "EST",
"abbreviation_DST": "EDT"
}
You can extract this directly from the response without making a separate API call.
How do I get the state or region?
To get the state or region from coordinates, you can use reverse geocoding with the type=state parameter. This ensures the API returns results at the state level.
How can I understand the quality of the result?
You can estimate how accurate the result is using the distance field.
-
distancerepresents how far (in meters) the returned result is from the input coordinates - smaller values indicate higher accuracy
For example:
- 0–10 meters → very precise (building-level)
- 10–100 meters → good accuracy
- 100+ meters → approximate result
Why do I sometimes get a place (POI) instead of an address?
By default, reverse geocoding returns the most relevant nearby object.
This could be:
- a business or landmark (POI)
- a building
- a street
- an administrative area
If you need a specific level (e.g., city or postcode), use the type parameter to control the result.
Can I use reverse geocoding offline?
In most cases, no.
Reverse geocoding requires large and frequently updated datasets, making it impractical to run locally. That’s why it is typically provided as an online API service.
What happens if there are no results?
In some cases, reverse geocoding may return no results:
- remote areas
- oceans or lakes
- incomplete data coverage
Your application should handle this gracefully and provide fallback behavior.

Top comments (0)