Skip to content

Commit 369abf0

Browse files
authored
Merge pull request #668 from rjleveque/kml_dateline
Improve kmltools for regions / lines crossing the dateline
2 parents 5e8e87e + e282c43 commit 369abf0

File tree

1 file changed

+73
-16
lines changed

1 file changed

+73
-16
lines changed

src/python/geoclaw/kmltools.py

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -334,24 +334,37 @@ def regions2kml(rundata=None,fname='regions.kml',verbose=True,combined=True):
334334
mapping['width'] = 2
335335

336336
if flagregion.spatial_region_type == 1:
337-
x1,x2,y1,y2 = flagregion.spatial_region
338-
x = [x1,x1,x2,x2,x1]
339-
y = [y1,y2,y2,y1,y1]
337+
#x1,x2,y1,y2 = flagregion.spatial_region
338+
#x = [x1,x1,x2,x2,x1]
339+
#y = [y1,y2,y2,y1,y1]
340+
region_text = kml_region(mapping) # mapping contains rectangle
340341
else:
342+
# for Ruled Rectangles, must list all vertices:
341343
x,y = flagregion.spatial_region.vertices()
342344

343-
v = "\n"
344-
for j in range(len(x)):
345-
v = v + "%s,%s,%s\n" % (f2s(x[j]),f2s(y[j]),f2s(elev))
346-
v = v + "%s,%s,%s\n" % (f2s(x[0]),f2s(y[0]),f2s(elev))
347-
v.replace(' ','')
345+
# if all x values are > 180 or all are < -180 shift the values
346+
# for coordinates (original values still appear in description):
347+
xge = np.array(x)
348+
if xge.min() > 180:
349+
xge = xge - 360.
350+
if xge.max() < -180:
351+
xge = xge + 360.
352+
if x.min() < -180 or x.max() > 180:
353+
# cannot deal with this case easily
354+
print('*** polygon spans date line, might not display properly')
355+
356+
v = "\n"
357+
for j in range(len(x)):
358+
v = v + "%s,%s,%s\n" % (f2s(xge[j]),f2s(y[j]),f2s(elev))
359+
v = v + "%s,%s,%s\n" % (f2s(xge[0]),f2s(y[0]),f2s(elev))
360+
v.replace(' ','')
348361

349-
region_text = kml_region(mapping, v)
362+
region_text = kml_region(mapping, v)
350363

351-
fname = flagregion.name + '.kml'
352-
region_text = kml_region(mapping, v)
353364
kml_text = kml_text + region_text
354365

366+
fname = flagregion.name + '.kml'
367+
355368
if not combined:
356369
kml_text = kml_text + kml_footer()
357370
kml_file = open(fname,'w')
@@ -582,10 +595,20 @@ def poly2kml(xy,fname=None,name='poly',color='00FF00', width=3,
582595
mapping['color'] = color
583596
mapping['width'] = width
584597

598+
# if all x values are > 180 or all are < -180 shift the values for plotting
599+
xge = np.array(x)
600+
if xge.min() > 180:
601+
xge = xge - 360.
602+
if xge.max() < -180:
603+
xge = xge + 360.
604+
if x.min() < -180 or x.max() > 180:
605+
# cannot deal with this case easily
606+
print('*** polygon spans date line, might not display properly')
607+
585608
v = "\n"
586609
for j in range(len(x)):
587-
v = v + "%s,%s,%s\n" % (f2s(x[j]),f2s(y[j]),f2s(elev))
588-
v = v + "%s,%s,%s\n" % (f2s(x[0]),f2s(y[0]),f2s(elev))
610+
v = v + "%s,%s,%s\n" % (f2s(xge[j]),f2s(y[j]),f2s(elev))
611+
v = v + "%s,%s,%s\n" % (f2s(xge[0]),f2s(y[0]),f2s(elev))
589612
v.replace(' ','')
590613

591614
region_text = kml_region(mapping, v)
@@ -655,15 +678,29 @@ def gauges2kml(rundata=None, fname='gauges.kml', verbose=True):
655678
for rnum,gauge in enumerate(gauges):
656679
t1,t2 = gauge[3:5]
657680
x1,y1 = gauge[1:3]
681+
682+
# adjust point location for GE so -180 <= xge <= 180:
683+
if x1 < -180:
684+
xge = x1+360
685+
elif x1 > 180:
686+
xge = x1-360
687+
else:
688+
xge = x1
689+
658690
gaugeno = gauge[0]
659691
if verbose:
660-
print("Gauge %i: %s, %s \n" % (gaugeno,f2s(x1),f2s(y1)) \
661-
+ " t1 = %s, t2 = %s" % (f2s(t1),f2s(t2)))
692+
if xge == x1:
693+
print("Gauge %i: x = %s, y = %s \n" % (gaugeno,f2s(x1),f2s(y1)) \
694+
+ " t1 = %s, t2 = %s" % (f2s(t1),f2s(t2)))
695+
else:
696+
print("Gauge %i: x = %s (%s), y = %s \n" \
697+
% (gaugeno,f2s(x1),f2s(xge),f2s(y1)) \
698+
+ " t1 = %s, t2 = %s" % (f2s(t1),f2s(t2)))
662699
mapping = {}
663700
mapping['gaugeno'] = gaugeno
664701
mapping['t1'] = t1
665702
mapping['t2'] = t2
666-
mapping['x1'] = x1
703+
mapping['x1'] = xge
667704
mapping['y1'] = y1
668705
mapping['elev'] = elev
669706
mapping['name'] = 'Gauge %i' % rnum
@@ -700,6 +737,26 @@ def kml_footer():
700737

701738
def kml_region(mapping, vertex_text=None):
702739

740+
# if all x values are > 180 or all are < -180 shift the values for plotting
741+
if 'x3' in mapping:
742+
xge = np.array([mapping['x1'], mapping['x2'], mapping['x3'],mapping['x4']])
743+
else:
744+
xge = np.array([mapping['x1'], mapping['x2']])
745+
if xge.min() > 180:
746+
xge = xge - 360.
747+
if xge.max() < -180:
748+
xge = xge + 360.
749+
if xge.min() < -180 or xge.max() > 180:
750+
# cannot deal with this case easily
751+
print('*** kml_region spans date line, might not display properly')
752+
753+
mapping['x1'] = xge[0]
754+
mapping['x2'] = xge[1]
755+
if 'x3' in mapping:
756+
mapping['x3'] = xge[2]
757+
mapping['x4'] = xge[3]
758+
759+
703760
if vertex_text is None:
704761
if 'x3' in mapping:
705762
# quadrilateral with 4 corners specified

0 commit comments

Comments
 (0)