예제 #1
0
/* 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;
}
예제 #3
0
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);
}