Earth Engine 시작하기

이 시작 가이드는 Earth Engine JavaScript API로 프로그래밍을 시작하는 빠른 방법을 제공하기 위한 것입니다. JavaScript에 대한 소개 및 Earth Engine API를 사용한 심층 연습은 튜토리얼을 참고하세요. 권장되는 JavaScript 코딩 스타일은 Google JavaScript 스타일 가이드를 참고하세요.

Google Earth Engine을 사용하면 사용자가 Google 인프라에 저장된 지리적 참조 이미지 및 벡터에서 알고리즘을 실행할 수 있습니다. Google Earth Engine API는 표시 및 분석을 위해 데이터에 적용할 수 있는 함수 라이브러리를 제공합니다. Earth Engine의 공개 데이터 카탈로그에는 공개적으로 사용 가능한 이미지와 벡터 데이터 세트가 대량으로 포함되어 있습니다. 사용자의 개인 폴더에서 비공개 저작물을 만들 수도 있습니다.

문서 사용 방법

Earth Engine 문서는 지리정보 데이터 분석에 익숙한 사용자를 위해 작성되었습니다. 문서는 주로 데이터 유형별로 구성됩니다. 예를 들어 왼쪽 탐색 메뉴에는 Image, ImageCollection, Feature, FeatureCollection, Geometry, Reducer, Chart, Join, Array과 같은 중요한 데이터 유형에 관한 섹션 또는 페이지로 연결되는 링크가 포함되어 있습니다. 이 가이드에서는 시작하는 데 필요한 수준으로만 이러한 유형을 설명합니다. 머신러닝, 특수 또는 센서별 알고리즘(예: Landsat 알고리즘), 외부에 노출되는 앱, 데이터 (애셋) 관리, Earth Engine 내부 작동에 관한 중요한 세부정보에 관한 섹션도 있습니다. 자세한 내용을 알아보기 전에 먼저 여기를 확인하세요.

코드 편집기

코드 편집기는 Earth Engine 애플리케이션을 개발하기 위한 대화형 환경입니다(그림 1). 가운데 패널에는 JavaScript 코드 편집기가 제공됩니다. 편집기 위에는 현재 스크립트를 저장하고, 실행하고, 지도를 지우는 버튼이 있습니다. 링크 가져오기 버튼을 클릭하면 주소 표시줄에 스크립트의 고유한 URL이 생성됩니다. 하단 패널의 지도에는 스크립트로 추가된 레이어가 포함되어 있습니다. 상단에는 데이터 세트 및 장소 검색창이 있습니다. 왼쪽 패널에는 코드 예시, 저장된 스크립트, 검색 가능한 API 참조, 비공개 데이터용 애셋 관리자가 포함되어 있습니다. 오른쪽 패널에는 지도 쿼리를 위한 검사기, 출력 콘솔, 장기 실행 작업을 위한 관리자가 있습니다. 오른쪽 상단의 도움말 버튼 에는 이 가이드 및 도움을 받을 수 있는 기타 리소스의 링크가 포함되어 있습니다. Code Editor 가이드도움말 가이드에서 자세히 알아보세요.

코드 편집기
그림 1. code.earthengine.google.com의 Earth Engine 코드 편집기

코드 편집기에서 코드 열기 및 실행

다음 단계에서는 Earth Engine을 열고 이미지를 표시하는 맞춤 스크립트를 실행하는 방법을 보여줍니다. 최상의 결과를 얻으려면 여기에서 Google의 웹브라우저인 Chrome의 최신 버전을 설치하는 것이 좋습니다.

  1. code.earthengine.google.com에서 Earth Engine 코드 편집기를 엽니다.
  2. 코드 편집기 왼쪽에 있는 스크립트 탭으로 이동합니다. 여기에서 Earth Engine 데이터에 액세스하고, 표시하고, 분석하는 예시 스크립트 모음을 확인할 수 있습니다.
  3. '이미지 모음'에서 '필터링된 합성물' 예시를 선택합니다. 중앙 콘솔에 스크립트가 표시됩니다. Run 버튼을 눌러 스크립트를 실행합니다. 필터링된 합성 예에서는 콜로라도와 유타의 경계를 교차하거나 경계 내에 있는 Landsat 7 이미지를 선택합니다. 그런 다음 선택한 이미지의 실제 색상 합성물을 표시합니다. 샘플에서는 filter(), clip(), Map.addLayer()와 같이 널리 사용되는 메서드를 소개합니다.

Earth Engine 데이터 구조

Earth Engine에서 가장 기본적인 두 가지 지리적 데이터 구조는 각각 래스터 데이터 유형과 벡터 데이터 유형에 해당하는 ImageFeature입니다. 이미지는 밴드와 속성 사전으로 구성됩니다. 지형지물은 Geometry 및 속성 사전으로 구성됩니다. 이미지 스택 (예: 이미지 시계열)은 ImageCollection로 처리됩니다. 지형지물 컬렉션은 FeatureCollection에서 처리합니다. Earth Engine의 다른 기본 데이터 구조는 Dictionary, List, Array, Date, Number, String입니다. 기본 데이터 유형에 관한 자세한 내용은 이 튜토리얼을 참고하세요. 이러한 객체는 모두 서버 측 객체이며 클라이언트 측 JavaScript 객체와 동일한 방식으로 조작되지 않는다는 점에 유의해야 합니다 (자세히 알아보기).

Earth Engine 알고리즘

API에서 작업을 실행하는 방법에는 여러 가지가 있습니다.

  • 객체에 연결된 메서드 호출
  • 알고리즘 호출
  • Code Editor 관련 함수 호출
  • 새 함수 정의

Code Editor의 Docs 탭에는 각 API 클래스의 메서드가 나열됩니다. 예를 들어 Image 클래스에는 add() 메서드가 있습니다.

코드 편집기 (JavaScript)

var image3 = image1.add(image2);

이 메서드는 image2의 밴드를 image1의 밴드에 추가합니다. ee.Algorithms 카테고리에는 현재 지원되는 전문 처리 또는 도메인별 처리 알고리즘 목록이 포함되어 있습니다. 예를 들어 입력 디지털 지형 모델 (DEM)에서 지형 레이어를 만들려면 다음 단계를 따르세요.

코드 편집기 (JavaScript)

var terrainImage = ee.Algorithms.Terrain(dem);

Code Editor 관련 함수에는 레이어가 지도 패널에 추가되는 방식 또는 Google Drive로 내보내는 방식을 각각 제어하는 MapExport 메서드가 포함됩니다. 함수는 다음을 사용하여 JavaScript에서 만들 수도 있습니다.

코드 편집기 (JavaScript)

var myFunction = function(args) {
  // do something
  return something;
};

매핑 섹션에 설명된 대로 사용자 정의 함수는 다음을 사용하여 맞춤 기능을 만들거나 컬렉션의 요소를 수정하는 데 유용합니다.

코드 편집기 (JavaScript)

var collection2 = collection1.map(aFunction);

다음 섹션에서는 다양한 간단한 사용 사례를 통해 이러한 개념을 설명합니다.

'Hello world!' 자바스크립트

콘솔에 정보를 출력하는 것은 객체에 관한 정보를 가져오거나, 계산의 숫자 결과를 표시하거나, 객체 메타데이터를 표시하거나, 디버깅을 지원하기 위한 기본 작업입니다. 코드 편집기의 상징적인 'Hello World!' 예시는 다음과 같습니다.

코드 편집기 (JavaScript)

print('Hello world!');

이 줄을 Code Editor의 코드 편집기에 복사하고 Run을 클릭합니다. 출력은 코드 편집기 오른쪽에 있는 콘솔 탭에 표시됩니다. 원격 감지와 관련된 예를 더 보려면 다음을 실행하여 Landsat 8 이미지의 메타데이터를 출력해 보세요.

코드 편집기 (JavaScript)

print(ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'));

콘솔의 출력을 주의 깊게 검사하여 Landsat 이미지에 사용할 수 있는 메타데이터를 확인합니다.

지도에 데이터 추가

콘솔에 정보를 출력하는 것 외에도 Map에 데이터를 추가하면 지리적 데이터를 시각화할 수 있습니다. Map.addLayer()를 사용하면 됩니다. 다음 예에서는 ee.Image()를 사용하여 Image가 인스턴스화되고 (이러한 이미지를 찾는 방법은 나중에 설명됨) Map.addLayer()를 사용하여 지도에 추가되며 지도의 중심이 이미지 위에 배치됩니다.

코드 편집기 (JavaScript)

// Load an image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Center the map on the image.
Map.centerObject(image, 9);

// Display the image.
Map.addLayer(image);

Map.centerObject()의 두 번째 매개변수는 확대/축소 수준이며, 숫자가 클수록 더 크게 확대된 것을 나타냅니다. Map 함수의 매개변수는 문서 탭에서 액세스할 수 있는 API 참조에 자세히 설명되어 있습니다. 이미지 모양이 만족스럽지 않으면 Map.addLayer()에 추가 인수를 사용하여 디스플레이 매개변수를 구성합니다. 예:

코드 편집기 (JavaScript)

// Load the image from the archive.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Define visualization parameters in an object literal.
var vizParams = {bands: ['B5', 'B4', 'B3'], min: 0.02, max: 0.4, gamma: 1.3};

// Center the map on the image and display.
Map.centerObject(image, 9);
Map.addLayer(image, vizParams, 'Landsat 8 false color');

시각화 매개변수는 표시할 밴드 목록, 최솟값 및 최댓값의 반사율, 감마 값을 포함하는 객체 리터럴로 정의됩니다. (Landsat 밴드에 관한 자세한 내용은 여기를 참고하세요. 이미지 시각화에 대해 자세히 알아보려면 여기를 참고하세요.

Map.addLayer()를 사용하여 지도에 지형지물 및 지형지물 컬렉션을 추가합니다. 예를 들면 다음과 같습니다.

코드 편집기 (JavaScript)

var counties = ee.FeatureCollection('TIGER/2018/Counties');
Map.addLayer(counties, {}, 'counties');

이미지, 이미지 모음, 지형지물 컬렉션 찾기

이미지, 이미지 컬렉션, 지형지물 컬렉션은 Earth Engine 데이터 카탈로그를 검색하여 찾을 수 있습니다. 예를 들어 검색창에 'Landsat 8'을 입력하면 래스터 데이터 세트 목록이 표시됩니다. (Earth Engine 데이터 세트의 전체 목록은 Earth Engine 데이터 카탈로그에서 확인할 수 있습니다.) 데이터 세트 이름을 클릭하여 간단한 설명, 시간적 사용 가능 여부, 데이터 제공업체, 컬렉션 ID에 관한 정보를 확인합니다. 가져오기 버튼을 클릭하면 스크립트 상단에 이 컬렉션의 변수가 있는 가져오기 섹션이 자동으로 생성됩니다.

또는 컬렉션 ID를 복사하여 코드에 붙여넣습니다. 예를 들어 'Landsat 8' 검색의 Tier 1 TOA 결과를 선택하고 다음과 같이 ID를 복사합니다.

코드 편집기 (JavaScript)

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

지구 표면을 아우르는 여러 이미지의 모음인 이 컬렉션에서 개별 이미지를 찾으려면 검색 범위를 좁히기 위해 필터링이 필요합니다. 또는 합성 및 모자이크 기법을 사용하여 이미지 모음을 단일 이미지로 줄일 수 있습니다. 다음 섹션에서 필터링 및 합성 (감소 참고)에 관해 자세히 알아보세요.

지형지물 컬렉션은 Data Catalog를 통해서도 사용할 수 있습니다. 이미지 모음보다 표현 범위가 작지만 국제, 인구 조사, 유역, 보호 지역 경계 등을 확인할 수 있습니다. 자체 벡터 데이터 세트를 가져오는 방법에 관한 자세한 내용은 여기를 참고하세요.

필터링 및 정렬

결과 수를 제한하기 위해 공간 또는 시간별로 컬렉션을 필터링해야 하는 경우가 많습니다. 예를 들어 샌프란시스코의 구름이 없는 장면을 찾기 위해 Landsat 8 장면 모음을 정렬하는 작업을 생각해 보겠습니다. 먼저 관심 영역을 정의해야 합니다. 이때 점은 유용합니다. Code Editor 오른쪽에 있는 Inspector 탭을 활성화하고 관심 영역의 중앙 근처를 클릭한 다음 Inspector 탭에서 좌표를 복사하고 다음을 사용하여 Point를 구성합니다.

코드 편집기 (JavaScript)

var point = ee.Geometry.Point(-122.262, 37.8719);

시작일 및 종료일을 구성합니다.

코드 편집기 (JavaScript)

var start = ee.Date('2014-06-01');
var finish = ee.Date('2014-10-01');

지점과 날짜를 사용하여 Landsat 8 컬렉션을 필터링한 다음 메타데이터 속성 (Landsat 8 장면 메타데이터 검사 중에 발견됨)을 사용하여 정렬합니다.

코드 편집기 (JavaScript)

var filteredCollection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(point)
  .filterDate(start, finish)
  .sort('CLOUD_COVER', true);

이 컬렉션은 안전하게 인쇄하고 검사할 수 있습니다. 컬렉션에 이미지가 너무 많으면 인쇄 속도가 매우 느려지거나 시간 초과가 발생하거나 오류가 반환됩니다. 컬렉션의 이미지는 ImageCollection의 'features' 속성에 저장된 List입니다. 컬렉션의 이미지 ID는 위와 같이 Image 생성자에 복사할 수 있습니다. 또는 첫 번째 이미지 (최저 구름 덮음)를 가져옵니다.

코드 편집기 (JavaScript)

var first = filteredCollection.first();

ee.Filter를 인수로 사용하여 filter()를 사용하여 전체 Earth Engine 필터링 기능에 액세스합니다. 위에서 사용된 filterBounds()filterDate() 메서드는 바로가기입니다. 예를 들어 다음은 Filter를 만들고 이를 사용하여 FeatureCollection를 필터링한 후 결과를 표시합니다.

코드 편집기 (JavaScript)

// Load a feature collection.
var featureCollection = ee.FeatureCollection('TIGER/2016/States');

// Filter the collection.
var filteredFC = featureCollection.filter(ee.Filter.eq('NAME', 'California'));

// Display the collection.
Map.setCenter(-119.604, 37.798, 6);
Map.addLayer(filteredFC, {}, 'California');

밴드 수학

Image 메서드를 사용하여 이미지에 수학 연산을 실행합니다. 여기에는 밴드 재조합 (스펙트럼 지수), 이미지 차등 또는 상수 곱셈과 같은 수학적 연산이 포함될 수 있습니다. 예를 들어 20년 간격의 정규 식생 지수 (NDVI) 이미지 간의 차이를 계산합니다.

코드 편집기 (JavaScript)

// This function gets NDVI from Landsat 5 imagery.
var getNDVI = function(image) {
  return image.normalizedDifference(['B4', 'B3']);
};

// Load two Landsat 5 images, 20 years apart.
var image1 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_19900604');
var image2 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_20100611');

// Compute NDVI from the scenes.
var ndvi1 = getNDVI(image1);
var ndvi2 = getNDVI(image2);

// Compute the difference in NDVI.
var ndviDifference = ndvi2.subtract(ndvi1);

이 예에서는 사용자 정의 function가 사용됩니다. 함수에 관한 자세한 내용은 다음 섹션을 참고하세요.

매핑 (for 루프 대신 실행할 작업)

map()를 사용하여 컬렉션의 항목을 반복합니다. For 루프는 Earth Engine에서 이를 수행하는 올바른 방법이 아니므로 피해야 합니다. map() 함수는 ImageCollection, FeatureCollection 또는 List에 적용할 수 있으며 function를 인수로 허용합니다. 함수의 인수는 매핑되는 컬렉션의 요소입니다. 이는 추가와 같이 동일한 방식으로 컬렉션의 모든 요소를 수정하는 데 유용합니다. 예를 들어 다음 코드는 ImageCollection의 모든 이미지에 NDVI 밴드를 추가합니다.

코드 편집기 (JavaScript)

// This function gets NDVI from Landsat 8 imagery.
var addNDVI = function(image) {
  return image.addBands(image.normalizedDifference(['B5', 'B4']));
};

// Load the Landsat 8 TOA data, filter by location and date.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(ee.Geometry.Point(-122.262, 37.8719))
  .filterDate('2014-06-01', '2014-10-01');

// Map the function over the collection.
var ndviCollection = collection.map(addNDVI);

또 다른 일반적인 작업은 FeatureCollection의 지형지물에 새 속성 (또는 '속성' 또는 '필드')을 추가하는 것입니다. 다음 예에서 새 속성은 두 개의 기존 속성이 포함된 계산입니다.

코드 편집기 (JavaScript)

// This function creates a new property that is the sum of two existing properties.
var addField = function(feature) {
  var sum = ee.Number(feature.get('property1')).add(feature.get('property2'));
  return feature.set({'sum': sum});
};

// Create a FeatureCollection from a list of Features.
var features = ee.FeatureCollection([
  ee.Feature(ee.Geometry.Point(-122.4536, 37.7403),
    {property1: 100, property2: 100}),
    ee.Feature(ee.Geometry.Point(-118.2294, 34.039),
    {property1: 200, property2: 300}),
]);

// Map the function over the collection.
var featureCollection = features.map(addField);

// Print a selected property of one Feature.
print(featureCollection.first().get('sum'));

// Print the entire FeatureCollection.
print(featureCollection);

add() 메서드를 사용하려면 속성 값이 숫자로 인식되도록 ee.Number로 변환해야 합니다. map()를 사용하여 컬렉션의 유형을 변경할 수 있습니다. 예를 들면 다음과 같습니다.

코드 편집기 (JavaScript)

// This function returns the image centroid as a new Feature.
var getGeom = function(image) {
  return ee.Feature(image.geometry().centroid(), {foo: 1});
};

// Load a Landsat 8 TOA collection.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(ee.Geometry.Point(-122.262, 37.8719))
  .filterDate('2014-06-01', '2014-10-01');

// Map the function over the ImageCollection.
var featureCollection = ee.FeatureCollection(collection.map(getGeom));

// Print the collection.
print(featureCollection);

이미지 중심점에서 생성된 각 지형지물에 추가된 속성 (foo)을 확인합니다. 마지막 줄에서 변환을 통해 결과 컬렉션을 FeatureCollection로 인식할 수 있습니다.

감소

축소는 Earth Engine에서 시간, 공간, 밴드, 배열, 기타 데이터 구조에 걸쳐 데이터를 집계하는 방법입니다. API에는 이 목적을 위한 다양한 메서드가 있습니다. 예를 들어 ImageCollection의 합성 이미지를 만들려면 reduce()를 사용하여 컬렉션의 이미지를 하나의 이미지로 줄입니다. 간단한 예는 앞에서 정의한 Landsat 8 컬렉션에서 가장 구름이 적은 5개 장면의 중간 값 합성 이미지를 만드는 것입니다.

코드 편집기 (JavaScript)

// Load a Landsat 8 TOA collection.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  // Filter by date and location.
  .filterBounds(ee.Geometry.Point(-122.262, 37.8719))
  .filterDate('2014-01-01', '2014-12-31')
  // Sort by increasing cloudiness.
  .sort('CLOUD_COVER');

// Compute the median of each pixel for each band of the 5 least cloudy scenes.
var median = collection.limit(5).reduce(ee.Reducer.median());

축소는 Feature 또는 FeatureCollection로 정의된 영역에서 이미지의 통계를 가져오는 방법이기도 합니다. 관심 영역 내의 평균 픽셀 값을 계산하는 작업이라고 가정해 보겠습니다. 이 용도로 reduceRegion()를 사용합니다. 예를 들면 다음과 같습니다.

코드 편집기 (JavaScript)

// Load and display a Landsat TOA image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3});

// Create an arbitrary rectangle as a region and display it.
var region = ee.Geometry.Rectangle(-122.2806, 37.1209, -122.0554, 37.2413);
Map.addLayer(region);

// Get a dictionary of means in the region.  Keys are bandnames.
var mean = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region,
  scale: 30
});

리듀서 문서에서 리듀서에 대해 자세히 알아보세요.

마스킹

ee.Image의 모든 픽셀에는 값과 마스크가 있으며 마스크의 범위는 0 (데이터 없음)~1입니다. 마스킹된 픽셀 (mask==0)은 데이터가 없는 것으로 취급됩니다. 0 < 마스크 ≤ 1인 픽셀에는 값이 있지만 수치 계산을 위해 마스크에 따라 가중치가 적용됩니다.

마스크를 사용하여 픽셀을 투명하게 만들거나 분석에서 제외할 수 있습니다. 마스크 값이 0이면 픽셀이 마스킹됩니다. 이미지 차등 예시를 계속하여 마스크를 사용하여 차이 간격에 걸쳐 NDVI가 증가한 영역과 감소한 영역을 표시합니다.

// This function gets NDVI from Landsat 5 imagery.
var getNDVI = function(image) {
  return image.normalizedDifference(['B4', 'B3']);
};

// Load two Landsat 5 images, 20 years apart.
var image1 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_19900604');
var image2 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_20100611');

// Compute NDVI from the scenes.
var ndvi1 = getNDVI(image1);
var ndvi2 = getNDVI(image2);

// Compute the difference in NDVI.
var ndviDifference = ndvi2.subtract(ndvi1);
// Load the land mask from the SRTM DEM.
var landMask = ee.Image('CGIAR/SRTM90_V4').mask();

// Update the NDVI difference mask with the land mask.
var maskedDifference = ndviDifference.updateMask(landMask);

// Display the masked result.
var vizParams = {min: -0.5, max: 0.5, palette: ['FF0000', 'FFFFFF', '0000FF']};
Map.setCenter(-122.2531, 37.6295, 9);
Map.addLayer(maskedDifference, vizParams, 'NDVI difference');

이 예에서 NDVI 차이의 마스크는 updateMask()를 사용하여 토지 마스크로 업데이트됩니다. 이렇게 하면 NDVI 차이 마스크가 0이 아닌 모든 위치에서 NDVI 차이 픽셀의 마스크가 토지 마스크로 설정됩니다.

마스킹은 분석에서 데이터를 제외하는 데도 유용합니다. 감소 섹션reduceRegion() 예를 생각해 보세요. 구름이 낀 픽셀을 제외하고 캘리포니아 산타클라라 카운티의 계절별 평균 NDVI를 계산하는 작업을 수행한다고 가정해 보겠습니다. 다음 예에서는 필터링, 매핑, 축소, 구름 마스크 사용과 같은 여러 개념을 보여줍니다.

코드 편집기 (JavaScript)

// This function gets NDVI from a Landsat 8 image.
var addNDVI = function(image) {
  return image.addBands(image.normalizedDifference(['B5', 'B4']));
};

// This function masks cloudy pixels.
var cloudMask = function(image) {
  var clouds = ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']);
  return image.updateMask(clouds.lt(10));
};

// Load a Landsat collection, map the NDVI and cloud masking functions over it.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterBounds(ee.Geometry.Point([-122.262, 37.8719]))
  .filterDate('2014-03-01', '2014-05-31')
  .map(addNDVI)
  .map(cloudMask);

// Reduce the collection to the mean of each pixel and display.
var meanImage = collection.reduce(ee.Reducer.mean());
var vizParams = {bands: ['B5_mean', 'B4_mean', 'B3_mean'], min: 0.02, max: 0.4};
Map.addLayer(meanImage, vizParams, 'mean');

// Load a region in which to compute the mean and display it.
var counties = ee.FeatureCollection('TIGER/2018/Counties');
var santaClara = ee.Feature(counties.filter(ee.Filter.eq('NAME', 'Santa Clara')).first());
Map.addLayer(santaClara);

// Get the mean of NDVI in the region.
var mean = meanImage.select(['nd_mean']).reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: santaClara.geometry(),
  scale: 30
});

// Print mean NDVI for the region.
mean.get('nd_mean').evaluate(function(val){
  print('Santa Clara spring mean NDVI:', val);
});