예제 #1
0
def location_by_coordinate(r, lat, lon):
    """ calculate distance from the most upstream rnode to the given coordinates

    **Limitation :**
    it supports calculation of the location on the same corridor
    which the most upstream rnode belongs

    :type r: pyticas.ttypes.Route
    :type lat: float
    :type lon: lon
    :rtype: float
    """
    upstream_rnode = r.rnodes[0]
    corr = upstream_rnode.corridor
    (upnode, dnnode) = geo.find_updown_rnodes(lat, lon, corr.rnodes, d_limit=1)
    if not upnode:
        return False

    f_done = False

    # check to downstream
    dist = distutil.distance_in_mile_with_coordinate(upnode.lat, upnode.lon,
                                                     lat, lon)
    cur_node = upstream_rnode
    for next_node in geo.iter_to_downstream(upstream_rnode):
        dist += distutil.distance_in_mile(cur_node, next_node)
        if upnode == next_node:
            f_done = True
            break
        cur_node = next_node

    if not f_done:
        # check to upstream
        dist = distutil.distance_in_mile_with_coordinate(
            dnnode.lat, dnnode.lon, lat, lon)
        cur_node = upstream_rnode
        for next_node in geo.iter_to_upstream(upstream_rnode):
            dist += distutil.distance_in_mile(cur_node, next_node)
            if dnnode == next_node:
                f_done = True
                break
            cur_node = next_node
        if f_done:
            dist = -1 * dist

    if f_done:
        return dist
    else:
        return False
예제 #2
0
def find_nearby_sites(s_lat, s_lon):
    """ return RWIS site list order by distance (from nearest)

    :type s_lat: float
    :type s_lon: float
    :return: RWIS site list
    :rtype: list[RWISSiteInfo]
    """
    sites = []
    for gr in cfg.RWIS_SITE_INFO:
        for st in gr['sites']:
            d = distance.distance_in_mile_with_coordinate(
                s_lat, s_lon, st['lat'], st['lon'])
            sites.append(
                RWISSiteInfo({
                    'group_id': gr['id'],
                    'group_name': gr['name'],
                    'site_id': st['id'],
                    'site_name': st['name'],
                    'lat': st['lat'],
                    'lon': st['lon'],
                    'distance_to_target': d
                }))

    return sorted(sites, key=lambda s: s.distance_to_target)
예제 #3
0
 def route_length(route):
     starting_r_node = route.rnodes[0]
     ending_r_node = route.rnodes[-1]
     distance = distance_util.distance_in_mile_with_coordinate(
         starting_r_node.lat, starting_r_node.lon, ending_r_node.lat,
         ending_r_node.lon)
     return distance
def _find_iris_data(iris_data_bucket, cad_incident_info):
    """

    :type iris_data_bucket: dict[str, list[pyticas_tetres.ttypes.IrisIncidentInfo]]
    :type cad_incident_info: pyticas_tetres.ttypes.CADIncidentInfo
    :rtype: pyticas_tetres.ttypes.IrisIncidentInfo
    """
    evt_date = cad_incident_info.str2datetime(
        cad_incident_info.cdts).strftime('%Y-%m-%d')
    iris_data_list = iris_data_bucket.get(evt_date, [])
    if not iris_data_list:
        return None

    for iris_data in iris_data_list:
        distance = distutil.distance_in_mile_with_coordinate(
            iris_data.lat, iris_data.lon, cad_incident_info.lat,
            cad_incident_info.lon)
        if distance > DISTANCE_THRESHOLD_FOR_SAME_EVENT:
            continue

        timediff = iris_data.str2datetime(
            iris_data.event_date) - cad_incident_info.str2datetime(
                cad_incident_info.cdts)
        if (timediff.seconds / 60 < TIMEDIFF_THRESHOLD_FOR_SAME_EVENT):
            return iris_data
    return None
예제 #5
0
def _find_iris_data(iris_data_bucket, cad_incident_info):
    """

    :type iris_data_bucket: dict[str, list[pyticas_tetres.ttypes.IrisIncidentInfo]]
    :type cad_incident_info: pyticas_tetres.ttypes.CADIncidentInfo
    :rtype: pyticas_tetres.ttypes.IrisIncidentInfo
    """
    evt_date = cad_incident_info.str2datetime(cad_incident_info.cdts).strftime('%Y-%m-%d')
    iris_data_list = iris_data_bucket.get(evt_date, [])
    if not iris_data_list:
        return None

    for iris_data in iris_data_list:
        try:
            iris_description = iris_data.description
            iris_classification = iris_description.split()[1]
        except:
            iris_classification = ""
        cad_classification = cad_incident_info.iris_class
        if cad_classification and iris_classification:
            if str(cad_classification).lower() != str(iris_classification).lower():
                continue
        distance = distutil.distance_in_mile_with_coordinate(iris_data.lat, iris_data.lon, cad_incident_info.lat,
                                                             cad_incident_info.lon)
        if distance > DISTANCE_THRESHOLD_FOR_SAME_EVENT:
            continue

        timediff = iris_data.str2datetime(iris_data.event_date) - cad_incident_info.str2datetime(cad_incident_info.cdts)
        if (timediff.seconds / 60 < TIMEDIFF_THRESHOLD_FOR_SAME_EVENT):
            return iris_data
    return None
예제 #6
0
def find_close_rnode(lat, lon, RNODE_CACHE, **kwargs):
    corridor_name = kwargs.get('cooridor_name', None)
    min_dist = sys.maxsize
    min_rnode = None
    for rnode in RNODE_CACHE.values():
        if corridor_name and corridor_name not in rnode.corridor.name:
            continue
        d = distance_in_mile_with_coordinate(lat, lon, rnode.lat, rnode.lon)
        if d < min_dist:
            min_dist = d
            min_rnode = rnode
    return min_rnode
예제 #7
0
def minimum_distance(r, lat, lon):
    """

    :type r: pyticas.ttypes.Route
    :type lat: float
    :type lon: lon
    :rtype: float
    """
    min_distance = sys.maxsize
    for rn in r.rnodes:
        d = distutil.distance_in_mile_with_coordinate(rn.lat, rn.lon, lat, lon)
        if d < min_distance:
            min_distance = d
    return min_distance
예제 #8
0
파일: isd.py 프로젝트: mnit-rtmc/tetres
def find_nearby_station(lat, lon, dt, station_list):
    """
    :type lat: float
    :type lon: float
    :type dt: datetime.date
    :type station_list: list[pyticas_noaa.isd.isdtypes.ISDStation]
    :return: list of (distance, ISDStation) tuple from nearby station
    :rtype: list[(float, pyticas_noaa.isd.isdtypes.ISDStation)]
    """
    res = []
    for st in station_list:
        if st.begin > dt or st.end < dt:
            continue
        d = distance.distance_in_mile_with_coordinate(lat, lon, st.lat, st.lon)
        res.append((d, st))
    return sorted(res, key=lambda item: item[0])
예제 #9
0
def nearby_sensors(lat, lon):
    """

    :param lat:
    :param lon:
    :rtype: (list[WeatherSensor], list[float])
    """
    sensors = []
    for v in WeatherSensor:
        d = distance.distance_in_mile_with_coordinate(lat, lon, v.get_lat(),
                                                      v.get_lon())
        sensors.append({'distance': d, 'sensor': v})

    sorted_list = sorted(sensors, key=lambda s: s['distance'])
    return [v['sensor']
            for v in sorted_list], [v['distance'] for v in sorted_list]
예제 #10
0
def nearby_rnode(lat, lon, rnodes, d_limit=1):
    """

    :type lat: float
    :type lon: float
    :type rnodes: list[pyticas.ttypes.RNodeObject]
    :type d_limit: float
    :rtype: pyticas.ttypes.RNodeObject, float
    """
    min_dist = 999999
    min_dist_rnode = None
    for rn in rnodes:
        d = distutil.distance_in_mile_with_coordinate(lat, lon, rn.lat, rn.lon)
        if d < min_dist and d <= d_limit:
            min_dist = d
            min_dist_rnode = rn
    return min_dist_rnode, min_dist