国土地理院APIを使って住所からLatitude、Longitudeに変換する

MAP上にマーカーを描くために住所からLatitude、Longitudeに変換したいと思いますが、結構件数があるのでできれば自動化したい。
まずはAPIを組み込めるか検討します。


会社の住所を使ってURLをたたくと

```
https://msearch.gsi.go.jp/address-search/AddressSearch?q=%E6%84%9B%E7%9F%A5%E7%9C%8C%E5%90%8D%E5%8F%A4%E5%B1%8B%E5%B8%82%E6%9D%B1%E5%8C%BA%E8%B5%A4%E5%A1%9A%E7%94%BA%EF%BC%92%EF%BC%98
```

このようなJsonが返ってきます。

```
[{"geometry":{"coordinates":[136.923203,35.183064],"type":"Point"},"type":"Feature","properties":{"addressCode":"","title":"愛知県名古屋市東区赤塚町２８番地"}}]
```

Apexで呼び出しの部分だけをコーディングしてみましょう。

```
 /**
     * 国土地理院
     */
    @AuraEnabled
    public static Map<String,Object> ins_gio(String ins_body) {
        Map<String,Object>  RetMap = new Map<String,Object>();
        Http http = new Http();
        String path ='https://msearch.gsi.go.jp/address-search/AddressSearch';
        String parameters = '?q=' + ins_body;

        HttpRequest req = new HttpRequest();
        req.setEndpoint(path+parameters);
        req.setMethod('GET');
        //req.setHeader('Content-Type', 'application/json');//POSTには必須みたい
        
        HttpResponse res = http.send(req);
        //JsonをObjectに変換する
        String resBody = res.getBody(); 
        RetMap.put('resBody',resBody);        
        
        
        return RetMap;
    }
```

Jsonの解析です。JSON.deserializeStrict(resBody,geoData.class);を使って一発で処理できるようにClassを定義します。
"coordinates":[136.923203,35.183064]　の定義に少々悩みました...

```
public static  String create_geo(){
        String retStr ='';
        String resBody ='[{"geometry":{"coordinates":[136.923203,35.183064],"type":"Point"},"type":"Feature","properties":{"addressCode":"","title":"愛知県名古屋市東区赤塚町２８番地"}}]';
        resBody = resBody.left(resBody.length() -1);
        resBody = resBody.right(resBody.length() -1);
        geoData g = (geoData)JSON.deserializeStrict(resBody,geoData.class);
        geometry geo = (geometry)g.geometry;
        List<double> coordinates = geo.coordinates;
        system.debug(Logginglevel.INFO,'========= coordinates =======> ' + coordinates);
        return retStr;
    }

    public class geometry {
        public List<double> coordinates;
        public String type;
        
    }
    
    public class properties{
        public String addressCode;
        public String title;
    }
    
    public class geoData {
        public geometry geometry;
        public String type;
        public properties properties;
    }


```

ずっと、FATAL_ERROR System.JSONException: Malformed JSON: Expected '{' at the beginning of object　のエラーではまってました。

なんと返されるJsonの両端が[]になっているのが原因でした。とりあえず[]両端を省く。　もしかしたら、複数件処理できるのかな？List変数かもしれんな。

# 追記

List<geoData>というようにList変数として定義したら両端の[]もそのまま認識できました。やはり複数件処理ができるのではないかと思います。

JSON.deserializeStrict(resBody,List<geoData>.class);

# 参考

+ [国土地理院APIでお手軽ジオコーディング＆逆ジオコーディング](https://memo.appri.me/programming/gsi-geocoding-api)
+ [国土地理院APIで住所から緯度・経度を取得(ジオコーディング)](https://elsammit-beginnerblg.hatenablog.com/entry/2021/07/11/122916#%E5%9B%BD%E5%9C%9F%E5%9C%B0%E7%90%86%E9%99%A2API%E3%81%A7%E4%BD%8F%E6%89%80%E3%81%8B%E3%82%89%E7%B7%AF%E5%BA%A6%E7%B5%8C%E5%BA%A6%E3%82%92%E5%8F%96%E5%BE%97)
+ [How to deserialize a JSON list in Apex](https://salesforce.stackexchange.com/questions/125696/how-to-deserialize-a-json-list-in-apex)