Пример #1
0
    names = [line.split(' ')[0] for line in f]
gnss_data = num.loadtxt(fname, skiprows=2, usecols=(1, 2, 3, 4, 5, 6, 7, 8))

for ista, sta_data in enumerate(gnss_data):
    name = names[ista]
    lon, lat, de, dn, du, sde, sdn, sdu = map(float, sta_data)

    station = gnss.GNSSStation(code=name, lat=lat, lon=lon, elevation=0.)

    if station.distance_to(RIDGECREST_EQ) > DIST_MAX:
        continue

    station.east = gnss.GNSSComponent(shift=de, sigma=sde)
    station.north = gnss.GNSSComponent(shift=dn, sigma=sdn)
    station.up = gnss.GNSSComponent(shift=du, sigma=sdu)

    campaign.add_station(station)

print('Selected %d stations, saving to ridgecrest_coseis_gnss.yml' %
      (campaign.nstations))
campaign.dump(filename='2019-ridgecrest_gnss_unr.yml')

print('Creating map...')
m = Map(lat=RIDGECREST_EQ.lat,
        lon=RIDGECREST_EQ.lon,
        radius=DIST_MAX * 1.5,
        width=20.,
        height=14.)
m.add_gnss_campaign(campaign)
m.save('2019-ridgecrest_GNSS-UNR.pdf')
Пример #2
0
from pyrocko import moment_tensor as pmt

gmtpy.check_have_gmt()

# Download example data
get_example_data('stations_deadsea.pf')
get_example_data('deadsea_events_1976-2017.txt')

# Generate the basic map
m = Map(lat=31.5,
        lon=35.5,
        radius=150000.,
        width=30.,
        height=30.,
        show_grid=False,
        show_topo=True,
        color_dry=(238, 236, 230),
        topo_cpt_wet='light_sea_uniform',
        topo_cpt_dry='light_land_uniform',
        illuminate=True,
        illuminate_factor_ocean=0.15,
        show_rivers=False,
        show_plates=True)

# Draw some larger cities covered by the map area
m.draw_cities()

# Generate with latitute, longitude and labels of the stations
stations = model.load_stations('stations_deadsea.pf')
lats = [s.lat for s in stations]
lons = [s.lon for s in stations]
labels = ['.'.join(s.nsl()) for s in stations]
Пример #3
0
    def call(self):
        if not self.viewer_connected:
            self.get_viewer().about_to_close.connect(
                self.file_serving_worker.stop)
            self.viewer_connected = True
        try:
            from OpenGL import GL  # noqa
        except ImportError:
            logger.warn('Could not find package OpenGL, '
                        'if the map does not work try installing OpenGL\n'
                        'e.g. sudo pip install PyOpenGL')

        self.cleanup()

        try:
            viewer = self.get_viewer()
            cli_mode = False
        except NoViewerSet:
            viewer = None
            cli_mode = True

        if not cli_mode:
            if self.only_active:
                _, active_stations = \
                    self.get_active_event_and_stations()
            else:
                active_stations = viewer.stations.values()
        elif cli_mode:
            active_stations = self.stations

        station_list = []
        if active_stations:
            for stat in active_stations:
                is_blacklisted = util.match_nslc(viewer.blacklist, stat.nsl())
                if (viewer and not is_blacklisted) or cli_mode:
                    xml_station_marker = XMLStationMarker(
                        nsl='.'.join(stat.nsl()),
                        longitude=float(stat.lon),
                        latitude=float(stat.lat),
                        active='yes')

                    station_list.append(xml_station_marker)

        active_station_list = StationMarkerList(stations=station_list)

        if self.only_active:
            markers = [viewer.get_active_event_marker()]
        else:
            if cli_mode:
                markers = self.markers
            else:
                markers = self.get_selected_markers()
                if len(markers) == 0:
                    tmin, tmax = self.get_selected_time_range(fallback=True)
                    markers = [
                        m for m in viewer.get_markers()
                        if isinstance(m, gui_util.EventMarker)
                        and m.tmin >= tmin and m.tmax <= tmax
                    ]

        ev_marker_list = []
        for m in markers:
            if not isinstance(m, gui_util.EventMarker):
                continue
            xmleventmarker = convert_event_marker(m)
            if xmleventmarker is None:
                continue
            ev_marker_list.append(xmleventmarker)

        event_list = EventMarkerList(events=ev_marker_list)
        event_station_list = MarkerLists(
            station_marker_list=active_station_list,
            event_marker_list=event_list)

        event_station_list.validate()
        if self.map_kind != 'GMT':
            tempdir = self.marker_tempdir
            if self.map_kind == 'Google Maps':
                map_fn = 'map_googlemaps.html'
            elif self.map_kind == 'OpenStreetMap':
                map_fn = 'map_osm.html'

            url = 'http://localhost:' + str(self.port) + '/%s' % map_fn

            files = ['loadxmldoc.js', 'map_util.js', 'plates.kml', map_fn]
            snuffling_dir = op.dirname(op.abspath(__file__))
            for entry in files:
                shutil.copy(os.path.join(snuffling_dir, entry),
                            os.path.join(tempdir, entry))
            logger.debug('copied data to %s' % tempdir)
            markers_fn = os.path.join(self.marker_tempdir, 'markers.xml')
            self.data_proxy.content_to_serve.emit(self.port)
            dump_xml(event_station_list, filename=markers_fn)

            if self.open_external:
                qg.QDesktopServices.openUrl(qc.QUrl(url))
            else:
                global g_counter
                g_counter += 1
                self.web_frame(url,
                               name='Map %i (%s)' % (g_counter, self.map_kind))
        else:
            lats_all = []
            lons_all = []

            slats = []
            slons = []
            slabels = []
            for s in active_stations:
                slats.append(s.lat)
                slons.append(s.lon)
                slabels.append('.'.join(s.nsl()))

            elats = []
            elons = []
            elats = []
            elons = []
            psmeca_input = []
            markers = self.get_selected_markers()
            for m in markers:
                if isinstance(m, gui_util.EventMarker):
                    e = m.get_event()
                    elats.append(e.lat)
                    elons.append(e.lon)
                    if e.moment_tensor is not None:
                        mt = e.moment_tensor.m6()
                        psmeca_input.append((e.lon, e.lat, e.depth / 1000.,
                                             mt[0], mt[1], mt[2], mt[3], mt[4],
                                             mt[5], 1., e.lon, e.lat, e.name))
                    else:
                        if e.magnitude is None:
                            moment = -1.
                        else:
                            moment = moment_tensor.magnitude_to_moment(
                                e.magnitude)
                            psmeca_input.append(
                                (e.lon, e.lat, e.depth / 1000., moment / 3.,
                                 moment / 3., moment / 3., 0., 0., 0., 1.,
                                 e.lon, e.lat, e.name))

            lats_all.extend(elats)
            lons_all.extend(elons)
            lats_all.extend(slats)
            lons_all.extend(slons)

            lats_all = num.array(lats_all)
            lons_all = num.array(lons_all)

            if len(lats_all) == 0:
                return

            center_lat, center_lon = ortho.geographic_midpoint(
                lats_all, lons_all)
            ntotal = len(lats_all)
            clats = num.ones(ntotal) * center_lat
            clons = num.ones(ntotal) * center_lon
            dists = ortho.distance_accurate50m_numpy(clats, clons, lats_all,
                                                     lons_all)

            maxd = num.max(dists) or 0.
            m = Map(lat=center_lat,
                    lon=center_lon,
                    radius=max(10000., maxd) * 1.1,
                    width=35,
                    height=25,
                    show_grid=True,
                    show_topo=True,
                    color_dry=(238, 236, 230),
                    topo_cpt_wet='light_sea_uniform',
                    topo_cpt_dry='light_land_uniform',
                    illuminate=True,
                    illuminate_factor_ocean=0.15,
                    show_rivers=False,
                    show_plates=False)

            m.gmt.psxy(in_columns=(slons, slats), S='t15p', G='black', *m.jxyr)
            for i in range(len(active_stations)):
                m.add_label(slats[i], slons[i], slabels[i])

            m.gmt.psmeca(in_rows=psmeca_input,
                         S='m1.0',
                         G='red',
                         C='5p,0/0/0',
                         *m.jxyr)

            tmpdir = self.tempdir()

            self.outfn = os.path.join(tmpdir, '%i.png' % self.figcount)
            m.save(self.outfn)
            f = self.pixmap_frame(self.outfn)  # noqa
Пример #4
0
def plot_map(stations, center, events=None, savename=None):
    from pyrocko.plot.automap import Map
    from pyrocko.example import get_example_data
    from pyrocko import model, gmtpy
    from pyrocko import moment_tensor as pmt

    gmtpy.check_have_gmt()

    # Generate the basic map
    m = Map(lat=center[0],
            lon=center[1],
            radius=150000.,
            width=30.,
            height=30.,
            show_grid=False,
            show_topo=True,
            color_dry=(238, 236, 230),
            topo_cpt_wet='light_sea_uniform',
            topo_cpt_dry='light_land_uniform',
            illuminate=True,
            illuminate_factor_ocean=0.15,
            show_rivers=False,
            show_plates=False)

    # Draw some larger cities covered by the map area
    m.draw_cities()

    # Generate with latitute, longitude and labels of the stations
    lats = [s.lat for s in stations]
    lons = [s.lon for s in stations]
    labels = ['.'.join(s.nsl()) for s in stations]

    # Stations as black triangles.
    m.gmt.psxy(in_columns=(lons, lats), S='t20p', G='black', *m.jxyr)

    # Station labels
    for i in range(len(stations)):
        m.add_label(lats[i], lons[i], labels[i])

    beachball_symbol = 'd'
    factor_symbl_size = 5.0
    if events is not None:
        for ev in events:
            mag = ev.magnitude
            if ev.moment_tensor is None:
                ev_symb = 'c' + str(mag * factor_symbl_size) + 'p'
                m.gmt.psxy(in_rows=[[ev.lon, ev.lat]],
                           S=ev_symb,
                           G=gmtpy.color('scarletred2'),
                           W='1p,black',
                           *m.jxyr)
            else:
                devi = ev.moment_tensor.deviatoric()
                beachball_size = mag * factor_symbl_size
                mt = devi.m_up_south_east()
                mt = mt / ev.moment_tensor.scalar_moment() \
                    * pmt.magnitude_to_moment(5.0)
                m6 = pmt.to6(mt)
                data = (ev.lon, ev.lat, 10) + tuple(m6) + (1, 0, 0)

                if m.gmt.is_gmt5():
                    kwargs = dict(M=True,
                                  S='%s%g' % (beachball_symbol[0],
                                              (beachball_size) / gmtpy.cm))
                else:
                    kwargs = dict(S='%s%g' % (beachball_symbol[0],
                                              (beachball_size) * 2 / gmtpy.cm))

                m.gmt.psmeca(in_rows=[data],
                             G=gmtpy.color('chocolate1'),
                             E='white',
                             W='1p,%s' % gmtpy.color('chocolate3'),
                             *m.jxyr,
                             **kwargs)
    if savename is None:
        if events is None:
            m.save('pics/stations_ridgecrest.png')
        else:
            m.save('pics/mechanisms_scedc_ridgecrest.png')
    else:
        m.save(savename)
Пример #5
0

gmtpy.check_have_gmt()

# Download example data
get_example_data('stations_deadsea.pf')
get_example_data('deadsea_events_1976-2017.txt')

# Generate the basic map
m = Map(
    lat=31.5,
    lon=35.5,
    radius=150000.,
    width=30., height=30.,
    show_grid=False,
    show_topo=True,
    color_dry=(238, 236, 230),
    topo_cpt_wet='light_sea_uniform',
    topo_cpt_dry='light_land_uniform',
    illuminate=True,
    illuminate_factor_ocean=0.15,
    show_rivers=False,
    show_plates=True)

# Draw some larger cities covered by the map area
m.draw_cities()

# Generate with latitute, longitude and labels of the stations
stations = model.load_stations('stations_deadsea.pf')
lats = [s.lat for s in stations]
lons = [s.lon for s in stations]
labels = ['.'.join(s.nsl()) for s in stations]
Пример #6
0
def plot_corr_angles(ns,
                     st_lats,
                     st_lons,
                     orientfile,
                     dir_orient,
                     pl_options,
                     pl_topo,
                     mapsize,
                     ls=False):
    '''
    Plot correction angles of all stations on a map. nans are igored.
    Values for plotting are read from file which was automatically prepared in
    the orient section.

    :param ls: label position [lon (symbol), lat (symbol + label), lon (label)]
    '''

    logs = logging.getLogger('plot_corr_angles')

    gmtconf = dict(MAP_TICK_PEN_PRIMARY='1.25p',
                   MAP_TICK_PEN_SECONDARY='1.25p',
                   MAP_TICK_LENGTH_PRIMARY='0.2c',
                   MAP_TICK_LENGTH_SECONDARY='0.6c',
                   FONT_ANNOT_PRIMARY='20p,1,black',
                   FONT_LABEL='20p,1,black',
                   PS_CHAR_ENCODING='ISOLatin1+',
                   MAP_FRAME_TYPE='fancy',
                   FORMAT_GEO_MAP='D',
                   PS_PAGE_ORIENTATION='portrait',
                   MAP_GRID_PEN_PRIMARY='thinnest,0/50/0',
                   MAP_ANNOT_OBLIQUE='6')

    angles_fromfile = load(filename=os.path.join(dir_orient, orientfile))

    angle_no_nan = []
    lat_no_nan = []
    lon_no_nan = []
    angle_no_nan_u = []
    lat_no_nan_u = []
    lon_no_nan_u = []
    stats_no_nan = []
    stats_no_nan_u = []

    for i_ns, ns_now in enumerate(ns):
        for l in ['00', '', '01', '10', '60']:
            try:
                ns_now_ = '%s %s %s' % (ns_now[0], ns_now[1], l)
                a = angles_fromfile.CorrectAngl_perStat_median[ns_now_]
                nev = angles_fromfile.n_events[ns_now_]
                if a > -181.0 and a < 180.0:  # not nan
                    if nev >= 5:
                        angle_no_nan.append(0.0 - a)
                        stats_no_nan.append(ns_now[1])
                        lat_no_nan.append(st_lats[i_ns])
                        lon_no_nan.append(st_lons[i_ns])
                    else:
                        angle_no_nan_u.append(0.0 - a)
                        stats_no_nan_u.append(ns_now[1])
                        lat_no_nan_u.append(st_lats[i_ns])
                        lon_no_nan_u.append(st_lons[i_ns])
            except KeyError:
                continue

    # Generate the basic map
    m = Map(
        lat=pl_options[0],
        lon=pl_options[1],
        radius=pl_options[2],
        width=mapsize[0],
        height=mapsize[1],
        show_grid=False,
        show_topo=pl_topo,
        #color_dry=(143, 188, 143), #(238, 236, 230),
        topo_cpt_wet='white_sea_land',  #'light_sea_uniform',
        topo_cpt_dry='light_land_uniform',
        illuminate=True,
        illuminate_factor_ocean=0.15,
        show_rivers=True,
        show_plates=False,
        gmt_config=gmtconf)

    # Draw some larger cities covered by the map area
    # m.draw_cities()

    # Draw max. amplitudes at station locations as colored circles
    cptfile = 'tempfile2.cpt'
    abs_angs = list(num.abs(angle_no_nan))
    m.gmt.makecpt(C='jet', T='%g/%g' % (0.1, 180.),
                  out_filename=cptfile)  #, suppress_defaults=True)
    # m.gmt.makecpt(
    #             C='/home/gesap/Documents/CETperceptual_GMT/CET-D8.cpt',
    #             T='%g/%g' % (0.1, 180.),
    #             out_filename=cptfile)#, suppress_defaults=True)

    # same length for every vector:
    length = [1.5 for a in range(len(lat_no_nan))]
    length_u = [0.7 for a in range(len(lat_no_nan_u))]

    # angle_zero = [1.5 for a in range(len(lat_no_nan))]
    # angle_zero_u = [1.5 for a in range(len(lat_no_nan_u))]

    # plot obtained rotation vectors:
    #m.gmt.psxy(in_columns=(lon_no_nan, lat_no_nan, angle_zero, length),
    #           S='V0.5c+jc', W='0.07c,black',
    #           *m.jxyr)
    #m.gmt.psxy(in_columns=(lon_no_nan_u, lat_no_nan_u, angle_zero_u, length_u),
    #       S='V0.5c+jc', W='0.07c,black',
    #       *m.jxyr)

    m.gmt.psxy(in_columns=(lon_no_nan_u, lat_no_nan_u, angle_no_nan_u,
                           length_u),
               S='V0.4c+jc+eA',
               W='0.05c,black',
               *m.jxyr)

    m.gmt.psxy(in_columns=(lon_no_nan, lat_no_nan, abs_angs, angle_no_nan,
                           length),
               C=cptfile,
               S='V0.7c+jc+eA',
               W='0.1c+cl',
               *m.jxyr)

    # add handmade label
    if ls:
        m.gmt.psxy(in_columns=([ls[0]], [ls[1]], [ls[3]], [0.9]),
                   S='V0.5c+eA',
                   W='0.07c,red',
                   *m.jxyr)
        labels = ['Sensor orientation']
        lat_lab = [ls[1]]
        lon_lab = [ls[2]]
        for i in range(len(labels)):
            m.add_label(lat_lab[i], lon_lab[i], labels[i])

    # add a colorbar
    B_opt_psscale = 'xaf'
    m.gmt.psscale(
        B=B_opt_psscale + '+l abs. misorientation [deg]',
        D='x9c/6c+w12c/0.5c+jTC+h',  # 'x9c/17c+w12c/0.5c+jTC+h'
        C=cptfile)

    # add station labels

    has_label = []

    for i in range(len(stats_no_nan)):
        if stats_no_nan[i] not in has_label:
            m.add_label(lat_no_nan[i], lon_no_nan[i], stats_no_nan[i])
            has_label.append(stats_no_nan[i])

    has_label = []

    for i in range(len(stats_no_nan_u)):
        if stats_no_nan_u[i] not in has_label:
            m.add_label(lat_no_nan_u[i], lon_no_nan_u[i], stats_no_nan_u[i])
            has_label.append(stats_no_nan_u[i])

    m.save(os.path.join(dir_orient, 'map_orient.png'))
    logs.info('Saved map with corr. angles for sensor orientations')
Пример #7
0
def plot_median_gain_map_from_file(ns, st_lats, st_lons, pl_options, pl_topo,
                                   gains_file, directory, comp, mapsize):
    """
    Plot map with mean relative gain factors

    """
    gmtconf = dict(MAP_TICK_PEN_PRIMARY='1.25p',
                   MAP_TICK_PEN_SECONDARY='1.25p',
                   MAP_TICK_LENGTH_PRIMARY='0.2c',
                   MAP_TICK_LENGTH_SECONDARY='0.6c',
                   FONT_ANNOT_PRIMARY='20p,1,black',
                   FONT_LABEL='20p,1,black',
                   PS_CHAR_ENCODING='ISOLatin1+',
                   MAP_FRAME_TYPE='fancy',
                   FORMAT_GEO_MAP='D',
                   PS_PAGE_ORIENTATION='portrait',
                   MAP_GRID_PEN_PRIMARY='thinnest,0/50/0',
                   MAP_ANNOT_OBLIQUE='6')

    gains_fromfile = load(filename=os.path.join(directory, gains_file))
    try:
        ns_rel = gains_fromfile.ref_stats
        # print(ns_rel)
    except Exception:
        ns_rel = None

    gains_no_nan = []
    lat_no_nan = []
    lon_no_nan = []
    # stats_no_nan = []

    # print(gains_fromfile.trace_gains_median)

    for i_ns, ns_now in enumerate(ns):
        for l in ['00', '', '01', '10', '60']:
            try:
                nslc = '%s.%s.%s.%s' % (ns_now[0], ns_now[1], l, comp)
                g = gains_fromfile.trace_gains_median[nslc]

                if g > 0.0 or g < 0.0:  # g < 5 and g > 0.2:  # g < 10.0 and g > 0.1: #g > 0.0 or g < 0.0:
                    gains_no_nan.append(g)
                    # stats_no_nan.append(ns_now[1])
                    lat_no_nan.append(st_lats[i_ns])
                    lon_no_nan.append(st_lons[i_ns])
            except KeyError:
                continue

    miny = min(gains_no_nan)
    maxy = max(gains_no_nan)
    # print(gains_no_nan)
    gains_fromfile = None
    gc.collect()
    gains_no_nan = list(num.log10(gains_no_nan))
    # print(gains_no_nan)
    m = Map(
        lat=pl_options[0],
        lon=pl_options[1],
        radius=pl_options[2],
        width=mapsize[0],
        height=mapsize[1],
        show_grid=False,
        show_topo=pl_topo,
        # topo_cpt_dry='/home/gesap/Documents/CETperceptual_GMT/CET-L2.cpt',#'/usr/local/share/cpt/gray.cpt',
        color_dry=(143, 188, 143),  # grey
        illuminate=True,
        illuminate_factor_ocean=0.15,
        # illuminate_factor_land = 0.2,
        show_rivers=True,
        show_plates=False,
        gmt_config=gmtconf)

    # Draw some larger cities covered by the map area
    # m.draw_cities()

    # Draw max. amplitudes at station locations as colored circles
    cptfile = 'tempfile.cpt'
    miny = min(gains_no_nan)
    maxy = max(gains_no_nan)

    # plus/minus 10 % for nicer scale
    miny = miny  # -0.1*miny
    maxy = maxy  # +0.1*maxy
    m.gmt.makecpt(
        C=pl_options[
            3],  #'split',#'polar',  # '/home/gesap/Documents/CETperceptual_GMT/CET-D4.cpt',#'split',#'polar',
        T='%g/%g' %
        (miny, maxy),  # (miny, maxy), # (-1,1),#(-0.7, 0.7), (-20, 20)
        Q=True,
        out_filename=cptfile,
        suppress_defaults=True)

    # if ns_rel:
    #     text = 'Gains relative to station %s, colorbar values 10^x.'\
    #            % (ns_rel)
    # else:
    #     text = 'colorbar values 10^x'
    # m.gmt.psbasemap(B='+t"%s"' % text, *m.jxyr)

    m.gmt.psxy(in_columns=(lon_no_nan, lat_no_nan, gains_no_nan),
               C=cptfile,
               G='blue',
               S='t24p',
               *m.jxyr)

    # add a colorbar
    B_opt_psscale = 'xaf'
    m.gmt.psscale(B=B_opt_psscale + '+l log10(Md(A@-i,j@-/A@-ref,j@-))',
                  D='x9c/6c+w12c/0.5c+jTC+h',
                  C=cptfile)

    # add station labels

    # for i in range(len(stats_no_nan)):
    #    m.add_label(lat_no_nan[i], lon_no_nan[i], stats_no_nan[i])
    fn = os.path.join(directory, '%s%s_map_log.png' % (gains_file[0:12], comp))
    m.save(fn)
    logging.info('saved file %s' % fn)