2 votos

¿Cómo obtener la latitud y la longitud del punto más alto de un polígono en el motor Earth?

Tengo un polígono (tabla de fusión) y necesito descubrir cuál es el punto más alto a partir del punto. Esto es lo que he hecho hasta ahora:

var elevation = ee.Image('CGIAR/SRTM90_V4');
var rainierWaypoints =
    ee.FeatureCollection('ft:1oCYHTwkJhzDdJi3sabCm-BFyTwhu7N2HuQPpceBv');

Map.addLayer(elevation.clip(rainierWaypoints), {min:0, max:300, palette:['000000',"ffffff"]},"elevation2");
var chart = ui.Chart.image.byRegion({
  image: elevation,
  regions: rainierWaypoints,
  scale: 200,
  xProperty: 'name'
});
chart.setOptions({
  title: 'Propriedade',
  vAxis: {
    title: 'Elevation (meters)'
  },
  legend: 'none',
  lineWidth: 1,
  pointSize: 4
});
var options = {
  title: 'Altitude',
  fontSize: 12,
  hAxis: {title: 'Frequência'},
  vAxis: {title: 'Altitude'},
  series: {
    0: {color: 'blue'}
  }
};

var histogram = ui.Chart.image.histogram(elevation, rainierWaypoints, 30)
    .setSeriesNames(['blue'])
    .setOptions(options);
print(histogram);

print(chart);

Map.centerObject(rainierWaypoints);
Map.addLayer(rainierWaypoints, {color: 'FF0000'});

Aquí está la tabla de fusión que estoy usando como ejemplo. https://fusiontables.google.com/data?docid=1oCYHTwkJhzDdJi3sabCm-BFyTwhu7N2HuQPpceBv#map:id=3

0voto

hibbelig Puntos 176

Puede que no sea la única solución, pero funciona bien. Se liaría si hay más de un pixel con la misma altura (ese problema tendría otra solución creo). El código:

elevation = elevation.clip(rainierWaypoints)

// Pixel position
var pixel_pos = ee.Image.pixelLonLat();

// Highest elevation
var high = elevation.reduceRegion(ee.Reducer.max(), rainierWaypoints, 10).get('elevation');

// Leave only the highest pixel (mask)
var highest = elevation.eq(ee.Image.constant(high));

// Add pixel position to the mask
var highest_point_image = elevation.addBands(pixel_pos).mask(highest);

// Get Lon & Lat of that pixel (mean to be in the middle)
var highest_point = highest_point_image.reduceRegion(ee.Reducer.mean(), rainierWaypoints, 10);

// Create a point using Lat & Lon
var point = ee.Geometry.Point([highest_point.get('longitude'), highest_point.get('latitude')]);
Map.addLayer(point, {}, 'Highest point')

0voto

Mark Johnson Puntos 106

El siguiente código utiliza una imagen enmascarada (similar al enfoque de Rodrigo) con ee.Image.reduceToVectors() para encontrar las zonas más altas. Tenga en cuenta que puede que desee aumentar el valor de MAX_PIXELS cuando analice regiones muy grandes.

// Set the number maximum number of pixels to sample. Increase this number
// to increase the accuracy when analyzing large regions.
var MAX_PIXELS = 1e8;

// Declare an elevation dataset to use.
var elevation = ee.Image("USGS/SRTMGL1_003");

// Area around Sao Paulo, Brazil.
var roi = ee.Geometry.Polygon(
        [[[-41.3, -24.0],
          [-42.6, -21.0],
          [-49.5, -18.9],
          [-53.4, -22.3],
          [-47.9, -26.2]]]);

// Find the highest elevation in a specified region-of-interest (roi).
var highest_elevation = elevation.reduceRegion({
    reducer: ee.Reducer.max(),
    geometry: roi,
    bestEffort: true,
    maxPixels: MAX_PIXELS,
}).get('elevation');

// Created a masked image of only the highest elevations.
var highest_mask = elevation.eq(ee.Image.constant(highest_elevation));

// Create features from the non-masked high elevation areas.
var max_elevation_features = elevation.mask(highest_mask).reduceToVectors({
  geometry: roi, 
  labelProperty: 'elevation',
  bestEffort: true,
  maxPixels: MAX_PIXELS,
});

// Print the feature information to the console.
print('max_elevation_features', max_elevation_features);

// Add Layers to the interactive map.
Map.centerObject(max_elevation_features);
Map.addLayer(roi, {color: 'white'}, 'Region of Interest');
Map.addLayer(max_elevation_features, {color:'red'}, 'Max Elevation Areas');

Este enfoque también funciona en zonas donde hay varias ubicaciones con la misma elevación. Para demostrarlo, utilice la siguiente región (en las salinas de Utah, EE.UU.):

// Flat area with multiple equivalent high points.
var roi = ee.Geometry.Polygon(
        [[[-113.40306, 40.74333],
          [-113.40306, 40.74255],
          [-113.40107, 40.74255],
          [-113.40107, 40.74333]]]);

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X