地理位置定位

本指南将对地理位置定位进行说明,并介绍如何使用 AdWords API 来为您的广告系列添加、获取及更新地理位置定位。我们还将介绍高级地理位置定位概念(如“所在位置”和“兴趣区域”),以及如何生成报告并评估广告系列的地理位置效果。

本指南中的代码示例使用的是 AdWords API Java 库。如果您想查找使用其他编程语言的客户端库,请参阅客户端库的完整列表。此外,使用客户端库只是建议而非强制要求;您也可以使用所选编程语言的任何 SOAP 套件来调用 API。

为什么地理位置定位如此重要?

借助地理位置定位,您可以针对某个特定地理区域的用户投放您的广告。例如,假设您要为某个连锁超市投放广告。如果不用地理位置定位,您的广告就会在全球所有区域展示,一些所在区域没有该连锁超市的用户可能也会点击您的广告。这不仅会浪费您的预算,而且不会给您的投资带来任何回报。而如果采用地理位置定位,您的广告系列就只会在您的超市设有网点的区域投放广告。这种方法还能让您直接定位搜索本地超市的客户。

通过使用 AdWords API,您可以根据国家/地区、区域或特定地理位置点的邻近区域来定位您的广告。

如需回顾地理位置定位的各项概念,请参阅这篇帮助中心文章

采用地理位置定位,将您的广告系列定位到某个区域

您可以将广告系列定位到特定的区域,这个区域可以是 AdWords 支持以地理位置定位方式定位到的任何地理区域,例如国家/地区、州或省、城市或邮政区域。每个可定位的地理位置都由一个专属的条件 ID 进行标识。

您可以使用 CampaignCriterionService 来为您的广告系列添加地理位置定位。以下代码段展示了如何将广告系列定位到加利福尼亚(美国)和墨西哥。

// Create locations. The IDs can be found in the documentation or
// retrieved with the LocationCriterionService.
Location california = new Location();
california.setId(21137L);
Location mexico = new Location();
mexico.setId(2484L);

List operations = new ArrayList();
for (Criterion criterion : new Criterion[] {california, mexico}) {
  CampaignCriterionOperation operation = new CampaignCriterionOperation();
  CampaignCriterion campaignCriterion = new CampaignCriterion();
  campaignCriterion.setCampaignId(campaignId);
  campaignCriterion.setCriterion(criterion);
  operation.setOperand(campaignCriterion);
  operation.setOperator(Operator.ADD);
  operations.add(operation);
}

CampaignCriterionReturnValue result = campaignCriterionService.mutate(operations
   .toArray(new CampaignCriterionOperation[operations.size()]));

如代码中所示,您需要为想要定位的每个区域创建 Location 对象,并使用 CampaignCriteronService.mutate() 添加这些对象。在此示例中,21137 是加利福尼亚的代码,2484 是墨西哥的代码。

Google 偶尔可能会因为不同的原因逐步淘汰一些地理位置条件:地理位置重组为更小(或更大)的区域、地缘政治变化等。您可以参考 Location 对象中的 targetingStatus 字段来确定地理位置的状态是 ACTIVEOBSOLETE 还是 PHASING_OUT。您还可以参阅这篇博文来了解有关逐步淘汰地理位置目标的详情。

查询区域的地理位置代码

如上所述,您需要创建含有相应代码的 Location 对象才能定位到相应的区域。您可以使用 LocationCriterionService 来查询地理位置的条件 ID。以下代码示例展示了如何根据地理位置名称来查询地理位置的条件 ID。

String[] locationNames = new String[] {"Quebec"};

Selector selector = new Selector();
selector.setFields(new String[] {"Id", "LocationName", "CanonicalName", "DisplayType",
   "ParentLocations", "Reach"});

selector.setPredicates(new Predicate[] {
  // Location names must match exactly, only EQUALS and IN are
  // supported.
  new Predicate("LocationName", PredicateOperator.IN, locationNames),
  // Set the locale of the returned location names.
  new Predicate("Locale", PredicateOperator.EQUALS, new String[] {"en"})
});

// Make the get request.
LocationCriterion[] locationCriteria = locationCriterionService.get(selector);

// Display the resulting location criteria.
for (LocationCriterion locationCriterion : locationCriteria) {
 String parentString =
     getParentLocationString(locationCriterion.getLocation().getParentLocations());
 System.out.printf("The search term '%s' returned the location '%s (%d)' of type '%s' "
     + "with parent locations '%s' and reach '%d'.\n",
    locationCriterion.getSearchTerm(),
    locationCriterion.getLocation().getLocationName(),
    locationCriterion.getLocation().getId(),
    locationCriterion.getLocation().getDisplayType(), parentString,
    locationCriterion.getReach());
}

/**
  * Helper function to format a string for parent locations.
  *
  * @param parents List of parent locations.
  * @return Formatted string representing parent locations.
  */
 public static String getParentLocationString(Location[] parents) {
   StringBuilder sb = new StringBuilder();
   if (parents != null) {
     for (Location parent : parents) {
       if (sb.length() > 0) {
         sb.append(", ");
       }
       sb.append(String.format("%s (%s)", parent.getLocationName(),
           parent.getDisplayType()));
     }
   } else {
     sb.append("N/A");
   }
   return sb.toString();
 }

上述代码示例会生成以下输出内容:

The search term 'Quebec' returned the location 'Quebec'(20123) of type 'Province'
with parent locations 'Canada (Country)' and reach '5070000'. The search term
'Quebec' returned the location 'Quebec City'(1002624) of type 'City' with parent
locations 'Quebec (Province), Canada (Country), ' and reach '356000'.

现在,您可以使用地理位置代码 20123 来定位到魁北克(省),而魁北克市的地理位置代码则是 1002624

您可以使用 LocationCriterionService 获取地理位置的上级位置。方法是将 ParentLocations 添加到选择器字段的列表中。例如,我们先前的代码返回了地理位置(魁北克市)及其上级位置(加拿大)。如果您要向客户显示地理位置分层列表,或在定位广告系列时为地理位置添加包含逻辑或排除逻辑,此功能将非常有用。

在处理上级地理位置时,请注意不要在层级中对地理位置的 displayType 做任何假设。例如,美国可以划分为若干个州,然后进一步划分为若干个城市,但并不是全世界的每个国家/地区都可以这样划分。

如果知道准确的地理位置名称,您就可以更有效地使用 LocationCriterionService。查询流程会设法匹配您指定的名称。如果想要获取许多区域的地理位置代码,较高效的做法是将列表保存在本地数据库中,并编写您自己的地理位置查询逻辑。您可以轻松查询地理位置的代码,或者从定位目标表(此表会定期更新最新的定位目标)下载包含所有代码的列表。

将广告系列定位到某个地理位置的邻近区域

有时候,您可能想要定位到比城市或国家/地区更加精准的地方。例如,您可能想在自己的超市周边 10 公里的范围内为其投放广告。在这种情况下,您可以使用邻近区域定位。创建邻近区域定位目标所需的代码与添加地理位置定位目标所需的代码类似,只是您必须创建 Proximity 对象,而不是 Location 对象。

// Create the address whose surrounding area you want to target.
Address myAddress = new Address();
address.setStreetAddress("38 avenue de l'Opéra");
address.setCityName("Paris");
address.setPostalCode("75002");
address.setCountryCode("FR");

// Use myAddress to create a Proximity object
Proximity proximity = new Proximity();
proximity.address = myAddress;
proximity.radiusDistanceUnits = ProximityDistanceUnits.KILOMETERS;
proximity.radiusInUnits = 10;

将广告系列定位到某个多边形区域

过去,您可以通过 AdWords 将广告系列定位到指定的多边形区域。但是,多边形定位目标现已弃用,改为了邻近区域,因此您无法再使用 AdWords API 添加多边形定位目标。不过,如果您要获取现有广告系列的地理位置定位目标,则有可能会遇到这类定位目标。您可以使用 API 来移除现有的多边形定位目标。

获取地理位置定位目标

您可以使用 CampaignCriterionService.get() 方法来获取广告系列的地理位置定位目标。您可根据 CriteriaType 过滤结果,以只显示 Location;还可以使用分页功能来限制您获取的定位目标数量。

int offset = 0;

// Create selector.
Selector selector = new Selector();
selector.setFields(new String[] {"CampaignId", "Id", "CriteriaType", "LocationName"});
selector.setOrdering(new OrderBy[] {new OrderBy("Name", SortOrder.ASCENDING)});
selector.setPredicates(new Predicate[] {new Predicate("CriteriaType",
    PredicateOperator.EQUALS, new String[] {"LOCATION"})});
selector.setPaging(new Paging(offset, PAGE_SIZE));
CampaignCriterionPage page = null;
do {
  page = campaignCriterionService.get(selector);

  if (page.getEntries() != null) {
    // Display campaigns.
    for (CampaignCriterion campaignCriterion : page.getEntries()) {
      System.out.printf("Campaign criterion with campaign id '%s', criterion id '%s', "
          + "and type '%s' was found.\n", campaignCriterion.getCampaignId(),
        campaignCriterion.getCriterion().getId(),
        campaignCriterion.getCriterion().getCriterionType());
    }
    Thread.sleep(1000);
  } else {
    System.out.println("No campaign criteria were found.");
  }
  offset += PAGE_SIZE;
  selector.getPaging().setStartIndex(offset);
} while (offset < page.getTotalNumEntries());

请注意,如果您的广告系列定位到所有国家/地区和区域,您获得的地理位置定位目标列表将会是空的。

更新地理位置定位目标

要更新广告系列的地理位置定位目标,您需要获取现有地理位置定位目标的列表,并与新定位目标的列表进行比较。您可以使用 REMOVE 运算符来移除不需要的定位目标,使用 ADD 运算符添加您需要的(但现有广告系列中缺失的)新地理位置定位目标。以前,您可以通过 AdWords API 使用 SET 运算符来覆盖广告系列的地理位置定位。不过现在已经不支持此功能,因此您在为广告系列更新地理位置定位目标时,需要组合使用 REMOVEADD 运算符。

排除地理位置定位目标

您还可以排除区域。如果您想要定位某个区域,但又想排除其中的某个子区域(例如定位整个美国,但将纽约市排除在外),此功能就非常实用。要排除某个区域,您需要创建 NegativeCampaignCriterion,并将其条件设为要排除的地理位置。

// Add a negative campaign geo target.
NegativeCampaignCriterion negativeCriterion = new NegativeCampaignCriterion();
negativeCriterion.campaignId = campaignId;
negativeCriterion.criterion = locationToExclude;

高级地理位置定位设置

利用 AdWords,您可以指定根据用户的实际所在位置 (LOP) 或兴趣区域 (AOI) 来向其展示广告。例如,假设您要为一家花店投放一个广告系列,您只要定位到北京市,且您将“鲜花”作为广告系列中的一个关键字。假定位于上海的一个用户在搜索“北京鲜花”:在这种情况下,上海就是用户的所在位置,而北京则是其兴趣区域。

您可以在广告系列中添加 GeoTargetTypeSetting,以确定是根据用户的所在位置、兴趣区域,还是同时使用两者来向其展示广告。

地理位置效果报告

您可以生成以下两种报告来获取地理位置效果数据,进而对广告系列中地理位置定位的有效性进行分析:

  1. 地理位置效果报告
  2. 条件效果报告 - 只要按 CriteriaType=LOCATIONPROXIMITY 过滤即可获得特定地理位置定位目标的效果数据。

如需了解详情,请参阅报告指南

发送以下问题的反馈:

此网页
AdWords API
AdWords API
需要帮助?请访问我们的支持页面