11//= require qs/dist/qs
2+ //= require ../ohm/dates
23
34OSM . Query = function ( map ) {
45 const control = $ ( ".control-query" ) ,
@@ -114,52 +115,6 @@ OSM.Query = function (map) {
114115 return prefix ;
115116 }
116117
117- function featureSuffix ( feature ) {
118- const tags = feature . tags ;
119- const startDate = parseYear ( tags . start_date ) ;
120- const endDate = parseYear ( tags . end_date ) ;
121-
122- if ( ! startDate && ! endDate ) {
123- return null ;
124- }
125-
126- // Keep the date range suffix succinct by only including the year and era.
127- let options = {
128- timeZone : "UTC" ,
129- year : "numeric"
130- } ;
131- if ( endDate ) {
132- options . era = endDate . getUTCFullYear ( ) < 1 ? "short" : undefined ;
133- }
134- if ( startDate ) {
135- // Override any settings from the end of the range.
136- options . era = startDate . getUTCFullYear ( ) < 1 ? "short" : undefined ;
137- }
138-
139- // Get the date range format in structured form, then filter out anything untagged.
140- let format = new Intl . DateTimeFormat ( OSM . i18n . locale , options ) ;
141- let lateDate = new Date ( Date . UTC ( 9999 ) ) ;
142- let parts = format . formatRangeToParts ( startDate || lateDate , endDate || lateDate ) ;
143- if ( ! startDate ) {
144- parts = parts . filter ( p => p . source !== "startRange" ) ;
145- }
146- if ( ! endDate ) {
147- parts = parts . filter ( p => p . source !== "endRange" ) ;
148- }
149-
150- return parts . map ( p => p . value ) . join ( "" ) ;
151- }
152-
153- function parseYear ( iso8601 ) {
154- if ( ! iso8601 ) {
155- return null ;
156- }
157-
158- const date = new Date ( 0 ) ;
159- date . setUTCFullYear ( parseInt ( iso8601 , 10 ) ) ;
160- return isNaN ( date . getDate ( ) ) ? null : date ;
161- }
162-
163118 function featureName ( feature ) {
164119 const tags = feature . tags ,
165120 localeKeys = OSM . preferred_languages . map ( locale => `name:${ locale } ` ) ;
@@ -289,52 +244,7 @@ OSM.Query = function (map) {
289244 function size ( { maxlon, minlon, maxlat, minlat } ) {
290245 return ( maxlon - minlon ) * ( maxlat - minlat ) ;
291246 }
292-
293- // Check if date is before 1000 CE (OverpassQL doesn't support these dates)
294- function isBeforeYear1000 ( dateStr ) {
295- if ( ! dateStr ) return false ;
296- const match = dateStr . match ( / ^ ( - ? \d + ) / ) ;
297- return match ? parseInt ( match [ 1 ] , 10 ) < 1000 : false ;
298- }
299-
300247 // Compare ISO 8601 dates correctly (handles BCE dates where string comparison fails)
301- function compareDates ( date1 , date2 ) {
302- if ( ! date1 && ! date2 ) return 0 ;
303- if ( ! date1 ) return - 1 ;
304- if ( ! date2 ) return 1 ;
305-
306- const match1 = date1 . match ( / ^ ( - ? \d + ) (?: - ( \d { 1 , 2 } ) ) ? (?: - ( \d { 1 , 2 } ) ) ? / ) ;
307- const match2 = date2 . match ( / ^ ( - ? \d + ) (?: - ( \d { 1 , 2 } ) ) ? (?: - ( \d { 1 , 2 } ) ) ? / ) ;
308- if ( ! match1 || ! match2 ) return date1 . localeCompare ( date2 ) ;
309-
310- const [ , year1Str , month1Str , day1Str ] = match1 ;
311- const [ , year2Str , month2Str , day2Str ] = match2 ;
312- const year1Int = parseInt ( year1Str , 10 ) ;
313- const year2Int = parseInt ( year2Str , 10 ) ;
314-
315- if ( year1Int !== year2Int ) return year1Int - year2Int ;
316-
317- const month1 = month1Str ? parseInt ( month1Str , 10 ) : 1 ;
318- const month2 = month2Str ? parseInt ( month2Str , 10 ) : 1 ;
319- if ( month1 !== month2 ) return month1 - month2 ;
320-
321- const day1 = day1Str ? parseInt ( day1Str , 10 ) : 1 ;
322- const day2 = day2Str ? parseInt ( day2Str , 10 ) : 1 ;
323- return day1 - day2 ;
324- }
325-
326- function filterByDate ( elements , currentDate ) {
327- if ( ! currentDate ) return elements ;
328- return elements . filter ( element => {
329- const tags = element . tags || { } ;
330- const startDate = tags . start_date ;
331- const endDate = tags . end_date ;
332- if ( startDate && compareDates ( startDate , currentDate ) > 0 ) return false ;
333- if ( endDate && compareDates ( endDate , currentDate ) <= 0 ) return false ;
334- return true ;
335- } ) ;
336- }
337-
338248 /*
339249 * QUERY MECHANISM:
340250 *
@@ -383,11 +293,13 @@ OSM.Query = function (map) {
383293
384294 if ( map . timeslider ) {
385295 const currentDate = map . timeslider . getDate ( ) ;
296+ console . info ( currentDate ) ;
386297 if ( currentDate ) {
387298 if ( isBeforeYear1000 ( currentDate ) ) {
388299 // OverpassQL doesn't support dates < 1000 CE, filter in JavaScript instead
389300 jsDateFilter = currentDate ;
390301 } else {
302+ expandEndDate ( ) ;
391303 dateFilter = `(if: (!is_tag("start_date") || t["start_date"] <= "${ currentDate } ") && (!is_tag("end_date") || t["end_date"] > "${ currentDate } "))` ;
392304 }
393305 }
@@ -412,6 +324,8 @@ OSM.Query = function (map) {
412324 ...featureStyle
413325 } ) . addTo ( map ) ;
414326
327+ console . info ( `dateFilter: ${ dateFilter } ` ) ;
328+ console . info ( `jsDateFilter: ${ jsDateFilter } ` ) ;
415329 runQuery ( nearby , $ ( "#query-nearby" ) , false , null , jsDateFilter ) ;
416330 runQuery ( isin , $ ( "#query-isin" ) , true , ( feature1 , feature2 ) => size ( feature1 . bounds ) - size ( feature2 . bounds ) , jsDateFilter ) ;
417331 }
0 commit comments