Overview
At times you may wish to collect not just an address, but also the latitude and longitude of the address in question. However, many form respondents will not know the latitude and longitude of a given address. In situations like these, it is possible to use custom code to generate the latitude and longitude of a collected address and output this data into form fields automatically.
Please Note: This solution uses custom code which the FormAssembly Support Team is unable to assist in writing or editing. The code in this help document is for reference only.
Before You Begin
Before you can utilize this code, you'll need to gather the following:
- The field aliases for each address field in your form.
- The field aliases for your latitude and longitude outputs.
- A Google Maps API Key
In the reference code below, replace the "tfa_alias" text with the associated field aliases. The type of field needed is noted in the comments. You will also need to replace the "YOUR_API_KEY_GOES_HERE" text with your Google Maps API Key. This code should then be placed in the custom code area of your form.
Reference Code
<script> const addressFields = [ "tfa_alias", // Street Address Field ID "tfa_alias", // City/State Field ID "tfa_alias", // Zip Code Field ID ] const outputFields = { lat: "tfa_alias", // Latitude Field ID lng: "tfa_alias" // Longitude Field ID } // Google Maps API Endpoint const baseUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address='; // Your Google Maps API Key const apiKey = '<<<<<<YOUR_API_KEY_GOES_HERE>>>>>>>'; // Get the Lat/Lng Values function updateGeolocation() { // Generates request URL const requestURL = addressFields.map(function (item) { // Get value of field const val = document.getElementById(item).value; // Replace spaces with +, for Google Maps API return val.split(' ').join('+') }); const finalUrl = baseUrl + requestURL.join(',') + '&key=' + apiKey; fetch(finalUrl) .then(response => response.json()) .then(data => { const latLng = (data.results[0].geometry.location); document.getElementById(outputFields.lat).value = latLng.lat document.getElementById(outputFields.lng).value = latLng.lng }); } document.addEventListener("DOMContentLoaded", function(event) { addressFields.forEach( (element) => { let input = document.getElementById(element); input.addEventListener('change', updateGeolocation) }); }); </script>