@@ -40,8 +40,7 @@ var App = (function ($, publ) {
40
40
zoom : 13 ,
41
41
maxzoom : 19 ,
42
42
fitMaxzoom : 17 ,
43
- geocoderAddress : "現地住所" ,
44
- geocoderDistrict : "区名"
43
+ geocoder : { }
45
44
} ;
46
45
47
46
/**
@@ -59,8 +58,7 @@ var App = (function ($, publ) {
59
58
layerArr = [ ] ;
60
59
61
60
contents = $ ( options . target ) . data ( ) ;
62
- defaults = $ ( "#ol-defaults" ) . data ( ) ;
63
- defaults . geocoderUrl = "https://***REMOVED***/geojson" ;
61
+ defaults = $ ( "#gtt-defaults" ) . data ( ) ;
64
62
65
63
// Check if params are null or undefined (use "==" instead of "===" to detect both)
66
64
if ( defaults . lon == null ) {
@@ -78,11 +76,8 @@ var App = (function ($, publ) {
78
76
if ( defaults . fitMaxzoom == null ) {
79
77
defaults . fitMaxzoom = quick_hack . fitMaxzoom ;
80
78
}
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 ;
86
81
}
87
82
88
83
if ( contents . geom && contents . geom !== null ) {
@@ -352,7 +347,7 @@ var App = (function ($, publ) {
352
347
publ . getSymbol = function ( feature ) {
353
348
var symbol = "mcr-icon-write" ;
354
349
355
- var plugin_settings = $ ( "#ol -defaults" ) . data ( "pluginSettings" ) ;
350
+ var plugin_settings = $ ( "#gtt -defaults" ) . data ( "pluginSettings" ) ;
356
351
var tracker_id = feature . get ( "tracker_id" ) || $ ( "#issue_tracker_id" ) . val ( ) ;
357
352
if ( tracker_id ) {
358
353
var key = "tracker_" + tracker_id ;
@@ -626,23 +621,29 @@ var App = (function ($, publ) {
626
621
*/
627
622
publ . setGeocoding = function ( ) {
628
623
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 ( )
632
624
// Hack to add Geocoding buttons to text fields
633
625
// 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>'
637
632
) ;
638
633
639
634
$ ( "button.btn-geocode" ) . on ( "click" , function ( evt ) {
640
635
// Geocode address and add/update icon on map
641
636
if ( $ ( "button.btn-geocode" ) . prev ( "input" ) . val ( ) != "" ) {
642
637
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 ] ;
646
647
var geom = new ol . geom . Point (
647
648
ol . proj . fromLonLat ( coords , 'EPSG:3857' , 'EPSG:4326' )
648
649
)
@@ -656,64 +657,80 @@ var App = (function ($, publ) {
656
657
publ . updateForm ( vector . getSource ( ) . getFeatures ( ) ) ;
657
658
publ . zoomToExtent ( true ) ;
658
659
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 ;
660
662
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 ) ;
665
667
if ( match && match . length === 2 ) {
666
668
districtInput . val ( match [ 1 ] ) ;
667
669
foundDistrict = true ;
668
670
}
669
671
}
670
672
if ( ! foundDistrict ) {
671
- districtInput . val ( "" ) ;
673
+ if ( districtInput . length > 0 ) {
674
+ districtInput . val ( "" ) ;
675
+ }
672
676
}
673
677
}
674
678
}
675
679
} )
676
680
}
677
681
} ) ;
678
682
}
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>'
683
690
) ;
684
691
685
- $ ( "button.btn-parksearch " ) . on ( "click" , function ( evt ) {
692
+ $ ( "button.btn-placesearch " ) . on ( "click" , function ( evt ) {
686
693
if ( vector . getSource ( ) . getFeatures ( ) . length > 0 ) {
687
694
var coords = null
688
695
vector . getSource ( ) . getFeatures ( ) . forEach ( function ( feature ) {
689
696
// Todo: only works with point geometries for now for the last geometry
690
697
coords = feature . getGeometry ( ) . getCoordinates ( ) ;
691
698
} ) ;
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 ) {
696
707
$ ( '#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>"
700
713
) ;
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
706
721
+ '<br>' )
707
722
}
708
723
} )
709
724
showModal ( 'ajax-modal' , '400px' ) ;
710
725
$ ( "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 ( )
713
728
) ;
714
729
} )
715
730
} 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
+ ) ;
717
734
}
718
735
} ) ;
719
736
}
@@ -898,29 +915,36 @@ var App = (function ($, publ) {
898
915
} ) ) ;
899
916
$ ( "#geom" ) . val ( JSON . stringify ( geojson . features [ 0 ] ) ) ;
900
917
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" ) ;
903
920
if ( addressInput . length > 0 ) {
904
921
// Todo: only works with point geometries for now for the last geometry
905
922
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 ) ;
910
931
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
+ }
919
943
}
920
944
}
921
945
}
922
946
else {
923
- addressInput . val ( "---" ) ;
947
+ addressInput . val ( defaults . geocoder . empty_field_value ) ;
924
948
}
925
949
if ( ! foundDistrict ) {
926
950
if ( districtInput . length > 0 ) {
@@ -1016,6 +1040,43 @@ var App = (function ($, publ) {
1016
1040
return size ;
1017
1041
}
1018
1042
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
+
1019
1080
/**
1020
1081
* Return public objects
1021
1082
*/
0 commit comments