まだ試してないので、コード例はありません。
Google Charts で都道府県塗分けが出来たので、市区町村も試してみたくなったので、調べたら、Googleでは出来なくて、Yahoo でできるようです。
APIドキュメント : https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html
Semakin di depan
まだ試してないので、コード例はありません。
Google Charts で都道府県塗分けが出来たので、市区町村も試してみたくなったので、調べたら、Googleでは出来なくて、Yahoo でできるようです。
APIドキュメント : https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html
リフレクションは昔、JDBCのドライバーを使う時、データベース別にクラスを違える為、class.forName() を使ったくらいで、その便利さが活用できぬままでしたが、同じメソッド名で異なる処理してるクラスを選んでインスタンス化 => メソッド実行とかできると楽で便利なので、ちょっと調べて実装してみました。
< コード例 >
package mapaddress;
import java.util.ArrayList;
import java.io.File;
import java.io.*;
import java.util.*;
import java.lang.reflect.Method;
import java.lang.reflect.Executable;
import java.lang.reflect.AccessibleObject;
public class MapAddress {
public static void main(String[] args) {
// 引数がない場合、すぐ終わらす //
if (args.length == 0) {
System.out.println("no argument");
return;
}
// このクラスのパッケージ名 //
String packageName = MapAddress.class.getPackage().getName();
System.out.println(packageName);
// 引数はクラス名の1個 //
String nmClass = args[0];
System.out.println(args[0]);
MapAddress MA = new MapAddress();
try {
// クラスオブジェクト取得 //
Class<?> c = Class.forName(packageName + "." + nmClass);
// インスタンス化 //
Object objc = c.newInstance();
// 第一メソッド実行 //
Method method = c.getMethod("getAddressPage");
method.invoke(objc);
// 第ニメソッド実行 //
if (MA.is2methodMap.get(nmClass)) {
method = c.getMethod("addStoreDetails");
method.invoke(objc);
}
// 生成されたリストをデバッグ //
method = c.getMethod("getStoreDtlList");
System.out.println(method.invoke(objc));
// ???????? なので各クラスのメソッドにする //
//ArrayList<HashMap<String, String>> dtllist = method.invoke(objc);
// 引数がある場合は、getMethodで定義しておく //
method = c.getMethod("execUpdateTable", String.class, String.class);
method.invoke(objc, MA.listnameMap.get(nmClass), iconfnm);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
ここらで教えて頂く :
https://www.sejuku.net/blog/33252
https://itsakura.com/java-reflect
http://pppurple.hatenablog.com/entry/2016/07/23/205446
https://www.logicbig.com/how-to/code-snippets/jcode-reflection-class-getmethod.html
郵政事業庁の郵便番号CSVを自分の MySQL のテーブルにインポートすることになり、必要な列だけを選べないかと探してたところ、(今まで MySQL のバルクインサートでは、全列そのまんまインポートしかしたことがなかったので)
CSVの列指定は、 @1, @3, @6 とかで、列位置指定
MySQL は、
SET
JIS_ORG = @1,
ZIP_ORG = @3,
K_NAME = @9,
とかでマッピングします。
LOAD DATA LOCAL INFILE '/????/?????.csv' INTO TABLE mst_zip FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15) SET JIS_ORG = @1, ZIP_ORG = @3, K_NAME = @9, H_NAME_ORG = @6, K_JIS = @8, H_JIS_ORG = @5 ;
ここで教えていただきました : http://jigsaw.hatenablog.jp/entry/2013/06/12/113016
|
|
Javascript からの Geocorder の利用が、1回で連続して変換できるのが 10件 に制限されているので、大量データの変換に不向きなので、調べて実装しました。
package mapaddress.dbupdate;
import java.util.*;
import java.io.*;
import com.google.maps.GeoApiContext;
import com.google.maps.*;
import com.google.maps.model.GeocodingResult;
import com.google.maps.model.LatLng;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.SocketAddress;
import org.apache.ibatis.session.SqlSession;
//import com.google.maps.GeoApiContextBuilder;
/**
* GoogleMap API ジオコーダー用クラス
*/
public class Geocorder {
/**
* プロキシ設定
*/
private final String PROXY_HOST = "?????????";
private final int PROXY_PORT = 0;
private final String API_KEY = "???????????????????????????????";
private GeoApiContext context;
private String addr;
private double lat;
private double lon;
private String zip = "";
/**
* デフォルトコンストラクタ
*/
public Geocorder() {
context = new GeoApiContext.Builder()
.apiKey(API_KEY)
.build();
}
/**
* APIキー指定コンストラクタ
*/
public Geocorder(String apikey) {
context = new GeoApiContext.Builder()
.apiKey(apikey)
.build();
}
/**
* プロキシ用コンストラクタ
*
* @param isUseProxy
*/
public Geocorder(boolean isUseProxy) {
if (isUseProxy) {
SocketAddress addr = new InetSocketAddress(this.PROXY_HOST, this.PROXY_PORT);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
context = new GeoApiContext.Builder()
.apiKey(API_KEY)
.proxy(proxy)
.build();
}
else {
context = new GeoApiContext.Builder()
.apiKey("????????????????????????????????????????")
.build();
}
}
/**
* @return the addr
*/
public String getAddr() {
return addr;
}
/**
* @param addr the addr to set
*/
public void setAddr(String addr) {
this.addr = addr;
}
/**
* @return the lat
*/
public double getLat() {
return lat;
}
/**
* @param lat the lat to set
*/
public void setLat(double lat) {
this.lat = lat;
}
/**
* @return the lon
*/
public double getLon() {
return lon;
}
/**
* @param lon the lon to set
*/
public void setLon(double lon) {
this.lon = lon;
}
/**
* @return the zip
*/
public String getZip() {
return zip;
}
/**
* @param zip the zip to set
*/
public void setZip(String zip) {
this.zip = zip;
}
/**
* 正ジオコーダーの実行
*/
public void execGeoCorder() {
try {
GeocodingResult results[] = this.getResults(this.addr);
//LatLng latLng = results[0].geometry.location; // とりあえず一番上のデータを使う
if (results != null && results.length > 0) {
//if (results.length > 0) {
LatLng latLng = results[0].geometry.location; // とりあえず一番上のデータを使う
System.out.println("緯度 : " + latLng.lat);
System.out.println("経度 : " + latLng.lng);
int len = results[0].addressComponents.length;
String zip = results[0].addressComponents[len - 1].longName;
System.out.println("ZIP : " + zip);
this.lat = latLng.lat;
this.lon = latLng.lng;
if (zip != null && !zip.equals("")) {
this.zip = zip;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 正ジオコーダー応答取得
*
* @param address
* @return
* @throws InterruptedException
* @throws IOException
*/
public GeocodingResult[] getResults(String address) throws InterruptedException, IOException {
GeocodingApiRequest req = GeocodingApi.newRequest(context)
.address(address)
// .components(ComponentFilter.country("JP"))
.language("ja");
try {
GeocodingResult[] results = req.await();
if (results == null || results.length == 0) {
// ZERO_RESULTSはresults.length==0の空配列がsuccessful扱いで返ってくる
System.out.println("zero results.");
}
//results[0].geometry;
return results;
}
catch (Exception e) {
System.out.println("error.");
System.out.println(e);
return null;
}
}
/**
* 逆ジオコーダーの実行
*/
public void execRVGeoCorder(String lat_lon) {
try {
GeocodingResult results[] = this.getRVResults(lat_lon);
//LatLng latLng = results[0].geometry.location; // とりあえず一番上のデータを使う
if (results != null && results.length > 0) {
int len = results[0].addressComponents.length;
String zip = results[0].addressComponents[len - 1].longName;
System.out.println("ZIP : " + zip);
this.addr = results[0].formattedAddress.replaceAll("日本、", "");
System.out.println("ADDR : " + this.addr);
if (zip != null && !zip.equals("")) {
this.zip = zip;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public GeocodingResult[] getRVResults(String lat_lon) throws InterruptedException, IOException {
GeocodingApiRequest req = GeocodingApi.newRequest(context)
.address(lat_lon)
// .components(ComponentFilter.country("JP"))
.language("ja");
try {
GeocodingResult[] results = req.await();
if (results == null || results.length == 0) {
// ZERO_RESULTSはresults.length==0の空配列がsuccessful扱いで返ってくる
System.out.println("zero results.");
}
//results[0].geometry;
return results;
}
catch (Exception e) {
System.out.println("error.");
System.out.println(e);
return null;
}
}
public static void main(String[] args) {
Geocorder G = new Geocorder(false);
G.execRVGeoCorder("31.62457 131.8521498");
System.out.println(G.addr);
}
}
ここで教えていただきました : http://developers.goalist.co.jp/entry/2017/10/16/150000
|
逆ジオコーダーも必要あるので、試したところ、Javascript の住所指定と同じく、緯度 + ” ” + 経度 を住所として渡せば出来ました。
ここで教えて頂きました : https://co.bsnws.net/article/295
使ってみてのはまりどころを列挙しておきます。
画像ファイルの取得元のURLもとれたら、さらにうれしいので、機能追加されたらなあと思ってます。
色と言うものはお互いに助けあって美しくなるものだよ。
人間と同じことだよ。
どっちの色を殺しても駄目だよ。どの色も生かさなければ。
天才とは努力する凡才のことである。
コメントを投稿するにはログインしてください。