Heim  >  Artikel  >  Web-Frontend  >  Mit welchen Methoden implementiert OPENLAYERS3 die Klickauswahl?

Mit welchen Methoden implementiert OPENLAYERS3 die Klickauswahl?

零下一度
零下一度Original
2017-07-16 14:37:451765Durchsuche

In der WebGIS-Entwicklung ist die Klickabfrage die am häufigsten verwendete Abfragemethode. In der ArcGIS-API heißt diese Abfrage IdentifyTask. Ihre Hauptfunktion besteht darin, Parameter an der Rezeption zu übermitteln und zur Abfrageanalyse zurückzugeben. Dieser Artikel implementiert Klickabfragen auf verschiedene Weise aus der Perspektive eines Open-Source-Frameworks, von der Rezeption über den Server bis zur Datenbank. Die trockenen Informationen lauten wie folgt:

1.1 SelectController

Für Vektordaten bietet die offizielle Website-Demo in Ol3 ein Select-Steuerelement zur Realisierung Mausauswahl. Abfrage, der Code lautet wie folgt:


//定义select控制器
var select= new ol.interaction.Select();
map.addInteraction(select);//map加载该控件,默认是激活可用的
select.on('select', function(e) {
   console.log(e.selected); //打印已选择的Feature
});

1.2 Kartenklickereignis

Diese Methode , klicken Sie mit der Maus auf Koordinaten, führen Sie eine Schnittpunktanalyseabfrage mit der aktuellen Vektorbildebene durch und erhalten Sie die abgefragten Elemente und die zugehörigen Ebenenobjekte


//地图单机事件
  map.on('singleclick',mapClick);

  function mapClick(e){
    var pixel = map.getEventPixel(e.originalEvent);
    var featureInfo = map.forEachFeatureAtPixel(pixel,
        function (feature, layer) {
          return {feature:feature,layer:layer};
        });
    if (featureInfo!==undefined&&featureInfo!==null
    &&featureInfo.layer!==null)
    {
      console.log('打印选择要素');
      console.log(featureInfo .feature);
      console.log('打印选择要素所属Layer');
      console.log(featureInfo .layer);
    }
  }

1.3 GetFeatureInfo

der WMS-Ebene Für Vektorebenen können wir eine Klickabfrage über die erste und zweite Methode implementieren. Allerdings handelt es sich bei unserer Basiskarte häufig um einen WMS-Dienst. Derzeit können wir Click-to-Click-Abfragen über GetFeatureInfo des WMS-Protokolls implementieren.


//模拟查询的wms图层名称比如是wmsLayer
//该wmsLayer的数据源是墨卡托的3857举例
map.on('click',mapClick);
function mapClick(evt){
  var viewResolution = map.getView().getResolution();

  var url = wmsLayer.getSource().getGetFeatureInfoUrl(
     evt.coordinate, viewResolution, 'EPSG:3857',
     {
       'INFO_FORMAT': 'text/javascript',//geoserver支持jsonp才能输出为jsonp的格式
       'FEATURE_COUNT': 50   //点击查询能返回的数量上限
     });
   $.ajax({
      type: 'GET',
      url:url,
      dataType: 'jsonp',
      jsonp:'format_options',
      jsonpCallback:"callback:success_jsonpCallback"
   });
}
//回调函数接收查询结果
 var geojsonFormat=new ol.format.GeoJSON({defaultDataProjection:"EPSG:3857"});
function success_jsonpCallback(res)
{
   var features=geojsonFormat.readFeatures(res);
   console.log('点击查询返回的结果如下:');
   console.log(features);
}

1.4 Abfrage über Geoservers WFS

WFS kann Bedingungen oder Grafiken über Filter Attribute übermitteln Abfrage oder räumliche Abfrage, in diesem Absatz werden trockene Informationen verwendet, um auszudrücken, wie die WFS-Abfrage verwendet wird.


map.on('click',mapClick);
//点击地图查询
function mapClick(evt)
{
  var coor=evt.coordinate;
  coor=coor.join(',');
  //注意这里直接将点坐标提交,与图层做intersrct分析,对于面图层是没关系的。如果是查询,点或者线图形,一定要将coor先设置一个容差,经行buffer之后的图形,再去与图层叠加分析。不设置容差几乎就找不到了
  //图层的图形字段是geom,不同图层的图形字段都要自己先看下自己的,有的是the_geom,有的是shape等等,具体分析即可。
    var FILTER=&#39;<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"><Intersects><PropertyName>geom</PropertyName><gml:Point><gml:coordinates>&#39;+coor+&#39;</gml:coordinates></gml:Point>   </Intersects></Filter>&#39;;

  getFeature({
    typename:&#39;road:road_grid&#39;,//查询的服务图层名称
    filter:FILTER,//查询条件
    callback:&#39;getIdentifyroadGrid&#39;//查询的回调函数
  });
}
 var geojsonFormat=new ol.format.GeoJSON({defaultDataProjection:"EPSG:3857"});
function getIdentifyroadGrid(res)
{
   var features=geojsonFormat.readFeatures(res);
   console.log(&#39;点击查询返回的结果如下:&#39;);
   console.log(features);
}

//请求wfs数据
function getFeature(options)
{
  $.ajax(gisserverhost+&#39;geoserver/wfs&#39;,{
    type: &#39;GET&#39;,
    data: {
      service: &#39;WFS&#39;,
      version: &#39;1.1.0&#39;,
      request: &#39;GetFeature&#39;,
      typename: options.typename,
      srsname: options.srid,
      outputFormat: &#39;text/javascript&#39;,
      viewparams:options.viewparams,
      bbox:(options.extent===undefined)?undefined:options.extent.join(&#39;,&#39;) + &#39;,&#39;+options.srid,
      filter:options.filter
    },
    dataType: &#39;jsonp&#39;,
    jsonpCallback:&#39;callback:&#39;+options.callback,
    jsonp:&#39;format_options&#39;
  });

}

1.5 Die Methode zum Klicken, um

Seite über PostGIS abzufragen, sollte am einfachsten zu verwenden sein. Dabei werden die angeklickten geografischen Koordinaten an den Hintergrund gesendet, um sie zur Ausführung an die Datenbank zu übermitteln.


//其他省略,假设x,y是前台点击地图获取的坐标,坐标系假设只3857。
//这里假设后台获取了参数拼接sql提交数据库

SQL wie folgt ausführen: select * from t where ST_Intersect(t.geom,ST_GeomfromText('Point(x y)',3857));

Fertig!

Zusammenfassung

Durch Analogie und Integration muss es viele Möglichkeiten geben, ein Problem zu lösen. Es ist nicht „ein Weg in Huashan seit der Antike“. Natürlich ist der Zweck der verschiedenen Straßen derselbe, aber die Landschaft ist natürlich unterschiedlich. Wir konnten mindestens 5 Methoden verwenden, um die Ergebnisse von Klickabfragen zu erhalten. Dann werden sich die meisten Menschen fragen, welche der fünf Methoden besser und welche schlechter ist. Tatsächlich gibt es keine gute oder schlechte Methode, sondern nur, ob sie angemessen ist.

1 Die erste und zweite Methode: Vektordaten müssen dem Kartenclient hinzugefügt werden, bevor sie verwendet werden können. Wenn es sich um eine WMS-Ebene handelt, können sie nicht verwendet werden.
2 Die dritte Methode: WMS-Ebene. Derzeit können die ersten beiden Vektormethoden nicht verarbeitet werden. Die dritte Methode kann dieses Problem lösen.
3 Die vierte Methode: 123 Ob Vektor oder WMS, sie müssen in den Client geladen werden, bevor sie verwendet werden können. Aufgrund unterschiedlicher Anforderungen werden die von Geoserver veröffentlichten Ebenen jedoch manchmal nicht in den Client geladen, sodass beides möglich ist nicht mehr verwendet werden. Solange es jedoch veröffentlicht ist, kann das Ergebnis über die URL-Anfrage von wfs abgefragt werden, auch wenn sich das Abfrageobjekt nicht auf dem Client, sondern auf dem Server befindet.
4 Die fünfte Methode: Wie bei der vierten Methode werden die Daten aufgrund unterschiedlicher Geschäftsanforderungen manchmal nicht einmal freigegeben, sondern bleiben einfach in der Datenbank und müssen abgefragt werden. In diesem Fall die fünfte Methode ist genug. Natürlich sind die Methoden in der Datenbank im Allgemeinen bei großen Datenmengen und komplexen Transaktionsabfragen besser zu nutzen. Eine Ein-Klick-Abfrage ist etwas übertrieben.

Das obige ist der detaillierte Inhalt vonMit welchen Methoden implementiert OPENLAYERS3 die Klickauswahl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn