Loại dữ liệu nào mà một cặp tọa độ kinh độ thường sử dụng trong python?

Phân tích không gian địa lý cho phép bạn phân tích dữ liệu địa lý trong BigQuery. Dữ liệu địa lý còn được gọi là dữ liệu không gian địa lý

Các loại đối tượng phổ biến khi làm việc với dữ liệu không gian địa lý bao gồm:

  • Một hình học đại diện cho một diện tích bề mặt trên trái đất. Nó thường được mô tả bằng điểm, đường, đa giác hoặc tập hợp các điểm, đường và đa giác. Một bộ sưu tập hình học là một hình học đại diện cho sự kết hợp không gian của tất cả các hình dạng trong bộ sưu tập
  • Một tính năng không gian đại diện cho một đối tượng không gian logic. Nó kết hợp một hình học với các thuộc tính bổ sung dành riêng cho ứng dụng
  • Bộ sưu tập đặc trưng không gian là một tập hợp các đặc trưng không gian

Trong BigQuery, loại dữ liệu đại diện cho một giá trị hình học hoặc bộ sưu tập hình học. Để thể hiện các đối tượng không gian, hãy tạo một bảng có cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 cho hình học cùng với các cột bổ sung cho các thuộc tính. Mỗi hàng của bảng là một đối tượng không gian và toàn bộ bảng đại diện cho một bộ sưu tập đối tượng không gian

Kiểu dữ liệu

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 mô tả một tập hợp điểm trên bề mặt Trái đất. Tập hợp điểm là tập hợp các điểm, đường thẳng và đa giác trên hình cầu tham chiếu, với các cạnh trắc địa. Bạn có thể sử dụng kiểu dữ liệu
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 bằng cách gọi một trong các hàm địa lý SQL chuẩn của Google

Đang tải dữ liệu không gian địa lý

Các điểm đơn lẻ trên Trái đất có thể được mô tả chỉ bằng một cặp kinh độ, vĩ độ. Ví dụ: bạn có thể tải tệp CSV chứa các giá trị kinh độ và vĩ độ, sau đó sử dụng hàm để chuyển đổi chúng thành giá trị

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8

Đối với các khu vực địa lý phức tạp hơn, bạn có thể tải các định dạng dữ liệu không gian địa lý sau vào cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8

  • Văn bản nổi tiếng [WKT]
  • Nhị phân nổi tiếng [WKB]
  • GeoJSON

Đang tải dữ liệu WKT hoặc WKB

WKT là định dạng văn bản để mô tả các hình dạng hình học riêng lẻ bằng cách sử dụng điểm, đường, đa giác có lỗ tùy chọn hoặc tập hợp các điểm, đường hoặc đa giác. WKB là phiên bản nhị phân của định dạng WKT. WKB có thể được mã hóa hex cho các định dạng không hỗ trợ dữ liệu nhị phân, chẳng hạn như JSON

Ví dụ: phần sau xác định một điểm trong WKT

POINT[-121 41]

Để mô tả một tính năng không gian, WKT thường được nhúng trong định dạng tệp vùng chứa, chẳng hạn như tệp CSV hoặc trong bảng cơ sở dữ liệu. Hàng tệp hoặc hàng bảng thường tương ứng với tính năng không gian. Toàn bộ tệp hoặc toàn bộ bảng tương ứng với bộ sưu tập tính năng. Để tải dữ liệu WKT vào BigQuery, hãy cung cấp lược đồ chỉ định cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 cho dữ liệu không gian địa lý

Ghi chú. Bạn không thể sử dụng tính năng tự động phát hiện lược đồ để tải dữ liệu WKT dưới dạng giá trị
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8. Nếu tính năng tự động phát hiện được bật thì BigQuery sẽ tải dữ liệu dưới dạng giá trị
bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
7

Ví dụ: bạn có thể có tệp CSV chứa dữ liệu sau

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1

Bạn có thể tải tệp này bằng cách chạy lệnh

bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
8 công cụ dòng lệnh
bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
9

________số 8_______

Để biết thêm thông tin về tải dữ liệu trong BigQuery, hãy xem Giới thiệu về tải dữ liệu

Để truyền dữ liệu WKT đến bảng BigQuery hiện có với cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8, hãy tuần tự hóa dữ liệu dưới dạng chuỗi trong yêu cầu API

bq

Chạy lệnh

bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
8 công cụ dòng lệnh
echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
    | bq insert my_dataset.geo_table
2

echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
    | bq insert my_dataset.geo_table

con trăn

Trước khi dùng thử mẫu này, hãy làm theo hướng dẫn thiết lập Python trong hướng dẫn bắt đầu nhanh BigQuery bằng thư viện máy khách. Để biết thêm thông tin, hãy xem tài liệu tham khảo API BigQuery Python .

Xem trên GitHub

from google.cloud import bigquery
import shapely.geometry
import shapely.wkt

bigquery_client = bigquery.Client[]

# This example uses a table containing a column named "geo" with the
# GEOGRAPHY data type.
table_id = "my-project.my_dataset.my_table"

# Use the Shapely library to generate WKT of a line from LAX to
# JFK airports. Alternatively, you may define WKT data directly.
my_geography = shapely.geometry.LineString[
    [[-118.4085, 33.9416], [-73.7781, 40.6413]]
]
rows = [
    # Convert data into a WKT string.
    {"geo": shapely.wkt.dumps[my_geography]},
]

#  table already exists and has a column
# named "geo" with data type GEOGRAPHY.
errors = bigquery_client.insert_rows_json[table_id, rows]
if errors:
    raise RuntimeError[f"row insert failed: {errors}"]
else:
    print[f"wrote 1 row to {table_id}"]

Để biết thêm thông tin về truyền dữ liệu trong BigQuery, hãy xem Truyền dữ liệu vào BigQuery

Bạn cũng có thể chuyển đổi chuỗi văn bản WKT thành giá trị

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 bằng cách sử dụng hàm

Đang tải dữ liệu GeoJSON

GeoJSON là một định dạng dựa trên JSON cho hình học và các tính năng không gian. Ví dụ: phần sau xác định một điểm trong GeoJSON

{ "type": "Point", "coordinates": [-121,41] }

Dữ liệu GeoJSON có thể chứa bất kỳ loại đối tượng nào sau đây

  • đối tượng hình học. Một đối tượng hình học là một hình dạng không gian, được mô tả là sự kết hợp của các điểm, đường và đa giác với các lỗ tùy chọn
  • đối tượng đặc trưng. Một đối tượng tính năng chứa một hình cộng với các cặp tên/giá trị bổ sung, có nghĩa là dành riêng cho ứng dụng
  • Bộ sưu tập tính năng. Một bộ sưu tập tính năng là một tập hợp các đối tượng tính năng

Có hai cách để tải dữ liệu GeoJSON vào BigQuery

  • .
  • .

Đang tải các tệp GeoJSON được phân tách bằng dòng mới

Tệp GeoJSON được phân tách bằng dòng mới chứa danh sách các đối tượng tính năng GeoJSON, mỗi đối tượng trên một dòng trong tệp. Đối tượng tính năng GeoJSON là đối tượng JSON có các thành viên sau

  • echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
        | bq insert my_dataset.geo_table
    
    5. Đối với các đối tượng đặc trưng, ​​giá trị phải là
    echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
        | bq insert my_dataset.geo_table
    
    6. BigQuery xác thực giá trị nhưng không đưa giá trị đó vào sơ đồ bảng

  • echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
        | bq insert my_dataset.geo_table
    
    7. Giá trị là một đối tượng GeoJSON
    echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
        | bq insert my_dataset.geo_table
    
    8 hoặc
    echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
        | bq insert my_dataset.geo_table
    
    9. BigQuery chuyển đổi thành viên này thành giá trị
    "POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
    "POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
    "POINT[1 2]",point1
    
    8

  • from google.cloud import bigquery
    import shapely.geometry
    import shapely.wkt
    
    bigquery_client = bigquery.Client[]
    
    # This example uses a table containing a column named "geo" with the
    # GEOGRAPHY data type.
    table_id = "my-project.my_dataset.my_table"
    
    # Use the Shapely library to generate WKT of a line from LAX to
    # JFK airports. Alternatively, you may define WKT data directly.
    my_geography = shapely.geometry.LineString[
        [[-118.4085, 33.9416], [-73.7781, 40.6413]]
    ]
    rows = [
        # Convert data into a WKT string.
        {"geo": shapely.wkt.dumps[my_geography]},
    ]
    
    #  table already exists and has a column
    # named "geo" with data type GEOGRAPHY.
    errors = bigquery_client.insert_rows_json[table_id, rows]
    if errors:
        raise RuntimeError[f"row insert failed: {errors}"]
    else:
        print[f"wrote 1 row to {table_id}"]
    1. Giá trị là bất kỳ đối tượng JSON nào hoặc null. Nếu giá trị không phải là
    echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
        | bq insert my_dataset.geo_table
    
    9, thì BigQuery sẽ tải từng thành viên của đối tượng JSON dưới dạng một cột bảng riêng biệt. Để biết thêm thông tin về cách BigQuery phân tích cú pháp các loại dữ liệu JSON, hãy xem

  • from google.cloud import bigquery
    import shapely.geometry
    import shapely.wkt
    
    bigquery_client = bigquery.Client[]
    
    # This example uses a table containing a column named "geo" with the
    # GEOGRAPHY data type.
    table_id = "my-project.my_dataset.my_table"
    
    # Use the Shapely library to generate WKT of a line from LAX to
    # JFK airports. Alternatively, you may define WKT data directly.
    my_geography = shapely.geometry.LineString[
        [[-118.4085, 33.9416], [-73.7781, 40.6413]]
    ]
    rows = [
        # Convert data into a WKT string.
        {"geo": shapely.wkt.dumps[my_geography]},
    ]
    
    #  table already exists and has a column
    # named "geo" with data type GEOGRAPHY.
    errors = bigquery_client.insert_rows_json[table_id, rows]
    if errors:
        raise RuntimeError[f"row insert failed: {errors}"]
    else:
        print[f"wrote 1 row to {table_id}"]
    3. Không bắt buộc. Nếu có, giá trị là một chuỗi hoặc một số. BigQuery tải giá trị này vào một cột có tên là
    from google.cloud import bigquery
    import shapely.geometry
    import shapely.wkt
    
    bigquery_client = bigquery.Client[]
    
    # This example uses a table containing a column named "geo" with the
    # GEOGRAPHY data type.
    table_id = "my-project.my_dataset.my_table"
    
    # Use the Shapely library to generate WKT of a line from LAX to
    # JFK airports. Alternatively, you may define WKT data directly.
    my_geography = shapely.geometry.LineString[
        [[-118.4085, 33.9416], [-73.7781, 40.6413]]
    ]
    rows = [
        # Convert data into a WKT string.
        {"geo": shapely.wkt.dumps[my_geography]},
    ]
    
    #  table already exists and has a column
    # named "geo" with data type GEOGRAPHY.
    errors = bigquery_client.insert_rows_json[table_id, rows]
    if errors:
        raise RuntimeError[f"row insert failed: {errors}"]
    else:
        print[f"wrote 1 row to {table_id}"]
    3

Nếu đối tượng tính năng chứa các thành phần khác không được liệt kê ở đây thì BigQuery sẽ chuyển đổi trực tiếp các thành phần đó thành các cột trong bảng

Bạn có thể tải tệp GeoJSON được phân tách bằng dòng mới bằng cách sử dụng lệnh

from google.cloud import bigquery
import shapely.geometry
import shapely.wkt

bigquery_client = bigquery.Client[]

# This example uses a table containing a column named "geo" with the
# GEOGRAPHY data type.
table_id = "my-project.my_dataset.my_table"

# Use the Shapely library to generate WKT of a line from LAX to
# JFK airports. Alternatively, you may define WKT data directly.
my_geography = shapely.geometry.LineString[
    [[-118.4085, 33.9416], [-73.7781, 40.6413]]
]
rows = [
    # Convert data into a WKT string.
    {"geo": shapely.wkt.dumps[my_geography]},
]

#  table already exists and has a column
# named "geo" with data type GEOGRAPHY.
errors = bigquery_client.insert_rows_json[table_id, rows]
if errors:
    raise RuntimeError[f"row insert failed: {errors}"]
else:
    print[f"wrote 1 row to {table_id}"]
6 của công cụ dòng lệnh
bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
8, như sau

bq load \
 --source_format=NEWLINE_DELIMITED_JSON \
 --json_extension=GEOJSON \
 --autodetect \
 DATASET.TABLE \
 FILE_PATH_OR_URI

Thay thế sau đây

  • from google.cloud import bigquery
    import shapely.geometry
    import shapely.wkt
    
    bigquery_client = bigquery.Client[]
    
    # This example uses a table containing a column named "geo" with the
    # GEOGRAPHY data type.
    table_id = "my-project.my_dataset.my_table"
    
    # Use the Shapely library to generate WKT of a line from LAX to
    # JFK airports. Alternatively, you may define WKT data directly.
    my_geography = shapely.geometry.LineString[
        [[-118.4085, 33.9416], [-73.7781, 40.6413]]
    ]
    rows = [
        # Convert data into a WKT string.
        {"geo": shapely.wkt.dumps[my_geography]},
    ]
    
    #  table already exists and has a column
    # named "geo" with data type GEOGRAPHY.
    errors = bigquery_client.insert_rows_json[table_id, rows]
    if errors:
        raise RuntimeError[f"row insert failed: {errors}"]
    else:
        print[f"wrote 1 row to {table_id}"]
    7 là tên tập dữ liệu của bạn
  • from google.cloud import bigquery
    import shapely.geometry
    import shapely.wkt
    
    bigquery_client = bigquery.Client[]
    
    # This example uses a table containing a column named "geo" with the
    # GEOGRAPHY data type.
    table_id = "my-project.my_dataset.my_table"
    
    # Use the Shapely library to generate WKT of a line from LAX to
    # JFK airports. Alternatively, you may define WKT data directly.
    my_geography = shapely.geometry.LineString[
        [[-118.4085, 33.9416], [-73.7781, 40.6413]]
    ]
    rows = [
        # Convert data into a WKT string.
        {"geo": shapely.wkt.dumps[my_geography]},
    ]
    
    #  table already exists and has a column
    # named "geo" with data type GEOGRAPHY.
    errors = bigquery_client.insert_rows_json[table_id, rows]
    if errors:
        raise RuntimeError[f"row insert failed: {errors}"]
    else:
        print[f"wrote 1 row to {table_id}"]
    8 là tên của bảng đích
  • from google.cloud import bigquery
    import shapely.geometry
    import shapely.wkt
    
    bigquery_client = bigquery.Client[]
    
    # This example uses a table containing a column named "geo" with the
    # GEOGRAPHY data type.
    table_id = "my-project.my_dataset.my_table"
    
    # Use the Shapely library to generate WKT of a line from LAX to
    # JFK airports. Alternatively, you may define WKT data directly.
    my_geography = shapely.geometry.LineString[
        [[-118.4085, 33.9416], [-73.7781, 40.6413]]
    ]
    rows = [
        # Convert data into a WKT string.
        {"geo": shapely.wkt.dumps[my_geography]},
    ]
    
    #  table already exists and has a column
    # named "geo" with data type GEOGRAPHY.
    errors = bigquery_client.insert_rows_json[table_id, rows]
    if errors:
        raise RuntimeError[f"row insert failed: {errors}"]
    else:
        print[f"wrote 1 row to {table_id}"]
    9 là đường dẫn đến tệp cục bộ hoặc tệp

Ví dụ trước cho phép tự động phát hiện giản đồ. Để kiểm soát nhiều hơn cách BigQuery chuyển đổi các giá trị bên trong đối tượng

from google.cloud import bigquery
import shapely.geometry
import shapely.wkt

bigquery_client = bigquery.Client[]

# This example uses a table containing a column named "geo" with the
# GEOGRAPHY data type.
table_id = "my-project.my_dataset.my_table"

# Use the Shapely library to generate WKT of a line from LAX to
# JFK airports. Alternatively, you may define WKT data directly.
my_geography = shapely.geometry.LineString[
    [[-118.4085, 33.9416], [-73.7781, 40.6413]]
]
rows = [
    # Convert data into a WKT string.
    {"geo": shapely.wkt.dumps[my_geography]},
]

#  table already exists and has a column
# named "geo" with data type GEOGRAPHY.
errors = bigquery_client.insert_rows_json[table_id, rows]
if errors:
    raise RuntimeError[f"row insert failed: {errors}"]
else:
    print[f"wrote 1 row to {table_id}"]
1, bạn có thể cung cấp một lược đồ rõ ràng thay thế. Để biết thêm thông tin, xem. Nếu bạn cung cấp một lược đồ rõ ràng, thì đừng bao gồm cột
echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
    | bq insert my_dataset.geo_table
5 cấp cao nhất trong định nghĩa lược đồ. Đối với mỗi thành viên của thành viên
from google.cloud import bigquery
import shapely.geometry
import shapely.wkt

bigquery_client = bigquery.Client[]

# This example uses a table containing a column named "geo" with the
# GEOGRAPHY data type.
table_id = "my-project.my_dataset.my_table"

# Use the Shapely library to generate WKT of a line from LAX to
# JFK airports. Alternatively, you may define WKT data directly.
my_geography = shapely.geometry.LineString[
    [[-118.4085, 33.9416], [-73.7781, 40.6413]]
]
rows = [
    # Convert data into a WKT string.
    {"geo": shapely.wkt.dumps[my_geography]},
]

#  table already exists and has a column
# named "geo" with data type GEOGRAPHY.
errors = bigquery_client.insert_rows_json[table_id, rows]
if errors:
    raise RuntimeError[f"row insert failed: {errors}"]
else:
    print[f"wrote 1 row to {table_id}"]
1, hãy xác định các cột riêng biệt, không phải là một cột lồng nhau

Theo định nghĩa của RFC 7946, cấu trúc dữ liệu GeoJSON hoàn chỉnh là một đối tượng JSON duy nhất. Nhiều hệ thống xuất dữ liệu GeoJSON dưới dạng một đối tượng

{ "type": "Point", "coordinates": [-121,41] }
3 chứa tất cả các dạng hình học. Để tải định dạng này vào BigQuery, bạn phải chuyển đổi tệp bằng cách xóa đối tượng
{ "type": "Point", "coordinates": [-121,41] }
3 cấp gốc và chia các đối tượng tính năng riêng lẻ thành các dòng riêng biệt. Ví dụ: lệnh sau sử dụng công cụ dòng lệnh
{ "type": "Point", "coordinates": [-121,41] }
5 để chia tệp GeoJSON thành định dạng được phân cách bằng dòng mới

cat ~/file1.json | jq -c '.features[]' > converted.json

Tạo bảng bên ngoài từ tệp GeoJSON được phân tách bằng dòng mới

Bạn có thể truy vấn tệp GeoJSON được phân tách bằng dòng mới được lưu trữ trong Bộ nhớ đám mây bằng cách tạo bảng bên ngoài. Để tạo bảng bên ngoài, hãy sử dụng câu lệnh DDL. Trong mệnh đề

{ "type": "Point", "coordinates": [-121,41] }
7, đặt tùy chọn
{ "type": "Point", "coordinates": [-121,41] }
8 thành
{ "type": "Point", "coordinates": [-121,41] }
9 và tùy chọn
bq load \
 --source_format=NEWLINE_DELIMITED_JSON \
 --json_extension=GEOJSON \
 --autodetect \
 DATASET.TABLE \
 FILE_PATH_OR_URI
0 thành
bq load \
 --source_format=NEWLINE_DELIMITED_JSON \
 --json_extension=GEOJSON \
 --autodetect \
 DATASET.TABLE \
 FILE_PATH_OR_URI
1

Ví dụ

CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];

Đang tải dữ liệu hình học GeoJSON

Phân tích không gian địa lý hỗ trợ tải các đối tượng hình học GeoJSON riêng lẻ được nhúng dưới dạng chuỗi văn bản trong các loại tệp khác. Ví dụ: bạn có thể tải tệp CSV trong đó một trong các cột chứa đối tượng hình học GeoJSON

Để tải loại dữ liệu GeoJSON này vào BigQuery, hãy cung cấp lược đồ chỉ định cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 cho dữ liệu GeoJSON. Bạn phải cung cấp lược đồ theo cách thủ công. Mặt khác, nếu tính năng tự động phát hiện được bật thì BigQuery sẽ tải dữ liệu dưới dạng giá trị
bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
7

Phân tích không gian địa lý không hỗ trợ tải các đối tượng tính năng GeoJSON hoặc bộ sưu tập tính năng bằng cách sử dụng phương pháp này. Nếu bạn cần tải các đối tượng tính năng, thì hãy cân nhắc sử dụng các tệp GeoJSON được phân tách bằng dòng mới

Để truyền dữ liệu GeoJSON tới bảng BigQuery hiện có với cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8, hãy tuần tự hóa dữ liệu dưới dạng chuỗi trong yêu cầu API

bq

Chạy lệnh

bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
8 công cụ dòng lệnh
echo '{"geo": "LINESTRING [-118.4085 33.9416, -73.7781 40.6413]"}' \
    | bq insert my_dataset.geo_table
2

echo '{"geo": "{\"type\": \"LineString\", \"coordinates\": [[-118.4085, 33.9416], [-73.7781, 40.6413]]}"}' \
  | bq insert my_dataset.geo_table

con trăn

Trước khi dùng thử mẫu này, hãy làm theo hướng dẫn thiết lập Python trong hướng dẫn bắt đầu nhanh BigQuery bằng thư viện máy khách. Để biết thêm thông tin, hãy xem tài liệu tham khảo API BigQuery Python .

Xem trên GitHub

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
0

Bạn cũng có thể chuyển đổi một đối tượng hình học GeoJSON thành giá trị

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 bằng cách sử dụng hàm. Ví dụ: bạn có thể lưu trữ hình học dưới dạng giá trị
bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
7, sau đó chạy truy vấn gọi ______32_______8

Hệ tọa độ và các cạnh

Trong phân tích không gian địa lý, điểm là các vị trí trên bề mặt của hình cầu WGS84, được biểu thị bằng kinh độ và vĩ độ trắc địa. Một cạnh là một trắc địa hình cầu giữa hai điểm cuối. [Tức là các cạnh là đường đi ngắn nhất trên mặt cầu. ]

Định dạng WKT không cung cấp hệ tọa độ. Khi tải dữ liệu WKT, phân tích không gian địa lý giả định dữ liệu sử dụng tọa độ WGS84 với các cạnh hình cầu. Đảm bảo dữ liệu nguồn của bạn khớp với hệ tọa độ đó, trừ khi các khu vực địa lý đủ nhỏ để có thể bỏ qua sự khác biệt giữa các cạnh hình cầu và cạnh phẳng

GeoJSON rõ ràng sử dụng tọa độ WGS84 với các cạnh phẳng. Khi tải dữ liệu GeoJSON, phân tích không gian địa lý chuyển đổi các cạnh phẳng thành các cạnh hình cầu. Phân tích không gian địa lý thêm các điểm bổ sung vào đường khi cần thiết để chuỗi các cạnh được chuyển đổi vẫn nằm trong phạm vi 10 mét so với đường ban đầu. Quá trình này được gọi là tessellation hoặc mật độ không đồng nhất. Bạn không thể trực tiếp kiểm soát quá trình tessellation

Để tải các khu vực địa lý có cạnh hình cầu, hãy sử dụng WKT. Để tải các vùng địa lý có cạnh phẳng, thường được gọi là hình học, cách đơn giản nhất là sử dụng GeoJSON. Tuy nhiên, nếu dữ liệu hình học của bạn đã ở định dạng WKT, một tùy chọn khác là tải dữ liệu dưới dạng loại

bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv
7 rồi sử dụng hàm để chuyển đổi thành giá trị
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8. Đặt tham số
cat ~/file1.json | jq -c '.features[]' > converted.json
4 thành
cat ~/file1.json | jq -c '.features[]' > converted.json
5 để diễn giải dữ liệu dưới dạng phẳng

Khi chọn định dạng trao đổi, hãy nhớ hiểu hệ tọa độ được sử dụng bởi dữ liệu nguồn của bạn. Hầu hết các hệ thống đều hỗ trợ rõ ràng việc phân tích cú pháp địa lý [trái ngược với hình học] từ WKT hoặc nếu không thì chúng giả sử các cạnh phẳng

Tọa độ của bạn phải là kinh độ trước, vĩ độ thứ hai. Nếu địa lý có bất kỳ phân đoạn hoặc cạnh dài nào thì chúng phải được sắp xếp lại, bởi vì phân tích không gian địa lý hiểu chúng là trắc địa hình cầu, có thể không tương ứng với hệ tọa độ nơi dữ liệu của bạn bắt nguồn

Định hướng đa giác

Trên một mặt cầu, mọi đa giác đều có một đa giác phụ. Ví dụ: một đa giác mô tả các lục địa của Trái đất sẽ có một đa giác bổ sung mô tả các đại dương của Trái đất. Vì hai đa giác được mô tả bằng các vòng biên giống nhau nên cần có các quy tắc để giải quyết sự mơ hồ xung quanh việc đa giác nào được mô tả bằng một chuỗi WKT nhất định

Khi bạn tải các chuỗi WKT và WKB từ tệp hoặc bằng cách sử dụng tính năng nhập trực tuyến, phân tích không gian địa lý giả định các đa giác trong đầu vào được định hướng như sau. Nếu bạn đi qua ranh giới của đa giác theo thứ tự các đỉnh đầu vào, phần bên trong của đa giác nằm bên trái. Phân tích không gian địa lý sử dụng cùng một quy tắc khi xuất các đối tượng địa lý sang chuỗi WKT và WKB

Nếu bạn sử dụng hàm để chuyển đổi chuỗi WKT thành giá trị

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8, thì tham số
cat ~/file1.json | jq -c '.features[]' > converted.json
8 sẽ chỉ định cách hàm xác định đa giác

  • cat ~/file1.json | jq -c '.features[]' > converted.json
    
    9. Giải thích đầu vào là đa giác với diện tích nhỏ hơn. Đây là hành vi mặc định

  • cat ~/file1.json | jq -c '.features[]' > converted.json
    
    5. Sử dụng quy tắc định hướng bên trái được mô tả trước đó. Tùy chọn này cho phép bạn tải đa giác có diện tích lớn hơn bán cầu

Vì các chuỗi GeoJSON được xác định trên bản đồ phẳng, hướng có thể được xác định mà không có sự mơ hồ, ngay cả khi đầu vào không tuân theo quy tắc hướng được xác định trong đặc tả định dạng GeoJSON, RFC 7946

Xử lý dữ liệu không gian được định dạng không đúng

Khi tải dữ liệu không gian từ các công cụ khác vào BigQuery, bạn có thể gặp lỗi chuyển đổi do dữ liệu WKT hoặc GeoJSON không hợp lệ. Ví dụ: một lỗi như

CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];
1 chỉ ra rằng đa giác có các đỉnh trùng lặp [ngoài đỉnh đầu tiên và đỉnh cuối cùng]

Để tránh các vấn đề về định dạng, bạn có thể sử dụng một chức năng tạo đầu ra tuân thủ tiêu chuẩn. Ví dụ: khi bạn xuất dữ liệu từ PostGIS, bạn có thể sử dụng chức năng PostGIS

CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];
2 để chuẩn hóa đầu ra. Ngoài ra, nhập dữ liệu của bạn dưới dạng văn bản và sau đó chuyển đổi nó bằng cách gọi hoặc với tham số
CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];
5. Khi
CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];
5 là
cat ~/file1.json | jq -c '.features[]' > converted.json
5, các chức năng này sẽ cố gắng sửa chữa các đa giác không hợp lệ

Để tìm hoặc bỏ qua dữ liệu được định dạng không đúng, hãy sử dụng tiền tố hàm

CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];
8 để xuất dữ liệu có vấn đề. Ví dụ: truy vấn sau sử dụng tiền tố
CREATE EXTERNAL TABLE mydataset.table1 OPTIONS [
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
];
8 để truy xuất dữ liệu không gian được định dạng không đúng

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
1

Hạn chế

Phân tích không gian địa lý không hỗ trợ các tính năng sau ở định dạng không gian địa lý

  • hình học ba chiều. Điều này bao gồm hậu tố "Z" ở định dạng WKT và tọa độ độ cao ở định dạng GeoJSON
  • Hệ quy chiếu tuyến tính. Điều này bao gồm hậu tố "M" ở định dạng WKT
  • Các đối tượng hình học WKT không phải là hình học nguyên thủy hoặc hình học nhiều phần. Cụ thể, phân tích không gian địa lý chỉ hỗ trợ Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon và GeometryCollection

Xem và để biết các ràng buộc cụ thể đối với các định dạng đầu vào GeoJson và WKT

Chuyển đổi dữ liệu không gian địa lý

Nếu bảng của bạn chứa các cột riêng biệt cho kinh độ và vĩ độ, bạn có thể chuyển đổi các giá trị thành địa lý bằng cách sử dụng các hàm địa lý SQL chuẩn của Google, chẳng hạn như. Ví dụ: nếu bạn có hai cột

echo '{"geo": "{\"type\": \"LineString\", \"coordinates\": [[-118.4085, 33.9416], [-73.7781, 40.6413]]}"}' \
  | bq insert my_dataset.geo_table
3 cho kinh độ và vĩ độ, bạn có thể tạo cột địa lý bằng truy vấn sau

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
2

BigQuery có thể chuyển đổi các chuỗi WKT và GeoJSON thành các loại địa lý. Nếu dữ liệu của bạn ở định dạng khác, chẳng hạn như Shapefiles, hãy sử dụng công cụ bên ngoài để chuyển đổi dữ liệu sang định dạng tệp đầu vào được hỗ trợ, chẳng hạn như tệp CSV, với các cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 được mã hóa dưới dạng chuỗi WKT hoặc GeoJSON

Phân vùng và phân cụm dữ liệu không gian địa lý

Bạn có thể phân vùng và nhóm các bảng có chứa

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 cột. Bạn có thể sử dụng cột
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 làm cột phân cụm, nhưng bạn không thể sử dụng cột
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 làm cột phân vùng

Nếu bạn lưu trữ dữ liệu

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 trong bảng và truy vấn của bạn lọc dữ liệu bằng cách sử dụng vị từ không gian, hãy đảm bảo rằng bảng được nhóm theo cột
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8. Điều này thường cải thiện hiệu suất truy vấn và có thể giảm chi phí. Một vị từ không gian gọi một hàm địa lý boolean và có một cột
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 là một trong các đối số. Mẫu sau đây cho thấy một vị từ không gian sử dụng hàm
"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
01

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
3

Sử dụng THAM GIA với dữ liệu không gian

Tham gia không gian là tham gia của hai bảng có chức năng địa lý vị ngữ trong mệnh đề

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
02. Ví dụ

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
4

Các liên kết không gian hoạt động tốt hơn khi dữ liệu địa lý của bạn được duy trì. Ví dụ trên tạo các giá trị địa lý trong truy vấn. Việc lưu trữ các giá trị địa lý trong bảng BigQuery sẽ hiệu quả hơn

Ví dụ: truy vấn sau truy xuất các cặp kinh độ, vĩ độ và chuyển đổi chúng thành các điểm địa lý. Khi chạy truy vấn này, bạn chỉ định một bảng đích mới để lưu kết quả truy vấn

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
5

BigQuery triển khai THAM GIA không gian được tối ưu hóa cho các toán tử INNER THAM GIA và CHÉO THAM GIA với các hàm vị từ SQL chuẩn của Google sau đây

Tham gia không gian không được tối ưu hóa

  • Đối với các phép nối LEFT, RIGHT hoặc FULL OUTER
  • Trong các trường hợp liên quan đến ANTI tham gia
  • Khi vị từ không gian bị phủ định

THAM GIA sử dụng vị từ

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
01 chỉ được tối ưu hóa khi tham số khoảng cách là một biểu thức không đổi

Xuất dữ liệu không gian

Khi bạn xuất dữ liệu không gian từ BigQuery, giá trị cột

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8 luôn được định dạng là chuỗi WKT. Để xuất dữ liệu ở định dạng GeoJSON, hãy sử dụng chức năng

Nếu các công cụ bạn đang sử dụng để phân tích dữ liệu đã xuất không hiểu loại dữ liệu

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
8, thì bạn có thể chuyển đổi các giá trị cột thành chuỗi bằng cách sử dụng hàm địa lý chẳng hạn như hoặc. Phân tích không gian địa lý thêm các điểm bổ sung vào đường khi cần thiết để chuỗi các cạnh được chuyển đổi vẫn nằm trong phạm vi 10 mét so với đường trắc địa ban đầu

Ví dụ: truy vấn sau sử dụng

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
13 để chuyển đổi các giá trị GeoJSON thành chuỗi

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
6

Dữ liệu kết quả sẽ giống như sau

"POLYGON[[-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35]]",poly1
"POLYGON[[-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66]]",poly2
"POINT[1 2]",point1
7

Dòng GeoJSON có hai điểm bổ sung. Phân tích không gian địa lý thêm các điểm này để đường GeoJSON theo sát đường dẫn giống như đường ban đầu trên mặt đất

Loại dữ liệu nên tọa độ là gì?

Tọa độ địa lý là loại dữ liệu XDM tiêu chuẩn mô tả tọa độ địa lý của một địa điểm.

Vĩ độ là loại dữ liệu nào?

Dữ liệu số liên tục lấy bất kỳ giá trị nào trong phạm vi cho phép, theo đó phạm vi có thể là hữu hạn hoặc vô hạn. Mặc dù Vĩ độ nằm trong một phạm vi hữu hạn, nhưng chúng có thể có bất kỳ giá trị nào, với bất kỳ mức độ cụ thể nào [hoặc vị trí thập phân]. Vì vậy, vĩ độ, phải là Dữ liệu số liên tục.

Loại kiểu dữ liệu nào là vị trí?

Còn được gọi là thông tin địa lý hoặc dữ liệu không gian địa lý, dữ liệu vị trí đề cập đến thông tin liên quan đến các đối tượng hoặc thành phần có trong không gian địa lý hoặc đường chân trời. Có hai loại dữ liệu vị trí cơ bản. dữ liệu vectơ và dữ liệu raster .

Chủ Đề