Skip to content

Commit 984f42c

Browse files
committed
Merge branch '24-make-geocoding-configurable' into 'github'
Resolve "Make Geocoding configurable" See merge request gtt/redmine_gtt!45
2 parents 0d635e7 + fccedd6 commit 984f42c

File tree

9 files changed

+142
-132
lines changed

9 files changed

+142
-132
lines changed

app/overrides/issues.rb

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,3 @@
2929
:insert_after => "erb[loud]:contains('PDF')",
3030
:partial => "issues/show/geojson"
3131
)
32-
33-
Deface::Override.new(
34-
:virtual_path => "issues/show",
35-
:name => "deface_view_handle_geocoder_options",
36-
:original => "f8b29d3fa9c4998090a16b8392242cafbc8cbbcf",
37-
:insert_after => "div.attributes",
38-
:partial => "issues/geocoder/geocoder_options"
39-
)
40-
41-
Deface::Override.new(
42-
:virtual_path => "issues/new",
43-
:name => "deface_view_handle_geocoder_options_on_new_issues",
44-
:original => '1468c4be09f0521e1854cace7f8d7b444eb32074',
45-
:insert_after => "#all_attributes",
46-
:partial => "issues/geocoder/geocoder_options"
47-
)

app/views/issues/geocoder/_geocoder_options.html.erb

Lines changed: 0 additions & 3 deletions
This file was deleted.

app/views/settings/gtt/_geocoder.html.erb

Lines changed: 0 additions & 13 deletions
This file was deleted.

app/views/settings/gtt/_settings.html.erb

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -62,31 +62,12 @@
6262
<h3><%= l(:select_default_geocoder_settings) %></h3>
6363

6464
<p>
65-
<%= content_tag(:label, l(:geocoder_url)) %>
66-
<%= text_field_tag('settings[default_geocoder_url]',
67-
@settings['default_geocoder_url'],
68-
:size => 50) %>
69-
</p>
70-
71-
<p>
72-
<%= content_tag(:label, l(:gtt_settings_geocoder_address_field_name)) %>
73-
<%= text_field_tag('settings[default_geocoder_address_field_name]',
74-
@settings['default_geocoder_address_field_name'],
75-
:size => 10) %>
76-
</p>
77-
78-
<p>
79-
<%= content_tag(:label, l(:gtt_settings_geocoder_district_field_name)) %>
80-
<%= text_field_tag('settings[default_geocoder_district_field_name]',
81-
@settings['default_geocoder_district_field_name'],
82-
:size => 10) %>
83-
</p>
84-
85-
<p>
86-
<%= content_tag(:label, l(:gtt_park_search_field_name)) %>
87-
<%= text_field_tag('settings[default_park_search_field_name]',
88-
@settings['default_park_search_field_name'],
89-
:size => 10) %>
65+
<%= content_tag(:label, l(:geocoder_options)) %>
66+
<%= text_area_tag('settings[default_geocoder_options]',
67+
@settings['default_geocoder_options'],
68+
:escape => false,
69+
:rows => 30,
70+
:cols => 100) %>
9071
</p>
9172
</div>
9273

assets/javascripts/app.js

Lines changed: 121 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ var App = (function ($, publ) {
4040
zoom: 13,
4141
maxzoom: 19,
4242
fitMaxzoom: 17,
43-
geocoderAddress: "現地住所",
44-
geocoderDistrict: "区名"
43+
geocoder: {}
4544
};
4645

4746
/**
@@ -59,8 +58,7 @@ var App = (function ($, publ) {
5958
layerArr = [];
6059

6160
contents = $(options.target).data();
62-
defaults = $("#ol-defaults").data();
63-
defaults.geocoderUrl = "https://***REMOVED***/geojson";
61+
defaults = $("#gtt-defaults").data();
6462

6563
// Check if params are null or undefined (use "==" instead of "===" to detect both)
6664
if (defaults.lon == null) {
@@ -78,11 +76,8 @@ var App = (function ($, publ) {
7876
if (defaults.fitMaxzoom == null) {
7977
defaults.fitMaxzoom = quick_hack.fitMaxzoom;
8078
}
81-
if (defaults.geocoderAddress == null) {
82-
defaults.geocoderAddress = quick_hack.geocoderAddress;
83-
}
84-
if (defaults.geocoderDistrict == null) {
85-
defaults.geocoderDistrict = quick_hack.geocoderDistrict;
79+
if (defaults.geocoder == null) {
80+
defaults.geocoder = quick_hack.geocoder;
8681
}
8782

8883
if (contents.geom && contents.geom !== null) {
@@ -352,7 +347,7 @@ var App = (function ($, publ) {
352347
publ.getSymbol = function (feature) {
353348
var symbol = "mcr-icon-write";
354349

355-
var plugin_settings = $("#ol-defaults").data("pluginSettings");
350+
var plugin_settings = $("#gtt-defaults").data("pluginSettings");
356351
var tracker_id = feature.get("tracker_id") || $("#issue_tracker_id").val();
357352
if (tracker_id) {
358353
var key = "tracker_" + tracker_id;
@@ -626,23 +621,29 @@ var App = (function ($, publ) {
626621
*/
627622
publ.setGeocoding = function (){
628623

629-
var default_park_search_field_name = $("input#default_park_search_field_name").val()
630-
var default_geocoder_url = $("input#default_geocoder_url").val()
631-
var default_geocoder_address_field_name = $("input#default_geocoder_address_field_name").val()
632624
// Hack to add Geocoding buttons to text fields
633625
// There should be a better way to do this
634-
if ( $("#issue-form #attributes button.btn-geocode").length == 0 ) {
635-
$("#issue-form #attributes label:contains('" + default_geocoder_address_field_name + "')").parent("p").append(
636-
'<button name="button" type="button" class="btn-geocode">' + default_geocoder_address_field_name + '</button>'
626+
if (defaults.geocoder.geocode_url &&
627+
defaults.geocoder.address_field_name &&
628+
$("#issue-form #attributes button.btn-geocode").length == 0) {
629+
630+
$("#issue-form #attributes label:contains('" + defaults.geocoder.address_field_name + "')").parent("p").append(
631+
'<button name="button" type="button" class="btn-geocode">' + defaults.geocoder.address_field_name + '</button>'
637632
);
638633

639634
$("button.btn-geocode").on("click", function(evt) {
640635
// Geocode address and add/update icon on map
641636
if ($("button.btn-geocode").prev("input").val() != "") {
642637
var address = $("button.btn-geocode").prev("input").val()
643-
$.getJSON(default_geocoder_url+"/geocode/json/" + encodeURIComponent(address), function(data) {
644-
if (data.result.code >= 0 && data.result.coordinates) {
645-
var coords = [data.result.coordinates.x, data.result.coordinates.y];
638+
var geocode_url = defaults.geocoder.geocode_url.replace("{address}", encodeURIComponent(address));
639+
$.getJSON(geocode_url, function(data) {
640+
var check = evaluateComparison(getObjectPathValue(data, defaults.geocoder.geocode_result_check_path),
641+
defaults.geocoder.geocode_result_check_operator,
642+
defaults.geocoder.geocode_result_check_value);
643+
if (check) {
644+
var lon = getObjectPathValue(data, defaults.geocoder.geocode_result_lon_path);
645+
var lat = getObjectPathValue(data, defaults.geocoder.geocode_result_lat_path);
646+
var coords = [lon, lat];
646647
var geom = new ol.geom.Point(
647648
ol.proj.fromLonLat(coords, 'EPSG:3857','EPSG:4326')
648649
)
@@ -656,64 +657,80 @@ var App = (function ($, publ) {
656657
publ.updateForm(vector.getSource().getFeatures());
657658
publ.zoomToExtent(true);
658659

659-
var districtInput = $("#issue-form #attributes label:contains('" + defaults.geocoderDistrict + "')").parent("p").children("input");
660+
var districtInput = $("#issue-form #attributes label:contains('" + defaults.geocoder.district_field_name + "')").parent("p").children("input");
661+
var foundDistrict = false;
660662
if (districtInput.length > 0) {
661-
var foundDistrict = false;
662-
if (data.result.shikuchoson) {
663-
var regexp = /^(?:\S+)?(\S+)$/g;
664-
var match = regexp.exec(data.result.shikuchoson);
663+
var district = getObjectPathValue(data, defaults.geocoder.geocode_result_district_path);
664+
if (district) {
665+
var regexp = new RegExp(defaults.geocoder.geocode_result_district_regexp);
666+
var match = regexp.exec(district);
665667
if (match && match.length === 2) {
666668
districtInput.val(match[1]);
667669
foundDistrict = true;
668670
}
669671
}
670672
if (!foundDistrict) {
671-
districtInput.val("");
673+
if (districtInput.length > 0) {
674+
districtInput.val("");
675+
}
672676
}
673677
}
674678
}
675679
})
676680
}
677681
});
678682
}
679-
680-
if ( $("#issue-form #attributes button.btn-parksearch").length == 0 ) {
681-
$("#issue-form #attributes label:contains(" + default_park_search_field_name + ")").parent("p").append(
682-
'<button name="button" type="button" class="btn-parksearch">' + default_park_search_field_name + '</button>'
683+
684+
if (defaults.geocoder.place_search_url &&
685+
defaults.geocoder.place_search_field_name &&
686+
$("#issue-form #attributes button.btn-placesearch").length == 0 ) {
687+
688+
$("#issue-form #attributes label:contains(" + defaults.geocoder.place_search_field_name + ")").parent("p").append(
689+
'<button name="button" type="button" class="btn-placesearch">' + defaults.geocoder.place_search_field_name + '</button>'
683690
);
684691

685-
$("button.btn-parksearch").on("click", function(evt) {
692+
$("button.btn-placesearch").on("click", function(evt) {
686693
if (vector.getSource().getFeatures().length > 0) {
687694
var coords = null
688695
vector.getSource().getFeatures().forEach(function (feature) {
689696
// Todo: only works with point geometries for now for the last geometry
690697
coords = feature.getGeometry().getCoordinates();
691698
});
692-
coords = ol.proj.transform(coords,'EPSG:3857','EPSG:4326')
693-
694-
$.getJSON(default_geocoder_url + "/reversegeocode/json_arr/" + coords.join(",") + ",500?useaddr=true&owner=***REMOVED***&details=true&category=park", function(data) {
695-
if (data.length){
699+
coords = ol.proj.transform(coords,'EPSG:3857','EPSG:4326');
700+
var place_search_url = defaults.geocoder.place_search_url.replace("{lon}", coords[0].toString()).replace("{lat}", coords[1].toString());
701+
$.getJSON(place_search_url, function(data) {
702+
var check = evaluateComparison(getObjectPathValue(data, defaults.geocoder.place_search_result_check_path),
703+
defaults.geocoder.place_search_result_check_operator,
704+
defaults.geocoder.place_search_result_check_value)
705+
var list = getObjectPathValue(data, defaults.geocoder.place_search_result_list_path);
706+
if (list.length){
696707
$('#ajax-modal').html(
697-
"<h3 class='title'>Park results </h3>" +
698-
"<div id='parks'></div>" +
699-
"<p class='buttons'><input type='submit' value='select' onclick='hideModal(this)'/></p>"
708+
"<h3 class='title'>" + defaults.geocoder.place_search_result_ui_title + "</h3>" +
709+
"<div id='places'></div>" +
710+
"<p class='buttons'><input type='submit' value='" +
711+
defaults.geocoder.place_search_result_ui_button +
712+
"' onclick='hideModal(this)'/></p>"
700713
);
701-
$('#ajax-modal').addClass('park_search_results');
702-
data.forEach(function(parkData){
703-
if (parkData.result.address && parkData.result.details.id ) {
704-
$("div#parks").append('<input type="radio" name="parks" value="[' + parkData.result.details.ref_num + ']' + parkData.result.address + '">'
705-
+ parkData.result.address
714+
$('#ajax-modal').addClass('place_search_results');
715+
list.forEach(function(item){
716+
var display = getObjectPathValue(item, defaults.geocoder.place_search_result_display_path);
717+
var value = getObjectPathValue(item, defaults.geocoder.place_search_result_value_path);
718+
if (display && value != null) {
719+
$("div#places").append('<input type="radio" name="places" value="' + value + '">'
720+
+ display
706721
+'<br>')
707722
}
708723
})
709724
showModal('ajax-modal', '400px');
710725
$("p.buttons input[type='submit']").click(function(){
711-
$("#issue-form #attributes label:contains('" + default_park_search_field_name + "')").parent("p").children("input").val(
712-
$("div#parks input[type='radio']:checked").val()
726+
$("#issue-form #attributes label:contains('" + defaults.geocoder.place_search_field_name + "')").parent("p").children("input").val(
727+
$("div#places input[type='radio']:checked").val()
713728
);
714729
})
715730
}else{
716-
$("#issue-form #attributes label:contains('" + default_park_search_field_name + "')").parent("p").children("input").val("---");
731+
$("#issue-form #attributes label:contains('" + defaults.geocoder.place_search_field_name + "')").parent("p").children("input").val(
732+
defaults.geocoder.empty_field_value
733+
);
717734
}
718735
});
719736
}
@@ -898,29 +915,36 @@ var App = (function ($, publ) {
898915
}));
899916
$("#geom").val(JSON.stringify(geojson.features[0]));
900917

901-
if (updateAddressFlag && features && features.length > 0) {
902-
var addressInput = $("#issue-form #attributes label:contains('" + defaults.geocoderAddress + "')").parent("p").children("input");
918+
if (updateAddressFlag && defaults.geocoder.address_field_name && features && features.length > 0) {
919+
var addressInput = $("#issue-form #attributes label:contains('" + defaults.geocoder.address_field_name + "')").parent("p").children("input");
903920
if (addressInput.length > 0) {
904921
// Todo: only works with point geometries for now for the last geometry
905922
var coords = features[features.length - 1].getGeometry().getCoordinates();
906-
coords = ol.proj.transform(coords,'EPSG:3857','EPSG:4326')
907-
var default_geocoder_url = $("input#default_geocoder_url").val()
908-
$.getJSON(default_geocoder_url + "/reversegeocode/json/" + coords.join(",") + ",1000", function(data) {
909-
var districtInput = $("#issue-form #attributes label:contains('" + defaults.geocoderDistrict + "')").parent("p").children("input");
923+
coords = ol.proj.transform(coords,'EPSG:3857','EPSG:4326');
924+
var reverse_geocode_url = defaults.geocoder.reverse_geocode_url.replace("{lon}", coords[0].toString()).replace("{lat}", coords[1].toString());
925+
$.getJSON(reverse_geocode_url, function(data) {
926+
var check = evaluateComparison(getObjectPathValue(data, defaults.geocoder.reverse_geocode_result_check_path),
927+
defaults.geocoder.reverse_geocode_result_check_operator,
928+
defaults.geocoder.reverse_geocode_result_check_value);
929+
var districtInput = $("#issue-form #attributes label:contains('" + defaults.geocoder.district_field_name + "')").parent("p").children("input");
930+
var address = getObjectPathValue(data, defaults.geocoder.reverse_geocode_result_address_path);
910931
var foundDistrict = false;
911-
if (data.result.code >= 0 && data.result.address) {
912-
addressInput.val(data.result.address);
913-
if (districtInput.length > 0 && data.result.shikuchoson) {
914-
var regexp = /^(?:\S+)?(\S+)$/g;
915-
var match = regexp.exec(data.result.shikuchoson);
916-
if (match && match.length === 2) {
917-
districtInput.val(match[1]);
918-
foundDistrict = true;
932+
if (check && address) {
933+
addressInput.val(address);
934+
if (districtInput.length > 0) {
935+
var district = getObjectPathValue(data, defaults.geocoder.reverse_geocode_result_district_path);
936+
if (district) {
937+
var regexp = new RegExp(defaults.geocoder.reverse_geocode_result_district_regexp);
938+
var match = regexp.exec(district);
939+
if (match && match.length === 2) {
940+
districtInput.val(match[1]);
941+
foundDistrict = true;
942+
}
919943
}
920944
}
921945
}
922946
else {
923-
addressInput.val("---");
947+
addressInput.val(defaults.geocoder.empty_field_value);
924948
}
925949
if (!foundDistrict) {
926950
if (districtInput.length > 0) {
@@ -1016,6 +1040,43 @@ var App = (function ($, publ) {
10161040
return size;
10171041
}
10181042

1043+
function getObjectPathValue(obj, path, def) {
1044+
var stringToPath = function (path) {
1045+
if (typeof path !== 'string') {
1046+
return path;
1047+
}
1048+
var output = [];
1049+
path.split('.').forEach(function (item, index) {
1050+
item.split(/\[([^}]+)\]/g).forEach(function (key) {
1051+
if (key.length > 0) {
1052+
output.push(key);
1053+
}
1054+
});
1055+
});
1056+
return output;
1057+
};
1058+
1059+
path = stringToPath(path);
1060+
var current = obj;
1061+
for (var i = 0; i < path.length; i++) {
1062+
if (!current[path[i]]) {
1063+
return def;
1064+
}
1065+
current = current[path[i]];
1066+
}
1067+
1068+
return current;
1069+
}
1070+
1071+
function evaluateComparison(left, operator, right) {
1072+
if (typeof left == 'object') {
1073+
left = JSON.stringify(left);
1074+
return Function('"use strict";return (JSON.parse(\'' + left + '\')' + operator + right + ')')();
1075+
} else {
1076+
return Function('"use strict";return (' + left + operator + right + ')')();
1077+
}
1078+
}
1079+
10191080
/**
10201081
* Return public objects
10211082
*/

config/locales/en.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ en:
3737
label_tab_geocoder: "Geocoder"
3838
label_tab_map: "Tile Sources"
3939

40-
geocoder_url: "Geocoder URL"
40+
geocoder_options: "Geocoder Options"
4141

4242
gtt_tile_sources_info: Select the tile sources that should be available in this project.
4343

@@ -59,7 +59,7 @@ en:
5959

6060
select_default_tracker_icon: "Select default tracker icon:"
6161
select_default_status_color: "Select default status color:"
62-
select_default_map_settings: "Select default map settings:"
63-
select_default_geocoder_settings: "Select default geocoder settings:"
62+
select_default_map_settings: "Set default map settings:"
63+
select_default_geocoder_settings: "Set Geocoder settings:"
6464

6565
text_osm_url_sample: For example https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png

config/locales/ja.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ ja:
3737
label_tab_geocoder: "ジオコーダー"
3838
label_tab_map: "タイルソース"
3939

40-
geocoder_url: "ジオコーダのURL"
40+
geocoder_options: "ジオコーダのオプション"
4141

4242
gtt_tile_sources_info: このプロジェクトで使用できるタイルソースを選択します。
4343

@@ -59,7 +59,7 @@ ja:
5959

6060
select_default_tracker_icon: "レポートの分野アイコンを選択:"
6161
select_default_status_color: "ステータス色を選択:"
62-
select_default_map_settings: "地図の初期値を選択:"
63-
select_default_geocoder_settings: "ジオコーダの初期値を選択:"
62+
select_default_map_settings: "地図の初期値を設定:"
63+
select_default_geocoder_settings: "ジオコーダの設定:"
6464

6565
text_osm_url_sample: "例: https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png"

0 commit comments

Comments
 (0)