How can I acess Multilinestring(dim=3)

49 views
Skip to first unread message

Richard Mair

unread,
Feb 24, 2024, 2:48:39 PMFeb 24
to Django users
Hi i am using

geom = models.MultiLineStringField(
dim=3, srid=EPSG_CODE, blank=True, null=True, spatial_index=True
) # EPSG:3128=AustriaLambert


and my PostGIS-DB is using (MultilinestringM

ALTER TABLE IF EXISTS public."KMSYS"
    ADD COLUMN geom geometry(MultiLineStringM,31287);

but when I access my Model I only get 2 dimensional response

Can anybody lead me to the correct handling







David James Nwoyie

unread,
Feb 24, 2024, 3:01:56 PMFeb 24
to django...@googlegroups.com
Increase the dim to 4 because of the Django of use 0 as the starting point 

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/ae4eaa11-3f4b-467a-9931-bbff5892a858n%40googlegroups.com.

Richard Mair

unread,
Feb 25, 2024, 2:03:54 AMFeb 25
to Django users
Hi David,

thanks for your help. I tried setting dim to 4 but did't see any change.

Here is my model:

```python
from django.contrib.gis.db import models


class Kmsys(models.Model):
# Define constants ----------------------------
EPSG_CODE = 31287
NAME_OF_GEOMETRY_FIELD = "geom"

# F I E L D S -------------------------------------------------
id = models.IntegerField(primary_key=True)

geom = models.MultiLineStringField(
dim=4, srid=EPSG_CODE, blank=True, null=True, spatial_index=True
) # EPSG:31287=AustriaLambert

object_id = models.BigIntegerField(db_column="OBJECTID", unique=True)
code = models.CharField(max_length=80, db_column="KMSYS_CODE", unique=False)
name = models.CharField(max_length=500, db_column="KMSYS_BEZEICHNUNG", unique=False)
start_date = models.DateTimeField(db_column="KMSYS_START_DATUM")
end_date = models.DateTimeField(db_column="KMSYS_ENDE_DATUM")
len = models.FloatField(db_column="LEN")
km_from = models.FloatField(db_column="KMSYS_KMVON")
km_till = models.FloatField(db_column="KMSYS_KMBIS")
parts_quantity = models.IntegerField(db_column="TEILE_ANZ")
fme_date = models.DateTimeField(db_column="FME_DATUM")
se_anno_cad_data = models.FileField(db_column="SE_ANNO_CAD_DATA")
bauk_id = models.FloatField(db_column="BAUK_ID")

# Meta-Class ------------------------------------------------------
class Meta:
managed = False
db_table = "KMSYS"
# db_table = '"public"."KMSYS"'

verbose_name = "Kmsys"
verbose_name_plural = "Kmsys"
ordering = ["code"]

# Methods ---------------------------------------------------------
def __str__(self) -> str:
"""String for representing the Model object."""
return f"{self.code} | {self.name} | {self.start_date} | {self.end_date} | {self.km_from} | {self.km_till} | {self.parts_quantity} | {self.fme_date} | {self.se_anno_cad_data} | {self.bauk_id}"
```

And this is the pytest that keeps failing -> At the beginning i just tested the dim=3 manually without db-access

from django.contrib.gis.geos import GEOSGeometry, LineString, MultiLineString, Point
from rest_framework.reverse import reverse

import logging

import pytest

from kmsys.models import Kmsys
from kmsys.test.test_runner import DjangoNoCreateAndDropRunner

logger = logging.getLogger(__name__)

# use pytest marks to tell pytest-django your test needs database access! In case only a certain method needs db-access use @pytest.mark.django_db as decorator of the according test-method.
pytestmark = pytest.mark.django_db


class TestModel:
"""
Test suite for KMSYS
"""

def test_query_kmsys(self):
"""
Test whether the kmsys can be accessed.

"""
# ARRANGE -------------

# simple dimension test with GDAL
# p: OGRGeometry = OGRGeometry("Point (1 2 3 )")
# assert p.coord_dim == 3

# simple dimension test with GEOS
p: GEOSGeometry = GEOSGeometry("Point (1 2 3 )")
assert p.hasz

# simple dimension test with GEOS Multilinestring
ls1 = LineString([(0, 0, 150), (1, 1, 151)], srid="31287")
ls2 = LineString([(2, 2, 153), (3, 3, 154)], srid="31287")
mls = MultiLineString(ls1, ls2)
assert mls.hasz

# ACT -----------------
first_kmsys: Kmsys = Kmsys.objects.all().first()
logger.info(f"first: {first_kmsys}")

# ASSERT -----------------
assert first_kmsys.geom.hasz
assert len(first_kmsys.geom.coords[0][0]) == 3
assert len(Kmsys.objects.all()) == 388

regards Richard
Reply all
Reply to author
Forward
0 new messages