ชนิดข้อมูลเชิงพื้นที่
จุด เส้น และรูปหลายเหลี่ยมใน SQL
ชนิดข้อมูลเชิงพื้นที่ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ข้อมูลเชิงพื้นที่คืออะไร
ข้อมูลเชิงพื้นที่ใช้อธิบายตำแหน่ง รูปร่าง และพื้นที่ของสิ่งต่าง ๆ ในโลกจริง ต่างจากตัวเลขหรือสตริงทั่วไป ค่าข้อมูลเชิงพื้นที่มีความหมายทางรูปทรงอยู่ด้วย เช่น จุดบนแผนที่ ส่วนของถนน หรือแนวเขตของประเทศ
PostGIS เป็นส่วนขยายของ PostgreSQL ที่เพิ่มชนิดข้อมูลและฟังก์ชันเชิงพื้นที่อันทรงพลัง ทำให้ฐานข้อมูลของคุณกลายเป็นระบบสารสนเทศภูมิศาสตร์ (GIS) แบบเต็มรูปแบบ
-- Enable the PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;ชนิด GEOMETRY
ชนิดข้อมูลเชิงพื้นที่หลักใน PostGIS คือ เรขาคณิต ซึ่งจัดเก็บรูปร่างในระบบพิกัดแบบราบ (แบบยุคลิด) คุณสามารถระบุชนิดย่อย เช่น POINT, LINESTRING หรือ POLYGON เป็นข้อจำกัดเมื่อสร้างคอลัมน์ได้
การระบุ SRID (รหัสอ้างอิงเชิงพื้นที่ ID) ร่วมกับชนิดย่อยจะแจ้งให้ PostGIS ทราบว่าข้อมูลของคุณใช้ระบบพิกัดใด
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom geometry(POINT, 4326)
);การแทรก POINT
POINT แทนตำแหน่งเดียวที่มีพิกัด X (ลองจิจูด) และ Y (ละติจูด) ฟังก์ชัน ST_GeomFromText จะแปลงสตริงข้อความรูปแบบที่รู้จักกันดี (WKT) ให้เป็นค่าข้อมูลเรขาคณิต
SRID 4326 คือระบบพิกัด WGS 84 ที่อุปกรณ์ GPS ทั่วโลกใช้งาน
INSERT INTO locations (name, geom)
VALUES
('Eiffel Tower', ST_GeomFromText('POINT(2.2945 48.8584)', 4326)),
('Big Ben', ST_GeomFromText('POINT(-0.1246 51.5007)', 4326)),
('Colosseum', ST_GeomFromText('POINT(12.4922 41.8902)', 4326));
SELECT name, ST_AsText(geom) AS wkt FROM locations;ชนิด LINESTRING
LINESTRING คือลำดับจุดตั้งแต่สองจุดขึ้นไปที่เชื่อมต่อกันด้วยส่วนของเส้นตรง เหมาะอย่างยิ่งสำหรับแทนถนน แม่น้ำ หรือสิ่งใด ๆ ที่มีลักษณะเป็นเส้น
ตัวเลขแต่ละคู่ใน WKT แทนจุดยอดหนึ่งจุด (ลองจิจูด ละติจูด) PostGIS จัดเก็บเส้นทางทั้งหมดเป็นค่าข้อมูลเรขาคณิตเพียงค่าเดียว
CREATE TABLE roads (
id SERIAL PRIMARY KEY,
name TEXT,
path geometry(LINESTRING, 4326)
);
INSERT INTO roads (name, path)
VALUES (
'High Street',
ST_GeomFromText(
'LINESTRING(-0.125 51.500, -0.120 51.502, -0.115 51.505)',
4326
)
);
SELECT name, ST_Length(path) AS length_degrees FROM roads;ชนิด POLYGON
POLYGON ใช้กำหนดพื้นที่ปิดล้อม ขอบเขตด้านนอกเป็นวงแหวน ซึ่งก็คือ LINESTRING แบบปิดที่จุดแรกและจุดสุดท้ายเหมือนกัน รูปหลายเหลี่ยมยังมีวงแหวนด้านใน (ช่องว่าง) เพื่อแทนพื้นที่อย่างทะเลสาบภายในสวนสาธารณะได้ด้วย
วงแหวนทั้งหมดต้องปิด: ให้ใส่พิกัดเริ่มต้นซ้ำอีกครั้งที่ท้ายข้อมูล
CREATE TABLE zones (
id SERIAL PRIMARY KEY,
name TEXT,
area geometry(POLYGON, 4326)
);
INSERT INTO zones (name, area)
VALUES (
'Central Park Approx',
ST_GeomFromText(
'POLYGON((-73.9817 40.7681, -73.9580 40.7681,
-73.9580 40.7964, -73.9817 40.7964,
-73.9817 40.7681))',
4326
)
);
SELECT name, ST_Area(area) AS area_sq_deg FROM zones;GEOGRAPHY กับ GEOMETRY
PostGIS มีชนิดข้อมูลเชิงพื้นที่อยู่สองกลุ่ม: เรขาคณิต ใช้ระนาบคาร์ทีเซียนแบบราบ ส่วน ภูมิศาสตร์ จำลองโลกเป็นทรงรีโค้ง
ใช้ ภูมิศาสตร์ เมื่อต้องการคำนวณระยะทางจริงบนโลกเป็นเมตรอย่างแม่นยำในพื้นที่ขนาดใหญ่ ใช้ เรขาคณิต เมื่อต้องทำงานในระบบพิกัดฉายเฉพาะพื้นที่ หรือต้องการประสิทธิภาพสูงสุด
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT,
geog geography(POINT, 4326)
);
INSERT INTO cities (name, geog) VALUES
('New York', ST_GeogFromText('POINT(-74.0060 40.7128)')),
('London', ST_GeogFromText('POINT(-0.1278 51.5074)'));
-- Distance in metres using geography
SELECT
a.name AS from_city,
b.name AS to_city,
ROUND(ST_Distance(a.geog, b.geog)::NUMERIC) AS distance_m
FROM cities a, cities b
WHERE a.name = 'New York' AND b.name = 'London';WKT และ WKB รูปแบบข้อความและไบนารีที่รู้จักกันดี
ข้อมูลเชิงพื้นที่สามารถทำให้เป็นอนุกรมในรูปแบบมาตรฐานได้สองรูปแบบ ข้อความรูปแบบที่รู้จักกันดี (WKT) อ่านได้โดยมนุษย์: POINT(2.29 48.86) ส่วน ไบนารีรูปแบบที่รู้จักกันดี (WKB) เป็นการแทนข้อมูลแบบไบนารีขนาดกะทัดรัด ซึ่งใช้ภายในระบบและสำหรับถ่ายโอนข้อมูล
PostGIS มี ST_AsText และ ST_AsBinary สำหรับแปลงระหว่างการจัดเก็บภายในกับรูปแบบเหล่านี้
SELECT
name,
ST_AsText(geom) AS wkt,
ST_AsEWKT(geom) AS ewkt,
encode(ST_AsBinary(geom), 'hex') AS wkb_hex
FROM locations
LIMIT 2;MULTIPOINT, MULTILINESTRING, MULTIPOLYGON
PostGIS ยังรองรับชนิดข้อมูล เรขาคณิตหลายรูป ซึ่งรวมรูปร่างหลายรูปที่เป็นชนิดเดียวกันไว้ในค่าเดียว เหมาะสำหรับกรณีที่สิ่งหนึ่งในโลกจริงประกอบด้วยส่วนที่ไม่ต่อเนื่องกัน เช่น หมู่เกาะที่จำลองด้วย MULTIPOLYGON
ฟังก์ชันเชิงพื้นที่มาตรฐานทั้งหมดทำงานกับข้อมูลเรขาคณิตหลายรูปในลักษณะเดียวกัน
SELECT ST_AsText(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS multi_poly;
SELECT ST_NumGeometries(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS part_count;GEOMETRYCOLLECTION
GEOMETRYCOLLECTION เป็นชนิดข้อมูลเชิงพื้นที่ที่ครอบคลุมที่สุด โดยสามารถเก็บจุด เส้น และรูปหลายเหลี่ยมหลายชนิดรวมกันไว้ในค่าเดียว ความยืดหยุ่นนี้มีประโยชน์เมื่อชุดข้อมูลอาจมีชนิดข้อมูลเรขาคณิตที่หลากหลายจัดเก็บอยู่ในคอลัมน์เดียวกัน
คุณสามารถแยกสมาชิกแต่ละรายการออกมาได้ด้วย ST_GeometryN
SELECT ST_AsText(
ST_GeomFromText(
'GEOMETRYCOLLECTION(
POINT(1 1),
LINESTRING(0 0, 1 1, 2 2),
POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))
)'
)
) AS collection;
SELECT ST_AsText(
ST_GeometryN(
ST_GeomFromText(
'GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(0 0, 1 1))'
),
1
)
) AS first_member;ดัชนีเชิงพื้นที่ด้วย GIST
คำค้นเชิงพื้นที่ที่ตรวจสอบการครอบคลุมหรือความใกล้เคียงต้องเปรียบเทียบข้อมูลเรขาคณิตของทุกแถว ซึ่งอาจทำให้ต้องสแกนรูปร่างนับล้านรายการ ดัชนี GIST ช่วยเร่งการทำงานได้อย่างมากด้วยการจัดทำดัชนีกล่องขอบเขตของข้อมูลเรขาคณิต ทำให้ PostgreSQL ข้ามแถวที่ไม่มีทางตรงตามเงื่อนไขได้
ควรสร้างดัชนี GIST บนคอลัมน์เรขาคณิตหรือภูมิศาสตร์ที่มีการค้นหาบ่อยเสมอ
-- Create a GIST index on a geometry column
CREATE INDEX idx_locations_geom
ON locations
USING GIST (geom);
-- PostgreSQL will now use the index for spatial operators
EXPLAIN ANALYZE
SELECT name
FROM locations
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(2.3 48.9)', 4326),
1.0
);การอ่านคุณสมบัติของข้อมูลเรขาคณิต
PostGIS มีฟังก์ชันเข้าถึงสำหรับดึงคุณสมบัติจากข้อมูลเรขาคณิตใด ๆ ST_X และ ST_Y คืนค่าพิกัดของจุด ST_SRID คืนค่ารหัสอ้างอิงเชิงพื้นที่ และ ST_GeometryType คืนค่าชื่อชนิดย่อย
ฟังก์ชันเหล่านี้จำเป็นอย่างยิ่งสำหรับตรวจสอบและยืนยันความถูกต้องของข้อมูลเชิงพื้นที่
SELECT
name,
ST_X(geom) AS longitude,
ST_Y(geom) AS latitude,
ST_SRID(geom) AS srid,
ST_GeometryType(geom) AS geom_type,
ST_IsValid(geom) AS is_valid
FROM locations;ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับชนิดข้อมูลเชิงพื้นที่ของ PostGIS
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้สำรวจชนิดข้อมูลเชิงพื้นที่หลักที่ PostGIS มีให้ คุณได้เรียนรู้ว่า POINT, LINESTRING และ POLYGON เป็นชนิดย่อยพื้นฐานสามชนิดของข้อมูลเรขาคณิต และชนิดเรขาคณิตหลายรูป (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON) รวมถึง GEOMETRYCOLLECTION ซึ่งเป็นชนิดที่รองรับทั่วไป ช่วยจัดการรูปร่างที่ซับซ้อนยิ่งขึ้น
คุณได้เห็นความแตกต่างระหว่างชนิด เรขาคณิต แบบราบกับชนิด ภูมิศาสตร์ แบบทรงรี และได้เรียนรู้วิธีเลือกใช้แต่ละชนิด ข้อความรูปแบบที่รู้จักกันดี (WKT) ช่วยให้คุณอ่านและเขียนค่าข้อมูลเชิงพื้นที่เป็นสตริงที่มนุษย์อ่านได้ ขณะที่ดัชนี GISTช่วยให้คำค้นเชิงพื้นที่ยังคงทำงานได้รวดเร็วเมื่อข้อมูลมีขนาดใหญ่ ฟังก์ชันเข้าถึง เช่น ST_X, ST_SRID และ ST_GeometryType ช่วยให้คุณตรวจสอบค่าข้อมูลเรขาคณิตใด ๆ ได้โดยตรงในเอสคิวแอล
คำถามที่พบบ่อย
บทเรียน “ชนิดข้อมูลเชิงพื้นที่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิดข้อมูลเชิงพื้นที่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิดข้อมูลเชิงพื้นที่”
จุด เส้น และรูปหลายเหลี่ยมใน SQL คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ชนิดข้อมูลเชิงพื้นที่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดข้อมูลเชิงพื้นที่
- ระยะทางและเพื่อนบ้านที่ใกล้ที่สุด
- การเชื่อมตารางเชิงพื้นที่และการตรวจสอบการครอบคลุม
- ดัชนีเชิงพื้นที่ (GiST)