今更ながらのe-statから小地域データのダウンロード
統計局のe-Statから小地域(町丁目、大字、字)のポリゴンと国勢調査の結果などがダウンロードできる。
久しぶりにサイトに来るとダウンロードの方法が分からなくなるので記載。
s-Statを開き、「地図や図表で見る」→「地図で見る統計(統計GIS)」を選択。

「データダウンロード」を選択

国勢調査(小地域)を選択し、統計表より対象項目を選択

対象都道府県、市区町村を選択して「検索」ボタンを実行し、ダウンロードサイトが表示される。

google map上にwmsレイヤを表示
OpenLayers向けに構築したシステムをgooglemapに置き換えたときにできるだけ使えるリソースは再利用したい。
今回はgeoserverで提供しているWMSレイヤ(タイルとシングルタイル)を表示する方法を調査。
タイル(256×256)の使い方
[code]
var mapOptions = {
center: new google.maps.LatLng(y, x),
zoom: scale,
mapTypeId: google.maps.MapTypeId.ROADMAP,
scaleControl: true,
scaleControlOptions: { position: google.maps.ControlPosition.BOTTOM_CENTER }
}
var map_canvas = new google.maps.Map(document.getElementById(id_map), mapOptions);
var SLPLayer = new google.maps.ImageMapType({
getTileUrl:
function (coord, zoom) {
var proj = map_canvas.getProjection();
var zfactor = Math.pow(2, zoom);
var ul = new google.maps.Point(coord.x * 256.0 / zfactor , (coord.y + 1) * 256.0 / zfactor );
var lr = new google.maps.Point((coord.x + 1) * 256.0 / zfactor , (coord.y) * 256.0 / zfactor );
var ulw = proj.fromPointToLatLng(ul);
var lrw = proj.fromPointToLatLng(lr);
var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();
var url = "http://maps4/geoserver/省略/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap";
url += "&TRANSPARENT=true"; //WMS operation
url += "&LAYERS=mesh3"; //WMS layers
url += "&FORMAT=image/png" ; //WMS format
url += "&TILED=false" ;
url += "&viewparams=on";
url += "&CRC=EPSG:4326"; //set WGS84
url += "&BBOX=" + bbox; // set bounding box
url += "&WIDTH=256"; //tile size in google
url += "&HEIGHT=256";
return url; // return URL for the tile
},
tileSize: new google.maps.Size(256, 256),
isPng: true
});
map_canvas.overlayMapTypes.push(SLPLayer);
[/code]
シングルタイルの使い方
google.maps.ImageMapTypeは引数で指定した「tileSize」のサイズに従って世界中をタイルに分割する
※下図参照
getTileUrlの引数coordにはタイルのXYのインデックスが渡ってくる。

よってmap_canvas.overlayMapTypesをシングルタイルに使おうとしてもどうしてもぴったりにはならない。
tileSizeを大きくしてもどうしても最大4つのタイルを使用してしますが、とりあえずその方法について記載。
[code]
var SLPLayer = new google.maps.ImageMapType({
getTileUrl:
function (coord, zoom) {
var zfactor = Math.pow(2, zoom);
var proj = map_canvas.getProjection();
var ul = new google.maps.Point(coord.x * 1536.0 / zfactor , (coord.y + 1) * 1024.0 / zfactor );
var lr = new google.maps.Point((coord.x + 1) * 1536.0 / zfactor , (coord.y) * 1024.0 / zfactor );
//var ne = map_canvas.getBounds().getNorthEast();
//var sw = map_canvas.getBounds().getSouthWest();
//var bbox = sw.lng() + "," + sw.lat() + "," + ne.lng() + "," + ne.lat();
var ulw = proj.fromPointToLatLng(ul);
var lrw = proj.fromPointToLatLng(lr);
var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();
//base WMS URL
var url = "http://maps4/geoserver/省略/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap";
url += "&TRANSPARENT=true"; //WMS operation
url += "&LAYERS=shop"; //WMS layers
url += "&FORMAT=image/png" ; //WMS format
url += "&CRC=EPSG:4326"; //set WGS84
url += "&BBOX=" + bbox; // set bounding box
url += "&WIDTH=1536"; //tile size in google
url += "&HEIGHT=1024";
return url; // return URL for the tile
},
tileSize: new google.maps.Size(1536, 1024),
isPng: true
});
map_canvas.overlayMapTypes.push(SLPLayer);
[/code]
もちろんふたつのレイヤを重ねることは可能
SeedCollectorをiOS9に対応(2)
HTTP通信の許可設定
iPad上で通信時に以下のエラーが発生
[code]
App Transport Security has blocked a cleartext HTTP (http://) resource load
since it is insecure.
[/code]
iOS9よりHTTPで通信するにはATSを無効にするか、例外対象のドメインを設定する必要がある。
(1)例外対象のドメインを設定
info.plistのキー「App Transport Security Settings」に「Exception Domains」以下を追加

※設定したがなぜか正しく機能しない
(2)ATSを無効にする
info.plistのキー「App Transport Security Settings」に「Allow Arbitrary Loads」を追加しYESに設定

こちらは期待通りに機能した
カメラ利用の設定
カメラ利用時にエラーが発生し、以下のログを出力

カメラを使用するアプリはinfo.plistに記載

これでカメラ使用時に確認メッセージが表示される。
カメラの変更
iOS7対応時にカメラをUImagePickerControllerに変更しViewControllerとして使用していたが、正しく画像が保存されていなかった。
よってpopoverで表示するように変更。
変更前
[code]
//———————————————————————-
// 写真撮影View表示
//———————————————————————-
-(void)showInputPhoto:(Query*)query AnchorButton:(UIButton*)button Value:(NSString*)value{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]==YES){
showing_modal = YES;
if(ip2){
[ip2 release];
}
ip2 = [[vInputPhoto2 alloc]initWithAppConf:appconf Query:query Value:value];
ip2.imagepicker = imagepicker;
[ip2 setDelegate:self];
//[self showPopOver: ip2.imagepicker AnchorButton:button];
[CmnLib showViewController:self Child:ip2.imagepicker];
}
}
[/code]
変更後
[code]
//———————————————————————-
// 写真撮影View表示
//———————————————————————-
-(void)showInputPhoto:(Query*)query AnchorButton:(UIButton*)button Value:(NSString*)value{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]==YES){
showing_modal = YES;
if(ip2){
[ip2 release];
}
ip2 = [[vInputPhoto2 alloc]initWithAppConf:appconf Query:query Value:value];
ip2.imagepicker = imagepicker;
[ip2 setDelegate:self];
[self showPopOver: ip2.imagepicker AnchorButton:button];
//[CmnLib showViewController:self Child:ip2.imagepicker];
}
}
[/code]

以上を「201707appstore更新SeedCollector」の候補として検証を開始
SeeddCollectorをiOS9に対応(1)
株式会社カーネルが提供しているアプリ SeedCollectorは前回に対応してAppStore上でリリース。
今回はiOS10及びiOS9に対応してAppStoreにアップする。
更新対象は201407にリリースしたモジュール。「201407_開発者ライセンス更新_app_store_更新」
予めOSとXcodeは以下のバージョンにアップデート


Xcodeを起動すると証明書エラーが表示された。
最近はProvisioning ProfilesなどはXcodeで自動作成するが、その設定がされていない。
※逆にProvisioning Profilesをサイトで作成してXcodeにインポートする方法がよくわからない。
「Automatically manage signing」チェックをONにする。
変更前

変更後

確認メッセージに同意すると署名の対象を選択可能となるとので今回はTeamを指定。

以下に従って署名等を設定。

上記でエラーが発生しなくなったのでエミュレーターで実行。
するとスプラッシュ画面が間延びして表示されたのでLunchImageの設定
images.xcassetsを選択すると確かにLunchImageが設定されていない。(LunchImage-2はよく分からない)
1Xには768×1024のイメージを2Xには1536×2048のイメージを設定(ドラッグドロップ)
SeedCollectorは縦方向での利用のみを対象とするのでPortraitのみを設定
Lunch Image Sourceは「LunchImage」と「LunchImage-2」から選択が可能なので設定した「LunchImage」を選択。
以上でSplashが正しく設定されたので再度エミュレータで起動すると今度は起動時にハングアップしログに「Application windows are expected to have a root view controller at the end of application launch」が出力されている。
アプリ起動時に呼ばれる関数「didFinishLaunchingWithOptions」でself.window.rootViewControllerが設定されていないのが原因なのでいかに従って修正。
[code]
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
省略
navi = [[UINavigationController alloc]initWithRootViewController:splash];
self.window.rootViewController = navi;
省略
}
[/code]
※iOS9でアプリが起動直後にクラッシュする場合の回避方法を参考とする
iTunes Connect
最近、iTunes Connectを開いていなかったので久しぶりに開くと
契約に関するお知らせが表示された。
The updated Apple Developer Program License Agreement needs to be reviewed.
In order to update your existing apps and submit new apps to the App Store, the user with the Legal role (Team Agent) must review and accept the updated agreement in their account on the developer website.

updated agreementをクリックして表示

Review Agreementをクリック

同意して終了
mysqlを5.7にしたらsql_modeにonly_full_group_byが追加されてエラー
MySQL5.1環境下で作成したシステムをMySQl5.7の環境で実行したら以下のエラーが発生した。
[code]
SELECT list is not in GROUP BY clause and contains nonaggregated column ・・・ with sql_mode=only_full_group_by
[/code]
MySQl5.7からはデフォルトでsql_modeにONLY_FULL_GROUP_BYが設定されるため、SELECTしてよい項目はgroup byの対象項目だけだよということ。
至極当たり前なんだけど、既に動作しているシステムでもあり、修正は考えたくない。
よってONLY_FULL_GROUP_BYをsql_modeから外すことを考える。
最初に現在のsql_modeを確認
[code]
mysql> show variables like ‘sql_mode’;
+—————+——————————————————————————————————————————————-+
| Variable_name | Value |
+—————+——————————————————————————————————————————————-+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+—————+——————————————————————————————————————————————-+
1 row in set (0.00 sec)
mysql>
[/code]
※my.cnfにはsql_modeについての記載はない。
よって以下をmy.cnfに記述
[code]
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[/code]
mySQLを再起動して終了
iOS Developerサイトの設定とxcode8.3.2で最小アプリの作成
Mac OS XのバージョンアップとXcodeのバージョンアップに伴い再度iOS developerサイトの設定とxcodeでのアプリの作成を確認
Mac OS Xのバージョン
10.12.3
Xcodeのバージョン
8.3.2
証明書の作成
キーチェーンアクセス 環境設定を開きOCSP、CRLが切になっていることを確認

証明書アシスタント 認証局に証明書を要求を選択
メールアドレスにはApple IDのメールアドレスを設定、
通称には任意の文字を設定続けるボタンを押す。

証明書の保存先を指定後、キーペア情報を設定


キーチェーンアクセスを確認すると秘密キーと公開キーが追加されている

証明書のインポート
Developerサイトを開き、Certificatesの追加ボタンを押す

今回はDeveloper用の証明書をインポート

先ほど作成した証明書を指定してインポートし、証明書をダウンロード

ダウンロードした証明書をダブルクリックしてログインのキーチェーンに追加されていることを確認

簡単なアプリを作成
xcodeのウィザードに従ってSingle New Application 「KnlAp01」を作成

Display NameにKnlAp01、Bundle Identifierにjp.ne.kernel-net.KnlAp01

コンパイルしてエラーが出ないことを確認
iOS DeveloperサイトにApp IDを登録
再度、iOS DeveloperサイトにログインしてApp IDsの追加ボタンを選択

App ID Descriptionにはアプリの説明を記載「KnlAp01」
App ID PrefixにはTeam IDと記載されているIDを選択
※自分が使っているのが法人向けのApple Developer ProgramだからTeam IDと表示されるのか不明?
App ID SuffixはExplicit App IDを選択してアプリに設定したBundle IDを設定
以上で登録完了
今まではProvisioning Profilesも作成していたが、今はXcodeで自動作成させるのが主流?
Xcodeにapple IDを設定
xcodeを起動してxcodeメニューのpreferencesを選択
画面したの+ボタンを押して使用するAplle ID を登録し、Download All Profilesを実行
以前はここからProvisioning Profilesを見ることができたが今はできないらしい。
xcodeに戻ってSigningのteamを選択するとProfilesが勝手似設定される
以上
Javascriptでファイルダウンロード
JavaScript+WebAPIでシステム構築をしていると意外と悩むのがファイルダウンロード、アップロード。
多くの場合はWebAPIでダウンロードファイルの情報を照会して別途ダウンロードを行ったり
サーバー上にファイルをアップロードしてからWebAPIを呼び出して更新処理を行う方法が
一般的だったが、最近はWbAPIを使って直接ファイルのアップロード、ダウンロードを行うことができる。(疑似的だが)
■ダウンロード
[code]
var data = {
"layer_no": layer_no,
"point_no": point_no,
"crc": crc
};
m_web_service.call("exportPtaPolygon",
function (data, textStatus, xhr) {
if(!cmn_is_null(data.d)){
if(cmn_is_null(data.d.lats)){
m_common.MsgBox("エクスポート", "エクスポート対象のデータはありません", 0, 0);
m_window.Close("600");
return;
}
var csv = "";
for(var i = 0 ; i < data.d.lats.length ; i++){
csv = csv + data.d.lats[i] + "," + data.d.lons[i] + "\r\n";
}
let downloadData = new Blob([csv], {type: ‘text/csv’});
let filename = ‘PTA.csv’
if (window.navigator.msSaveBlob) {
window.navigator.msSaveBlob(downloadData, filename); // IE用
} else {
let downloadUrl = (window.URL || window.webkitURL).createObjectURL(downloadData);
let link = document.createElement(‘a’);
link.href = downloadUrl;
link.download = filename;
link.click();
(window.URL || window.webkitURL).revokeObjectURL(downloadUrl);
}
m_window.Close("600");
}
else{
}
},
m_common.dummy_function,
data);
[/code]
■アップロード
[code]
var fileref = document.getElementById(id);
var reader = new FileReader();
reader.onload = function(theFile){
var outhtml = theFile.target.result;
var recs = outhtml.split("\r\n");
if(recs.length < 4){
m_common.MsgBox("インポート", "正しいファイルを指定してください", 400, 200);
return;
}
var xs = [];
var ys = [];
for(var n = 0 ; n < recs.length ; n++){
let yx = recs[n].split(",");
if(yx.length == 2){
ys.push(parseFloat(yx[0]));
xs.push(parseFloat(yx[1]));
}
}
var data = {
"layer_no": layer_no,
"point_no": point_no,
"crc": crc,
"xs" : xs,
"ys" : ys,
"user_no" : String(m_master.user_no)
};
m_common.waitmsg_on();
m_web_service.call("importPtaPolygon",
function (data, textStatus, xhr) {
m_common.waitmsg_off();
if(data.d){
m_common.MsgBox("インポート", "インポートしました", 400, 200);
}
else{
m_common.MsgBox("インポート", "インポートできません", 400, 200);
}
m_window.Close("600");
},
m_common.dummy_function,
data);
}
reader.readAsText(fileref.files[0], "shift-jis");
[/code]
空間データを収める項目を追加
SELECT AddGeometryColumn(‘table’, ‘geom’,4326, ‘POINT’, ‘XY’, 0);
最後の0はnull許可
pg_dumpのパスワード省略
pg_dumpのパスワードの省略方法(Windows編)
%APPDATA%\postgresql\pgpass.confを作成して接続情報を記載。
[code]
*:*:*:ユーザー名:パスワード
[/code]
%APPDATA%は環境変数
テスト環境では
[code]
C:\Users\Administrator\AppData\Roaming
[/code]
これで引数に-wを与えればパスワードの省略が可能
[code]
pg_dump -U ユーザー名 -t areas -w -h localhost smapdb > areass
[/code]
