As I read the documentation we should be able to get Address Settings with a readMetadata request to the Metadata API endpoint (https://SF_INSTANCE.salesforce.com/services/Soap/m/33.0), but in my test no results are returned. Is reading from the AddressSettings with the readMetadata call actually not supported? The metadata documentation indicates that AddressSettings are available starting in API 33.
This request works for other Setting types SecuritySettings, AccountSettings, BusinessHoursSettings, etc.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:met="http://soap.sforce.com/2006/04/metadata">
<soapenv:Header>
<met:SessionHeader>
<met:sessionId>YOUR_SESSION_ID</met:sessionId>
</met:SessionHeader>
</soapenv:Header>
<soapenv:Body>
<met:readMetadata>
<met:type>AddressSettings</met:type>
<met:fullName>*</met:fullName>
</met:readMetadata>
</soapenv:Body>
</soapenv:Envelope>
Reply:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://soap.sforce.com/2006/04/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<readMetadataResponse>
<result>
<records xsi:nil="true"/>
</result>
</readMetadataResponse>
</soapenv:Body>
</soapenv:Envelope>
To call directly from APEX (don't forget to add the remote site setting for the endpoint)
HTTP h = new HTTP();
HTTPRequest req = new HTTPRequest();
req.setMethod('POST');
req.setHeader('Content-Type', 'text/xml');
req.setCompressed(false);
req.setHeader('SOAPAction', 'readMetadata');
String sessionId = UserInfo.getSessionId();
System.debug('SESSIONID: ' + UserInfo.getSessionId());
String body = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:met="http://soap.sforce.com/2006/04/metadata"><soapenv:Header><met:SessionHeader>';
body += '<met:sessionId>' + sessionId + '</met:sessionId>';
body += '</met:SessionHeader></soapenv:Header><soapenv:Body>';
body += '<met:readMetadata><met:type>AddressSettings</met:type><met:fullName>*</met:fullName></met:readMetadata>';
body += '</soapenv:Body></soapenv:Envelope>';
req.setBody(body);
req.setEndpoint('https://SF_INSTANCE.salesforce.com/services/Soap/m/33.0');
HTTPResponse resp = h.send(req);
System.debug(resp.getBody());