Daugiau

Kaip gauti geometrijos daugiakampių skaičių „PostgreSQL“

Kaip gauti geometrijos daugiakampių skaičių „PostgreSQL“


Kaip gauti daugiakampių, sudarančių geometriją „PostgreSQL“, skaičių?

Pavyzdžiui, JAV žemėlapyje be pagrindinių žemių yra daugybė salų. Noriu suskaičiuoti šias salas ir pagrindines žemes.


Naudokite geometrijos priedą ST_NumGeometries.

Pavyzdžiui

PASIRINKITE ID, ST_NumGeometries (forma) IŠ myTable

Jei jūsų geometrijoje yra kitokių nei daugiakampių geometrijos tipų, prieš skaičiuodami turėsite juos suskaidyti ir laikyti tik daugiakampius. Bet iš jūsų klausimo to nereikėtų.


Remiantis dokumentais (7.3 skyrius), yra keli geometrijos priedai, kurie gali atitikti jūsų kriterijus, atsižvelgiant į tai, ar geometrija yra kolekcija, daugiakampis ar daugiakampis:

  • ST_NumGeometries - Jei geometrija yra GEOMETRIKOLEKCIJA (arba MULTI *), grąžinkite geometrijų skaičių, kitaip grąžinkite NULL.
  • ST_NumInteriorRings - Grąžinkite pirmojo geometrinio poligono vidinių žiedų skaičių. Tai veiks tiek su POLYGON, tiek su MULTIPOLYGON tipais, bet žiūrės tik į pirmąjį daugiakampį. Grąžinkite NULL, jei geometrijoje nėra daugiakampio.
  • ST_NRings - Jei geometrija yra daugiakampis arba daugiakampis, pateikiamas žiedų skaičius.

Griežtas įrodymas būtų toks:

Tarkime, kad turite įprastą daugiakampį $ P $ su $ 2n $ kraštinėmis: $ A_1A_2. A_nA_. A_ <2n> $. Pagal taisyklingojo daugiakampio apibrėžimą visos kraštinės turi vienodą ilgį, o visi kampai tarp vienas po kito einančių pusių turi būti vienodi.

Pirmiausia turite įrodyti, kad visų daugiakampių kampų dalikliai kerta tą patį tašką. Apsvarstykite, pavyzdžiui, kampų $ kampas A_1 $ ir $ kampas A_2 $ dalmenis. Jie tam tikru momentu susikerta $ O $. Kampai $ angle OA_1A_2 $ ir $ angle OA_2A_1 $ yra lygūs (tiksliai viena pusė kampo tarp vienas po kito einančių kraštų), todėl trikampis $ trikampis OA_1A_2 $ yra lygiašonis ir $ OA_1 = OA_2 $. Lygiai taip pat galite parodyti, kad $ OA_2 = OA_3 $,. $ OA_ <2n-1> = OA_ <2n> $, $ OA_ <2n> = OA_1 $.

Taigi yra taškas O, kurio visi ilgiai $ OA_i $ ($ i $ = 1. $ 2n $) yra vienodi ir tas taškas yra apibrėžto apskritimo centras. Taip pat galite lengvai įrodyti, kad trikampiai $ trikampis OA_iA_$ ir $ trikampis OA_jA_$ sutampa su bet kuriais $ i, j $ (nes $ OA_i = OA_j $, $ OA_= OA_$, $ A_iA_= A_jA_$ ).

Dėl to visi kampai $ kampas A_iOA_$ yra lygūs. Pažymėkite tą kampą su $ alpha $. Akivaizdu, kad $ alpha = 2 pi / (2n) = pi / n $

Trikampiai $ trikampis OA_1A_2 $ ir $ trikampis OA_2A_3 $ sutampa, todėl turi būti izometrinė transformacija, kuri transformuoja pirmąjį trikampį į antrąjį. Izometrija su vienu fiksuotu tašku $ O $ yra sukimasis. Taigi:

$ R_( trikampis OA_1A_2) = trikampis OA_2A_3 $

$ R_( trikampis OA_2A_3) = trikampis OA_3A_4 $

$ R_ <0, pi> ( trikampis OA_1A_2) = trikampis OA_A_$

Kitaip tariant, jei turite tašką $ M P $, priklausantį trikampiui $ trikampis OA_1A_2 $, sukimasis aplink tašką $ O $ už $ 180 ^ circ $ paverčia tą tašką į tam tikrą tašką $ M '$, kuriam priklauso trikampis $ trikampis OA_A_$ t. y. tam tikru momentu $ M ' P $.

Pasukimas aplink fiksuotą tašką $ O $ už $ pi = 180 ^ circ $ iš tikrųjų yra centrinė simetrija, o $ O $ yra simetrijos centras.

Taigi kiekviename taisyklingame daugiakampyje, kurio kraštinės yra $ 2n $, yra simetrijos centras, kuris yra ir apibrėžto apskritimo centras.


Norėdami gauti vidinius VM veidus, galite naudoti nuosavybę & quotInterior & quot:

Naudokite stilių [interjero rodyklės, direktyva [EdgeForm [], „FaceForm“ []]], kad gautumėte:

Sukurkite duomenų rinkinį su kraštų skaičiumi, plotais ir regionų centriniais interjerais:


2 atsakymai 2

Gerai, manau, kad komentare nepamiršau, manau, kad perimetrą dirbti lengviau nei su sritimi. Taigi jūs pradedate nuo apskritimo $ pi $ apskritimo (tai reiškia $ frac <1> <2> $ spindulį). Raskite kvadrato kraštinės ilgį (tai bus $ frac <1> < sqrt <2>> $), taigi pradinis spėjimas yra $ 4 cdot frac <1> < sqrt <2>> = 2 sqrt <2> maždaug 2,828427 $:

Čia yra konkretus pavyzdys, kuriame galime naudoti ankstesnį žinomą stygą (šiuo atveju $ frac <1> < sqrt <2>> $), norėdami rasti kitą:

Tai suteikia $ pi maždaug 3,0614674 $. Dabar čia yra bendras atvejis, kai jūs žinote ankstesnį akordą $ s_n $, o tada raskite kitą (žinodami, kad kiekvieną kartą jūs dalote ankstesnį akordą, kad pusių skaičius padvigubėtų). Manau, kad ši formulė yra teisinga, $ s_ formulė$ nurodytas $ s_n $ yra tikrai teisingas, nes aš jį išbandžiau, bet nesu visiškai tikras dėl perimetro formulės:

Naudodamiesi tuo, kas išdėstyta pirmiau, galime parašyti:

prasideda P_1 approx & amp 2.8284271247461903 P_2 approx & amp 3.061467458920718 P_3 approx & amp 3.121445152258053 P_4 apm apytiksliai & amp 3.1415138011441455 P_8 approx & amp 3.1415729403678827 P_9 apm. & amp 3.141587725279961 P_ <11> apm & amp 3.1415925765450043 P_ <14> approx & amp 3.1415926334632482 P_ <15> apm. & amp 3.141592654807589 P_ <16> apm <18> approx & amp 3.1415929109396727 P_ <19> approx & amp 3.141594125195191 P_ <20> apm

Tai suteikia penkių skaitmenų tikslumą: $ pi maždaug 3,14159 $.

Šis pavyzdys man buvo išmokytas mokslinės kompiuterijos klasėje būdu atgal, kad būtų rodoma apvalinamojo kablelio skaičiavimo apvalinimo klaida. Pastebėsite apie du paskutinius, mes gauname tą patį rezultatą. Taip yra todėl, kad kompiuterio slankiojo kablelio skaičiavimai iš esmės pasiekė ribą. Priežastis yra ta, kad $ s_n ^ 2 $ tapo toks mažas, kad $ 1 - s_n ^ 2 $ nesukuria & quot; naujo & quot skaičiaus (jis tiesiog pateikia tą patį skaičių, kuris dar kartą generuos $ s_n ^ 2 $, kai atimamas iš 1 USD. Yra triukas, kad šis skaičiavimas būtų geresnis:

Tai tikrai duoda geresnių rezultatų:

prasideda P_1 approx & amp 2.8284271247461903 P_2 approx & amp 3.0614674589207183 P_3 apm & amp 3.1214451522580524 P_4 apm approx & amp 3.1415729403670913 P_9 approx & amp 3.1415877252771596 P_ <10> apm 3.1415926343385627 P_ <14> approx & amp 3.1415926487769856 P_ <15> approx & amp 3.141592652386591 P_ <16> apm 3.141592653570993 P_ <19> approx & amp 3.1415926535850933 P_ <20> approx & amp 3.141592653588618 P_ <21> apm 3.1415926535897754 P_ <24> approx & amp 3.141592653589789 P_ <25> approx & amp 3.1415926535897927 P_ <26> a pprox & amp 3.1415926535897936 P_ <27> approx & amp 3.1415926535897936 end

Paprasčiausiai pakeisdami skaičiavimą, ne algoritmas!, mes dabar gauname dvylika tikslumo skaitmenys! $ pi apytiksliai 3.141592653589 $ - visi dėl slankiojo kablelio apvalinimo klaidos.


2 atsakymai 2

Jei yra skylių, formulė netinka, kaip jau komentavau.

Be skylių, formulė tinka.

Toliau apsvarstykime sulydytus daugiakampius be skylių.

Priežastis, kodėl formulė galioja, yra ta, kad jei prie sulydytų daugiakampių pridedate naują šešiakampį, tada šis ryšys $ ( text) - ( tekstas) = 1 $ palaiko.

Galima įrodyti, kad formulė atitinka daugiakampių skaičiaus indukciją.

Jei atsižvelgsime į vieną šešiakampį, tada $ S = A = 6 $, taigi $ S-A + 1 = N $ galioja.

Tarkime, kad $ S_F-A_F + 1 = N $ tinka sulydytiems daugiakampiams $ F $.

1 atvejis : Jei prie $ F $ pridėsite vieną šešiakampį $ H $, kur $ H $ ir $ F $ turi tiksliai vieną bendrą kraštą, tada naujuose daugiakampiuose $ F '$ mes turime $ N_= N + 1, quad S_= S_F + 5, quad A_= A_F + 4 $ Taigi, mes matome, kad $ S_-A_+ 1 = N_$ turi.

2 atvejis : Jei prie $ F $ pridėsite vieną šešiakampį $ H $, kur $ H $ ir $ F $ turi tiksliai du bendrus kraštus (atkreipkite dėmesį, kad abu kraštai turi būti gretimi), tada naujuose daugiakampiuose $ F '$ mes turime $ N_= N + 1, quad S_= S_F + 4, quad A_= A_F + 3 $ Taigi, mes matome, kad $ S_-A_+ 1 = N_$ turi.

3 atvejis : Jei prie $ F $ pridėsite vieną šešiakampį $ H $, kur $ H $ ir $ F $ turi tiksliai tris bendrąsias briaunas (atkreipkite dėmesį, kad trys kraštai turi būti gretimi), tada naujuose daugiakampiuose $ F '$ mes turime $ N_= N + 1, quad S_= S_F + 3, quad A_= A_F + 2 $ Taigi, matome, kad $ S_-A_+ 1 = N_$ turi.

4 atvejis : Jei prie $ F $ pridėsite vieną šešiakampį $ H $, kur $ H $ ir $ F $ turi tiksliai keturis bendrus kraštus (atkreipkite dėmesį, kad keturi kraštai turi būti gretimi), tada naujuose daugiakampiuose $ F '$ mes turime $ N_= N + 1, quad S_= S_F + 2, quad A_= A_F + 1 $ Taigi, mes matome, kad $ S_-A_+ 1 = N_$ turi.

5 atvejis : Jei prie $ F $ pridėsite vieną šešiakampį $ H $, kur $ H $ ir $ F $ turi tiksliai penkis bendruosius kraštus, tada naujuose daugiakampiuose $ F '$ mes turime $ N_= N + 1, quad S_= S_F + 1, quad A_= A_F $ Taigi, mes matome, kad $ S_-A_+ 1 = N_$ turi.


Vairuotojai

Atnaujinti tvarkyklės šio RFC kontekste

  • „PostGIS“:
    • ad hoc paramos forma jau egzistuoja. Lentelės su keletu geometrijų šiuo metu pateikiamos kaip sluoksniai, pavadinti „lentelės_vardas (geometrijos_kolos_vardas)“ (tiek sluoksnių, kiek geometrijos stulpelių). Šis elgesys bus pakeistas taip, kad lentelė būtų tik vieną kartą pranešta kaip OGR sluoksnis.
    • pridėti kelių geometrijų lentelių rašymo palaikymą.
    • atnaujinta kaip paprasta naujų galimybių iliustracija.
    • atnaujinta, kad palaikytų kelis geometrijos laukus (taip pat kitus su šiuo RFC nesusijusius pakeitimus)

    Kiti kandidatai į vairuotojus (naujovinimas nėra originalus, kuriam taikoma ši RFC)

    • GML tvarkyklė: šiuo metu kiekvienai funkcijai nurodoma tik viena geometrija. Galimybė tai pakeisti rankiniu būdu redaguojant .gfs failą
    • „SQLite“ tvarkyklė:
      • šiuo metu toks pat elgesys kaip ir dabartiniam „PostGIS“ tvarkyklės.
      • tiek tvarkyklę, tiek SQLite tarmę būtų galima atnaujinti, kad būtų palaikomi kelių geometrijų sluoksniai.
      • „Google Fusion Tables“ tvarkyklė: šiuo metu naudojamas tik pirmasis rastas geometrijos stulpelis. Galimybė nurodyti „table_name (geometry_column_name)“ kaip sluoksnio pavadinimą, perduotą GetLayerByName? ().
      • VRT: reikia rasti keletą minčių, norint rasti sintaksę, palaikančią kelias geometrijas.

      Paveikta XML sintaksė:

      . „OGRVRTLayer“ elemento lygiu:

      GeometryType ?, LayerSRS, GeomField ?, SrcRegion?, ExtentXMin / YMin / XMax / YMax,

      . „OGRVRTWarpedLayer“ elemento lygiu:

      pridėti naują elementą, kad pasirinktumėte geometrijos lauką

      . elemento „OGRVRTUnionLayer“ lygiu:

      - & gt įdiegta po RFC GDAL 1.11

      • CSV: šiuo metu imkite geometriją iš stulpelio, pavadinto „WKT“. Turi būti išplėstas, kad būtų palaikomi keli geometrijos stulpeliai. Nejau verta pastangų. Tai galima padaryti su išplėstiniu VRT tvarkykle.
      • WFS: šiuo metu palaikomi tik vienos geometrijos sluoksniai. Standartas leidžia daugialypę geometriją. Pirmiausia reikėtų GML tvarkyklės palaikymo.
      • Kitos RDBMS pagrįstos tvarkyklės: MySQL?, MSSQLSpatial? „Oracle Spatial“?

      Daugiakampio padėties nustatymas apskritimo viduje tik iš priešingų kraštų / kraštų kampo.

      Apskritimo viduje aš turiu paprastą išgaubtą netaisyklingą daugiakampį (aštuonkampis, pvz., Paveikslėlyje) (apskritimas ir daugiakampis ne visada yra koncentriški ir niekada neliečia ar nesikerta), ir man reikia nustatyti daugiakampio padėtį apskritimo atžvilgiu.

      Deja, aš žinau tik tris pagrindinius dalykus.

      1. Aš žinau tikslų kampą tarp daugiakampio priešingų pusių. Nė viena pusė nėra lygiagreti.
      2. Pratęsus ratą, daugiakampio kraštai / kraštai suformuoja įbrėžtus kampus. Kadangi vienas kampas sudaro dvi daugiakampio kraštines, įbrėžtų kampų visada yra perpus mažiau nei daugiakampio kraštinių. Pavyzdyje yra keturi užrašyti kampai, nes tai aštuonkampis.
      3. Kiekvieno užrašyto kampo viršūnės yra tolygiai išdėstytos aplink apskritimą.

      Man kelia nerimą tai, kad tokio tipo skaičiavimai gali apimti begalinį kartojimų skaičių ir (arba) kelis sprendimus.

      Jei žinojau užrašytų kampų santykinius kampus (piešinyje pažymėta „Nežinoma“), to turėtų pakakti viskam kitam nustatyti, tiesa? Net jei kažkaip galėčiau apytiksliai nustatyti netaisyklingo daugiakampio „centrą“.

      * Apatiniai dešiniojo pavyzdžio kraštai susiduria su tokiu bukiu kampu, kad, atrodo, jie yra viena eilutė, atsiprašau. Tai aštuonkampis, kurio kiekvienas užrašytas kampas sukuria dvi daugiakampio puses.


      Ši informacija, akivaizdžiai paimta iš senojo vadovo puslapio, suteikia jums aiškią idėją, ko tikėtis, kai plaukiate banglentėmis.

      EDIT: Deja, nuorodos į seną vadovą nebėra

      buvo verta perskaityti visą puslapį, ypač „Performance“.

      Veiklos aspektai

      Didesnis padalijimo lygis reiškia daugiau viršūnių, o daugiau viršūnių reiškia, kad bus naudojama daugiau atminties (tiek vaizdo atmintis vaizdavimui, tiek sistemos RAM atvaizdavimui). Blenderis gali sudužti arba pakibti, jei neturite pakankamai atminties.

      Naudojant didelius padalijimo lygius su grafine kortele, kurios bendras Vram kiekis yra mažas, kai kurios geometrijos dalys vizualiai išnyks. Jūsų tinklelis iš tikrųjų bus gerai, nes atvaizdavimas sukurtas naudojant jūsų objekto duomenis (net jei jūsų vaizdo plokštė to negali parodyti).

      Veidų (daugiakampių) skaičius rodomas Informacijos antraštė viršuje.

      Pridėjus a Suburf modifikatorius jis turi 96 veidus (2 padaliniai:

      Sudėtingoje scenoje su keliais objektais jums reikės perjungti Redagavimo režimas arba perkelkite objektą į nenaudojamą sluoksnį M, kad pamatytumėte tik tam tikro objekto veidų skaičių.

      Prieš taikant modifikatorių, taip pat verta pakeistiVielinis rėmas ekrano režimą, kad susidarytumėte įspūdį, koks iš tikrųjų yra tinklas.

      Padalinys padalija veidą į keturis veidus (kiekvienam lygiui), kaip tai padarytų tinklelis. Čia pavyzdys su algoritmu Paprasta nes tai pasirodo akivaizdžiau.

      Apytikslė taisyklė, gauta iš pirmiau pateiktos informacijos (netyrinėjant dokumento) yra

      jis neapima trikampių ir n-gonų. Išsamesnį aprašymą rasite:

      Jame pateikiamos formulės, pagrįstos veticų skaičiumi, kurios atrodo tikslesnės.


      Įrašas paskelbtas 2011-03-09
      Įrašas paskutinį kartą modifikuotas 2021-06-25
      Išteklių būsena einu

      Objekto aprašymas

      Objekto pavadinimas: WHSE_FOREST_TENURE.FTEN_RECREATION_POLY_SVW

      Trumpas vardas: FTN_REC_PL
      Komentarai: Poilsio objekto erdvinis vaizdavimas. Tai gali būti poilsio rezervatas, poilsio vieta arba aiškinamasis miškas.


      Pažvelkite į „TileAreas“ programoje „ComputationalGeometry“:

      Redaguoti: Palaukite, jūs taip pat norėjote perimetrų.

      ANTRAS REDAGAVIMAS: šonų skaičius

      Jei vis dar kartą naudojate „BoundedDiagram“ iš daugelio taškų, tikriausiai turėtumėte jį išsaugoti, o ne kiekvieną kartą perskaičiuoti, kaip aš darau.

      Praėjo daugiau nei metai, bet nuo to laiko v10 pristatėme keletą puikių funkcijų, kad tai būtų galima atlikti elegantiškai, dar kartą peržiūrėkime šį klausimą:

      Mes generuojame keletą taškų ir gauname jų voronoi diagramą naudodami „VoronoiMesh“

      Dabar apie ląstelių sritis:

      Redaguoti: Švaresnis būdas apskaičiuoti sritis yra:

      Galime patikrinti, ar bendras plotas iš tikrųjų yra 16 (ribotos Voronoi diagramos plotas $ 4 ^ 2 $)

      Norėdami apskaičiuoti perimetrus, mes naudojame „RegionMeasure“, konvertuokite daugiakampius pradmenis į linijinius primityvius ir būkite atsargūs, kad vėl sujungtumėte linijas.

      Galiausiai dėl kiekvienos ląstelės šonų skaičiaus mes tiesiog darome:

      „VoronoiMesh“ sukurti „MeshRegion“ objektai turi šiam tikslui naudingų savybių. Štai @ RunnyKine tinklelio pavyzdys:

      „MeshRegion“ ypatybėse naudojami veido ID, priskirti kiekvienam veidui. Deja, veido etiketės nesutampa su vidiniais veido ID. Taigi, čia yra „Voronoi“ tinklo modifikacija, kuri naudoja veido ID kaip etiketes (čia aš naudoju „MeshRegion“ objekto ypatybę „Veidai“):

      Atkreipkite dėmesį, kuo etiketės skiriasi nuo @ RunnyKine vizualizacijoje naudojamų.

      Dabar, norėdami gauti kiekvienos langelio perimetrą, galime naudoti ir „FaceEdgeConnectivity“, ir „EdgeLengths“:

      <1 ->3.99709, 2 -> 2.7707, 3 -> 3.61356, 4 -> 3.88435, 5 -> 3.40604, 6 -> 4.40972, 7 -> 4.1388, 8 -> 4.05183, 9 -> 2.60374, 10 -> 2.75359, 11 -> 3.55026, 12 -> 3.63583, 13 -> 3.18751, 14 -> 3.21415, 15 -> 4.20549, 16 -> 2.08804, 17 -> 3.3514, 18 -> 5.58528, 19 -> 5.40562, 20 -> 4.3344>

      Teritorijai naudojame „FaceAreas“:

      <1 ->1.00297, 2 -> 0.268352, 3 -> 0.73707, 4 -> 0.834388, 5 -> 0.665234, 6 -> 1.23476, 7 -> 0.974388, 8 -> 0.938105, 9 -> 0.402544, 10 -> 0.363854, 11 -> 0.59353, 12 -> 0.759838, 13 -> 0.55102, 14 -> 0.367406, 15 -> 0.957965, 16 -> 0.210096, 17 -> 0.602978, 18 -> 1.99269, 19 -> 1.44529, 20 -> 1.09752>

      Ir galiausiai dėl kraštų skaičiaus:

      <1 ->7, 2 -> 4, 3 -> 6, 4 -> 5, 5 -> 8, 6 -> 5, 7 -> 5, 8 -> 8, 9 -> 5, 10 -> 4, 11 -> 4, 12 -> 5, 13 -> 4, 14 -> 5, 15 -> 6, 16 -> 4, 17 -> 5, 18 -> 6, 19 -> 5, 20 -> 5>


      Žiūrėti video įrašą: Iškilieji daugiakampiai