สร้างคําขอชั้นข้อมูล

ปลายทาง dataLayers ให้ข้อมูลพลังงานแสงอาทิตย์โดยละเอียดสำหรับภูมิภาครอบๆ สถานที่ที่ระบุ ปลายทางจะแสดงไฟล์ TIFF ที่ดาวน์โหลดได้ 17 ไฟล์ ได้แก่

  • โมเดลพื้นผิวดิจิทัล (DSM)
  • เลเยอร์คอมโพสิต RGB (ภาพถ่ายทางอากาศ)
  • เลเยอร์มาสก์ที่ระบุขอบเขตของการวิเคราะห์
  • ฟลักซ์พลังงานจากดวงอาทิตย์รายปีหรือผลผลิตรายปีของพื้นผิวหนึ่งๆ
  • ฟลักซ์พลังงานแสงอาทิตย์รายเดือนหรือผลผลิตรายเดือนของพื้นผิวหนึ่งๆ
  • ร่มเงารายชั่วโมง (24 ชั่วโมง)

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ Solar API กำหนดฟลักซ์ได้ที่แนวคิด Solar API

เกี่ยวกับคําขอชั้นข้อมูล

ตัวอย่างต่อไปนี้แสดง URL ของคําขอ REST ไปยังdataLayersวิธี ดังนี้

https://solar.googleapis.com/v1/dataLayers:get?parameters

ใส่พารามิเตอร์ของ URL คำขอที่ระบุข้อมูลต่อไปนี้

  • พิกัดละติจูดและลองจิจูดของสถานที่ตั้ง
  • รัศมีของภูมิภาครอบๆ สถานที่ตั้ง
  • ชุดย่อยของข้อมูลที่แสดงผล (DSM, RGB, มาสก์, ฟลักซ์รายปี หรือฟลักซ์รายเดือน)
  • คุณภาพขั้นต่ำที่อนุญาตในผลการค้นหา
  • มาตราส่วนขั้นต่ำของข้อมูลที่แสดงผลเป็นเมตรต่อพิกเซล

ตัวอย่างคําขอชั้นข้อมูล

ตัวอย่างต่อไปนี้ขอข้อมูลเชิงลึกเกี่ยวกับอาคารทั้งหมดในรัศมี 100 เมตรสำหรับสถานที่ตั้งที่พิกัดละติจูด = 37.4450 และลองจิจูด = -122.1390

คีย์ API

หากต้องการส่งคำขอไปยัง URL ในการตอบกลับ ให้ต่อท้าย URL ด้วยคีย์ API ดังนี้

curl -X GET "https://solar.googleapis.com/v1/dataLayers:get?location.latitude=37.4450&location.longitude=-122.1390&radiusMeters=100&view=FULL_LAYERS&requiredQuality=HIGH&exactQualityRequired=true&pixelSizeMeters=0.5&key=YOUR_API_KEY"

นอกจากนี้ คุณยังส่งคําขอ HTTP ได้โดยวาง URL ในคําขอ cURL ลงในแถบ URL ของเบราว์เซอร์ การส่งคีย์ API จะช่วยให้คุณมีความสามารถในการใช้งานและการวิเคราะห์ที่ดียิ่งขึ้น รวมถึงมีการควบคุมการเข้าถึงข้อมูลการตอบกลับได้ดียิ่งขึ้น

โทเค็น OAuth

หมายเหตุ: รูปแบบนี้มีไว้สําหรับสภาพแวดล้อมการทดสอบเท่านั้น ดูข้อมูลเพิ่มเติมได้ที่ใช้ OAuth

หากต้องการส่งคำขอไปยัง URL ในการตอบกลับ ให้ส่งชื่อโปรเจ็กต์สำหรับการเรียกเก็บเงินและโทเค็น OAuth ของคุณ

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "X-Goog-User-Project: PROJECT_NUMBER_OR_ID" \
  "https://solar.googleapis.com/v1/dataLayers:get?location.latitude=37.4450&location.longitude=-122.1390&radius_meters=100&required_quality=HIGH&exactQualityRequired=true"
        

TypeScript

หากต้องการส่งคำขอไปยัง URL ในการตอบกลับ ให้ใส่คีย์ API หรือโทเค็น OAuth ในการขอ ตัวอย่างต่อไปนี้ใช้คีย์ API

/**
 * Fetches the data layers information from the Solar API.
 *   https://developers.google.com/maps/documentation/solar/data-layers
 *
 * @param  {LatLng} location      Point of interest as latitude longitude.
 * @param  {number} radiusMeters  Radius of the data layer size in meters.
 * @param  {string} apiKey        Google Cloud API key.
 * @return {Promise<DataLayersResponse>}  Data Layers response.
 */
export async function getDataLayerUrls(
  location: LatLng,
  radiusMeters: number,
  apiKey: string,
): Promise<DataLayersResponse> {
  const args = {
    'location.latitude': location.latitude.toFixed(5),
    'location.longitude': location.longitude.toFixed(5),
    radius_meters: radiusMeters.toString(),
    // The Solar API always returns the highest quality imagery available.
    // By default the API asks for HIGH quality, which means that HIGH quality isn't available,
    // but there is an existing MEDIUM or LOW quality, it won't return anything.
    // Here we ask for *at least* LOW quality, but if there's a higher quality available,
    // the Solar API will return us the highest quality available.
    required_quality: 'LOW',
  };
  console.log('GET dataLayers\n', args);
  const params = new URLSearchParams({ ...args, key: apiKey });
  // https://developers.google.com/maps/documentation/solar/reference/rest/v1/dataLayers/get
  return fetch(`https://solar.googleapis.com/v1/dataLayers:get?${params}`).then(
    async (response) => {
      const content = await response.json();
      if (response.status != 200) {
        console.error('getDataLayerUrls\n', content);
        throw content;
      }
      console.log('dataLayersResponse', content);
      return content;
    },
  );
}

ฟิลด์และประเภทข้อมูลคือ "type" ใน TypeScript ในตัวอย่างนี้ เรากําหนดประเภทที่กําหนดเองเพื่อจัดเก็บช่องที่น่าสนใจในการตอบกลับ เช่น ค่าพิกเซลและกล่องขอบเขตละติจูด/ลองจิจูด คุณสามารถใส่ช่องเพิ่มเติมได้ตามต้องการ

export interface GeoTiff {
  width: number;
  height: number;
  rasters: Array<number>[];
  bounds: Bounds;
}

คำจำกัดความของประเภทข้อมูล

ระบบรองรับประเภทข้อมูลต่อไปนี้

export interface DataLayersResponse {
  imageryDate: Date;
  imageryProcessedDate: Date;
  dsmUrl: string;
  rgbUrl: string;
  maskUrl: string;
  annualFluxUrl: string;
  monthlyFluxUrl: string;
  hourlyShadeUrls: string[];
  imageryQuality: 'HIGH' | 'MEDIUM' | 'LOW';
}

export interface Bounds {
  north: number;
  south: number;
  east: number;
  west: number;
}

// https://developers.google.com/maps/documentation/solar/reference/rest/v1/buildingInsights/findClosest
export interface BuildingInsightsResponse {
  name: string;
  center: LatLng;
  boundingBox: LatLngBox;
  imageryDate: Date;
  imageryProcessedDate: Date;
  postalCode: string;
  administrativeArea: string;
  statisticalArea: string;
  regionCode: string;
  solarPotential: SolarPotential;
  imageryQuality: 'HIGH' | 'MEDIUM' | 'LOW';
}

export interface SolarPotential {
  maxArrayPanelsCount: number;
  panelCapacityWatts: number;
  panelHeightMeters: number;
  panelWidthMeters: number;
  panelLifetimeYears: number;
  maxArrayAreaMeters2: number;
  maxSunshineHoursPerYear: number;
  carbonOffsetFactorKgPerMwh: number;
  wholeRoofStats: SizeAndSunshineStats;
  buildingStats: SizeAndSunshineStats;
  roofSegmentStats: RoofSegmentSizeAndSunshineStats[];
  solarPanels: SolarPanel[];
  solarPanelConfigs: SolarPanelConfig[];
  financialAnalyses: object;
}

export interface SizeAndSunshineStats {
  areaMeters2: number;
  sunshineQuantiles: number[];
  groundAreaMeters2: number;
}

export interface RoofSegmentSizeAndSunshineStats {
  pitchDegrees: number;
  azimuthDegrees: number;
  stats: SizeAndSunshineStats;
  center: LatLng;
  boundingBox: LatLngBox;
  planeHeightAtCenterMeters: number;
}

export interface SolarPanel {
  center: LatLng;
  orientation: 'LANDSCAPE' | 'PORTRAIT';
  segmentIndex: number;
  yearlyEnergyDcKwh: number;
}

export interface SolarPanelConfig {
  panelsCount: number;
  yearlyEnergyDcKwh: number;
  roofSegmentSummaries: RoofSegmentSummary[];
}

export interface RoofSegmentSummary {
  pitchDegrees: number;
  azimuthDegrees: number;
  panelsCount: number;
  yearlyEnergyDcKwh: number;
  segmentIndex: number;
}

export interface LatLng {
  latitude: number;
  longitude: number;
}

export interface LatLngBox {
  sw: LatLng;
  ne: LatLng;
}

export interface Date {
  year: number;
  month: number;
  day: number;
}

export interface RequestError {
  error: {
    code: number;
    message: string;
    status: string;
  };
}

API จะแสดงผล URL ในรูปแบบต่อไปนี้

https://solar.googleapis.com/v1/solar/geoTiff:get?id=HASHED_ID

คุณสามารถใช้ URL เหล่านี้เพื่อเข้าถึงไฟล์ GeoTIFF ที่มีข้อมูลที่ขอ

ตัวอย่างการตอบกลับ

คําขอจะสร้างการตอบกลับ JSON ในรูปแบบต่อไปนี้

{
  "imageryDate": {
    "year": 2022,
    "month": 4,
    "day": 6
  },
  "imageryProcessedDate": {
    "year": 2023,
    "month": 8,
    "day": 4
  },
  "dsmUrl": "https://solar.googleapis.com/v1/geoTiff:get?id=MmQyMzI0NTMyZDc3YjBjNmQ3OTgyM2ZhNzMyNzk5NjItN2ZjODJlOThkNmQ5ZDdmZDFlNWU3MDY4YWFlMWU0ZGQ6UkdCOkhJR0g=",
  "rgbUrl": "https://solar.googleapis.com/v1/geoTiff:get?id=NzQwNGQ0NmUyMzAzYWRiNmMxNzMwZTJhN2IxMTc4NDctOTI5YTNkZTlkM2MzYjRiNjE4MGNkODVmNjNiNDhkMzE6UkdCOkhJR0g=",
  "maskUrl": "https://solar.googleapis.com/v1/geoTiff:get?id=ZTk1YTBlZmY5Y2FhMThlNWYzMWEzZGZhYzEzMGQzOTAtM2Q4NmUyMmM5ZThjZmE0YjhhZWMwN2UzYzdmYmQ3ZjI6TUFTSzpISUdI",
  "annualFluxUrl": "https://solar.googleapis.com/v1/geoTiff:get?id=OTE0OWIxZDM3NmNlYjkzMWY2YjQyYjY5Y2RkYzNiOTAtZjU5YTVjZGQ3MzE3ZTQ4NTNmN2M4ZmY2MWZlZGZkMzg6QU5OVUFMX0ZMVVg6SElHSA==",
  "monthlyFluxUrl": "https://solar.googleapis.com/v1/geoTiff:get?id=Y2NhOGRhOWI2MjVmYmNiZTY3Njk4Yjk0MGJhNTk1NDUtY2MyYTI4NDJmN2Q5YTI0MmY2NDQyZGUwZWJkMWQ0ZDg6TU9OVEhMWV9GTFVYOkhJR0g=",
  "hourlyShadeUrls": [
    "https://solar.googleapis.com/v1/geoTiff:get?id=OWFhOTZmNDU2OGQyNTYxYWQ4YjZkYjQ5NWI4Zjg1ODItZGEwNDNhMmM3NDU0MTY2OGIzZDY2OGU1NTY0NTFlMzE6TU9OVEhMWV9GTFVYOkhJR0g=",
    "https://solar.googleapis.com/v1/geoTiff:get?id=MTI1ZTI2YzM1ZTRlYjA3ZDM4NWE2ODY4MjUzZmIxZTMtNTRmYTI3YmQyYzVjZDcyYjc5ZTlmMTRjZjBmYTk4OTk6TU9OVEhMWV9GTFVYOkhJR0g=",
    ...
  ],
  "imageryQuality": "HIGH"
}

เข้าถึงข้อมูลการตอบกลับ

การเข้าถึงข้อมูลผ่าน URL การตอบกลับต้องมีการตรวจสอบสิทธิ์เพิ่มเติม หากใช้คีย์การตรวจสอบสิทธิ์ คุณต้องต่อท้าย URL ด้วยคีย์ API หากใช้การตรวจสอบสิทธิ์ OAuth คุณต้องเพิ่มส่วนหัว OAuth

คีย์ API

หากต้องการส่งคำขอไปยัง URL ในการตอบกลับ ให้ต่อท้าย URL ด้วยคีย์ API ดังนี้

curl -X GET "https://solar.googleapis.com/v1/solar/geoTiff:get?id=fbde33e9cd16d5fd10d19a19dc580bc1-8614f599c5c264553f821cd034d5cf32&key=YOUR_API_KEY"

นอกจากนี้ คุณยังส่งคําขอ HTTP ได้โดยวาง URL ในคําขอ cURL ลงในแถบ URL ของเบราว์เซอร์ การส่งคีย์ API จะช่วยให้คุณมีความสามารถในการใช้งานและการวิเคราะห์ที่ดียิ่งขึ้น รวมถึงมีการควบคุมการเข้าถึงข้อมูลการตอบกลับได้ดียิ่งขึ้น

โทเค็น OAuth

หากต้องการส่งคำขอไปยัง URL ในการตอบกลับ ให้ส่งชื่อโปรเจ็กต์สำหรับการเรียกเก็บเงินและโทเค็น OAuth ของคุณ

curl -X GET \
-H 'X-Goog-User-Project: PROJECT_NUMBER_OR_ID' \
-H "Authorization: Bearer $TOKEN" \
"https://solar.googleapis.com/v1/solar/geoTiff:get?id=fbde33e9cd16d5fd10d19a19dc580bc1-8614f599c5c264553f821cd034d5cf32"
        

TypeScript

ตัวอย่างต่อไปนี้แสดงวิธีรับค่าข้อมูลพิกเซล (ข้อมูลที่จัดเก็บไว้ในพิกเซลแต่ละพิกเซลของรูปภาพดิจิทัล ซึ่งรวมถึงค่าสีและแอตทริบิวต์อื่นๆ) คํานวณละติจูดและลองจิจูดจาก GeoTIFF และจัดเก็บไว้ในออบเจ็กต์ TypeScript

สําหรับตัวอย่างที่เฉพาะเจาะจงนี้ เราเลือกที่จะอนุญาตการตรวจสอบประเภท ซึ่งจะช่วยลดข้อผิดพลาดเกี่ยวกับประเภท เพิ่มความน่าเชื่อถือให้กับโค้ด และทําให้ดูแลรักษาได้ง่ายขึ้น

// npm install geotiff geotiff-geokeys-to-proj4 proj4

import * as geotiff from 'geotiff';
import * as geokeysToProj4 from 'geotiff-geokeys-to-proj4';
import proj4 from 'proj4';

/**
 * Downloads the pixel values for a Data Layer URL from the Solar API.
 *
 * @param  {string} url        URL from the Data Layers response.
 * @param  {string} apiKey     Google Cloud API key.
 * @return {Promise<GeoTiff>}  Pixel values with shape and lat/lon bounds.
 */
export async function downloadGeoTIFF(url: string, apiKey: string): Promise<GeoTiff> {
  console.log(`Downloading data layer: ${url}`);

  // Include your Google Cloud API key in the Data Layers URL.
  const solarUrl = url.includes('solar.googleapis.com') ? url + `&key=${apiKey}` : url;
  const response = await fetch(solarUrl);
  if (response.status != 200) {
    const error = await response.json();
    console.error(`downloadGeoTIFF failed: ${url}\n`, error);
    throw error;
  }

  // Get the GeoTIFF rasters, which are the pixel values for each band.
  const arrayBuffer = await response.arrayBuffer();
  const tiff = await geotiff.fromArrayBuffer(arrayBuffer);
  const image = await tiff.getImage();
  const rasters = await image.readRasters();

  // Reproject the bounding box into lat/lon coordinates.
  const geoKeys = image.getGeoKeys();
  const projObj = geokeysToProj4.toProj4(geoKeys);
  const projection = proj4(projObj.proj4, 'WGS84');
  const box = image.getBoundingBox();
  const sw = projection.forward({
    x: box[0] * projObj.coordinatesConversionParameters.x,
    y: box[1] * projObj.coordinatesConversionParameters.y,
  });
  const ne = projection.forward({
    x: box[2] * projObj.coordinatesConversionParameters.x,
    y: box[3] * projObj.coordinatesConversionParameters.y,
  });

  return {
    // Width and height of the data layer image in pixels.
    // Used to know the row and column since Javascript
    // stores the values as flat arrays.
    width: rasters.width,
    height: rasters.height,
    // Each raster reprents the pixel values of each band.
    // We convert them from `geotiff.TypedArray`s into plain
    // Javascript arrays to make them easier to process.
    rasters: [...Array(rasters.length).keys()].map((i) =>
      Array.from(rasters[i] as geotiff.TypedArray),
    ),
    // The bounding box as a lat/lon rectangle.
    bounds: {
      north: ne.y,
      south: sw.y,
      east: ne.x,
      west: sw.x,
    },
  };
}

ไฟล์ TIFF ทั้งหมดจะแสดงเป็นภาพเปล่าในแอปพลิเคชันโปรแกรมดูรูปภาพ ยกเว้นเลเยอร์ RGB หากต้องการดูไฟล์ TIFF ที่ดาวน์โหลด ให้นำเข้าไฟล์เหล่านั้นไปยังซอฟต์แวร์แอปพลิเคชันการแมป เช่น QGIS

ข้อกำหนดทั้งหมดของคำขอและการตอบกลับนี้อยู่ในเอกสารอ้างอิง