GeoDjango:如何加载MultiString坐标至模型并存入数据库?
Got it, let's walk through how to get your coordinate lists into the geom (MultiLineStringField) of your LogsUpload model. You've got two solid options here—either rewrite the model's save() method to handle raw coordinates automatically, or convert the coordinates directly when creating instances. Let's break both down:
save() Method for Automatic Conversion This approach lets you pass raw coordinate lists directly when saving instances, and the model handles converting them to a MultiLineString under the hood.
First, update your models.py with the necessary imports and modified save() method:
from django.db import models from django.contrib.gis.db import models as gis_models from django.contrib.gis.geos import MultiLineString, LineString class LogsUpload(models.Model): name = models.CharField(max_length=240) geom = gis_models.MultiLineStringField(blank=True, null=True) def save(self, *args, **kwargs): # Pull raw coordinates from kwargs if provided raw_coords = kwargs.pop('raw_coords', None) if raw_coords: # First, fix coordinate order if needed: GEOS uses (longitude, latitude) # Your example uses (latitude, longitude), so we reverse each pair corrected_lines = [] # Check if raw_coords is a single line (list of points) or multiple lines if isinstance(raw_coords[0][0], float): # Single line: wrap in a list to make it a multi-line corrected_points = [(lon, lat) for lat, lon in raw_coords] corrected_lines.append(LineString(corrected_points)) else: # Multiple lines: process each line individually for line_points in raw_coords: corrected_points = [(lon, lat) for lat, lon in line_points] corrected_lines.append(LineString(corrected_points)) # Convert to MultiLineString and assign to geom self.geom = MultiLineString(corrected_lines) # Call the original save method super().save(*args, **kwargs)
How to use this:
When creating or updating an instance, pass your raw coordinate list via the raw_coords parameter:
# Example: Single line of coordinates (your sample data) sample_coords = [ [36.66678428649903, -1.5474249907643578], [36.670904159545906, -1.542620219636788], [36.66635513305665,-1.5353272427374922], [36.662406921386726, -1.5403894293513378] ] # Create and save the instance log = LogsUpload(name="My First Route") log.save(raw_coords=sample_coords)
If you don't want to modify the model's save() method, you can convert the raw coordinates to a MultiLineString object manually before passing it to the model.
Code example:
from django.contrib.gis.geos import MultiLineString, LineString from .models import LogsUpload # Sample single-line coordinates sample_coords = [ [36.66678428649903, -1.5474249907643578], [36.670904159545906, -1.542620219636788], [36.66635513305665,-1.5353272427374922], [36.662406921386726, -1.5403894293513378] ] # Correct coordinate order (lat, lon) → (lon, lat) corrected_points = [(lon, lat) for lat, lon in sample_coords] # Create a LineString, then wrap it in a list for MultiLineString multi_line = MultiLineString([LineString(corrected_points)]) # Create and save the instance directly LogsUpload.objects.create(name="My Second Route", geom=multi_line)
For multiple lines:
If your coordinate list represents multiple separate lines, process each line like this:
multi_line_coords = [ # Line 1 [[36.66678, -1.54742], [36.67090, -1.54262]], # Line 2 [[36.66635, -1.53532], [36.66240, -1.54038]] ] lines = [] for line_points in multi_line_coords: corrected = [(lon, lat) for lat, lon in line_points] lines.append(LineString(corrected)) multi_line = MultiLineString(lines) LogsUpload.objects.create(name="Multi-Line Route", geom=multi_line)
Key Note: Django's GEOS library uses the standard (x, y) coordinate order, which translates to (longitude, latitude) for geographic data. If your input uses (latitude, longitude) (like your sample), always reverse each pair to avoid placing your points in the wrong location on the map.
内容的提问来源于stack exchange,提问作者Geoffrey Nyaga

