أكثر

فشل إدراج PostGIS بدون رفع الخطأ

فشل إدراج PostGIS بدون رفع الخطأ


أتعلم PostGIS من خلال كتاب "PostGIS في العمل".

يحتوي رمز SQL المكتوب في الكتاب على الكثير من المشكلات وقد اكتشفت معظمها باستثناء هذه المشكلة:

منسوخ من باب الكتاب:

CREATE TABLE ch03.paris_points (gid SERIAL PRIMARY KEY، osm_id عدد صحيح، ar_num عدد صحيح، feature_name varchar (200)، feature_type varchar (50)) ؛ حدد AddGeometryColumn ('ch03'، 'paris_points'، 'geom'، 32631، 'POINT'، 2) ؛ INSERT INTO ch03.paris_points (osm_id، ar_num، geom، feature_name، feature_type) حدد osm_id، ar_num، geom، tags -> 'name' As feature_name، COALESCE (tags -> 'Tourism'، tags -> 'railway'، 'other ') :: varchar (50) كـ feature_type من ch03.paris_hetero حيث ST_GeometryType (geom) =' ST_Point '؛ "

يحتوي ch03.paris_hetero على كل عمود مطلوب. لم يُرجع الاستعلام أي خطأ ولكنه لم يُدرج ، ولم تتم إضافة أي شيء إلى جدول ch03.paris_points.

بعد فحص الشفرة لفترة وجيزة ، لا يمكنني حقاً معرفة أي شيء حدث خطأ.


كقاعدة عامة ، عندما لا يفعل INSERT شيئًا سوى عدم إثارة أي خطأ ، فذلك لأنك تحاول إدراج مجموعة فارغة. كقاعدة عامة أخرى إذا حصلت على مجموعة فارغة هي البحث عن جملة WHERE أولاً.

أيضا القليل من تلميح التصحيح الإضافي لمثل هذه الحالة. عند كتابة INSERT استنادًا إلى جملة SELECT ، حاول تنفيذ جزء SELECT بمفرده لمعرفة ما إذا كانت النتيجة تطابق توقعاتك ، ثم اكتب جملة INSERT في الأعلى.

تعديل: تمت إزالة جزء من الإجابة التي اختلطت بين ST_GeometryType () و GeometryType () كما أشار LR1234567.


إذا قمت بتشغيل العبارة التالية ، فسترى بشكل استباقي أن جدولك لا يحتوي على نقاط على الإطلاق:

حدد * من ch03.paris_hetero WHERE ST_GeometryType (geom) = 'ST_Point' ؛

يمكنك سرد الأنواع الهندسية التي يحتوي عليها جدولك مثل هذا:

حدد ST_GeometryType (geom) المميز من ch03.paris_hetero ؛

أعتقد أنك فاتتك بعض الخطوات من سير عمل PostGIS-In-Action للفصل 3:

- أنشئ امتداد hstore من ملف sql أو في الإصدارات الأحدث فقط

إنشاء hstore ملحق ؛

- - قم بتشغيل planet_osm_line.sql من المجلد الفرعي "raw_data_files"

- ثم تعليم المنطقة وتقطيع البيانات إلى دائرة معينة

INSERT INTO ch03.paris_hetero (osm_id، geom، ar_num، tags) - [1 BEG] SELECT o.osm_id، ST_Intersection (o.geom، a.geom) مثل geom، a.ar_num، o.tags FROM (SELECT osm_id، ST_Transform (way، 32631) كـ geom ، علامات من planet_osm_line) AS o INNER JOIN ch03.arrondissements AS A ON (ST_Intersects (o.geom، a.geom)) ؛

- - قم بتشغيل planet_osm_point.sql من المجلد الفرعي "raw_data_files"

- - قم بتشغيل planet_osm_polygon.sql من المجلد الفرعي "raw_data_files"

- كرر الأمر مع planet_osm_polygon و planet_osm_point - لم تظهر في الكتاب

INSERT INTO ch03.paris_hetero (osm_id، geom، ar_num، tags) حدد o.osm_id، ST_Intersection (o.geom، a.geom) مثل geom، a.ar_num، o.tags FROM (SELECT osm_id، ST_Transform (way، 32631) مثل geom ، العلامات من planet_osm_polygon) AS o INNER JOIN ch03.arrondissements AS A ON (ST_Intersects (o.geom، a.geom)) ؛ INSERT INTO ch03.paris_hetero (osm_id، geom، ar_num، tags) حدد o.osm_id، o.geom، a.ar_num، o.tags FROM (SELECT osm_id، ST_Transform (way، 32631) as geom، tags FROM planet_osm_point) AS o INNER JOIN ch03.arrondissements AS A ON (ST_Intersects (o.geom، a.geom)) ؛

- اصنع طاولتك

CREATE TABLE ch03.paris_points (gid SERIAL PRIMARY KEY، osm_id عدد صحيح، ar_num عدد صحيح، feature_name varchar (200)، feature_type varchar (50)) ؛ حدد AddGeometryColumn ('ch03'، 'paris_points'، 'geom'، 32631، 'POINT'، 2) ؛

- أو أفضل فقط

CREATE TABLE ch03.paris_points (gid SERIAL PRIMARY KEY ، osm_id عدد صحيح ، ar_num عدد صحيح ، feature_name varchar (200) ، feature_type varchar (50) ، geom geometry (Point ، 32631)) ؛

- املأ طاولتك

INSERT INTO ch03.paris_points (osm_id، ar_num، geom، feature_name، feature_type) حدد osm_id، ar_num، geom، tags -> 'name' As feature_name، COALESCE (tags -> 'Tourism'، tags -> 'railway'، 'other ') :: varchar (50) كـ feature_type من ch03.paris_hetero حيث ST_GeometryType (geom) =' ST_Point '؛

- تحقق من إدراج النقاط:

حدد * من ch03.paris_points ؛


شاهد الفيديو: PostgreSQL Tutorial: How to download and install PostGIS Extension EN