/* Detect roundabouts */ static int is_roundabout (int first_point, int last_point) { //RoadMapPosition middle; int length; //int i; length = editor_track_util_length (first_point, last_point); if ((length < editor_track_point_distance ()*3) || (length > editor_track_point_distance ()*20)) { return 0; } return 1; #if 0 middle.longitude = middle.latitude = 0; for (i=first_point; i<last_point; i++) { middle.longitude += GpsPoints[i].longitude; middle.latitude += GpsPoints[i].latitude; } middle.longitude /= (last_point - first_point); middle.latitude /= (last_point - first_point); /* Fix the end of the segment before the roundabout */ GpsPoints[first_point-1].longitude = middle.longitude; GpsPoints[first_point-1].latitude = middle.latitude; #endif }
int editor_track_known_end_segment (PluginLine *previous_line, int last_point_id, PluginLine *line, RoadMapTracking *street, int is_new_track) { //TODO: add stuff //Notice that previous_line may not be valid (only at first) // //check for low confidence & in static update, do not use a trkseg with low confidence! RoadMapPosition from; RoadMapPosition to; RoadMapPosition *current; int trkseg; int trkseg_line_id; int trkseg_plugin_id; int trkseg_square; int line_length; int segment_length; int percentage; int flags = 0; editor_log_push ("editor_track_end_known_segment"); assert (last_point_id != 0); if (!last_point_id) return 0; if (editor_db_activate (line->fips) == -1) { editor_db_create (line->fips); if (editor_db_activate (line->fips) == -1) { editor_log_pop (); return 0; } } roadmap_street_extend_line_ends (line, &from, &to, FLAG_EXTEND_BOTH, NULL, NULL); trkseg_plugin_id = roadmap_plugin_get_id (line); trkseg_line_id = roadmap_plugin_get_line_id (line); trkseg_square = roadmap_plugin_get_square (line); line_length = editor_track_util_get_line_length (line); segment_length = editor_track_util_length (0, last_point_id); editor_log (ROADMAP_INFO, "Ending line %d (plugin_id:%d). Line length:%d, Segment length:%d", trkseg_line_id, trkseg_plugin_id, line_length, segment_length); /* End current segment if we really passed through it * and not only touched a part of it. */ /*SRUL*: avoid this problem, see above comment assert (line_length > 0); if (line_length == 0) { editor_log (ROADMAP_ERROR, "line %d (plugin_id:%d) has length of zero.", trkseg_line_id, trkseg_plugin_id); editor_log_pop (); return 0; } */ if (line_length <= 0) line_length = 1; current = track_point_pos (last_point_id); if (roadmap_math_distance (current, &to) > roadmap_math_distance (current, &from)) { flags = ED_TRKSEG_OPPOSITE_DIR; #if DEBUG_TRACKS printf ("Closing trkseg from %d.%06d,%d.%06d to %d.%06d,%d.%06d", to.longitude / 1000000, to.longitude % 1000000, to.latitude / 1000000, to.latitude % 1000000, from.longitude / 1000000, from.longitude % 1000000, from.latitude / 1000000, from.latitude % 1000000); } else { printf ("Closing trkseg from %d.%06d,%d.%06d to %d.%06d,%d.%06d", from.longitude / 1000000, from.longitude % 1000000, from.latitude / 1000000, from.latitude % 1000000, to.longitude / 1000000, to.longitude % 1000000, to.latitude / 1000000, to.latitude % 1000000); #endif } #if DEBUG_TRACKS printf (" %d/%d", segment_length, line_length); #endif if (is_new_track) { flags |= ED_TRKSEG_NEW_TRACK; #if DEBUG_TRACKS printf (" NEW"); #endif } if (!editor_ignore_new_roads ()) { flags |= ED_TRKSEG_RECORDING_ON; } percentage = 100 * segment_length / line_length; if (percentage < 70) { editor_log (ROADMAP_INFO, "segment is too small to consider: %d%%", percentage); if (segment_length > (editor_track_point_distance ()*1.5)) { trkseg = editor_track_util_create_trkseg (trkseg_square, trkseg_line_id, trkseg_plugin_id, 0, last_point_id, flags|ED_TRKSEG_LOW_CONFID); editor_track_add_trkseg (line, trkseg, ROUTE_DIRECTION_NONE, ROUTE_CAR_ALLOWED); editor_log_pop (); #if DEBUG_TRACKS printf (" LOW (percentage)\n"); #endif return 1; } else { trkseg = editor_track_util_create_trkseg (trkseg_square, trkseg_line_id, trkseg_plugin_id, 0, last_point_id, flags|ED_TRKSEG_IGNORE); editor_track_add_trkseg (line, trkseg, ROUTE_DIRECTION_NONE, ROUTE_CAR_ALLOWED); editor_log_pop (); #if DEBUG_TRACKS printf (" IGNORE\n"); #endif return 0; } } #if 0 if (!roadmap_fuzzy_is_good (street->entry_fuzzyfied) || !roadmap_fuzzy_is_good (street->cur_fuzzyfied)) { flags |= ED_TRKSEG_LOW_CONFID; #if DEBUG_TRACKS printf (" LOW"); if (!roadmap_fuzzy_is_good (street->entry_fuzzyfied)) printf (" (entry)"); if (!roadmap_fuzzy_is_good (street->cur_fuzzyfied)) printf (" (cur)"); #endif } #endif if (trkseg_plugin_id != ROADMAP_PLUGIN_ID) flags |= ED_TRKSEG_LOW_CONFID; trkseg = editor_track_util_create_trkseg (trkseg_square, trkseg_line_id, trkseg_plugin_id, 0, last_point_id, flags); if (flags & ED_TRKSEG_OPPOSITE_DIR) { editor_log (ROADMAP_INFO, "Updating route direction: to -> from"); editor_track_add_trkseg (line, trkseg, ROUTE_DIRECTION_AGAINST_LINE, ROUTE_CAR_ALLOWED); } else { editor_log (ROADMAP_INFO, "Updating route direction: from -> to"); editor_track_add_trkseg (line, trkseg, ROUTE_DIRECTION_WITH_LINE, ROUTE_CAR_ALLOWED); } editor_log_pop (); #if DEBUG_TRACKS printf ("\n"); #endif return 1; }
static void end_unknown_segments (TrackNewSegment *new_segments, int count) { int i; int start_point = 0; NodeNeighbour end_node = NODE_NEIGHBOUR_NULL; editor_track_util_create_db (track_point_pos (start_point)); for (i=0; i<count; i++) { int type = new_segments[i].type; int end_point = new_segments[i].point_id; int end_node_id = -1; switch (type) { case TRACK_ROAD_TURN: if (editor_track_util_length (start_point, end_point) < (editor_track_point_distance () * 2)) { RoadMapPosition pos; RoadMapPosition *pos1; RoadMapPosition *pos2; pos1 = track_point_pos (start_point); pos2 = track_point_pos (end_point); pos.longitude = (pos1->longitude + pos2->longitude) / 2; pos.latitude = (pos1->latitude + pos2->latitude) / 2; if (cur_node.plugin_id == ROADMAP_PLUGIN_ID) { cur_node.id = editor_track_util_roadmap_node_to_editor (&cur_node); cur_node.plugin_id = EditorPluginID; } else { editor_point_set_pos (cur_node.id, &pos); } start_point = end_point; continue; } break; case TRACK_ROAD_ROUNDABOUT: if (cur_node.plugin_id == ROADMAP_PLUGIN_ID) { cur_node.id = editor_track_util_roadmap_node_to_editor (&cur_node); cur_node.plugin_id = EditorPluginID; } create_new_line (start_point, end_point, cur_node.id, cur_node.id, ROADMAP_ROAD_STREET); start_point = end_point; continue; break; } if ((i == (count - 1)) && (TrackConfirmedStreet.valid)) { /* we are connecting to a known road */ end_point = editor_track_util_new_road_end (&TrackConfirmedLine, track_point_pos (end_point), end_point, TrackConfirmedStreet.line_direction, &end_node); if (end_node.plugin_id == ROADMAP_PLUGIN_ID) { end_node.id = editor_track_util_roadmap_node_to_editor (&end_node); end_node.plugin_id = EditorPluginID; } end_node_id = end_node.id; } if ((i < (count -1)) || (start_point != (end_point -1))) { int line_id = create_new_line (start_point, end_point, -1, end_node_id, ROADMAP_ROAD_STREET); if ((line_id != -1) && ((type == TRACK_ROAD_CONNECTION) || !EditorAllowNewRoads)) { editor_line_set_flag (line_id, ED_LINE_CONNECTION); } } start_point = end_point; } track_reset_points (start_point); }