Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍

转载、引用请标明出处
//www.greatytc.com/p/026fd4f96d4d
本文出自zhh_happig的简书博客,谢谢

Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍
Android百度地图(二):百度地图sdk显示位置点、图层绘制
Android百度地图(三):百度地图画运动轨迹及图层点击事件处理
Android百度地图(四):百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼sdk服务
Android百度地图(五):百度地图鹰眼sdk监控进出地理围栏(区域)

上一篇文章介绍了百度鹰眼sdk监控进出围栏的功能,本篇将详细介绍百度地图中POI检索、公交查询、行政区边界坐标获取、两点之间的路径规划和地理编码(坐标和地址之间的转换)。

一 POI检索

1.POI简介
POI是兴趣点的意思,地图上标注的商铺、饭店、学校、银行、医院、车站等等都是POI。

地图上的POI是可以点击的,通过设置mBaiduMap.setOnMapClickListener监听,在onMapPoiClick回调方法中就可以获取到POI信息,包括经纬度、POI的描述等。

如果你获取到一个位置点,那么也可以查询这个位置点附近的POI,接下来我们就来介绍一下如何查询POI,包括:位置点周边查询、指定区域查询、城市内查询。

2.POI检索api详解

/*应用场景:输入银行,点击搜索,地图上显示各个银行的红色泡泡图标,点击银行图标,显示银行具体信息*/

//以下都是伪代码
PoiSearch mPoiSearch = PoiSearch.newInstance();//初始化POI检索
mPoiSearch.setOnGetPoiSearchResultListener(listener);//注册搜索事件监听

/**
* 搜索位置点周边POI
*/
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); //POI附近检索参数设置类
nearbySearchOption.keyword(keyword);//搜索关键字,比如:银行、网吧、餐厅等
nearbySearchOption.location(center);//搜索的位置点
nearbySearchOption.radius(radius);//搜索覆盖半径
nearbySearchOption.sortType(PoiSortType.distance_from_near_to_far);//搜索类型,从近至远
nearbySearchOption.pageNum(pageIndex);//查询第几页:POI量可能会很多,会有分页查询;
nearbySearchOption.pageCapacity(pageCapacity)//设置每页查询的个数,默认10个
mPoiSearch.searchNearby(nearbySearchOption);//查询

/**
* 搜索指定区域POI
*/
PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();

/**
* LatLngBounds searchbound:地理范围数据结构,两个点就可以确定一个矩形
* southwest:西南点
* northeast:东北点
*/
LatLngBounds searchbound = new LatLngBounds.Builder().include(southwest).include(northeast).build();
boundSearchOption.bound(searchbound);//设置边界
boundSearchOption.keyword(keyword);
boundSearchOption.pageNum(pageIndex);
mPoiSearch.searchInBound(boundSearchOption);//查询

/**
* 搜索城市内POI
*/
PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
citySearchOption.city(citystr);//城市名称,最小到区级单位
citySearchOption.keyword(keyword);
citySearchOption.isReturnAddr(true);//是否返回门址类信息:xx区xx路xx号
citySearchOption.pageNum(pageIndex);
mPoiSearch.searchInCity(citySearchOption);//查询

/**
* 查询POI结果回调监听器,包括周边,区域,城市返回的搜索结果
*/
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
            
      @Override
      public void onGetPoiResult(PoiResult poiResult) {//获取Poi检索列表
           /**
           * PoiInfo中包含了经纬度、城市、地址信息、poi名称、uid、邮编、电话等等信息;
             有了这些,你是不是可以可以在这里画一个自定义的图层了,然后添加点击事件,做一些操作了呢
           */
           List<PoiInfo> poiInfos = result.getAllPoi();//poi列表
           
           /**
           * PoiAddrInfo:只包含地址、经纬度、名称
           */
           List<PoiAddrInfo> PoiAddrInfos = result.getAllAddr();
      }

      @Override
      public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//获取某个Poi详细信息
           /**
           * 当执行以下请求时,此方法回调
           * PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();
             detailSearchOption.poiUid(poiInfo.uid);//设置要查询的poi的uid
             mPoiSearch.searchPoiDetail(detailSearchOption);//查询poi详细信息
           */
           //poiDetailResult里面包含poi的巨多信息,你想要的都有,这里不列举了
      }

      @Override
      public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { //查询室内poi检索结果回调
           /**
           * 当执行以下请求时,此方法回调
           * PoiIndoorOption indoorOption = new PoiIndoorOption();
             indoorOption.poiFloor(floor);//楼层
             mPoiSearch.searchPoiDetail(indoorOption);
           */
      }
}

//再介绍一个推荐查询,应用场景:百度地图搜索输入:银行,百度会给你推荐各大银行供你选择,点击后显示具体位置及POI信息
SuggestionSearch mSuggestionSearch = SuggestionSearch.newInstance();//初始化
mSuggestionSearch.setOnGetSuggestionResultListener(this);//设置监听

SuggestionSearchOption sSption = new SuggestionSearchOption();
sSption.city(cityStr);//指定城市
sSption.keyword(keyword);//关键字
sSption.location(loction);//指定位置,选填,设置位置之后,返回结果按距离该位置的远近进行排序
sSption.citylimit(true);//设置限制城市范围,仅返回指定城市检索结果,默认为false
mSuggestionSearch.requestSuggestion(sSption);

OnGetSuggestionResultListener suggestionlistener = new OnGetSuggestionResultListener() {
            
      @Override
      public void onGetSuggestionResult(SuggestionResult result) {//获取推荐POI列表
           /*
           * SuggestionInfo中包含的信息有限,只包含:联想词,坐标点,POI的uid等
             如果想要POI的详细信息,还得利用uid通过mPoiSearch.searchPoiDetail获取
           */
           List<SuggestionResult.SuggestionInfo> suggestionInfos = result.getAllSuggestions();
      }
};

效果图


银行poi

建议查询

二 地理编码

1.地理编码简介
地理编码分:正向地图编码、反向地图编码
正向地理编码:将地址信息转换为坐标点
反向地理编码:将坐标点转换为地址信息

2.地理编码api详解

GeoCoder mSearch = GeoCoder.newInstance();//初始化地理编码
mSearch.setOnGetGeoCodeResultListener(listener);//设置回调监听

ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
reverseGeoCodeOption.location(new LatLng(36.897,127.9897));//设置坐标点
mSearch.reverseGeoCode(reverseGeoCodeOption);//将坐标点转换为地址信息

GeoCodeOption geoCodeOption = new GeoCodeOption();
geoCodeOption.address(addressStr);//设置地址
geoCodeOption.city(cityStr);//设置城市
mSearch.geocode(geoCodeOption);//将地址信息转换为坐标点

OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
        
    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        //正向地理编码回调,注意geoCodeResult中错误码的处理
        geoCodeResult.getLocation();//坐标点
        geoCodeResult.getAddress();//地址信息
    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        //反向地理编码回调
        reverseGeoCodeResult.getAddress();//简要地址信息
        reverseGeoCodeResult.getAddressDetail();//层次化地址信息
        reverseGeoCodeResult.getBusinessCircle();//所属商圈名称
        reverseGeoCodeResult.getPoiList();//周边POI信息集合
        reverseGeoCodeResult.getSematicDescription();//描述信息
        reverseGeoCodeResult.getLocation();//坐标点
    }
});

三 行政区边界数据检索

根据省、市、县(区)级行政区划名称,查询行政区划的详细边界信息。

DistrictSearch mDistrictSearch = DistrictSearch.newInstance();//初始化行政区检索
mDistrictSearch.setOnDistrictSearchListener(listener );//设置回调监听

DistrictSearchOption districtSearchOption = new DistrictSearchOption();
districtSearchOption.cityName(cityStr);//检索城市名称
districtSearchOption.districtName(districtStr);//检索的区县名称
mDistrictSearch.searchDistrict(districtSearchOption);//请求行政区数据

OnGetDistricSearchResultListener listener = new OnGetDistricSearchResultListener() {
            
    @Override
    public void onGetDistrictResult(DistrictResult districtResult) {
        districtResult.getCenterPt();//获取行政区中心坐标点
        districtResult.getCityName();//获取行政区域名称
        List<List<LatLng>> polyLines = districtResult.getPolylines();//获取行政区域边界坐标点
        //边界就是坐标点的集合,在地图上画出来就是多边形图层。有的行政区可能有多个区域,所以会有多个点集合。
    }

};

效果图


西城区边界

四 公交线路查询

/**
* 公交线路查询分两步
* 1.根据关键字查询出公交类型的poi
* 2.根据公交poi的uid查询公交线路详情
*/
PoiSearch mSearch = PoiSearch.newInstance();//初始化poi查询
mSearch.setOnGetPoiSearchResultListener(poiSearchResultListener );
BusLineSearch mBusLineSearch = = BusLineSearch.newInstance();//初始化公交线路查询
mBusLineSearch.setOnGetBusLineSearchResultListener(busLineSearchResultListener );

PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
citySearchOption.city(cityStr);//城市,北京
citySearchOption.keyword(numStr);//公交路号,例:地铁2号线
mSearch.searchInCity(citySearchOption);//查询POI,过滤出公交类型poi

//POI回调
OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {
            
    @Override
    public void onGetPoiResult(PoiResult result) {
        //遍历所有poi,找到类型为公交线路的poi
        for (PoiInfo poi : result.getAllPoi()) {
            if (poi.type == PoiInfo.POITYPE.BUS_LINE
                    || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
                //注意:这里的查到公交poi都是起点
                busLineIDList.add(poi.uid);//size=2,两个方向
            }
        }        
    }
    //...省略其他方法
};

BusLineSearchOption busLineSearchOption = new BusLineSearchOption();
busLineSearchOption.city(cityStr);//城市
busLineSearchOption.uid(uid);//公交poi的uid
mBusLineSearch.searchBusLine(busLineSearchOption);//查询公交路线

//公交路线回调
OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {

    @Override
    public void onGetBusLineResult(BusLineResult result) {
        //BusLineResult包含公交:起步价、末班车时间、公交名、上行下行称等信息
        List<BusLineResult.BusStation> busStations = result.getStations();//公交所有站点
        for (BusLineResult.BusStation busStation : busStations){
            busStation.getTitle();//站点名称
            busStation.getLocation();//站点坐标点
        }
        List<BusLineResult.BusStep> busSteps = result.getSteps();
        //注意:这里并不是公交路线分段信息,而是:公交从起点到终点为一个busStep 
        for (BusLineResult.BusStep busStep : busSteps){//size=1
            busStep.getDistance();//距离,公交线路的总距离
            busStep.getDuration();//总时长
        }
    }
};

效果图


地铁2号线

五 两点线路规划

线路规划:公交换乘、驾车、骑行和步行四种类型

RoutePlanSearch mSearch = RoutePlanSearch.newInstance();//初始化搜索模块
mSearch.setOnGetRoutePlanResultListener(planResultListener);//注册事件监听

PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "北京西站");//起始点
PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "北京南站");//终点,PlanNode也支持输入坐标点

/**驾车路线规划**/
DrivingRoutePlanOption drivingRoutePlanOption = new DrivingRoutePlanOption();//参数设置类
drivingRoutePlanOption.from(stNode);//设置起点
drivingRoutePlanOption.to(enNode);//设置终点
drivingRoutePlanOption.currentCity("北京");//当前城市,注意:这里设置城市,那么PlanNode中的城市将会被覆盖
/**
* 路线规划策略,枚举类型:躲避拥堵、最短距离、较少费用、时间优先
* ECAR_TIME_FIRST:时间优先
* ECAR_AVOID_JAM:躲避拥堵
* ECAR_DIS_FIRST:最短距离
* ECAR_FEE_FIRST:较少费用
*/
drivingRoutePlanOption.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_TIME_FIRST);
mSearch.drivingSearch(drivingRoutePlanOption);//查询

/**公交线路规划**/
TransitRoutePlanOption transitRoutePlanOption = new TransitRoutePlanOption();
transitRoutePlanOption.from(stNode);
transitRoutePlanOption.to(enNode);
transitRoutePlanOption.city("北京");
/**
* EBUS_NO_SUBWAY:不含地铁
* EBUS_TIME_FIRST:时间优先
* EBUS_TRANSFER_FIRST:最少换乘
* EBUS_WALK_FIRST:最少步行距离
*/
transitRoutePlanOption.policy(TransitRoutePlanOption.TransitPolicy.EBUS_TIME_FIRST);//线路规划策略:
mSearch.transitSearch(transitRoutePlanOption);//查询

/**步行线路规划**/
WalkingRoutePlanOption walkingRoutePlanOption = new WalkingRoutePlanOption();
walkingRoutePlanOption.from(stNode);
walkingRoutePlanOption.to(enNode);
mSearch.walkingSearch(walkingRoutePlanOption);

/**骑行线路规划**/
BikingRoutePlanOption bikingRoutePlanOption = new BikingRoutePlanOption();
bikingRoutePlanOption.from(stNode);
bikingRoutePlanOption.to(enNode);
mSearch.bikingSearch(bikingRoutePlanOption);

/**跨城市线路规划**/
MassTransitRoutePlanOption massTransitRoutePlanOption = new MassTransitRoutePlanOption();
massTransitRoutePlanOption.from(stNode);
massTransitRoutePlanOption.to(enNode);
massTransitRoutePlanOption.pageIndex(0);//设置返回第几页 从0开始
massTransitRoutePlanOption.pageSize(5);//设置每页返回几条路线,1~10条
//市内公交换乘策略:最短时间......等
massTransitRoutePlanOption.tacticsIncity(MassTransitRoutePlanOption.TacticsIncity.ETRANS_LEAST_TIME);        
//设置跨城交通方式策略:火车优先......等
massTransitRoutePlanOption.transtypeintercity(MassTransitRoutePlanOption.TransTypeIntercity.ETRANS_TRAIN_FIRST);
//设置跨城换乘策略:出发最早......等
massTransitRoutePlanOption.tacticsIntercity(MassTransitRoutePlanOption.TacticsIntercity.ETRANS_START_EARLY);
mSearch.masstransitSearch(massTransitRoutePlanOption);//查询

//规划路线回调监听器
OnGetRoutePlanResultListener planResultListener = new OnGetRoutePlanResultListener() {

    @Override
    public void onGetWalkingRouteResult(WalkingRouteResult result) {//步行规划路线回调
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            return;
        }
        if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
            // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
            // result.getSuggestAddrInfo()
            return;
        }

        List<WalkingRouteLine> walkingRouteLines = result.getRouteLines();//获取规划路线列表
        for (WalkingRouteLine walkingRouteLine : walkingRouteLines) {//多条规划路线
            walkingRouteLine.getDistance();//该路线距离
            walkingRouteLine.getDuration();//时长
            walkingRouteLine.getStarting();//获取起点
            walkingRouteLine.getTerminal();//获取终点
            List<WalkingRouteLine.WalkingStep> walkingSteps = walkingRouteLine.getAllStep();//每条规划路线含多个路段
            for (WalkingRouteLine.WalkingStep walkingStep : walkingSteps) {
                walkingStep.getEntrance();//该步段起点
                walkingStep.getExit();//终点
                walkingStep.getWayPoints();//该步段起点与终点中间的点,步段有可能不是直线,折线的话有多个点
                ...
            }
        }
    }

    @Override
    public void onGetTransitRouteResult(TransitRouteResult result) {//公交路线规划回调
        ...省略,同上
        List<TransitRouteLine> transitRouteLines = result.getRouteLines();//获取规划路线列表
        for (TransitRouteLine transitRouteLine : transitRouteLines){
            /**
           * 每条规划路线含多个TransitStep,这里要注意的是:比如从北京西站到南站,一共有3个路段
           * 乘坐地铁7号线(焦化厂方向),经过4站,到达菜市口站:第一个步段,乘坐7号线
           * 站内换乘地铁4号线大兴线(天宫院方向):第二个步段,步行到4号线
           * 乘坐地铁4号线大兴线(天宫院方向),经过2站,到达北京南站:第三个步段,乘坐4号线
           * 所以每换一个线路就是一个路段,步行不论距离长短也算一个路段
           */
            List<TransitRouteLine.TransitStep> transitSteps = transitRouteLine.getAllStep();();
            transitStep.getInstructions();//每段路线的乘坐信息
            transitStep.getVehicleInfo();//每段路线站点、票价等信息
            transitStep.getWayPoints();//该路段起点与终点中间的点,路段有可能不是直线,折线的话有多个点

            ...省略,同上
        }
    }

    @Override
    public void onGetMassTransitRouteResult(MassTransitRouteResult result) {//跨城市路线规划回调
        ...
        result.getOrigin();//起点,含:坐标,城市信息等
        result.getDestination();//终点
        List<MassTransitRouteLine> massTransitRouteLines = result.getRouteLines();
        for (MassTransitRouteLine massTransitRouteLine : massTransitRouteLines){//多条规划路线
            //massTransitRouteLine包含本线路的票价、到达时间等信息
            List<MassTransitRouteLine.TransitStep> transitSteps = massTransitRouteLine.getAllStep();//多个路段
            //TransitStep包含:本路段始终点、交通方式等信息
            ...
        }
    }

    @Override
    public void onGetDrivingRouteResult(DrivingRouteResult result) {//驾车线规划回调
        ...
        List<DrivingRouteLine> drivingRouteLines = result.getRouteLines();
        for (DrivingRouteLine drivingRouteLine : drivingRouteLines){
            ...
            drivingRouteLine.getLightNum();//本线路红绿灯数
            drivingRouteLine.getCongestionDistance();//本线路拥堵距离
            List<DrivingRouteLine.DrivingStep> drivingStep = drivingRouteLine.getAllStep();
            ...
        }
    }

    @Override
    public void onGetBikingRouteResult(BikingRouteResult result) {//骑行线规划回调
        ...
        List<BikingRouteLine> bikingRouteLines = result.getRouteLines();
        for (BikingRouteLine bikingRouteLine : bikingRouteLines){
            ...
            List<BikingRouteLine.BikingStep> bikingStep = bikingRouteLine.getAllStep();
            ...
        }
    }

    @Override
    public void onGetIndoorRouteResult(IndoorRouteResult result) {
         //室内路线规划回调
    }
};

效果图

公交路径规划

好啦,本篇到这里就讲完了。如果只是查询的话,就不用百度地图sdk了。如果需要将poi、线路、公交、边界画在地图上显示的话,也是很简单的,只要你拿到了坐标点,就可以在地图上增加图层了,包括:圆形、多边形、线性等等,不清楚的阅读文章片头相关文章。这里推荐com.baidu.mapapi.overlayutil里面的api,可以方便的绘制上述图层

//例1:画公交线路图层
BusLineOverlay overlay = new BusLineOverlay(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);//添加marker点击监听
overlay.setData(result);//设置数据,BusLineResult:result,公交回调监听返回的公交线路结果
overlay.addToMap();//将公交线路画在地图上
overlay.zoomToSpan();//缩放操作,显示整个线路

//例2:画规步行划路线图层
WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaidumap);
overlay.setData(result.getRouteLines().get(0));//设置步行路线,result步行回调监听返回结果
overlay.addToMap();
overlay.zoomToSpan();

......

com.baidu.mapapi.overlayutil里面的api把画图层的操作都封装好了,比较简单,poi、行政区边界、其他规划路径都有相应的化图层工具类。

如果各位看官觉得文章不错,别忘了点个喜欢。
源码下载地址

以上文章内容,是本人工作中的总结,供大家参考,有误的地方还请指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容