1072 Gas Station (30 point(s))

本文介绍了一个基于Dijkstra算法的解决方案,用于确定城市中最佳的加油站位置。目标是最小化住宅区与加油站之间的平均距离,同时确保所有住宅都在服务范围内。通过遍历候选地点并应用Dijkstra算法,该方案能够找到满足条件的最优解。

1072 Gas Station (30 point(s))

A gas station has to be built at such a location that the minimum distance between the station and any of the residential housing is as far away as possible. However it must guarantee that all the houses are in its service range.

Now given the map of the city and several candidate locations for the gas station, you are supposed to give the best recommendation. If there are more than one solution, output the one with the smallest average distance to all the houses. If such a solution is still not unique, output the one with the smallest index number.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 positive integers: N (≤10​3​​), the total number of houses; M (≤10), the total number of the candidate locations for the gas stations; K (≤10​4​​), the number of roads connecting the houses and the gas stations; and D​S​​, the maximum service range of the gas station. It is hence assumed that all the houses are numbered from 1 to N, and all the candidate locations are numbered from G1 to GM.

Then K lines follow, each describes a road in the format

P1 P2 Dist

where P1 and P2 are the two ends of a road which can be either house numbers or gas station numbers, and Dist is the integer length of the road.

Output Specification:

For each test case, print in the first line the index number of the best location. In the next line, print the minimum and the average distances between the solution and all the houses. The numbers in a line must be separated by a space and be accurate up to 1 decimal place. If the solution does not exist, simply output No Solution.

Sample Input 1:

4 3 11 5
1 2 2
1 4 2
1 G1 4
1 G2 3
2 3 2
2 G2 1
3 4 2
3 G3 2
4 G1 3
G2 G1 1
G3 G2 2

Sample Output 1:

G1
2.0 3.3

Sample Input 2:

2 1 2 10
1 G1 9
2 G1 20

Sample Output 2:

No Solution

Dijkstra的应用。暴力求解,对每个G结点用Dijkstra()求解,每一次的结果按照题设要求判断。优先级如下:

1. 所有居民点在DS范围内;

2. 在满足1的条件下,优先选择最大的nearest(最大化各居民点到加油站的最小距离);

3. 若2不唯一,优先选择总距离(同理平均距离)最小的;

4. 若3不唯一,优先选择标号最小的(由于我们是按照顺序遍历的,若3不唯一不作任何更新即可)。

调试过程中一些几位无语的错误:

1. 寻找新的结点for循环中,把<=写成<;

2. 判断total和bestTotal的时候,符号写反!

这些错误虽然都不是思路上的,但是在考试中相当致命啊!本题编码时间20分钟,调试时间可能达到了2小时!

发现:题目保证了所有结点之间连通。

#include<iostream>
#include<vector>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int MAX = 1017;
int N,M,K,DS;//houses stations roads 
int string2int(string s){
	//1 to N G1 to GM
	bool isStation =false;
	if(s[0]=='G'){
		s.erase(s.begin());
		isStation=true;
	}
	int ans = 0;
	for(int i=0;i<s.length();i++){
		ans = ans*10+s[i]-'0';
	}
	if(isStation) ans+=N;
	return ans;
}
struct Edge{
	int next;int weight;
	Edge(int n,int w):next(n),weight(w){ }
};
vector<Edge> graph[MAX];
bool visit[MAX];
int dis[MAX]; 
int main(void){
	cin>>N>>M>>K>>DS;
	string a,b;int dest;
	while(K--){
		cin>>a>>b>>dest;
		int p1 = string2int(a);
		int p2 = string2int(b); 
		graph[p1].push_back(Edge{p2,dest});
		graph[p2].push_back(Edge{p1,dest});
	}
	int bestStation = -1;int bestBound = 0;int bestTotal = INF;
	for(int k=N+1;k<=N+M;k++){//从k出发
		int newP = k;
		memset(dis,-1,sizeof(dis));
		memset(visit,false,sizeof(visit)); 
		dis[newP]=0;
		visit[newP]=true;
		int cnt=0;
		while(cnt<N)
		//for(int p=1;p<M+N;p++)
		{
			for(int i=0;i<graph[newP].size();i++){
				int cur = graph[newP][i].next;
				int w = graph[newP][i].weight;
				if(visit[cur]) continue;
				if(dis[cur]==-1||dis[newP]+w<dis[cur]){
					dis[cur]=w+dis[newP];
				}
			}
			int min = INF;
			for(int i=1;i<=N+M;i++){
				if(visit[i]) continue;
				if(dis[i]==-1) continue;
				if(dis[i]<min){
					min = dis[i];
					newP = i;
				}
			}
			visit[newP] = true;
			if(newP>=1&&newP<=N) cnt++;
		}
		int nearest = INF;int total=0;
		bool isOK = true;
		for(int i=1;i<=N;i++){
			if(dis[i]>DS){
				isOK = false;
				break;
			}
			nearest = min(nearest,dis[i]);
			total+=dis[i];
		}
		if(isOK){
			if(nearest>bestBound){
				bestStation = k;
				bestBound = nearest;
				bestTotal = total;
			}else if(nearest==bestBound&&total<bestTotal){
				bestStation = k;
				bestTotal = total;
			}
		}
	}
	if(bestStation==-1) cout<<"No Solution"<<endl;
	else{
		printf("G%d\n",bestStation-N);
		printf("%.1f %.1f\n",double(bestBound),double(bestTotal)/double(N));
	}
	return 0;
}

 

syntax = "proto2"; import "modules/msg/basic_msgs/header.proto"; import "modules/msg/basic_msgs/geometry.proto"; package byd.msg.orin.routing_map; message EnvStatus { enum MapSuppressionReason { NOT_SUPPRESSION = 0; CLOSE_TO_HIGH_LEVEL_ROAD = 1; NO_NAVIGATION_START_SECTION = 2; NO_HD_MAP_FRAME = 3; EGO_IS_CHANGING_LANE = 11; EGO_PASSED_JUNCTION = 12; EGO_IN_JUNCTION = 13; EGO_NOT_CLOSE_ENOUGH_TO_JUNCTION = 14; EGO_OUTSIDE_MAP = 15; EGO_NOT_IN_THE_RAMP = 16; EGO_IN_THE_RAMP = 17; UNABLE_TO_MATCH_PERCEPTION_WITH_HD_MAP = 31; UNKNOWN_REASON = 101; } enum EnvSource { UNDEFINED = 0; PERCEPTION_MAP = 1; HD_MAP = 2; BYD_CROWD_SOURCED_MAP = 3; } message LineMatchInfo { optional double average_offset = 1; optional double max_offset = 2; } optional bool is_on_freeway = 1; optional EnvSource map_source = 2; optional MapSuppressionReason hd_map_suppression_reason = 3; optional MapSuppressionReason perception_map_suppression_reason = 4; optional double distance_to_next_junction = 5; optional double distance_to_passed_junction = 6; optional LineMatchInfo left_laneline_match_info = 7; optional LineMatchInfo right_laneline_match_info = 8; } message MapInfo { enum CoordSys { WGS84 = 0; GCJ02 = 1; RFU = 2; FLU = 3; } optional CoordSys coord_sys = 1; optional string map_version = 2; optional string engine_version = 3; optional string sdmap_version = 4; optional EnvStatus env_status = 5; } enum LightStatus { NONE_LIGHT = 0; //无信号灯 GREEN_LIGHT = 1; YELLOW_LIGHT = 2; RED_LIGHT = 3; UNKNOWN_LIGHT = 4; //有信号灯状态未知 YELLOW_BLINKING = 5; FAIL_DETECTION = 6; BLOCK_FAIL = 7; GREEN_BLINKING = 8; BLURRING_MODE = 9; } enum NoneOddType { NODD_NONE = 0; NORMAL_NOT_ODD = 1; NODD_LOW_PRECISION = 22; NODD_LANE_BOUNDARY_CHANGE = 100; NODD_LANE_BOUNDARY_LOSS_WIDTH_ABNORMAL = 101; NODD_LANE_NUM_INCREASE = 102; NODD_LANE_NUM_DECREASE = 103; NODD_LANE_TYPE_CHANGE = 104; NODD_CONSTRUCTION_OPPOSITE_DIR_BORROW_WAY_NOT_DEGRADATION = 105; NODD_CONSTRUCTION_OPPOSITE_DIR_BORROW_WAY_DEGRADATION = 106; NODD_CONSTRUCTION_SAME_DIR_CHANGE_WAY_NOT_DEGRADATION = 107; NODD_CONSTRUCTION_SAME_DIR_CHANGE_WAY_DEGRADATION = 108; NODD_CONSTRUCTION_CLOSE_WAY = 109; NODD_CONSTRUCTION_CLOSE_WAY_TO_NOT_HIGHWAY_DEGRADATION = 110; NODD_RAMP_INCREASE = 111; NODD_TRAFFIC_CONE = 112; NODD_WATER_SAFETY_BARRIER = 113; NODD_UNKNOWN = 255; } enum PointSource { PS_UNKNOWN = 0; PS_BEV = 1; // 感知形点 TOPO_INSETRT = 2; // 拓扑插值点 SECTION_EXTENTED_FROM_LANEMARKER = 3; // lane使用lanemarker补齐 SECTION_EXTENTED_FROM_FIT = 4; // lane lanemarker使用自身点拟合重采样补齐 SECTION_EXTENTED_FROM_LANE = 5; // lanemarker使用lane点补齐 PS_HDMAP = 6; // 地图形点 PS_INVISIBLE = 7; // 感知不可见点 } message Point { optional double x = 1; optional double y = 2; optional double z = 3; optional double curvature = 4; optional PointSource point_source = 5; optional double mse = 6; // set value when BEV Map used } message Trajectory{ optional uint64 id = 1; optional uint64 lane_id = 2; optional uint64 start_lane_id = 3; optional uint64 end_lane_id = 4; repeated uint64 relative_lane_id = 5; repeated Point points = 6; } message LaneInfo { enum LaneType { LANE_UNKNOWN = 0; LANE_NORMAL = 1; LANE_ACC = 2; LANE_DEC = 3; LANE_RAMP = 4; LANE_EMERGENCY = 5; LANE_ACC_DCC = 6; LANE_BUS_NORMAL = 7; // 公交停靠站 LANE_HOV_NORMAL = 8; LANE_NON_MOTOR = 9; LANE_LEFT_WAIT = 10; LANE_VIRTUAL_COMMON = 11; LANE_VIRTUAL_JUNCTION = 12; LANE_ROUND_ABOUT = 13; LANE_REVERSIBLE = 16; LANE_VARIABLE_TURN = 17; LANE_HARBOR_STOP = 18; // 港湾停靠站 LANE_ENTRY = 19; // 入口 LANE_EXIT = 20; // 出口 LANE_DIVERSION = 21; // 导流区车道 LANE_U_TURN_LANE = 22; // 掉头车道 LANE_RIGHT_TURN_LANE = 23; // 右转专用车道 LANE_RIGHT_TURN_AREA = 24; // 右转等待车道 LANE_U_TURN_AREA = 25; // 掉头等待车道 LANE_NO_TURN_AREA = 26; // 直行等待车道 LANE_VIRTUAL_CONNECTED_LANE = 27; // 虚拟连接车道 LANE_PARKING = 28; // 停车车道 LANE_TOLLBOOTH = 29; // 收费站车道 LANE_OBSTACLE = 30; // 障碍物 LANE_MIXED_TOLL = 31; // 混合收费车道 LANE_REVERSIBLE_CONNECTION_LANE = 32; //潮汐连接路 LANE_ENTRANCE_OR_EXIT_LANE = 33; //主辅路出入口 LANE_LEFT_TURN_LANE = 34; //左转专用道 LANE_CHECKPOINT_LANE = 35; //检查站车道 LANE_USE_THE_LEFT_TURN_LANE = 36; //借道左转车道 LANE_BRT = 37; //公交专用道 } enum TurnType { NO_TURN = 0; LEFT_TURN = 1; RIGHT_TURN = 2; U_TURN = 3; STRAIGHT_AND_LEFT_TURN = 4; STRAIGHT_AND_RIGHT_TURN = 5; STRAIGHT_AND_U_TURN = 6; LEFT_TURN_AND_U_TURN = 7; RIGHT_TURN_AND_U_TURN = 8; STRAIGHT_AND_LEFT_TURN_AND_RIGHT_TURN = 9; LEFT_TURN_AND_RIGHT_TURN = 10; STRAIGHT_AND_LEFT_TURN_AND_U_TURN = 11; STRAIGHT_AND_RIGHT_TURN_AND_U_TURN = 12; LEFT_TURN_AND_RIGHT_TURN_AND_U_TURN = 13; STRAIGHT_AND_LEFT_AND_RIGHT_AND_U_TURN = 14; OTHER_UNKNOWN = 9999; } enum SplitTopology { TOPOLOGY_SPLIT_NONE = 0; TOPOLOGY_SPLIT_LEFT = 1; // split to left TOPOLOGY_SPLIT_RIGHT = 2; // split to right TOPOLOGY_SPLIT_UNKNOWN = 3; } enum MergeTopology { TOPOLOGY_MERGE_NONE = 0; TOPOLOGY_MERGE_LEFT = 1; // merge to left, ego is on right of target lane TOPOLOGY_MERGE_RIGHT = 2; // merge to right, ego is on left of target lane TOPOLOGY_TO_BE_MERGED = 3; TOPOLOGY_MERGE_UNKNOWN = 4; } enum MergeSource { MERGE_UNKNOWN = 0; MERGE_BEV = 1; MERGE_LD = 2; MERGE_SD = 3; } enum TrafficSetReason{ UNKNOWN_STATE = 0; STAY_PREV = 1; SET_DEFAULT_OBJ = 2; NEW_ARROW_LIGHT = 3; NEW_CIRCLE_LIGHT = 4; NEW_UNKNOWN_GREEN = 5; NEW_UNKNOWN_OTHER = 6; NEW_BLURRING_COLOR = 7; NEW_BLURRING_SHAPE = 8; } message MergeInfo { optional bool merge_valid = 1; optional MergeSource merge_source = 2; optional double dis_to_merge = 3; }; optional uint64 id = 1; optional uint64 section_id = 2; optional uint64 junction_id = 3; optional uint64 left_lane_id = 4; optional uint64 right_lane_id = 5; repeated uint64 next_lane_ids = 6; repeated uint64 left_lane_boundary_ids = 7; repeated uint64 right_lane_boundary_ids = 8; repeated uint64 left_road_boundary_ids = 9; repeated uint64 right_road_boundary_ids = 10; optional LaneType type = 11; optional NoneOddType none_odd_type = 12; optional TurnType turn_type = 13; // vaild in city region optional LightStatus light_status = 14; optional SplitTopology split_topology = 15; optional MergeTopology merge_topology = 16; repeated Point points = 17; // hasn't supported lane level curvature yet optional double length = 18; optional double speed_limit = 19; // uint: m/s optional bool is_virtual = 20; repeated uint64 cross_walks = 21; repeated uint64 traffic_stop_lines = 22; optional uint32 light_countdown = 23; repeated uint64 previous_lane_ids = 24; optional MergeInfo merge_info = 25; optional uint32 connect_score = 26; // score of classification as normal and split, ranging from 0 to 100 optional TurnType plan_turn_type = 27; optional bool is_blocked = 28; optional uint32 traffic_light_obj_id = 29; optional uint32 traffic_light_seq_num = 30; optional TrafficSetReason traffic_set_reason = 31; optional uint32 stay_prev_counter = 32; repeated uint64 exp_trajectory_ids = 33; optional bool cnoa_is_virtual = 34; // same as cnoa map is_virtual value, add to solve problem form SR optional uint32 lane_seq = 35; //车道序号,从左到右从1开始递增 optional uint32 stopline_angle_flag = 36; } message LaneBoundaryInfo { enum LineType { UNKNOWN = 0; SOLID = 1; DASHED = 2; SOLID_SOLID = 3; DASHED_DASHED = 4; SOLID_DASHED = 5; DASHED_SOLID = 6; VIRTUAL_LANE = 7; OTHERS = 9999; } enum LaneMarkerColor { LM_COLOR_UNKNOWN = 0; LM_COLOR_WHITE = 1; LM_COLOR_YELLOW = 2; LM_COLOR_BLUE = 3; LM_COLOR_GREEN = 4; LM_COLOR_RED = 5; } message ColorSegment { optional LaneMarkerColor color = 1; optional uint32 start_index = 2; optional uint32 end_index = 3; }; message TypeSegment { optional LineType type = 1; optional uint32 start_index = 2; optional uint32 end_index = 3; }; optional uint64 id = 1; repeated byd.msg.basic.Point2D points = 2; optional LineType line_type = 3; repeated ColorSegment color_seg = 4; repeated TypeSegment type_seg = 5; repeated Point line_points = 6; } message RoadBoundaryInfo { enum BoundaryType { UNKNOWN_BOUNDARY = 0; FLAT_BOUNDARY = 1; LOW_BOUNDARY = 2; HIGH_BOUNDARY = 3; FENCE_BOUNDARY = 4; VIRTUAL = 12; } optional uint64 id = 1; repeated byd.msg.basic.Point2D points = 2; optional BoundaryType boundary_type = 3; repeated Point line_points = 4; } message JunctionInfo { optional uint64 id = 1; repeated byd.msg.basic.Point2D points = 2; } message CrossWalkInfo { optional uint64 id = 1; repeated byd.msg.basic.Point2D points = 2; } message StopLineInfo { optional uint64 id = 1; repeated byd.msg.basic.Point2D points = 2; optional uint32 type = 3; //type: 0 - real stopline, 1 - virtual stopline } message TrafficLightInfo { optional uint64 id = 1; optional byd.msg.basic.Point3D center_position = 2; repeated byd.msg.basic.Point3D bounding_box_geometry = 3; repeated uint64 laneids = 4; optional uint32 light_countdown = 5; optional uint32 shape = 6; optional LightStatus light_status = 7; } message NaviPosition { optional uint64 section_id = 1; optional double s_offset = 2; //uint: m } message SectionInfo { enum LDLinkTypeMask { LT_NORMAL = 0; // 0X00000000, // 普通 LT_TUNNEL = 1; // 0X00000001, // 隧道 LT_BRIDGE = 2; // 0X00000002, // 桥 LT_TOLLBOOTH = 4; // 0X00000004, // 收费站道路 LT_DEAD_END = 8; // 0X00000008, // 断头路 LT_IC = 16; // 0X00000010, // IC(高速连接普通路的道路) LT_JCT = 32; // 0X00000020, // JCT(高速连接高速的道路) LT_SAPA = 64; // 0X00000040, // SAPA(服务器、停车区道路) LT_WITHIN_INTERSECTION = 128; // 0X00000080, // 路口内道路 LT_AUTHORIZED = 256; // 0X00000100, // 授权道路 LT_TOLLGATE = 512; // 0X00000200, // 收费岛道路 LT_ABANDONED_TOLLGATE = 1024;// 0X00000400, // 废弃收费岛道路 LT_CHECKPOINT = 2048;// 0X00000800, // 检查站道路 LT_ROUNDABOUT = 4096;// 0X00001000, // 环岛内道路 LT_SERRATED = 8192;// 0X00002000, // 锯齿道路 LT_MAIN_ROAD = 16384;// 0X00004000, // 主路(main road) LT_SIDE_ROAD = 32768; // 0X00008000, // 辅路(side road) LT_MAINROAD_CONNECTION = 65536;// 0X00010000, // 主辅路连接路(mainside connection) LT_NO_S_INTERSECTION = 131072;// 0X00020000, // 无小路口 LT_S_INTERSECTION_LEFT = 262144;// 0X00040000, // 小路口左侧道路 LT_S_INTERSECTION_RIGHT= 524288;//0X00080000, // 小路口右侧道路 LT_S_INTERSECTION_BOTH = 1048576; //0X00100000, // 小路口两侧道路 LT_INJUNCTION = 2097152; //0X00200000, // 路口内道路(编译计算) LT_BOOTH_EXIT = 4194304;//0X00400000, // 出口收费站 LT_BOOTH_ENTRANCE = 8388608;//0X00800000, // 入口收费站 LT_BOOTH_EXIT_ENTRANCE = 16777216;//0X01000000 // 出入口收费站 } optional uint64 id = 1; optional double length = 2; //uint: m repeated uint64 lane_ids = 3; repeated Point points = 4; optional RoadClass road_class = 5; repeated uint64 predecessor_section_id_list = 6; repeated uint64 successor_section_id_list = 7; optional uint32 link_type = 8; //复合类型,与LdLinkTypeMask“按位与”操作判断。 } message ArrowInfo { enum ArrowType { RM_TYPE_STRAIGHT = 1; RM_TYPE_LEFT = 2; RM_TYPE_RIGHT = 3; RM_TYPE_TURNING = 4; RM_TYPE_STRAIGHT_LEFT = 5; RM_TYPE_STRAIGHT_RIGHT = 6; RM_TYPE_STRAIGHT_LEFT_RIGHT = 7; RM_TYPE_LEFT_RIGHT = 8; RM_TYPE_STRAIGHT_TURNING = 9; RM_TYPE_LEFT_TURNING = 10; } optional uint64 id = 1; optional ArrowType type = 2; optional byd.msg.basic.Point3D center_position = 3; repeated byd.msg.basic.Point3D bounding_box_geometry = 4; repeated uint64 lane_id = 5; } message SubPath { optional uint64 enter_section_id = 1; repeated SectionInfo sections = 2; } message RouteInfo { optional uint64 id = 1; optional NaviPosition navi_start = 2; //from currrent section repeated SectionInfo sections = 3; repeated SubPath subpaths = 4; optional string route_id = 5; //ld导航路径的md5值 } enum RoadClass { UNKNOWN = 0; EXPRESSWAY = 1; URBAN_EXPRESSWAY = 2; NATION_ROAD = 3; PROVINCE_ROAD = 4; COUNTRY_ROAD = 6; TOWN_ROAD = 7; SPECIAL_ROAD = 8; // 特服道路 WALK_ROAD = 9; PEOPLE_FERRY = 10; // 人渡 FERRY = 11; // 轮渡 OTHERS = 99; } enum V2RoadClassType { UNKNOWN_ROAD = 0; HIGH_WAY_ROAD = 1; EXPRESS_WAY_ROAD = 2; NATIOANL_ROAD = 3; PROVINCIAL_ROAD = 4; MAIN_ROAD = 5; SUB_ROAD = 6; } enum SDRoadClass { SD_HIGHWAY = 0; SD_CITY_FAST_WAY = 1; SD_NATIONAL_ROAD = 2; SD_PROVINCIAL_ROAD = 3; SD_COUNTY_ROAD = 4; SD_TOWNSHIP_ROAD = 5; SD_OTHER_ROAD = 6; SD_LEVEL_9_ROAD = 7; SD_FERRY = 8; SD_WALY_WAY = 9; SD_INVALID = 127; } message V2RoadClass { optional double start = 1; optional double end = 2; optional V2RoadClassType road_class = 3; } message V2RoadInfo { optional V2RoadClassType road_class = 1; optional int32 lane_num = 2; } message V2TurnInfo { optional uint64 id = 1; optional bool is_valid = 2; enum V2TurnType { UNKNOWN = 0; LEFT = 1; RIGHT = 2; STRAIGHT = 3; U_TURN_LEFT = 4; U_TURN_RIGHT = 5; MERGE_LEFT = 6; MERGE_RIGHT = 7; RAMP_LEFT = 11; RAMP_RIGHT = 12; RAMP_STRAIGHT = 13; RAMP_U_TURN_LEFT = 14; RAMP_U_TURN_RIGHT = 15; } optional V2TurnType turn_type = 3; enum V2DetailTurnType { NONE = 0; TURN_LEFT = 2; // 左转图标 TURN_RIGHT = 3; // 右转图标 SLIGHT_LEFT = 4; // 左前方图标 SLIGHT_RIGHT = 5; // 右前方图标 TURN_HARD_LEFT = 6; // 左后方图标 TURN_HARD_RIGHT = 7; // 右后方图标 UTURN = 8; // 左转掉头图标 (无在线图标) CONTINUE = 9; // 直行图标 TURN_RIGHT_ONLY = 10; // 右转专用道 UTURN_RIGHT = 19; // 右转掉头图标,左侧通行地区的掉头 LEFT_MERGE = 65; // 靠左图标 RIGHT_MERGE = 66; // 靠右图标 } optional V2DetailTurnType detail_turn_type = 4; optional double dist = 5; optional V2RoadInfo before_turn = 6; optional V2RoadInfo after_turn = 7; optional double v2_dist = 8; // V2提供的距离,新增加 } message NonODDInfo { optional string id = 1; optional uint64 reason = 2; optional double dist = 3; } message V2Curvature { optional double curvature = 1; // 曲率半径 optional double distance = 2; // 距离 } message V2TrafficFlow { optional double start_s = 1; optional double end_s = 2; enum V2TrafficFlowType { UNKNOWN_FLOW = 0; SMOOTH_FLOW = 1; SLOW_FLOW = 2; JAMMED_FLOW = 3; SEVERE_JAMMED_FLOW = 4; NO_FLOW = 5; } optional V2TrafficFlowType type = 3; } message EnvInfo { optional bool v2_valid = 1; optional bool v2_has_navigation = 2; optional double v2_dist_to_ramp = 3; optional double v2_dist_to_toll = 4; optional double v2_dist_to_tunnel = 5; repeated V2RoadClass v2_road_classes = 6; repeated V2TurnInfo v2_turn_info = 7; optional double dist_to_subpath = 8; optional double dist_to_split_routelanenum_dec = 9; repeated V2TrafficFlow traffic_flows = 10; repeated V2Curvature v2_curvatures = 11; repeated NonODDInfo v2_non_odd_info = 12; } message SDSectionInfo { enum SDLinkTypeMask { SDLT_INVALID = 0; SDLT_RING = 1; //环岛 0X00000001 SDLT_NOATTR = 2; //无属性 0X00000002 SDLT_MAINSEPARATE = 4; //上下行分离 0X00000004 SDLT_JCT = 8; //JCT 0X00000008 SDLT_CROSSLINK = 16; //交叉点内LINK 0X00000010 SDLT_IC = 32; //IC 0X00000020 SDLT_PARK = 64; //停车区 0X00000040 SDLT_SERVICE = 128; //服务区 0X00000080 SDLT_BRIDGE = 256; //桥 0X00000100 SDLT_WALKSTREET = 512; //步行街 0X00000200 SDLT_SIDEROAD = 1024; //辅路 0X00000400 SDLT_RAMP = 2048; //匝道 0X00000800 SDLT_CLOSEDROAD = 4096; //全封闭道路 0X00001000 SDLT_UNDEFINEDTRAFFICAREA = 8192; //未定义交通区域 0X00002000 SDLT_POICONNECTION = 16384; //连接路 0X00004000 SDLT_TUNNEL = 32768; //隧道 0X00008000 SDLT_RA_FOOTWAY = 65536; //步行道 0X00010000 SDLT_BUS = 131072; //公交专用道 0X00020000 SDLT_RIGHTTURN = 262144; //提前右转 0X00040000 SDLT_SCENICROAD = 524288; //风景线路 0X00080000 SDLT_INAREAROAD = 1048576; //区域内道路 0X00100000 SDLT_LEFTTURN = 2097152; //提前左转 0X00200000 SDLT_UTURN = 4194304; //掉头口 0X00400000 SDLT_MAINSIDECONNECT = 8388608; //主辅路出入口 0X00800000 SDLT_DUMMYLINK = 16777216; //虚拟链接路 0X01000000 SDLT_PARKLINK = 33554432; //停车位引导路 0X02000000 } enum SDDirectionType { UNKNOWN = 0; //未知 BIDIRECTIONAL_PASSABLE = 1; //双向可通行 FORWARD_ONLY = 2; //仅正向通行 REVERSE_ONLY = 3; //仅反向通行 INVALID = 4; //无效 } enum SDLinkTypeExtendMask { SDLTE_INVALID = 0; // = 0X00000000 /**< 0X00,无效值 */ SDLTE_PARKING_ENUUTRANCE = 1; // = 0X00000001, /*停车场出入口连接路 */ SDLTE_GAS_STATION_ENUUTRANCE = 2; // = 0X00000002, /*通往加油站的连接路 */ SDLTE_ESCAPE_LANE = 4; // = 0X00000004, /*避险车道 */ SDLTE_TRUCK_LANE = 8; // = 0X00000008, /*货车专用*/ SDLTE_NOTROUNDABOUT = 16; // = 0X00000010, /*非标环岛 */ SDLTE_FRONT_ROAD = 32; // = 0X00000020, /*门前路段*/ SDLTE_FOOTBRIDGE = 64; // = 0X00000040, /*跨线天桥*/ SDLTE_TUNNEL = 128; // = 0X00000080, /*跨线地道 */ SDLTE_FLYOVER = 256; // = 0X00000100, /*立交桥*/ SDLTE_TAXILANE = 512; // = 0X00000200, /*出租车专用道*/ SDLTE_PASSENGERCARLANE = 1024; // = 0X00000400, /*客运车专用道*/ SDLTE_PANSHANROAD = 2048; // = 0X00000800, /*盘山路*/ } optional uint64 id = 1; optional double length = 2; //uint: m optional uint64 lane_num = 3; repeated Point points = 4; optional SDRoadClass road_class = 5; repeated uint64 predecessor_section_id_list = 6; repeated uint64 successor_section_id_list = 7; optional uint32 link_type = 8; //与SDLinkTypeMask按位与判断 optional double speed_limit = 9; // uint: m/s optional bool has_toll_station = 10; optional SDDirectionType direction = 11; optional uint32 reverse_lane_count = 12; optional double exp_speed = 13; repeated SDLaneGroupIndex lane_group_idx = 14; optional bool has_junction = 15; optional uint32 link_type_extend = 16; //link的扩展类型,与SDLinkTypeExtendMask按位与判断 } message SDSubPath{ enum PathType { NONE = 0; SPLIT = 2; MERGE = 3; } optional uint64 enter_section_id = 1; // 汇入时为汇入主路的link, 汇出时为汇出主路的link repeated SDSectionInfo sections = 2; optional PathType path_type = 3; } message SDLaneGroupIndex { optional uint64 id = 1; optional double start_range_offset = 2; //uint: m optional double end_range_offset = 3; } message SDRecommendLaneGroup { optional uint64 lane_group_id = 1; repeated SDRecommendLGSegment recommend_lane = 2; //推荐区域车道 repeated SDRecommendLGSegment available_lane= 3; //可通行区域 } message SDRouteInfo { optional string id = 1; optional NaviPosition navi_start = 2; //from currrent section repeated SDSectionInfo mpp_sections = 3; repeated SDSubPath subpaths = 4; repeated SDRecommendLaneGroup recommend_lane_list = 5; //导航推荐车道 repeated uint64 mpp_lanegroup_id_list = 6; //lane_group级别的mpp id列表 } message SDRecommendLGSegment{ optional uint32 start_offset = 1; //车道组开始的位置(相对于langroup起点的距离,单位:m) optional uint32 end_offset = 2; //车道组结束的位置(相对于langroup起点的距离,单位:m) repeated uint32 lane_seqs = 3; //车道序号 optional uint32 lane_num = 4; //车道数 } message SDLaneGroupInfo { optional uint64 id = 1; optional double length = 2; //uint: m repeated uint64 successor_lane_group_ids = 3; repeated uint64 predecessor_lane_group_ids = 4; optional uint32 lane_num = 5; repeated LaneInfo lane_info = 6; repeated SDRecommendLGSegment recommend_lane = 7; //推荐区域车道 repeated SDRecommendLGSegment available_lane= 8; //可通行区域 } enum SpeedLimitMode{ passive_mode = 0x0; fusion_mode = 0x1; map_mode = 0x2; vision_mode = 0x3; } enum NormalSpeedStatus{ NORMAL = 0x0; UNKNOWN_LIMIT_SPEED = 0x1; UNLIMITED = 0x2; SPL_CANCELLED = 0x3; NO_DISPLAY = 0x4; } enum UnknownLimitStatus{ INVALID = 0x0; VALID = 0x1; UNCLEAR = 0x2; PRESERVE = 0x3; } enum ConditionType{ UNSPECIFIED = 0; TIME_CONDITION = 1; RAIN_CONDITION = 2; SNOW_CONDITION = 3; } message ConditionLimit{ optional float condition_limit_speed_value = 1; optional uint32 condition_type = 2; } message FusionSpeedInfo{ optional basic.Header header = 1; optional float speed_value = 2; optional uint32 normal_speed_status = 3; optional uint32 unknown_limit_status = 4; optional uint32 speed_limit_mode = 5; optional bool time_condition = 6; optional bool snow_condition = 7; optional bool rain_condition = 8; optional bool distance_condition = 9; repeated ConditionLimit condition_limit = 10; } message SensorStatusInfo{ optional uint32 sensor_status = 1; optional uint64 special_type = 2; } message RoutingMap { enum MapType { UNKOWN_MAP = 0; PERCEPTION_MAP = 1; HD_MAP = 2; BEV_MAP = 3; } optional basic.Header header = 1; optional MapInfo map_info = 2; optional MapType map_type = 3; repeated LaneInfo lanes = 4; repeated LaneBoundaryInfo lane_boundaries = 5; repeated RoadBoundaryInfo road_boundaries = 6; repeated StopLineInfo stop_lines = 7; repeated JunctionInfo junctions = 8; repeated CrossWalkInfo cross_walks = 9; optional RouteInfo route = 10; optional RoadClass cur_road_class = 11; repeated TrafficLightInfo traffic_lights = 12; repeated ArrowInfo arrows = 13; optional bool is_on_highway = 14; repeated byd.msg.basic.Point2D nodes = 15; optional EnvInfo env_info = 16; optional SDRouteInfo sd_route = 17; repeated SDLaneGroupInfo sd_lane_groups = 18; optional FusionSpeedInfo fusionSpeedInfo = 19; optional string debug_info = 20; repeated Trajectory exp_trajectories = 21; optional SensorStatusInfo sensor_status_info = 22; optional TrafficLightStatus traffic_light_uturn = 23; // for env auto_test optional TrafficLightStatus traffic_light_left = 24; // for env auto_test optional TrafficLightStatus traffic_light_straight = 25; // for env auto_test optional TrafficLightStatus traffic_light_right = 26; // for env auto_test } message TrafficLightStatus { optional LightStatus light_status = 1; // 红绿灯颜色 optional LaneInfo.TurnType turn_type = 2; // 红绿灯的转向类型 repeated byd.msg.basic.Point2D stop_line_pts = 3; // 应该在红绿灯前停车的线的位置 optional uint32 traffic_light_num = 4; // 红绿灯倒计时 repeated uint32 lane_ids = 5; // 红绿灯状态对应的lane id optional bool is_navi_light = 6; optional uint64 traffic_obj_id = 7; optional uint64 perception_sequence = 8; optional uint64 stay_prev_counter = 9; optional uint64 invalid_counter = 10; optional LaneInfo.TrafficSetReason traffic_reason = 11; repeated byd.msg.basic.Point2D stop_line_pts_wait = 12; // 应该在红绿灯前停车的线的位置 optional bool stopline_is_virtual = 13; optional double distance_to_stopline = 14; optional bool traffic_match_cloud_file = 15; }; message TrafficLightsE2EInfo { optional basic.Header header = 1; // 里面有seq信息,lane_ids是对应seq地图里面的 repeated TrafficLightStatus traffic_status = 2; // 所有红绿灯状态 optional byd.msg.basic.Point3D pose = 3; // 红绿灯位置 optional TrafficLightStatus traffic_light_uturn = 4; // for env auto_test optional TrafficLightStatus traffic_light_left = 5; // for env auto_test optional TrafficLightStatus traffic_light_straight = 6; // for env auto_test optional TrafficLightStatus traffic_light_right = 7; // for env auto_test repeated TrafficLightInfo traffic_lights = 8; }; 详细解释下接口proto
09-04
<template> <div class="mapcontainer" > <Map :center="props.config.centerPoint" :url="configUrl" @onload="onMapload" /> <div class="flex-row center markerCheck"> <el-checkbox-group v-model="checkList" @change="typeChange"> <el-checkbox v-for="(item,index) in points" :label="item.value"> <div class="flex-row"> {{item.label}} <img :src="item.icon" class="check-icon"></img> </div> </el-checkbox> </el-checkbox-group> </div> </div> </template> <script setup> import { ref,nextTick ,watch} from 'vue' import Map from "./map.vue"; import { useRoute } from "vue-router"; import changzhan from '@/assets/images/cockpit/gismap/changzhan.png' import genzong from '@/assets/images/cockpit/gismap/genzong.png' import kehu from '@/assets/images/cockpit/gismap/kehu.png' import qiye from '@/assets/images/cockpit/gismap/qiye.png' import sanfang from '@/assets/images/cockpit/gismap/sanfang.png' import shebei from '@/assets/images/cockpit/gismap/shebei.png' import weixianyuan from '@/assets/images/cockpit/gismap/weixianyuan.png' import yingji from '@/assets/images/cockpit/gismap/yingji.png' import yinhuan from '@/assets/images/cockpit/gismap/yinhuan.png' import yuangong from '@/assets/images/cockpit/gismap/yuangong.png' import guanwang from '@/assets/images/cockpit/gismap/guanwang.png' import { allColoums } from './colums.js' const route = useRoute(); import { conmonGet } from '@/api/cockpit/mapCenter.ts' // 取随机数字 function random(min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } var gisMap = null const isLoading = ref(false) let gwparams = { service: 'WFS', version: '1.1.0', request: 'GetFeature', typeName: 'ne:cloud_pipe_line_1', startIndex:'0', propertyName: 'shape,conduit_material,conduit_type,conduit_id,section_no,burying_type,section_length,start_burying,end_burying,is_use,pipe_diameter', outputFormat: 'application/json', maxFeatures: '5000', srsName: 'EPSG:4326', cql_filter: 'tenant_id=657123 and conduit_id IS NULL', } let deviceParams = { service: 'WFS', version: '2.0.0', request: 'GetFeature', typeName: 'ne:cloud_device_1', startIndex:'0', propertyName: 'shape,device_name,is_conduit_up,device_code,device_model,device_material,supplier_name,device_addr', outputFormat: 'application/json', maxFeatures: '100000', srsName: 'EPSG:4326', cql_filter: 'tenant_id=657123 and conduit_id IS NULL', } let customerParams = { service: 'WFS', version: '2.0.0', request: 'GetFeature', typeName: 'ne:cloud_device_1',//表名 startIndex:'0', propertyName: 'shape,customer_name,customer_type,telephone,customer_addr,doc_number', outputFormat: 'application/json', maxFeatures: '100000', srsName: 'EPSG:4326', cql_filter: 'tenant_id=657123 and conduit_id IS NULL', } let points = [ {label:'企业',value:'1',source:[],icon:qiye,api:'/home/map/tenant',graphicLayer:null}, {label:'场站',value:'2',source:[],icon:changzhan,api:'/home/map/station',graphicLayer:null}, {label:'管网',tableKey:'pipeTableName',params:gwparams,value:'3',source:[],icon:guanwang,api:'/home/map/pipeLine',graphicLayer:null}, {label:'重大危险源',value:'4',source:[],icon:weixianyuan,api:'/home/map/majorHazard',graphicLayer:null}, {label:'应急事件',value:'5',source:[],icon:yingji,api:'/home/map/event',graphicLayer:null}, {label:'隐患点',value:'6',source:[],icon:yinhuan,api:'/home/map/hidden',graphicLayer:null}, {label:'三方施工',value:'7',source:[],icon:sanfang,api:'/home/map/other',graphicLayer:null}, {label:'客户',tableKey:'customerTableName',params:customerParams,value:'8',source:[],icon:kehu,api:'/home/map/customer',graphicLayer:null}, {label:'设备',tableKey:'deviceTableName',params:deviceParams,value:'9',source:[],icon:shebei,api:'/home/map/device',graphicLayer:null}, {label:'员工',value:'10',source:[],icon:yuangong,api:'',graphicLayer:null}, {label:'隐患跟踪',value:'11',source:[],icon:genzong,api:'/home/map/following',graphicLayer:null}, ] const configUrl = ref("./config/config.json") const checkList = ref(['1','2','3','4','5','6','7','8','9','10','11']) const props = defineProps({ config:{ type:Object, default: ()=>{ } }, defaultShow:{ type:Array, default:()=>[] }, userList:{ type:Array, default:()=>[] } }) // watch(()=>props.defaultShow,()=>{ // checkList.value = props.defaultShow // if(gisMap){ // initPoints() // } // }, {immediate: true,deep:true}) const addPoints = (data)=>{ //let data = points[index] data.source.forEach((item,index2)=>{ let image = data.icon let PointImg = new mars3d.graphic.BillboardPrimitive({ name: item.name, id:item.id, checkValue:data.value, position: [item.point[0], item.point[1],800], style: { //image: require('@/assets/tan/point.png'), image, scale: 0.4, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, clampToGround: true }, // flyTo: index == 0, attr: { remark: item.name } }) data.graphicLayer.addGraphic(PointImg) //this.graphicLayer.addGraphic(PointImg) }) // this.graphicLayer.enabledEvent = true } const rendLines = (list,obj)=>{ // 0:高压 1:次高压 2:中压 3:低压 let colors = ['#E41F15', '#76502A', 'orange', '#2E0ADE'] list && list.forEach(item => { let lineType = +item.properties._conduit_type let color = colors[lineType] let width = lineType == 0 ? 3.0 : 2.0 item.polyline.material = Cesium.Color.fromCssColorString(color) item.polyline.width = width item.showType = 2 }) } const renderDevices = (list,obj) => { list && list.forEach(item => { if (item.billboard) { item.billboard.image = obj.icon item.billboard.width = 26 item.billboard.height = 38 } item.showType = 3 }) } const addData = async (item,data)=>{ let that = this return new Promise((resolve)=>{ Cesium.GeoJsonDataSource.load(data).then(async (dataSource) => { gisMap.dataSources.add(dataSource); item.source = [dataSource]; var entities = dataSource.entities.values; renderDevices(entities,item) resolve() }) }) } const addLine =(item,data,page) => { Cesium.GeoJsonDataSource.load(data).then(async (dataSource) => { item.source.push(dataSource) gisMap.dataSources.add(dataSource); var entities = dataSource.entities.values; rendLines(entities,dataSource) }) } const typeChange = ()=>{ nextTick(()=>{ initPoints() }) } const addDiv = (item,obj)=>{ let coloum = allColoums[item.value] points.forEach(p=>{ if(p.divLayer){ p.graphicLayer.removeGraphic(p.divLayer) } }) let chtml = '' function backValue(c) { if(c.options){ return c.options.find(cc=>cc.value == obj[c.key]).label }else{ return obj[c.key] } } function mackColoum(coloums){ coloums.forEach(c=>{ if(!c.splitKey){ chtml += ` <div>${c.label}:${backValue(c)}</div>` }else{ let value = obj[c.splitKey] mackColoum(c.coloum[value]) } }) } mackColoum(coloum) // return let html = `<div class="masker-pannel"> <div class="pannel-top"> 详情 </div> <div class="pannel-body f12 c_fff"> ${chtml} </div> </div>` let position = [obj.lng, obj.lat, 76.4] item.divLayer = new mars3d.graphic.DivGraphic({ //position: new mars3d.LngLatPoint(obj.lng, obj.lat), ...obj, position, style: { html, offsetY: -40, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 400000), // 按视距距离显示 // 高亮时的样式 }, // attr: { remark: "示例1" } }) item.graphicLayer.addGraphic(item.divLayer) } const pointClick = (event) =>{ if(event.graphic.options.checkValue&&event.graphic.options.id){ let pitem = points.find(item=>item.value == event.graphic.options.checkValue) let citem = pitem.source.find(item=>item.id == event.graphic.options.id) let point = mars3d.LngLatPoint.fromCartesian(event.cartesian); point.format() addDiv(pitem,{ ...citem, lat:point._lat, lng:point._lng, }) } } const initPoints = async ()=>{ isLoading.value = true for(let index=0;index < points.length;index++ ){ let item = points[index] if(checkList.value.includes(item.value)){ if(item.source.length == 0){//新增 let data = [] if(item.value != '10'){//员工使用websocket let res = await conmonGet(item.api) if(item.params){ let res2 = conmonGet(props.config.gisServerPath,{ ...item.params, typeName:'ne:' + props.config[item.tableKey], cql_filter:res.data.paramSql }) data = res2 }else{ data = res.data } } //获取数据结束 //分类加载开始 item.graphicLayer = new mars3d.layer.GraphicLayer() gisMap.addLayer(item.graphicLayer) item.graphicLayer.on(mars3d.EventType.click, function (event) { pointClick(event) }) if(item.value == '8' || item.value == '9' ){ addData(item,data) continue }else if(item.value == '3'){ addLine(item,data,1) continue } if(item.value == 1){ item.source = data.map(item2=>{ return{ ...item2, point:item2.pointStr.split(',') } }) } if(item.value == 2){ item.source = data.map(item2=>{ return{ ...item2, point:[item2.lon,item2.lat] } }) } if(item.value == 4){ item.source = data.map(item2=>{ return{ ...item2, point:item2.coordinatePoint.split(',') } }) } if(item.value == 5){ item.source = data.map(item2=>{ return{ ...item2, point:item2.addressPoint.split(',') } }) } if(item.value == 6){ item.source = data.map(item2=>{ return{ ...item2, point:item2.point.split(',') } }) } if(item.value == 7){ item.source = data.map(item2=>{ return{ ...item2, point:item2.coordinate.split(',') } }) } if(item.value == 11){ item.source = data.map(item2=>{ return{ ...item2, point:item2.hdPoint.split(',') } }) } addPoints(item) //item.source = stations }else{ //已经增加过的,直接控制显示 if(item.params){ item.source.forEach(s=>{ s.entities.show = true }) }else{ if(item.graphicLayer){ item.graphicLayer.show = true } } } }else{//隐藏 if(item.params){ item.source.forEach(s=>{ s.entities.show = false }) }else{ if(item.graphicLayer){ item.graphicLayer.show = false } // item.graphicLayer.show = false } } } isLoading.value = false } const onMapload = (map) =>{ gisMap = map map.basemap = 2021 initPoints() } watch(() => route.path, (path) => { if(path == '/total-situation'){ checkList.value = ['1','2','3','8','9'] }else if(path == '/safe-evaluate'){ checkList.value = ['1','9'] }else if(path == '/gas-supply'){ checkList.value = ['1','2','3','8','9'] }else if(path == '/run-safe'){ checkList.value = ['1','4','5','6','7','9'] }else if(path == '/supervise-check'){ checkList.value = ['1','11'] }else if(path == '/dispatch'){ checkList.value = ['1','10'] } nextTick(() => { if(gisMap){ initPoints() } }) }, {immediate: true}) watch(() => props.userList, (users) => { let obj = points.find(item=>item.value == '10') setTimeout(()=>{ if(obj.graphicLayer){ obj.graphicLayer.clear() }else{ console.log(window.mars3d) let mars3d = window.mars3d if(mars3d){ obj.graphicLayer = new mars3d.layer.GraphicLayer() if(gisMap){ console.log(12456,obj.graphicLayer) gisMap.addLayer(obj.graphicLayer) } } } obj.source = users.map(item=>{ let point = item.point.split(',') return{ ...item, point } }) if(gisMap){ addPoints(obj) } // if (!gisMap || !window.mars3d) return; // let obj = points.find(item => item.value == '10'); // if (obj.graphicLayer) { // obj.graphicLayer.clear(); // } else { // // 此时 mars3d 已初始化,可安全使用 // obj.graphicLayer = new mars3d.layer.GraphicLayer(); // gisMap.addLayer(obj.graphicLayer); // gisMap 也已存在 // } // obj.source = users.map(item => { // let point = item.point.split(','); // return { ...item, point }; // }); // addPoints(obj); },2000) }, {immediate: true,deep:true}) </script> <style lang="less" scoped> .mapcontainer { position: relative; height: 100%; overflow: hidden; /*background: #000;*/ } .markerCheck{ position: absolute; left: 50%; width: 45%; transform: translateX(-50%); bottom:28px; z-index: 999; padding:0.05rem 0.2rem ; background-image: url("~@/assets/images/cockpit/map-center/ghbg.png"); background-size: 100% 100%; } .markerCheck{ :deep(.el-checkbox-group){ .el-checkbox__label{ color: #fff; } .el-checkbox__inner{ background-color: transparent; } } } :deep(.el-loading-mask){ background-color: rgba(255,255,255,0); } </style> <style> .masker-pannel { width: 310px; min-height: 120px; background-size: 100% 100%; background-image: url("~@/assets/icons/svg/hiddenDanger/markerbg.svg"); } .pannel-top{ height: 29px; display: flex; align-items: center; justify-content: center; color: #B4E4FF; background-size: 100% 100%; background-image: url("~@/assets/icons/svg/hiddenDanger/markertitle.svg"); } .pannel-body{ padding:10px 15px; line-height: 2; } .check-icon{ width: 20px; height: auto; margin-left: 5px; } </style>为什么执行到这里就不往下执行了呢?怎么解决呢?
08-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值