PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

ST_HexagonGrid geom वेक्टर सभी बिंदुओं को खोजने के लिए

लेखक के अनुसार, निम्नलिखित फ़ंक्शन को दिए गए BBOX और मीटर में सेल आकार के आधार पर एक ग्रिड बनाना चाहिए ।

<ब्लॉककोट>

SRID 3857 इकाइयाँ [बहुत लगभग] मीटर हैं, और इस प्रोजेक्शन का उपयोग करने से हेक्स सेल बनेंगे जो वेब मैप पर "सही दिखते हैं" (जिनमें से अधिकांश वेब मर्केटर प्रोजेक्शन का उपयोग करते हैं)।

CREATE OR REPLACE FUNCTION generate_hexgrid(width float, xmin float, ymin float, xmax float, ymax float, srid int default 3857)
RETURNS TABLE(gid text,geom geometry(Polygon)) AS $$
DECLARE
  b float := width / 2;
  a float := tan(radians(30)) * b;
  c float := 2 * a;
  height float := 2 * (a + c);
  index_xmin int := floor(xmin / width);
  index_ymin int := floor(ymin / height);
  index_xmax int := ceil(xmax / width);
  index_ymax int := ceil(ymax / height);
  snap_xmin float := index_xmin * width;
  snap_ymin float := index_ymin * height;
  snap_xmax float := index_xmax * width;
  snap_ymax float := index_ymax * height;
  ncol int := abs(index_xmax - index_xmin);
  nrow int := abs(index_ymax - index_ymin);
  polygon_string varchar := 
    'POLYGON((' || 0 || ' ' || 0 || ' , ' || b || ' ' || a || ' , ' ||
    b || ' ' || a + c || ' , ' || 0 || ' ' || a + c + a || ' , ' ||
    -1 * b || ' ' || a + c || ' , ' || -1 * b || ' ' || a || ' , ' ||
    0 || ' ' || 0 ||'))';
BEGIN
  RETURN QUERY
  SELECT 
    format('%s %s %s', width,
    x_offset + (1 * x_series + index_xmin),
    y_offset + (2 * y_series + index_ymin)),
    ST_SetSRID(ST_Translate(two_hex.geom,
    x_series * width + snap_xmin,
    y_series * height + snap_ymin), srid)
  FROM  generate_series(0, ncol, 1) AS x_series,
        generate_series(0, nrow, 1) AS y_series,
    (SELECT 0 AS x_offset, 0 AS y_offset, polygon_string::geometry AS geom
     UNION
     SELECT 0 AS x_offset, 1 AS y_offset, ST_Translate(polygon_string::geometry, b , a + c)  AS geom
    ) AS two_hex;
END; $$ LANGUAGE plpgsql;

यह देखते हुए कि आपके पास usa . नामक एक तालिका है और इसमें इस shapefile . की ज्यामितियां शामिल हैं आपको एक ग्रिड बनाने में सक्षम होना चाहिए जो निम्नलिखित क्वेरी के साथ संयुक्त राज्य अमेरिका के नक्शे को ओवरलैप करता है:

CREATE TABLE usa_hex AS
WITH j AS (
SELECT ST_Transform((hex).geom,4326) AS hex FROM ( 
  SELECT 
  generate_hexgrid(
    80467,
    ST_XMin(ST_Extent(ST_Transform(geom,3857))) ,
    ST_YMin(ST_Extent(ST_Transform(geom,3857))) ,
    ST_XMax(ST_Extent(ST_Transform(geom,3857))) ,
    ST_YMax(ST_Extent(ST_Transform(geom,3857))) ) AS hex
FROM usa)i) 
SELECT j.hex FROM j,usa
WHERE ST_Intersects(usa.geom,j.hex);

संपादित करें :यह अभी भी कोई उत्तर नहीं है, क्योंकि यह मीटर का उपयोग करके षट्भुज नहीं बनाता है, लेकिन यह अन्य उपयोगकर्ताओं की मदद कर सकता है। निम्नलिखित फ़ंक्शन (इस answer से प्राप्त किया गया है ) ज्यामिति प्रकार . बनाता है डिग्री . में ठीक उसी आकार के षट्भुज .

CREATE OR REPLACE FUNCTION generate_hexagons(width FLOAT, bbox BOX2D, srid INTEGER DEFAULT 4326)
RETURNS TABLE (gid INTEGER, hexagon GEOMETRY) AS $$
DECLARE
  b FLOAT := width/2;
  a FLOAT := b/2;
  c FLOAT := 2*a;
  height FLOAT := 2*a+c;
  ncol FLOAT := ceil(abs(ST_Xmax(bbox)-ST_Xmin(bbox))/width);
  nrow FLOAT := ceil(abs(ST_Ymax(bbox)-ST_Ymin(bbox))/height);
  polygon_string VARCHAR := 'POLYGON((' || 
    0 || ' ' || 0 || ' , ' || b || ' ' || a || ' , ' || b || ' ' || a+c || ' , ' || 0 || ' ' || a+c+a || ' , ' ||
   -1*b || ' ' || a+c || ' , ' || -1*b || ' ' || a || ' , ' || 0 || ' ' || 0 || '))';
BEGIN    
  RETURN QUERY 
  SELECT 
    row_number() OVER ()::INTEGER,
    ST_SetSRID(
      ST_Translate(geom, x_series*(2*a+c)+ST_Xmin(bbox), y_series*(2*(c+a))+ST_Ymin(bbox)),srid)
  FROM generate_series(0, ncol::INTEGER, 1) AS x_series,
       generate_series(0, nrow::INTEGER,1 ) AS y_series,
       (SELECT polygon_string::GEOMETRY AS geom
        UNION
        SELECT ST_Translate(polygon_string::GEOMETRY, b, a + c) AS geom) AS two_hex;    
END;
$$ LANGUAGE plpgsql;

ऊपर उपयोग किए गए डेटा सेट के साथ ओवरलैपिंग:

WITH j (hex_rec) AS (
  SELECT generate_hexagons(3.0,ST_Extent(geom)) 
  FROM usa
)
SELECT (hex_rec).gid,(hex_rec).hexagon FROM j, usa 
WHERE ST_Intersects(usa.geom,(hex_rec).hexagon);

आगे पढ़ें:

  • ST_Extent
  • ST_Intersects



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं PostgreSQL में टाइमस्टैम्प को स्वचालित रूप से कैसे अपडेट करूं

  2. PostgreSQL अपग्रेड को खोलना

  3. क्या पोस्टग्रेज JSON इंडेक्स क्लासिक सामान्यीकृत तालिकाओं की तुलना में पर्याप्त कुशल हैं?

  4. दूसरा चतुर्थांश Deutschland - विशेष प्रशिक्षण शुरुआती सौदेबाजी

  5. आप Postgres . में अपनी सभी तालिकाओं के लिए पंक्ति गणना कैसे प्राप्त करते हैं?