WebHU - Programozási kérdések és válaszok

A vonalláncokat tartalmazó adatkészlet optimalizálásának legjobb módja. Néhány vonal ugyanazon a koordinátán kezdődik és végződik

A BEÁLLÍTÁS
Van egy táblázatom, amely vonalláncokat tartalmaz. A vonalláncok több földrajzi pontból állnak. Minden pont egy szélességi és hosszúsági fokból áll. Megjegyzés: a vonallánc értéke SZÖVEGként kerül tárolásra az adatbázisban.

Tehát a táblázat egyik sora így nézhet ki:
id: egész szám
vonallánc: x1, y2, x2, y2, x3, y3, x4, y4

A PROBLÉMA
A Google Térkép egyszerre legfeljebb 1000 elem megjelenítését teszi lehetővé. Az én esetemben 850 vonalláncot jelenítek meg, és a jövőben sokkal többet kell hozzáadnom.

A KÉRDÉS
A vonalláncok közül jó néhány kapcsolódik egy vagy több másik vonallánchoz, ami azt jelenti, hogy ugyanazon a koordinátán kezdődnek és/vagy végződnek. Azt szeretném elérni, hogy megtaláljam a legjobb módszert az adatkészlet optimalizálására, hogy a végén összekötő vonalláncok egyesüljenek a DB táblában. Ez csökkenti a teljes elemszámot, amikor elemzem a DB táblát, és létrehozom a megjelenítési fájlt a Google Maps számára.

PÉLDA
Ebben a példában képzelje el, hogy az alfa (A,B,C) értékek földrajzi pontokat jelölnek. A nem optimalizált táblázat így nézhet ki:

optimalizálás előtt:
azonosító vonallánc
1 A, B, C
2 C, D
3 B, A
4 F, G, H
5 G, I
6 H, J


Optimalizálás után:
1 A, B, C, D
2 F, G, H, J
3 G, I


Tehát mi a legjobb módja az adatok optimalizálásának? Létezik olyan algoritmus, ami a legjobban működik? Van néhány megoldási ötletem, amelyeket megfogalmazok és kiegészítek, de ezek bőbeszédűnek és görcsösnek tűnnek.

Nem vagyok CS szakos, ezért elnézést a hanyag terminológiaért, és szóljon, ha valahol pontosításra van szükség. Kösz!


FYI.. MySQL DB-t használok. Nem használom a térbeli kiterjesztéseket. Ha van egy kínosan egyszerű megoldása, amely a térbeli kiterjesztéseket használja, akkor is szívesen hallanék róla.


  • Nem használok térben engedélyezett adatbázist. Nem adva hozzá a kérdéshez. 20.01.2009

Válaszok:


1

Egy dologra fel kell ismernünk, hogy ha egynél több vonallánc kapcsolódik egy adott vonallánchoz, nem számít, melyiket választjuk – az optimalizált táblázatban a sorok végső száma légy ugyanaz.

Tehát ebben az esetben egy egyszerű mohó stratégia, amikor ismételten talál egy pár összekapcsolható vonalláncot, és addig csatlakozik, amíg már nem talál ilyen párt, optimális táblázatot ad. A pszeudokód lényegében a következő:

while (there exists a pair of linestrings x and y that share an endpoint) {
    delete(x)
    delete(y)
    insert(x . y)
}

Ezt nem lehet megtenni egyetlen SQL-lekérdezésben, mert előfordulhat, hogy az eredményül kapott x . y vonallánc újra felhasználásra kerül. Képesnek kell lennie a while ciklus megírására eljárási nyelv, például T-SQL vagy szkriptnyelv használatával (pl. Perl, amely DBI-t használ az adatbázis-hozzáféréshez), és egy SQL SELECT lekérdezést használva pár vagy párok listájának megkereséséhez és majd mindegyiket DELETE és INSERT utasítások segítségével dolgozza fel.

Azt javaslom, hogy adjon hozzá két mezőt a táblázathoz, begin és end, és indexelje őket a keresés felgyorsítása érdekében.

21.01.2009

2

Szerintem a legegyszerűbb módja a MySQL térbeli kiterjesztésének használata.

Különösen csak Oracle térbeli bővítményeket használtam. Az Oracle-ben olyan függvényeket használhatunk, mint a SDO_GEOM.RELATE vagy SDO_RELATE a két spa kapcsolat között tárgyak (tartalmaz, érint, metszik stb.)

Biztos vagyok benne, hogy van egy ezzel egyenértékű térbeli függvény a MySQL-ben

EDIT:

Íme egy link, amely felsorolja az összes elérhető MySQL spatiális függvényt.

20.01.2009
  • Most néztük át a MySQL térbeli kiterjesztések hivatkozását. Ezt már korábban átfutottam, de kihagytam a „Geometrák közötti térbeli kapcsolatokat tesztelő függvények” részt. Pont olyan, amire szükségem van, érdemes a térbeli kiterjesztésekben elmélyedni. 20.01.2009

  • 3

    Egyedülálló megoldás lesz, ha minden végpont legfeljebb kétszer jelenik meg (egy vonallánc befejezése és egy másik kezdete), de ez garantált? Például. mi történik, ha:

    1. A, B, C
    2. C, D
    3. C, E, F

    Ennek eredményeként:

    1. A, B, C, D
    2. C, E, F

    or:

    1. A, B, C, E, F
    2. C, D

    ?

    Vagy nem érdekel?

    21.01.2009
  • Nincs garancia arra, hogy egy végpont legfeljebb kétszer fog megjelenni. A példádban az általad készített megoldások bármelyike ​​megfelelő lenne, mivel a vonalláncok száma háromról kettőre csökken. 21.01.2009
  • Külön választ tettem közzé, mivel úgy érzem, hogy a válaszomban szereplő kérdés hasznos információ. 21.01.2009
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..