Skip to content

Instantly share code, notes, and snippets.

@zzuummaa
Last active March 19, 2021 15:04
Show Gist options
  • Save zzuummaa/84233aff65108485cf8596fe419af83b to your computer and use it in GitHub Desktop.
Save zzuummaa/84233aff65108485cf8596fe419af83b to your computer and use it in GitHub Desktop.
CREATE TABLE global_points (
id SERIAL PRIMARY KEY,
name VARCHAR(64),
location GEOGRAPHY(POINT, 4326)
);
INSERT INTO global_points (name, location) VALUES ('Test', 'POINT(-110 30)');
select name, st_asewkt(location) FROM global_points;
select name, st_asewkt(location) FROM global_points
WHERE
-- st_within(location::geometry,ST_Buffer(ST_GeomFromText('POINT(49.94 50)')::geography, 3500)::geometry);
st_distance(location, ST_GeomFromText('POINT(49.94 50)')) < 3500;
INSERT INTO global_points(name, location)
SELECT null, RandomPointsInPolygon(geom, 400000)
FROM (
-- SELECT ST_Union(ARRAY[
-- ST_Buffer(ST_GeomFromText('POINT(49.94 50)')::geography, 3500)::geometry,
-- ST_Buffer(ST_GeomFromText('POINT(50.06 50)')::geography, 3500)::geometry,
-- ST_Buffer(ST_GeomFromText('LINESTRING(50 50, 50 50.15)')::geography, 3000)::geometry
-- ]) as geom
SELECT ST_Buffer(ST_GeomFromText('POINT(50 50)')::geography, 100000)::geometry as geom
) AS s;
SELECT RandomPointsInPolygon(geom, 1000)
FROM (
SELECT ST_Buffer(ST_GeomFromText('POINT(49.5 49.5)')::geography, 5000)::geometry as geom
) AS s;
SELECT COUNT(*) FROM global_points;
SELECT RandomPointsInPolygon(geom, 1000)
FROM (
SELECT ST_Union(ARRAY[
ST_Buffer(ST_GeomFromText('POINT(49.94 50)')::geography, 3500)::geometry,
ST_Buffer(ST_GeomFromText('POINT(50.06 50)')::geography, 3500)::geometry,
ST_Buffer(ST_GeomFromText('LINESTRING(50 50, 50 50.15)')::geography, 3000)::geometry
]) as geom
) AS s;
DROP TABLE global_points;
CREATE INDEX location_index ON global_points USING GIST (location);
DROP INDEX location_index;

Добавить поддержку выбора случайной точки из полигона: https://trac.osgeo.org/postgis/wiki/UserWikiRandomPoint

CREATE TABLE global_points (
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    location GEOGRAPHY(POINT, 4326)
);

INSERT INTO global_points(name, location)
SELECT null, RandomPointsInPolygon(geom, 1000)
FROM (
  SELECT ST_Buffer(
    ST_GeomFromText('CIRCULARSTRING(49 49, 50 50, 49 50)'),
    10,
    'endcap=round join=round'
  ) AS geom
) AS s;

Выборка из таблицы:

select name, st_asewkt(location) FROM global_points;

Создание областей поиска сложной формы:

SELECT RandomPointsInPolygon(geom, 2000)
FROM (
    SELECT ST_Union(ARRAY[
        ST_Buffer(ST_GeomFromText('POINT(49.94 50)')::geography, 3500)::geometry,
        ST_Buffer(ST_GeomFromText('POINT(50.06 50)')::geography, 3500)::geometry,
        ST_Buffer(ST_GeomFromText('LINESTRING(50 50, 50 50.15)')::geography, 3000)::geometry
    ]) as geom
) AS s;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment