39 votos

Creación de una cuadrícula de puntos regulares dentro de un polígono en PostGIS

¿Cómo crear, dentro de un polígono, una cuadrícula regular de puntos espaciados x,y en PostGIS?

Como el ejemplo:

alt text

0voto

Premium Gamer Puntos 6

Aquí está mi versión de lujo que le permite establecer el relleno de los bordes, y los centros de las parcelas en la geometría (o la extensión de la geometría si su multi). Yo paso geojson, pero debería ser trivial para cambiar eso a una geometría.

CREATE OR REPLACE FUNCTION gridded_points_in_bounds(_geo_json jsonb, _m_spacing real, _m_buffer real)
 RETURNS table (
    lon   float,
    lat   float
 ) AS $$

 DECLARE
    _meters_boundary    geometry;
    _buffered_extent    geometry;
    _x_range            float;
    _y_range            float;
    _x_steps            integer;
    _y_steps            integer;
    _x_padding          float;
    _y_padding          float;
 BEGIN
    SELECT ST_Transform(ST_SetSRID(ST_GeomFromGeoJSON(_geo_json), 4326), 3857) INTO _meters_boundary;

    SELECT ST_Buffer(_meters_boundary, -1 * _m_buffer) INTO _buffered_extent;
    SELECT ST_XMax(_buffered_extent) - ST_XMin(_buffered_extent) INTO _x_range;
    SELECT ST_YMax(_buffered_extent) - ST_YMin(_buffered_extent) INTO _y_range;
    SELECT floor(_x_range / _m_spacing) INTO _x_steps;
    SELECT floor(_y_range / _m_spacing) INTO _y_steps;
    SELECT (_x_range - _x_steps * _m_spacing) / 2 INTO _x_padding;
    SELECT (_y_range - _y_steps * _m_spacing) / 2 INTO _y_padding;

    RETURN QUERY
    SELECT ST_X(ST_Centroid(geom)),
        ST_Y(ST_Centroid(geom))
    FROM (
        SELECT ST_Transform(
            ST_SetSRID(
                ST_POINT(x::float + _x_padding, y::float + _y_padding), ST_SRID(_buffered_extent)
            ),
            4326
        ) as geom
        FROM
            generate_series(floor(st_xmin(_buffered_extent))::int, ceiling(st_xmax(_buffered_extent))::int, _m_spacing::int) AS x,
            generate_series(floor(st_ymin(_buffered_extent))::int, ceiling(st_ymax(_buffered_extent))::int, _m_spacing::int) AS y
        WHERE ST_Intersects(
            _buffered_extent,
            ST_SetSRID(ST_POINT(x::float + _x_padding, y::float + _y_padding), ST_SRID(_buffered_extent))
        )
    ) a;

 END

$$ LANGUAGE PLPGSQL;

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