日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenMap教程–第1部分

發(fā)布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenMap教程–第1部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

介紹

本系列教程將向您展示如何使用OpenMap GIS Java Swing庫構建Java應用程序。

OpenMap的開發(fā)人員指南是非常有用的文檔,描述了OpenMap的體系結(jié)構,但沒有說明如何逐步啟動和構建應用程序。 源代碼附帶的示例很有用,但還不夠。

OpenMap是用Swing編寫的。 在撰寫本文時,最新版本是5.1.12。 您可以從GitHub下載源代碼和可執(zhí)行jar。 將其復制/解壓縮/克隆到目錄后,可以通過運行適用于您平臺的相關腳本( openmap.bat或openmap )或雙擊lib/openmap.jar來執(zhí)行它。 您應該看到一個完整的GIS應用程序,如圖1所示。在本系列文章的最后,我們將嘗試構建一個類似的應用程序。 OpenMap源代碼還包含一些有關如何使用OpenMap的示例。 在本教程中,我們將基于com.bbn.openmap.app.example.SimpleMap 。 在第二個教程中,我們將使用com.bbn.openmap.app.example.SimpleMap2代碼。 以后的教程將基于其他示例。

在本系列教程中,我們將使用最新的NetBeans IDE 8.1創(chuàng)建我們的應用程序。

教程1 –構建基本的地圖應用程序

創(chuàng)建一個JFrame應用程序

在第一個教程中,我們將構建一個包含映射的基本JFrame應用程序(參見圖2)。 通過執(zhí)行以下步驟,打開NetBeans并創(chuàng)建一個新的Java應用程序:

  • 打開菜單File→New Project,然后選擇Category : Java和Project : Java Application (圖3)。 單擊下一步
  • 在下一步中,提供名稱和位置。 確保對庫使用專用文件夾,并且不要選擇主類(圖4)。 點擊完成 。
  • 創(chuàng)建新項目后,通過右鍵單擊Source Packages并從彈出菜單中選擇New→Java Package ,創(chuàng)建一個名為openmap的新軟件包。
  • 右鍵單擊“ 庫”文件夾,然后從彈出菜單中選擇“ 添加JAR /文件夾 ”操作。 導航到OpenMap安裝的lib文件夾,然后選擇openmap.jar 。 您可以使用相對路徑,也可以將其更好地復制到Libraries文件夾中(圖5)。 單擊“ 打開”關閉對話框!

    圖1:OpenMap GIS應用程序窗口

  • 您還需要復制地圖文件。 最常見的格式是.shp (ESRI Shape)。 通過在NetBeans中選擇“ 文件”窗口,右鍵單擊OpenMap1項目,然后從彈出菜單中選擇“ 新建”→“文件夾” ,創(chuàng)建一個新的文件夾層次結(jié)構resources/map 。 輸入名稱resources ,然后單擊確定 。 右鍵單擊resources文件夾,然后重復該過程以在其中創(chuàng)建地圖文件夾。 將share/data/shape文件夾從您的OpenMap安裝復制到map文件夾
  • 右鍵單擊openmap包,然后從彈出菜單中選擇New→JFrame Form ,以創(chuàng)建新的JFrame表單。 給它起一個名字,例如MapFrame ,然后單擊Finish 。

    基本的OpenMap Swing應用程序

  • 單擊Source按鈕以查看生成的代碼(請參見清單1)。
  • 添加行super("Simple Map"); 在構造函數(shù)中設置窗口標題。
  • 構造函數(shù)初始化JFrame 。 到目前為止,沒有添加任何內(nèi)容。 由于它是一個GUI應用程序,因此需要在EDT線程中運行,這就是NetBeans在main()方法中為我們編寫的內(nèi)容。
  • 單擊返回到“ 設計”按鈕以查看空白表格。
  • 我們可以將OpenMap JavaBeans添加到面板中。 要做到這一點:

  • 右鍵單擊調(diào)色板,然后選擇“ 調(diào)色板管理器” 。
  • 單擊“ 新建類別”,然后輸入OpenMap作為類別名稱。 單擊單擊從JAR添加按鈕,導航到openmap.jar 選擇顯示所有JavaBeans單選按鈕并選擇所有可用組件。 單擊下一步。
  • 選擇OpenMap調(diào)色板類別,然后單擊Finish 。 新的調(diào)色板類別已添加到“調(diào)色板”中。

    3:創(chuàng)建一個新的Java應用程序

  • 添加地圖

  • 找到MapBean并將其拖動到MapFrame 。
  • 在NetBeans的Navigator窗口中,右鍵單擊mapBean1 ,選擇Change Variable Name并將其設置為mapBean 。
  • 在“ 導航器”窗口中,右鍵單擊JFrame并將其布局更改為BorderLayout
  • 結(jié)果代碼如清單2所示。

    F圖4:提供項目名稱和位置


  • 圖5:將openmap.jar添加到您的Libraries文件夾

    com.bbn.openmap.MapBean組件是OpenMap工具包中的主要地圖窗口組件。 MapBean派生自java.awt.Container類。 因為它是Swing組件,所以可以像其他任何用戶界面組件一樣將其添加到Java窗口層次結(jié)構中。

    為了在MapBean創(chuàng)建地圖,需要將Layers (com.bbn.openmap.Layer)添加到MapBean 。 圖層派生自java.awt.Component ,它們是可以添加到MapBean的唯一組件。 因為Layers是MapBean容器中包含的Components ,所以Layers在地圖上的呈現(xiàn)由Java組件呈現(xiàn)機制控制。 該機制控制分層組件如何在彼此之上繪制。 為了確保按照正確的順序?qū)⒚總€組件繪制到窗口中, Component類包括一個方法,該方法允許其告知渲染機制它想被繪制。 此功能允許Layers彼此獨立工作,并讓MapBean避免知道圖層上正在發(fā)生的事情。

    清單1:基本的Swing應用程序

    public class MapFrame extends javax.swing.JFrame {/** Creates new form MapFrame */public MapFrame() {super("Simple Map");initComponents();}@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {// Content suppressed} /*** @param args the command line arguments*/public static void main(String args[]) {/* Create and display the form */java.awt.EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {new MapFrame().setVisible(true);}});} }

    清單2:添加一個MapBean

    @SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {mapBean = new com.bbn.openmap.MapBean();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);getContentPane().add(mapBean, java.awt.BorderLayout.CENTER);pack();}

    清單3:將ShapeLayer添加到MapBean

    /*** Create a ShapeLayer to show world political boundaries. Set the properties of the layer. This assumes that* the datafiles {@code dcwpo-browse.shp} and {@code dcwpo-browse.ssx} are in a path specified in the CLASSPATH variable.* These files are distributed with OpenMap and reside in the toplevel "share" subdirectory.*/ private void initMap() {Properties shapeLayerProps = new Properties();shapeLayerProps.put("prettyName", "Political Solid");shapeLayerProps.put("lineColor", "000000");shapeLayerProps.put("fillColor", "BDDE83");shapeLayerProps.put("shapeFile", "resources/map/shape/dcwpo-browse.shp");shapeLayerProps.put("spatialIndex", "resources/map/shape/dcwpo-browse.ssx");ShapeLayer shapeLayer = new ShapeLayer();shapeLayer.setProperties(shapeLayerProps);// Add the political layer to the mapmapBean.add(shapeLayer); }

    OpenMap應用程序中的圖層可以使用來自許多來源的數(shù)據(jù):

    • 通過計算
    • 來自本地硬盤驅(qū)動器的數(shù)據(jù)文件。
    • 來自URL的數(shù)據(jù)文件。
    • 來自jar文件中包含的數(shù)據(jù)文件。
    • 使用從數(shù)據(jù)庫(JDBC)檢索的信息。
    • 使用從地圖服務器接收的信息(圖像或地圖對象)。
  • 清單3顯示了在initComponents()之后在MapFrame的構造函數(shù)中添加的新方法initMap() ,該方法顯示了如何向ShapeLayer添加MapBean ,以呈現(xiàn)從shape (.shp)文件檢索的政治邊界圖。 右鍵單擊MapFrame類,然后選擇Run File 。 您應該看到圖2的窗口。做得好。

    OpenMap應用程序配置有openmap.properties file 。 該文件的內(nèi)容指定創(chuàng)建哪些組件并將其添加到應用程序框架(包括層)中。 只需使用文本編輯器修改o penmap.properties文件,即可配置應用程序而無需重新編譯。 只需將上述屬性文件添加進去,就可以將已經(jīng)了解框架的組件添加到應用程序中。 為使用屬性編寫的組件將獲得其設置,以便正確初始化自己。 例如,依賴于數(shù)據(jù)文件或服務器位置的層通常具有允許在運行時設置這些位置的屬性。 此屬性文件通常位于應用程序文件夾中,或者位于用戶的主文件夾中。 在后一種情況下,每個用戶都可以根據(jù)自己的需求自定義應用程序。

    讓我們將形狀圖層的屬性移動到屬性文件,然后從那里讀取它們。

  • 右鍵單擊OpenMap項目,然后從彈出菜單中選擇“ 新建”→“屬性文件 ”。 給它命名屬性,然后單擊Finish 。
  • 您可以在Projects窗口這個文件,顯示文件窗口中單擊和雙擊它在NetBeans編輯器中打開它。
  • 粘貼清單4的內(nèi)容。
  • 注釋掉在initMap()方法中設置形狀層屬性的行,并將其替換為清單5的代碼。
  • 再次運行該應用程序以查看完全相同的窗口(圖2)。 清單4:openmap.properties prettyName=Political Solid lineColor=000000 fillColor=BDDE83 shapeFile=resources/map/shape/dcwpo-browse.shp spatialIndex=resources/map/shape/dcwpo-browse.ssx

    OpenMap提供了一個特殊的類來處理屬性。 com.bbn.openmap.PropertyHandler是使用openmap.properties文件配置應用程序的組件。 可以知道在Java類路徑和應用程序用戶的主目錄中,從哪個文件讀取屬性或?qū)⑵淞艚o自己來查找openmap.properties文件。

    清單5:initMap()的內(nèi)容

    InputStream is = null;try {is = new FileInputStream("openmap.properties");shapeLayerProps.load(is);} catch (FileNotFoundException ex) {Logger.getLogger(OpenMap.class.getName()).log(Level.SEVERE, null, ex);} catch (IOException ex) {Logger.getLogger(OpenMap.class.getName()).log(Level.SEVERE, null, ex);} finally {if (is != null) {try {is.close();} catch (IOException ex) {Logger.getLogger(OpenMap.class.getName()).log(Level.SEVERE, null, ex);}}}
  • 清單6顯示了更新后的initMap()您不再需要Properties實例。 只需確保您告訴PropertyHandler.Builder()在本地目錄(也稱為./openmap.properties)中使用openmap.properties ,否則它可能會從用戶的主目錄或另一個位置中選取一個。 當然, PropertyHandler可以做的比這更多,我們將在以后的教程中看到。 清單6:使用PropertyHandler的initMap()內(nèi)容 private void initMap() {PropertyHandler propertyHandler = null;try {propertyHandler = new PropertyHandler.Builder().setPropertiesFile("./openmap.properties").build();} catch (IOException ex) {Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex);}ShapeLayer shapeLayer = new ShapeLayer();if (propertyHandler != null) {shapeLayer.setProperties(propertyHandler.getProperties());}// Add the political layer to the mapmapBean.add(shapeLayer); }
  • 并發(fā)呢?

    剩下的唯一障礙是我們將地圖文件加載到EDT線程中。 如果我們需要加載一個大地圖,這將延遲等待加載大地圖的應用程序的啟動。 我們需要將此任務委托給另一個線程。

    有(至少)四種方法可以執(zhí)行此操作:

    • javax.swing.SwingWorker
    • com.bbn.openmap.util.SwingWorker
    • java.awt.SecondaryLoop
    • java.util.concurrent.CompletableFuture

    讓我們開始看看它們中的每一個。

    javax.swing.SwingWorker

    傳統(tǒng)方法是使用SwingWorker來完成臟工作(清單7)。 通用類SwingWorker提供了兩種參數(shù)化類型。 第一個參數(shù)化類型( ShapeLayer )是doInBackground()和get()方法的返回類型。 后臺任務完成時, get()可訪問doInBackground()返回的對象。 第二個參數(shù)化類型適用于定期發(fā)布的值。 當長時間運行的任務發(fā)布部分結(jié)果時,這很有用。 在這里,我們使用Void ,因為我們不發(fā)布部分結(jié)果。 doInBackground()的代碼在后臺線程中執(zhí)行。 在這里,我們使用PropertyHandler讀取屬性,并創(chuàng)建并返回ShapeLayer 。

    要啟動后臺線程,我們調(diào)用SwingWorker's execute()方法。 這樣可以安排線程執(zhí)行并立即返回。 后臺任務完成后,將在EDT中調(diào)用overridden done()方法。 使用此方法可以在其中放置代碼以更新或刷新GUI. Method get() GUI. Method get()阻塞,直到后臺任務完成為止。 但是,如果在方法done()調(diào)用get() ,則由于后臺任務已完成,因此不會發(fā)生阻塞。 在此方法中,我們將圖層添加到mapBean 。 但是,由于已經(jīng)渲染了MapFrame ,因此也需要刷新它才能渲染地圖圖層。 這是通過重新驗證MapFrame來實現(xiàn)的。

    清單7:使用javax.swing.SwingWorker的initMap()內(nèi)容

    private void initMap() {SwingWorker<ShapeLayer, Void> worker = new SwingWorker<ShapeLayer, Void>() {@Overridepublic ShapeLayer doInBackground() {PropertyHandler propertyHandler = null;try {propertyHandler = new PropertyHandler.Builder().setPropertiesFile("./openmap.properties").build();} catch (IOException ex) {Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex);}ShapeLayer shapeLayer = new ShapeLayer();if (propertyHandler != null) {shapeLayer.setProperties(propertyHandler.getProperties());}return shapeLayer;}@Overrideprotected void done() {try {if (!isCancelled()) {// Add the political layer to the mapmapBean.add(get());MapFrame.this.revalidate();}} catch (InterruptedException | ExecutionException ex) {Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex);}}};// invoke background threadworker.execute(); }

    com.bbn.openmap.util.SwingWorker

    第二種解決方案使用OpenMap提供的SwingWorker (清單8)。 這是Java Swing的SwingWorker的簡化版本。 參數(shù)化類型( ShapeLayer )是Construct()方法的返回類型。 在這里,我們將ShapeLayer的創(chuàng)建重構為其自己的方法getShapeLayer() (清單9)。

    清單8:使用com.bbn.openmap.util.SwingWorker的initMap()內(nèi)容

    private void initMap() {com.bbn.openmap.util.SwingWorker<ShapeLayer> worker = new com.bbn.openmap.util.SwingWorker<ShapeLayer>() {@Overridepublic ShapeLayer construct() {return getShapeLayer();}@Overridepublic void finished() {// Add the political layer to the mapmapBean.add(get());MapFrame.this.revalidate();}};// invoke background threadworker.execute(); }

    要啟動后臺線程,我們調(diào)用SwingWorker的execute()方法。 這樣可以安排線程執(zhí)行并立即返回。 后臺任務完成后,將在EDT中調(diào)用重寫的finished()方法。 使用此方法可以在其中放置代碼以更新或刷新GUI。 Method get()阻塞,直到后臺任務完成為止。 但是,如果在方法finished()調(diào)用get() ,則由于后臺任務已完成,因此不會發(fā)生阻塞。 在此方法中,我們將圖層添加到mapBean 。 但是,由于已經(jīng)渲染了MapFrame ,因此也需要刷新它才能渲染地圖圖層。 這是通過重新驗證MapFrame來實現(xiàn)的。

    如果添加Thread.sleep(10_000);則可以在快速計算機中完成此操作Thread.sleep(10_000); construct()方法中return語句之前的語句。 您應該看到應用程序的窗口沒有等待SwingWorker完成其工作才能顯示。

    清單9:getShapeLayer()重構方法

    private ShapeLayer getShapeLayer() {PropertyHandler propertyHandler = null;try {propertyHandler = new PropertyHandler.Builder().setPropertiesFile("./openmap.properties").build();} catch (IOException ex) {Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex);}ShapeLayer shapeLayer = new ShapeLayer();if (propertyHandler != null) {shapeLayer.setProperties(propertyHandler.getProperties());} // try { // Thread.sleep(10_000); // } catch (InterruptedException ex) { // Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex); // }return shapeLayer; }

    java.awt.SecondaryLoop

    第三種解決方案使用SecondaryLoop(清單11)。 該接口提供了兩種方法enter()和exit() ,可用于啟動和停止事件循環(huán)。 即使屬性的加載和形狀層的創(chuàng)建是在不同的線程中完成的,UI也沒有響應,并且正在等待工作線程完成之后才在屏幕上呈現(xiàn)。

    在JavaDoc中:“當調(diào)用enter()方法時, 當前線程將被阻塞,直到循環(huán)被exit()方法終止為止。 同樣,新的事件循環(huán)在事件分發(fā)線程上啟動,該線程可能是當前線程,也可能不是當前線程。 通過調(diào)用其exit()方法,可以在任何線程上終止該循環(huán)。 […]應用此接口的典型用例是AWT和Swing模態(tài)對話框。 當模式對話框顯示在事件分發(fā)線程上時,它將進入一個新的輔助循環(huán)。 稍后,當對話框被隱藏或放置時,它退出循環(huán),線程繼續(xù)執(zhí)行。” 換句話說,它確實阻塞了當前線程,因此在所有情況下都不是SwingWorker的“替代”。 沒有像SwingWorker中那樣的done()回調(diào)方法,您可以在不阻塞當前線程的情況下調(diào)用get() 。

    清單10:使用SecondaryLoop的initMap()內(nèi)容

    private void initMap() {final ShapeLayer shapeLayer = new ShapeLayer();final SecondaryLoop loop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();Thread work = new Thread() {@Overridepublic void run() {PropertyHandler propertyHandler = null;try {propertyHandler = new PropertyHandler.Builder().setPropertiesFile("./openmap.properties").build();} catch (IOException ex) {Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex);}if (propertyHandler != null) {shapeLayer.setProperties(propertyHandler.getProperties());}loop.exit();}};// We start the thread to do the real work work.start();// Blocks until loop.exit() is called loop.enter();// Add the political layer to the mapmapBean.add(shapeLayer); }

    java.util.concurrent.CompletableFuture

    Java 8提供了一個新類CompletableFuture 。 CompletableFuture<T>通過提供功能性的單子運算并促進異步的,事件驅(qū)動的編程模型(而不是在較早的Java中進行阻止)來擴展Future<T> 。

    您需要具有JDK 8或更高版本才能使用它。 如果沒有,請右鍵單擊OpenMap項目,然后選擇Properties 。 選擇類別庫,然后選擇Java 8 Java平臺(您可能需要通過單擊“ 管理平臺”按鈕并導航到下載和安裝JDK 8的文件夾來添加新的Java 8平臺)。 然后,選擇Sources類別,并將Source / Binary Format更改為JDK 8

    通常,Future表示由其他線程運行的一段代碼,但它們不是異步的,即,您不能告訴它們異步執(zhí)行任務并在將來的某個時間返回結(jié)果。 在這種情況下,您可以簡單地創(chuàng)建一個CompletableFuture并將其返回給客戶端,并且只要您認為結(jié)果可用,就可以complete()將來)并解鎖所有等待該將來的客戶端。 當然,像SwingWorker一樣,有一個阻塞的get()方法。

    CompletableFuture提供了異步方法和非異步方法,這些方法在與先前任務不同的另一個線程中執(zhí)行其任務, 而非異步方法在與先前任務相同的線程中執(zhí)行其任務。 在異步方法中,任務被提交到fork-join線程池,完成后,結(jié)果將傳遞到下一個任務。 下一個任務完成時,其結(jié)果將進一步發(fā)送,依此類推。 它非常簡潔明了。

    清單11:使用CompletableFuture的initMap()內(nèi)容

    private void initMap() {CompletableFuture.supplyAsync(() -> getShapeLayer()).thenAcceptAsync(shapeLayer -> {// Add the political layer to the mapmapBean.add(shapeLayer);MapFrame.this.revalidate();}); }

    修改后的initMap()如清單11所示。您可以通過調(diào)用supplyAsync()并傳遞Supplier ( () -> getShapeLayer() )向JDK 8中引入的全局通用ForkJoinPool.commonPool()提供新任務。 。 如果您不想使用公共線程池,還有一個重寫的supplyAsync()方法可以接受執(zhí)行程序。 Supplier<R>是Java 8中引入的新接口,它不接受任何參數(shù)并返回類型R的值(在本例中為ShapeLayer )。

    您可以使用thenApply()或thenApplyAsync()方法(接受Function<T, R> )來應用進一步的處理,但是在我們的示例中thenApplyAsync() 。

    您可以使用非阻塞的 thenAccept()或thenAcceptAsync()方法異步地返回結(jié)果,該方法接受Consumer<T> 。 它們使您可以在準備就緒時消費未來的價值。 Consumer<T>與Supplier<R>; 它接受類型T的參數(shù)并返回void 。

    看看最后一個解決方案有多優(yōu)雅。

    結(jié)論

    我們在OpenMap的第一個教程中走了很長一段路。 我們學習了如何在NetBeans IDE(它是一個Swing JFrame創(chuàng)建MapFrame ,并了解了如何使用IDE將OpenMap JavaBeans添加到Palette,然后將MapBean拖到MapFrame 。 我們學習了如何向MapBean添加圖層以顯示.shp地圖文件。 通過屬性文件配置層。 我們看到了如何使用PropertyHandler讀取屬性。 我們還看到了四種從不同線程加載地圖文件的方法,即使地圖文件加載時間過長,也可以使MapFrame保持響應。

    在下一個教程中,我們將更深入地了解有關MapHandler的OpenMap內(nèi)部。

    翻譯自: https://www.javacodegeeks.com/2015/10/openmap-tutorial-part-1.html

    總結(jié)

    以上是生活随笔為你收集整理的OpenMap教程–第1部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久久国产精品视频 | 无码人妻精品中文字幕 | 欧美日韩一区二区三区四区五区六区 | 2022国产精品 | 欧美天天性影院 | 色噜噜成人 | 久久视频免费在线观看 | 夜夜夜操操操 | 91精品国产综合久久精品图片 | 聚色av | 亚洲色成人一区二区三区小说 | 操日本女人 | 国产久在线 | 高清二区 | 成人勉费视频 | 久久在线中文字幕 | 秋霞一区| 久操免费在线 | 亚洲国产精品久久久久爰色欲 | 日韩伦理在线视频 | 污污网址在线观看 | 老牛嫩草二区三区观影体验 | 黄色草逼网站 | 中文字幕精品三区 | 久久精品欧美一区二区三区麻豆 | 懂色av一区二区三区免费观看 | 中文字幕91 | 中国国产bdsm紧缚捆绑 | 国产高清免费在线 | 欧美亚洲一区二区三区四区 | 韩国美女主播跳舞 | 日本电影一区二区三区 | 精品成人无码久久久久久 | 日本视频二区 | 在线观看免费高清视频 | 欧美日韩精品一区二区 | 国产极品在线播放 | av网站国产 | 欧美情爱视频 | 欧美成人资源 | 国产精品久久777777换脸 | 多毛的亚洲人毛茸茸 | 久久精品69 | 亚洲综合在线中文字幕 | 久久久久久免费毛片精品 | 激情小说专区 | 久久久蜜桃一区二区 | 国产激情一区二区三区在线观看 | 国产午夜精品久久久久 | 超碰91人人| 先锋资源在线视频 | 狼人久久| 涩涩涩涩涩涩涩涩涩涩 | 人人看人人艹 | 日韩激情电影在线 | 免费的黄色一级片 | 999伊人| 日本一级做a爱片 | 色哟哟免费 | 久久伊人av| 在线播放不卡 | 四色永久访问 | 一区二区视频免费看 | 爱爱免费视频 | 制服av在线 | 国产毛片一区二区三区va在线 | 蜜桃色一区二区三区 | 在线日韩成人 | 国产乱国产乱300精品 | 69国产成人精品二区 | 熟女视频一区二区三区 | 亚洲成人免费在线视频 | 毛片在线免费观看视频 | 久久久久免费视频 | www.一区二区三区四区 | 秋霞午夜| 中国少妇乱子伦视频播放 | 丰满人妻一区二区三区免费 | 人妻天天爽夜夜爽一区二区三区 | 国产成人精品亚洲日本在线观看 | 久久日视频 | 欧美色鬼 | 露胸app | 天天干视频在线 | 日本不卡在线 | 一二三区精品视频 | 国产精品丝袜黑色高跟鞋的设计特点 | 农村老妇性真猛 | 日日摸夜夜添夜夜 | 91高清视频在线 | 夜色成人网 | 一级特黄妇女高潮2 | 99这里只有精品 | 国产精品久久久久毛片软件 | 中国大陆高清aⅴ毛片 | 国自产拍偷拍精品啪啪一区二区 | 日韩超碰在线 | 国产精品国产馆在线真实露脸 | 一级淫片免费 |