Vanuatu GIS Feed
banner
vanuatugis.bsky.social
Vanuatu GIS Feed
@vanuatugis.bsky.social
The Vanuatu GIS Feed will be used to aggregate site posts. It is monitored, but will probably not be very 'personal'. - @raetlomi.bsky.social
Technology Feed @vanuatutech.bsky.social.
231124
Struggling with Google Earth Engine to download temperature data from ERA5 that corresponds to my reference dataset
This is what my reference dataset looks like, I want to get monthly min, max and mean temperatures for each of the site-years. I split each site year into 12 months but I don't know if that is necessary: long Lat year date 1 -85.4 42.4 2007 2007-01-01 2 -85.4 42.4 2007 2007-02-01 3 -85.4 42.4 2007 2007-03-01 4 -85.4 42.4 2007 2007-04-01 5 -85.4 42.4 2007 2007-05-01 6 -85.4 42.4 2007 2007-06-01 When I use the following code to extract temperature data from ERA5 my coordinates aren't recognized and it outputs empty geometries: // Load the CSV file as a FeatureCollection var csvData = ee.FeatureCollection('projects/ee-/df_monthly'); // Print to verify the CSV data is loaded print(csvData, 'CSV Data:'); Map.addLayer(csvData, null, 'sites'); ////////////////////////////////////////////////////// //define vars //var bbox = ee.Geometry.Rectangle({coords:[114.96256, -30.40689, 115.18764,-30.02759],geodesic:false}); var from = ee.Date('1985-01-01'); var to = ee.Date('2021-12-12'); ///////////////get data // Load the ERA5 Monthly dataset var era5 = ee.ImageCollection("ECMWF/ERA5_LAND/MONTHLY_AGGR").filterDate(from, to); // get temperature and precipitation var forcing = era5.select(['temperature_2m','total_precipitation_sum']); print(forcing); ///extract and export var values = forcing.map(function(image) { return image.reduceRegions({ collection: csvData, reducer: ee.Reducer.mean(), crs:'EPSG:4326', tileScale: 16, scale: 10000 }).map(function(f){ return f.set('date', image.get('system:index')); }); }).flatten(); /// check extraction print(values.limit(10),'values'); Export.table.toDrive({ collection: values, description: 'Enriched_CSV_Data', fileFormat: 'CSV' }); Hope I provided enough info.
gis.stackexchange.com
January 10, 2026 at 4:06 PM
Finding parcels directly across street using ArcMap
I have a set of polygons like this: The broad goal is to find how much of each polygon's perimeter is bordered by each of the other polygons, including polygons across the street. In other words, I want to find "bordering" polygons—not just those that share an edge, but those that "border" each other across the street as well. This sounds like a classic buffer problem, but the streets have variable lengths so I don't think a simple buffer would cut it. I have found a couple ways to formulate this problem, but each has its own flaws: * Create a "voronoi diagram", but with polygons as inputs. This can be done with the Euclidean Allocation tool in ArcGIS, but a) this requires conversion to raster format and then back, which requires far too much processing time for the whole dataset (a large metropolitan county); and b) it does not return exactly what I want. For example, see below, after running Euclidean Allocation and converting the result back to polygons: This gives me what I want in terms of finding the "across the street" polygons, but note how the polygons on the same side of the street now have artificially longer boundaries. This is important as I need to know the fraction of perimeter touched by each polygon. * Buffer each polygon only into empty space. I suspect this would be more computationally feasible if such a tool existed but a) it doesn't look like there is such a tool; and b) it would lead to the same flawed result as before. * Convert the polygons to lines and then points, and then run a Voronoi diagram. This approach probably could work, but I haven't yet found a workflow that gets me what I want. It would also only be an approximation, but I'd be willing to accept that. There would also be quite a large number of points. * For each polygon, find the nearest polygon in all directions. Basically, for each edge in the polygon, shift it outwards in the exact perpendicular direction until it touches another. For edges that are already shared with another polygon, do nothing. But I don't think such a tool exists. I have searched around and I'm quite surprised that I haven't found an answer, considering that "finding parcels across the street" is probably a common GIS task. I should mention that I have access to most ArcMap functionality. Curious to hear any of your thoughts!
gis.stackexchange.com
January 10, 2026 at 2:04 PM
Change Detection Using Imagery
Change Detection Using Imagery
community.esri.com
January 10, 2026 at 1:58 PM
cut/fill calculation tool to investigate if there is enough material to achieve a 30 degree slope
This is a cut/fill problem. We have pits that have been dug in the ground, usually rectangular. They have a bund wall around them. They are being rehabilitated by pushing the bund back into the pit. Usually the bund is not enough to refill the pit. We need to achieve a maximum 30 degree slope between the original land surface outside the feature and the backfilled material pushed in from the bund. We need to know if we have enough material in the bunds to achieve this angle of slope. We know the bund volume from topographic survey (interpolated the original land surface under the bund from elevation points outside the feature in the topographic data). From this interpolated surface we know the location and height from which the 30 degree slope will start and go down into the pit. Is there a tool in any GIS or CAD program that will take this line (as a polyline or polygon for example), take the angle (in this case 30 degrees) and output a new line or polygon showing where the topographic surface will be intersected, right the way around the pit? With this new line, a TIN could be created of the elevations along it at the bottom of the proposed slope and the elevations of the intersection at the top of the slope between the original land surface and the topographic surface. The topographic surface could then be subtracted from this new TIN to get the volume and see whether it is the same or less than the volume in the bund. If there is a tool to automate this, it would make life much easier. Otherwise we could calculate a few points around the pit manually for a coarser estimate.
gis.stackexchange.com
January 10, 2026 at 1:06 PM
GeoServer producing transparent images for cascaded WMTS service when reprojected
I'm cascading a WMTS service through GeoServer so I can consume it as a WMS service. This part now works with the below URLs after a very recent bug fix. I'm now attempting to reproject the coordinate system in order to allow WMS service calls using the localized coordinate system. Unfortunately all WMS calls using the reprojected SRS result in transparent images being served up rather than the expected imagery. Any ideas of any steps I might be missing, problems with the WMS urls I'm constructing, or whether this might be due to a bug in GeoServer? I'm consuming the following NZ Topo50 Maps service using the following WMTS capabilities endpoint: * https://data.linz.govt.nz/services;key=e501b3b9aa96472a85fe188cc8919487/wmts/1.0.0/layer/50767/WMTSCapabilities.xml Then I'm reprojecting the layer using the following settings: An example WMS request I'm attempting to make using a bbox of 1221300,4965200,1293300,5037200 in the native EPSG:2193 coordinates: * http://localhost:8080/geoserver/wms?service=WMS&version=1.1.1&request=GetMap&layers=gavin%3Anztopo50&bbox=1221300%2C4965200%2C1293300%2C5037200&srs=EPSG%3A2193&width=500&height=500&format=image%2Fpng This is the area of imagery I'm expecting to see instead of the transparent image: Workaround attempt... Based on the feedback from Ian Turton I decided to try a work-around where I took the original WMTS capabilities XML served up by LINZ, stripped out the EPSG:3857 capabilities, then hosted the modified XML myself to register with GeoServer. All looked promising, with GeoServer defaulting to EPSG:2193. However all requests made for imagery resulted in the following error being returned: Error rendering coverage on the fast path java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0 Width (0) and height (0) cannot be <= 0 The modified capabilities XML: LINZ Data Service OGC WMTS 1.0.0 Land Information New Zealand KVP KVP NZ Topo50 Maps The Topo50 map series provides topographic mapping for the New Zealand mainland, the Chatham Islands, and offshore islands at 1:50,000 scale. Along with the paper-based Topo50 map series, digital images of the maps are also publicly available. Georeferenced raster digital images are provided at a resolution of 300 DPI. Georeferencing allows adjacent maps to be accurately and automatically aligned within GIS systems. For more information, and a description of the georeferencing keys: http://www.linz.govt.nz/topography/topo-maps/topo50/digital-images Please be aware of the following: - Representation of a road or track does not necessarily indicate public right of access. For access rights, maps and other information, contact the New Zealand Walking Access Commission - www.walkingaccess.govt.nz - The Department of Conservation and other agencies should be contacted for the latest information on tracks and back country huts. Closed tracks are defined as being no longer maintained or passable and should not be used. - Not all aerial wires, cableways and obstructions that could be hazardous to aircraft are held in the data. - Contours and spot elevations in forest and snow areas may be less accurate. - Not all pipelines including both underground and above ground are held in the data or shown on the printed maps. For the latest information please contact the utility and infrastructure agencies - Permits may be required to visit some sensitive and special islands and areas. Contact the Department of Conservation to see if you need to apply for a permit. layer-50767 4722000.451500 1083997.8831996234002.116809 2092005.116774 166.315719 -47.534529178.610868 -34.030252 Automatic Style style=auto image/png EPSG:2193 NZTM2000 EPSG:2193 3087000.000000 274000.0000007173000.000000 3327000.000000 urn:ogc:def:crs:EPSG::2193 0 32000000 10000000.0 -1000000.0 256 256 2 4 1 16000000 10000000.0 -1000000.0 256 256 4 7 2 8000000 10000000.0 -1000000.0 256 256 8 13 3 4000000 10000000.0 -1000000.0 256 256 16 25 4 2000000 10000000.0 -1000000.0 256 256 31 49 5 1000000 10000000.0 -1000000.0 256 256 61 97 6 500000 10000000.0 -1000000.0 256 256 121 193 7 250000 10000000.0 -1000000.0 256 256 242 386 8 100000 10000000.0 -1000000.0 256 256 604 965 9 50000 10000000.0 -1000000.0 256 256 1208 1929 10 25000 10000000.0 -1000000.0 256 256 2415 3858 11 10000 10000000.0 -1000000.0 256 256 6037 9645 12 5000 10000000.0 -1000000.0 256 256 12074 19289 13 2500 10000000.0 -1000000.0 256 256 24147 38578 14 1000 10000000.0 -1000000.0 256 256 60366 96443 15 500 10000000.0 -1000000.0 256 256 120732 192886 16 250 10000000.0 -1000000.0 256 256 241463 385771 The full error stack from GeoServer log: 2020-11-27 09:35:07,587 ERROR [geoserver.ows] - org.geoserver.platform.ServiceException: Error rendering coverage on the fast path at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:348) at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:261) at org.geoserver.wms.map.RenderedImageMapOutputFormat.produceMap(RenderedImageMapOutputFormat.java:127) at org.geoserver.wms.GetMap.executeInternal(GetMap.java:749) at org.geoserver.wms.GetMap.run(GetMap.java:300) at org.geoserver.wms.GetMap.run(GetMap.java:123) at org.geoserver.wms.DefaultWebMapService.getMap(DefaultWebMapService.java:246) at jdk.internal.reflect.GeneratedMethodAccessor408.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.geoserver.kml.WebMapServiceKmlInterceptor.invoke(WebMapServiceKmlInterceptor.java:38) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke(CacheSeedingWebMapService.java:55) at org.geoserver.gwc.wms.CacheSeedingWebMapService.invoke(CacheSeedingWebMapService.java:31) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.geoserver.gwc.wms.CachingWebMapService.invoke(CachingWebMapService.java:61) at org.geoserver.gwc.wms.CachingWebMapService.invoke(CachingWebMapService.java:41) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.geoserver.ows.util.RequestObjectLogger.invoke(RequestObjectLogger.java:50) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy115.getMap(Unknown Source) at jdk.internal.reflect.GeneratedMethodAccessor363.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.geoserver.ows.Dispatcher.execute(Dispatcher.java:877) at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:265) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623) at org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:26) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:69) at org.geoserver.wms.animate.AnimatorFilter.doFilter(AnimatorFilter.java:70) at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:66) at org.geoserver.filters.SpringDelegatingFilter.doFilter(SpringDelegatingFilter.java:41) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.platform.AdvancedDispatchFilter.doFilter(AdvancedDispatchFilter.java:37) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.geoserver.security.filter.GeoServerAnonymousAuthenticationFilter.doFilter(GeoServerAnonymousAuthenticationFilter.java:51) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) at org.geoserver.security.filter.GeoServerBasicAuthenticationFilter.doFilter(GeoServerBasicAuthenticationFilter.java:81) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:70) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) at org.geoserver.security.filter.GeoServerSecurityContextPersistenceFilter$1.doFilter(GeoServerSecurityContextPersistenceFilter.java:52) at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:74) at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) at org.geoserver.security.GeoServerSecurityFilterChainProxy.doFilter(GeoServerSecurityFilterChainProxy.java:142) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:101) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.filters.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:77) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:47) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.filters.SessionDebugFilter.doFilter(SessionDebugFilter.java:46) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.geoserver.filters.FlushSafeFilter.doFilter(FlushSafeFilter.java:42) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:152) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.Server.handle(Server.java:505) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.geoserver.platform.ServiceException: java.lang.IllegalArgumentException: Width (0) and height (0) cannot be
gis.stackexchange.com
January 10, 2026 at 9:05 AM
Using Vegetation Condition Index Function in Google Earth Engine JavaScript API
I created a code in Google Earth Engine to calculate monthly VCI. The official equation for VCI is the following: VCI = 100*(NDVI - NDVImin)/(NDVImax - NDVImin) My problem is that I don't know how to relate the placeholders (NDVI, NDVImin, NDVImax) to the right images and data from my image collection. Because I have an Image Collection with 126 monthly NDVI Images And I have two Image Collections (one for max and one for min NDVI values) with 6 images. From April to September one Image per month. Now I have to calculate with the 6 images of the two extreme Image Collections to the monthly Image Collection. It is difficult to explain but attached you can find my code. The problem should be in the almost last lines. The GEE Code can be found here: https://code.earthengine.google.com/?scriptPath=users%2Fjohanneswilk%2Ftest%3ATest_13%20MODIS%20VCI%202 //preprocessing steps... // --------------------------------------------------------------------------------------------- ///// MODIS Monthly NDVI Anomaly Calculation I ///// // Monatliche NDVI Kompisition erstellen von April bis September für jedes Jahr // Create NDVI composite for every month var monthlyNDVI = ee.ImageCollection.fromImages( years.map(function (y) { return months.map(function(m) { var monthly = ndviCollection .filter(ee.Filter.calendarRange(y, y, "year")) .filter(ee.Filter.calendarRange(m, m, "month")) .mean(); return monthly .set("year", y) .set("month", m) .set("system:time_start", ee.Date.fromYMD(y, m, 1));}); }) .flatten()); print (monthlyNDVI, 'monthly NDVI') // Für jeden Monat werden die NDVI Maximal Werte ausgerechnet --> somit bekommen wir eine // MAX Value Composition // Calculate mean values for each month over all years var MonthlyMAX = ee.ImageCollection.fromImages(months .map(function (m) { var maxNDVI = monthlyNDVI .filter(ee.Filter.eq("month", m)) .select("NDVI") .reduce(ee.Reducer.percentile({percentiles: [90]})) .rename("max_NDVI"); return maxNDVI .set("month", m);}) .flatten()); print (MonthlyMAX, 'MonthlyMAX'); Map.addLayer (MonthlyMAX.first().select('max_NDVI').clip(roi), {min:0, max:1, 'palette': ['red','yellow', 'green']}, 'MonthlyMAX') // Für jeden Monat werden die NDVI Minimal Werte ausgerechnet --> somit bekommen wir eine // MIN Value Compisition var MonthlyMIN = ee.ImageCollection.fromImages(months .map(function (m) { var minNDVI = monthlyNDVI .filter(ee.Filter.eq("month", m)) .select("NDVI") .reduce(ee.Reducer.percentile({percentiles: [10]})) .rename("min_NDVI"); return minNDVI .set("month", m);}) .flatten()); print (MonthlyMIN, 'MonthlyMIN'); Map.addLayer (MonthlyMIN.first().select('min_NDVI').clip(roi), {min:0, max:1, 'palette': ['red','yellow', 'green']}, 'MonthlyMIN') //Create a list to calulate the Index for each image related to each month var vci_list = []; for(var j = startyear; j
gis.stackexchange.com
January 10, 2026 at 6:13 AM