ปลายทาง 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
ข้อกำหนดทั้งหมดของคำขอและการตอบกลับนี้อยู่ในเอกสารอ้างอิง