¿Cómo puedo arreglar mis polígonos complejos para que se muestren correctamente en Google Maps?


15

Problema : estoy tratando de encontrar una manera de arreglar algunas formas de polígonos rotos y no estoy seguro de cómo puedo hacer esto.


Detalles :

Tengo una serie de polígonos que básicamente importé de TIGERLINES hace un tiempo.

Los transformé en archivos de formas, luego los importé a Sql Server 2008.

En sql server 2008, se ven geniales :) Entonces, eso sugiere que la importación funcionó más o menos. Aquí está la ciudad de Los Ángeles: -

ingrese la descripción de la imagen aquí

Pero debido a que mis poli tienen muchos puntos, REDUCElos uso cuando el nivel de vista del mapa no está ampliado. Por lo tanto, en mi caso, ahora estoy tratando de mostrar un Los Ángeles reducido :

ingrese la descripción de la imagen aquí

¡Increíble!

Esta es la política como un formato de texto bien conocido.

MULTIPOLYGON (((-118.37033296865027 33.981437119998084, -118.37005887887605 33.981578692036159, -118.37034101004039 33.981636093563019, -118.37033296865027 33.981437119998084)), ((-118.66815694082851 34.181234948814819, -118.62915309690062 34.14689902389253, -118.56475201393673 34.130168028388276, -118.5992039806748 34.074336925351339, -118.57039497030522 34.069345957209549, -118.56968692628638 33.988811006799452, -118.55134001501617 33.982488918901176, -118.49446792996977 34.050559988837591, -118.44342601159182 34.016625025023124, -118.53748592914029 33.96667393391462, -118.49898897162241 33.916299091437473, -118.43732802504242 33.91651401198633, -118.4580839734636 33.961275936767734, -118.42944687485486 33.916317947202252, -118.4287748805515 33.93096998019935, -118.36821587274666 33.92901995236047, -118.37033296865027 33.981437119998084, -118.38014006025271 33.976370879899918, -118.40620312831412 33.9894040312244, -118.40276798429554 34.003464906235209, -118.44721596021705 33.990835906868767, -118.36957705476188 34.035079980519519, -118.37898513570399 34.01930701338695, -118.35780514530173 33.997145063915781, -118.33148511073327 34.001491938133285, -118.37005887887605 33.981578692036159, -118.3177468750705 33.970922985911365, -118.31338700532739 33.93821409504941, -118.29159591706274 33.959494911587832, -118.29062400107088 33.866332991682327, -118.30914811626086 33.865608026065182, -118.30099998201904 33.757721074150069, -118.33305692619008 33.721861951611757, -118.29415704014427 33.704554033590789, -118.23180307928671 33.71500194765504, -118.24896594980441 33.755902076278147, -118.22066886552763 33.782536959833138, -118.22662214917852 33.829531051866013, -118.23026099256474 33.792772095531092, -118.2565120484562 33.804774040894074, -118.2991459834285 33.797795976339046, -118.29920702986115 33.846318895031622, -118.28155507034047 33.86280202135606, -118.28208595952513 33.923201066885447, -118.23032405030229 33.929000895691168, -118.23399502457268 33.953263926662473, -118.25364008888438 33.943276983800338, -118.25643608790811 33.989497954281944, -118.23791790420275 33.989393059909709, -118.23970793049459 34.014713121327667, -118.19142810960136 34.012760956499392, -118.19262502907846 34.061762066095284, -118.1648349431549 34.062282928139695, -118.15528996126079 34.098672108789643, -118.17799390878898 34.098595067874996, -118.16558689825808 34.125466989766352, -118.18258002511257 34.129185991443848, -118.18392009154192 34.148673011439996, -118.22623088187513 34.149788973944844, -118.25425797615566 34.11876096748162, -118.28169102368197 34.156473098182232, -118.30964606995528 34.1612589323332, -118.34566505636386 34.142366926730304, -118.37031291768209 34.196379107293332, -118.33992999453659 34.206502959021506, -118.33746198396433 34.221312054601036, -118.26687107795063 34.221846086487439, -118.26667204057179 34.250779088440183, -118.2387889442851 34.281588919772553, -118.28669401126965 34.278336948162604, -118.29939493959903 34.293259048809304, -118.35470798399948 34.278848025464875, -118.3857618914668 34.284817020858974, -118.38739588298223 34.298779939448842, -118.4061680961638 34.2859269071303, -118.40520195114632 34.329811005464386, -118.50380990538876 34.337305995327178, -118.54629607559784 34.317332026288142, -118.5408208870528 34.2988139356695, -118.58853302357504 34.303219086876425, -118.59620799129411 34.274520945225589, -118.63346111715893 34.269525030054467, -118.63072510622223 34.2377719451453, -118.65873494162602 34.224578011901244, -118.66815694082851 34.181234948814819), (-118.46636404681055 34.0590670662609, -118.45468090186466 34.066799004274742, -118.44817495570614 34.049578023438457, -118.46636404681055 34.0590670662609), (-118.42624590643248 34.083052060665487, -118.39585612350398 34.112414074702421, -118.39584401878872 34.091055026539784, -118.34338194827956 34.09432806847537, -118.37695090866218 34.088630040183155, -118.3702939050842 34.0801689603087, -118.39070402303155 34.072083071358719, -118.37224405760227 34.062199935390908, -118.40602306576152 34.052665897923667, -118.42624590643248 34.083052060665487), (-118.45592304445982 34.284612059955819, -118.43256891423674 34.304687007226292, -118.41566704665274 34.2939320092269, -118.4437338970905 34.273310001969548, -118.45592304445982 34.284612059955819), (-118.3623419482557 34.1386959352159, -118.34569798267972 34.14235601789391, -118.34877496666293 34.131385983468121, -118.3623419482557 34.1386959352159), (-118.46233312716733 33.979751022958048, -118.43225893050703 33.9750159246595, -118.4513010127346 33.964230958845896, -118.46233312716733 33.979751022958048)))

Ahora, para mostrar las políticas en un mapa de Google, necesito extraer los datos del servidor SQL, convertirlos a un formato de Google Maps y luego mostrarlos. Esto funciona muy bien para ... digamos ... 95% de polys. El otro 5% se ve ... muy muy desordenado.

No está bien Los Ángeles: -

ingrese la descripción de la imagen aquí

Así que supongo que vas a sugerir -> ¿ verifica si hay errores en el código? ¿Podemos ver el código? ¡Tiene algo que ver con el código!

Bueno, aquí está la biblioteca de códigos de muestra que he puesto en Codeplex. Incluye una prueba unitaria con los datos binarios de la forma. ( SELECT MediumReducedBoundary.STAsBinary() FROM Table WHERE Id=1)

Entonces Parseesto byte[]... y lo muestro en un mapa de Google.

Mi código de transformación devuelve DOS polígonos, no uno.

Así es como se ve mi Json ... ¿notan cómo tiene dos polígonos ahora?

El código javascript del lado del cliente se encuentra aquí . Aquí es donde decodifico mi json e intento renderizarlo manualmente en un mapa de Google.

Espero que haya una forma / programa que pueda leer mi resultado json y decirme si estos datos son incorrectos (los convertí incorrectamente). ¿O si alguien puede ver dónde he convertido el WKT incorrectamente en mi JSON con formato de Google?


FWIW, el multipolígono es válido / simple, por lo que no debería haber ningún problema con eso. En segundo lugar, sí, hay dos objetos. El primer polígono es un pequeño triángulo en POINT (-118.37024428585559 33.981550635199085), lo cual es interesante, pero no creo que sea la causa del problema.
Mike T

Entonces, ¿sugeriría que el error podría ser cómo Sql Server 2008 'redujo' este poli?
Pure.Krome

nah, el multipolígono se ve bien, así que creo que el problema es con el cliente / javascript ... pero ahí es donde me pierdo
Mike T

¿Puedes mostrar ese WKT en otra aplicación GIS para ver si lo hace bien?
Pure.Krome

Sí, el WKT representa en JTS TestBuilder lo mismo que su segunda imagen después REDUCE, y pasa pruebas válidas / simples. Sin embargo, no puedo entender cómo validar el json.
Mike T

Respuestas:


4

Los polígonos se representan en la API de Google Maps usando Canvas, que utiliza una regla de relleno de devanado cero. Para mostrar un agujero, deberá definir el agujero utilizando el devanado opuesto al camino exterior.


Hola broady ¡Muchas gracias por saltar aquí y responder! Realmente lo aprecio :) ¿Alguna posibilidad de que pueda proporcionar un enlace o dos, también algunos ejemplos de esto, por favor? Luego enviaré una copa de cerveza a tu oficina en agradecimiento :) ¡Saludos amigo!
Pure.Krome

Claro, aquí hay una buena dona: geocodezip.com/v3_polygon_example_donut.html
amplia el

aplaude por el enlace :) pero no puedo hacer clic derecho para ver cómo se hizo :(
Pure.Krome

¡Solo presiona ver fuente!
amplio

3

Para mí, parece que la versión de Google Maps no comprende los agujeros de la misma manera que su fuente original. Debe averiguar cómo se espera que se definan los agujeros en Google Maps.

Es posible que te falten algunos puntos que necesitan cerrar cada polígono de agujero antes de pasar al siguiente. No sé cómo Google Maps define esto, es solo una suposición ...


Hmm ... esto suena bastante exacto. Hmmmm ... parece que necesito encontrar un experto en JavaScript de Google Map? ¿Alguien por aquí sabe uno?
Pure.Krome

@ Pure.Krome: creo que no es necesariamente un experto en Javascript , sino alguien que conoce el modelo de datos de Google Maps.
temor

ahh .. buen punto. Eso podría hacer que sea aún más difícil de encontrar ...: ~ (
Pure.Krome

Debe encontrar una referencia de API json que describa cómo definir polígonos con agujeros. Podría llamarse multipolígonos para soportar agujeros.
temor

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.