Body
Geocoding options
ArcGIS Pro: Geocoding https://pro.arcgis.com/en/pro-app/latest/tool-reference/geocoding/an-overview-of-the-geocoding-toolbox.htm
QGIS Geocoding: with MMQGIS and QuickMapServices(to visually verify results)
- Download & install QGIS for your Mac or PC
- Click Plugins menu > Manage and Install Plugins...
- In the Search... box, enter MMQGIS to search and click "Install Plugin" and close the Plugins box
- A new menu should appear at the top of QGIS: MMQGIS
- Click MMQGIS menu > Geocode > Geocode with web service
https://spatialitics.com/HIPAA-Geocoder Spatialitics HIPAA-Compliant Geocoder
https://www.geocod.io/healthcare/ HIPAA Compliant high-volume geocoder
https://geoservices.tamu.edu/News/Stories/View.aspx?id=92 Texas A&M geocoding services and products
PostgreSQL in-database geocoding: see https://postgis.net/docs/Geocode.html
Postgres databases with PostGIS and data imported from the U.S. Census Bureau can be used as a in-database geocoder
Using a database administration tool such as dBeaver, connect to a pre-built Postgres database

-- Once connected to the test database for New Hampshire streets, test the geocoder with a single address
SELECT g.rating, ST_X(g.geomout) As lon, ST_Y(g.geomout) As lat,
(addy).address As stno, (addy).streetname As street,
(addy).streettypeabbrev As styp, (addy).location As city,
(addy).stateabbrev As st,(addy).zip FROM
geocode('15 west wheelock, hanover, nh 03755', 1) As g;
Create a table to hold the results:
CREATE TABLE IF NOT EXISTS GeocodedAddresses (
id_number SERIAL PRIMARY KEY,
original_address VARCHAR(255),
rating FLOAT,
lon FLOAT,
lat FLOAT,
stno VARCHAR(50),
street VARCHAR(255),
styp VARCHAR(50),
city VARCHAR(100),
st CHAR(2),
zip VARCHAR(20)
);
Next, run the geocoder:
-- Geocoding multiple addresses, insert the addresses using a loop in a DO block
DO $$
DECLARE
address_list TEXT[] := ARRAY[
'25 Capitol St, Concord, NH 03301',
'107 N Main St, Concord, NH 03301',
'33 Capitol St, Concord, NH 03301',
'64 N Main St, Concord, NH 03301',
];
addr TEXT;
BEGIN
FOREACH addr IN ARRAY address_list
LOOP
INSERT INTO GeocodedAddresses (original_address, rating, lon, lat, stno, street, styp, city, st, zip)
SELECT
addr AS original_address,
g.rating,
ST_X(g.geomout) As lon,
ST_Y(g.geomout) As lat,
(addy).address As stno,
(addy).streetname As street,
(addy).streettypeabbrev As styp,
(addy).location As city,
(addy).stateabbrev As st,
(addy).zip
FROM
geocode(addr, 1) As g;
END LOOP;
END $$;
To view the geocoded results, select all from the table (in dBeaver, you can right-click the resulting table and export it to a CSV)
select * from geocodedaddresses g ;

To compare results to base maps, CSV files with latitude and longitude values can be imported to QGIS or ArcGIS Pro