docs: def from_points(cls, lons, lats, depths=None, sitemodel=None,
                      req_site_params=()):
          """
          Build the site collection from
  
          :param lons:
              a sequence of longitudes
          :param lats:
              a sequence of latitudes
          :param depths:
              a sequence of depths (or None)
          :param sitemodel:
              None or an object containing site parameters as attributes
          :param req_site_params:
              a sequence of required site parameters, possibly empty
          """
          assert len(lons) < U32LIMIT, len(lons)
          if depths is None:
              depths = numpy.zeros(len(lons))
          assert len(lons) == len(lats) == len(depths), (len(lons), len(lats),
                                                         len(depths))
          self = object.__new__(cls)
          self.complete = self
          req = ['sids', 'lon', 'lat', 'depth'] + sorted(
              par for par in req_site_params if par not in ('lon', 'lat'))
          if 'vs30' in req and 'vs30measured' not in req:
              req.append('vs30measured')
          self.dtype = numpy.dtype([(p, site_param_dt[p]) for p in req])
          self.array = arr = numpy.zeros(len(lons), self.dtype)
          arr['sids'] = numpy.arange(len(lons), dtype=numpy.uint32)
          arr['lon'] = fix_lon(numpy.array(lons))
          arr['lat'] = numpy.array(lats)
          arr['depth'] = numpy.array(depths)
          if sitemodel is None:
              pass
          elif hasattr(sitemodel, 'reference_vs30_value'):
              # sitemodel is actually an OqParam instance
              self._set('vs30', sitemodel.reference_vs30_value)
              self._set('vs30measured',
                        sitemodel.reference_vs30_type == 'measured')
              self._set('z1pt0', sitemodel.reference_depth_to_1pt0km_per_sec)
              self._set('z2pt5', sitemodel.reference_depth_to_2pt5km_per_sec)
              self._set('siteclass', sitemodel.reference_siteclass)
          else:
              for name in sitemodel.dtype.names:
                  if name not in ('lon', 'lat'):
                      self._set(name, sitemodel[name])
          return self