西南大學(xué)校園GIS平臺(tái)

系統(tǒng)架構(gòu)是B/S,開發(fā)語言是C#、silverlight,開發(fā)平臺(tái)是.NET,數(shù)據(jù)庫為sqlserver,這是我讀研究生時(shí)候自己做的作品,以自己的母校為地圖,進(jìn)行GIS相關(guān)的功能分析,核心的模塊有:空間查詢、GPS定位模擬、搜索模塊、統(tǒng)計(jì)分析;其中說的不足之處,望各位指點(diǎn)出來。

**一、空間查詢 **

整體思路:空間查詢是用戶在地圖上框選一定范圍,然后根據(jù)框選范圍Geometry來進(jìn)行query查詢。框選利用Draw工具有多邊形、矩形、圓線等方式。實(shí)現(xiàn)方式,前臺(tái)界面設(shè)計(jì):

<pre>

<Grid x:Name="ToolbarGrid" HorizontalAlignment="Left" VerticalAlignment="Top" Width="600" Height="0" RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<ScaleTransform x:Name="ToolbarGridScaleTransform" ScaleX="0" ScaleY="0" />
</Grid.RenderTransform>
<StackPanel Orientation="Vertical">
<esriToolkit:Toolbar x:Name="MyToolbar" MaxItemHeight="40" MaxItemWidth="40"
VerticalAlignment="Top" HorizontalAlignment="Left"
Loaded="MyToolbar_Loaded"
ToolbarItemClicked="MyToolbar_ToolbarItemClicked"
ToolbarIndexChanged="MyToolbar_ToolbarIndexChanged"
Width="600" Height="40">
<esriToolkit:Toolbar.Items>
<esriToolkit:ToolbarItemCollection>

<esriToolkit:ToolbarItem Text="放大">
<esriToolkit:ToolbarItem.Content>
<Image Source="Images/i_zoomin.png" Stretch="UniformToFill" Margin="3" />
</esriToolkit:ToolbarItem.Content>
</esriToolkit:ToolbarItem>

<esriToolkit:ToolbarItem Text="縮小">
<esriToolkit:ToolbarItem.Content>
<Image Source="Images/i_zoomout.png" Stretch="UniformToFill" Margin="3" />
</esriToolkit:ToolbarItem.Content>
</esriToolkit:ToolbarItem>

<esriToolkit:ToolbarItem Text="多邊形查詢">
<esriToolkit:ToolbarItem.Content>
<Image Source="Images/DrawPolygon.png" Stretch="UniformToFill" Margin="5"/>
</esriToolkit:ToolbarItem.Content>
</esriToolkit:ToolbarItem>

<esriToolkit:ToolbarItem Text="線查詢">
<esriToolkit:ToolbarItem.Content>
<Image Source="Images/DrawPolyline.png" Stretch="UniformToFill" Margin="5"/>
</esriToolkit:ToolbarItem.Content>
</esriToolkit:ToolbarItem>

<esriToolkit:ToolbarItem Text="矩形查詢">
<esriToolkit:ToolbarItem.Content>
<Image Source="Images/DrawRectangle.png" Stretch="UniformToFill" Margin="5"/>
</esriToolkit:ToolbarItem.Content>
</esriToolkit:ToolbarItem>
</esriToolkit:ToolbarItemCollection>
</esriToolkit:Toolbar.Items>
</esriToolkit:Toolbar>
<TextBlock x:Name="StatusTextBlock" FontWeight="Bold" HorizontalAlignment="Center"/>
</StackPanel>
</Grid>

     這里只講空間查詢部分,其他的距離量算、面積量算等具體見源代碼。

      后臺(tái)代碼實(shí)現(xiàn):

     public MainPageII() //構(gòu)造函數(shù)初始化
     {

        //初始化MyDrawObject,draw工具
        MyDrawObject = new Draw(MyMap)
        {
            FillSymbol = DefaultFillSymbol, //初始化默認(rèn)的填充顏色
            LineSymbol = DefaultLineSymbol //初始化默認(rèn)的線顏色
        };

        MyDrawObject.DrawComplete += myDrawObject_DrawComplete; //draw完成觸發(fā)函數(shù),為了獲取框選的范圍geometry結(jié)果
        MyDrawObject.DrawBegin += myDrawObject_DrawBegin; //draw之前觸發(fā)函數(shù),設(shè)置一些畫之前的動(dòng)作

      }

     private void myDrawObject_DrawBegin(object sender, EventArgs args)
    {
        GraphicsLayer graphicsLayer = MyMap.Layers["MapTipGraphicsLayer"] as GraphicsLayer;//設(shè)置GraphicsLayer 
        graphicsLayer.ClearGraphics();//draw之前,清空所有的graphics
    }

   ////////////////////////下面是實(shí)現(xiàn)工具欄的功能
    private void myDrawObject_DrawComplete(object sender, DrawEventArgs args)
    {
        if (toolMode == "Rectangle_Query")//toolMode變量來判斷是哪種模式框選,此處為矩形,其他框選模式原理是一樣的,這里不再寫出來
        {
            GraphicsLayer graphicsLayer = MyMap.Layers["MapTipGraphicsLayer"] as GraphicsLayer;
            ESRI.ArcGIS.Client.Geometry.Envelope clickEnvelope = args.Geometry as Envelope;//獲取幾何范圍geometry
            //先判斷一下是矢量地圖還是遙感地圖
            if (rasterMap.IsChecked == true)
            {
                graphicsLayer.ClearGraphics();
            }
            else
            {
                graphicsLayer.ClearGraphics();
                ESRI.ArcGIS.Client.Graphic graphic = new ESRI.ArcGIS.Client.Graphic() //定義框選出來的矩形樣式顏色
                {
                    Geometry = clickEnvelope,
                    Symbol = DefaultFillSymbol
                };
                graphicsLayer.Graphics.Add(graphic);//添加框選出來的圖形顯示在地圖上
            }
            QueryTask queryTask = new QueryTask("http://192.168.1.4/arcgis/rest/services/SWUMap/MapServer/9");//定義QueryTask
            queryTask.ExecuteCompleted += QueryTask1_ExecuteCompleted; //query查詢結(jié)果

            queryTask.Failed += QueryTask_Failed;//query查詢失敗
            Query query = new ESRI.ArcGIS.Client.Tasks.Query(); //定義query對(duì)象
            // Specify fields to return from query
            query.OutFields.AddRange(new string[] { "ID", "NAME", "Area", "Length", "X", "Y", "ImagePath" });//設(shè)置query條件
            //query.OutFields.Add("*");
            query.Where = "1=1";
            query.Geometry = args.Geometry;//幾何條件
            query.ReturnGeometry = true;
            queryTask.ExecuteAsync(query);//執(zhí)行query查詢
            Binding resultFeaturesBinding = new Binding("LastResult");/query查詢結(jié)果值獲取,綁定在datagrid表格用
            resultFeaturesBinding.Source = queryTask;
            Find_QueryDetailsDataGrid.SetBinding(DataGrid.ItemsSourceProperty, resultFeaturesBinding);//獲取的查詢結(jié)果值綁定在datagrid表格
            ShowFindQueryWindow.Begin();
        }
    }

    /// <summary>
    /// 顯示選擇元素顏色
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="args"></param>
    private void QueryTask1_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
    {
        FeatureSet Query_featureSet = args.FeatureSet;//獲取到查詢結(jié)果集合
        GraphicsLayer graphicsLayer = MyMap.Layers["MapTipGraphicsLayer"] as GraphicsLayer;
        if (Query_featureSet == null || Query_featureSet.Features.Count < 1)
        {
            information.Text = "沒有查詢記錄!";
            ShowImageRoot.Begin();
            return;
        }
        if (Query_featureSet != null && Query_featureSet.Features.Count > 0)
        {
            foreach (Graphic feature in Query_featureSet.Features)
            {
                //先判斷一下是矢量地圖還是遙感地圖
                if (rasterMap.IsChecked == true)
                {
                    feature.Symbol = LayoutRoot.Resources["RemotePicture"] as ESRI.ArcGIS.Client.Symbols.PictureMarkerSymbol;//定義符號(hào)顏色樣式
                    feature.Geometry = new MapPoint(Convert.ToDouble(feature.Attributes["X"]), Convert.ToDouble(feature.Attributes["Y"]));
                    graphicsLayer.Graphics.Add(feature);
                    RemotePictureStoryboard.Begin();
                }
                else
                {
                    feature.Symbol = LayoutRoot.Resources["ParcelSymbol"] as FillSymbol;//定義符號(hào)顏色樣式
                    graphicsLayer.Graphics.Insert(0, feature);//查詢結(jié)果的幾何圖形顯示在地圖上
                }
            }
        }
    }

</pre>
** 二、搜索模塊,主要包括路徑搜索、關(guān)鍵字搜索、范圍搜索**



** 1**、關(guān)鍵字搜索,就是普通的query查詢,其實(shí)應(yīng)該用locator地理編碼服務(wù)來實(shí)現(xiàn)的,當(dāng)時(shí)自己水平有限,沒能使用。把所有興趣的信息集合在一個(gè)圖層里面,然后發(fā)布地圖服務(wù),這樣用query查詢方式可以達(dá)到跟locator一樣的目的。
這里貼上核心后臺(tái)代碼好了,前臺(tái)界面很簡單就是一個(gè)文本框輸入和按鈕。

 QueryTask queryTask = new QueryTask("http://192.168.1.4/arcgis/rest/services/SWUMap/MapServer/9");//定義   QueryTask 

queryTask.ExecuteCompleted += QueryTask2_ExecuteCompleted; //query查詢結(jié)果
Query query = new ESRI.ArcGIS.Client.Tasks.Query(); //定義query對(duì)象
query.OutFields.AddRange(new string[] { "ID", "NAME", "Area", "Length", "X", "Y", "ImagePath" });//設(shè)置query條件 query.text =****;//文本框獲取的文本值
query.ReturnGeometry = true;
queryTask.ExecuteAsync(query);//執(zhí)行query查詢
很類似框選查詢的query,不過是設(shè)置條件換了,geometry換為text,查詢結(jié)果一樣是在 queryTask.ExecuteCompleted里面獲取,獲取到關(guān)鍵字查詢的結(jié)果然后定位到其地理位置顯示在地圖上。
2、范圍搜索,這里用buffer分析方式來實(shí)現(xiàn)的,利用buffer獲取到幾何范圍geometry,然后再利用query方式來實(shí)現(xiàn),這里很類似空間查詢部分的框選查詢,不同的是獲取geometry方式不太一樣,一個(gè)是draw,一個(gè)是buffer。
此處是用地圖單擊事件獲取某點(diǎn),然后利用某點(diǎn)為中心來buffer的,貼上buffer部分代碼,后果query代碼跟空間查詢部分是一樣的。
<pre>
GeometryService _geometryService;
** (1)**初始化函數(shù)定義
_geometryService = new GeometryService("http://192.168.1.4/arcgis/rest/services/Geometry/GeometryServer");
_geometryService.BufferCompleted += GeometryService_BufferCompleted;
_geometryService.Failed += GeometryService_Failed;

** (2)** 地圖單擊事件函數(shù)
////先判斷一下,輸入條件是否為空
if (Buffertextbox.Text == "")
{ //MessageBox.Show("請您輸入范圍搜索條件!");
information.Text = "請您輸入范圍搜索條件!";
ShowImageRoot.Begin();
return;
}
GraphicsLayer graphicsLayer = MyMap.Layers["MapTipGraphicsLayer"] as GraphicsLayer;
graphicsLayer.ClearGraphics();
_geometryService.CancelAsync();
_queryTask.CancelAsync();
Graphic stop = new Graphic();
if (rasterMap.IsChecked == true) {
stop.Symbol = RemotePicture1;
}
else
{
stop.Symbol = StopSymbol;
}
stop.Geometry = e.MapPoint;//獲取地圖點(diǎn)坐標(biāo)
stop.Geometry.SpatialReference = MyMap.SpatialReference;
stop.SetZIndex(2);
graphicsLayer.Graphics.Add(stop);
// Use a projection appropriate for your area of interest
ESRI.ArcGIS.Client.Tasks.BufferParameters bufferParams = new ESRI.ArcGIS.Client.Tasks.BufferParameters() {
//BufferSpatialReference = new SpatialReference(4326),
BufferSpatialReference = new SpatialReference(32648),
OutSpatialReference = MyMap.SpatialReference,
Unit = LinearUnit.Meter//設(shè)置地圖單位
};
double R = Convert.ToDouble(Buffertextbox.Text);//buffer半徑
bufferParams.Distances.Add(R);
bufferParams.Features.Add(stop);
_geometryService.BufferAsync(bufferParams); //執(zhí)行緩沖分析
</pre>
(3)獲取buffer范圍結(jié)果函數(shù),然后利用geomerey來query查詢
<pre>private void GeometryService_BufferCompleted(object sender, GraphicsEventArgs args)
{
Graphic bufferGraphic = new Graphic();
bufferGraphic.Geometry = args.Results[0].Geometry;//獲取buffer范圍geometry
bufferGraphic.Symbol = BufferSymbol;//定義buffer符號(hào)
bufferGraphic.SetZIndex(1);
GraphicsLayer graphicsLayer = MyMap.Layers["GLayer"] as GraphicsLayer;
graphicsLayer.Graphics.Add(bufferGraphic);
ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
//query.OutFields.Add("*");
query.OutFields.AddRange(new string[] { "DW", "Shape", "ID", "Area", "Length", "NAME","X","Y","ImagePath" });
query.ReturnGeometry = true;
query.Where = "1=1";
query.Geometry = bufferGraphic.Geometry;
_queryTask.ExecuteAsync(query);
Binding resultFeaturesBinding = new Binding("LastResult.Features");
resultFeaturesBinding.Source = _queryTask;
huanchongqujieguo.SetBinding(DataGrid.ItemsSourceProperty,
resultFeaturesBinding);
// BufferResultWindow.IsOpen = true;
//huanchongqujieguo.Visibility = Visibility.Visible;
ShowBufferResultWindow.Begin();
}</pre>
3、路徑搜索,最短路徑和最優(yōu)路徑,重點(diǎn)詳細(xì)描述最短路徑,最優(yōu)路徑是在最短的路徑基礎(chǔ)上改造的,這里篇數(shù)問題,不再講。
(1)最短路徑,界面是兩個(gè)文本框和查詢按鈕,這里不貼了,貼上核心代碼:
<pre>//下面是實(shí)現(xiàn)路徑添加障礙點(diǎn)網(wǎng)絡(luò)分析
MapPoint MapPointRoute1, MapPointRoute2;
RouteTask _routeTask;
List<Graphic> _stops = new List<Graphic>();
List<Graphic> _barriers = new List<Graphic>();
RouteParameters _routeParams = new RouteParameters(); /////定義Direction
Graphic _activeSegmentGraphic;
DirectionsFeatureSet _directionsFeatureSet;

     /// <summary>        /// 最短路徑分析初始化        /// </summary>   
 private void MyShortPathToChoice()        {    
    _routeTask = new RouteTask("http://192.168.1.4/arcgis/rest/services/SWUMap/NAServer/Route");    
    _routeTask.SolveCompleted += routeTask_SolveCompleted;  
      _routeTask.Failed += routeTask_Failed;    
    _routeParams.Stops = _stops;   
    _routeParams.Barriers = _barriers;   
     _routeParams.UseTimeWindows = false;   
     ////定義Direction的            _routeParams.ReturnRoutes = true;/////   
     _routeParams.ReturnDirections = true;   
     _routeParams.DirectionsLengthUnits = esriUnits.esriMiles;
    }
      ///////////////執(zhí)行路徑分析  
   if (_stops.Count > 1)            {  
         // GraphicsLayer stopsLayer = MyMap.Layers["MyStopsGraphicsLayer"] as GraphicsLayer;   
        if (_routeTask.IsBusy)                {    
            _routeTask.CancelAsync();   
             stopsLayer.Graphics.RemoveAt(stopsLayer.Graphics.Count - 1);  
          }     
       _routeTask.SolveAsync(_routeParams);  
      }
    ///////路徑分析結(jié)果
   private void routeTask_SolveCompleted(object sender, RouteEventArgs e)        {  
      GraphicsLayer routeLayer = MyMap.Layers["MyRouteGraphicsLayer"] as GraphicsLayer;  
      if (e.RouteResults.Count() > 0 && Which_Path1 == "ShortPath")   
     {    
        ////先清空DirectionsStackPanel       
     DirectionsStackPanel.Children.Clear();
            RouteResult routeResult = e.RouteResults[0];                 ////定義Direction 
           _directionsFeatureSet = routeResult.Directions;
            routeResult.Route.Geometry = _directionsFeatureSet.MergedGeometry;
            //routeResult.Route.Symbol = RouteSymbol;     
       routeResult.Route.Symbol = LayoutRoot.Resources["RouteSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol;  
          routeLayer.Graphics.Clear();        
    Graphic lastRoute = routeResult.Route;   
         //decimal totalLength = (decimal)lastRoute.Attributes["Shape_Length"];    
        decimal totalLength = (decimal)lastRoute.Attributes["Total_Length"];   
         string length = string.Format("{0} Meters", totalLength.ToString("#0.000"));    
        Total_Length.Text = length; 
           //decimal totalTime = (decimal)lastRoute.Attributes["Total_Time"];    
        string tip = string.Format("{0} minutes", (totalLength/100).ToString("#0.000"));      
      Total_Time.Text = tip;   
        routeLayer.Graphics.Add(lastRoute); 
           ////Direction       
     int i = 1;    
        foreach (Graphic graphic in _directionsFeatureSet.Features)                {     

           System.Text.StringBuilder text = new System.Text.StringBuilder(); 

               text.AppendFormat("{0}. {1}", i, graphic.Attributes["text"]);   
             if (i > 1 && i < _directionsFeatureSet.Features.Count)                    { 
                   string distance = (Convert.ToDouble(graphic.Attributes["length"])*1609.329).ToString();    
               // string distance = graphic.Attributes["length"].ToString();       
            // string distance = graphic.Attributes["length"].ToString();     
               string time = null;       
             if (graphic.Attributes.ContainsKey("time"))                        {     
                   //time = FormatTime(Convert.ToDouble(graphic.Attributes["time"]));     
                   time = graphic.Attributes["time"].ToString();     
               }        
            if (!string.IsNullOrEmpty(distance) || !string.IsNullOrEmpty(time))    
                    text.Append(" (");      
              text.Append(distance);
                    if (!string.IsNullOrEmpty(distance) && !string.IsNullOrEmpty(time))    
                    text.Append(", ");      
              text.Append(time);   
                 if (!string.IsNullOrEmpty(distance) || !string.IsNullOrEmpty(time))    
                    text.Append(")");  
              }         
       TextBlock textBlock = new TextBlock() { Text = text.ToString(), Tag = graphic, Margin = new Thickness(4), Cursor = Cursors.Hand }; 
               textBlock.MouseLeftButtonDown += new MouseButtonEventHandler(directionsSegment_MouseLeftButtonDown);  
              DirectionsStackPanel.Children.Add(textBlock);    
            i++;        
    }                

MyMap.ZoomTo(Expand(_directionsFeatureSet.Extent));
}
}
private void directionsSegment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
TextBlock textBlock = sender as TextBlock;
Graphic feature = textBlock.Tag as Graphic;
MyMap.ZoomTo(Expand(feature.Geometry.Extent));
if (_activeSegmentGraphic == null) {
_activeSegmentGraphic = new Graphic()
{
Symbol = LayoutRoot.Resources["SegmentSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol
};
GraphicsLayer graphicsLayer = MyMap.Layers["MyRouteGraphicsLayer"] as GraphicsLayer;
graphicsLayer.Graphics.Add(_activeSegmentGraphic);
}
_activeSegmentGraphic.Geometry = feature.Geometry;
}
private void stackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
if (_directionsFeatureSet != null) {
GraphicsLayer graphicsLayer = MyMap.Layers["MyRouteGraphicsLayer"] as GraphicsLayer;
MyMap.ZoomTo(Expand(_directionsFeatureSet.Extent));1n
}
}
private Envelope Expand(Envelope e) {
double factor = 0.6;
MapPoint centerMapPoint = e.GetCenter();
return new Envelope(centerMapPoint.X - e.Width * factor, centerMapPoint.Y - e.Height * factor, centerMapPoint.X + e.Width * factor, centerMapPoint.Y + e.Height * factor);
} </pre>
** 三**、GPS模擬定位,這里說說思路好了,具體見源代碼。主要是模擬校車每個(gè)時(shí)刻的地位Point,然后再描繪出來連接成線line,最后添加再地圖上顯示出來。應(yīng)用到arcgis api的對(duì)象point、line、graphic、geometry、graphiclayer等等。
、統(tǒng)計(jì)分析,這里不描述了,具體見源代碼。

GIS之家新博客系列發(fā)布更新在GIS之家網(wǎng)站,歡迎關(guān)注收藏:GIS之家網(wǎng)站
GIS之家作品:GIS之家
GIS之家交流咨詢:咨詢模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容