`
longgangbai
  • 浏览: 7325381 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GIS的学习(十九)Geoserver使用添加,删除,查询地图中的POI

阅读更多

   在geoserver自定义的地图中通过geoserver wfs 查询,删除,添加相关的POI。

相关操作的格式如下:

查询

<wfs:GetFeature service="WFS" version="1.0.0"  
       outputFormat="GML2"  
       xmlns:opengis="http://www.cetusOpengis.com"  
       xmlns:wfs="http://www.opengis.net/wfs"  
       xmlns:ogc="http://www.opengis.net/ogc"  
       xmlns:gml="http://www.opengis.net/gml"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.opengis.net/wfs   http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">   
       <wfs:Query typeName="opengis:qqy">   
      <ogc:Filter>   
      <ogc:PropertyIsEqualTo>
      <ogc:PropertyName>status</ogc:PropertyName>
      <ogc:Literal>0</ogc:Literal>
      </ogc:PropertyIsEqualTo>
     </ogc:Filter>   
       </wfs:Query>   
    </wfs:GetFeature>;

 

添加

<wfs:Transaction service="WFS" version="1.0.0"  
       outputFormat="GML2"  
       xmlns:opengis="http://www.cetusOpengis.com"  
       xmlns:wfs="http://www.opengis.net/wfs"  
       xmlns:ogc="http://www.opengis.net/ogc"  
       xmlns:gml="http://www.opengis.net/gml"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.opengis.net/wfs   http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">   
       <wfs:Insert handle="someprj1">
          <opengis:someprj>
             <opengis:the_geom>
                <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#3395" >
                             <gml:coordinates decimal="." cs="," ts="">13404701.212,3850391.781</gml:coordinates>
                </gml:Point>
             </opengis:the_geom>
             <opengis:ssds>13</opengis:ssds>
             <opengis:qqybh>12</opengis:qqybh>
             <opengis:status>0</opengis:status>
          </opengis:someprj>
       </wfs:Insert>  
    </wfs:Transaction>;

修改

<wfs:Transaction service="WFS" version="1.0.0"  
       outputFormat="GML2"  
       xmlns:opengis="http://www.cetusOpengis.com"  
       xmlns:wfs="http://www.opengis.net/wfs"  
       xmlns:ogc="http://www.opengis.net/ogc"  
       xmlns:gml="http://www.opengis.net/gml"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.opengis.net/wfs   http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">   
       <wfs:Update typeName="opengis:qqyproject">
     <wfs:Property>  
       <wfs:Name>qqybh</wfs:Name>
       <wfs:Value>12</wfs:Value>
     </wfs:Property>
      <ogc:Filter>   
      <ogc:PropertyIsEqualTo>
      <ogc:PropertyName>qqybh</ogc:PropertyName>
      <ogc:Literal>0</ogc:Literal>
      </ogc:PropertyIsEqualTo>
     </ogc:Filter>   
       </wfs:Update>   
    </wfs:Transaction>;

 

 

删除

<wfs:Transaction service="WFS" version="1.0.0"  
       outputFormat="GML2"  
       xmlns:opengis="http://www.cetusOpengis.com"  
       xmlns:wfs="http://www.opengis.net/wfs"  
       xmlns:ogc="http://www.opengis.net/ogc"  
       xmlns:gml="http://www.opengis.net/gml"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.opengis.net/wfs   http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">   
       <wfs:Delete typeName="opengis:qqyproject">
      <ogc:Filter>   
      <ogc:PropertyIsLessThan>
      <ogc:PropertyName>qqybh</ogc:PropertyName>
      <ogc:Literal>12</ogc:Literal>
      </ogc:PropertyIsLessThan>
      <ogc:PropertyIsGreaterThan>
      <ogc:PropertyName>qqybh</ogc:PropertyName>
      <ogc:Literal>0</ogc:Literal>
      </ogc:PropertyIsGreaterThan>
     </ogc:Filter>   
       </wfs:Delete>   
    </wfs:Transaction>;

 

 

具体实现如下:

package com.geoserver;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 操作geoserver的几种方法
 * 
 * 
 * 
 * @Title: TODO
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:
 * @Date:2012-8-30
 * @author 
 * @version 1.0
 */
public class MainGeoService {

	public static void main(String[] args) {
		addGeoServerService();
		
	
	}
	/**
	 * 添加地图定的信息
	 */
	public static void addGeoServerService(){
		String layerName="loc_point";
		String namespaceValue="http://www.easyway.net.cn";
		double lat=139.54d;
		double lon=-116.23d;
		
		 Map<String,String> params=new HashMap<String,String>();
		 params.put("FID", "loc_point.4");
		 params.put("NAME", "easyway_001");
		 params.put("OBJECT_CODE", "beijing_tsingperk_768");
		 params.put("HANDLE_ID", "768");
		 params.put("STATUS", "1");
		 params.put("DESCRIPTION", "this is point add by programe");
			
		 
		StringBuffer sb = new StringBuffer();
		sb.append("<wfs:Transaction service='WFS' version='1.0.0'   ");
		sb.append("outputFormat='GML2'   ");
		sb.append(" xmlns:opengis='"+namespaceValue+"'   ");
		sb.append(" xmlns:wfs='http://www.opengis.net/wfs'   ");
		sb.append(" xmlns:ogc='http://www.opengis.net/ogc'   ");
		sb.append(" xmlns:gml='http://www.opengis.net/gml'   ");
		sb.append("xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'   ");
		sb.append(" xsi:schemaLocation='http://www.opengis.net/wfs   http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd'>   "); 
		sb.append(" <wfs:Insert handle='"+layerName+"'>");
		sb.append("  <opengis:"+layerName+">");
		sb.append("    <opengis:the_geom>");
		sb.append("     <gml:Point srsName='http://www.opengis.net/gml/srs/epsg.xml#3395' >");
		sb.append(" 	<gml:coordinates decimal='.' cs=',' ts=' '>"+lat+","+lon+"</gml:coordinates>");
		sb.append("   </gml:Point>");
		sb.append(" </opengis:the_geom>");
		
		if(!params.isEmpty()){
			for (Entry<String,String> entry : params.entrySet()) {
				sb.append("      <opengis:"+entry.getKey()+">"+entry.getValue()+"</opengis:"+entry.getKey()+">");
			}
		}
		sb.append("  </opengis:"+layerName+">");
		sb.append(" </wfs:Insert>   ");
		sb.append(" </wfs:Transaction>");
		String response = HttpUtils.doGeoServerPOST(
				"http://10.100.108.20:8080/geoserver/wfs?outputFormat=json",
				sb.toString());
		System.out.println("response:");
		System.out.println("" + response);
	}
	/**
	 * 查询地图中的访问
	 * 假定我们指定的查询范围为bbox,根据上述参数设定,进行范围查询的Url为:
	 * “WfsUrl?REQUEST=GetFeature&typeName= WfsNamespace : WfsLayerName &bbox=bbox&outputFormat=json”。
	 * bbox是怎么来的呢?bbox实际上描绘的是一个矩形,假定矩形左下角的点是Max(x1,y1),右上角的点是Min(x2,y2),
	 * 则bbox是形如“x1,y1,x2,y2”的一个字符串。
	 */
	public static void queryRangeGeoServerService() {
		//空间 
		String namespace="jacob";
		//图层名称
		String layerName="loc_point";
		 
		double minX=40.34d;
		double minY=65.344d;
		double maxX=45.34d;
		double maxY=67.34d;
		 
		String queryRangeURL="http://10.100.108.20:8080/geoserver/wfs?REQUEST=GetFeature&typeName="+namespace+":"+layerName+"&bbox="+minX+","+minY+","+maxX+","+maxY+"&outputFormat=json";
		String response = HttpUtils.doGeoServerPOST(queryRangeURL,"");
		System.out.println("response:");
		System.out.println("" + response);
	}
	/**
	 * 查询名称为cesuo 的地方
	 * 
	 */
	public static void queryGeoServerService() {
		 String namespace="jacob";
		 String namespaceValue="http://www.easyway.net.cn";
		 String layerName="loc_point";
		 Map<String,String> params=new HashMap<String,String>();
		 params.put("Name", "cesuo");
		 
		StringBuffer sb = new StringBuffer();
		sb.append("<w:GetFeature service='WFS' version='1.1.0' ");
		sb.append(" xmlns:w='http://www.opengis.net/wfs' ");
		sb.append(" xmlns:f='"+namespaceValue+"' ");
		sb.append(" xmlns:g='http://www.opengis.net/gml' ");
		sb.append(" xmlns:o='http://www.opengis.net/ogc' ");
		sb.append(" x:schemaLocation='http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd WfsUrl/DescribeFeatureType?version=1.1.0&amp;typename="+namespace+":"+layerName+"' ");
		sb.append(" xmlns:x='http://www.w3.org/2001/XMLSchema-instance'>");
		sb.append(" <w:Query typeName='f:"+layerName+"'>");
		sb.append("  <o:Filter>");
		sb.append("     <o:PropertyIsEqualTo>");
		if(!params.isEmpty()){
			for (Entry<String,String> entry : params.entrySet()) {
				sb.append("      <o:PropertyName>f:"+entry.getKey()+"</o:PropertyName>");
				sb.append("       <o:Literal>"+entry.getValue()+"</o:Literal>");
			}
		}
		sb.append("   </o:PropertyIsEqualTo>");
		sb.append(" </o:Filter>");
		sb.append(" </w:Query>");
		sb.append("</w:GetFeature>");
		String response = HttpUtils.doGeoServerPOST(
				"http://10.100.108.20:8080/geoserver/wfs?outputFormat=json",
				sb.toString());
		System.out.println("response:");
		System.out.println("" + response);
	}

	/**
	 * 
	 * 假定我们要删除的STATE_NAME为北京的点,则根据上述参数设定,此查询的url为:WfsUrl,
	 * 同时需要将如下形式的参数信息,提交到服务器。如以post的方式,
	 * 将参数信息写入HttpWebRequest的RequestStream中。
	 * 
	 */
	public static void deletePointGeoServerService() {
		
		 String namespace="jacob";
		 String namespaceValue="http://www.easyway.net.cn";
		 String layerName="loc_point";
		 Map<String,String> params=new HashMap<String,String>();
		 params.put("Name", "cesuo");
		
		StringBuffer sb = new StringBuffer();
		sb.append("<w:Transaction xmlns:w='http://www.opengis.net/wfs' ");
		sb.append(" xmlns:f='"+namespaceValue+"' xmlns:g='http://www.opengis.net/gml' ");
		sb.append("	 service='WFS' version='1.1.0' xmlns:o='http://www.opengis.net/ogc' ");
		sb.append("	 x:schemaLocation='http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd WfsUrl /DescribeFeatureType?version=1.1.0&amp;typename="+namespace+":"+layerName+" ' xmlns:x='http://www.w3.org/2001/XMLSchema-instance'>");
		sb.append("   <w:Delete typeName='f:"+layerName+"'>");
		sb.append("  <o:Filter>");
		sb.append("    <o:PropertyIsEqualTo>");
		if(!params.isEmpty()){
			for (Entry<String,String> entry : params.entrySet()) {
				sb.append("      <o:PropertyName>f:"+entry.getKey()+"</o:PropertyName>");
				sb.append("       <o:Literal>"+entry.getValue()+"</o:Literal>");
			}
		}
		sb.append("   </o:PropertyIsEqualTo>");
		sb.append("        </o:Filter>");
		sb.append("     </w:Delete>");
		sb.append(" </w:Transaction>");
		String response = HttpUtils.doGeoServerPOST(
				"http://10.100.108.20:8080/geoserver/wfs?outputFormat=json",
				sb.toString());
		System.out.println("response:");
		System.out.println("" + response);
	}
}

 

http工具类:
package com.geoserver;

import java.io.IOException;
import java.io.ObjectInputStream;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @Title: TODO
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:
 * @Date:2012-8-30
 * @author 
 * @version 1.0
 */
public class HttpUtils {

	private final static Logger logger = LoggerFactory.getLogger(HttpUtils.class);
	

	private static final int	DEFAULT_CONN_TIMEOUT_MILLISECONDS	= 5 * 1000;

	private static final int	DEFAULT_READ_TIMEOUT_MILLISECONDS	= 60 * 1000;


	private static final String CHARSET = "utf-8";
	
	private static HttpClient httpClient;
	
	static HttpHost	proxy;

	static {
		proxy = new HttpHost("10.0.0.172", 80);
	}
	
	private static HttpClient initHttpClient(String charset) {
        if (charset == null)
            charset = System.getProperty("sun.jnu.encoding");
        releaseConnection();
        
        // 设置我们的HttpClient支持HTTP和HTTPS两种模式
		SchemeRegistry schemeRegistry = new SchemeRegistry();
		schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
		schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));

		// 使用线程安全的连接管理来创建HttpClient
		/*ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(schemeRegistry);
		connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);
		connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);*/
		httpClient = new DefaultHttpClient();

		/*HttpParams params = httpClient.getParams();
		params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,
				DEFAULT_CONN_TIMEOUT_MILLISECONDS);
		params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,
				DEFAULT_READ_TIMEOUT_MILLISECONDS);*/
		
		setConnectTimeout(DEFAULT_CONN_TIMEOUT_MILLISECONDS);
		setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
		
		return httpClient;
	}
	
	



	/**
	 * HTTP post请求
	 * 
	 * @param url
	 *            请求地址
	 * @param parmsMap
	 *            post数据
	 * @return
	 */
	public static String doGeoServerPOST(String url, String requst) {
		HttpPost httpPost = null;
		HttpResponse httpResponse = null;
		ObjectInputStream ois = null;
		try {
			if (httpClient == null)
	            initHttpClient(CHARSET);
			
			httpPost = new HttpPost(url);
			// 绑定参数Entity
			StringEntity stringEntity = new StringEntity(requst, CHARSET);
			httpPost.setEntity(stringEntity);
			// 发送请求
			httpResponse = httpClient.execute(httpPost);

			if (httpResponse.getStatusLine().getStatusCode() == 200) {
				Header[] headers = httpResponse.getAllHeaders();
				for(Header h : headers){
					System.err.println(h.getName() + " : " + h.getValue());
				}
				HttpEntity entity = httpResponse.getEntity();
				return EntityUtils.toString(entity);
			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (ois != null) {
					ois.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			httpClient.getConnectionManager().shutdown();
		}
	}

	/** 
     * Set the connection timeout for the underlying HttpClient. A timeout value 
     * of 0 specifies an infinite timeout. 
     *  
     * @param timeout the timeout value in milliseconds 
     */  
    private static void setConnectTimeout(int timeout) {  
        httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,  
                timeout);  
    }  
  
    /** 
     * Set the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout 
     * for waiting for data or, put differently, a maximum period inactivity 
     * between two consecutive data packets.A timeout value of 0 specifies an 
     * infinite timeout. 
     *  
     * @param timeout the timeout value in milliseconds 
     */  
    private static void setReadTimeout(int timeout) {  
        httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeout);  
    }
    

    private static void releaseConnection() {
        if (httpClient != null)
        	httpClient.getConnectionManager().shutdown();
    }
    

}
 
分享到:
评论
1 楼 qcsjliu 2015-01-10  
采用这种方式,插入要素到shapfile中中文属性出现乱码,这该怎么解决。

相关推荐

    Geoserver添加shp地图的方法

    本文将详细介绍如何在geoserver服务器中添加shp类型的地图,从而解决中文乱码和地图图层中中文不显示的问题。 一、设置自定义style 在geoserver中添加shp地图之前,需要先设置自定义style。首先,打开geoserver...

    leaflet结合geoserver实现地图属性查询.zip

    在GIS(地理信息系统)领域,Leaflet和GeoServer是两个重要的工具。Leaflet是一个轻量级的JavaScript库,用于创建交互式地图...这个过程涉及到GIS服务的发布、地图交互以及地理信息的查询,是Web GIS开发中的基础操作。

    leaflet结合geoserver实现地图空间查询.zip

    本文将深入探讨如何使用Leaflet JavaScript库与GeoServer集成,实现地图空间查询的功能。 **Leaflet简介** Leaflet是一个轻量级、开源的JavaScript库,专门用于创建移动友好、交互式的Web地图。它提供了丰富的API,...

    geoserver发布mongodb矢量数据地图服务.docx

    本文将介绍如何使用Geoserver将MongoDB矢量数据发布为地图服务。 一、Geoserver概述 Geoserver是基于Java开发的一款开源GIS服务器,能够处理大量的空间数据,提供了强大的空间数据存储、处理和发布功能。Geoserver...

    【GIS地图服务】geoserver-2.24.1-war.zip

    【GIS地图服务】geoserver-2.24.1-war.zip是一个专注于地理信息系统(GIS)的开源项目,它基于Java技术实现,并符合开放地理空间联盟(OGC)的标准。这个压缩包包含了geoserver的2.24.1版本,以war(Web ARchive)...

    geoserver中Google地图样式SLD.rar

    总的来说,这个压缩包提供了自定义GeoServer地图样式的重要资源,使得开发者和GIS专业人员能够轻松地将GeoServer集成到他们的项目中,创建出与Google地图风格一致的互动地图服务,提高用户体验。同时,这也展示了SLD...

    geoserver 地图专题图

    【标题】"geoserver 地图专题图" 涉及的是使用Geoserver结合OpenLayers创建地图专题图的技术。地图专题图是地理信息系统(GIS)中的一个重要概念,它允许用户根据特定主题或变量来可视化地理数据。在这种情况下,...

    cesium结合geoserver实现地图属性查询.zip

    在IT行业中,尤其是在地理信息系统(GIS)领域,Cesium和GeoServer是两个非常重要的工具。Cesium是一款基于WebGL的开源3D地球浏览器,能够提供交互式的三维地球展示,而GeoServer则是一个开放源码的GIS服务器,它...

    openlayer调用geoserver发布的地图实现地图的基本功能

    在IT行业中,地图服务是许多应用的核心组成部分,OpenLayers和GeoServer是两个广泛使用的开源工具,它们分别在前端和后端发挥着重要作用。OpenLayers是一个JavaScript库,用于在Web浏览器中展示地图,而GeoServer是...

    地图服务器基于geoserver改造

    总结起来,"地图服务器基于geoserver改造"是一个将开源GeoServer与Tomcat结合的项目,旨在提供一个易于部署和使用的GIS服务。改造的核心在于利用Tomcat的便利性和GeoServer的强大功能,为用户提供一个高效、稳定的...

    geoserver 开源gis服务器

    GeoServer是一款开源的GIS(地理信息系统)服务器,它基于Java技术构建,并遵循GNU General Public License。作为GIS领域的重要工具,GeoServer提供了丰富的功能,用于发布、管理和共享地理空间数据。这款服务器是...

    Geoserver使用最全详解

    GeoServer是一个开源的用于共享地理空间数据的服务器,它支持使用开放标准对多数主要空间数据源进行发布。GeoServer实现了行业标准的OGC协议,如Web Feature Service(WFS)、Web Map Service(WMS)和Web Coverage ...

    GeoServer瓦片缓存机制研究

    但是,在面对庞大地图数据、庞大的用户交互时,如果仅仅采用 GeoServer 作为 GIS 服务器,势必导致地图数据传输缓慢甚至获取服务出错。为了解决这个问题,本文研究了 GeoServer 中的瓦片缓存机制,包括瓦片金字塔的...

    geoserver wfs过滤查询

    在本例子中,我们将讨论如何在GeoServer中利用WFS的过滤查询功能来获取特定记录。 首先,WFS的GetFeature请求是用来从服务器获取地理特征的重要方法。在这个例子中,我们看到一个`&lt;wfs:GetFeature&gt;`元素,它包含了...

    geoserver中文开发手册.zip_GeoServer 地图服务_geoserver_geoserver手册

    GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

    Geoserver中文教程

    通过上述步骤,用户可以完成JDK、Geoserver、uDig的安装配置以及Geoserver图层发布、样式配置,并在UCMap中访问地图服务。这些操作是地理信息系统开发和管理工作中常见的基础任务,掌握它们对于从事相关领域的IT专业...

    Geoserver学习测试代码

    【标题】"Geoserver学习测试代码"是一个关于使用Geoserver进行GIS(地理信息系统)开发的实践项目,主要基于Geoserver 2.1.2版本。该项目旨在解决网络上关于Geoserver实际操作代码的稀缺问题,通过参照最新的...

    cesium结合geoserver实现地图空间查询.zip

    在GIS(地理信息系统)领域,将Cesium与GeoServer整合以实现地图空间查询是一种常见的实践。Cesium是一款强大的开源Web GIS库,它提供了交互式的3D地球浏览体验,而GeoServer则是一个流行的开源地理空间服务器,能够...

    openlayers3+geoserver地图交互

    然后,我们向GeoServer发送WFS请求,查询在选定区域内的所有要素,并更新地图显示。 在开发这样的应用时,需要注意的是,正确配置GeoServer的数据发布,确保WMS和WFS服务正常工作。同时,OpenLayers 3的配置也需要...

    uDig定制地图样式发布到Geoserver并使用Openlayers和Cesium验证.rar

    尽管描述中没有明确提到使用Cesium验证,但结合上下文,可能意味着将尝试在Cesium中加载和展示由uDig和Geoserver处理的地图数据,以测试其在3D环境中的表现。 项目中提供的文档很可能是详细步骤指南,涵盖了如何...

Global site tag (gtag.js) - Google Analytics